diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/README.md b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/README.md new file mode 100644 index 000000000000..60f25003f647 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/README.md @@ -0,0 +1,156 @@ + + +# rfftf + +> Compute the forward real-valued fast Fourier transform (FFT). + + + +
+ +
+ + + + + +
+ +## Usage + +```javascript +var rfftf = require( '@stdlib/fft/base/fftpack/rfftf' ); +``` + +#### rfftf( N, r, strideR, offsetR, workspace, strideW, offsetW ) + +Computes the forward real-valued fast Fourier transform (FFT). + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); + +var N = 4; +var workspace = new Float64Array( ( 2*N ) + 34 ); + +rffti( N, workspace, 1, 0 ); + +var r = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); + +rfftf( N, r, 1, 0, workspace, 1, 0 ); + +// r => [ 10.0, -2.0, 2.0, -2.0 ] +``` + +The function accepts the following arguments: + +- **N**: length of the sequence to transform. +- **r**: input array. +- **strideR**: stride length for `r`. +- **offsetR**: starting index for `r`. +- **workspace**: workspace array containing pre-computed values. +- **strideW**: stride length for `workspace`. +- **offsetW**: starting index for `workspace`. + +
+ + + + + +
+ +## Notes + +- Before calling this function, initialize the workspace by calling [`rffti`][@stdlib/fft/base/fftpack/rffti] with the same sequence length and workspace layout. + +- The function performs the transform in-place and returns the same input array reference. + +- For `N = 4`, the output + + ```text + [ 10.0, -2.0, 2.0, -2.0 ] + ``` + + corresponds to a zero-frequency term `10.0`, a complex coefficient `-2.0 + 2.0i` at frequency `1`, and a Nyquist term `-2.0`. + +- If `N` equals `1`, the function returns early without modifying the input, as a single data point is its own Fourier transform. In that case, the function still returns the same input array reference. + +
+ + + +
+ +## Examples + + + +```javascript +var zeros = require( '@stdlib/array/zeros' ); +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +var rfftf = require( '@stdlib/fft/base/fftpack/rfftf' ); + +var N = 4; +var opts = { + 'dtype': 'float64' +}; +var r = discreteUniform( N, -10, 10, opts ); +var workspace = zeros( ( 2*N ) + 34 ); + +console.log( r ); + +rffti( N, workspace, 1, 0 ); +rfftf( N, r, 1, 0, workspace, 1, 0 ); + +console.log( r ); +``` + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/benchmark/benchmark.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/benchmark/benchmark.js new file mode 100644 index 000000000000..ec2747300307 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/benchmark/benchmark.js @@ -0,0 +1,138 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +'use strict'; + +// MODULES // + +var bench = require( '@stdlib/bench' ); +var slice = require( '@stdlib/array/slice' ); +var uniform = require( '@stdlib/random/array/uniform' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var format = require( '@stdlib/string/format' ); +var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var Float64Array = require( '@stdlib/array/float64' ); +var dcopy = require( '@stdlib/blas/base/dcopy' ); +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +var pkg = require( './../package.json' ).name; +var rfftf = require( './../lib' ); + + +// VARIABLES // + +var options = { + 'dtype': 'float64' +}; + + +// FUNCTIONS // + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} iter - number of iterations +* @param {PositiveInteger} N - sequence length +* @returns {Function} benchmark function +*/ +function createBenchmark( iter, N ) { + var workspace = new Float64Array( ( 2*N ) + 34 ); + var x; + var i; + + x = []; + for ( i = 0; i < iter; i++ ) { + x.push( uniform( N, -100.0, 100.0, options ) ); + } + + rffti( N, workspace, 1, 0 ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var xc; + var y; + var i; + + xc = slice( x ); + for ( i = 0; i < iter; i++ ) { + xc[ i ] = dcopy( N, x[ i ], 1, new Float64Array( N ), 1 ); + } + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + y = rfftf( N, xc[ i ], 1, 0, workspace, 1, 0 ); + if ( isnan( y[ i%N ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnan( y[ i%N ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var lengths; + var opts; + var iter; + var N; + var f; + var i; + + lengths = [ + 8, + 16, + 32, + 64, + 128, + 256, + 512, + 1024 + ]; + + iter = 1e6; + + for ( i = 0; i < lengths.length; i++ ) { + N = lengths[ i ]; + f = createBenchmark( iter, N ); + opts = { + 'iterations': iter + }; + bench( format( '%s:N=%d', pkg, N ), opts, f ); + iter = floor( pow( iter, 3.0/4.0 ) ); + } +} + +main(); diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/repl.txt b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/repl.txt new file mode 100644 index 000000000000..c117bdc2cd0f --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/repl.txt @@ -0,0 +1,54 @@ + +{{alias}}( N, r, strideR, offsetR, workspace, strideW, offsetW ) + Computes the forward real-valued fast Fourier transform (FFT). + + Before calling this function, initialize the workspace by calling + `@stdlib/fft/base/fftpack/rffti` with the same sequence length and workspace + layout. + + Parameters + ---------- + N: integer + Length of the sequence to transform. + + r: ArrayLikeObject + Input array. + + strideR: integer + Stride length for `r`. + + offsetR: integer + Starting index for `r`. + + workspace: ArrayLikeObject + Workspace array containing pre-computed values. + + strideW: integer + Stride length for `workspace`. + + offsetW: integer + Starting index for `workspace`. + + Returns + ------- + r: ArrayLikeObject + Input array. + + Examples + -------- + > var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); + > var N = 4; + > var r = new {{alias:@stdlib/array/float64}}( [ 1.0, 2.0, 3.0, 4.0 ] ); + > var workspace = new {{alias:@stdlib/array/float64}}( ( 2*N ) + 34 ); + > rffti( N, workspace, 1, 0 ) + + > var out = {{alias}}( N, r, 1, 0, workspace, 1, 0 ) + + > var bool = ( out === r ) + true + > r + [ 10.0, -2.0, 2.0, -2.0 ] + + See Also + -------- + diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/types/index.d.ts b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/types/index.d.ts new file mode 100644 index 000000000000..a95ed2ed1a44 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/types/index.d.ts @@ -0,0 +1,56 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +// TypeScript Version: 4.1 + +/// + +import { Collection } from '@stdlib/types/array'; + +/** +* Computes the forward real-valued fast Fourier transform (FFT). +* +* @param N - length of the sequence to transform +* @param r - input array +* @param strideR - stride length for `r` +* @param offsetR - starting index for `r` +* @param workspace - workspace array containing pre-computed values +* @param strideW - stride length for `workspace` +* @param offsetW - starting index for `workspace` +* @returns input array +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +* +* var N = 4; +* +* var workspace = new Float64Array( ( 2*N ) + 34 ); +* rffti( N, workspace, 1, 0 ); +* +* var r = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); +* +* rfftf( N, r, 1, 0, workspace, 1, 0 ); +* // r => [ 10.0, -2.0, 2.0, -2.0 ] +*/ +declare function rfftf>( N: number, r: T, strideR: number, offsetR: number, workspace: Collection, strideW: number, offsetW: number ): T; + + +// EXPORTS // + +export = rfftf; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/types/test.ts b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/types/test.ts new file mode 100644 index 000000000000..135116bb4667 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/docs/types/test.ts @@ -0,0 +1,148 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +import rfftf = require( './index' ); + + +// TESTS // + +// The function returns a collection... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( 4, r, 1, 0, workspace, 1, 0 ); // $ExpectType Float64Array +} + +// The compiler throws an error if the function is provided a first argument which is not a number... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( '4', r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( true, r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( false, r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( null, r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( void 0, r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( [], r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( {}, r, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( ( x: number ): number => x, r, 1, 0, workspace, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a second argument which is not a collection... +{ + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( 4, '4', 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, 4, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, true, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, false, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, null, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, void 0, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, {}, 1, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, ( x: number ): number => x, 1, 0, workspace, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a third argument which is not a number... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( 4, r, '1', 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, true, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, false, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, null, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, void 0, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, [], 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, {}, 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, ( x: number ): number => x, 0, workspace, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fourth argument which is not a number... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( 4, r, 1, '0', workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, true, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, false, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, null, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, void 0, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, [], workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, {}, workspace, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, ( x: number ): number => x, workspace, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fifth argument which is not a collection... +{ + const r = new Float64Array( 4 ); + + rfftf( 4, r, 1, 0, '42', 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, 42, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, true, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, false, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, null, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, void 0, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, {}, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, ( x: number ): number => x, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a sixth argument which is not a number... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( 4, r, 1, 0, workspace, '1', 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, true, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, false, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, null, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, void 0, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, [], 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, {}, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, ( x: number ): number => x, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a seventh argument which is not a number... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf( 4, r, 1, 0, workspace, 1, '0' ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, true ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, false ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, null ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, void 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, [] ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, {} ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, ( x: number ): number => x ); // $ExpectError +} + +// The compiler throws an error if the function is provided an unsupported number of arguments... +{ + const r = new Float64Array( 4 ); + const workspace = new Float64Array( ( 2*4 ) + 34 ); + + rfftf(); // $ExpectError + rfftf( 4 ); // $ExpectError + rfftf( 4, r ); // $ExpectError + rfftf( 4, r, 1 ); // $ExpectError + rfftf( 4, r, 1, 0 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1 ); // $ExpectError + rfftf( 4, r, 1, 0, workspace, 1, 0, 123 ); // $ExpectError +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/examples/index.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/examples/index.js new file mode 100644 index 000000000000..b2b4f1218523 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/examples/index.js @@ -0,0 +1,38 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +'use strict'; + +var zeros = require( '@stdlib/array/zeros' ); +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +var rfftf = require( './../lib' ); + +var N = 4; +var opts = { + 'dtype': 'float64' +}; +var r = discreteUniform( N, -10, 10, opts ); +var workspace = zeros( ( 2*N ) + 34 ); + +console.log( r ); + +rffti( N, workspace, 1, 0 ); +rfftf( N, r, 1, 0, workspace, 1, 0 ); + +console.log( r ); diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/index.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/index.js new file mode 100644 index 000000000000..d4e7f52daa0a --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/index.js @@ -0,0 +1,49 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +'use strict'; + +/** +* Compute the forward real-valued fast Fourier transform (FFT). +* +* @module @stdlib/fft/base/fftpack/rfftf +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +* var rfftf = require( '@stdlib/fft/base/fftpack/rfftf' ); +* +* var N = 4; +* +* var workspace = new Float64Array( ( 2*N ) + 34 ); +* rffti( N, workspace, 1, 0 ); +* +* var r = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); +* +* rfftf( N, r, 1, 0, workspace, 1, 0 ); +* // r => [ 10.0, -2.0, 2.0, -2.0 ] +*/ + +// MODULES // + +var main = require( './main.js' ); + + +// EXPORTS // + +module.exports = main; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/main.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/main.js new file mode 100644 index 000000000000..1dbfbd084cfb --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/main.js @@ -0,0 +1,115 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +'use strict'; + +// MODULES // + +var rfftf1 = require( './rfftf1.js' ); + + +// MAIN // + +/** +* Computes the forward real-valued fast Fourier transform (FFT). +* +* @param {NonNegativeInteger} N - length of the sequence to transform +* @param {Collection} r - input array +* @param {integer} strideR - stride length for `r` +* @param {NonNegativeInteger} offsetR - starting index for `r` +* @param {Collection} workspace - workspace array containing pre-computed values +* @param {integer} strideW - stride length for `workspace` +* @param {NonNegativeInteger} offsetW - starting index for `workspace` +* @returns {Collection} input array +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +* +* var N = 4; +* +* var workspace = new Float64Array( ( 2*N ) + 34 ); +* rffti( N, workspace, 1, 0 ); +* +* var r = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); +* +* rfftf( N, r, 1, 0, workspace, 1, 0 ); +* // r => [ 10.0, -2.0, 2.0, -2.0 ] +*/ +function rfftf( N, r, strideR, offsetR, workspace, strideW, offsetW ) { + var offsetT; + var offsetF; + + // When a sub-sequence is a single data point, the FFT is the identity, so no transformation necessary... + if ( N === 1 ) { + return r; + } + + // Resolve the starting indices for storing twiddle factors and factorization results: + offsetT = offsetW + ( N * strideW ); // index offset for twiddle factors + offsetF = offsetT + ( N * strideW ); // index offset for factors describing the sub-transforms + + rfftf1( N, r, strideR, offsetR, workspace, strideW, offsetW, workspace, strideW, offsetT, workspace, strideW, offsetF ); // eslint-disable-line max-len + + return r; +} + + +// EXPORTS // + +module.exports = rfftf; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf2.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf2.js new file mode 100644 index 000000000000..7e7871ca0ebf --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf2.js @@ -0,0 +1,366 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// FUNCTIONS // + +/** +* Resolves an index into the input array. +* +* ## Notes +* +* In a forward real FFT, the previous stage writes its results as two "rows" per sub-sequence. +* +* Thus, when reading from an input array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having two "rows" (`even + odd` and `even - odd`, respectively) and where each "row" is arranged as `M*L` contiguous elements corresponding to interleaved real and imaginary components. +* +* Accordingly, the following is a logical view of an input array (zero-based indexing) which contains `L = 3` transforms and in which each sub-sequence has length `M = 4`: +* +* ```text +* │ k = 0 k = 1 k = 2 +* │ ──────────────────────────────────────────────────────────────────────────→ k +* j = 0 (even+odd) │ cc(0,0,0) ... cc(3,0,0) cc(0,1,0) ... cc(3,1,0) cc(0,2,0) ... cc(3,2,0) +* │ +* j = 1 (even-odd) │ cc(0,0,1) ... cc(3,0,1) cc(0,1,1) ... cc(3,1,1) cc(0,2,1) ... cc(3,2,1) +* └───────────────────────────────────────────────────────────────────────────→ i +* ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 M-1 0 M-1 0 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short sub-sequence corresponding to either the `even + odd` or `even - odd` row. +* - `j` selects between the `even + odd` and `even - odd` row. +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | cc(0,0,0)...cc(3,0,0) ... cc(0,2,0)...cc(3,2,0) | cc(0,0,1)...cc(3,0,1) ... cc(0,2,1)...cc(3,2,1) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 LM LM-1 (L+1)M (L+1)M-1 (2L-1)M 2LM-1 +* ``` +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} j - input row +* @param {NonNegativeInteger} L - number of sub-sequences +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the input array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the input array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = iptr( 0, 0, 0, L, M, stride, offset ); +* // returns 0 +* +* idx = iptr( 1, 0, 0, L, M, stride, offset ); +* // returns 1 +* +* idx = iptr( M-1, 0, 0, L, M, stride, offset ); +* // returns 3 +* +* idx = iptr( 0, 1, 0, L, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = iptr( M-1, L-1, 1, L, M, stride, offset ); +* // returns 23 +*/ +function iptr( i, k, j, L, M, stride, offset ) { + var n = i + ( ( k+(j*L) ) * M ); + return ( n*stride ) + offset; +} + +/** +* Resolves an index into the output array. +* +* ## Notes +* +* When writing to an output array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having two "columns" corresponding to the even and odd half-spectrum of a folded complex vector (with real and imaginary parts of each half-spectrum interleaved along each sub-sequence) and where each "column" has `M` elements. +* +* Accordingly, the following is a logical view of an output array (zero-based indexing) which contains `L = 3` transforms and in which each "column" sub-sequence has length `M = 4`: +* +* ```text +* j = 0 ("even" column) j = 1 ("odd" column) +* k = 0 ─┬───────────────────────────────────────┬───────────────────────────────────────┐ +* │ out(0,0,0) out(1,0,0) ... out(3,0,0) │ out(0,1,0) out(1,1,0) ... out(3,1,0) │ +* └───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 1 ─┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,1) out(1,0,1) ... out(3,0,1) │ out(0,1,1) out(1,1,1) ... out(3,1,1) │ +* └───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 2 ─┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,2) out(1,0,2) ... out(3,0,2) │ out(0,1,2) out(1,1,2) ... out(3,1,2) │ +* └───────────────────────────────────────┴───────────────────────────────────────┘ +* ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 1 M-1 0 1 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short "column" sub-sequence. +* - `j` selects between the even (0) and odd (1) column. +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | out(0,0,0)...out(3,0,0) | out(0,1,0)...out(3,1,0) | out(0,0,1)...out(3,0,1) | ... | out(0,1,2)...out(3,1,2) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 M 2M-1 2M 3M-1 (2L-1)M 2LM-1 +* ``` +* +* As may be observed, when resolving an index in the output array, the `j` and `k` dimensions are swapped relative index resolution in the input array. This stems from `radf2` being only one stage in a multi-stage driver which alternates between using `cc` and `out` as workspace buffers. After each stage, the next stage reads what the previous stage wrote. +* +* Each stage expects a transpose, and, in order to avoid explicit transposition between the stages, we swap the last two logical dimensions while still maintaining cache locality within the inner loop logical dimension, as indexed by `i`. +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} j - index specifying which of the two complex halves we are in (either `0` or `1`) +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the output array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the output array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = optr( 0, 0, 0, M, stride, offset ); +* // returns 0 +* +* idx = optr( 1, 0, 0, M, stride, offset ); +* // returns 1 +* +* idx = optr( M-1, 0, 0, M, stride, offset ); +* // returns 3 +* +* idx = optr( 0, 1, 0, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = optr( M-1, 1, L-1, M, stride, offset ); +* // returns 23 +*/ +function optr( i, j, k, M, stride, offset ) { + var n = i + ( ( j+(k*2) ) * M ); + return ( n*stride ) + offset; +} + + +// MAIN // + +/** +* Performs one radix-2 stage within a forward Fourier transform for a real-valued sequence. +* +* @private +* @param {NonNegativeInteger} M - number of elements in each sub-sequence to be transformed +* @param {NonNegativeInteger} L - number of sub-sequences to be transformed +* @param {Collection} cc - input array containing the sub-sequences to be transformed +* @param {integer} sc - stride length for `cc` +* @param {NonNegativeInteger} oc - index offset for `cc` +* @param {Collection} out - output array containing transformed sub-sequences +* @param {integer} so - stride length for `out` +* @param {NonNegativeInteger} oo - index offset for `out` +* @param {Collection} twiddles - array containing twiddle factors +* @param {integer} st - stride length for `twiddles` +* @param {NonNegativeInteger} ot - index offset for `twiddles` +* @returns {void} +*/ +function radf2( M, L, cc, sc, oc, out, so, oo, twiddles, st, ot ) { // eslint-disable-line max-params + var tr2; + var ti2; + var ip1; + var ip2; + var it1; + var it2; + var io; + var im; + var i; + var k; + + /* + * First, perform the core butterfly for each sub-sequence being transformed. + * + * In the following loop, we handle harmonic `n = 0` for every transform. As described for `iptr`, the input array is interpreted as a three-dimensional array, containing two "rows" per sub-sequence. + * + * row0 = even + odd (j = 0) + * row1 = even - odd (j = 1) + * + * For a radix-2 forward FFT of a real-valued signal `x` and `n = 0`, + * + * x[0] = row0 + row1 = 2⋅even + * x[M] = row0 - row1 = 2⋅odd + * + * Because `W_2^0 = 1`, no twiddle multiplication is necessary. + */ + for ( k = 0; k < L; k++ ) { + ip1 = iptr( 0, k, 0, L, M, sc, oc ); // real part row 0 + ip2 = iptr( 0, k, 1, L, M, sc, oc ); // real part row 1 + + io = optr( 0, 0, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + cc[ ip2 ]; // even + odd + + io = optr( M-1, 1, k, M, so, oo ); + out[ io ] = cc[ ip1 ] - cc[ ip2 ]; // even - odd + } + // When the number of elements in a sub-sequence is less than `2`, there is nothing more to do, as the above butterfly produced the full result... + if ( M < 2 ) { + return; + } + /* + * Next, apply the general case where we need to loop through the non-trivial harmonics. + * + * For each harmonic `n = 1, ..., M/2-1`, we need to + * + * - recover even/odd spectra from the two input rows. + * - multiply the odd part by the twiddle factor `W_n = cos(θ) - j sin(θ)`. + * - form the following + * + * x[2n] = E_n + W_n⋅O_n => column 0 + * x[2n+1] = E_n - W_n⋅O_n => column 1 + * + * The mirror index `im = M - i` selects the conjugate-symmetric partner, thus allowing the routine to read each symmetry pair only once. + */ + if ( M >= 3 ) { + // Loop over each sub-sequence to be transformed... + for ( k = 0; k < L; k++ ) { + // Loop over the elements in each sub-sequence... + for ( i = 2; i < M; i += 2 ) { + im = M - i; // "mirror" index + + // Resolve twiddle factor indices: + it1 = ( (i-2)*st ) + ot; // cos(θ) + it2 = ( (i-1)*st ) + ot; // sin(θ) + + // Load the `even-odd` row... + ip1 = iptr( i-1, k, 1, L, M, sc, oc ); // c = Re(row1) + ip2 = iptr( i, k, 1, L, M, sc, oc ); // d = Im(row1) + + // eslint-disable-next-line stdlib/capitalized-comments, stdlib/empty-line-before-comment + // tmp = W_n ⋅ (c + j⋅d) + tr2 = ( twiddles[ it1 ] * cc[ ip1 ] ) + ( twiddles[ it2 ] * cc[ ip2 ] ); // Re(tmp) + ti2 = ( twiddles[ it1 ] * cc[ ip2 ] ) - ( twiddles[ it2 ] * cc[ ip1 ] ); // Im(tmp) + + // Load the `even+odd` row... + ip1 = iptr( i, k, 0, L, M, sc, oc ); // b = Im(row0) + io = optr( i, 0, k, M, so, oo ); // Im(x[2n]) + out[ io ] = cc[ ip1 ] + ti2; + + io = optr( im, 1, k, M, so, oo ); // Im(x[2n+1]) + out[ io ] = ti2 - cc[ ip1 ]; + + ip1 = iptr( i-1, k, 0, L, M, sc, oc ); // a = Re(row0) + io = optr( i-1, 0, k, M, so, oo ); // Re(x[2n]) + out[ io ] = cc[ ip1 ] + tr2; + + io = optr( im-1, 1, k, M, so, oo ); // Re(x[2n+1]) + out[ io ] = cc[ ip1 ] - tr2; + } + } + // When `M` is odd, there is no Nyquist pair to process, so we do not need to perform any further transformations... + if ( M%2 === 1 ) { + return; + } + } + /* + * Lastly, handle the Nyquist frequency where `i = M-1` (i.e., the last element of each sub-sequence). + * + * When `M` is even, the Nyquist index is `i = M/2`. In this stage, we've stored that element at the end of each sub-sequence (i.e., `i = M-1` in the packed layout). + * + * At this point, the cosine term is -1 and the sine term is 0, so the twiddle multiplication collapses to simple addition/subtraction. + * + * In this case, + * + * W_n⋅O_n = ±Re(O_n) + * + * where + * + * row0 = Re(E_n) + * row1 = -Re(O_n) + */ + for ( k = 0; k < L; k++ ) { + ip1 = iptr( M-1, k, 1, L, M, sc, oc ); // -Re(O_n) + io = optr( 0, 1, k, M, so, oo ); + out[ io ] = -cc[ ip1 ]; // -(-Re(O_n)) = Re(O_n) + + ip1 = iptr( M-1, k, 0, L, M, sc, oc ); // Re(E_n) + io = optr( M-1, 0, k, M, so, oo ); + out[ io ] = cc[ ip1 ]; + } +} + + +// EXPORTS // + +module.exports = radf2; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf3.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf3.js new file mode 100644 index 000000000000..e0361c31120c --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf3.js @@ -0,0 +1,401 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// VARIABLES // + +// cos( 2π/3 ): +var TAUR = -0.5; + +// sin( 2π/3 ): +var TAUI = 0.866025403784439; + + +// FUNCTIONS // + +/** +* Resolves an index into the input array. +* +* ## Notes +* +* In a forward real FFT, the previous stage writes its results as three "rows" per sub-sequence. +* +* Thus, when reading from an input array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having three "rows" (components 0, 1, and 2) and where each "row" is arranged as `M*L` contiguous elements corresponding to interleaved real and imaginary components. +* +* Accordingly, the following is a logical view of an input array (zero-based indexing) which contains `L = 3` transforms and in which each sub-sequence has length `M = 4`: +* +* ```text +* │ k = 0 k = 1 k = 2 +* │ ──────────────────────────────────────────────────────────────────────────→ k +* j = 0 │ cc(0,0,0) ... cc(3,0,0) cc(0,1,0) ... cc(3,1,0) cc(0,2,0) ... cc(3,2,0) +* │ +* j = 1 │ cc(0,0,1) ... cc(3,0,1) cc(0,1,1) ... cc(3,1,1) cc(0,2,1) ... cc(3,2,1) +* │ +* j = 2 │ cc(0,0,2) ... cc(3,0,2) cc(0,1,2) ... cc(3,1,2) cc(0,2,2) ... cc(3,2,2) +* └───────────────────────────────────────────────────────────────────────────→ i +* ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 M-1 0 M-1 0 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short sub-sequence corresponding to one of the three component rows. +* - `j` selects between the three component rows (0, 1, or 2). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | cc(0,0,0)...cc(3,0,0) ... cc(0,2,0)...cc(3,2,0) | cc(0,0,1)...cc(3,0,1) ... cc(0,2,1)...cc(3,2,1) | cc(0,0,2)...cc(3,0,2) ... cc(0,2,2)...cc(3,2,2) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 LM LM-1 (L+1)M (L+1)M-1 (2L-1)M 2LM-1 2LM (2L+1)M-1 (3L-1)M 3LM-1 +* ``` +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} j - input row +* @param {NonNegativeInteger} L - number of sub-sequences +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the input array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the input array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = iptr( 0, 0, 0, L, M, stride, offset ); +* // returns 0 +* +* idx = iptr( 1, 0, 0, L, M, stride, offset ); +* // returns 1 +* +* idx = iptr( M-1, 0, 0, L, M, stride, offset ); +* // returns 3 +* +* idx = iptr( 0, 1, 0, L, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = iptr( M-1, L-1, 1, L, M, stride, offset ); +* // returns 23 +*/ +function iptr( i, k, j, L, M, stride, offset ) { + var n = i + ( ( k+(j*L) ) * M ); + return ( n*stride ) + offset; +} + +/** +* Resolves an index into the output array. +* +* ## Notes +* +* When writing to an output array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having three "columns" corresponding to the three components of a radix-3 stage (with real and imaginary parts of each component interleaved along each sub-sequence) and where each "column" has `M` elements. +* +* Accordingly, the following is a logical view of an output array (zero-based indexing) which contains `L = 3` transforms and in which each "column" sub-sequence has length `M = 4`: +* +* ```text +* j = 0 (component 0) j = 1 (component 1) j = 2 (component 2) +* k = 0 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┐ +* │ out(0,0,0) out(1,0,0) ... out(3,0,0) │ out(0,1,0) out(1,1,0) ... out(3,1,0) │ out(0,2,0) out(1,2,0) ... out(3,2,0) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 1 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,1) out(1,0,1) ... out(3,0,1) │ out(0,1,1) out(1,1,1) ... out(3,1,1) │ out(0,2,1) out(1,2,1) ... out(3,2,1) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 2 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,2) out(1,0,2) ... out(3,0,2) │ out(0,1,2) out(1,1,2) ... out(3,1,2) │ out(0,2,2) out(1,2,2) ... out(3,2,2) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┘ +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 1 M-1 0 1 M-1 0 1 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short "column" sub-sequence. +* - `j` selects between one of the three components (0, 1, or 2). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | out(0,0,0)...out(3,0,0) | out(0,1,0)...out(3,1,0) | out(0,2,0)...out(3,2,0) | out(0,0,1)...out(3,0,1) | ... | out(0,2,2)...out(3,2,2) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 M 2M-1 2M 3M-1 3M 4M-1 (3L-1)M 3LM-1 +* ``` +* +* As may be observed, when resolving an index in the output array, the `j` and `k` dimensions are swapped relative index resolution in the input array. This stems from `radf3` being only one stage in a multi-stage driver which alternates between using `cc` and `out` as workspace buffers. After each stage, the next stage reads what the previous stage wrote. +* +* Each stage expects a transpose, and, in order to avoid explicit transposition between the stages, we swap the last two logical dimensions while still maintaining cache locality within the inner loop logical dimension, as indexed by `i`. +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} j - index specifying which of the three complex components we are in (0, 1, or 2) +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the output array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the output array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = optr( 0, 0, 0, M, stride, offset ); +* // returns 0 +* +* idx = optr( 1, 0, 0, M, stride, offset ); +* // returns 1 +* +* idx = optr( M-1, 0, 0, M, stride, offset ); +* // returns 3 +* +* idx = optr( 0, 1, 0, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = optr( M-1, 2, L-1, M, stride, offset ); +* // returns 35 +*/ +function optr( i, j, k, M, stride, offset ) { + var n = i + ( ( j+(k*3) ) * M ); + return ( n*stride ) + offset; +} + + +// MAIN // + +/** +* Performs one radix-3 stage within a forward Fourier transform for a real-valued sequence. +* +* @private +* @param {NonNegativeInteger} M - number of elements in each sub-sequence to be transformed +* @param {NonNegativeInteger} L - number of sub-sequences to be transformed +* @param {Collection} cc - input array containing the sub-sequences to be transformed +* @param {integer} sc - stride length for `cc` +* @param {NonNegativeInteger} oc - index offset for `cc` +* @param {Collection} out - output array containing transformed sub-sequences +* @param {integer} so - stride length for `out` +* @param {NonNegativeInteger} oo - index offset for `out` +* @param {Collection} twiddles1 - first array containing twiddle factors +* @param {integer} st1 - stride length for `twiddles1` +* @param {NonNegativeInteger} ot1 - index offset for `twiddles1` +* @param {Collection} twiddles2 - second array containing twiddle factors +* @param {integer} st2 - stride length for `twiddles2` +* @param {NonNegativeInteger} ot2 - index offset for `twiddles2` +* @returns {void} +*/ +function radf3( M, L, cc, sc, oc, out, so, oo, twiddles1, st1, ot1, twiddles2, st2, ot2 ) { // eslint-disable-line max-params + var it11; + var it12; + var it21; + var it22; + var tr2; + var ti2; + var tr3; + var ti3; + var cr2; + var ci2; + var dr2; + var di2; + var dr3; + var di3; + var ip1; + var ip2; + var ip3; + var io; + var im; + var i; + var k; + + /* + * First, perform the core butterfly for each sub-sequence being transformed. + * + * In the following loop, we handle harmonic `n = 0` for every transform. As described for `iptr`, the input array is interpreted as a three-dimensional array, containing three "rows" per sub-sequence. + * + * row0 = input component 0 (j = 0) + * row1 = input component 1 (j = 1) + * row2 = input component 2 (j = 2) + * + * For a radix-3 forward FFT of a real-valued signal `x` and `n = 0`, + * + * taur = cos(2π/3) + * taui = sin(2π/3) + * + * x[0] = row0 + row1 + row2 + * x[2M] = taui * ( row2-row1 ) + * x[M] = row0 + ( taur * ( row1+row2 ) ) + * + * Because `W_3^0 = 1`, no twiddle multiplication is necessary beyond these constant factors (`taur` and `taui`). + */ + for ( k = 0; k < L; k++ ) { + ip1 = iptr( 0, k, 0, L, M, sc, oc ); // real part row 0 + ip2 = iptr( 0, k, 1, L, M, sc, oc ); // real part row 1 + ip3 = iptr( 0, k, 2, L, M, sc, oc ); // real part row 2 + + cr2 = cc[ ip2 ] + cc[ ip3 ]; + + io = optr( 0, 0, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + cr2; // row0 + row1 + row2 + + io = optr( 0, 2, k, M, so, oo ); + out[ io ] = TAUI * ( cc[ ip3 ] - cc[ ip2 ] ); // taui * ( row2-row1 ) + + io = optr( M-1, 1, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + ( TAUR * cr2 ); // row0 + ( taur * ( row1+row2 ) ) + } + // When the number of elements in a sub-sequence is less than `2`, there is nothing more to do, as the above butterfly produced the full result... + if ( M < 2 ) { + return; + } + /* + * Next, apply the general case where we need to loop through the non-trivial harmonics. + * + * For each harmonic `n = 1, ..., M/2-1`, we need to + * + * - recover three spectra from the three input rows. + * - apply radix-3 twiddle factors to rows 1 and 2, then combine with row 0 to form three output columns. + * - form the following + * + * x[3n] = X₀ + (W₁⋅X₁ + W₂⋅X₂) => column 0 + * x[3n+1] = X₀ + taur⋅(W₁⋅X₁ + W₂⋅X₂) + taui⋅i⋅(W₁⋅X₁ - W₂⋅X₂) => column 2 + * x[3n+2] = X₀ + taur⋅(W₁⋅X₁ + W₂⋅X₂) - taui⋅i⋅(W₁⋅X₁ - W₂⋅X₂) => column 1 + * + * The mirror index `im = M - i` selects the conjugate-symmetric partner, thus allowing the routine to read each symmetry pair only once. + */ + // Loop over each sub-sequence to be transformed... + for ( k = 0; k < L; k++ ) { + // Loop over the elements in each sub-sequence... + for ( i = 2; i < M; i += 2 ) { + im = M - i; // "mirror" index + + // Resolve twiddle factor indices for component 1: + it11 = ( (i-2)*st1 ) + ot1; // cos(θ) for component 1 + it12 = ( (i-1)*st1 ) + ot1; // sin(θ) for component 1 + + // Resolve twiddle factor indices for component 2: + it21 = ( (i-2)*st2 ) + ot2; // cos(θ) for component 2 + it22 = ( (i-1)*st2 ) + ot2; // sin(θ) for component 2 + + // Load component 1 data... + ip1 = iptr( i-1, k, 1, L, M, sc, oc ); // real part component 1 + ip2 = iptr( i, k, 1, L, M, sc, oc ); // imag part component 1 + + // Apply twiddle factor for component 1 + dr2 = ( twiddles1[ it11 ] * cc[ ip1 ] ) + ( twiddles1[ it12 ] * cc[ ip2 ] ); + di2 = ( twiddles1[ it11 ] * cc[ ip2 ] ) - ( twiddles1[ it12 ] * cc[ ip1 ] ); + + // Load component 2 data... + ip1 = iptr( i-1, k, 2, L, M, sc, oc ); // real part component 2 + ip2 = iptr( i, k, 2, L, M, sc, oc ); // imag part component 2 + + // Apply twiddle factor for component 2 + dr3 = ( twiddles2[ it21 ] * cc[ ip1 ] ) + ( twiddles2[ it22 ] * cc[ ip2 ] ); + di3 = ( twiddles2[ it21 ] * cc[ ip2 ] ) - ( twiddles2[ it22 ] * cc[ ip1 ] ); + + // Combine the twiddled components + cr2 = dr2 + dr3; // sum of real parts + ci2 = di2 + di3; // sum of imag parts + + // Load component 0 data... + ip1 = iptr( i-1, k, 0, L, M, sc, oc ); // real part component 0 + io = optr( i-1, 0, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + cr2; + + ip2 = iptr( i, k, 0, L, M, sc, oc ); // imag part component 0 + io = optr( i, 0, k, M, so, oo ); + out[ io ] = cc[ ip2 ] + ci2; + + // Intermediate results for components 1 and 2 + tr2 = cc[ ip1 ] + ( TAUR * cr2 ); + ti2 = cc[ ip2 ] + ( TAUR * ci2 ); + tr3 = TAUI * ( di2 - di3 ); + ti3 = TAUI * ( dr3 - dr2 ); + + // Output component 1 + io = optr( i-1, 2, k, M, so, oo ); + out[ io ] = tr2 + tr3; + + io = optr( im-1, 1, k, M, so, oo ); + out[ io ] = tr2 - tr3; + + // Output component 2 + io = optr( i, 2, k, M, so, oo ); + out[ io ] = ti2 + ti3; + + io = optr( im, 1, k, M, so, oo ); + out[ io ] = ti3 - ti2; + } + } +} + + +// EXPORTS // + +module.exports = radf3; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf4.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf4.js new file mode 100644 index 000000000000..65fa22ef79c3 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf4.js @@ -0,0 +1,492 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +/* eslint-disable max-len, max-statements */ + +'use strict'; + +// MODULES // + +var SQRT_HALF = require( '@stdlib/constants/float64/sqrt-half' ); + + +// FUNCTIONS // + +/** +* Resolves an index into the input array. +* +* ## Notes +* +* In a forward real FFT, the previous stage writes its results as four "rows" per sub-sequence. +* +* Thus, when reading from an input array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having four "rows" (components 0, 1, 2, and 3) and where each "row" is arranged as `M*L` contiguous elements corresponding to interleaved real and imaginary components. +* +* Accordingly, the following is a logical view of an input array (zero-based indexing) which contains `L = 3` transforms and in which each sub-sequence has length `M = 4`: +* +* ```text +* │ k = 0 k = 1 k = 2 +* │ ──────────────────────────────────────────────────────────────────────────→ k +* j = 0 │ cc(0,0,0) ... cc(3,0,0) cc(0,1,0) ... cc(3,1,0) cc(0,2,0) ... cc(3,2,0) +* │ +* j = 1 │ cc(0,0,1) ... cc(3,0,1) cc(0,1,1) ... cc(3,1,1) cc(0,2,1) ... cc(3,2,1) +* │ +* j = 2 │ cc(0,0,2) ... cc(3,0,2) cc(0,1,2) ... cc(3,1,2) cc(0,2,2) ... cc(3,2,2) +* │ +* j = 3 │ cc(0,0,3) ... cc(3,0,3) cc(0,1,3) ... cc(3,1,3) cc(0,2,3) ... cc(3,2,3) +* └───────────────────────────────────────────────────────────────────────────→ i +* ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 M-1 0 M-1 0 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short sub-sequence corresponding to one of the four component rows. +* - `j` selects between the four component rows (0, 1, 2, or 3). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | cc(0,0,0)...cc(3,0,0) ... cc(0,2,0)...cc(3,2,0) | cc(0,0,1)...cc(3,0,1) ... cc(0,2,1)...cc(3,2,1) | ... | cc(0,0,3)...cc(3,0,3) ... cc(0,2,3)...cc(3,2,3) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 LM LM-1 (L+1)M (L+1)M-1 (2L-1)M 2LM-1 3LM (3L+1)M-1 (4L-1)M 4LM-1 +* ``` +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} j - input row +* @param {NonNegativeInteger} L - number of sub-sequences +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the input array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the input array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = iptr( 0, 0, 0, L, M, stride, offset ); +* // returns 0 +* +* idx = iptr( 1, 0, 0, L, M, stride, offset ); +* // returns 1 +* +* idx = iptr( M-1, 0, 0, L, M, stride, offset ); +* // returns 3 +* +* idx = iptr( 0, 1, 0, L, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = iptr( M-1, L-1, 1, L, M, stride, offset ); +* // returns 23 +*/ +function iptr( i, k, j, L, M, stride, offset ) { + var n = i + ( ( k+(j*L) ) * M ); + return ( n*stride ) + offset; +} + +/** +* Resolves an index into the output array. +* +* ## Notes +* +* When writing to an output array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having four "columns" corresponding to the four components of a radix-4 stage (with real and imaginary parts of each component interleaved along each sub-sequence) and where each "column" has `M` elements. +* +* Accordingly, the following is a logical view of an output array (zero-based indexing) which contains `L = 3` transforms and in which each "column" sub-sequence has length `M = 4`: +* +* ```text +* j = 0 (component 0) j = 1 (component 1) j = 2 (component 2) j = 3 (component 3) +* k = 0 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┐ +* │ out(0,0,0) out(1,0,0) ... out(3,0,0) │ out(0,1,0) out(1,1,0) ... out(3,1,0) │ out(0,2,0) out(1,2,0) ... out(3,2,0) │ out(0,3,0) out(1,3,0) ... out(3,3,0) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 1 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,1) out(1,0,1) ... out(3,0,1) │ out(0,1,1) out(1,1,1) ... out(3,1,1) │ out(0,2,1) out(1,2,1) ... out(3,2,1) │ out(0,3,1) out(1,3,1) ... out(3,3,1) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 2 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,2) out(1,0,2) ... out(3,0,2) │ out(0,1,2) out(1,1,2) ... out(3,1,2) │ out(0,2,2) out(1,2,2) ... out(3,2,2) │ out(0,3,2) out(1,3,2) ... out(3,3,2) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┘ +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 1 M-1 0 1 M-1 0 1 M-1 0 1 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short "column" sub-sequence. +* - `j` selects which of the four components (0, 1, 2, or 3). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | out(0,0,0)...out(3,0,0) | out(0,1,0)...out(3,1,0) | out(0,2,0)...out(3,2,0) | out(0,3,0)...out(3,3,0) | out(0,0,1)...out(3,0,1) | ... | out(0,3,2)...out(3,3,2) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 M 2M-1 2M 3M-1 3M 4M-1 4M 5M-1 (4L-1)M 4LM-1 +* ``` +* +* As may be observed, when resolving an index in the output array, the `j` and `k` dimensions are swapped relative index resolution in the input array. This stems from `radf4` being only one stage in a multi-stage driver which alternates between using `cc` and `out` as workspace buffers. After each stage, the next stage reads what the previous stage wrote. +* +* Each stage expects a transpose, and, in order to avoid explicit transposition between the stages, we swap the last two logical dimensions while still maintaining cache locality within the inner loop logical dimension, as indexed by `i`. +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} j - index specifying which of the four complex components we are in (0, 1, 2, or 3) +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the output array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the output array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = optr( 0, 0, 0, M, stride, offset ); +* // returns 0 +* +* idx = optr( 1, 0, 0, M, stride, offset ); +* // returns 1 +* +* idx = optr( M-1, 0, 0, M, stride, offset ); +* // returns 3 +* +* idx = optr( 0, 1, 0, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = optr( M-1, 3, L-1, M, stride, offset ); +* // returns 47 +*/ +function optr( i, j, k, M, stride, offset ) { + var n = i + ( ( j+(k*4) ) * M ); + return ( n*stride ) + offset; +} + + +// MAIN // + +/** +* Performs one radix-4 stage within a forward Fourier transform for a real-valued sequence. +* +* @private +* @param {NonNegativeInteger} M - number of elements in each sub-sequence to be transformed +* @param {NonNegativeInteger} L - number of sub-sequences to be transformed +* @param {Collection} cc - input array containing the sub-sequences to be transformed +* @param {integer} sc - stride length for `cc` +* @param {NonNegativeInteger} oc - index offset for `cc` +* @param {Collection} out - output array containing transformed sub-sequences +* @param {integer} so - stride length for `out` +* @param {NonNegativeInteger} oo - index offset for `out` +* @param {Collection} twiddles1 - first array containing twiddle factors +* @param {integer} st1 - stride length for `twiddles1` +* @param {NonNegativeInteger} ot1 - index offset for `twiddles1` +* @param {Collection} twiddles2 - second array containing twiddle factors +* @param {integer} st2 - stride length for `twiddles2` +* @param {NonNegativeInteger} ot2 - index offset for `twiddles2` +* @param {Collection} twiddles3 - third array containing twiddle factors +* @param {integer} st3 - stride length for `twiddles3` +* @param {NonNegativeInteger} ot3 - index offset for `twiddles3` +* @returns {void} +*/ +function radf4( M, L, cc, sc, oc, out, so, oo, twiddles1, st1, ot1, twiddles2, st2, ot2, twiddles3, st3, ot3 ) { // eslint-disable-line max-params + var it11; + var it12; + var it21; + var it22; + var it31; + var it32; + var tr1; + var tr2; + var tr3; + var tr4; + var ti1; + var ti2; + var ti3; + var ti4; + var cr2; + var cr3; + var cr4; + var ci2; + var ci3; + var ci4; + var ip1; + var ip2; + var ip3; + var ip4; + var io; + var im; + var i; + var k; + + /* + * First, perform the core butterfly for each sub-sequence being transformed. + * + * In the following loop, we handle harmonic `n = 0` for every transform. As described for `iptr`, the input array is interpreted as a three-dimensional array, containing four "rows" per sub-sequence. + * + * row0 = input component 0 (j = 0) + * row1 = input component 1 (j = 1) + * row2 = input component 2 (j = 2) + * row3 = input component 3 (j = 3) + * + * For a radix-4 forward FFT of a real-valued signal `x` and `n = 0`, + * + * tr1 = row1 + row3 + * tr2 = row0 + row2 + * + * x[0] = tr1 + tr2 + * x[2M-1] = row0 - row2 + * x[2M] = row3 - row1 + * x[4M-1] = tr2 - tr1 + * + * Because `W_4^0 = 1`, no twiddle multiplication is necessary. + */ + for ( k = 0; k < L; k++ ) { + ip1 = iptr( 0, k, 0, L, M, sc, oc ); // real part row 0 + ip2 = iptr( 0, k, 1, L, M, sc, oc ); // real part row 1 + ip3 = iptr( 0, k, 2, L, M, sc, oc ); // real part row 2 + ip4 = iptr( 0, k, 3, L, M, sc, oc ); // real part row 3 + + tr1 = cc[ ip2 ] + cc[ ip4 ]; // row1 + row3 + tr2 = cc[ ip1 ] + cc[ ip3 ]; // row0 + row2 + + io = optr( 0, 0, k, M, so, oo ); + out[ io ] = tr1 + tr2; + + io = optr( M-1, 3, k, M, so, oo ); + out[ io ] = tr2 - tr1; + + io = optr( M-1, 1, k, M, so, oo ); + out[ io ] = cc[ ip1 ] - cc[ ip3 ]; + + io = optr( 0, 2, k, M, so, oo ); + out[ io ] = cc[ ip4 ] - cc[ ip2 ]; + } + // When the number of elements in a sub-sequence is equal to `1`, there is nothing more to do, as the above butterfly produced the full result... + if ( M < 2 ) { + return; + } + /* + * Next, apply the general case where we need to loop through the non-trivial harmonics. + * + * For each harmonic `n = 1, ..., M/2-1`, we need to + * + * - recover four spectra from the four input rows. + * - apply radix-4 twiddle factors to rows 1, 2, and 3, then combine with row 0 to form four output columns. + * - form the following + * + * x[4n] = X₀ + W₂·X₂ + (W₁·X₁ + W₃·X₃) => column 0 + * x[4n+1] = X₀ + W₂·X₂ - (W₁·X₁ + W₃·X₃) => column 3 + * x[4n+2] = X₀ - W₂·X₂ + i·(W₁·X₁ - W₃·X₃) => column 2 + * x[4n+3] = X₀ - W₂·X₂ - i·(W₁·X₁ - W₃·X₃) => column 1 + * + * The mirror index `im = M - i` selects the conjugate-symmetric partner, thus allowing the routine to read each symmetry pair only once. + */ + if ( M >= 3 ) { + // Loop over each sub-sequence to be transformed... + for ( k = 0; k < L; k++ ) { + // Loop over the elements in each sub-sequence... + for ( i = 2; i < M; i += 2 ) { + im = M - i; // "mirror" index + + // Resolve twiddle factor indices for component 1: + it11 = ( (i-2)*st1 ) + ot1; // cos(θ) for component 1 + it12 = ( (i-1)*st1 ) + ot1; // sin(θ) for component 1 + + // Resolve twiddle factor indices for component 2: + it21 = ( (i-2)*st2 ) + ot2; // cos(θ) for component 2 + it22 = ( (i-1)*st2 ) + ot2; // sin(θ) for component 2 + + // Resolve twiddle factor indices for component 3: + it31 = ( (i-2)*st3 ) + ot3; // cos(θ) for component 3 + it32 = ( (i-1)*st3 ) + ot3; // sin(θ) for component 3 + + // Load component 1 data and apply twiddle... + ip1 = iptr( i-1, k, 1, L, M, sc, oc ); // real part component 1 + ip2 = iptr( i, k, 1, L, M, sc, oc ); // imag part component 1 + + // Apply the twiddle factors for component 1: + cr2 = ( twiddles1[ it11 ] * cc[ ip1 ] ) + ( twiddles1[ it12 ] * cc[ ip2 ] ); + ci2 = ( twiddles1[ it11 ] * cc[ ip2 ] ) - ( twiddles1[ it12 ] * cc[ ip1 ] ); + + // Load component 2 data and apply twiddle... + ip1 = iptr( i-1, k, 2, L, M, sc, oc ); // real part component 2 + ip2 = iptr( i, k, 2, L, M, sc, oc ); // imag part component 2 + + // Apply the twiddle factors for component 2: + cr3 = ( twiddles2[ it21 ] * cc[ ip1 ] ) + ( twiddles2[ it22 ] * cc[ ip2 ] ); + ci3 = ( twiddles2[ it21 ] * cc[ ip2 ] ) - ( twiddles2[ it22 ] * cc[ ip1 ] ); + + // Load component 3 data and apply twiddle... + ip1 = iptr( i-1, k, 3, L, M, sc, oc ); // real part component 3 + ip2 = iptr( i, k, 3, L, M, sc, oc ); // imag part component 3 + + // Apply the twiddle factors for component 3: + cr4 = ( twiddles3[ it31 ] * cc[ ip1 ] ) + ( twiddles3[ it32 ] * cc[ ip2 ] ); + ci4 = ( twiddles3[ it31 ] * cc[ ip2 ] ) - ( twiddles3[ it32 ] * cc[ ip1 ] ); + + // Radix-4 butterfly intermediate computations: + tr1 = cr2 + cr4; + tr4 = cr4 - cr2; + ti1 = ci2 + ci4; + ti4 = ci2 - ci4; + + // Load component 0 data and compute intermediates... + ip1 = iptr( i-1, k, 0, L, M, sc, oc ); // real part component 0 + tr2 = cc[ ip1 ] + cr3; + tr3 = cc[ ip1 ] - cr3; + + ip2 = iptr( i, k, 0, L, M, sc, oc ); // imag part component 0 + ti2 = cc[ ip2 ] + ci3; + ti3 = cc[ ip2 ] - ci3; + + // Output column 0 (real part) + io = optr( i-1, 0, k, M, so, oo ); + out[ io ] = tr1 + tr2; + + // Output column 3 (real part) + io = optr( im-1, 3, k, M, so, oo ); + out[ io ] = tr2 - tr1; + + // Output column 0 (imag part) + io = optr( i, 0, k, M, so, oo ); + out[ io ] = ti1 + ti2; + + // Output column 3 (imag part) + io = optr( im, 3, k, M, so, oo ); + out[ io ] = ti1 - ti2; + + // Output column 2 (real part) + io = optr( i-1, 2, k, M, so, oo ); + out[ io ] = ti4 + tr3; + + // Output column 1 (real part) + io = optr( im-1, 1, k, M, so, oo ); + out[ io ] = tr3 - ti4; + + // Output column 2 (imag part) + io = optr( i, 2, k, M, so, oo ); + out[ io ] = tr4 + ti3; + + // Output column 1 (imag part) + io = optr( im, 1, k, M, so, oo ); + out[ io ] = tr4 - ti3; + } + } + + // When `M` is odd, there is no Nyquist pair to process, so we do not need to perform any further transformations... + if ( M%2 === 1 ) { + return; + } + } + + /* + * Lastly, handle the Nyquist frequency where `i = M-1` (i.e., the last element of each sub-sequence). + * + * When `M` is even, the Nyquist index is `i = M/2`. In this stage, we've stored that element at the end of each sub-sequence (i.e., `i = M-1` in the packed layout). + * + * At this point, only real components exist for rows 1 and 3 (imaginary parts are zero due to symmetry), and the twiddle multiplication simplifies to involve √(1/2) factors. + * + * In this case, + * + * ti1 = -√(1/2) ⋅ (row1 + row3) + * tr1 = √(1/2) ⋅ (row1 - row3) + * + * where + * + * row0 = Re(X₀) + * row1 = Re(X₁) (imaginary part is zero) + * row2 = Re(X₂) + * row3 = Re(X₃) (imaginary part is zero) + */ + for ( k = 0; k < L; k++ ) { + ip1 = iptr( M-1, k, 1, L, M, sc, oc ); // Re(X₁) + ip2 = iptr( M-1, k, 3, L, M, sc, oc ); // Re(X₃) + + ti1 = -SQRT_HALF * ( cc[ ip1 ] + cc[ ip2 ] ); + tr1 = SQRT_HALF * ( cc[ ip1 ] - cc[ ip2 ] ); + + ip3 = iptr( M-1, k, 0, L, M, sc, oc ); // Re(X₀) + ip4 = iptr( M-1, k, 2, L, M, sc, oc ); // Re(X₂) + + io = optr( M-1, 0, k, M, so, oo ); + out[ io ] = cc[ ip3 ] + tr1; + + io = optr( M-1, 2, k, M, so, oo ); + out[ io ] = cc[ ip3 ] - tr1; + + io = optr( 0, 1, k, M, so, oo ); + out[ io ] = ti1 - cc[ ip4 ]; + + io = optr( 0, 3, k, M, so, oo ); + out[ io ] = cc[ ip4 ] + ti1; + } +} + + +// EXPORTS // + +module.exports = radf4; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf5.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf5.js new file mode 100644 index 000000000000..dec092981317 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radf5.js @@ -0,0 +1,511 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +/* eslint-disable max-len, max-statements */ + +'use strict'; + +// VARIABLES // + +// cos( 2π/5 ): +var TR11 = 0.309016994374947; + +// sin( 2π/5 ): +var TI11 = 0.951056516295154; + +// cos( 4π/5 ): +var TR12 = -0.809016994374947; + +// sin( 4π/5 ): +var TI12 = 0.587785252292473; + + +// FUNCTIONS // + +/** +* Resolves an index into the input array. +* +* ## Notes +* +* In a forward real FFT, the previous stage writes its results as five "rows" per sub-sequence. +* +* Thus, when reading from an input array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having five "rows" (components 0, 1, 2, 3, and 4) and where each "row" is arranged as `M*L` contiguous elements corresponding to interleaved real and imaginary components. +* +* Accordingly, the following is a logical view of an input array (zero-based indexing) which contains `L = 3` transforms and in which each sub-sequence has length `M = 4`: +* +* ```text +* │ k = 0 k = 1 k = 2 +* │ ──────────────────────────────────────────────────────────────────────────→ k +* j = 0 │ cc(0,0,0) ... cc(3,0,0) cc(0,1,0) ... cc(3,1,0) cc(0,2,0) ... cc(3,2,0) +* │ +* j = 1 │ cc(0,0,1) ... cc(3,0,1) cc(0,1,1) ... cc(3,1,1) cc(0,2,1) ... cc(3,2,1) +* │ +* j = 2 │ cc(0,0,2) ... cc(3,0,2) cc(0,1,2) ... cc(3,1,2) cc(0,2,2) ... cc(3,2,2) +* │ +* j = 3 │ cc(0,0,3) ... cc(3,0,3) cc(0,1,3) ... cc(3,1,3) cc(0,2,3) ... cc(3,2,3) +* │ +* j = 4 │ cc(0,0,4) ... cc(3,0,4) cc(0,1,4) ... cc(3,1,4) cc(0,2,4) ... cc(3,2,4) +* └───────────────────────────────────────────────────────────────────────────→ i +* ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 M-1 0 M-1 0 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short sub-sequence corresponding to one of the five component rows. +* - `j` selects between the five component rows (0, 1, 2, 3, or 4). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | cc(0,0,0)...cc(3,0,0) ... cc(0,2,0)...cc(3,2,0) | cc(0,0,1)...cc(3,0,1) ... cc(0,2,1)...cc(3,2,1) | ... | cc(0,0,4)...cc(3,0,4) ... cc(0,2,4)...cc(3,2,4) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 LM LM-1 (L+1)M (L+1)M-1 (2L-1)M 2LM-1 4LM (4L+1)M-1 (5L-1)M 5LM-1 +* ``` +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} j - input row +* @param {NonNegativeInteger} L - number of sub-sequences +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the input array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the input array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = iptr( 0, 0, 0, L, M, stride, offset ); +* // returns 0 +* +* idx = iptr( 1, 0, 0, L, M, stride, offset ); +* // returns 1 +* +* idx = iptr( M-1, 0, 0, L, M, stride, offset ); +* // returns 3 +* +* idx = iptr( 0, 1, 0, L, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = iptr( M-1, L-1, 1, L, M, stride, offset ); +* // returns 23 +*/ +function iptr( i, k, j, L, M, stride, offset ) { + var n = i + ( ( k+(j*L) ) * M ); + return ( n*stride ) + offset; +} + +/** +* Resolves an index into the output array. +* +* ## Notes +* +* When writing to an output array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having five "columns" corresponding to the five components of a radix-5 stage (with real and imaginary parts of each component interleaved along each sub-sequence) and where each "column" has `M` elements. +* +* Accordingly, the following is a logical view of an output array (zero-based indexing) which contains `L = 3` transforms and in which each "column" sub-sequence has length `M = 4`: +* +* ```text +* j = 0 (component 0) j = 1 (component 1) j = 2 (component 2) j = 3 (component 3) j = 4 (component 4) +* k = 0 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┐ +* │ out(0,0,0) out(1,0,0) ... out(3,0,0) │ out(0,1,0) out(1,1,0) ... out(3,1,0) │ out(0,2,0) out(1,2,0) ... out(3,2,0) │ out(0,3,0) out(1,3,0) ... out(3,3,0) │ out(0,4,0) out(1,4,0) ... out(3,4,0) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 1 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,1) out(1,0,1) ... out(3,0,1) │ out(0,1,1) out(1,1,1) ... out(3,1,1) │ out(0,2,1) out(1,2,1) ... out(3,2,1) │ out(0,3,1) out(1,3,1) ... out(3,3,1) │ out(0,4,1) out(1,4,1) ... out(3,4,1) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┤ +* k = 2 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┤ +* │ out(0,0,2) out(1,0,2) ... out(3,0,2) │ out(0,1,2) out(1,1,2) ... out(3,1,2) │ out(0,2,2) out(1,2,2) ... out(3,2,2) │ out(0,3,2) out(1,3,2) ... out(3,3,2) │ out(0,4,2) out(1,4,2) ... out(3,4,2) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┘ +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 1 M-1 0 1 M-1 0 1 M-1 0 1 M-1 0 1 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short "column" sub-sequence. +* - `j` selects which of the five components (0, 1, 2, 3, or 4). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | out(0,0,0)...out(3,0,0) | out(0,1,0)...out(3,1,0) | out(0,2,0)...out(3,2,0) | out(0,3,0)...out(3,3,0) | out(0,4,0)...out(3,4,0) | out(0,0,1)...out(3,0,1) | ... | out(0,4,2)...out(3,4,2) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 M 2M-1 2M 3M-1 3M 4M-1 4M 5M-1 5M 6M-1 (5L-1)M 5LM-1 +* ``` +* +* As may be observed, when resolving an index in the output array, the `j` and `k` dimensions are swapped relative index resolution in the input array. This stems from `radf5` being only one stage in a multi-stage driver which alternates between using `cc` and `out` as workspace buffers. After each stage, the next stage reads what the previous stage wrote. +* +* Each stage expects a transpose, and, in order to avoid explicit transposition between the stages, we swap the last two logical dimensions while still maintaining cache locality within the inner loop logical dimension, as indexed by `i`. +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} j - index specifying which of the five complex components we are in (0, 1, 2, 3, or 4) +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the output array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the output array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = optr( 0, 0, 0, M, stride, offset ); +* // returns 0 +* +* idx = optr( 1, 0, 0, M, stride, offset ); +* // returns 1 +* +* idx = optr( M-1, 0, 0, M, stride, offset ); +* // returns 3 +* +* idx = optr( 0, 1, 0, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = optr( M-1, 4, L-1, M, stride, offset ); +* // returns 59 +*/ +function optr( i, j, k, M, stride, offset ) { + var n = i + ( ( j+(k*5) ) * M ); + return ( n*stride ) + offset; +} + + +// MAIN // + +/** +* Performs one radix-5 stage within a forward Fourier transform for a real-valued sequence. +* +* @private +* @param {NonNegativeInteger} M - number of elements in each sub-sequence to be transformed +* @param {NonNegativeInteger} L - number of sub-sequences to be transformed +* @param {Collection} cc - input array containing the sub-sequences to be transformed +* @param {integer} sc - stride length for `cc` +* @param {NonNegativeInteger} oc - index offset for `cc` +* @param {Collection} out - output array containing transformed sub-sequences +* @param {integer} so - stride length for `out` +* @param {NonNegativeInteger} oo - index offset for `out` +* @param {Collection} twiddles1 - first array containing twiddle factors +* @param {integer} st1 - stride length for `twiddles1` +* @param {NonNegativeInteger} ot1 - index offset for `twiddles1` +* @param {Collection} twiddles2 - second array containing twiddle factors +* @param {integer} st2 - stride length for `twiddles2` +* @param {NonNegativeInteger} ot2 - index offset for `twiddles2` +* @param {Collection} twiddles3 - third array containing twiddle factors +* @param {integer} st3 - stride length for `twiddles3` +* @param {NonNegativeInteger} ot3 - index offset for `twiddles3` +* @param {Collection} twiddles4 - fourth array containing twiddle factors +* @param {integer} st4 - stride length for `twiddles4` +* @param {NonNegativeInteger} ot4 - index offset for `twiddles4` +* @returns {void} +*/ +function radf5( M, L, cc, sc, oc, out, so, oo, twiddles1, st1, ot1, twiddles2, st2, ot2, twiddles3, st3, ot3, twiddles4, st4, ot4 ) { // eslint-disable-line max-params + var it11; + var it12; + var it21; + var it22; + var it31; + var it32; + var it41; + var it42; + var ci2; + var ci3; + var ci4; + var ci5; + var cr2; + var cr3; + var cr4; + var cr5; + var dr2; + var dr3; + var dr4; + var dr5; + var di2; + var di3; + var di4; + var di5; + var ti2; + var ti3; + var ti4; + var ti5; + var tr2; + var tr3; + var tr4; + var tr5; + var ip1; + var ip2; + var ip3; + var ip4; + var ip5; + var io; + var im; + var i; + var k; + + /* + * First, perform the core butterfly for each sub-sequence being transformed. + * + * In the following loop, we handle harmonic `n = 0` for every transform. As described for `iptr`, the input array is interpreted as a three-dimensional array, containing five "rows" per sub-sequence. + * + * row0 = input component 0 (j = 0) + * row1 = input component 1 (j = 1) + * row2 = input component 2 (j = 2) + * row3 = input component 3 (j = 3) + * row4 = input component 4 (j = 4) + * + * For a radix-5 forward FFT of a real-valued signal `x` and `n = 0`, + * + * cr2 = row4 + row1 + * ci5 = row4 - row1 + * cr3 = row3 + row2 + * ci4 = row3 - row2 + * + * x[0] = row0 + cr2 + cr3 + * x[M] = row0 + ( TR11*cr2 ) + ( TR12*cr3 ) + * x[2M] = ( TI11*ci5 ) + ( TI12*ci4 ) + * x[3M] = row0 + ( TR12*cr2 ) + ( TR11*cr3 ) + * x[4M] = ( TI12*ci5 ) - ( TI11*ci4 ) + * + * Because `W_5^0 = 1`, no frequency-dependent twiddle multiplication is necessary beyond these constant factors. + */ + for ( k = 0; k < L; k++ ) { + ip1 = iptr( 0, k, 0, L, M, sc, oc ); // row 0 + ip2 = iptr( 0, k, 1, L, M, sc, oc ); // row 1 + ip3 = iptr( 0, k, 2, L, M, sc, oc ); // row 2 + ip4 = iptr( 0, k, 3, L, M, sc, oc ); // row 3 + ip5 = iptr( 0, k, 4, L, M, sc, oc ); // row 4 + + cr2 = cc[ ip5 ] + cc[ ip2 ]; // row4 + row1 + ci5 = cc[ ip5 ] - cc[ ip2 ]; // row4 - row1 + cr3 = cc[ ip4 ] + cc[ ip3 ]; // row3 + row2 + ci4 = cc[ ip4 ] - cc[ ip3 ]; // row3 - row2 + + io = optr( 0, 0, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + cr2 + cr3; + + io = optr( M-1, 1, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + ( TR11 * cr2 ) + ( TR12 * cr3 ); + + io = optr( 0, 2, k, M, so, oo ); + out[ io ] = ( TI11 * ci5 ) + ( TI12 * ci4 ); + + io = optr( M-1, 3, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + ( TR12 * cr2 ) + ( TR11 * cr3 ); + + io = optr( 0, 4, k, M, so, oo ); + out[ io ] = ( TI12 * ci5 ) - ( TI11 * ci4 ); + } + // When the number of elements in a sub-sequence is less than `2`, there is nothing more to do, as the above butterfly produced the full result... + if ( M < 2 ) { + return; + } + /* + * Next, apply the general case where we need to loop through the non-trivial harmonics. + * + * For each harmonic `n = 1, ..., M/2-1`, we need to + * + * - recover five spectra from the five input rows. + * - apply radix-5 twiddle factors to rows 1, 2, 3, and 4, then combine with row 0 to form five output columns. + * - form the following + * + * x[5n] = X₀ + (W₁⋅X₁ + W₄⋅X₄) + (W₂⋅X₂ + W₃⋅X₃) => column 0 + * x[5n+1] = X₀ + TR11⋅(W₁⋅X₁ + W₄⋅X₄) + TR12⋅(W₂⋅X₂ + W₃⋅X₃) - i⋅(TI11⋅(W₁⋅X₁ - W₄⋅X₄) + TI12⋅(W₂⋅X₂ - W₃⋅X₃)) => column 1 + * x[5n+2] = X₀ + TR11⋅(W₁⋅X₁ + W₄⋅X₄) + TR12⋅(W₂⋅X₂ + W₃⋅X₃) + i⋅(TI11⋅(W₁⋅X₁ - W₄⋅X₄) + TI12⋅(W₂⋅X₂ - W₃⋅X₃)) => column 2 + * x[5n+3] = X₀ + TR12⋅(W₁⋅X₁ + W₄⋅X₄) + TR11⋅(W₂⋅X₂ + W₃⋅X₃) - i⋅(TI12⋅(W₁⋅X₁ - W₄⋅X₄) - TI11⋅(W₂⋅X₂ - W₃⋅X₃)) => column 3 + * x[5n+4] = X₀ + TR12⋅(W₁⋅X₁ + W₄⋅X₄) + TR11⋅(W₂⋅X₂ + W₃⋅X₃) + i⋅(TI12⋅(W₁⋅X₁ - W₄⋅X₄) - TI11⋅(W₂⋅X₂ - W₃⋅X₃)) => column 4 + * + * The mirror index `im = M - i` selects the conjugate-symmetric partner, thus allowing the routine to read each symmetry pair only once. + */ + // Loop over each sub-sequence to be transformed... + for ( k = 0; k < L; k++ ) { + // Loop over the elements in each sub-sequence... + for ( i = 2; i < M; i += 2 ) { + im = M - i; // "mirror" index + + // Resolve twiddle factor indices for component 1: + it11 = ( (i-2)*st1 ) + ot1; // cos(θ) for component 1 + it12 = ( (i-1)*st1 ) + ot1; // sin(θ) for component 1 + + // Resolve twiddle factor indices for component 2: + it21 = ( (i-2)*st2 ) + ot2; // cos(θ) for component 2 + it22 = ( (i-1)*st2 ) + ot2; // sin(θ) for component 2 + + // Resolve twiddle factor indices for component 3: + it31 = ( (i-2)*st3 ) + ot3; // cos(θ) for component 3 + it32 = ( (i-1)*st3 ) + ot3; // sin(θ) for component 3 + + // Resolve twiddle factor indices for component 4: + it41 = ( (i-2)*st4 ) + ot4; // cos(θ) for component 4 + it42 = ( (i-1)*st4 ) + ot4; // sin(θ) for component 4 + + // Load component 1 data and apply twiddle... + ip1 = iptr( i-1, k, 1, L, M, sc, oc ); // real part component 1 + ip2 = iptr( i, k, 1, L, M, sc, oc ); // imag part component 1 + + // Apply the twiddle factors for component 1: + dr2 = ( twiddles1[ it11 ] * cc[ ip1 ] ) + ( twiddles1[ it12 ] * cc[ ip2 ] ); // Re(dr2) + di2 = ( twiddles1[ it11 ] * cc[ ip2 ] ) - ( twiddles1[ it12 ] * cc[ ip1 ] ); // Im(di2) + + // Load component 2 data and apply twiddle... + ip1 = iptr( i-1, k, 2, L, M, sc, oc ); // real part component 2 + ip2 = iptr( i, k, 2, L, M, sc, oc ); // imag part component 2 + + // Apply the twiddle factors for component 2: + dr3 = ( twiddles2[ it21 ] * cc[ ip1 ] ) + ( twiddles2[ it22 ] * cc[ ip2 ] ); // Re(dr3) + di3 = ( twiddles2[ it21 ] * cc[ ip2 ] ) - ( twiddles2[ it22 ] * cc[ ip1 ] ); // Im(di3) + + // Load component 3 data and apply twiddle... + ip1 = iptr( i-1, k, 3, L, M, sc, oc ); // real part component 3 + ip2 = iptr( i, k, 3, L, M, sc, oc ); // imag part component 3 + + // Apply the twiddle factors for component 3: + dr4 = ( twiddles3[ it31 ] * cc[ ip1 ] ) + ( twiddles3[ it32 ] * cc[ ip2 ] ); // Re(dr4) + di4 = ( twiddles3[ it31 ] * cc[ ip2 ] ) - ( twiddles3[ it32 ] * cc[ ip1 ] ); // Im(di4) + + // Load component 4 data and apply twiddle... + ip1 = iptr( i-1, k, 4, L, M, sc, oc ); // real part component 4 + ip2 = iptr( i, k, 4, L, M, sc, oc ); // imag part component 4 + + // Apply the twiddle factors for component 4: + dr5 = ( twiddles4[ it41 ] * cc[ ip1 ] ) + ( twiddles4[ it42 ] * cc[ ip2 ] ); // Re(dr5) + di5 = ( twiddles4[ it41 ] * cc[ ip2 ] ) - ( twiddles4[ it42 ] * cc[ ip1 ] ); // Im(di5) + + // Radix-5 butterfly intermediate computations (symmetric/antisymmetric combinations): + cr2 = dr2 + dr5; + ci5 = dr5 - dr2; + cr5 = di2 - di5; + ci2 = di5 + di2; + cr3 = dr3 + dr4; + ci4 = dr4 - dr3; + cr4 = di3 - di4; + ci3 = di3 + di4; + + // Output column 0 (real part) + ip1 = iptr( i-1, k, 0, L, M, sc, oc ); + io = optr( i-1, 0, k, M, so, oo ); + out[ io ] = cc[ ip1 ] + cr2 + cr3; + + // Output column 0 (imag part) + ip2 = iptr( i, k, 0, L, M, sc, oc ); + io = optr( i, 0, k, M, so, oo ); + out[ io ] = cc[ ip2 ] + ci2 + ci3; + + // Load component 0 data and compute intermediates... + tr2 = cc[ ip1 ] + ( TR11 * cr2 ) + ( TR12 * cr3 ); + ti2 = cc[ ip2 ] + ( TR11 * ci2 ) + ( TR12 * ci3 ); + tr3 = cc[ ip1 ] + ( TR12 * cr2 ) + ( TR11 * cr3 ); + ti3 = cc[ ip2 ] + ( TR12 * ci2 ) + ( TR11 * ci3 ); + + // Additional intermediates: + tr5 = ( TI11 * cr5 ) + ( TI12 * cr4 ); + ti5 = ( TI11 * ci5 ) + ( TI12 * ci4 ); + tr4 = ( TI12 * cr5 ) - ( TI11 * cr4 ); + ti4 = ( TI12 * ci5 ) - ( TI11 * ci4 ); + + // Output column 2 (real part) + io = optr( i-1, 2, k, M, so, oo ); + out[ io ] = tr2 + tr5; + + // Output column 1 (real part) + io = optr( im-1, 1, k, M, so, oo ); + out[ io ] = tr2 - tr5; + + // Output column 2 (imag part) + io = optr( i, 2, k, M, so, oo ); + out[ io ] = ti2 + ti5; + + // Output column 1 (imag part) + io = optr( im, 1, k, M, so, oo ); + out[ io ] = ti5 - ti2; + + // Output column 4 (real part) + io = optr( i-1, 4, k, M, so, oo ); + out[ io ] = tr3 + tr4; + + // Output column 3 (real part) + io = optr( im-1, 3, k, M, so, oo ); + out[ io ] = tr3 - tr4; + + // Output column 4 (imag part) + io = optr( i, 4, k, M, so, oo ); + out[ io ] = ti3 + ti4; + + // Output column 3 (imag part) + io = optr( im, 3, k, M, so, oo ); + out[ io ] = ti4 - ti3; + } + } +} + + +// EXPORTS // + +module.exports = radf5; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radfg.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radfg.js new file mode 100644 index 000000000000..8e00218e2186 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/radfg.js @@ -0,0 +1,765 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +/* eslint-disable max-len, max-statements, max-lines-per-function */ + +'use strict'; + +// MODULES // + +var TWO_PI = require( '@stdlib/constants/float64/two-pi' ); +var cos = require( '@stdlib/math/base/special/cos' ); +var sin = require( '@stdlib/math/base/special/sin' ); +var floor = require( '@stdlib/math/base/special/floor' ); + + +// FUNCTIONS // + +/** +* Resolves an index into the input array. +* +* ## Notes +* +* In a forward real FFT, the previous stage writes its results as `R` "rows" per sub-sequence. +* +* Thus, when reading from an input array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having `R` "rows" (components 0, 1, 2, ..., R-1) and where each "row" is arranged as `M*L` contiguous elements corresponding to interleaved real and imaginary components. +* +* Accordingly, the following is a logical view of an input array (zero-based indexing) which contains `L = 3` transforms and in which each sub-sequence has length `M = 4`: +* +* ```text +* │ k = 0 k = 1 k = 2 +* │ ─────────────────────────────────────────────────────────────────────────────────────→ k +* j = 0 │ cc(0,0,0) ... cc(3,0,0) cc(0,1,0) ... cc(3,1,0) cc(0,2,0) ... cc(3,2,0) +* │ +* j = 1 │ cc(0,0,1) ... cc(3,0,1) cc(0,1,1) ... cc(3,1,1) cc(0,2,1) ... cc(3,2,1) +* │ +* j = 2 │ cc(0,0,2) ... cc(3,0,2) cc(0,1,2) ... cc(3,1,2) cc(0,2,2) ... cc(3,2,2) +* │ +* j = 3 │ cc(0,0,3) ... cc(3,0,3) cc(0,1,3) ... cc(3,1,3) cc(0,2,3) ... cc(3,2,3) +* │ +* ... │ ... ... ... +* │ +* j=R-1 │ cc(0,0,R-1) ... cc(3,0,R-1) cc(0,1,R-1) ... cc(3,1,R-1) cc(0,2,R-1) ... cc(3,2,R-1) +* └──────────────────────────────────────────────────────────────────────────────────────→ i +* ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 M-1 0 M-1 0 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short sub-sequence corresponding to one of the R component rows. +* - `j` selects between the R component rows (0, 1, 2, ..., R-1). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | cc(0,0,0)...cc(3,0,0) ... cc(0,2,0)...cc(3,2,0) | cc(0,0,1)...cc(3,0,1) ... cc(0,2,1)...cc(3,2,1) | ... | cc(0,0,R-1)...cc(3,0,R-1) ... cc(0,2,R-1)...cc(3,2,R-1) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 LM LM-1 (L+1)M (L+1)M-1 (2L-1)M 2LM-1 (R-1)LM ((R-1)L+1)M-1 (RL-1)M RLM-1 +* ``` +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} j - input row +* @param {NonNegativeInteger} L - number of sub-sequences +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the input array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the input array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = iptr( 0, 0, 0, L, M, stride, offset ); +* // returns 0 +* +* idx = iptr( 1, 0, 0, L, M, stride, offset ); +* // returns 1 +* +* idx = iptr( M-1, 0, 0, L, M, stride, offset ); +* // returns 3 +* +* idx = iptr( 0, 1, 0, L, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = iptr( M-1, L-1, 6, L, M, stride, offset ); +* // returns 83 +*/ +function iptr( i, k, j, L, M, stride, offset ) { + var n = i + ( ( k+(j*L) ) * M ); + return ( n*stride ) + offset; +} + +/** +* Resolves an index into the output array. +* +* ## Notes +* +* When writing to an output array stored in linear memory, we can reinterpret the array as a three-dimensional logical view containing `L` independent sub-sequences having `R` "columns" corresponding to the `R` components of a radix-R stage (with real and imaginary parts of each component interleaved along each sub-sequence) and where each "column" has `M` elements. +* +* Accordingly, the following is a logical view of an output array (zero-based indexing) which contains `L = 3` transforms and in which each "column" sub-sequence has length `M = 4` for an arbitrary radix `R`: +* +* ```text +* j = 0 (component 0) j = 1 (component 1) j = 2 (component 2) ... j = R-1 (component R-1) +* k = 0 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────────────┐ +* │ out(0,0,0) out(1,0,0) ... out(3,0,0) │ out(0,1,0) out(1,1,0) ... out(3,1,0) │ out(0,2,0) out(1,2,0) ... out(3,2,0) │ ... │ out(0,R-1,0) out(1,R-1,0) ... out(3,R-1,0) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────────────┤ +* k = 1 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────────────┤ +* │ out(0,0,1) out(1,0,1) ... out(3,0,1) │ out(0,1,1) out(1,1,1) ... out(3,1,1) │ out(0,2,1) out(1,2,1) ... out(3,2,1) │ ... │ out(0,R-1,1) out(1,R-1,1) ... out(3,R-1,1) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────────────┤ +* k = 2 ─┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────────────┤ +* │ out(0,0,2) out(1,0,2) ... out(3,0,2) │ out(0,1,2) out(1,1,2) ... out(3,1,2) │ out(0,2,2) out(1,2,2) ... out(3,2,2) │ ... │ out(0,R-1,2) out(1,R-1,2) ... out(3,R-1,2) │ +* └───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────────────────────────────────────┘ +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* i = 0 1 M-1 0 1 M-1 0 1 M-1 0 1 M-1 +* ``` +* +* In the above, +* +* - `i` is the fastest varying index, which walks within one short "column" sub-sequence. +* - `j` selects which of the R components we are in (0, 1, 2, ..., R-1). +* - `k` specifies the index of one of the `L` independent transforms we are processing. +* +* In linear memory, the three-dimensional logical view is arranged as follows: +* +* ```text +* | out(0,0,0)...out(3,0,0) | out(0,1,0)...out(3,1,0) | out(0,2,0)...out(3,2,0) | ... | out(0,R-1,0)...out(3,R-1,0) | out(0,0,1)...out(3,0,1) | ... | out(0,R-1,2)...out(3,R-1,2) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 M-1 M 2M-1 2M 3M-1 (R-1)M RM-1 RM (R+1)M-1 (RL-1)M RLM-1 +* ``` +* +* As may be observed, when resolving an index in the output array, the `j` and `k` dimensions are swapped relative index resolution in the input array. This stems from `radfg` being only one stage in a multi-stage driver which alternates between using `cc` and `out` as workspace buffers. After each stage, the next stage reads what the previous stage wrote. +* +* Each stage expects a transpose, and, in order to avoid explicit transposition between the stages, we swap the last two logical dimensions while still maintaining cache locality within the inner loop logical dimension, as indexed by `i`. +* +* @private +* @param {NonNegativeInteger} i - index of an element within a sub-sequence +* @param {NonNegativeInteger} j - index specifying which of the R complex components we are in (0, 1, ..., R-1) +* @param {NonNegativeInteger} k - index of the sub-sequence being transformed +* @param {NonNegativeInteger} R - radix +* @param {NonNegativeInteger} M - sub-sequence length +* @param {integer} stride - stride length of the output array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the output array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* +* var idx = optr( 0, 0, 0, 7, M, stride, offset ); +* // returns 0 +* +* idx = optr( 1, 0, 0, 7, M, stride, offset ); +* // returns 1 +* +* idx = optr( M-1, 0, 0, 7, M, stride, offset ); +* // returns 3 +* +* idx = optr( 0, 1, 0, 7, M, stride, offset ); +* // returns 4 +* +* // ... +* +* idx = optr( M-1, 6, L-1, 7, M, stride, offset ); +* // returns 83 +*/ +function optr( i, j, k, R, M, stride, offset ) { + var n = i + ( ( j+(k*R) ) * M ); + return ( n*stride ) + offset; +} + +/** +* Resolves an index into a flattened workspace array. +* +* ## Notes +* +* During the general radix stage, flattened workspace arrays store `ML = M * L` elements for each of the `R` component columns. Both the flattened input and output workspace arrays share the same `[ML, R]` logical layout. +* +* Thus, when accessing a flattened workspace array stored in linear memory, we can reinterpret the array as a two-dimensional logical view having `R` component columns, where each column has `ML` elements. +* +* Accordingly, the following is a logical view of a flattened workspace array (zero-based indexing) having flattened dimension `ML` and arbitrary radix `R`: +* +* ```text +* │ j = 0 j = 1 j = 2 ... j = R-1 +* │ ────────────────────────────────────────────────────────────────────────→ j +* ik = 0 │ ws(0,0) ws(0,1) ws(0,2) ... ws(0,R-1) +* │ +* ik = 1 │ ws(1,0) ws(1,1) ws(1,2) ... ws(1,R-1) +* │ +* ik = 2 │ ws(2,0) ws(2,1) ws(2,2) ... ws(2,R-1) +* │ +* ik = 3 │ ws(3,0) ws(3,1) ws(3,2) ... ws(3,R-1) +* │ +* ... │ ... ... ... ... ... +* │ +* ik = ML-1 │ ws(ML-1,0) ws(ML-1,1) ws(ML-1,2) ... ws(ML-1,R-1) +* ``` +* +* In the above, +* +* - `ik` is the fastest varying index, which walks along the flattened sub-sequence dimension. +* - `j` selects between the `R` workspace component columns (0, 1, 2, ..., R-1). +* +* In linear memory, the two-dimensional logical view is arranged as follows: +* +* ```text +* | ws(0,0)...ws(ML-1,0) | ws(0,1)...ws(ML-1,1) | ws(0,2)...ws(ML-1,2) | ... | ws(0,R-1)...ws(ML-1,R-1) | +* ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ +* 0 ML-1 ML 2ML-1 2ML 3ML-1 (R-1)ML RML-1 +* ``` +* +* Here, the original `M` and `L` dimensions have been collapsed into the single flattened `ik` dimension. Each workspace component `j` therefore occupies one contiguous block of `ML` elements in linear memory. +* +* @private +* @param {NonNegativeInteger} ik - index of an element within a flattened sub-sequence +* @param {NonNegativeInteger} j - index specifying which of the R workspace component columns we are in (0, 1, ..., R-1) +* @param {NonNegativeInteger} ML - flattened sub-sequence length +* @param {integer} stride - stride length of the flattened workspace array +* @param {NonNegativeInteger} offset - index specifying the first indexed element in the flattened workspace array +* @returns {NonNegativeInteger} computed index +* +* @example +* var stride = 1; +* var offset = 0; +* +* var M = 4; // sub-sequence length +* var L = 3; // number of sub-sequences +* var ML = M * L; // flattened dimension ( 4*3 = 12 ) +* +* var idx = fptr( 0, 0, ML, stride, offset ); +* // returns 0 +* +* idx = fptr( 1, 0, ML, stride, offset ); +* // returns 1 +* +* idx = fptr( ML-1, 0, ML, stride, offset ); +* // returns 11 +* +* idx = fptr( 0, 1, ML, stride, offset ); +* // returns 12 +* +* // ... +* +* idx = fptr( ML-1, 6, ML, stride, offset ); +* // returns 83 +*/ +function fptr( ik, j, ML, stride, offset ) { + var n = ik + ( j*ML ); + return ( n*stride ) + offset; +} + + +// MAIN // + +/** +* Performs one general radix stage within a forward Fourier transform for a real-valued sequence. +* +* @private +* @param {NonNegativeInteger} M - number of elements in each sub-sequence to be transformed +* @param {NonNegativeInteger} R - radix of the transform +* @param {NonNegativeInteger} L - number of sub-sequences to be transformed +* @param {NonNegativeInteger} ML - number of elements in each flattened sub-sequence (`M*L`) +* @param {Collection} cc - input array containing the sub-sequences to be transformed +* @param {integer} sc - stride length for `cc` +* @param {NonNegativeInteger} oc - index offset for `cc` +* @param {Collection} c1 - input workspace array containing intermediate sub-sequences to be transformed +* @param {integer} sc1 - stride length for `c1` +* @param {NonNegativeInteger} oc1 - index offset for `c1` +* @param {Collection} c2 - flattened input workspace array containing intermediate sub-sequences +* @param {integer} sc2 - stride length for `c2` +* @param {NonNegativeInteger} oc2 - index offset for `c2` +* @param {Collection} ch - output array containing transformed sequences +* @param {integer} sch - stride length for `ch` +* @param {NonNegativeInteger} och - index offset for `ch` +* @param {Collection} ch2 - flattened output workspace array containing intermediate sub-sequences +* @param {integer} sch2 - stride length for `ch2` +* @param {NonNegativeInteger} och2 - index offset for `ch2` +* @param {Collection} twiddles - array of twiddle factors +* @param {integer} stw - stride length for `twiddles` +* @param {NonNegativeInteger} otw - index offset for `twiddles` +* @returns {void} +*/ +function radfg( M, R, L, ML, cc, sc, oc, c1, sc1, oc1, c2, sc2, oc2, ch, sch, och, ch2, sch2, och2, twiddles, stw, otw ) { // eslint-disable-line max-params + var ar1h; + var ar2h; + var idij; + var ic2o; + var ic1o; + var ich; + var icc; + var Rph; + var Rp1; + var ih1; + var ih2; + var ih3; + var ih4; + var ic1; + var ic2; + var ic3; + var ic4; + var it1; + var it2; + var io1; + var io2; + var io3; + var io4; + var dc2; + var ai1; + var ai2; + var ar1; + var ar2; + var ds2; + var nbd; + var dcp; + var dsp; + var im; + var ik; + var is; + var jc; + var lc; + var j2; + var i; + var j; + var k; + var l; + + // Compute the basic rotation angle for the radix-R DFT matrix: + dcp = cos( TWO_PI / R ); // cos(2π/R) + dsp = sin( TWO_PI / R ); // sin(2π/R) + + // Compute half the radix, rounded up, which is used as the exclusive upper bound for conjugate-symmetric component loops: + Rph = floor( ( R + 1 ) / 2 ); + Rp1 = R + 1; + + // Compute the number of non-DC complex harmonics in each sub-sequence: + nbd = floor( ( M - 1 ) / 2 ); + + /* + * First, initialize the work arrays for the general-radix butterfly. + * + * At this stage, each sub-sequence has already been split into `R` radix components. The `j = 0` component is carried in the flattened work arrays, while the remaining components `j = 1, ..., R-1` are carried in the three-dimensional work arrays. + * + * For harmonic `n = 0`, we only copy the DC terms. + * + * For harmonics `n = 1, ..., floor((M-1)/2)`, each nonzero radix component is multiplied by its stage twiddle factor and stored in `ch`. + */ + if ( M === 1 ) { + // Copy the DC column from the flattened output workspace back to the flattened input workspace... + for ( ik = 0; ik < ML; ik++ ) { + ic2o = fptr( ik, 0, ML, sc2, oc2 ); + ich = fptr( ik, 0, ML, sch2, och2 ); + c2[ ic2o ] = ch2[ ich ]; + } + } else { + // Copy the DC column into the flattened output workspace... + for ( ik = 0; ik < ML; ik++ ) { + ich = fptr( ik, 0, ML, sch2, och2 ); + ic2o = fptr( ik, 0, ML, sc2, oc2 ); + ch2[ ich ] = c2[ ic2o ]; + } + + // Copy the DC terms for the remaining radix components... + for ( j = 1; j < R; j++ ) { + for ( k = 0; k < L; k++ ) { + ih1 = optr( 0, k, j, L, M, sch, och ); + ic1 = iptr( 0, k, j, L, M, sc1, oc1 ); + ch[ ih1 ] = c1[ ic1 ]; + } + } + + // Apply twiddle factors to the non-DC harmonics of the remaining radix components... + if ( nbd <= L ) { + // Loop over harmonics before sub-sequences... + is = 0; + for ( j = 1; j < R; j++ ) { + idij = is; + for ( i = 2; i < M; i += 2 ) { + for ( k = 0; k < L; k++ ) { + // Resolve output indices in ch: + ih1 = optr( i-1, k, j, L, M, sch, och ); // real part + ih2 = optr( i, k, j, L, M, sch, och ); // imaginary part + + // Resolve indices in the input workspace: + ic1 = iptr( i-1, k, j, L, M, sc1, oc1 ); // real part + ic2 = iptr( i, k, j, L, M, sc1, oc1 ); // imaginary part + + // Resolve twiddle factor indices: + it1 = ( idij * stw ) + otw; // cos(θ) + it2 = ( (idij+1) * stw ) + otw; // sin(θ) + + // Apply the twiddle factor: + ch[ ih1 ] = ( twiddles[ it1 ] * c1[ ic1 ] ) + ( twiddles[ it2 ] * c1[ ic2 ] ); // Re(ch) + ch[ ih2 ] = ( twiddles[ it1 ] * c1[ ic2 ] ) - ( twiddles[ it2 ] * c1[ ic1 ] ); // Im(ch) + } + idij += 2; + } + is += M; + } + } else { + // Loop over sub-sequences before harmonics... + is = 0; + for ( j = 1; j < R; j++ ) { + for ( k = 0; k < L; k++ ) { + idij = is; + for ( i = 2; i < M; i += 2 ) { + // Resolve output indices in ch: + ih1 = optr( i-1, k, j, L, M, sch, och ); // real part + ih2 = optr( i, k, j, L, M, sch, och ); // imaginary part + + // Resolve indices in the input workspace: + ic1 = iptr( i-1, k, j, L, M, sc1, oc1 ); // real part + ic2 = iptr( i, k, j, L, M, sc1, oc1 ); // imaginary part + + // Resolve twiddle factor indices: + it1 = ( idij * stw ) + otw; // cos(θ) + it2 = ( (idij+1) * stw ) + otw; // sin(θ) + + // Apply the twiddle factor: + ch[ ih1 ] = ( twiddles[ it1 ] * c1[ ic1 ] ) + ( twiddles[ it2 ] * c1[ ic2 ] ); // Re(ch) + ch[ ih2 ] = ( twiddles[ it1 ] * c1[ ic2 ] ) - ( twiddles[ it2 ] * c1[ ic1 ] ); // Im(ch) + + idij += 2; + } + } + is += M; + } + } + + /* + * Next, combine mirrored radix components, storing their sums and differences in c1. + */ + if ( nbd >= L ) { + // Loop over sub-sequences before harmonics... + for ( j = 1; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + for ( k = 0; k < L; k++ ) { + for ( i = 2; i < M; i += 2 ) { + // Resolve ch indices for component j: + ih1 = optr( i-1, k, j, L, M, sch, och ); // Re(ch[j]) + ih2 = optr( i, k, j, L, M, sch, och ); // Im(ch[j]) + + // Resolve ch indices for conjugate component jc: + ih3 = optr( i-1, k, jc, L, M, sch, och ); // Re(ch[jc]) + ih4 = optr( i, k, jc, L, M, sch, och ); // Im(ch[jc]) + + // Resolve input-workspace indices for component j: + ic1 = iptr( i-1, k, j, L, M, sc1, oc1 ); // Re(component j) + ic2 = iptr( i, k, j, L, M, sc1, oc1 ); // Im(component j) + + // Resolve input-workspace indices for component jc: + ic3 = iptr( i-1, k, jc, L, M, sc1, oc1 ); // Re(component jc) + ic4 = iptr( i, k, jc, L, M, sc1, oc1 ); // Im(component jc) + + // Form the sum and difference combinations: + c1[ ic1 ] = ch[ ih1 ] + ch[ ih3 ]; // Re(j) + Re(jc) + c1[ ic3 ] = ch[ ih2 ] - ch[ ih4 ]; // Im(j) - Im(jc) + c1[ ic2 ] = ch[ ih2 ] + ch[ ih4 ]; // Im(j) + Im(jc) + c1[ ic4 ] = ch[ ih3 ] - ch[ ih1 ]; // Re(jc) - Re(j) + } + } + } + } else { + // Loop over harmonics before sub-sequences... + for ( j = 1; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + for ( i = 2; i < M; i += 2 ) { + for ( k = 0; k < L; k++ ) { + // Resolve ch indices for component j: + ih1 = optr( i-1, k, j, L, M, sch, och ); // Re(ch[j]) + ih2 = optr( i, k, j, L, M, sch, och ); // Im(ch[j]) + + // Resolve ch indices for conjugate component jc: + ih3 = optr( i-1, k, jc, L, M, sch, och ); // Re(ch[jc]) + ih4 = optr( i, k, jc, L, M, sch, och ); // Im(ch[jc]) + + // Resolve input-workspace indices for component j: + ic1 = iptr( i-1, k, j, L, M, sc1, oc1 ); // Re(component j) + ic2 = iptr( i, k, j, L, M, sc1, oc1 ); // Im(component j) + + // Resolve input-workspace indices for component jc: + ic3 = iptr( i-1, k, jc, L, M, sc1, oc1 ); // Re(component jc) + ic4 = iptr( i, k, jc, L, M, sc1, oc1 ); // Im(component jc) + + // Form the sum and difference combinations: + c1[ ic1 ] = ch[ ih1 ] + ch[ ih3 ]; // Re(j) + Re(jc) + c1[ ic3 ] = ch[ ih2 ] - ch[ ih4 ]; // Im(j) - Im(jc) + c1[ ic2 ] = ch[ ih2 ] + ch[ ih4 ]; // Im(j) + Im(jc) + c1[ ic4 ] = ch[ ih3 ] - ch[ ih1 ]; // Re(jc) - Re(j) + } + } + } + } + } + + // Combine the DC terms for each conjugate-symmetric component pair... + for ( j = 1; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + for ( k = 0; k < L; k++ ) { + ih1 = optr( 0, k, j, L, M, sch, och ); + ih2 = optr( 0, k, jc, L, M, sch, och ); + + ic1 = iptr( 0, k, j, L, M, sc1, oc1 ); + ic2 = iptr( 0, k, jc, L, M, sc1, oc1 ); + + c1[ ic1 ] = ch[ ih1 ] + ch[ ih2 ]; + c1[ ic2 ] = ch[ ih2 ] - ch[ ih1 ]; + } + } + + /* + * Next, apply the radix-`R` DFT matrix. + * + * For each mirrored output pair, accumulate the contributions of the radix components in the flattened work array. + * + * The required rotation factors are generated recursively from the previous ones: + * + * W_l = W_{l-1} ⋅ W_1 + * W_{lj} = W_{l(j-1)} ⋅ W_l + * + * Here, `W_1` is the basic radix-`R` rotation, `W_{l-1}` and `W_l` are the previous and current outer factors, and `W_{l(j-1)}` and `W_{lj}` are the previous and current inner factors. + */ + ar1 = 1.0; // Re(W_0) + ai1 = 0.0; // Im(W_0) + for ( l = 1; l < Rph; l++ ) { + lc = Rp1 - l - 1; // "mirror" index + + // Advance the rotation factor by one step: W_l = W_{l-1} ⋅ W_1 + ar1h = ( dcp * ar1 ) - ( dsp * ai1 ); // Re(W_l) + ai1 = ( dcp * ai1 ) + ( dsp * ar1 ); // Im(W_l) + ar1 = ar1h; + + // Accumulate the contributions from components 1 and R-1: + for ( ik = 0; ik < ML; ik++ ) { + ich = fptr( ik, l, ML, sch2, och2 ); + ic1o = fptr( ik, lc, ML, sch2, och2 ); + + ic2o = fptr( ik, 0, ML, sc2, oc2 ); + ic1 = fptr( ik, 1, ML, sc2, oc2 ); + ic2 = fptr( ik, R-1, ML, sc2, oc2 ); + + ch2[ ich ] = c2[ ic2o ] + ( ar1 * c2[ ic1 ] ); + ch2[ ic1o ] = ai1 * c2[ ic2 ]; + } + + // Save W_l for the inner recurrence: + dc2 = ar1; + ds2 = ai1; + + // Initialize W_{l·1}: + ar2 = ar1; + ai2 = ai1; + + // Accumulate the remaining component pairs: + for ( j = 2; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + + // Advance the nested rotation factor by one step: W_{l*j} = W_{l*(j-1)} ⋅ W_l + ar2h = ( dc2 * ar2 ) - ( ds2 * ai2 ); // Re(W_{l*j}) + ai2 = ( dc2 * ai2 ) + ( ds2 * ar2 ); // Im(W_{l*j}) + ar2 = ar2h; + + // Accumulate the contributions from components j and jc: + for ( ik = 0; ik < ML; ik++ ) { + ich = fptr( ik, l, ML, sch2, och2 ); + ic1o = fptr( ik, lc, ML, sch2, och2 ); + + ic1 = fptr( ik, j, ML, sc2, oc2 ); + ic2 = fptr( ik, jc, ML, sc2, oc2 ); + + ch2[ ich ] += ar2 * c2[ ic1 ]; + ch2[ ic1o ] += ai2 * c2[ ic2 ]; + } + } + } + + // Accumulate the nonzero radix components into the DC output... + for ( j = 1; j < Rph; j++ ) { + for ( ik = 0; ik < ML; ik++ ) { + ich = fptr( ik, 0, ML, sch2, och2 ); + ic1 = fptr( ik, j, ML, sc2, oc2 ); + ch2[ ich ] += c2[ ic1 ]; + } + } + + // Copy the first output column from ch to cc... + if ( M >= L ) { + for ( k = 0; k < L; k++ ) { + for ( i = 0; i < M; i++ ) { + icc = optr( i, 0, k, R, M, sc, oc ); + ih1 = optr( i, k, 0, L, M, sch, och ); + cc[ icc ] = ch[ ih1 ]; + } + } + } else { + for ( i = 0; i < M; i++ ) { + for ( k = 0; k < L; k++ ) { + icc = optr( i, 0, k, R, M, sc, oc ); + ih1 = optr( i, k, 0, L, M, sch, och ); + cc[ icc ] = ch[ ih1 ]; + } + } + } + + /* + * `cc` is stored in output order, where the component index comes before the sub-sequence index. Accordingly, writes to `cc` use `optr`, not `iptr`. + */ + // Store DC harmonics for conjugate pairs in the output array... + for ( j = 1; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + j2 = 2 * j; // output column index + for ( k = 0; k < L; k++ ) { + io1 = optr( M-1, j2-1, k, R, M, sc, oc ); + io2 = optr( 0, j2, k, R, M, sc, oc ); + + ih1 = optr( 0, k, j, L, M, sch, och ); + ih2 = optr( 0, k, jc, L, M, sch, och ); + + cc[ io1 ] = ch[ ih1 ]; + cc[ io2 ] = ch[ ih2 ]; + } + } + + // When M = 1, there are no non-DC harmonics to process, so we're done... + if ( M === 1 ) { + return; + } + + /* + * Finally, store the non-DC harmonics in folded format. + * + * For each mirror pair, write the non-DC harmonics from `ch` to the two output columns as the required sum and difference combinations. + */ + if ( nbd >= L ) { + // Loop over sub-sequences before harmonics... + for ( j = 1; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + j2 = 2 * j; // output column index + for ( k = 0; k < L; k++ ) { + for ( i = 2; i < M; i += 2 ) { + im = M - i; // "mirror" harmonic index + + // Resolve ch indices for component j: + ih1 = optr( i-1, k, j, L, M, sch, och ); // Re(ch[j]) + ih2 = optr( i, k, j, L, M, sch, och ); // Im(ch[j]) + + // Resolve ch indices for conjugate component jc: + ih3 = optr( i-1, k, jc, L, M, sch, och ); // Re(ch[jc]) + ih4 = optr( i, k, jc, L, M, sch, och ); // Im(ch[jc]) + + // Resolve cc output indices: + io1 = optr( i-1, j2, k, R, M, sc, oc ); + io2 = optr( im-1, j2-1, k, R, M, sc, oc ); + io3 = optr( i, j2, k, R, M, sc, oc ); + io4 = optr( im, j2-1, k, R, M, sc, oc ); + + // Store the sum and difference combinations: + cc[ io1 ] = ch[ ih1 ] + ch[ ih3 ]; + cc[ io2 ] = ch[ ih1 ] - ch[ ih3 ]; + cc[ io3 ] = ch[ ih2 ] + ch[ ih4 ]; + cc[ io4 ] = ch[ ih4 ] - ch[ ih2 ]; + } + } + } + } else { + // Loop over harmonics before sub-sequences... + for ( j = 1; j < Rph; j++ ) { + jc = Rp1 - j - 1; // "mirror" index + j2 = 2 * j; // output column index + for ( i = 2; i < M; i += 2 ) { + im = M - i; // "mirror" harmonic index + for ( k = 0; k < L; k++ ) { + // Resolve ch indices for component j: + ih1 = optr( i-1, k, j, L, M, sch, och ); // Re(ch[j]) + ih2 = optr( i, k, j, L, M, sch, och ); // Im(ch[j]) + + // Resolve ch indices for conjugate component jc: + ih3 = optr( i-1, k, jc, L, M, sch, och ); // Re(ch[jc]) + ih4 = optr( i, k, jc, L, M, sch, och ); // Im(ch[jc]) + + // Resolve cc output indices: + io1 = optr( i-1, j2, k, R, M, sc, oc ); + io2 = optr( im-1, j2-1, k, R, M, sc, oc ); + io3 = optr( i, j2, k, R, M, sc, oc ); + io4 = optr( im, j2-1, k, R, M, sc, oc ); + + // Store the sum and difference combinations: + cc[ io1 ] = ch[ ih1 ] + ch[ ih3 ]; + cc[ io2 ] = ch[ ih1 ] - ch[ ih3 ]; + cc[ io3 ] = ch[ ih2 ] + ch[ ih4 ]; + cc[ io4 ] = ch[ ih4 ] - ch[ ih2 ]; + } + } + } + } +} + + +// EXPORTS // + +module.exports = radfg; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/rfftf1.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/rfftf1.js new file mode 100644 index 000000000000..01854653d35d --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/lib/rfftf1.js @@ -0,0 +1,182 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +* +* +* ## Notice +* +* The original C code and copyright notice are from the [PFFFT library]{@link https://github.com/marton78/pffft/blob/0b4ee12c4ba45a4a8e567550c16d96d1679f50ce/src/fftpack.c}. The implementation follows the original, but has been modified for JavaScript. +* +* ```text +* Copyright (c) 2004 the University Corporation for Atmospheric +* Research ("UCAR"). All rights reserved. Developed by NCAR's +* Computational and Information Systems Laboratory, UCAR, +* www.cisl.ucar.edu. +* +* Redistribution and use of the Software in source and binary forms, +* with or without modification, is permitted provided that the +* following conditions are met: +* +* - Neither the names of NCAR's Computational and Information Systems +* Laboratory, the University Corporation for Atmospheric Research, +* nor the names of its sponsors or contributors may be used to +* endorse or promote products derived from this Software without +* specific prior written permission. +* +* - Redistributions of source code must retain the above copyright +* notices, this list of conditions, and the disclaimer below. +* +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions, and the disclaimer below in the +* documentation and/or other materials provided with the +* distribution. +* +* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT +* HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +* SOFTWARE. +* ``` +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// MODULES // + +var floor = require( '@stdlib/math/base/special/floor' ); +var dcopy = require( '@stdlib/blas/base/dcopy' ).ndarray; +var radf2 = require( './radf2.js' ); +var radf3 = require( './radf3.js' ); +var radf4 = require( './radf4.js' ); +var radf5 = require( './radf5.js' ); +var radfg = require( './radfg.js' ); + + +// MAIN // + +/** +* Performs the forward real-valued Fourier transform. +* +* @private +* @param {NonNegativeInteger} N - length of the sequence to transform +* @param {Collection} c - input array containing the sequence to be transformed +* @param {integer} sc - stride length for `c` +* @param {NonNegativeInteger} oc - starting index for `c` +* @param {Collection} ch - working array for intermediate results +* @param {integer} sch - stride length for `ch` +* @param {NonNegativeInteger} och - starting index for `ch` +* @param {Collection} wa - workspace array for storing twiddle factors +* @param {integer} swa - stride length for `wa` +* @param {NonNegativeInteger} owa - starting index for `wa` +* @param {Collection} ifac - workspace array for storing factorization results +* @param {integer} si - stride length for `ifac` +* @param {NonNegativeInteger} oi - starting index for `ifac` +* @returns {void} +*/ +function rfftf1( N, c, sc, oc, ch, sch, och, wa, swa, owa, ifac, si, oi ) { // eslint-disable-line max-params + var factor; + var idl1; + var FLG; + var ido; + var ix4; + var ix3; + var ix2; + var nf; + var l2; + var l1; + var kh; + var iw; + var k1; + + // Resolve the number of factors: + nf = ifac[ oi + si ]; + + FLG = 1; // Flag to track whether the latest stage output resides in `c` or `ch`. + l2 = N; + + // Initialize an index offset to the last element in each workspace: + iw = N - 1; + + for ( k1 = 1; k1 <= nf; k1++ ) { + kh = nf - k1; + + // Resolve the next factor: + factor = ifac[ oi + ( ( kh + 2 ) * si ) ]; + + // Compute a sub-transform length: + l1 = floor( l2 / factor ); + + ido = floor( N / l2 ); + idl1 = ido * l1; + + // Adjust the index offset + iw -= ( ( factor - 1 ) * ido ); + + // Toggle the flag to swap the input and output work buffers for the next stage: + FLG = 1 - FLG; + + switch ( factor ) { + case 4: + ix2 = iw + ido; + ix3 = ix2 + ido; + radf4( ido, l1, ( FLG ) ? ch : c, ( FLG ) ? sch : sc, ( FLG ) ? och : oc, ( FLG ) ? c : ch, ( FLG ) ? sc : sch, ( FLG ) ? oc : och, wa, swa, owa + ( ( iw + 1 ) * swa ), wa, swa, owa + ( ( ix2 + 1 ) * swa ), wa, swa, owa + ( ( ix3 + 1 ) * swa ) ); + break; + case 2: + radf2( ido, l1, ( FLG ) ? ch : c, ( FLG ) ? sch : sc, ( FLG ) ? och : oc, ( FLG ) ? c : ch, ( FLG ) ? sc : sch, ( FLG ) ? oc : och, wa, swa, owa + ( ( iw + 1 ) * swa ) ); + break; + case 3: + ix2 = iw + ido; + radf3( ido, l1, ( FLG ) ? ch : c, ( FLG ) ? sch : sc, ( FLG ) ? och : oc, ( FLG ) ? c : ch, ( FLG ) ? sc : sch, ( FLG ) ? oc : och, wa, swa, owa + ( ( iw + 1 ) * swa ), wa, swa, owa + ( ( ix2 + 1 ) * swa ) ); + break; + case 5: + ix2 = iw + ido; + ix3 = ix2 + ido; + ix4 = ix3 + ido; + radf5( ido, l1, ( FLG ) ? ch : c, ( FLG ) ? sch : sc, ( FLG ) ? och : oc, ( FLG ) ? c : ch, ( FLG ) ? sc : sch, ( FLG ) ? oc : och, wa, swa, owa + ( ( iw + 1 ) * swa ), wa, swa, owa + ( ( ix2 + 1 ) * swa ), wa, swa, owa + ( ( ix3 + 1 ) * swa ), wa, swa, owa + ( ( ix4 + 1 ) * swa ) ); + break; + default: + if ( ido === 1 ) { + FLG = 1 - FLG; + } + if ( FLG === 0 ) { + radfg( ido, factor, l1, idl1, c, sc, oc, c, sc, oc, c, sc, oc, ch, sch, och, ch, sch, och, wa, swa, owa + ( ( iw + 1 ) * swa ) ); + FLG = 1; + } else { + radfg( ido, factor, l1, idl1, ch, sch, och, ch, sch, och, ch, sch, och, c, sc, oc, c, sc, oc, wa, swa, owa + ( ( iw + 1 ) * swa ) ); + FLG = 0; + } + break; + } + l2 = l1; + } + if ( FLG === 1 ) { + return; + } + + // Now that we've finished computing the transforms, copy over the final results to the input array... + dcopy( N, ch, sch, och, c, sc, oc ); +} + + +// EXPORTS // + +module.exports = rfftf1; diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/package.json b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/package.json new file mode 100644 index 000000000000..1ef3db1b49a7 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/package.json @@ -0,0 +1,62 @@ +{ + "name": "@stdlib/fft/base/fftpack/rfftf", + "version": "0.0.0", + "description": "Compute the forward real-valued fast Fourier transform (FFT).", + "license": "Apache-2.0", + "author": { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + }, + "contributors": [ + { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + } + ], + "main": "./lib", + "directories": { + "benchmark": "./benchmark", + "doc": "./docs", + "example": "./examples", + "lib": "./lib", + "test": "./test" + }, + "types": "./docs/types", + "scripts": {}, + "homepage": "https://github.com/stdlib-js/stdlib", + "repository": { + "type": "git", + "url": "git://github.com/stdlib-js/stdlib.git" + }, + "bugs": { + "url": "https://github.com/stdlib-js/stdlib/issues" + }, + "dependencies": {}, + "devDependencies": {}, + "engines": { + "node": ">=0.10.0", + "npm": ">2.7.0" + }, + "os": [ + "aix", + "darwin", + "freebsd", + "linux", + "macos", + "openbsd", + "sunos", + "win32", + "windows" + ], + "keywords": [ + "stdlib", + "fft", + "fftpack", + "rfftf", + "fourier", + "transform", + "forward", + "real" + ], + "__stdlib__": {} +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/Makefile b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/Makefile new file mode 100644 index 000000000000..4b8cac6acbd2 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/Makefile @@ -0,0 +1,138 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2026 The Stdlib Authors. +# +# 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. +#/ + +# VARIABLES # + +ifndef VERBOSE + QUIET := @ +endif + +# Specify the path to FFTPACK: +FFTPACK ?= + +# Specify a list of FFTPACK source files: +FFTPACK_SRC ?= + +# Determine the OS: +# +# [1]: https://en.wikipedia.org/wiki/Uname#Examples +# [2]: http://stackoverflow.com/a/27776822/2225624 +OS ?= $(shell uname) +ifneq (, $(findstring MINGW,$(OS))) + OS := WINNT +else +ifneq (, $(findstring MSYS,$(OS))) + OS := WINNT +else +ifneq (, $(findstring CYGWIN,$(OS))) + OS := WINNT +endif +endif +endif + +# Define the program used for compiling C source files: +ifdef C_COMPILER + CC := $(C_COMPILER) +else + CC := gcc +endif + +# Define the command-line options when compiling C files: +CFLAGS ?= \ + -std=c99 \ + -O3 \ + -ffp-contract=off \ + -Wall \ + -pedantic + +# Determine whether to generate [position independent code][1]: +# +# [1]: https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options +# [2]: http://stackoverflow.com/questions/5311515/gcc-fpic-option +ifeq ($(OS), WINNT) + fPIC ?= +else + fPIC ?= -fPIC +endif + +# List of C targets: +c_targets := runner.out + + +# RULES # + +#/ +# Compiles C source files. +# +# @param {string} [C_COMPILER] - C compiler +# @param {string} [CFLAGS] - C compiler flags +# @param {(string|void)} [fPIC] - flag indicating whether to generate position independent code +# +# @example +# make +# +# @example +# make all +#/ +all: $(c_targets) + +.PHONY: all + +#/ +# Compiles C source files. +# +# @private +# @param {string} CC - C compiler +# @param {string} CFLAGS - C compiler flags +# @param {(string|void)} fPIC - flag indicating whether to generate position independent code +#/ +$(c_targets): %.out: %.c + $(QUIET) $(CC) $(CFLAGS) -DFFTPACK_DOUBLE_PRECISION $(fPIC) -o $@ $(FFTPACK_SRC) $< -lm + +#/ +# Generates test fixtures. +# +# @example +# make run +#/ +run: $(c_targets) + $(QUIET) ./$< + +.PHONY: run + +#/ +# Removes generated files. +# +# @example +# make clean +#/ +clean: + $(QUIET) -rm -f *.o *.out + +.PHONY: clean + +#/ +# Removes generated test fixtures. +# +# @example +# make clean-fixtures +#/ +clean-fixtures: + $(QUIET) -rm -f *.json + +.PHONY: clean-fixtures diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/large.json b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/large.json new file mode 100644 index 000000000000..bb503d1af6b9 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/large.json @@ -0,0 +1 @@ +{"lengths":[858,464,488,372,141,422,950,550,890,992],"offsets":[0,858,1322,1810,2182,2323,2745,3695,4245,5135],"input":[-1.3836292177438736,5.343804806470871,-6.6724975593388081,-4.666453767567873,-9.0884297713637352,-9.2391601763665676,-2.565078241750598,8.7300490774214268,5.9349908027797937,9.3905470240861177,6.9239855650812387,-8.5744752269238234,8.7948722392320633,-4.5821281336247921,8.1725005619227886,-4.7829135414212942,-6.4278498385101557,7.1277921088039875,-3.1978932861238718,-6.9924066495150328,-1.3785348646342754,-9.0354024339467287,1.9913002010434866,7.782572777941823,1.7008180357515812,5.6488184444606304,-0.30828148126602173,-1.2867797911167145,-6.9078811071813107,-0.757744200527668,4.5932940579950809,-0.50665306858718395,4.6819505468010902,9.542954983189702,8.4445554111152887,7.6429389603435993,-5.1247554272413254,8.2355725020170212,-4.7328158840537071,-4.4365220703184605,-4.6263923030346632,4.2246049456298351,2.9354325216263533,-4.1855077911168337,-5.8293997962027788,5.2776578534394503,1.5956623200327158,-1.7032964620739222,-7.3035731445997953,8.8461798056960106,-2.2558581735938787,5.7917370088398457,1.7240311577916145,-4.2082392424345016,-7.8769022691994905,-7.0964218210428953,-9.5615235436707735,-0.52619504742324352,-3.7600878998637199,4.2027158197015524,-4.9551071226596832,-0.4853710625320673,2.3686264827847481,9.5053929556161165,-2.8604423068463802,4.5462047029286623,8.0625559575855732,7.3781204968690872,4.0713268797844648,6.7909786570817232,-4.0215790178626776,9.3214935623109341,6.3424529694020748,-2.3928153607994318,3.9522905740886927,6.1477878969162703,5.8713098429143429,-0.89534592814743519,-8.0789431184530258,-2.7969768084585667,-8.7891633901745081,0.53091080859303474,3.0180424358695745,4.2393215373158455,-9.7228108905255795,8.7173650972545147,-7.2446639556437731,-1.067080944776535,5.5706310458481312,5.5961094237864017,-6.1887923628091812,4.9667880870401859,-3.1925039831548929,3.5856083873659372,3.3202727790921926,3.8247024454176426,1.7741083260625601,-2.5612717214971781,-7.2937649860978127,-6.3081001676619053,-0.23948900401592255,-5.0916141085326672,5.2417162992060184,-2.4740399606525898,-1.1895597912371159,7.06865762360394,2.9288134910166264,4.5684446953237057,1.8501083180308342,-5.229406114667654,9.3714681081473827,6.2646452337503433,9.8925709258764982,4.4397068861871958,-1.8462508451193571,-9.9378901068121195,-6.1190247070044279,-2.4482202529907227,-7.2377329133450985,-4.5770529750734568,-6.529309619218111,1.8932569585740566,-0.030204169452190399,-7.6413979567587376,-8.9754407852888107,9.7667296603322029,9.4255558960139751,-4.6819036640226841,-8.7548396084457636,-2.5892894063144922,1.8130060657858849,-8.8069598842412233,1.4252348896116018,-6.0771208815276623,1.8293748609721661,6.3033809326589108,0.92346278950572014,0.63918870873749256,2.8447110112756491,-8.9419329632073641,-7.0673043467104435,-0.18413221463561058,5.2899454347789288,8.1130419857800007,-4.1032032389193773,-2.5367903709411621,4.1642939951270819,9.2892869468778372,5.045867133885622,5.889036962762475,-2.9556425008922815,4.5165426284074783,9.5320692472159863,5.4879908170551062,-3.3382165431976318,-5.4053893871605396,-8.3793940488249063,7.5242340750992298,-0.19776266068220139,-3.796961372718215,4.4702572654932737,-8.3860256057232618,-3.9323427621275187,9.1152444016188383,-0.087192393839359283,-5.4424856789410114,8.1432296987622976,3.2616890873759985,-0.79140468500554562,-1.1384688224643469,5.7545701880007982,-2.9387269727885723,8.8158235978335142,7.5473560392856598,8.4130895975977182,-1.2029890716075897,1.3627423346042633,3.6105066165328026,1.7848105821758509,-2.6884531415998936,-4.8318936489522457,-9.6365174930542707,-0.94950292259454727,1.7044507805258036,6.7043598927557468,0.1768482755869627,-7.7109525632113218,2.0202880166471004,-5.0192101392894983,2.1352279372513294,6.776036350056529,4.8430666886270046,-2.5780480820685625,-9.254057239741087,7.0599775016307831,-2.9579965770244598,4.9515850562602282,1.2901575770229101,3.6784853786230087,4.3038655631244183,-4.9313686229288578,-1.5124059002846479,0.99410033784806728,7.844464248046279,1.9107565656304359,-5.9143082331866026,-1.7784431949257851,9.7052872180938721,-3.2375712785869837,6.1395737063139677,7.8154083248227835,-6.4321452751755714,-5.0656119547784328,2.2599146515130997,2.3856439255177975,-4.4824468903243542,3.5151574946939945,-0.74788090772926807,-9.634343795478344,-4.4161677453666925,-2.5312526803463697,-2.7637401316314936,9.8196642939001322,-0.90205730870366096,-0.87711618281900883,-1.6916132438927889,9.0562749095261097,8.8125535380095243,-7.4125394411385059,-2.5503669679164886,-4.0175714716315269,-3.3236768934875727,-1.0374965984374285,2.7947402000427246,-8.8013577461242676,-4.4196297321468592,-0.71686452254652977,-8.3419577870517969,-3.2845140062272549,-2.8268501069396734,9.1303087957203388,-6.8999206088483334,-6.965648652985692,8.3431130088865757,2.7004839107394218,7.0331871882081032,6.7772055137902498,4.4932015705853701,-2.7610897459089756,-5.6353028398007154,7.4652056209743023,7.71100839599967,-1.0817498248070478,-0.9692357387393713,-9.9449903145432472,-5.452216099947691,4.6040437649935484,0.16367253847420216,-9.1555663198232651,2.396869333460927,4.1829844936728477,3.42049615457654,8.2789749931544065,4.7328529972583055,5.0604402180761099,-9.1811369266360998,-7.3683195654302835,0.6530844047665596,-3.6103257164359093,1.2557338643819094,5.1191467512398958,-2.500433586537838,-4.7872302494943142,1.0212375409901142,3.9394376706331968,-9.8709605727344751,-1.2343449424952269,-5.6353799160569906,6.1697849817574024,-4.4236850552260876,-8.8746795430779457,3.2609282899647951,6.421873215585947,-7.5767371244728565,-2.2208320535719395,-5.5242635030299425,-6.2966603972017765,-7.9712667874991894,6.919118370860815,9.6225914638489485,6.8948864750564098,2.3571184929460287,-3.9093923475593328,-5.1571377646178007,3.9856279641389847,6.4493027329444885,-6.5688386652618647,-2.4714202061295509,2.8406544961035252,2.8802165016531944,7.7988440822809935,-4.8273698054254055,6.3957206904888153,-7.1222266368567944,-3.2630631327629089,-2.3020196240395308,9.9562390055507421,-5.4908775258809328,-5.1785421930253506,4.2413995508104563,5.202361922711134,-3.9030460175126791,1.5056313760578632,5.1466274447739124,-0.63241714611649513,-9.0349014662206173,-9.5889352168887854,-1.2341870367527008,-2.9814581014215946,-9.3662556633353233,1.3410712778568268,-0.61494430527091026,4.6311347559094429,-4.5180429238826036,5.2526212017983198,0.80465799197554588,3.8869556877762079,8.0643531307578087,-2.4167899787425995,1.0108866170048714,9.9714581668376923,-9.702433655038476,-8.8024379033595324,-2.5738323945552111,1.5990028250962496,-5.5594278313219547,2.6964737195521593,-0.3660961240530014,7.0225184317678213,7.467415938153863,4.8598092515021563,-1.1857937090098858,-9.6347983460873365,7.9442001599818468,-1.8277707509696484,0.65705240704119205,3.079888541251421,3.6868151742964983,4.3027415126562119,-3.8232848513871431,2.0515510719269514,0.41896019130945206,1.4640168752521276,5.7317120768129826,-7.1150018833577633,-1.8366310186684132,-8.257466871291399,-3.2456921599805355,9.6519200596958399,-0.17940289340913296,4.7756473254412413,4.3047143239527941,9.3337546195834875,-7.5859573483467102,2.8148652240633965,9.4399211183190346,-3.245612271130085,-9.0053880214691162,6.4435309451073408,-3.5752768907696009,-9.6786528825759888,-9.118994940072298,-2.947950903326273,-6.2107770144939423,-4.5292529463768005,-3.1542269419878721,6.9078395795077085,0.059945108368992805,7.497515082359314,-9.2638738453388214,2.0722871460020542,8.9301573298871517,9.1543915588408709,-2.1409206558018923,-2.4534005578607321,5.6968830898404121,7.514213789254427,-8.6087069287896156,-6.5373412799090147,6.9051356613636017,-5.3848071582615376,-2.4538727849721909,-2.2398379724472761,-4.9567421898245811,-7.9659449122846127,-3.6361248511821032,7.6496759802103043,8.1043375190347433,9.600824099034071,1.0507858637720346,0.55809889920055866,-0.031718509271740913,6.9070926774293184,7.5067618675529957,6.1468449700623751,-9.9764617905020714,5.6066872086375952,-8.4079622849822044,7.3778887558728456,0.17645595595240593,5.6953313294798136,1.4337773993611336,-2.5031594559550285,9.3990824278444052,-9.6214833948761225,-8.2714147213846445,2.3327912110835314,7.221981193870306,-0.1619398407638073,-1.7228267248719931,4.4512998498976231,-7.0033096708357334,-4.6256142854690552,-2.6992538198828697,-6.3588936347514391,6.0747092217206955,-2.3619847372174263,2.1225813589990139,-5.7750044297426939,-0.4994176235049963,6.2880760990083218,3.695123502984643,3.9408218394964933,-6.6072344779968262,-7.7898451406508684,-3.9272616244852543,-5.4860751982778311,-4.4658221304416656,2.9274969734251499,2.4417335260659456,-1.7845300398766994,7.4036840815097094,-6.281505860388279,6.7310335487127304,8.4809841495007277,-0.099254706874489784,-8.1737809535115957,3.2635286170989275,-9.8744286131113768,0.47830041497945786,-1.2048434372991323,-9.803581852465868,-8.8001928571611643,-4.8413409199565649,-8.4168013371527195,-1.1800611391663551,6.7125030513852835,-2.9610845725983381,-6.9483565725386143,-1.0288907773792744,7.4327747896313667,2.6460257638245821,-8.2448884285986423,8.1601942703127861,8.3852432668209076,-9.2162706516683102,2.139163538813591,-7.078308155760169,-5.1251509971916676,1.5872283466160297,-3.4530877415090799,3.9543796889483929,1.2595413625240326,9.1117680538445711,1.4858305361121893,-7.6460896711796522,-7.8290850948542356,-3.4331722278147936,-1.3255814928561449,0.95191745087504387,-1.1233174335211515,0.40396427735686302,9.4276909530162811,-8.7980006076395512,-7.9962031915783882,7.8129748161882162,-7.3321249149739742,8.9765749033540487,9.2945491801947355,-6.5117774624377489,-3.4437838941812515,0.32414180226624012,7.8513514809310436,-2.3355202842503786,6.9106425810605288,7.1699922252446413,6.0594640579074621,1.4125469326972961,0.67638715729117393,8.0390361417084932,-7.9194251261651516,-1.7780791781842709,-4.1766833979636431,2.4821759946644306,-2.067959988489747,3.7965355254709721,8.372684558853507,-0.29047556221485138,-2.0226981583982706,4.5121142268180847,-4.8960762936621904,-8.3542276360094547,-9.5038655307143927,8.5320291575044394,-2.1858047880232334,3.1789888441562653,9.2656068690121174,7.0547982584685087,9.9944635480642319,-3.050991203635931,1.9908948708325624,0.97018792293965816,5.9485066961497068,-3.4478329960256815,-7.7291129250079393,-3.2009128388017416,2.257971465587616,9.7265180572867393,-6.4108567964285612,-7.2701494861394167,-9.4023921806365252,-6.0053752828389406,7.6576525811105967,2.1670689154416323,1.9273570459336042,-6.9100356474518776,3.0308974534273148,0.29360173270106316,-5.4355979338288307,3.9055618550628424,0.77820686623454094,-0.67711484618484974,-0.26914686895906925,-3.5513504408299923,-7.5468085613101721,0.78852925449609756,-7.1887352503836155,-1.0733311995863914,0.52259841002523899,3.3115596417337656,-2.6169972028583288,-3.8719306606799364,4.4614339061081409,3.3197731338441372,-4.5728352386504412,4.3581864703446627,8.0401194468140602,-9.712316207587719,5.1015013176947832,0.93276468105614185,-3.0239199288189411,-3.0221890658140182,6.0684254672378302,-7.9730463773012161,-2.9904474411159754,-0.45008798129856586,-4.6286269463598728,6.6669545602053404,-8.4945761878043413,-8.3419766463339329,-3.6014819610863924,9.8927300889045,7.114759897813201,-2.2302635107189417,-4.0387638472020626,0.49606672488152981,-2.6064727734774351,-6.9878459721803665,-4.7272308636456728,9.4309159647673368,5.4047719109803438,-1.9983715936541557,-6.6313119232654572,7.5405320338904858,-6.2779691256582737,6.1729341838508844,8.5049545485526323,2.7712423447519541,-3.729811804369092,-6.9469469599425793,2.6624681334942579,8.1020187307149172,-9.3710512015968561,0.74245967902243137,-1.4800905995070934,4.117360757663846,0.48236453905701637,7.1008899621665478,4.6577279642224312,2.4340093974024057,8.3960394468158484,-7.7648733928799629,-4.2270966432988644,-4.8132387455552816,3.8964440394192934,7.5350792706012726,2.0774382259696722,-4.4956416077911854,1.7515409272164106,-1.8515443056821823,1.0949181672185659,2.2897232696413994,3.3790890406817198,-7.6503885537385941,-0.08040430024266243,8.6450034473091364,-3.426915155723691,3.8370291888713837,8.9496856462210417,-2.6331956591457129,3.8806143868714571,1.4861087780445814,-2.9696775134652853,8.6300862021744251,5.858945744112134,-8.6987545900046825,0.031615970656275749,-8.630302669480443,-9.4969552382826805,4.6733141131699085,4.3904148787260056,9.7029793635010719,-2.0256834384053946,-5.6614868715405464,7.3901839647442102,6.8220315501093864,-2.1156056597828865,3.0157377291470766,5.5041156336665154,7.6715763658285141,-3.8158812187612057,6.4844046719372272,3.3894502557814121,6.4905537012964487,6.7361867427825928,-4.9092830717563629,9.6794528234750032,2.5637581571936607,9.0834462735801935,5.4816694092005491,-9.5821184013038874,-6.6639674454927444,-1.3008302915841341,-3.0546425748616457,0.62229865230619907,-1.0264675598591566,8.1597916688770056,1.6187209356576204,5.8428565226495266,0.8897001575678587,-6.8093665316700935,-5.0232728105038404,-6.1460871901363134,2.7126255352050066,-8.9025303162634373,-4.8270168527960777,-7.6722044590860605,-6.7403256427496672,-4.6530521847307682,-3.8480269256979227,6.211507935076952,-3.1860082875937223,-7.2412362601608038,-3.4578029345721006,4.7061298415064812,-4.0756387077271938,0.74028559029102325,1.9800000730901957,-2.138677816838026,-4.7580060735344887,-7.808036869391799,-9.6756467130035162,1.4056970831006765,5.5509649310261011,-4.9322825390845537,3.1274052616208792,2.3003347963094711,1.7270178347826004,5.988840963691473,-5.5497981049120426,4.5432855654507875,-0.99938765168190002,3.2918086182326078,5.4275506548583508,0.843976940959692,4.7205315716564655,-2.0257599651813507,-6.9476723950356245,-9.5299194753170013,-9.3566179741173983,3.3217140380293131,8.0479414109140635,1.7514344770461321,-3.6406523175537586,-8.4434513561427593,-9.0869305096566677,-4.0410686563700438,1.7591390199959278,5.8496010955423117,-5.7542631775140762,8.09880874119699,-3.3213450573384762,-1.8463264219462872,8.7918901536613703,5.2979596517980099,2.8079874906688929,-6.1541440896689892,7.300315024331212,-3.6052506696432829,6.5520453453063965,0.22624810226261616,2.5519347563385963,-9.632451981306076,7.3795530572533607,8.1483692675828934,9.642422292381525,0.19162178039550781,0.58734286576509476,-8.5283722262829542,3.6480043735355139,-7.990387175232172,5.5627615936100483,-6.6657743975520134,8.329726429656148,-2.2877533175051212,9.7300530411303043,-6.9983833096921444,-1.8282625079154968,-7.6079065818339586,-6.0859021637588739,-5.7576356641948223,-8.5825749207288027,-7.3366815969347954,-7.6075788401067257,-0.57754695415496826,-6.8315847404301167,1.5552923828363419,-0.20083123818039894,4.6294565871357918,7.2769744787365198,4.1101993340998888,0.12031864374876022,2.1955246850848198,0.18347766250371933,3.7091533932834864,-0.25881179608404636,-9.8497805465012789,-5.2616438735276461,7.551454696804285,-2.7007734496146441,8.1006894446909428,8.2876385748386383,-9.6583295613527298,-7.5449349824339151,-7.7222305536270142,-7.5288969837129116,1.8284140713512897,-9.8446102254092693,1.6359427571296692,-4.709989856928587,-0.79948400147259235,3.0724592506885529,-1.1772713717073202,-6.3998752366751432,-2.7030746266245842,9.4248074200004339,2.7384599670767784,5.2967663481831551,2.7521336264908314,-4.8900397680699825,-6.8983419612050056,-0.43331770226359367,-2.7705470751971006,-4.5846362598240376,6.0184235125780106,-8.3558987360447645,2.409956157207489,4.1332313045859337,7.2186467796564102,3.796560438349843,8.7913953140377998,-3.0188099015504122,2.8620392736047506,2.2941721323877573,-1.848874744027853,5.9622409101575613,7.383101936429739,7.7943816129118204,0.17190746963024139,9.2489216756075621,6.6267525777220726,-4.1692961007356644,6.6404805611819029,6.556922011077404,2.1883697528392076,-0.069468645378947258,-7.5594451650977135,8.4051292948424816,5.0082024559378624,-7.1412055939435959,-2.2423950396478176,-7.9333706479519606,3.8395360391587019,-8.9176815468817949,0.52625002339482307,4.6842255722731352,7.7793081104755402,6.8315519019961357,-2.1070514246821404,6.7867671325802803,5.1953286491334438,-2.1112750936299562,-4.2004369013011456,3.2570452149957418,1.1590321827679873,-0.14601688832044601,5.8942351117730141,4.4096479564905167,-7.0466824900358915,6.4074130728840828,9.3916443642228842,5.366981253027916,2.8540399018675089,7.8487312793731689,-6.3732478860765696,4.8228070884943008,-3.0811476707458496,-4.8488480783998966,5.4103866405785084,-7.6316111907362938,-4.4892641715705395,8.937111534178257,6.0337031353265047,8.4487209096550941,-2.3475270438939333,5.1130331587046385,-5.2515833731740713,-3.3617157768458128,-0.35700949840247631,-0.25856418535113335,-5.6881869584321976,-1.3581766281276941,-6.8745213095098734,-0.079624475911259651,1.7515109945088625,-2.3546233214437962,5.8458963222801685,-8.0203874222934246,1.3486090023070574,6.0715905856341124,5.2230985276401043,4.6170731820166111,-0.850915452465415,-1.3359379861503839,6.8903345707803965,5.8532632887363434,-4.2037821374833584,7.0336606726050377,-5.264942217618227,-7.8838144522160292,-3.2694818358868361,9.8188369162380695,5.1922063156962395,5.4116667993366718,-6.1159829329699278,8.6748759634792805,-1.359535651281476,-9.715623464435339,9.5164354518055916,2.7307912334799767,-3.591639269143343,-4.681146340444684,3.9734977670013905,2.5770793482661247,-7.0272952597588301,-7.7514075022190809,2.0941277965903282,-3.9940280560404062,-7.6294908672571182,-8.8529874384403229,7.840131102129817,9.0835731104016304,7.6134158670902252,-1.3193839695304632,5.1136920321732759,5.822103014215827,-7.9145162459462881,0.72547069750726223,-7.0139030553400517,-2.6686277333647013,8.3737427089363337,-2.5061471108347178,-0.81443315371870995,-8.1779426615685225,-6.6822987236082554,-9.3946217186748981,4.5927789621055126,-9.1638696845620871,2.8422181028872728,9.1597557254135609,8.01462696865201,1.8356031179428101,-9.018304105848074,9.36290068551898,2.2719730529934168,5.0511976983398199,-4.5201662089675665,9.566568760201335,5.3213058318942785,-4.8127634450793266,-8.1151808518916368,8.1554370000958443,8.429802693426609,-0.30598734505474567,-2.729232469573617,9.7899407707154751,-0.46531170606613159,-0.49376923590898514,1.2205264717340469,-6.6115017514675856,0.49008959904313087,-3.0640267860144377,2.9018617328256369,-8.4097554255276918,-2.7594244014471769,2.3541415389627218,6.0569420270621777,-0.97522550262510777,9.3850480020046234,-5.4980785958468914,-6.2069251667708158,0.20875176414847374,8.4909799322485924,7.8998660109937191,-6.9518131390213966,0.87659631855785847,-7.0455888751894236,4.7877978067845106,8.5178543534129858,-0.42173726484179497,-8.1381352338939905,2.3611385095864534,3.6550273559987545,-9.9551208596676588,4.2837119102478027,-3.6538126785308123,-9.6296383999288082,-5.3325847070664167,-4.7511351387947798,7.6717633474618196,-0.67328090779483318,4.1678556799888611,9.1505244467407465,-7.1354737505316734,-5.9073027689009905,-4.0376048907637596,-0.025352407246828079,-6.0978305339813232,-6.2377540860325098,2.0671054907143116,1.8420768715441227,-0.21392728202044964,4.5242476649582386,-0.96938137896358967,7.6072344277054071,-5.2108357567340136,1.4834740478545427,-7.2515878360718489,2.5632606446743011,0.72175336070358753,-9.4911827426403761,1.6916484199464321,-8.46491445787251,-9.817281449213624,0.95068449154496193,-1.8456649035215378,-0.08996967226266861,7.8797958325594664,-4.2713022418320179,-7.7767336368560791,-3.5622172430157661,9.8148470092564821,-1.8661603517830372,-4.5569687616080046,-8.9739337470382452,-4.9044784437865019,-9.5691648405045271,-8.9534709881991148,-0.98689047619700432,-6.6681629046797752,8.1860871147364378,3.5662797000259161,-1.5369754936546087,8.0529443733394146,5.8362239971756935,9.4168444629758596,8.9050411898642778,7.0274259988218546,9.9488954525440931,-8.9139729645103216,2.8563939686864614,7.4135323241353035,-0.76209197752177715,-8.4797939099371433,0.10376757942140102,4.0217864047735929,-5.8357852324843407,-2.0423697773367167,-6.1087854206562042,9.6434654761105776,-2.2755892761051655,-5.8289030473679304,-6.3734844699501991,0.84654192440211773,7.8302083071321249,2.3111575096845627,3.6243616137653589,-5.3542508184909821,-8.8934700191020966,7.4493976030498743,2.0256510190665722,5.116771562024951,-2.4202387407422066,3.0475436616688967,0.066423779353499413,-3.6154616251587868,-5.0634840782731771,-1.9768649060279131,-5.168412821367383,-5.514250909909606,1.9849922508001328,1.7648529913276434,1.8843173142522573,9.7211936395615339,4.1016544494777918,-3.4935572650283575,3.7830975838005543,2.5211988016963005,-6.2116418965160847,0.93467489816248417,9.0810989867895842,6.0308203008025885,-0.003078952431678772,8.2521247118711472,-6.5398247353732586,5.1656996551901102,-0.08577653206884861,-1.6460968926548958,-5.950409471988678,-8.5319640208035707,3.2807138375937939,-1.0424276255071163,-0.081031797453761101,-1.9013421796262264,4.1420503985136747,-4.5588415022939444,-0.44908647425472736,-7.7962980512529612,7.618669830262661,6.9839751068502665,-0.33024624921381474,9.5513651333749294,9.7939496394246817,6.9117447175085545,5.6935995165258646,-7.6728029269725084,3.2012245804071426,2.9816262144595385,-7.8081119805574417,9.0619599167257547,4.360469589009881,6.4124948717653751,-5.1985617913305759,7.7720106765627861,4.1835800744593143,-6.5695775579661131,5.1100101042538881,3.939940445125103,-1.4208296872675419,0.11551323346793652,1.4309940580278635,-9.2827772628515959,4.3625488597899675,1.3587988913059235,-2.6669449266046286,-3.3433240558952093,8.7526446580886841,5.6989152543246746,1.6688022948801517,7.5602613668888807,5.3129307273775339,-5.5731451231986284,-7.8500509541481733,4.193630451336503,2.3471066914498806,7.8222598228603601,8.720982288941741,-6.4505232404917479,6.0559248272329569,1.928696958348155,-4.3901276867836714,-4.875987870618701,9.2718986049294472,-7.1999961230903864,9.6651811245828867,2.6993147656321526,7.383365361019969,-7.7782412897795439,-8.9013399370014668,-4.820312587544322,5.0063816737383604,2.2569079603999853,-8.147813631221652,-0.30368545092642307,-4.0412978362292051,-2.0926868729293346,8.2117885537445545,-4.469634685665369,-1.1501186992973089,9.9550901632755995,-4.7994696535170078,-4.6864259615540504,-4.7610942553728819,0.28889094479382038,-4.6098103281110525,2.9178576171398163,0.43307236395776272,-1.3526973128318787,5.2163309045135975,-9.1263687517493963,-6.8796038161963224,-5.5013143923133612,-0.59095640666782856,7.7957467641681433,3.1160046439617872,-9.3098462838679552,9.4135124236345291,-7.0965440385043621,8.3843675721436739,-3.9340711012482643,0.06704878993332386,6.8890911899507046,4.9557616747915745,-8.5134147293865681,-4.9613451678305864,-5.3281962964683771,9.0048818103969097,5.048736073076725,-5.8927020244300365,1.3571075443178415,8.9065862260758877,-7.0051503740251064,4.4376871921122074,4.2087508179247379,-3.5248919390141964,-2.8587683383375406,-7.3194065503776073,2.7341287769377232,-7.4975463468581438,8.7385679315775633,9.1113726701587439,-5.1593830715864897,6.2487537227571011,2.8039455413818359,5.9128142055124044,-3.3315234165638685,7.0859899930655956,-5.7660528272390366,9.9501657206565142,-7.5645767897367477,2.1579139493405819,8.0598417110741138,1.7597793601453304,-3.388202004134655,-5.5110317468643188,-3.9105344191193581,-4.3519344832748175,-2.9628161992877722,3.9481936395168304,-2.7093914803117514,3.2574474532157183,7.9194499459117651,2.1953811775892973,-2.2284528147429228,6.3936034310609102,-2.7070058602839708,3.3525632787495852,6.531130438670516,8.7094121053814888,-0.91059843078255653,-4.4277550280094147,2.7212878502905369,-3.3150006085634232,4.7848241869360209,-1.4597744587808847,5.5707381013780832,7.3953917156904936,-5.6512982491403818,-1.3696392718702555,0.47282521612942219,6.7734894435852766,2.0372096076607704,-0.61802984215319157,-7.2274836432188749,7.6824301108717918,-1.3969881925731897,0.81951474770903587,-6.4155505783855915,-6.15854287520051,-6.630073431879282,8.3558567706495523,-3.1151120364665985,4.3120569828897715,-7.2581765614449978,-8.173446748405695,8.8805138319730759,-5.2038782648742199,-1.5819602087140083,-8.0051619745790958,-2.75729114189744,-1.7921651899814606,-0.92028378508985043,-7.2095049452036619,9.8504077922552824,-4.1960802115499973,-3.5200701002031565,-1.8181234039366245,2.8000140655785799,-0.16349964775145054,-7.9385027755051851,-2.4161317851394415,-7.9268534854054451,-6.626512985676527,8.1962761282920837,-5.1869693864136934,2.6055602077394724,-8.3494898676872253,-9.8761933017522097,-9.180821580812335,-2.0683023054152727,-1.9567850418388844,-7.6861352380365133,-0.87492757476866245,-4.907677723094821,-3.3394522033631802,-6.1731297988444567,8.2075007632374763,3.4654702246189117,4.1581705491989851,6.3725311867892742,3.1317844986915588,-4.0978277195245028,7.8095641359686852,-4.6554273925721645,-3.7681451346725225,8.7847703229635954,5.6349650584161282,6.8578591570258141,0.038984064012765884,-4.7947575710713863,-5.490456260740757,1.901661017909646,1.2168211489915848,-8.8868611119687557,-1.4747001510113478,-5.2853713277727365,8.7641310133039951,-1.2499125488102436,-7.2801393736153841,2.6975689269602299,-1.958945207297802,-3.9920361246913671,5.8488993253558874,2.451085289940238,-4.6094345301389694,9.2338941339403391,-5.9411403350532055,7.2544205188751221,5.0457957666367292,4.6895676106214523,-2.4370533227920532,0.44486301951110363,-3.1871493346989155,-6.418814966455102,-1.0231131874024868,4.5367295760661364,8.8140987046062946,-1.442924439907074,8.7690054439008236,0.67464252933859825,-1.2829258665442467,-2.1349707897752523,-2.4540022015571594,-4.4149425160139799,-1.938822939991951,-5.7970893569290638,8.3192109782248735,0.97905439324676991,-5.0327267777174711,-5.0389142241328955,-9.0313261747360229,-9.4990112073719501,-9.8813583794981241,4.00971669703722,-8.69136325083673,4.2578534223139286,1.7425804119557142,7.5490756332874298,-2.685693996027112,1.5410660114139318,0.69654415361583233,6.8176735285669565,4.6391262393444777,9.7948192246258259,1.5268632024526596,1.989933829754591,4.8179705161601305,-4.369418928399682,3.176114447414875,0.95562081784009933,1.1191711761057377,9.9100438226014376,-1.8933177180588245,-0.99082397297024727,7.2215567901730537,-7.294892780482769,-5.2629404049366713,5.760651296004653,-0.73354470543563366,-8.6857917346060276,-2.1016732417047024,-2.8221115190535784,8.7717554345726967,6.8937357701361179,3.017220888286829,-9.568428685888648,3.4190796408802271,4.4716292899101973,-5.3264112211763859,-0.99335773847997189,4.6365598496049643,6.6615068539977074,-0.05417446605861187,9.4898267835378647,-4.4810965470969677,6.210376126691699,-2.208311827853322,4.9031702429056168,7.5823891442269087,-2.7855153754353523,3.8431415148079395,-8.320452282205224,-1.8414938822388649,-9.9876149371266365,-1.8442481942474842,3.7206631060689688,-6.8150689173489809,-0.86326896212995052,-8.9613750111311674,6.1701960396021605,2.4849641416221857,4.792425949126482,6.3030427321791649,-4.7606726735830307,7.3744160868227482,1.8113072030246258,2.6402536686509848,-5.2564920578151941,-5.8619785774499178,-2.2739188186824322,2.2464748658239841,-3.4968342538923025,8.7067457195371389,-5.7245453353971243,7.5665814336389303,-8.4657073486596346,-3.1433969177305698,8.9280573558062315,-6.1398728284984827,7.1574016287922859,-5.5506906099617481,9.542953185737133,8.4143456257879734,-0.092923268675804138,-1.7612991016358137,-2.153936717659235,-1.2143522966653109,-9.6189812943339348,-6.2186108902096748,3.8067978341132402,0.85130599327385426,7.8999138716608286,-6.1474189069122076,0.33046167343854904,-5.930573670193553,4.8483568988740444,6.3345155771821737,4.2034335341304541,7.1075192838907242,-3.9232617616653442,1.7396192438900471,-2.2192760650068521,0.62723631970584393,1.9609084632247686,-3.0113649740815163,7.988935299217701,-9.96428526006639,-9.7423656564205885,0.060414550825953484,-4.6125655341893435,-3.3888909593224525,2.9096984025090933,3.3011520002037287,2.4617715179920197,-5.0059995800256729,4.1650975868105888,2.7952523808926344,-0.19313420169055462,-6.0064510628581047,9.5770177897065878,0.93814481049776077,7.3999156337231398,-9.617807837203145,-6.496316883713007,-3.597837146371603,-8.8488689623773098,-2.9406416695564985,-3.364484990015626,-6.8991752620786428,5.5613945052027702,-9.6424292679876089,-0.30870427377521992,-8.3926534932106733,4.6727521810680628,-5.053977956995368,-2.2074845153838396,-1.192189073190093,2.8783158212900162,-4.1458907909691334,0.013521993532776833,7.2642236668616533,9.8073040507733822,-8.6406636331230402,-3.6336712632328272,8.8871286623179913,5.9715753886848688,4.2676826193928719,6.941895792260766,-7.5572868809103966,4.6794116497039795,6.871711453422904,-7.1454702783375978,6.081054313108325,4.2799662612378597,-6.6069356165826321,-2.7668813522905111,-2.9748313408344984,2.009709570556879,-2.8111536614596844,-7.0595318917185068,-9.5524810999631882,-8.5498435795307159,2.7789701707661152,6.151760071516037,-7.3683516215533018,0.1143171451985836,1.3283385057002306,5.3853539563715458,-8.3559348527342081,1.8029429577291012,2.0623829215764999,2.4698573350906372,-9.1076715383678675,7.3644616268575191,-5.4933015070855618,-5.9183943178504705,9.5467318221926689,-8.0781114287674427,-8.8187682535499334,2.9619718249887228,1.860564025118947,-9.5003370009362698,7.8360291663557291,0.14233852736651897,-7.7162911742925644,-7.705748463049531,9.485599473118782,4.4704972021281719,-4.3534105829894543,-7.7716241125017405,2.3135586176067591,3.9797824807465076,8.2042633090168238,9.0535771101713181,3.4706397633999586,-8.9573911111801863,-6.8723974470049143,-4.3838673364371061,0.34172045066952705,3.2956953346729279,-9.2484060954302549,2.0387599803507328,5.4390839673578739,-5.3156397864222527,0.042146258056163788,8.3522377349436283,-3.9402451738715172,-3.7005898356437683,4.186681630089879,5.5582679435610771,-2.1905508078634739,3.4126333519816399,-3.8711482752114534,-2.3890135157853365,7.8498997539281845,-6.7346960306167603,9.9638389702886343,2.2417298797518015,-3.2458152063190937,7.5838802475482225,2.2754581551998854,3.6253105103969574,-9.4061451219022274,-9.0810591634362936,-5.3613526839762926,-8.2545232865959406,6.2271358352154493,-0.52789053879678249,7.7437885664403439,9.8545750230550766,5.8425678685307503,-3.9617096167057753,-4.4534807186573744,-9.6503950655460358,5.8101360965520144,-9.0425015147775412,2.677048621699214,-6.843715887516737,-2.3328967951238155,-8.9963756408542395,-2.0853879861533642,-9.1158213373273611,-9.6092095412313938,-1.9847564212977886,2.1988899726420641,-3.2561343349516392,-5.8497147541493177,3.8441594876348972,8.7886170204728842,-9.7135898657143116,3.6951291747391224,4.036147017031908,-4.4769748952239752,-4.5170208066701889,2.4313452001661062,3.6188764777034521,2.4570673424750566,-4.069077530875802,-8.9860150124877691,-7.95430694706738,-8.0368433520197868,4.7737979609519243,-6.7775546573102474,9.6388997975736856,0.98905151709914207,2.9889338836073875,-4.9881165567785501,4.7250694409012794,-5.75779153034091,8.7977827526628971,4.3348711170256138,-3.8210239633917809,0.050295628607273102,5.3187086526304483,-8.4635553508996964,-6.9747705478221178,-4.96857357211411,-6.8159871455281973,3.7040700204670429,-5.6950587593019009,3.1474660988897085,-0.53717306815087795,-8.2676823530346155,5.0627060979604721,8.9015062991529703,7.616517785936594,-9.1854338906705379,0.41260587051510811,-5.3330527618527412,7.3822680581361055,-6.2206108681857586,-9.8068320192396641,-3.425745852291584,3.4895119816064835,8.227980425581336,7.6671553961932659,1.8808820843696594,-8.0147150158882141,-3.3152564987540245,0.48407775349915028,-4.1051148902624846,5.3340854868292809,9.9748971406370401,8.0963990092277527,-3.8217102829366922,8.5153230279684067,-2.9657240305095911,-4.9237257242202759,6.9417927507311106,-9.2891058698296547,-2.0023486670106649,6.5260161366313696,2.7533376961946487,-4.6532402466982603,-7.0087844133377075,3.3603884372860193,-1.9514299742877483,2.3164851311594248,-6.8343042116612196,-4.1508606169372797,-3.5143430903553963,-5.564268846064806,1.3335388991981745,-7.211632477119565,-5.907021127641201,0.69593976251780987,-3.3403276558965445,-0.88686053641140461,-5.4649641457945108,-9.6523628756403923,-7.2628481686115265,-6.6891484335064888,-4.5176960341632366,-8.9172032754868269,8.564557358622551,4.5156716555356979,-5.106371808797121,-2.7909521572291851,-7.5328501313924789,-4.6121390070766211,3.7797502242028713,6.2621260154992342,7.5520697608590126,7.6366081181913614,8.4727804642170668,2.0214066654443741,-6.2180797941982746,-7.2670714929699898,2.3294390365481377,-9.1180162411183119,-6.4989575743675232,-7.9799249954521656,1.4006172399967909,0.17404184676706791,5.1213982328772545,-4.659781688824296,3.049197718501091,7.866156967356801,6.500290185213089,-9.6227279864251614,-9.1892648953944445,-3.9750905521214008,-9.3468623515218496,7.2844630759209394,9.9710522685199976,3.4756333101540804,-5.0308507774025202,6.4910230785608292,-5.374989565461874,2.5504094734787941,4.7321189753711224,-7.2762656398117542,7.8034129925072193,-8.0376955959945917,-9.5498665235936642,-4.6066585183143616,-4.1096751019358635,8.6906078550964594,3.0463668797165155,0.28824949637055397,4.609366012737155,9.6146904025226831,-5.8982512913644314,8.090578131377697,-1.6532043553888798,-5.4055356979370117,9.1615607216954231,-1.648800503462553,8.6100036557763815,8.3315882738679647,9.0042623598128557,-5.3623698931187391,-5.3507573530077934,9.8212043754756451,4.9820937402546406,-5.9503902867436409,-8.2095176074653864,2.637585336342454,9.8968468047678471,-3.6955965496599674,8.1088391970843077,5.2605271153151989,-6.3206534646451473,8.7772484961897135,-0.78437758609652519,-3.0340174026787281,7.2695676889270544,-0.3757170494645834,5.3236249648034573,-5.8350966218858957,9.5311085507273674,9.3415649235248566,3.6818210501223803,0.36649648100137711,-0.29356268234550953,6.0920737776905298,9.4841075781732798,-0.60378115624189377,-7.7498194202780724,8.7850209884345531,9.847899628803134,-6.3507833704352379,2.3839216493070126,6.5712568163871765,3.1134427059441805,7.6316614262759686,5.3337294049561024,3.9902290981262922,3.7805616948753595,-0.099486382678151131,7.932443805038929,0.58317163027822971,1.3656729087233543,-7.1353341359645128,-3.560800738632679,-6.3779638055711985,5.5623481050133705,6.3847227487713099,8.0353668238967657,-9.5896496158093214,6.758910296484828,-2.9945158213376999,-8.8273543957620859,-1.3453203998506069,9.2001074366271496,6.2058376520872116,1.5135454572737217,-1.841409495100379,-8.5693203005939722,-4.5662808883935213,-5.4828487057238817,9.7618382424116135,7.2154948674142361,-9.1776286344975233,-8.4044535644352436,6.3489550165832043,6.8870916590094566,-8.6503548640757799,-6.5141899604350328,-3.9906377531588078,9.3513296823948622,7.7981234528124332,3.0610107071697712,6.4070576149970293,3.417463656514883,-2.6882199477404356,-0.91260445304214954,1.8570288363844156,-8.9162540901452303,4.5175154041498899,5.8815111592411995,-9.4418223388493061,-8.7080446723848581,3.89320133253932,-6.965095279738307,-2.356342813000083,-3.0535982735455036,-1.8261291179805994,8.247978063300252,3.7674526963382959,-0.42242489755153656,0.30482180416584015,3.1401432584971189,-3.6121516022831202,-9.4319295790046453,-2.4404298886656761,3.6949203535914421,0.5264899879693985,8.7173101771622896,-8.1677059456706047,5.3661854472011328,9.4789313618093729,-7.6004496216773987,-0.75677275657653809,0.92035255394876003,8.3654596749693155,-1.7190990597009659,7.1021684072911739,6.1445551831275225,-8.4609108231961727,-2.5281934160739183,8.6533145140856504,-3.7428157776594162,-5.5047261528670788,2.0675839390605688,9.8833582270890474,9.6018782909959555,-1.2314098235219717,3.6951646860688925,4.6329859364777803,6.5947488974779844,-2.0551502145826817,-0.90959431603550911,-7.5515984650701284,0.28461672365665436,3.5533549822866917,1.2372933607548475,-4.8103978484869003,-8.3565989043563604,-9.3577726557850838,3.9149792399257421,-0.94380566850304604,-2.5417996570467949,-0.026777619495987892,9.9486271757632494,6.5770991705358028,1.3058889284729958,8.0753093212842941,1.7239042837172747,-6.3406118098646402,-6.6626597568392754,0.67749291658401489,6.6235325857996941,1.712299631908536,-1.3799948524683714,6.4265820197761059,-8.4358650632202625,-1.5841053053736687,-4.0578015521168709,0.52936007268726826,-3.0451759416610003,-0.27199706993997097,8.5453216452151537,1.2210362683981657,1.9566507823765278,5.4297929722815752,-1.4693941082805395,3.8932888861745596,-5.4935813322663307,9.3785838596522808,5.859080832451582,-6.428324868902564,-0.85604369640350342,-7.5263338908553123,4.9063157476484776,0.44888738542795181,4.450368657708168,-2.6538568083196878,-3.3713199384510517,-1.7741536721587181,1.7992964014410973,0.7747113611549139,0.57393125258386135,6.0626449249684811,-5.1266203448176384,-3.1080972123891115,2.2102053090929985,6.920725479722023,-3.3667298872023821,-4.629162298515439,-2.3307091183960438,7.7719071321189404,2.4433086067438126,4.6878509223461151,8.7105668149888515,-1.5033940505236387,-7.5437406543642282,-7.6491586770862341,0.59013260528445244,-1.6412201058119535,-3.9862529654055834,3.0464574880897999,1.8111044261604548,-0.76781708747148514,-4.7017168812453747,-1.7555816285312176,-6.0603662021458149,3.4252713620662689,8.5358873102813959,2.658168962225318,-4.1541528142988682,1.1536958254873753,-9.8341737408190966,-2.9580606520175934,3.8746766466647387,1.6905090771615505,-7.613848652690649,-5.9542870987206697,6.2967634573578835,9.7035553492605686,7.6549092214554548,-3.9405768271535635,-9.2746865469962358,0.34321030601859093,8.335694195702672,-1.9875093270093203,-4.0691963396966457,9.0171651262789965,-8.5055737942457199,6.8212518002837896,4.7791390120983124,2.9894919972866774,4.3921000510454178,-1.9743294455111027,-2.55492789670825,-0.67310171201825142,7.1795990969985723,7.5221577007323503,4.9046133365482092,-8.1635359860956669,-4.5493039395660162,-0.15126963146030903,-2.3886188771575689,-5.5174088198691607,8.9099995326250792,-9.6377071738243103,-0.94446763396263123,6.3325468543916941,-8.8848904147744179,-8.3531923871487379,7.8955620713531971,0.71187328547239304,4.4543927628546953,4.9792784173041582,6.732476856559515,-7.2613408509641886,-1.3556607253849506,-4.5897438935935497,0.17442271113395691,-8.4774143435060978,0.097140604630112648,-7.3577789589762688,-2.1909428387880325,-3.1762303970754147,-2.9042302444577217,8.6023369245231152,-0.52316395565867424,7.1834714058786631,-7.3959469143301249,-3.6797687690705061,-5.8736523054540157,1.5257345233112574,3.0202234908938408,0.89631334878504276,4.3385383021086454,-2.1866442449390888,9.070236450061202,3.464165423065424,2.2283708304166794,-7.7713574841618538,6.7947811260819435,-0.11348250322043896,-7.3003542516380548,2.9461138416081667,-4.6645627729594707,2.6935166213661432,9.9339546356350183,-0.024282876402139664,-8.1222256179898977,9.7540531307458878,-3.6288769543170929,9.4650786463171244,-0.42303901165723801,9.9834060203284025,-8.8948599435389042,4.08893758431077,2.7740897703915834,4.1268709395080805,0.31999086961150169,-1.9133736751973629,1.9287042412906885,-4.2677232716232538,-7.6249813102185726,6.9391377363353968,6.0880671534687281,2.144774254411459,7.2209889348596334,3.1611629575490952,9.6659305226057768,-4.7055526543408632,-6.2234200723469257,2.9788736160844564,5.9289671014994383,8.1501995585858822,0.40412319824099541,-7.9013257380574942,2.4183368869125843,4.9881555233150721,-4.070002343505621,-4.5293408911675215,-4.6323150396347046,4.6811708621680737,-3.561204643920064,6.8336000200361013,-7.6843315083533525,9.440357219427824,4.0839390642940998,-1.2360361870378256,5.9398730378597975,-8.5537279397249222,-2.5054716411978006,-9.4618149567395449,-4.7239737119525671,4.1738644987344742,-9.8592588398605585,-4.5633204374462366,4.2734503839164972,3.8807141873985529,3.1634562369436026,8.2090773247182369,9.9627390410751104,3.755219578742981,-6.0244324151426554,7.3644298035651445,-6.0281555820256472,4.7891639731824398,-8.5209869779646397,7.771872915327549,1.8682269938290119,-0.70882183499634266,6.8314919248223305,-3.1150877848267555,4.719654293730855,3.2298299297690392,3.7517331633716822,-4.6206155885010958,1.3138461578637362,1.8124637566506863,2.078450471162796,-7.4828366376459599,-4.0353492181748152,-2.1142631862312555,5.5786907207220793,1.0550650954246521,-7.5208546780049801,-3.0045538302510977,2.4638297129422426,9.5860829576849937,-6.7035769019275904,-7.0169648993760347,5.8709595259279013,-6.7831235192716122,-3.9569632243365049,-4.680864131078124,8.716590590775013,-0.26179436594247818,0.022167814895510674,-7.425456615164876,0.35068906843662262,-5.9687457792460918,3.2897197548300028,-9.679976562038064,8.6339243222028017,-9.633770901709795,5.2124578226357698,5.7787440903484821,3.3520499709993601,-2.0960329193621874,-8.0252138618379831,0.23063953965902328,-3.6411768849939108,2.7401436679065228,-6.4052737876772881,6.5634786337614059,-7.6144727412611246,3.5566562879830599,-3.2776617724448442,-7.661356870085001,-4.4248972181230783,-9.2475013621151447,-2.7553871832787991,-9.7923326678574085,0.26485294103622437,-8.6165396682918072,1.8178058415651321,-8.1371283251792192,-0.71574671193957329,-9.5549149066209793,-9.4548320956528187,-7.3630273714661598,9.5989883970469236,-9.8018574435263872,0.18194819800555706,-1.9965564366430044,3.8760319724678993,4.4694698601961136,-1.6199464444071054,-6.4398255664855242,5.8517319336533546,-9.9412670265883207,-2.8749154135584831,1.2967000808566809,-6.3616526313126087,-0.29574600048363209,9.397045811638236,-3.8508919905871153,-1.9416376762092113,6.8956390116363764,-4.994999198243022,9.0485142916440964,-1.6201512608677149,-9.8821758199483156,-9.7290049493312836,4.6138187032192945,4.4510593730956316,8.9549967087805271,6.6298328153789043,7.6002582162618637,-2.4600215442478657,-5.5820351652801037,2.7350117079913616,7.341875871643424,-5.0920895673334599,-2.7493197657167912,-7.8172456566244364,-4.4477338064461946,6.9379585050046444,6.2687261682003736,-1.5191637352108955,7.4151686765253544,6.7400826513767242,0.56925269775092602,7.4301738105714321,-1.068629315122962,-0.45282937586307526,9.2967545799911022,-9.4456230662763119,7.4131294246762991,-7.5336231850087643,2.3951488547027111,-4.7331020049750805,-9.2453563958406448,-6.7049389891326427,-9.9095645640045404,9.9483734741806984,2.3131366726011038,-3.1118472293019295,-0.81632897257804871,-0.040970249101519585,-8.5868987068533897,-0.0065550301223993301,9.8296869359910488,7.548488387838006,7.4444717261940241,-0.76356133446097374,6.824723994359374,3.1363048683851957,-8.1239742413163185,0.36494087427854538,-6.4386448822915554,5.6954911909997463,4.1205699648708105,-5.5804899055510759,8.7061919830739498,4.9688059184700251,-9.2788111232221127,-8.9785423502326012,-2.3612723685801029,-5.9046389441937208,0.73329698294401169,4.5224763359874487,9.2598925903439522,-8.9850833546370268,7.7040665503591299,2.2466504387557507,-0.54597998969256878,3.7143872212618589,7.7061350736767054,-2.9876781441271305,6.0934865288436413,-6.7717837728559971,6.6301548667252064,-6.9870247971266508,9.0742582641541958,-8.9412050787359476,5.1662499643862247,9.1632701270282269,7.0811749342828989,-6.6927458252757788,-4.9790595285594463,-3.0534572061151266,0.54479118436574936,-3.6944818403571844,6.8437584582716227,3.0485399905592203,-3.1882765516638756,-5.3639505058526993,8.0838844086974859,5.8453985024243593,3.6127542518079281,-0.43918333016335964,-1.354155233129859,0.71306444704532623,4.4742453284561634,-1.3586513604968786,5.1466517522931099,-0.22388067096471786,-2.7623603958636522,-6.9911166373640299,0.3026993665844202,7.4683348089456558,0.30327065847814083,-2.9299623239785433,-3.8767237775027752,3.9035194274038076,6.4511251822113991,4.061066173017025,-5.660720057785511,0.27802275493741035,-7.2714773286134005,8.2805593404918909,-8.6390212830156088,3.9693070016801357,-7.8571134340018034,5.4945314954966307,6.5909660700708628,-5.6331304740160704,3.9761573821306229,7.2772308439016342,8.4189286641776562,-3.0657970160245895,-6.850394057109952,5.4271067958325148,-6.6159617062658072,5.5316292680799961,-9.9067698232829571,-3.0804191902279854,7.3947239853441715,3.1261578109115362,1.3344307150691748,7.7771168667823076,-9.9966808594763279,5.7847947999835014,5.0463268533349037,-6.3844582438468933,-3.5896760411560535,8.3148264512419701,7.2883093543350697,-5.3845463879406452,1.9288939982652664,-1.0784777998924255,-5.9763129707425833,-3.8920677825808525,6.0168259590864182,4.7940197121351957,-6.9105823617428541,-6.15772963501513,7.0380543638020754,8.579825758934021,1.1316758114844561,0.075450735166668892,8.1005847919732332,6.5287403482943773,8.5391631349921227,-2.2850450966507196,-4.7528790310025215,-1.637832997366786,-7.0591212995350361,-2.6516582723706961,-6.4205262251198292,-9.7842375747859478,-3.6809177417308092,-5.1844358164817095,5.1872700732201338,2.448239466175437,7.5608054269105196,-5.5430524796247482,-2.0829901751130819,-8.8158111646771431,-7.3382354620844126,6.2766095716506243,-9.0228018816560507,-6.2312173470854759,-8.0699229706078768,8.8046480901539326,-0.27940161526203156,4.0971283614635468,0.43648144230246544,-4.0563175454735756,5.4710597358644009,-7.8988982457667589,3.2171998359262943,-8.5222541447728872,6.4746003597974777,-1.3916239514946938,-9.0236853994429111,-1.0805008001625538,0.023121470585465431,8.6026345659047365,4.4792947452515364,3.5068967565894127,0.41389370337128639,-3.6884459387511015,8.289156798273325,-4.1415482852607965,-7.001984529197216,-2.3539587575942278,-2.9847790487110615,-5.1814167853444815,-4.0718735754489899,4.0208638180047274,-1.341701066121459,-9.9697505403310061,-1.5973311103880405,-6.3439065311104059,-2.0370397623628378,3.4727762825787067,6.9510867353528738,6.9148937333375216,-1.3808914180845022,-8.6419962905347347,-6.0316443908959627,6.1527532618492842,9.3241983093321323,-8.1988638173788786,1.6958354040980339,1.905728206038475,9.574052058160305,-8.9069053065031767,1.6425221506506205,5.8698770962655544,-4.9755188636481762,-3.5455020144581795,-9.2523064836859703,-3.515065461397171,2.2948410455137491,9.3935481645166874,-2.6358471903949976,-0.68367133848369122,9.5358870085328817,9.6531052980571985,-0.2591017447412014,5.2770523633807898,-8.5808090958744287,2.3415367398411036,-5.7919169031083584,-4.7473576106131077,-8.8393204659223557,-2.4590616766363382,-9.4495402090251446,1.5777112171053886,-3.4074835013598204,-9.5751557592302561,-9.6428420580923557,-7.2464675642549992,8.6196691077202559,-9.2211608216166496,-0.049922820180654526,0.94723909161984921,0.2474985271692276,-0.29217367060482502,9.437194112688303,-9.0783959254622459,-0.60031203553080559,-9.4443076010793447,9.5221529994159937,-1.1743860319256783,2.0940304920077324,-5.6294261757284403,6.2342987302690744,-0.14111331664025784,8.3085643779486418,2.0416434668004513,-6.0981592442840338,8.2376118469983339,9.5424552261829376,0.04513939842581749,-1.3420520443469286,4.131358414888382,-4.2590103764086962,-1.1873513739556074,4.1855268925428391,6.1505939811468124,-6.9668324664235115,8.4467605501413345,4.7047105897217989,-7.9290034621953964,-2.7611729130148888,-7.0330923888832331,-5.1837567426264286,-3.3995356317609549,4.0046886447817087,6.8021624442189932,3.944331482052803,-7.6206720061600208,-0.63438891433179379,-2.1744098793715239,-5.3067813534289598,8.925829641520977,-3.5810668393969536,-6.9903195090591908,-6.2999652046710253,-3.515165951102972,0.60591056011617184,3.5388668719679117,-2.2643768787384033,2.6178595796227455,-1.6339465323835611,-1.7393042985349894,7.5127191655337811,6.2711521796882153,-0.74518864043056965,-4.3854072876274586,-5.5402392148971558,5.1995501201599836,8.8389884773641825,-3.1205135025084019,-6.4703828189522028,-7.724010506644845,2.5554326269775629,9.1562598664313555,9.2597250267863274,8.1986759230494499,-4.8536188807338476,5.2275117766112089,-1.2094513233751059,-7.248323168605566,-2.5674732215702534,8.4776232298463583,3.4137686342000961,-4.7904600203037262,6.7384795192629099,-6.3745887484401464,2.286933334544301,-3.511350154876709,4.7379977628588676,-8.4714842867106199,-0.23639478720724583,6.9128878135234118,4.9056142475455999,8.6587751470506191,8.034042501822114,8.1524692568928003,-1.4490573387593031,5.6933743879199028,8.5434605833142996,9.9421688821166754,-1.9674421939998865,-6.8008916918188334,-2.5866393651813269,6.3522474095225334,2.2223398182541132,-9.1345789469778538,-4.8683550860732794,-2.4438914749771357,5.5160391889512539,8.0707701295614243,5.4337089601904154,4.3466147035360336,-6.4465653896331787,-7.4244757555425167,-3.164003249257803,2.5974432192742825,-4.7717150673270226,1.7849043477326632,-1.1125354282557964,1.6171268559992313,-0.94884030520915985,-7.1589388139545918,-0.28462390415370464,-3.6738810781389475,-6.9192307721823454,8.4884360339492559,5.1445672754198313,4.7423165012151003,4.1135512944310904,-3.5432840418070555,8.0251598730683327,-1.1378722731024027,-4.21922467648983,7.4909074697643518,-0.31801878474652767,-4.9416394624859095,5.8655935805290937,3.0314321164041758,9.2796823848038912,3.6219922825694084,-5.1756002474576235,-6.3133212644606829,-7.990462938323617,4.2894113156944513,-7.8639052901417017,-8.656194694340229,-4.6642172615975142,8.5005260817706585,8.3420011028647423,4.0126793924719095,1.1026589386165142,-7.6111317798495293,-0.29180523939430714,-4.3705825228244066,3.6195829417556524,-5.6693913228809834,-5.4599297698587179,-5.0396064855158329,-0.66616324707865715,3.7943793926388025,-7.8654399607330561,5.5505966581404209,8.8781550619751215,-4.8477256391197443,4.2752236314117908,-6.3163151405751705,1.6914611775428057,8.3881024550646544,-1.1618938203901052,-7.949370127171278,-5.0637113209813833,-5.7961331028491259,4.3909733090549707,-0.91148208826780319,0.72061360813677311,-8.6470041424036026,9.8013892024755478,-8.0515190213918686,-1.8801772873848677,-0.13960553333163261,-6.3501215353608131,-6.4926162455230951,-1.4012110605835915,9.8457720596343279,-2.1088384091854095,-3.2470814231783152,6.3025734852999449,7.3526950180530548,-3.2546957768499851,-1.6718687303364277,0.90231440961360931,5.1983676943928003,8.9659585990011692,-9.1336781531572342,-9.72871333360672,9.5150041859596968,-1.3244938477873802,-0.76803186908364296,-8.3115514367818832,7.7550152130424976,-1.4591754414141178,-4.3615770060569048,-5.0246966723352671,9.9230669904500246,-3.012935584411025,1.5916874818503857,-8.50840182043612,-0.70938440039753914,-2.6235447730869055,6.0830564517527819,-2.0700895227491856,8.0054532084614038,7.6522155199199915,-9.2136185523122549,6.7129974346607924,5.3480151388794184,4.090559259057045,-9.970422750338912,7.1048352774232626,-9.0333584789186716,-3.6559476237744093,-5.5116631276905537,5.4778480250388384,6.191877955570817,6.8929259944707155,9.4073212705552578,8.8487461023032665,0.87588892318308353,1.0652170516550541,3.1030737608671188,-6.6391985584050417,-5.0101448129862547,-5.5038328096270561,-2.9179962165653706,-2.7623563911765814,-6.9238098617643118,-8.4723225980997086,5.6741056870669127,4.694405198097229,-1.1317205801606178,-0.82772135734558105,8.4872188698500395,4.6876902505755424,6.0101563669741154,-7.301814965903759,-1.6041108313947916,-0.29067754745483398,-5.4174640867859125,8.6811292450875044,3.7393683847039938,7.5645492412149906,-2.6207654364407063,-7.2046325076371431,-8.2585339806973934,-1.1805999558418989,-2.3433888144791126,-5.3357450291514397,2.1333315502852201,-5.0965393986552954,2.4623651709407568,4.9715255293995142,-3.5703102126717567,-6.2036940548568964,-5.4859502706676722,-2.3661637865006924,-8.1146999727934599,-3.7624279875308275,4.8728623799979687,-1.8018629774451256,-3.910997761413455,7.8606715705245733,-5.692774411290884,1.5405031386762857,-8.7636579480022192,9.2008775938302279,-0.85013022646307945,-8.1386445555835962,-6.1990311276167631,-7.1161321084946394,-0.83232490345835686,-8.8845806755125523,-3.1474046129733324,1.570723382756114,-0.85201546549797058,0.17614296637475491,0.43491549789905548,9.6248548477888107,4.9355803709477186,-7.7005885913968086,-3.7924376130104065,0.50108671188354492,1.764448806643486,-4.9088146723806858,-2.448158860206604,-6.2059043906629086,-2.6350641809403896,-7.5236314255744219,-9.6733502484858036,0.0023762509226799011,-0.062272464856505394,-6.6132390685379505,-8.7089984118938446,7.8637013956904411,5.2294971700757742,-7.8409433458000422,-2.7347959671169519,-3.7157624773681164,9.1800920478999615,9.8071991559118032,9.5963684190064669,6.1641716025769711,1.2322510126978159,-9.5571416802704334,-6.8802168406546116,4.1955835279077291,-4.8275353573262691,3.6132898926734924,8.5633326973766088,3.9327900856733322,-1.5969210490584373,0.54799423553049564,-9.8608008865267038,9.5195012260228395,-5.7427414692938328,1.7441588919609785,-5.9214108996093273,-1.1529578175395727,2.2380298469215631,-5.4322670120745897,-0.11163619346916676,3.7305737473070621,-0.24692155420780182,9.9895147513598204,-6.2254174519330263,9.4089148938655853,-4.3672269023954868,0.017495518550276756,-5.952741326764226,-7.7234472520649433,-7.9779476393014193,-5.3659579157829285,-5.6546542979776859,2.2252478916198015,-0.25858987122774124,-6.1198894865810871,3.0174293927848339,-6.0640935879200697,0.77909862622618675,-5.6893046572804451,-0.14334117993712425,-9.1351340617984533,5.8018301147967577,-8.6411369405686855,8.4114504884928465,-8.7514958065003157,-6.3900100812315941,3.1005929876118898,-8.3335546776652336,-2.0534544810652733,7.5905989203602076,-4.8038078378885984,2.4017092678695917,5.5277621373534203,5.0983640179038048,8.204167066141963,7.4360231123864651,-2.7594136632978916,2.5346176140010357,-0.68166338838636875,3.2835043128579855,5.8570901583880186,0.11441612616181374,2.9919115547090769,5.0576016679406166,3.1113509181886911,-7.525015389546752,7.0663672499358654,4.4345032330602407,-9.3040489871054888,6.848679156973958,5.7507231179624796,-7.5964331347495317,6.748323068022728,-0.93406466767191887,1.1752013862133026,-8.3902144525200129,5.6657090876251459,3.5727583151310682,7.349108625203371,-3.5312004294246435,-8.8855667132884264,0.28025847859680653,-9.6956697665154934,4.8782365489751101,8.5217950586229563,5.8096952270716429,3.5478051193058491,7.9607461951673031,-3.7385572586208582,6.0682033561170101,8.2939320057630539,-3.8846359681338072,-9.0766685642302036,8.4314482007175684,7.3500537034124136,-7.6472709607332945,-7.6830186322331429,-8.494133809581399,-0.90692585334181786,-2.7027459535747766,-5.0511846225708723,4.7400871757417917,6.6452780459076166,7.1882478334009647,-7.1185295097529888,-1.1254478711634874,4.5976988039910793,-6.4760870765894651,-3.5954686626791954,-9.0417635254561901,-4.9195648450404406,-3.1263108365237713,-3.9061756618320942,8.9056992717087269,-1.9121924322098494,1.7818551417440176,7.6394594926387072,-3.6041691713035107,4.7287879511713982,-3.260789392516017,-4.0872672758996487,5.298940222710371,-0.71155717596411705,0.85861626081168652,-9.2364195547997952,3.4965484496206045,6.489898394793272,-4.2775496561080217,7.2229745704680681,-3.4662593528628349,2.5791075639426708,7.0609256252646446,-7.0228826534003019,6.4112675935029984,-5.8254275564104319,-7.9609079193323851,1.0206157341599464,-6.51126972399652,5.089776087552309,3.8668215833604336,9.6704600565135479,-8.5776762291789055,-5.0043726805597544,-8.4916030708700418,1.627199687063694,8.345231469720602,-1.6945448331534863,-0.21494581364095211,7.4057867098599672,9.0573688317090273,7.1981036756187677,-1.4713892806321383,-9.639572836458683,7.6993404515087605,2.8151070233434439,-6.4961583726108074,-0.93374105170369148,6.6142149642109871,5.1110335160046816,1.1404217500239611,7.0684398338198662,-0.73157940991222858,4.3449301365762949,5.2409176994115114,4.1038932837545872,-5.8654695563018322,-0.94680041074752808,7.1255674120038748,-0.58837242424488068,-8.7752606254070997,-5.8053216338157654,9.9593332782387733,6.5145635604858398,-9.730109665542841,6.0468533262610435,9.4639800488948822,1.1128341034054756,3.4028629027307034,-8.0830889102071524,7.5247011426836252,7.6522422302514315,-8.7646980118006468,-8.2794746663421392,6.8692962452769279,-7.7378736063838005,9.5583152025938034,6.6037630569189787,9.4458275754004717,-3.9757880568504333,-1.0698243416845798,-0.53764080628752708,3.871042774990201,0.61602781526744366,-6.4204257167875767,-8.0949940346181393,7.4352750740945339,4.6683067549020052,0.23174443282186985,-5.0712374877184629,7.7115824818611145,8.5669112484902143,4.0774986799806356,-9.479575389996171,-3.2235755957663059,1.365014985203743,1.8069452606141567,9.3290875386446714,-6.025586724281311,7.9639561008661985,-9.7896721493452787,4.9801875930279493,2.0129932556301355,-7.6222586072981358,-7.3003942519426346,2.2738287225365639,-3.7605642713606358,-3.8036599289625883,-8.11237758025527,-4.7299765795469284,3.2836687937378883,8.6215203069150448,1.8919440545141697,-2.0961827132850885,9.4571996666491032,7.1549496427178383,-6.7612205818295479,4.1657065320760012,-6.970204534009099,-8.2275793794542551,-0.92661662027239799,6.3545340858399868,0.65450870431959629,0.32787688076496124,-9.3731841538101435,4.8939318116754293,-7.6879246067255735,9.0511528495699167,2.7260918170213699,-2.5747317261993885,6.4839358720928431,-4.4896687287837267,2.1377184521406889,8.6341201141476631,-6.3430956844240427,-8.4091394953429699,7.5925142131745815,7.3865185026079416,5.2166093979030848,-4.4457303546369076,0.60997308231890202,-8.1823224294930696,-0.29305826872587204,-5.4302465077489614,-6.1530199740082026,6.1933269444853067,-8.7539173010736704,-7.0880693942308426,-9.1822860483080149,-6.6816075146198273,2.2225277498364449,-5.9760128427296877,1.1521837301552296,4.7520399931818247,7.5362808536738157,2.272444935515523,-7.0178727433085442,-9.3871734477579594,9.7758683189749718,3.0189917795360088,0.19494054839015007,-3.634123420342803,1.2877241149544716,2.7792883757501841,-8.50016875192523,-2.3362018726766109,-4.5448140986263752,-4.6905129216611385,6.5493671875447035,-4.7855494171380997,9.2709869612008333,-2.5219922792166471,-7.1241782698780298,3.9358406607061625,9.67409354634583,-7.5096125900745392,5.9412181004881859,-5.9472603350877762,4.3955798912793398,-3.4886546060442924,6.1820871662348509,2.3391295503824949,-6.2495501525700092,3.8106151018291712,5.0081245228648186,-8.4510267525911331,3.593381317332387,-6.0400932095944881,4.1534573305398226,7.1574651449918747,-4.483173843473196,-8.7027440778911114,-7.0197069644927979,-0.21492891013622284,7.6898839138448238,3.8790784310549498,-4.3287006393074989,7.5283995363861322,9.8111452162265778,-4.082195833325386,-9.4653243850916624,-3.7069360539317131,-2.4742091819643974,-4.0336623787879944,6.2364463973790407,-4.0452721808105707,-8.8894962798804045,-5.7639672607183456,5.002282252535224,-6.6420642286539078,6.8265352863818407,-6.4213100913912058,-2.9586780071258545,-6.5012106578797102,-5.8474996034055948,1.074198056012392,-5.9531859308481216,4.8040919005870819,2.3726890236139297,-2.2154832910746336,4.3723878264427185,6.7223114985972643,1.8894877936691046,-3.3785587549209595,-3.4369421377778053,-4.6864582691341639,-5.3040877543389797,-5.8028504252433777,-8.5070642177015543,1.7717047687619925,-2.9578592907637358,7.2589552402496338,1.2608579453080893,-8.7604250758886337,3.5357592348009348,5.5055652279406786,-7.9650926496833563,-9.3121473025530577,-9.2597086261957884,-7.9228746797889471,0.24527303874492645,2.3040423635393381,4.0401002950966358,1.9657695665955544,-1.3108005840331316,9.3746521510183811,-0.22114620544016361,3.1958016939461231,-8.1608265731483698,0.98779948428273201,1.9460183288902044,6.7301471438258886,-6.4168227836489677,-7.5404967460781336,6.8712079059332609,4.3914070539176464,6.3784678187221289,2.9087574407458305,7.4864076357334852,4.0532706212252378,3.3194409124553204,9.8435198701918125,0.038613611832261086,8.979052621871233,-9.0624356735497713,7.6436419785022736,6.6908707655966282,-6.5349119901657104,7.734208395704627,8.8406453933566809,4.7272735927253962,-8.7126118037849665,7.1334238536655903,-8.5451573505997658,1.5404198504984379,9.8365176375955343,2.352090310305357,-8.4180580265820026,-2.30124038644135,3.052885327488184,9.8438012413680553,4.7676189709454775,9.3721602484583855,-2.1025525499135256,2.3993554059416056,5.9664046950638294,-2.6361651066690683,-6.0268901567906141,6.0571659076958895,2.7875363081693649,-9.8771685175597668,-5.5712736677378416,3.603500984609127,4.0411547850817442,-0.31141724437475204,6.0104496125131845,-2.3732371907681227,-6.9974055513739586,-5.395078444853425,4.9166133813560009,-6.4787828084081411,-8.9026333577930927,-6.5588358417153358,5.6460352148860693,-7.0860209595412016,5.2457557898014784,5.4176785051822662,-5.0772427394986153,6.781315766274929,-6.425784882158041,1.8335135374218225,-4.1378839407116175,-5.4153456632047892,4.2854743916541338,5.9682123269885778,7.7447046618908644,5.2513912692666054,0.13318192213773727,-1.6113553289324045,-2.0489477179944515,3.3357658889144659,4.2173993494361639,1.830977238714695,-6.7654563300311565,-7.0245135203003883,-0.99871240556240082,-5.359329842031002,5.7433812972158194,9.0095855109393597,4.1038311272859573,-6.9101333245635033,1.3892382383346558,8.9271608181297779,-1.2079815659672022,-2.5461104046553373,7.522487286478281,-9.5560390222817659,-8.3478440158069134,-2.2143607400357723,3.2391031458973885,-0.39332329295575619,9.4154904689639807,6.1484638229012489,-2.7684021182358265,-8.5343445930629969,3.2704358547925949,6.2155153509229422,4.1666298639029264,8.5482334811240435,-9.8397375829517841,3.5304445773363113,-3.8178828172385693,-7.1564609464257956,1.3608956709504128,-7.4263694230467081,5.0091269891709089,8.397424453869462,-4.4870598334819078,5.9854218084365129,-3.0155405029654503,-2.1891786810010672,6.4739695377647877,8.0061501357704401,-0.63452718779444695,-4.4983719661831856,-4.1375925857573748,-0.5185429472476244,4.8487598076462746,-6.8937966786324978,-4.0407534688711166,7.056495314463973,-1.4831163175404072,-6.7358822468668222,-9.972897544503212,5.5109697394073009,2.8685316070914268,-8.5891789011657238,1.6702191438525915,-8.6267579346895218,-9.9205975793302059,4.5164848119020462,8.5603472404181957,-6.2437850330024958,0.70497971959412098,8.5942309908568859,3.2404088508337736,1.551659582182765,-1.2573118507862091,8.3597922511398792,3.0285085923969746,0.1440143771469593,0.44971609488129616,-1.6215115506201982,7.2554342914372683,2.084271227940917,-9.6533774212002754,-4.314315402880311,9.3010682798922062,3.0547311995178461,0.86737246252596378,-2.0709372777491808,-6.2427650764584541,-2.1526106353849173,1.0731124971061945,-4.1981744766235352,1.2816167902201414,0.13348151929676533,3.423974122852087,6.7331878282129765,4.6879597287625074,-9.4607237353920937,-6.3838165160268545,7.1958434302359819,0.54066655226051807,6.982826329767704,0.36225731484591961,8.4587717056274414,6.5762009378522635,6.2092922069132328,-0.42575155384838581,4.3937093950808048,5.0739157665520906,-2.6975935883820057,1.5446172095835209,0.38153181783854961,-7.5946563389152288,-3.3890693262219429,-0.088114077225327492,-0.93321835622191429,-4.6008420642465353,-6.3525315374135971,-6.9975207652896643,-7.331478726118803,-0.1629289984703064,1.652399692684412,-8.1182738579809666,-3.8287163618952036,-9.2358460742980242,-6.8649647478014231,0.53750823251903057,-6.0990535840392113,-6.7935564182698727,0.69730322808027267,-0.42456193827092648,4.3875784147530794,2.0305293519049883,7.1069116145372391,5.8636394049972296,-9.8123960569500923,3.0594723019748926,0.55108149535953999,2.0267750788480043,4.0088443178683519,-3.3534399513155222,-1.2652097456157207,-4.38012620434165,3.2189276069402695,0.51639329642057419,-0.97778475843369961,6.3716356083750725,8.0797980818897486,-2.8334961831569672,-2.5702942349016666,1.064852150157094,-3.0298257153481245,-2.280743308365345,7.547276709228754,7.0797893311828375,-9.9805771373212337,-3.5599468089640141,7.9740321356803179,-0.44175495393574238,-4.5754359941929579,0.64728804863989353,-1.0296831838786602,-5.8852012455463409,7.4226982984691858,-6.7095612734556198,-7.5962972175329924,9.0326837264001369,-7.6844614371657372,7.2566436696797609,2.4102913588285446,9.7669649496674538,-6.6199362371116877,-1.2683106865733862,3.5023590922355652,4.1493688710033894,-1.5572743117809296,6.890707965940237,-7.8710842505097389,-9.3129816558212042,-3.2826840132474899,7.9298419132828712,-3.1468231324106455,-8.656332790851593,-6.985205328091979,-0.34592565149068832,6.0276509448885918,6.7295561730861664,3.650731984525919,-2.1474292408674955,8.1568101886659861,-8.4910169895738363,-8.522531958296895,1.8053884617984295,3.1639698334038258,-3.1589069589972496,8.2507936656475067,-8.9107186254113913,-2.4479287676513195,-2.338738813996315,-7.1831868775188923,-7.8218284156173468,-1.4701642375439405,-9.0502736438065767,-7.9491240251809359,-0.92747516930103302,-8.0750994384288788,1.8037533853203058,-4.3167605437338352,8.2055859360843897,-8.7170297466218472,-7.1189414337277412,-8.0486541148275137,6.2703073583543301,5.055899191647768,-5.5021681450307369,5.0600216630846262,3.7842093221843243,1.2061858270317316,-7.6347173750400543,3.3050962071865797,8.7520583067089319,-4.1558923851698637,-8.0832718126475811,4.4506598263978958,2.2398153599351645,4.5768502168357372,3.1217084359377623,6.5537854935973883,9.4729204382747412,-8.6260415147989988,2.1202715206891298,-4.5964569225907326,7.3485442996025085,6.9841791875660419,3.0997383408248425,-2.6976032368838787,1.382454838603735,-5.0814385060220957,-3.7369322218000889,-6.6198027785867453,0.97472674213349819,2.2324409242719412,0.63470996916294098,7.5705349445343018,-2.0190497022122145,5.8317173738032579,-6.3259745854884386,-0.65482955425977707,-5.7202453073114157,-0.16284649260342121,3.0390757974237204,-2.2529706545174122,-5.6777298450469971,-5.6054718792438507,8.8341599330306053,-4.2738581541925669,9.266047291457653,-5.5430216901004314,-1.5655106399208307,8.4627408534288406,-6.7143319267779589,-7.7766676433384418,-2.4530641920864582,-8.6498173326253891,2.5201011262834072,-4.6602725703269243,-5.2010476961731911,5.9914079681038857,-2.406154926866293,-0.24579641409218311,8.8997446838766336,-1.9909501727670431,-1.8994910176843405,-4.7454708255827427,2.871875548735261,7.6124483253806829,2.4191425088793039,-1.4717560727149248,4.1957526188343763,-1.9856241531670094,7.614920437335968,3.967928159981966,8.9686941262334585,-3.1576719414442778,9.0077336877584457,-7.0197610836476088,-1.1245095450431108,0.36814591847360134,7.4285329226404428,-8.647032780572772,9.3200674932450056,2.3745101690292358,8.3925077132880688,-7.1227188222110271,8.464777609333396,7.5174245703965425,5.3548917453736067,-0.33431533724069595,1.162202637642622,-6.8601817823946476,0.92480786144733429,3.2458128407597542,-7.623481685295701,-7.8566661663353443,-6.9882408250123262,8.636477580294013,-6.7211621440947056,-2.5721301417797804,-9.7912347596138716,-1.2826032005250454,3.2880769949406385,2.7101579587906599,9.6249128598719835,5.9105894528329372,-0.72294171899557114,9.5186014380306005,-0.86547826416790485,-6.0931143816560507,-6.9733819179236889,-1.6298708599060774,6.7605230584740639,4.1111749410629272,-3.482655119150877,7.0154634304344654,8.8940084725618362,1.6005462128669024,0.38029043935239315,-8.4585045650601387,-2.0862129051238298,-2.9802344832569361,-8.8009051606059074,3.1869750749319792,3.490187581628561,-0.41720999404788017,7.951705027371645,4.3065355252474546,-0.057315202429890633,-3.2965294271707535,-4.7700299974530935,-9.8941262625157833,9.4199067167937756,0.37234113551676273,-2.0624541956931353,-3.6676048953086138,-1.4354258961975574,-5.202970365062356,-6.3228880614042282,-8.7796192429959774,0.93939251266419888,8.370045954361558,-4.6375012770295143,-2.4839210696518421,-7.2613588161766529,-1.6576020512729883,0.68238954059779644,8.9210924226790667,-3.1995039526373148,5.9371212404221296,5.1968124974519014,2.8277636040002108,6.2229928188025951,9.8404325731098652,8.1504115276038647,3.9666864834725857,8.0998370237648487,-6.038999930024147,2.528207078576088,-8.4235323220491409,5.6922756507992744,-9.9230142030864954,3.9002893213182688,-7.8372678160667419,-0.96016771160066128,2.4613418709486723,7.7729225531220436,-0.49051058478653431,-4.0113240852952003,1.6761453077197075,-9.0257217735052109,4.6941603161394596,-5.2474516443908215,6.0802499111741781,-9.239617045968771,9.7563143447041512,-5.6246539391577244,6.4412788115441799,-1.4268857054412365,-1.6679842583835125,6.1886345501989126,-7.6189881097525358,7.6668580155819654,-3.1171938497573137,9.3230209872126579,-7.9861166886985302,-2.6631711982190609,0.081728948280215263,-6.3814873527735472,6.3420902471989393,-8.4890874288976192,3.9075943361967802,-5.0618826970458031,4.9375493917614222,5.3927442338317633,-4.1475415229797363,-7.7303309179842472,-3.6717208009213209,9.3885484337806702,-6.6663217078894377,-0.86891841143369675,-3.9116695057600737,-3.4293356630951166,3.1555617786943913,-4.4730825256556273,0.90203455649316311,0.49487629905343056,-2.6139596756547689,7.1797890681773424,-9.2849966883659363,7.0606642216444016,8.5837066918611526,6.3585155457258224,7.5709050334990025,4.2010355275124311,6.8042220361530781,-1.440106863155961,-3.8759820722043514,-3.6306396126747131,-0.15992037951946259,-7.7817415725439787,-7.7305923867970705,-8.06622713804245,-9.0794939454644918,0.94526577740907669,7.0820065680891275,7.284523556008935,-9.0124588832259178,7.6035573426634073,-7.0116040855646133,-4.0298426989465952,-9.5661944709718227,0.96952976658940315,-5.1131270825862885,3.6731612123548985,-5.1793969422578812,9.8756291903555393,-0.30004214495420456,-2.8082543332129717,1.6694779694080353,-1.0836768336594105,6.6435264609754086,-2.2506401315331459,-6.5086300298571587,9.4551155064254999,-7.8735312446951866,9.5603870414197445,1.4251582231372595,-7.3656543157994747,5.4479349683970213,3.443134743720293,8.7657429091632366,5.8412211667746305,-6.595726041123271,5.6324534770101309,4.6457104478031397,0.45561084523797035,-2.5484422594308853,8.3310040552169085,-0.81470050849020481,7.3286256846040487,-7.7879832405596972,7.3656932171434164,-4.7939635626971722,7.8544424846768379,9.6149796899408102,-1.036197654902935,4.6260841935873032,-9.4028439093381166,6.4024204201996326,5.4801306594163179,4.5561139564961195,-5.3926192503422499,6.2482955493032932,-4.8965756967663765,3.252304382622242,1.4798624441027641,-7.9518121201545,-6.1062874086201191,-8.3724462054669857,4.2966374475508928,-6.4143071230500937,-5.2597890421748161,-1.2743947375565767,1.2477141711860895,-9.6678368467837572,-7.3338812962174416,-0.542924664914608,-4.93476920761168,1.3339673075824976,-0.011372761800885201,8.8580705784261227,-2.4076408054679632,-5.218958081677556,4.9715586565434933,-3.013542303815484,-8.6054455488920212,8.2766706775873899,6.0042212437838316,-7.0534304715692997,-7.0059126056730747,-8.3731401152908802,-7.365904962643981,1.2353134527802467,1.9132888037711382,-3.3549817837774754,-7.1787879429757595,6.1110644787549973,8.6608205176889896,2.4105868395417929,-5.2668906934559345,-0.63184787519276142,0.53283494897186756,-4.6429301984608173,6.2721963878720999,-3.1951816845685244,-1.418519290164113,-1.0536426305770874,-8.5716220922768116,-3.2524937205016613,-4.6619076654314995,7.317908862605691,-7.9056106507778168,-9.5981912314891815,3.1999754998832941,1.988329840824008,-2.1402714494615793,8.4578104037791491,-9.5803992263972759,2.2302052192389965,3.0592154618352652,-3.7656307313591242,-8.9556531608104706,2.3373344261199236,3.5797963477671146,5.6373231951147318,6.4910626690834761,-4.7095916513353586,5.8931574039161205,6.2966119963675737,7.1579504851251841,3.6739377770572901,7.872326010838151,-9.8165959678590298,-7.5284303724765778,9.670749120414257,-3.7193792499601841,8.3929950650781393,1.0682027135044336,-6.7169075086712837,8.9355274476110935,-0.59003980830311775,3.2010154891759157,-0.53257010877132416,9.0942559670656919,7.160187903791666,1.2782333232462406,3.2675520610064268,-2.25240683183074,3.7984380498528481,0.34841186366975307,-4.2417263146489859,9.305874751880765,3.8371059484779835,-9.7602156363427639,0.055801859125494957,-2.1380749810487032,5.3738550376147032,-1.618262492120266,1.8623605277389288,0.6934825424104929,-4.6388260181993246,-4.7488459199666977,6.146664209663868,6.9854981824755669,5.2680857945233583,0.71806804277002811,8.5696787107735872,-9.4097626954317093,-9.8816175013780594,-0.34534473903477192,-4.2089533992111683,0.12026477605104446,1.2901702895760536,3.8921452593058348,-4.7145181242376566,3.0939272977411747,-0.36380439065396786,5.539681687951088,5.4302510060369968,6.2287792190909386,7.0924622658640146,3.0134361423552036,6.8213464040309191,6.3691441901028156,6.206531161442399,-6.8306428007781506,-2.6135278772562742,-5.5629752390086651,3.0751927010715008,4.7638292331248522,5.6780366692692041,-9.2375768907368183,4.0452033467590809,7.7327588945627213,4.4788796920329332,-3.4689026884734631,-1.8474340625107288,-9.8242248129099607,4.2535707913339138,9.7644014935940504,-9.7039424814283848,5.8387169428169727,-8.6842181161046028,4.3461329210549593,5.4561164416372776,0.94915555790066719,-7.542452672496438,-6.0020474158227444,3.589113550260663,2.2315455786883831,5.5866367369890213,-5.3962394408881664,5.4037530161440372,0.87706288322806358,0.79596353694796562,-2.2407500259578228,-0.28562555089592934,-0.5085578840225935,-7.3322824854403734,6.3282880745828152,-0.46220269985496998,-8.2407018169760704,-1.4754241518676281,2.5463462714105844,-3.558118212968111,-1.2927549425512552,-7.332251314073801,6.8521852325648069,4.6773356013000011,-8.0204340815544128,0.56440680287778378,5.9852186404168606,-6.4301854092627764,7.8738544508814812,-4.1281041502952576,-1.0464080609381199,-6.9802101142704487,3.6086330842226744,-9.7036469634622335,-9.1945125907659531,7.8268932923674583,6.5957043319940567,-5.9971622936427593,5.6933620665222406,8.3363748528063297,9.4522946141660213,4.7157325223088264,-2.6833823882043362,0.39225870743393898,-7.3078228253871202,-2.5782052148133516,8.105012709274888,0.94874647445976734,5.5820819269865751,-1.9489311892539263,4.3135652132332325,-1.9093491695821285,9.5685701444745064,-1.0414286702871323,-3.2915914058685303,-1.7767059337347746,-1.0965639259666204,-9.9498340394347906,-6.8607003893703222,-7.7914195787161589,9.6111577935516834,-5.2708102948963642,-6.5085893124341965,-9.8605467565357685,-6.209336007013917,-0.31024022027850151,5.7926936075091362,-2.1984149981290102,-8.760812496766448,-2.9756234586238861,8.69658587500453,3.518947521224618,2.9510950203984976,-0.94589080661535263,2.413284070789814,0.065474910661578178,0.43690226040780544,3.0163723509758711,-3.8297952804714441,-7.3692305944859982,5.34141905605793,-6.7698047682642937,-0.10871494188904762,-7.1719509176909924,1.0209484957158566,-0.91854625381529331,1.9931831955909729,-0.56993784382939339,1.0547325573861599,6.8901784997433424,3.2301773689687252,9.5911437924951315,-1.6461262106895447,-6.4431576803326607,9.848894476890564,-9.630371555685997,2.3452664725482464,-3.1062992662191391,-7.5717133935540915,2.2130135353654623,-5.881415531039238,-8.9507979433983564,3.9389735087752342,2.3278710711747408,4.5291897095739841,2.0915625151246786,-7.1087136678397655,3.8494072388857603,-3.0124276597052813,-9.8716219794005156,7.6493932120501995,3.3518530521541834,-5.4056479502469301,7.2749361488968134,9.8519896995276213,2.3910353239625692,6.1307868082076311,0.13401178643107414,-7.6638261415064335,-5.9259420167654753,2.6925561018288136,-6.2094972282648087,-3.0198857840150595,4.7796826809644699,-7.873065359890461,-2.6094870362430811,2.3514396976679564,0.64709536731243134,-4.2680782545357943,6.4088208694010973,-6.9475195556879044,-6.9611485581845045,3.9762063696980476,8.1005648896098137,6.19424132630229,6.6140978969633579,3.1434842851012945,-7.4595174379646778,7.8904400020837784,-5.374744962900877,6.661444716155529,-1.0985251795500517,-2.9126230347901583,7.5447097420692444,3.9367722626775503,5.3315278887748718,6.9893466215580702,9.9488014820963144,9.5066657103598118,-1.4692533202469349,6.2595133669674397,3.6412858683615923,-0.90830368921160698,-5.8600334264338017,-9.5817656721919775,-0.73564926162362099,-4.0570676047354937,-7.1351862791925669,-1.0757719725370407,-0.49947259016335011,5.364251472055912,-3.0253889132291079,-7.7114100567996502,-5.6688067223876715,4.3654507212340832,-9.8696157895028591,1.3674268405884504,2.3429987300187349,-1.2202479783445597,-8.7077033240348101,9.6302430517971516,-4.5048748143017292,6.5690390300005674,5.8391068875789642,-2.130416501313448,-5.9100759867578745,9.35292256064713,-5.43037174269557,-8.2578437216579914,-9.5794162712991238,-1.2492684368044138,3.545451108366251,8.3968843147158623,6.4348214026540518,-9.9565569683909416,0.14703258872032166,-8.8232019636780024,8.444605665281415,8.4875607304275036,-9.5666590146720409,-6.8380562029778957,-7.2105787042528391,-8.1962605472654104,5.4489962197840214,1.2795868143439293,6.0156769491732121,5.4826100915670395,6.2279301322996616,-7.1781394351273775,-2.9894641041755676,-3.9231440145522356,3.7185949739068747,-1.5741661842912436,2.9890065547078848,-3.7667333707213402,-7.4877129308879375,-5.9912097733467817,5.737370727583766,7.9899416584521532,6.9495943933725357,1.8331020604819059,8.9464231207966805,2.5335395056754351,1.1985699739307165,4.365639491006732,-6.6969622205942869,4.155984316021204,9.6285101491957903,6.3702311459928751,4.4749988149851561,-8.6948032584041357,6.44164620898664,4.7479631099849939,-0.98389506340026855,3.6757399886846542,-1.8379031494259834,-9.6381685230880976,-8.6983647104352713,6.5843218937516212,2.6981980726122856,8.6151057668030262,-5.9172316547483206,9.0876105893403292,-4.5286755729466677,6.5496882982552052,0.61135829426348209,-4.9010652676224709,7.7960869669914246,8.8337934948503971,9.5674153417348862,-0.45019832439720631,-6.4831634052097797,-2.5273238401859999,3.26827647164464,9.9227627646178007,-8.1260591465979815,5.3239377867430449,-0.57749828323721886,-6.0135726258158684,9.8849091026932001,-4.3325554113835096,2.7412452269345522,-7.8913711942732334,9.7243543434888124,-2.7763946168124676,-2.8642682358622551,0.24381570518016815,-2.1893628686666489,3.3783274423331022,-0.45057200826704502,7.2363317850977182,1.0284470301121473,5.1093214005231857,-7.6351031567901373,-3.1787376664578915,-5.0439067743718624,7.0588819123804569,-1.3715651165693998,8.105153338983655,3.3123099897056818,9.9941011611372232,-9.141628285869956,-3.346593901515007,-6.2036506924778223,-4.7571587655693293,6.4326681010425091,-6.1470971722155809,5.7378567196428776,-3.8419897947460413,7.6775678899139166,-3.1163358688354492,3.7431063503026962,-9.6114629041403532,0.14297314919531345,2.9497979022562504,-2.746555432677269,-1.3571002427488565,-8.783712238073349,-7.851575780659914,-1.4341287408024073,-3.4016796294599771,7.9705192986875772,0.51799368113279343,5.9198811091482639,-4.558073952794075,-7.548882020637393,5.9398983232676983,-8.1287560891360044,-0.003575468435883522,-0.09281977079808712,-0.021810270845890045,-6.5651440154761076,-0.37544122897088528,9.9593400023877621,6.62757633253932,9.6755511127412319,-3.0122941732406616,-7.6281149685382843,-5.7282576616853476,5.1735134795308113,-8.7588307727128267,-9.6687872707843781,-3.3076574839651585,8.200719365850091,9.4905242789536715,7.2417089063674212,-8.5982757434248924,8.7795912194997072,-1.41022689640522,-1.6833806596696377,7.4213180132210255,-9.9080154486000538,-4.0156439039856195,9.0729525405913591,9.1134989820420742,-9.4224592298269272,-3.2722711842507124,2.938258945941925,3.3182056993246078,9.0832927729934454,2.901785047724843,-9.6986019145697355,-4.4023758172988892,9.2696824576705694,-4.4467831216752529,2.9161174595355988,-8.8137564994394779,7.1945231966674328,-1.6484990436583757,-6.3233614061027765,3.2648763991892338,-7.2222550120204687,-4.4399652909487486,-2.4966014642268419,-0.38075054064393044,0.72573867626488209,-2.5099840760231018,-5.3023071028292179,4.1245595086365938,1.4717721939086914,-3.9246471971273422,-1.5453945752233267,6.5534403827041388,3.6726416554301977,6.0884098149836063,7.9038863349705935,0.61777196824550629,2.8935533948242664,-8.047992279753089,-2.6062305364757776,-2.916568685323,1.2301612086594105,-4.6804781723767519,-4.7966015059500933,3.5185302142053843,-4.062584051862359,0.14988681301474571,-0.85225422866642475,-3.8367496058344841,-4.2505770269781351,0.55195257067680359,-3.3330620545893908,1.2261006888002157,7.0743645168840885,-1.1554311029613018,0.6695217452943325,-7.3479433357715607,3.1163764372467995,-3.0611165426671505,-8.1856783013790846,3.3048029150813818,3.8226978946477175,8.0836235173046589,1.4605968631803989,8.2515691593289375,4.1230036783963442,-4.6770666632801294,-7.4593680910766125,-9.5994868408888578,1.4246683102101088,4.4003791082650423,-2.8282146900892258,6.195759791880846,-7.8650511056184769,-7.9139154218137264,-9.1764780972152948,-9.0673734527081251,4.6543876267969608,6.2929582595825195,5.7495963107794523,-6.5346814692020416,-8.391425758600235,5.3072877880185843,-0.41402697563171387,1.4486955758184195,8.2266323734074831,5.0104425009340048,-9.4927693251520395,-4.9740438628941774,1.2448356673121452,1.953148515895009,6.5672001894563437,-5.0662861485034227,-9.0712592843919992,-0.6547855120152235,-4.9800273030996323,0.68115608766674995,8.1904490012675524,-3.1234933342784643,3.4475845936685801,3.5543710272759199,-1.6860384959727526,2.7510632481426001,-2.8798886761069298,-2.2889236081391573,-9.9390216451138258,-5.1367889530956745,5.988103374838829,2.0535460393875837,-6.0516216792166233,-9.6055316925048828,-0.17115284688770771,3.434179276227951,-1.7487992998212576,7.930232472717762,3.4173092897981405,-5.2826613560318947,-5.6893739104270935,-1.3072788156569004,8.5650132782757282,-7.8216867242008448,0.91124339960515499,-4.7320974431931973,7.6383134722709656,-2.8653335012495518,2.3399003315716982,6.7049692943692207,-9.5809387974441051,-6.8383653648197651,7.5933382101356983,1.2354354374110699,3.9634844940155745,-5.715999798849225,-8.8085857313126326,-5.9003768488764763,-7.6336669828742743,0.95903734676539898,-1.4592271484434605,-5.2306170482188463,9.019307903945446,7.5080904550850391,8.4764156304299831,3.1176452338695526,-1.7364516947418451,-4.5435688551515341,-3.7617058306932449,-2.9898476414382458,9.6307452023029327,3.9347687363624573,-8.341738898307085,0.39434912614524364,7.8258444648236036,8.9680597931146622,6.181091321632266,5.6019693054258823,-7.7017616014927626,-3.5072183050215244,-5.8180016838014126,-3.1542669236660004,6.235867515206337,6.2254551332443953,-8.7754485756158829,-8.9642007928341627,-1.3227170612663031,9.0944191999733448,9.9036433827131987,-9.4655109662562609,-6.8428056873381138,-7.0351623836904764,0.025840513408184052,-5.6984126847237349,6.7780415061861277,-1.4562742225825787,4.3992079142481089,-2.5124725420027971,-7.1259548421949148,-5.923010278493166,-8.0337187275290489,-2.7106381952762604,2.3039090353995562,1.7992542497813702,0.066268416121602058,-6.2266514636576176,8.6688798293471336,-2.1365620568394661,-9.1984277591109276,2.0246588904410601,8.4420657437294722,5.799099188297987,5.4601813666522503,9.2683503124862909,-6.8361472431570292,4.873309014365077,5.7047208305448294,-0.75687812641263008,-0.85059828124940395,3.9947586413472891,-0.091405352577567101,3.750316770747304,-8.425926435738802,5.454406850039959,-7.7839504275470972,-4.8548184428364038,5.0664715096354485,-7.8132196422666311,3.2174895331263542,-3.6533133033663034,-1.2366400100290775,-4.2085799761116505,6.3963868096470833,4.073238056153059,-1.0878800973296165,-4.0007260721176863,-0.20304713398218155,7.3868958279490471,-8.4416835848242044,0.62400205060839653,7.6025477144867182,-3.9804248604923487,0.99941681139171124,-2.8015648573637009,-5.9005013760179281,-9.7265946492552757,5.1237320993095636,-5.4344885423779488,2.5511039793491364,-3.5953208524733782,-6.55751739628613,7.8051475528627634,1.1150603089481592,0.81869947724044323,-0.11780135333538055,0.11273182928562164,-5.3160660527646542,-7.1221121586859226,-1.3390285149216652,-5.0521825067698956,7.9686474334448576,9.0575545281171799,-9.6808967832475901,-6.8322335463017225,-9.3491879012435675,8.198948884382844,-0.26595775038003922,-9.9518344551324844,-0.4816870391368866,4.2860077135264874,-5.0682469550520182,-2.026534965261817,0.026901243254542351,-7.8707261476665735,-3.294347170740366,-8.0928461533039808,3.5347163397818804,7.9776286333799362,0.004581911489367485,-2.9917353019118309,-2.0951643865555525,6.5722170192748308,-0.74842735193669796,1.1815684009343386,-1.3797979895025492,9.7352578863501549,0.47945033758878708,-1.878094132989645,-5.1280295941978693,-6.7933515552431345,4.1404361184686422,8.3099537622183561,5.3930248972028494,0.56956775486469269,-7.2746612690389156,-5.2319274097681046,6.9960613362491131,2.8030113503336906,-9.788134740665555,-9.1805847082287073,1.9128152076154947,8.685287619009614,-6.3708410691469908,5.2741792425513268,3.1306490954011679,-3.1805508304387331,4.4822461809962988,-6.8883226532489061,7.9611911904066801,3.740477729588747,6.2093087285757065,-0.14807197265326977,-8.6455672793090343,-6.0492527484893799,-9.7909129410982132,4.1262005921453238,9.0534627344459295,1.5483269467949867,2.7310851588845253,1.3483650051057339,1.970729622989893,2.0528672728687525,2.5403494294732809,-4.3470406997948885,-0.71299721486866474,-3.3441176172345877,-4.5847407728433609,4.2618731968104839,9.3029304035007954,-5.6485572922974825,4.6976224053651094,-7.0601180009543896,0.59678096324205399,-9.9022678565233946,-7.4158638250082731,1.5767133049666882,-0.17939282581210136,4.9448534287512302,8.1516939774155617,5.5208204779773951,8.4298948291689157,1.2425380758941174,3.3375295344740152,-6.1410097125917673,8.0497906636446714,-7.1681748609989882,4.485133346170187,1.6362624429166317,0.66296916455030441,2.5228320434689522,1.2382525857537985,-8.6887032818049192,8.9639529585838318,-2.8424766659736633,6.4947309903800488,-3.0561155918985605,-4.1346986964344978,8.1190549209713936,-3.0438014306128025,2.8294101264327765,-6.1039046384394169,-8.3252277597784996,-2.1029454935342073,-4.2048480268567801,9.119257964193821,7.368753831833601,6.6457875538617373,-4.2484519723802805,-3.7322547845542431,-8.0061149504035711,1.2260441668331623,6.1243998166173697,-7.2121559176594019,5.2955137100070715,1.6990437917411327,-4.1709006484597921,-0.32715304754674435,1.5388055797666311,2.7054694388061762,-9.1750425472855568,-4.9400857742875814,-8.0215688515454531,1.4923275541514158,1.5492925606667995,-1.0398424882441759,3.3673701994121075,-4.6089538652449846,-2.687570983543992,9.9945367965847254,-1.8199033197015524,-7.1150302048772573,-2.3126307968050241,-8.385741738602519,0.83861193619668484,-5.4491035174578428,-3.0827823001891375,7.6779348496347666,3.0511561594903469,0.7816746924072504,-2.3933603335171938,-5.2070658933371305,4.8435681872069836,5.8506385516375303,-8.317738575860858,3.7677686661481857,4.888079697266221,-6.0444115288555622,-8.4245345182716846,8.8483637291938066,-5.5506559275090694,-9.8741388227790594,5.3488065302371979,-2.6085261814296246,-1.4994734432548285,-1.6500942595303059,6.8658454157412052,-5.7359656412154436,-4.374498538672924,-2.1968954522162676,-3.2218043319880962,-8.8653546757996082,-0.016027288511395454,-9.370559873059392,9.0002184081822634,6.6709350142627954,-1.5950848162174225,-8.5904403869062662,0.46842829324305058,-7.1255935356020927,0.14946962706744671,-7.8638984449207783,-8.5411470662802458,8.9412684366106987,-4.1012376453727484,-9.5010596141219139,-4.3089306447654963,-0.19730203785002232,3.9447265677154064,-0.98046727478504181,1.2865832727402449,3.6051532719284296,-8.1888522207736969,9.9607396218925714,-9.849018631502986,7.5438615027815104,9.6804145444184542,-1.2725979369133711,-8.5534573998302221,2.0414923690259457,-8.637659540399909,6.8561151530593634,-9.2724906094372272,-2.7496671210974455,6.3447524514049292,-3.7454213201999664,-9.2960796505212784,0.78931919299066067,6.087761027738452,-3.0002808943390846,-5.7209363766014576,8.2223519403487444,-6.9307959452271461,-5.8874274138361216,-9.9925121571868658,-4.1518257837742567,0.26409787125885487,-1.3069974258542061,-6.7056682985275984,-2.1670675743371248,-1.9046605844050646,8.3696212526410818,8.2245368976145983,9.7917808312922716,-9.5394135732203722,-8.9239215105772018,-4.3488198518753052,9.3847937509417534,-9.7712762095034122,-5.8392513357102871,-0.29716672375798225,5.5189497303217649,-3.0117610283195972,1.3324517197906971,-5.483856787905097,-7.1809989772737026,8.950211014598608,6.1966706626117229,7.4439532682299614,-9.4772843364626169,-4.7178388386964798,7.2826793603599072,-0.0078551750630140305,7.9781509097665548,8.7824811413884163,7.1606903057545424,9.7221031133085489,-0.61282027512788773,0.32970938831567764,1.4257702603936195,2.9208558518439531,-9.1755969356745481,5.7423085626214743,-9.0198648162186146,3.1320414785295725,0.22123241797089577,-1.7466711718589067,3.6976791545748711,6.893658135086298,1.7124086059629917,0.45153208076953888,8.8997632823884487,-1.678364984691143,-8.2802325766533613,-5.8689023554325104,1.3581445720046759,6.3359105680137873,7.6490444503724575,-2.5097844656556845,-1.94745565764606,9.1128249559551477,-0.75081568211317062,1.0409031063318253,-5.5414054729044437,5.5982517823576927,9.8178281541913748,8.2379425875842571,-4.8987877368927002,6.0745459608733654,-5.1059097982943058,4.9740583635866642,-1.0009660106152296,-3.2356699835509062,-1.9053606037050486,-3.395603122189641,-9.9016229528933764,3.42303148470819,-9.1097314562648535,-7.2565784770995378,-1.3144431449472904,8.1541308388113976,6.4771499764174223,1.4597825985401869,-5.4337766487151384,-5.4840992204844952,8.744436651468277,7.7469479199498892,2.9538294859230518,5.0122712831944227,1.2435741350054741,0.75057502835988998,-5.085414219647646,9.4432488363236189,-7.3166557401418686,8.9669964276254177,8.3091075345873833,-8.8295228965580463,2.2086867038160563,1.3975265808403492,8.2293333765119314,-9.5937982946634293,-2.9679352324455976,-2.0873966813087463,-2.8759608324617147,3.7263445649296045,8.6732101906090975,-9.356180289760232,-9.3221249617636204,3.0457729380577803,-9.6941279619932175,-9.2086548265069723,-9.8616629093885422,-4.9685170128941536,-5.8653963357210159,0.28381789103150368,-9.8726249486207962,-9.2075104732066393,9.3714830093085766,6.5150890499353409,-0.89820848777890205,3.8100171275436878,-5.0420292932540178,-1.3862929213792086,0.57493778876960278,2.9794986080378294,-3.5667931288480759,-7.0920662023127079,3.6433604825288057,-6.0402633622288704,1.2937020044773817,3.2496776338666677,-2.6679039094597101,0.53905108943581581,-0.16825737431645393,-7.9016131907701492,-2.4128808546811342,6.71153474599123,0.7646066602319479,-9.2557772342115641,-1.8479695729911327,1.1754505336284637,-4.2027938459068537,3.6438772082328796,2.6443455461412668,3.5156929492950439,8.2515045721083879,3.0374862626194954,-8.9682821184396744,-9.9175565410405397,-4.3727846257388592,6.6088392399251461,-5.2387645933777094,-7.9164836369454861,7.6595301553606987,-6.276540644466877,-9.8185824137181044,-0.91462594456970692,7.8818207141011953,9.7608818393200636,-8.8587718922644854,-9.3791843578219414,4.0485029388219118,3.1890027225017548,-2.4311396945267916,-0.16478667967021465,-9.5696482434868813,2.921975078061223,9.6352380979806185,-0.55313357152044773,3.4841373842209578,-2.1028778702020645,-3.068302683532238,-8.9631478767842054,-3.6263570003211498,-8.18205451592803,4.2097650188952684,-6.4792162179946899,3.8130517117679119,5.960227781906724,-6.4515445847064257,8.8901926018297672,-2.5327932089567184,-8.655404495075345,8.6166617833077908,0.23473775014281273,5.2374467439949512,5.7675455696880817,-4.8614868521690369,-7.0094841904938221,-8.4007662255316973,8.3220599964261055,8.862503319978714,-7.9065534938126802,-5.4445541277527809,-6.6211894899606705,-2.331731328740716,-9.4083821307867765,-6.6784675046801567,-5.0033251661807299,9.113971097394824,-1.4876164961606264,-2.3703843541443348,0.95021960325539112,-9.6590423863381147,0.47461547888815403,-3.1375643517822027,6.9559932965785265,9.3794682901352644,0.72370396926999092,3.2926954422146082,0.33240132965147495,6.6692283097654581,9.7203326784074306,9.631480323150754,-3.7100551649928093,5.1028911862522364,4.2922855354845524,0.44310674071311951,7.2950728889554739,8.2901800237596035,-6.9441975280642509,8.8721697311848402,-5.4431802779436111,-3.5308957379311323,-3.7646167818456888,8.0857963114976883,-2.0212511159479618,8.8325566984713078,8.7805785890668631,-4.8155065719038248,5.7810865808278322,2.7222874760627747,-6.5142902452498674,-5.6761246360838413,1.3732751738280058,0.63593553379178047,8.168599670752883,9.6548085287213326,8.3670960366725922,5.7832320965826511,-1.2180292140692472,8.5830678604543209,-4.3783239088952541,-6.4898928068578243,4.3716226052492857,-6.1387610994279385,5.8422321267426014,-9.6045218501240015,-3.198731942102313,-1.0876976884901524,-0.93498070724308491,5.7793243043124676,-6.8962939269840717,-6.0120065324008465,-3.7937588524073362,-1.7049838416278362,4.3366386741399765,5.886308467015624,-8.8134705368429422,-7.9993034340441227,-4.2928003240376711,-9.0950014349073172,0.31089059077203274,5.1382397953420877,-1.6036412119865417,7.6022158470004797,-9.5581217017024755,-3.3514370582997799,-7.6025868114084005,3.3234794158488512,-2.2813535574823618,-2.7091802004724741,6.8084277119487524,9.2446862626820803,-4.5578324887901545,-3.4905965067446232,-6.4554379135370255,3.455014917999506,8.4358321130275726,1.0304679349064827,-0.92533170245587826,7.9501478374004364,-1.8651563301682472,-7.6823774725198746,2.2818374913185835,-9.1571872867643833,-4.8467220552265644,1.1424581333994865,1.2939352449029684,7.169749466702342,1.9794212374836206,8.132832134142518,8.5098204389214516,4.5522618107497692,9.8643671534955502,-9.5810957346111536,-9.4760083314031363,-3.2720217946916819,7.1297492645680904,9.6960236504673958,1.0696475487202406,-2.4335620272904634,-0.87693345732986927,1.3794540520757437,4.4843422900885344,8.3409828692674637,6.8992273136973381,-4.6864064317196608,-4.4328563287854195,-3.0162743292748928,5.4774025268852711,-1.2956095114350319,4.6910094283521175,1.795577285811305,-1.7324650567024946,2.4598567001521587,2.8116569668054581,-4.4812586344778538,3.4861735161393881,-7.8816086985170841,-6.1973793990910053,0.64446923322975636,-8.4055138006806374,8.529564430937171,-3.6104642227292061,-1.0721414070576429,0.51944145001471043,-9.7474672738462687,-5.6824695598334074,-5.265858331695199,-3.2809437531977892,-2.8216074127703905,-2.7557302545756102,4.4416680373251438,-8.8851836510002613,6.7183863557875156,-4.0803874377161264,0.92838062904775143,3.2933179289102554,-9.2054647672921419,3.7536623328924179,7.8029365558177233,3.9548329543322325,8.8775726687163115,5.3639908507466316,-7.4056512583047152,-6.7806780245155096,-2.8555328398942947,7.0596158038824797,-9.0370506327599287,-5.7099772617220879,-7.5878041889518499,-8.2249848358333111,2.6798780355602503,0.71024289354681969,-2.9476043395698071,-0.38607995957136154,-8.845805274322629,8.5507634840905666,-7.3179777059704065,6.7487167380750179,5.6823479011654854,3.2212976180016994,0.34916922450065613,8.4872371703386307,4.9952665623277426,-4.5547696016728878,7.9873472917824984,3.3460737578570843,-2.5382472481578588,-0.32144139520823956,-2.4654535204172134,3.1227413099259138,3.9132986217737198,-9.1899549588561058,4.4270128384232521,4.8048882838338614,-4.2424977384507656,-3.659445084631443,-4.2934877797961235,-0.64907037653028965,-8.9257451612502337,5.001083267852664,-6.7933997977524996,3.3296242635697126,0.99510213360190392,4.6816454920917749,4.4159004837274551,-1.9604571722447872,-9.4036309979856014,-6.826178478077054,-7.581656202673912,-4.8957794159650803,-3.3646041806787252,-8.9024127367883921,-2.8508586157113314,5.6193016842007637,3.6035285983234644,4.5052584819495678,-0.12058035470545292,-6.5939442161470652,-4.4204141292721033,6.099772984161973,-1.1153291910886765,-5.3376450948417187,-9.8010725155472755,-6.6257672477513552,0.72989344596862793,7.3192303627729416,-5.6951573304831982,1.4907802548259497,-4.4561672117561102,5.1977153960615396,-1.9972194544970989,-7.2673091012984514,-1.664044139906764,-7.5897941738367081,-1.6706608142703772,1.203759741038084,-8.4099446889013052,-5.9403739217668772,0.13552863150835037,-2.1702109184116125,5.2651555277407169,-8.5309257917106152,0.73023021221160889,-7.0207393821328878,2.4332278035581112,-4.7402082942426205,-8.68076017126441,2.4638118781149387,9.2863330151885748,-4.6008627861738205,-6.7008049692958593,-0.42909313924610615,8.2316835876554251,9.9062004033476114,-6.4896651450544596,8.1979345344007015,2.6858620904386044,1.2842532806098461,4.4449755176901817,6.7036388628184795,8.0584981106221676,-0.82211344502866268,2.739401226863265,1.1165195889770985,5.3448189329355955,-9.6280740574002266,0.95932018011808395,3.2943530101329088,8.1911453418433666,8.5799027234315872,2.4252181220799685,0.64107503741979599,-5.4517628066241741,-7.7774553373456001,4.3081626202911139,7.289271205663681,-9.2187110986560583,1.1225709971040487,7.0508353691548109,3.3901828248053789,-1.1971587035804987,-0.64626218751072884,-1.7285122908651829,8.893992155790329,1.32631023414433,-8.7038060929626226,-4.8689942806959152,6.8131644930690527,8.8557665888220072,-1.1307941004633904,-5.2563770767301321,-3.9294914808124304,-2.9632705077528954,-3.6873687338083982,6.3937402796000242,-0.4069924633949995,-0.32225720584392548,3.8232171162962914,-3.1898182258009911,8.7251322530210018,3.2979230675846338,8.1931009609252214,1.4479926507920027,-3.5874285455793142,6.0884846281260252,9.1612708196043968,-6.5211849473416805,-1.5553827490657568,-1.3177974615246058,-8.2218678947538137,-4.9336932133883238,-0.5817977711558342,1.7249338887631893,-9.0360397938638926,-8.7208079267293215,9.3811854626983404,9.5842232462018728,2.0402521826326847,-9.4814722612500191,4.8957092221826315,2.185013797134161,3.526983791962266,-1.9833026267588139,6.6328147985041142,-2.2815513703972101,-6.0338218603283167,9.5560244936496019,8.1038178130984306,0.86612642742693424,-3.0130491964519024,-0.31779008917510509,-1.0979529935866594,6.7041064519435167,-4.0827314555644989,1.5324726328253746,-3.7323698494583368,-9.9400107935070992,-1.7614060081541538,-3.9507145714014769,0.34024579450488091,-1.4888508338481188,-3.1158978771418333,-8.8955672457814217,-7.7986912056803703,7.3969233501702547,0.09088246151804924,7.4616097006946802,7.2743762284517288,0.44140677899122238,-1.2761837802827358,-8.8207269366830587,-9.957615602761507,2.3545647133141756,-6.8307666387408972,-4.6948725171387196,-6.722354032099247,-2.6041918434202671,-8.6522544827312231,1.5589192789047956,0.75641101226210594,-7.0000327285379171,-9.550045058131218,-7.6072884909808636,4.3023508042097092,9.6100782789289951,-3.4142125677317381,-2.6705743279308081,-4.3426721729338169,-7.2911662235856056,-2.6306986063718796,5.8485803753137589,-2.9095080681145191,-0.10204531252384186,4.9245098698884249,6.237500011920929,-6.3371725659817457,-8.8592877890914679,1.9501376617699862,-4.0362251084297895,3.1646492891013622,8.2607049494981766,-2.3317708726972342,9.9270025826990604,3.1325633730739355,8.992714025080204,0.54476816207170486,-4.0814175363630056,3.6155126616358757,5.9214106667786837,1.149201150983572,-5.3761681634932756,2.7417123503983021,-0.040427139028906822,0.54115228354930878,-4.853487890213728,7.4290694482624531,0.37035334855318069,4.5288102887570858,-4.2853631544858217,-4.0984927210956812,-3.3671172708272934,8.8600811082869768,-8.6166654154658318,-0.29562691226601601,-8.6014385055750608,-4.3769522570073605,-3.4365395177155733,2.0803771167993546,4.8982965853065252,5.6708258390426636,9.5699994266033173,2.9805160779505968,-6.4661762956529856,2.975026611238718,1.2723566312342882,4.4979893695563078,-2.2925524041056633,9.0718045085668564,9.8185247369110584,-0.054591633379459381,2.4784956220537424,-3.9239824842661619,9.6264344826340675,-8.5154967661947012,0.04586217924952507,-9.1942747309803963,-8.1753972824662924,-3.9021121338009834,-2.7985850721597672,4.1807485651224852,5.8412449900060892,-6.1953289899975061,-4.8943051137030125,1.4139939472079277,4.9963600467890501,-6.1765762511640787,-9.717023391276598,5.9878650214523077,-1.9524593278765678,5.0161393545567989,6.2542495504021645,-4.827679181471467,1.1960374843329191,1.8020868021994829,7.6729769259691238,-0.27666692622005939,-9.9409528821706772,2.4049098137766123,-0.68066277541220188,0.1008065789937973,-5.7437478005886078,4.8307488113641739,-9.6046113315969706,-4.7026470582932234,2.610932718962431,1.9463062938302755,-8.4300260990858078,-3.4486350510269403,-1.2092513404786587,-3.8872106280177832,7.6510227378457785,-9.2607068829238415,-4.7005755174905062,-2.5726809911429882,0.95063998363912106,-2.5937092769891024,7.5282396003603935,7.1231004316359758,-2.0509114861488342,-9.6692854911088943,8.3187535125762224,-6.7095707636326551,-7.7557986229658127,8.2925613690167665,-6.9209277722984552,-0.033044926822185516,4.6139928977936506,7.3787475842982531,-5.389214688912034,3.4687595348805189,-0.55839185602962971,-4.8918503988534212,2.6703864429146051,1.1850452236831188,-2.944838022813201,6.1074057873338461,7.1691937744617462,-7.3600982502102852,-1.171270627528429,-5.5453677754849195,-0.99616771563887596,-2.5907262787222862,-2.3365085013210773,-9.6983217261731625,0.30675056390464306,-4.4431917928159237,3.2755816262215376,-7.2995041962713003,-2.7670056000351906,-5.0630631856620312,5.0970772095024586,6.5767782554030418,-4.0877317078411579,-2.5067674182355404,8.7600603513419628,-9.6655281726270914,-8.5319947265088558,2.7646430488675833,5.3558222111314535,-4.6959773357957602,-5.2910412102937698,-6.5295845549553633,-2.727587977424264,-2.5710796564817429,7.8642716445028782,-5.1863310299813747,-6.6655832249671221,-8.4572359267622232,-0.76420902274549007,-4.0609730035066605,7.2267765365540981,0.43338468298316002,3.8964485470205545,7.6108385249972343,-4.6367725450545549,9.7638772334903479,1.4848179463297129,-4.6646861545741558,0.61984182335436344,-2.3183917719870806,-5.2104516699910164,7.9388199374079704,7.7468284033238888,0.94511355273425579,4.5235664583742619,7.5815795548260212,3.6077155545353889,-5.1245684269815683,-8.6215141229331493,-1.7878533527255058,-8.4512349870055914,0.093585513532161713,-7.1081950701773167,-7.4345218390226364,7.99147161655128,-7.3363998159766197,-2.8716862760484219,-4.4311857596039772,5.0609819125384092,-0.076878098770976067,7.9098716098815203,1.2122874427586794,-5.0848618056625128,-1.272329306229949,-4.0385815035551786,3.5607163980603218,4.9606083240360022,-7.055780841037631,-6.5085722785443068,-9.5742581691592932,5.4429542645812035,-0.26755432598292828,3.2145193684846163,6.4271295350044966,0.76622338034212589,-2.083562333136797,1.567928921431303,-7.8185269702225924,-5.982771459966898,7.5601037684828043,2.6641743164509535,-3.2221642974764109,5.0847053527832031,-1.3570177182555199,-7.3967230785638094,3.2752389460802078,6.9410706590861082,-1.4253001566976309,4.9803334847092628,4.4649947434663773,3.1667666416615248,3.8470494467765093,-2.6398396585136652,-7.7850830368697643,-3.8905833382159472,-9.0341175813227892,3.5858182609081268,6.8476174026727676,7.9058185685425997,-6.9071783684194088,-8.9468138199299574,-9.0998633205890656,-1.4028220996260643,2.7690388634800911,-0.76372155919671059,4.1318268608301878,3.614160567522049,3.1967648863792419,8.0275486502796412,-0.98969366401433945,6.218659421429038,-2.9909771122038364,-9.3522699549794197,-3.6011282727122307,-4.1628293972462416,-4.673633836209774,-9.7638434916734695,-0.91756271198391914,-1.4764292351901531,5.6539108604192734,5.2799535728991032,0.17981929704546928,2.2230051085352898,2.0469548087567091,3.1695650517940521,-9.1200714278966188,-1.0404817759990692,-7.3771390970796347,-7.5767840910702944,-3.0101996567100286,7.5744243711233139,3.3505430072546005,-7.4235725868493319,-7.9844470135867596,5.3990584146231413,1.9748950842767954,-7.9382248409092426,2.2551149688661098,1.7173776403069496,3.966092336922884,-1.8859840370714664,2.2663524374365807,-9.4144880026578903,-9.2998560890555382,-2.6812832802534103,-4.3280339427292347,-1.26643106341362,-4.9068144429475069,-8.8303027581423521,9.1015530470758677,9.8022116906940937,5.7720404677093029,-9.3157357722520828,-9.5711188856512308,-1.7951077874749899,9.6234801132231951,1.8304165173321962,3.8104993849992752,3.0632717628031969,4.4086196646094322,-4.3291841447353363,-0.59787618927657604,-8.5050395876169205,-4.2003373801708221,4.9296968523412943,-6.5848858561366796,7.823442630469799,8.6004297900944948,7.4236276838928461,8.9106195420026779,0.78279043547809124,-3.6410665325820446,4.5948366541415453,5.4197603743523359,9.9127324111759663,3.2937904726713896,-1.2634217739105225,5.6703142542392015,0.9717936348170042,-7.0642937626689672,-9.5852462016046047,0.76709287241101265,-7.470009122043848,-8.4432943910360336,-6.4488179609179497,-5.2834413573145866,1.2011445220559835,7.6360698509961367,-0.57387628592550755,-5.1386637799441814,-5.522111477330327,9.8724355455487967,6.0243695601820946,-8.4206766076385975,-6.3117322232574224,-1.2834474258124828,9.0991825796663761,9.9617659207433462,7.3999861534684896,-8.4325824771076441,-6.4136804826557636,5.2721560653299093,9.1271095164120197,-0.67020797170698643,-4.1853074636310339,-2.4624957423657179,-7.1658829506486654,3.0052706226706505,9.5834570005536079,9.1619615629315376,5.0881381519138813,-3.6619627010077238,-6.6070662345737219,-4.9621779285371304,0.67559449933469296,-5.2831661328673363,5.8268418069928885,-8.2696260046213865,-7.6042461302131414,-4.5646917447447777,1.2258886080235243,3.5099229030311108,-8.7256630230695009,7.7815812360495329,5.0359734427183867,-0.39423055946826935,-5.8329378068447113,5.8143129665404558,1.1581524088978767,5.0676236674189568,-8.4489037655293941,-0.72557511739432812,5.2590745314955711,9.2657702602446079,9.800914702937007,3.9735672250390053,3.7444605864584446,-6.8508158251643181,-1.6615488938987255,-5.6521944981068373,3.5671043395996094,-7.6772581692785025,8.3219671063125134,7.3012991808354855,-7.0645322930067778,6.4057744015008211,1.8504944164305925,1.2597496900707483,-7.3868708591908216,8.8614900223910809,-4.9370460584759712,3.0669348128139973,5.9735012240707874,-3.3648020308464766,7.7723194845020771,9.3737151101231575,4.0300074592232704,-7.6645230315625668,2.3614268004894257,8.5003325622528791,5.0895185675472021,-0.4613171424716711,6.6428611241281033,6.5670434664934874,-7.7003289852291346,0.57076324708759785,-7.1820234693586826,-8.2684274576604366,-7.4602673482149839,-4.7133015748113394,3.5404735151678324,4.7384753916412592,-0.44397734105587006,-1.9270963408052921,-8.7081367336213589,2.345928130671382,8.0141888093203306,-5.5285407695919275,1.8153204582631588,-9.9089655000716448,0.01684100367128849,3.0468270927667618,8.0230502318590879,3.4053879044950008,-5.6453842390328646,-1.9728713482618332,1.9513125810772181,-4.2893563024699688,8.7886690720915794,-8.838758310303092,6.9890878163278103,5.5990619771182537,3.434771504253149,8.2047771196812391,-2.3108070436865091,2.2660769335925579,5.9551188815385103,7.6831668801605701,-9.014106746762991,-0.092085134238004684,-7.674773596227169,-9.9198135919868946,-2.307039899751544,5.5804650764912367,-9.1233374737203121,4.067086037248373,-4.4848618749529123,2.9265108238905668,5.8675182890146971,-4.6199923474341631,-8.2113412208855152,-8.0118854250758886,4.241676302626729,9.8537296988070011,-8.36479676887393,-7.1392816677689552,-9.9069678038358688,-6.4078783430159092,2.7887170389294624,9.9673733673989773,1.644342141225934,-3.5415412858128548,-2.684340113773942,4.2957650497555733,-1.0766968782991171,3.9556362573057413,2.3786857537925243,-1.4284391328692436,-7.7764390502125025,1.38890047557652,3.2503821421414614,9.1727666649967432,6.6894886456429958,-9.7642020601779222,-6.9440235663205385,-8.2040552329272032,-5.5562857538461685,-4.494630116969347,-1.2483328208327293,-0.72965124621987343,-3.2484226673841476,3.7602821085602045,-0.93849373981356621,6.7357858642935753,8.3531521540135145,-8.5716038569808006,-2.9460131004452705,6.3578760158270597,-3.1776739750057459,-7.1664445288479328,-6.4331741724163294,-2.3582878895103931,4.2555007990449667,2.2020411118865013,9.7050629649311304,-7.0065941847860813,0.17155972309410572,3.4043456427752972,-3.1626769714057446,4.8881950881332159,-4.1050372272729874,6.639367351308465,7.8472036588937044,7.9520346969366074,9.8472919035702944,3.4351786319166422,-4.952628230676055,1.1773665249347687,7.9992720484733582,3.7654595542699099,6.078836340457201,7.002499895170331,-8.9841288048774004,3.747184369713068,-1.0721906460821629,-0.30811883509159088,1.4468144625425339,-3.3892384637147188,-2.9308079183101654,1.9113722816109657,4.4340302515774965,2.7465512230992317,1.2865063827484846,2.3128631804138422,-7.7084304206073284,4.4099387805908918,-2.1588018350303173,-2.9823799896985292,-4.8604319430887699,-9.2796272691339254,-2.6955066993832588,-3.3810393698513508,-5.1286372914910316,2.9930800292640924,4.6961535234004259,8.2523827999830246,-2.2021378390491009,8.6694001220166683,6.6079968400299549,0.60302035883069038,-5.0367461517453194,7.4074664525687695,-2.7111954428255558,-7.0617505256086588,-6.8410609103739262,2.2893040627241135,-3.666521618142724,-3.2287865597754717,-6.2156571540981531,-6.5497593116015196,-1.8047230876982212,8.0191291868686676,-2.4956152774393559,-3.8059091940522194,-5.9157759603112936,-6.4465329889208078,-6.8799169827252626,9.2352957464754581,-2.3842384479939938,8.1044641602784395,-8.2707165088504553,-5.932350717484951,-5.0184769369661808,-5.5418406054377556,-1.7150207050144672,-4.3529243394732475,0.40067066438496113,-5.9280622843652964,7.0572185330092907,-9.3279822170734406,4.6028828993439674,0.65300355665385723,-4.9691399466246367,3.664956446737051,-3.0768927466124296,6.6636618599295616,-3.8349897507578135,5.3273072559386492,-3.9468294847756624,5.6368967425078154,-0.67632629536092281,-7.015973161906004,2.5390911940485239,-5.4942034929990768,-1.0780715756118298,0.85109851323068142,4.4127967860549688,5.8756960183382034,-7.1768955420702696,-2.0833534840494394,5.0780555326491594,6.8794552329927683,3.0042330082505941,-7.8557285573333502,8.770153671503067,-0.027096150442957878,4.5950775500386953,9.4684977177530527,-2.9587053600698709,-6.9609315879642963,7.6228248607367277,-3.1824276782572269,-7.0619351137429476,-9.9434336833655834,0.71008411236107349,-5.6162397284060717,7.8589189797639847,4.8514326568692923,-1.9712197687476873,9.7094094846397638,6.0453625861555338,4.4091110862791538,3.9301398582756519,-6.1392929404973984,-3.0964207276701927,-1.5431159269064665,4.8506826627999544,5.4236298985779285,-5.0521738920360804,8.1134352646768093,2.5066351797431707,9.0175638161599636,-1.8047929648309946,6.8447042163461447,-1.0561040416359901,-9.9405577778816223,9.0454275999218225,6.5018209349364042,-3.8954173773527145,9.7201866004616022,7.1763482876121998,-7.1141956746578217,-8.2866813894361258,5.7459011487662792,-8.6392694525420666,-0.20167822949588299,-9.6059264522045851,-6.8058791197836399,-6.4103412069380283,1.3953630812466145,-8.1326043047010899,-4.6805344987660646,-5.743279131129384,-7.2923235781490803,-2.0823567640036345,1.8299293518066406,-4.3772916030138731,-9.1399278491735458,5.2326456643640995,5.0758001767098904,8.9736879430711269,0.77340768650174141,-1.3369286525994539,-9.7597964387387037,7.1012559905648232,-9.1904327366501093,-3.6029985453933477,4.4034976325929165,9.5848237071186304,-7.8678011801093817,5.8655825816094875,2.8465732745826244,2.3571264464408159,-3.7757179606705904,1.5082837175577879,9.72453105263412,0.19355598837137222,-6.9044236652553082,-2.6485177222639322,6.3626994378864765,-2.1104193851351738,-9.8185442201793194,-0.27270713821053505,-3.3887957781553268,4.5094082783907652,9.6250484604388475,8.189628180116415,3.080965569242835,1.7884246353060007,-1.9470621552318335,-4.2735799588263035,-6.0583231784403324,-2.2376292012631893,-7.8339248802512884,-4.7754454333335161,-0.91135715134441853,2.820428479462862,2.9415546637028456,-1.290665864944458,7.7788760326802731,-0.43037960305809975,6.610086290165782,-4.2795911896973848,-7.0890804752707481,-6.1755250953137875,7.9497529845684767,-8.5014478769153357,-3.8344555906951427,-5.6950645614415407,3.0499495379626751,0.50198666751384735,-3.1099969055503607,-9.7179376613348722,-9.3782718479633331,-0.61494385823607445,4.6386480703949928,1.7582336906343699,-9.3662694841623306,1.1087846383452415,-4.6564963925629854,-1.7348279897123575,2.7460415847599506,-7.2789851855486631,2.0960077736526728,7.6027464400976896,-0.64044351689517498,-3.9341152086853981,-0.67426490597426891,7.6297982688993216,-5.9803566336631775,8.1460894737392664,-8.6740728467702866,-5.1423252932727337,-7.0611660182476044,2.9827543068677187,-8.8482628669589758,7.2460040263831615,3.5898063890635967,-6.123912651091814,-4.5998965669423342,9.5384416542947292,-7.4109633546322584,3.9389189518988132,1.4109336491674185,-6.4380691386759281,-4.6279858518391848,-2.5581698212772608,4.8398720286786556,3.7293021380901337,-1.6188576724380255,-8.1408350728452206,-3.0150547623634338,5.9746636170893908,-3.8284625578671694,-4.9701617751270533,6.4910847973078489,-4.3376825843006372,-3.4311500284820795,-7.3384772893041372,2.2122194897383451,0.77305960468947887,-7.1871396712958813,5.7435665372759104,-7.8770847897976637,9.8359544761478901,-7.1129641402512789,-7.5882826093584299,3.7342033814638853,0.75633974745869637,-8.197780279442668,-0.093142492696642876,-5.4457972198724747,-7.513838754966855,-5.0879352726042271,7.0719117764383554,-2.3786397930234671,2.2010582964867353,-6.8131154589354992,-8.0314933881163597,-5.3093586675822735,5.6089106481522322,8.9613856468349695,-5.9912852477282286,4.4688727986067533,8.3452394139021635,-1.5610269736498594,3.8197199068963528,-1.9674166385084391,-6.3713805470615625,-3.7928260676562786,-6.0276705212891102,-7.058420218527317,9.1314102243632078,-8.3882093988358974,-0.63535362482070923,1.6117009241133928,7.8575224429368973,1.3798381946980953,-9.0593726467341185,-0.8760663028806448,-4.0462811104953289,-5.846577500924468,-3.428025534376502,5.1748951617628336,-5.5368974898010492,1.3639238383620977,3.4680402837693691,7.3531547095626593,4.4713394250720739,9.8018304351717234,-0.63572109676897526,-4.5644001103937626,6.1273871455341578,2.9958812054246664,-8.224478717893362,-8.8137977384030819,6.501419935375452,9.3649829924106598,-2.7306949999183416,5.2091932576149702,-9.0888002328574657,4.5344934891909361,-8.767813416197896,-0.6400763988494873,2.2360377851873636,1.0871514026075602,-8.2462896034121513,4.6106491703540087,-8.8192795123904943,-5.6307555083185434,3.8922058790922165,-3.6956813745200634,6.6831877734512091,4.3370389565825462,-7.3861445114016533,1.069217324256897,-9.6643445827066898,-8.6393989250063896,-2.3777219373732805,-2.372541781514883,4.6903377678245306,-9.4930212013423443,-9.2073269933462143,-7.5447709672152996,-4.9656267743557692,2.7108427975326777,1.1349976062774658,-4.0951441507786512,-7.087695924565196,-2.9053813777863979,9.2552390601485968,-7.1969653852283955,0.60279239900410175,-8.8680669572204351,-5.6013411469757557,-1.7406227998435497,5.3526676632463932,2.2855363320559263,-6.9907709863036871,6.1120567377656698,5.3377177193760872,-8.978170407935977,3.8899618107825518,-1.4117374736815691,-7.0716529525816441,6.7288488708436489,-8.2368968054652214,2.4754043389111757,4.1208217106759548,-1.3493981584906578,0.66521794535219669,0.31809099949896336,6.1555093247443438,-4.3546525854617357,-8.6459596734493971,7.3557789251208305,8.5765303298830986,5.7453997246921062,2.9332961235195398,-0.091950790956616402,-5.4168660659343004,-1.2679342925548553,9.8284133616834879,6.1435249913483858,-5.7753440644592047,-6.2076583039015532,7.8869159985333681,-4.6026726625859737,2.880602153018117,-5.7195134181529284,-7.8619853965938091,3.611456174403429,-2.2559702768921852,3.9076168742030859,-4.6830864250659943,-8.6335044726729393,-3.3096615225076675,-5.4811564274132252,-1.7960401717573404,-6.0471025202423334,6.3479732163250446,-9.61402527987957,-2.9228759184479713,-4.7755059693008661,-1.9287851545959711,2.907969867810607,-5.7503306865692139,-5.8078159112483263,8.0380124505609274,-5.1246022526174784,-9.1900215856730938,3.3072159253060818,4.378160759806633,3.7480025924742222,-7.3203206900507212,7.3701832816004753,-9.3294501956552267,-0.06943313404917717,-6.9626062456518412,-0.52314690314233303,7.4700730480253696,9.517854880541563,6.5871300082653761,9.8941787239164114,-8.5380314383655787,1.3056268263608217,3.6701591219753027,4.3644700199365616,-6.3522625062614679,-2.475914191454649,7.3102430999279022,3.2559159584343433,2.1796171460300684,-7.174531351774931,-2.3484071716666222,-9.6792743168771267,0.43655875138938427,-2.7569837216287851,3.3746472653001547,-2.3033074289560318,8.3121017646044493,1.494501018896699,-1.9212854467332363,8.9555599726736546,-3.9033909235149622,-4.2912038043141365,-2.2622944321483374,-2.3824605625122786,-2.0146145299077034,0.37365833297371864,0.0756834726780653,-7.9877958446741104,9.1152543015778065,0.07919621653854847,-8.9491097535938025,-7.6876204274594784,-5.8365062158554792,5.8400626946240664,-6.0661674849689007,5.9231109078973532,9.7251536417752504,-9.3425883073359728,-0.88167625479400158,1.667257035151124,1.5890810918062925,7.6860006805509329,-1.3864235673099756,-1.6208283696323633,-1.2623428367078304,3.8040118291974068,-5.9730786457657814,-9.5327678695321083,2.7704204246401787,2.4561768677085638,0.96471305936574936,-6.067525427788496,3.1001659296452999,4.4888820685446262,4.6410394180566072,1.9496138580143452,7.1602051611989737,1.5682785678654909,-1.9420193508267403,0.48083371482789516,1.372327134013176,4.7022303566336632,-9.6142809931188822,-7.2206483315676451,2.5635130889713764,4.9645846616476774,-0.22547457367181778,-9.5510832034051418,-5.055396119132638,-6.0425355657935143,3.1047766748815775,1.9816772919148207,6.0503389779478312,8.0473279766738415,-8.5585547983646393,-3.6304848361760378,2.4414082337170839,-7.2517185471951962,0.36639879457652569,-1.9353784248232841,-7.9051228892058134,-1.4003824908286333,3.7715439405292273,8.3391162473708391,-4.4730869121849537,0.82831015810370445,1.4089119900017977,-0.41609475389122963,6.6955463495105505,-7.9523731116205454,4.4651290122419596,5.4234219528734684,-8.5471173468977213,8.5987620521336794,-0.6060442328453064,-5.7853479124605656,5.6576682534068823,8.4304575435817242,-9.299920778721571,-3.768522497266531,2.4424372054636478,-9.9577903933823109,-0.58314125053584576,-0.85492406040430069,-8.7086116429418325,-5.6358728185296059,-2.1144268754869699,2.8275653999298811,2.8917770087718964,2.0962873194366693,-7.6989275589585304,4.1245345864444971,1.052904911339283,-3.8270686194300652,-1.5422384534031153,-0.40162015706300735,9.9700953532010317,7.3927575349807739,-9.9239734560251236,7.7781251724809408,6.9499130174517632,7.1882169600576162,-7.6374177914112806,-2.0808017626404762,7.964837271720171,5.0201663933694363,-6.0633090883493423,-6.0358170792460442,-3.9776198659092188,8.1429607886821032,-1.2578826304525137,-1.2333016004413366,-8.0999300070106983,4.4763870351016521,-5.3629877511411905,4.2649028543382883,0.2223845012485981,-2.3836075142025948,-1.2914315983653069,-5.090805571526289,-1.1692022252827883,9.2182687763124704,-8.5565261077135801,-9.5342810451984406,-2.6615230087190866,7.7828498836606741,6.358133852481842,1.15578668192029,5.3068503364920616,-7.7662747818976641,-7.7802418731153011,-2.5251440797001123,-0.096489023417234421,-1.6909390687942505,0.38713579997420311,6.5914714522659779,2.8608280792832375,1.9376291614025831,5.7334091141819954,1.4071051869541407,9.2169664055109024,9.5545278117060661,2.9490843787789345,5.2612554747611284,5.9208837430924177,-7.7068052440881729,-8.2757194433361292,9.9833293352276087,9.8162935581058264,2.4459861684590578,9.689630689099431,-6.3768542092293501,4.2113338317722082,-0.11217818595468998,-5.3786939568817616,0.29070285148918629,5.8429055102169514,1.7130342032760382,-9.0340538695454597,4.656622102484107,3.8477911520749331,9.8260012920945883,5.6038713920861483,4.2666089069098234,8.8960100803524256,-4.7584316320717335,5.0396007858216763,0.57052500545978546,8.8138494826853275,-5.6315972656011581,9.7447912208735943,0.70620374754071236,9.1664686985313892,0.83956621587276459,-9.4105249922722578,-2.6935405097901821,9.6647091303020716,-5.2334931120276451,0.68130345083773136,-9.3328181747347116,3.3249424491077662,2.3078464344143867,7.9751195199787617,-2.1660870406776667,-5.424831360578537,4.8593585565686226,-8.7606234569102526,0.20156940445303917,7.7770604752004147,9.0555458143353462,-3.4413493331521749],"expected":[84.544963967055082,112.07656698900159,-17.586067063232143,30.958146975844613,-60.632538882281054,88.156054139456842,-19.083688620631374,61.398478543996703,195.32569594434003,19.183868216160811,75.805159713912403,-189.27647129148599,-34.5925623336705,9.1646681460046544,-22.137149469018226,-197.64207904242204,267.03618327235301,-199.1638347667066,-30.781825902411555,-5.9575092986035649,-14.436700390670318,31.147797070590215,-252.29374931287282,109.93574337821826,0.50530023688978787,-25.601187615928886,-8.9006807383132838,-144.77724478894481,-15.147854849033244,-30.871781534491458,-55.798633755983829,-59.642905324065062,62.599472027926637,63.663405713844689,119.69528256705927,-196.03940763786289,-156.88929065499195,-170.15681500341057,-9.3483301769262237,-0.54856497357176437,102.93297541309389,-171.97426490689989,110.31956396966733,-213.72126748063465,-2.8641217164166548,47.754830114930471,-35.061120357742652,240.82127965736183,-171.70640613097316,267.70463813242503,-46.907218903577544,161.71812121986278,-16.522106104757206,-102.36494270546807,-71.757463220154307,-35.482686800915317,-87.77696980531465,-27.917147515677932,58.870546138123117,-10.391770687502547,-231.90797905417733,91.721272900373719,15.374959703313735,-63.706278590453095,-134.19534573191589,-126.63917884981988,178.64112203750662,-120.48822436410445,88.785059973411421,10.359546507147414,5.6386216673619609,-114.26518205013051,-1.1359838760320713,-216.15540192060482,-35.601744642602362,-22.259415578718507,68.321346103616307,63.875730028421053,-270.37262519979197,172.5647080736573,-62.148183294084362,44.48797555238977,-158.08889194367089,-38.713381610933524,-75.981518166960257,-85.289408117215203,-86.783381977168503,-518.140260222488,321.02030087218196,79.690578248928432,32.556822095420159,-43.431361834041496,3.7784465023430727,88.984005927932927,50.812678645118588,-3.6497136888362149,81.056451808834709,-90.582689808674132,153.36722268373177,161.19383287745222,-175.9946674458198,-163.25493099864553,21.78988911034984,15.602067892795514,204.88221112162384,-8.1264003208673188,-63.160241155280183,44.221829509918848,47.602738671530958,-91.715286959852421,-57.713132162292617,278.63049396672017,-17.344040502801413,-143.64668855464726,-53.510733286646591,-21.276937922670221,-35.308973394540672,-114.28941278125514,-178.10296565278605,71.581395394970087,-69.086452130570677,41.419900329093196,76.545114538898673,83.851739923919411,104.57403794053302,86.797920763028145,152.83674268008014,155.88552700821219,77.993009246726217,-36.55157658647633,227.86346544729815,25.999823111119824,231.58804764184708,-355.61609435958758,107.08509418890718,47.529833502958716,150.01617986378056,327.75558801148566,118.48346873563185,16.10789819940161,28.55067181839371,115.46408432363336,120.58442303862883,1.5880267290899539,30.261086538290854,33.879650582567265,282.13760280688524,-115.4980322057793,72.081985385920476,-69.954700530722391,-89.576437768793184,150.3188586523429,74.082355016380433,-59.899795934228649,-37.767463503067759,95.290543107812226,54.821965361291859,-144.03279450817013,156.02011997677758,26.446474565926422,-109.33838374464777,-114.27784506157305,89.702468395976936,78.623603607821764,-68.168332579963945,129.85677620623346,9.9133814998262864,67.980139283314983,-169.09833181775633,22.286671131987347,-40.761822391662918,54.048054267627968,-12.299478932122568,-232.01066410592566,-38.793061556779136,49.51499204079132,173.86789104915778,59.357777768948061,-0.73253658183564596,-111.27737079307835,76.167552319491293,-129.18891816143935,225.80851582227805,-63.141571891113045,-163.43546425285979,-81.942151978581961,-99.929824164533329,-67.989948380327689,30.669660998475297,121.6805801005266,-75.609370276391587,-37.156893702345492,75.228469971134729,-91.030521282958503,-59.642564971297787,241.72636480887189,183.43434554558988,74.506362674227319,154.57209305299205,33.618916915835705,155.31785477148242,-50.717039140918288,-5.2821473727313872,272.08062372761486,-147.68198660202299,159.47145953704145,25.645482512176049,170.88043426656344,-120.74944784806344,177.77465942495451,-6.5766747844097715,-30.771996292375718,171.20326484703727,59.459587303594304,125.61699105410712,49.268103686541053,-207.55837045562885,184.26882209592773,-50.67667439773254,-37.666698660695985,-136.68763348657126,-77.192251869228258,87.622498987439599,-169.02133722874146,135.92596164268855,56.898748146853706,-219.1493097032226,144.8168542054612,164.67333221195091,213.57030277786706,-38.379673634928935,28.298727635398439,21.962357202681808,30.299177504360735,-36.092310773478502,-113.69587689426834,-44.135859440225516,49.926620603656332,-113.49583450041861,-109.23718231836051,-103.01844796042104,13.183725879665687,65.564568456979742,42.037522701297448,-196.03487484185789,48.020141579529245,65.79308807478111,51.229412193587052,-116.30426673810521,61.135926891709865,124.15407408656748,-1.9170445287696971,-49.929271302658378,66.163715585537602,120.024624104241,-114.88519108679381,-80.345676813813682,-44.883770144388336,66.103694259504863,-65.249375542535802,33.447560244346604,-14.300454199485252,-108.62806623390107,184.37314019833909,-108.39495268494913,-276.87631500147393,331.82746227435393,-124.38477780909841,-118.24036873800779,51.681936624188452,-86.45157778353385,214.10198999157217,63.263000830067753,65.914879775350215,-123.58744066160327,-118.77546354256557,-118.46105116509645,18.978877059435476,209.78640558010829,12.950352195283244,-114.21763422237217,-69.945206776748961,-256.97028737312075,-240.48799349942351,36.29606175377674,27.762258513830673,386.78794816603147,-130.85379642198839,35.439258021319276,-16.220802284587492,-169.25174103375133,-49.030636162561201,-166.42981614950941,170.56150458483768,-211.50101264781563,61.143101063696385,-21.758895043403641,-30.938093745601542,-93.180046528855073,-85.657666327733864,-4.074116258353186,112.39662313432032,120.10966036936938,-168.03212055333765,-288.11505501241851,21.334246539726024,-79.591024300837503,22.780415742235938,-141.83503678590247,66.535995762321363,-179.1360469197985,-98.493837375804048,34.451498849461046,17.375995730160209,-26.117568659176143,170.45579659913477,-220.45517714470401,-92.44086584257505,-28.802043824243569,40.691709023644322,38.702492355488488,-205.87987555285611,60.698601047770218,-112.41922927118208,176.71062834442506,36.335054208323932,25.576369647096868,118.07531063093003,-77.977051500187969,-169.85261454956557,-243.53862760495622,-17.164567175052795,19.807484186841549,-2.3899432621828218,106.01807790937737,37.982547045211845,152.22650301863078,107.42898842897033,60.640842909354923,-18.674447532596233,-108.48811571848512,-37.86901775116435,-133.92429906775732,-145.82530089135713,-56.255921623791835,-17.631433202758451,-35.263077482586851,-42.509110810381877,184.33060041958956,-84.528585573776709,-32.722290935993129,1.8409553909288654,-83.935473775382036,-28.594862222344997,380.84954817981645,-117.11121093330129,-148.952468715511,69.969059054698846,-104.93122672841957,50.499744721194944,-12.028010494044224,-4.115762442880623,115.77835115752995,-28.641348564518822,-41.551253918796213,-27.374096445126945,-33.698386664806073,-87.206693556446965,54.267234998316525,199.49861830248733,6.7327975186946389,49.553512404975315,-105.32395158987821,94.798697805113349,10.398170055020181,-164.6510813666313,27.288125595287095,94.538551255847139,170.4608676797892,-51.718639000862154,72.422732243953661,49.976233971928046,-20.089873724194284,215.8004369391486,81.451051961358772,-151.0067254566161,-10.394178059880204,-4.3538087783215076,-190.91110757316352,-103.16800244664988,-40.901295354926525,-54.512188675403543,-190.11713391640237,-12.614893759833972,296.01025756087699,32.064536654355607,-128.22303302783618,-136.98543536948046,-143.86293351724731,65.325682193850071,-24.787793599092687,-47.63678179206012,12.481377770601895,-67.005444582447467,19.737670098925989,119.56518218425779,7.3700173251449002,111.07642206059755,103.59798013913921,313.43445088707585,-81.856101518675615,5.3002861755502835,-110.8992084244635,177.59821141024685,115.87422813771906,-18.108080795329276,-142.55629108244864,-51.919392327459356,-28.681284064763751,-85.686240482743472,94.379293784569199,49.391078202609705,-21.649118287166569,55.87250232259322,-76.837904979046044,-123.93347711664653,-62.301590379492851,-109.32527387499721,-230.58148359391174,-134.76084531785071,-28.449026610713517,146.14368529359564,171.52807675951902,-250.16857636011247,-226.64169213135571,36.330153079310321,27.45054238145352,203.06359361789328,-69.981863049746494,-74.092944360899764,102.46990001910353,22.502719054515932,-61.106036824096904,69.407039306633536,110.29048225532875,-149.64535042396625,38.336948751982071,64.012399728905606,194.92388403120876,119.43131006609569,228.09914694149472,-98.916084422253192,-70.930266808484973,-21.108718377465458,101.49682143282035,-81.214437189166333,85.183557658241938,-47.117847867676048,-46.288169194729697,57.381101458681236,-30.629521905857601,-107.6615825313236,59.791279056972733,-2.3053015865250934,33.678495513343393,68.439642209770113,-213.15521958714564,-55.232722420149642,-69.064020640179535,-117.19696529768569,27.290301532760978,-152.02306197427771,-287.29048287653097,79.119595346805241,-2.9352417360708927,13.772086477726809,-5.7388700806001935,-30.739063915224957,-29.833191179119002,-180.66375668444414,115.03154789485201,142.63446853042464,-20.45007362992131,-77.74071568184074,57.560554039976786,-9.7951405379642367,-203.5527904814395,11.749820074318123,168.68810286107029,-115.95084240325423,-247.59970024426596,-6.8922455566820915,161.52189399496658,277.39808838856993,135.92926333953949,-78.402278081133147,-267.47253572678653,34.993009855965127,141.90421558264137,193.72446762943878,-51.266500778633947,-19.738109997595785,286.52264123666532,-32.183031111860672,-99.626372583599078,42.140448811989117,54.49562943898033,82.478858512871923,-215.39583409481853,-82.996354757711686,-207.54717656835911,-72.758335867016342,76.909239991829025,-27.071384467536618,207.9655587356329,157.10618769416652,-48.949867318894391,-174.53786126654245,-8.5484230136617541,-79.899936280975837,-18.175344030663787,220.9888366554855,99.849909431251021,48.058547910749823,-83.243742330453713,95.614841276147118,-207.8341552467466,-17.038623590493472,-71.336751685365201,130.92803818159189,-2.0184158575263567,66.272701476592403,-250.09907016939187,54.773717093920936,35.791656102031652,52.026833625550537,-0.83177072891417225,-6.1228042766706174,-29.587077307775814,-66.839526897797157,195.91242939991713,-84.724068834206932,-184.30459506008464,20.364909270382494,179.60968797931611,55.282040568220047,-39.507625941095213,173.13991745711749,-58.191181167593712,48.379440589024391,-126.77626883315449,-136.71675162804513,78.696054318421417,-207.36717114483773,26.021314106030331,251.62660962173968,13.985428627748952,-122.64904460673739,87.909567254967513,88.113736321860443,74.43325435974397,-159.56394201141805,56.655114805189456,-133.30941105784348,92.928364671945516,-15.828940880599397,-29.674614617593292,-110.84532227678035,5.2365293397856902,-86.388850159607841,-76.477346688653952,-28.164378297515285,36.28338921205625,-141.5854458344453,-181.22088766591244,-38.596249156376025,-43.160403251558861,161.20700372416786,-143.20005723526265,7.2954991961177615,-3.8665639808351955,-145.38588175521519,-24.055583490365116,195.31807922406253,-72.435816136883233,-3.9885277681545972,236.74914299883119,-11.719085286301706,49.884568338810176,-52.283395179269974,-206.02750708102164,16.559576759484145,-143.72144992584202,-177.47333620440085,41.074266637809799,49.589700269332589,-83.656112449993188,201.86635176846249,35.302516815489511,126.78637715314582,-30.769986017371444,118.19643161331439,93.586826553151226,94.506376451975854,-91.542546672917311,60.17720498989398,-129.87286866560152,31.734931388286093,37.223634504669086,-67.558426402903052,-110.61047482379396,0.52277402296740405,-292.05479693209071,32.857375442320105,-82.601872875769885,-107.84378889872134,29.341092270419267,-68.002643502101449,195.74161784089614,-101.46763517788666,62.853859097939377,185.09674022709373,72.920951304425245,-11.401716463387068,-193.91539462823465,-23.972788827465255,1.4208776608858429,-209.12712084810696,-95.962679969986596,152.76526318190935,-102.35754834753229,-257.57336081323604,4.2345364901770779,30.137475508877671,-69.203478249033637,30.700851124691436,-48.192158780289219,-173.32302991397131,-15.657897326724068,-145.50601915561029,-40.832882875301379,-29.218051489463704,-140.45735947118203,-21.864290244339941,-14.481613594225294,-159.51130589177214,-147.09932682624387,29.104218529123912,-40.639854360665865,-24.82354380890726,-45.010254726051031,-5.9600307193519768,-76.958183413548625,-125.57224270359421,85.465497570121045,-55.254317818028412,-48.782662736276151,-52.290748626698651,24.739203021585141,-255.24531611591755,-109.57835307137488,-66.479585134266458,-47.025653564745738,-13.47319970575559,-87.916248608626688,109.8582708490172,-85.713149454276248,-168.46874412953292,-5.947001917786082,-2.3172558593712367,45.646747701532263,224.12462956763395,-145.85614055803433,66.550748386733659,50.894613670667702,26.772023107942175,122.96923080077786,-31.1076739537111,-82.064289416676544,39.19723682295345,173.57642691771377,-12.946160827785043,-41.095001541277341,-39.026667607764892,97.974139189071749,164.29794299912064,114.25450820280184,93.458247934668975,152.68148060031479,89.246470927697814,48.703122164471893,-109.93266951141207,-27.044645966031709,-7.7328016357706133,12.554242402365688,96.366880133113298,38.553861737883679,165.46127884239056,85.501619649706967,45.413600729156101,-74.311739128480383,18.898185875322021,-168.86913640343033,145.13258554759142,-175.0698759487322,291.46047528484365,47.449681093867376,-3.1462473564101501,-11.805852010197398,-11.623582173114627,-78.899427269668237,-56.457737138486934,-69.365532000581936,44.188187654422656,284.46274604956875,-69.595558736219203,-161.65317492812306,-50.160571216321991,167.31117104737331,85.388146990542367,-53.354353689544688,-17.868739766604399,70.543488856906393,-170.44471290175207,-44.556419688545404,115.9562096722846,21.662088371913015,-69.065079670807776,-16.433486883980734,-37.764065414075198,-172.25787581878816,-45.68705941636815,161.74171397307612,-144.25468144449712,15.291791154703034,211.79676607480258,-324.06527020086003,-96.638774857213321,24.511958207458388,203.02269979784938,-169.66057656728788,0.60143007709700136,-19.116968842919611,185.38527217200266,-61.186623983843099,-9.0643337049633033,-61.610444115620673,-82.194501719009423,19.117675490657895,27.851877574662581,-6.8959631306237164,11.372753129445925,-156.66946302657541,6.9463310628688681,-151.34981376196768,136.35511237706731,-76.873881410000223,-88.502403099468808,43.615815050284979,-80.498697882680574,-24.285924905413026,-21.959814987234715,-49.927611437074518,41.492845037285988,-89.961841967100526,92.87754752915879,-27.569195881124529,146.25326318387226,53.400042309964391,-110.54152274700866,29.714151302022344,15.299846735599431,-74.360599644436391,-177.65922079904834,-134.68438752500518,-137.14358002747656,-79.311726137781818,123.82139091220154,21.639842149171884,-28.565858529743316,-57.789607449606152,18.670462680361911,-196.16639215251149,93.048943983271357,103.88406839036654,94.797655169070964,118.26877073891453,-49.354914782802169,-0.40296368136752303,107.31199332412071,55.296483060009251,-96.639289223475302,-20.612420381110155,19.192404832975711,152.22564420633995,-25.216207188276826,-144.92072002923089,-63.725213548268442,-70.62850554052946,-150.81467912071946,-53.701118146160738,6.6878376298763982,174.10524901985605,-204.7493190790463,43.205358201960877,65.443227276435678,68.524504066023354,51.823591969053325,-111.53608788632944,79.527281910642358,-114.28160517643413,123.94089239632227,-15.49595894499333,-125.23726342775677,66.922382646687055,44.040904561495864,16.302244041257254,-104.58490704578227,120.13064259983051,-80.927019886968708,41.248855282235716,-17.083006523098788,-198.5147549024756,79.103120431232483,124.63046268581154,120.0331497796206,152.86692794227679,69.608037601579312,147.00908299457097,46.297325170654759,52.358320221677367,-86.096511578440214,76.828777825550503,-153.34001252918432,-61.338339240648956,142.08176226834473,-19.666181456061679,41.747417454001663,136.74325286912025,194.9251474765415,210.94068351567572,30.279408538251701,86.071885395215418,-41.04424511578641,198.39702394112678,-42.35296609615105,-71.230757607126165,87.286116428661131,-150.32149027692856,-2.2879998039780141,-202.97669784122397,46.471238636550254,2.3792845802787603,-98.173338774037887,-223.19611001697587,-191.94370990081603,140.86605910642842,-42.176507133990526,23.986865049228072,-95.406265025002995,-13.280127076979674,142.21885630568318,-50.324461469924387,37.74292706403179,-116.81894720933091,22.565407303094194,146.01343292001559,-151.17788978055734,79.967508108788934,71.228582156523061,-62.604655194033818,25.162347347957795,-137.01619467404183,78.52406523656505,-62.989228279368717,97.409739399038386,7.9262582576503746,-16.606752261296862,-113.62324061839891,-44.969824859620353,-61.409049949980101,20.120780341103085,17.572290740838554,74.258231104441606,-150.78673764899426,-70.286479671085644,-68.794293654748657,245.90653469816107,5.8478816204660014,179.24424249968803,3.1256811958041268,87.032655794260947,0.36748628413553242,-108.84621798068849,-33.409849983929156,49.30409596939095,32.975792429449356,-141.29942573689087,-91.24065696987833,-27.186691191410777,66.734787230711291,246.35311452841788,40.815824303319062,-23.600265481695139,36.017670351923897,62.199077423431859,148.45797053235452,156.57373479455467,47.611155822218734,51.151554601081735,27.470914125872703,-1.6995517086950755,56.994306736831412,129.52178802889875,-28.576649404110171,122.60671647839065,-98.130515633451637,-181.45709283233691,1.3364103815640362,-13.247403760423076,1.347422663260744,12.03519246840651,12.824551073669543,-43.663917497543331,-91.412090507059503,-131.11924147952618,80.100935741703367,112.06221177454898,64.861927492629462,39.846484176623264,-70.747150940185506,58.422615117675626,-7.3484100770513265,-72.27569631447605,39.495936670591135,-78.72419507876441,23.368508856826914,30.807409707864963,58.500776028894961,63.682901889082721,17.859377778194084,10.04130398918177,-78.147911797487609,80.08982229184096,93.858875364787053,-189.38673311529965,41.944217066791069,-9.2332095568035584,1.1675031657574806,-100.2828734312109,-147.71453176617803,-168.62724966245517,-40.319753452221121,-75.986897941971179,-64.873225979054126,-106.53888760787709,-97.463087203466188,11.437395024639763,47.358240458313553,-119.71596230970634,-179.90636370698911,36.373804763185326,135.12904183341951,36.255178594364565,56.496394777883644,45.053841900421986,74.101752301439006,107.32279782537931,-102.62283612757055,107.69188438834226,-26.260947447775695,-2.8329868397357245,-105.31674217491889,111.7412643265516,31.709562774299833,82.169213044174782,-113.63154229747278,63.88037463787834,112.1627833059775,-148.62286966218548,141.65720148761005,3.1337409084130599,-1.8413736182283031,12.747857207166714,80.192384647722434,50.599573876888826,-52.21093762567083,144.2785188438026,83.393760909952192,60.850643495061938,-89.022845922826576,126.25142119717799,-22.179125066994008,-60.995323214672453,40.252035416168937,4.55349716924718,-43.170684377501189,82.835374116705722,-90.080349803467129,-14.496599226568982,56.903426787230337,134.0038823825314,39.242802202491639,156.24063738191575,-91.037853525762529,-165.50231392912121,-36.10176701510575,-37.243633040349295,35.478598065002132,-1.7009036338422696,-25.447446422513814,-19.506815468469561,-7.3148425291479668,56.502519817549747,-151.87764585093214,-70.558145095948831,40.975393998097566,-183.78296844429673,-31.038026576228354,1.0765656574583815,-80.852055433477403,70.935330977476653,-91.451354492243411,143.57273553127774,45.936860416637906,-42.859612177968906,-18.823610282927323,-103.96681721604675,-49.513873464952184,-85.416456059527292,120.21980957175199,93.747399372460563,-39.574267965635649,3.9328091179473894,65.097313247086134,18.7157481399746,-140.91808720130103,-17.242427804004084,-69.627895894769594,-17.113753683026403,-10.239346084005035,55.265055377567847,28.741239968111167,-59.768618224012201,131.33386043918529,29.413107238112659,99.564734431752996,26.277606245903428,-78.843030126020409,-48.167291481501444,62.949295982986591,-59.933730041914266,152.97109031128048,16.502016031223555,-60.797554186854718,47.553028561091246,-19.473760240021907,125.99631139942164,-15.213025642668129,173.8644586387137,11.832484635768072,-183.51032791620685,-11.123509786337294,40.147745537404582,-24.042780279247111,-30.187230825495256,-13.400365609809203,-183.89805136048361,-35.074587506085599,5.9287089214523654,19.104262858138618,-165.88582767691298,134.45015144485245,102.14283941026086,25.142319325951661,173.86961995904409,50.803079938022947,-27.34413003206987,15.252253002899145,60.550906652958858,-17.971981452661243,0.16444872518423637,7.1529897226335235,-58.11363589412737,-29.248248589888263,-155.00649563525249,45.311160220307464,222.57624399510112,14.707037724513881,19.289430398494005,-57.456858428195119,36.037885126676798,-70.688784093124653,-109.45248798814404,-92.82833658272591,61.250923493966056,-223.86035206516345,-83.161988103357089,-9.4908948872100005,-32.984405612535198,52.546316291691213,-179.39911434624639,-21.949785413715709,-177.19902082134502,175.68351416084579,-16.436592768898251,125.1365623210674,38.553301109728906,47.91220622394745,-36.617699067038799,59.955789720305425,-144.14152154193167,35.387901577501005,3.9511777346453396,22.483625168036109,-133.27859015445821,139.18317122165297,27.632819907483778,7.1180444473775708,-46.291722791669812,1.3673705459948851,1.7220437275536753,207.06253085820725,43.026762303802066,-7.9631159192723651,63.616641304812084,-146.63905806746348,1.6015162437427364,8.1842820242608241,-91.002440534794772,-38.769721283919118,-35.353080693637381,-37.889292737861162,73.8904886006314,92.817066570929157,52.247412650265787,-108.3859638139101,226.07605799250993,-21.576607799298479,-110.98966956948018,-148.42609808443478,23.58129305935255,224.7472562492672,-1.7689140721476129,56.543395658216795,-33.8665685925112,-26.290624976008502,-55.041745137808903,-120.45418833727177,114.8572767426335,-31.431302869367904,-72.593525041212118,-56.10970811070743,42.175854322933482,-46.673878181405513,-35.364046271749409,43.548198623219797,14.126400789968709,111.86388002093122,-59.88701375982064,-161.60245045568379,156.30195655999268,76.709168756562235,-9.6603114021168182,58.754581242297768,145.30711029585976,83.570104635939799,120.83632091442996,11.847486765673366,-17.705869480752671,-20.61142220366424,-44.111672557473213,80.062573170791055,2.6030621155341294,-70.450431761397795,-6.4013714238490138,54.915950434528952,-73.913086632920937,-42.895939102700432,73.924528815037462,-69.379051357388875,-63.681744258118684,-14.791835014438014,186.31405358421335,-52.476535763039763,17.401034810504513,172.78524675804897,11.711775455621144,26.655762988926032,-5.4079609373682658,-2.4920640996388173,-94.412741608686261,-102.61555910213238,-12.705276903266618,-55.81283258567067,-75.740419983333794,17.097860827784253,-65.948130620060098,-227.21795743415794,-72.508557534093455,-169.88391560510792,-44.874154567999646,127.70598104092157,-55.272346110090851,-14.758061946352996,85.938837477883652,37.265163559018823,-143.60425134474337,-28.457506191797506,112.77614168995467,-28.805822733351501,75.182199656251342,3.7623050043413713,-136.03562860268244,230.54071977645046,-5.120398591600587,-29.494288062997661,-7.4972571873718774,4.658683880149141,-38.100443723751326,-47.052879258224209,-53.513770444372248,20.819799030849929,-14.611848137092402,63.18372877161746,-52.841439398276989,19.660029145916535,55.292664328229769,48.480541041224015,-53.17179487903951,-60.407506204010467,153.02503783206666,86.362951711595258,12.597417491711255,64.38447670711902,-9.3136893533926468,-69.236235303541662,-167.18662870482154,-60.417056238576627,-45.618380593710235,-48.64222887067406,140.65531288348552,59.133896136456542,62.470933494392227,-103.26120991954963,-61.300970350486296,-181.50580245978139,-12.129454731675089,149.36685228464671,-18.671659819220022,-103.40155174384329,-90.108813485233981,-20.735667692140545,-0.44352955093368962,5.4609068062270438,-28.802320887164392,-24.990145542993261,38.910268351200841,55.889645523689595,46.845917456283424,185.24353374960739,41.183428559474748,9.0892344788569375,100.02540204377264,-106.47776424059475,103.87506947839478,101.22290829542591,-72.198985638034912,-67.674441793282654,-43.112985751239101,71.568622640292119,-30.400939957789127,105.49518949293886,-79.306742453293609,-16.021678370133316,-44.600244205563435,-102.16689459287093,175.46272732679464,-17.234202560244825,-3.42523853078605,173.11680282469308,180.99368742228583,100.4878981877024,69.035725522657742,-15.435480225191917,173.88521108466489,17.719231850652143,-93.457223711264035,-4.5464718968166888,72.267610000380273,64.171478624915324,-182.4800170679481,29.694014608677275,-99.393877738879368,-1.5626158368525793,174.18172727876163,152.29941716807909,-69.890252749062768,58.868573559307038,-71.976270910046907,-139.65408463241414,-141.84365864345713,-52.974848102965638,8.6285746474439406,-142.50911133443884,-33.420689160567193,-0.73195003224453359,-48.407734606232069,25.759509524537073,-77.852022544282875,44.597170539630405,-102.92076315922002,30.175269661807455,-5.4397168673269114,-30.17066033833774,-24.685838764475577,-53.534257162573297,-57.089480647150069,142.88025527781082,-111.07871126145511,-99.52677974032909,101.13497790880501,-16.177984373643994,223.98500401310815,111.74935361481815,-30.75773724181397,109.66945562013481,-86.775505774636059,-102.88801353512321,10.516042107686076,-170.64217057434487,164.7078322732574,40.873295280319439,-10.547494071420083,-20.388579317889125,147.73222093437232,60.797461685890234,-16.574938809698828,-48.226210045874083,-86.240542558234011,-38.963193398367963,86.000037947737525,60.617675776886287,-24.868606406804233,12.398030008840159,131.60421453736183,-144.91587714015148,-4.2125461367247183,159.92186625714419,46.768833084441994,116.08375350234148,97.312347310959893,5.6634402185346673,3.5103710102598278,21.777814241260707,-26.265855552461129,6.5200045930582107,130.30312605475291,66.929306504337575,58.408527861227419,-50.81942781808965,-111.85751713506234,-137.57848073291757,-14.146270384016148,-44.743963809542862,84.010868014432802,78.054150044608676,-52.779339813740478,-144.96872710950279,-66.66201226972629,-88.875420964253379,121.1741596769028,-95.007081246006592,-176.99504124080937,124.13407626135564,140.97301209250648,95.073223495031087,44.931154315266241,192.93890570919297,120.36427605961207,-49.121422854166696,-72.582163210377104,-2.5654094693792331,-0.74151202474136468,-42.132528398631138,-110.50627886121728,-8.3497270989419299,-2.6181877748958513,-91.546752399340193,-19.940072645692148,28.373021868552648,-143.50294710760485,62.210562603824229,-38.403911088368972,-94.869802009862582,-66.419259771065441,11.770865214450303,61.547112309441346,48.50349240896054,-92.236187666078706,-139.18442193063046,166.64097617238963,77.477741634678068,105.99102315789762,114.49887026718694,-101.83954915295432,22.257769669257115,77.537029095958829,-103.88559040885806,58.02237641404939,-32.654350119528402,51.962612857797822,144.61465371696096,-125.57406151140682,-61.432093056706293,130.37219451828966,-3.4591051790791809,45.560821620463983,137.37658372114512,71.140197042839759,-31.322076018233862,169.70637210920952,10.174688310667591,-100.19217379662382,-2.5897480229457557,96.164951707020251,-124.28649028560116,-63.267170800954396,29.516941361839706,127.81852416045075,207.75127419159347,-85.147572654548526,-46.354096930066333,-69.775319468812,94.407422337355115,-3.8949656002392032,-11.008004183711666,-154.43686427563645,17.44118100291189,-12.54490758752857,-215.05675670631143,-174.6894428226552,-63.723128607161982,-49.385823047378238,-154.0879734692825,107.50271869911708,164.42933341566058,-64.351801276967961,20.70947139677741,150.90816685015145,-52.651867994613909,11.268355878610592,85.238227367646516,-141.17218641067211,12.527333427093048,-103.94050539681727,23.924348972768016,185.57489496700512,-81.605385522140239,7.1126918149232523,-5.2048399334284881,83.180306104775596,-112.45829114605689,-4.2565435963240006,-154.91892769110297,28.577565672913579,118.7599226786231,-91.098672050250755,-13.0172785135981,-11.79369150661779,-46.602093772027217,-74.815551447231655,-69.484739904848482,41.674587225051368,-112.63134038547585,-34.163683521576388,-90.395812049724412,14.624867622703007,-71.672688129440417,42.146357369143416,68.450702975057652,-5.6884316809332063,204.24913230279441,52.332102913868496,-11.228804364442531,-56.232968682521616,-167.26416966356197,-63.356028729685391,73.345838099081618,-28.62444310804301,23.566369323222546,-206.16132856225812,-248.06794861225325,-1.4291434771801406,42.656940788928452,-16.074627227093458,-52.020306630337174,6.3814002433506936,33.638234303404268,-72.040714011912087,88.26577812010845,46.772086357658971,-42.671090072992122,13.601574599534466,135.28211039384701,131.10229040230985,-82.066917296942108,-33.039328008318719,97.783836138490827,-120.68979181829317,67.704936438993499,22.363423925676045,-181.53335926494816,-55.684999526888511,-108.60326489793717,41.190698682672561,-35.243123826728045,60.168978282001028,28.833900049095533,155.05389878482677,-89.703988889050251,99.921427757881602,76.586906818865145,39.46079437011042,-49.597179542168831,-139.28063323121057,15.326181147181046,1.6260019986003265,-67.904930974873565,47.5305976695373,-46.34931660915548,-160.00298989362091,-103.29974371912866,66.939647547568484,-155.13446195143777,-74.337682109515711,33.115907928868808,-69.732069488948227,-209.98958568845296,48.582827958939944,-53.18082838623684,151.58054081578467,124.09284836516036,72.210398779095485,112.57376544500971,-13.508748445800379,131.95839295269872,-31.281852288916014,15.609666052391823,145.08111413062312,-2.9901121884646873,-45.000856867685755,-52.14917084255309,-39.495343833838554,306.71420704813568,-95.340852177248479,159.57298277637557,26.332805000124299,-91.02321997008309,-50.921140200049976,-53.485654243397065,68.874037975280942,91.919891373713767,64.627656336116786,-34.783488132554567,87.028916394338012,-74.998520724475384,-37.948735156690347,44.620355264545736,-59.48266929881072,23.301811886368995,-124.19528205848617,62.416964133523877,63.616088996934764,-60.29663611189887,-10.052949929538194,-172.05095072392345,-96.700958517547747,-39.002978592251452,62.131885871156499,-179.37047106216892,-161.30181033063627,-22.326556584651208,26.940188834915922,-60.52640589838564,89.05504349238187,-39.159898294830512,93.707622353099751,52.299177173260944,-29.766367636973897,146.66909896618614,-154.13437037623817,-27.108846349840761,-105.08191386657741,127.84160188350683,83.338132630203418,-239.93519814035699,-72.421758949491107,-85.345753051343394,-7.7382700330913394,-35.011413315738366,15.171257379825114,-114.28613791427257,26.749390457066429,-46.172175066604865,19.914571835042935,-82.562026272052634,3.1133252213448053,-52.702667889390128,-209.23258040908814,-93.862284320031108,31.018071267673754,50.076868224433341,61.805697472227486,-172.73083877503035,27.473832715484757,-6.3650750408726751,-30.053182262534683,181.06025920593186,-99.918619813307316,-62.7043200729902,-83.05932618368459,-230.88276222370837,8.1227586591013612,266.26652050816358,36.465242077947835,-70.44319073196985,-35.401927909863339,-29.145098382206129,-89.409661362423037,17.090962798180556,58.154242143461325,-60.243097815442638,-18.544307548095659,-42.631024747202694,192.99074441637401,-10.908605161313741,93.656435386479785,-47.395636173306826,46.963887021048876,65.559490960714129,155.00089618822653,-158.32630492448098,47.804306854896652,-47.256298699581244,144.74888031888742,-71.189037914674827,189.17581240379195,30.964767779348655,101.03650858144267,-38.802675834527278,64.359669575555529,60.529878854936243,-102.74433003397219,161.00291424796706,149.11262590776877,-175.98895174250677,-98.019856012688422,-23.687816323187633,-95.347434976603722,33.948256245921222,8.0279009881737409,-165.08767850590527,-21.073687697360739,-89.684453974921027,79.652284426684702,56.641449983476463,-43.063375162231488,-14.169438928969569,10.882183577389682,-15.783408345850155,43.244688070674414,-216.86729382683194,81.761204086171375,31.293316410223547,-119.57043445333737,116.08561109527865,26.771204166796061,-40.685477287536678,-73.256842134764852,-129.15978253224841,66.012014875681331,-52.819367817995058,-49.854449069195681,48.33935878356565,1.5207332100259592,-97.990644902909395,-68.87043921404225,22.252803734158164,-45.8750986215355,79.23260098602799,-164.59901596984085,-152.56338792814057,-126.21113579449012,-27.452448383363617,14.726878017545967,62.09579649972909,83.081800179601686,55.992789277010651,-12.96502897595898,-138.68471080055335,-150.3838652012883,-86.013424923544534,29.400945995449526,-23.728934276014606,-7.8533011462889846,5.0846843214067334,-35.398528538887255,68.586576922300608,-31.744458712143398,-116.59885910062789,66.19328540186504,-45.2631597278247,197.58368136057584,31.789883016687611,26.335095510786033,-99.117679080560123,111.59570110778046,52.88566569553609,-140.03469805039879,-181.59416047986986,-33.608746294278617,-45.195094425601368,41.700424455648289,-12.121330768257927,-50.437082914983066,165.58015314919658,77.066961775972942,155.9304364408743,23.620223638405136,126.09448997731997,197.08724595120799,-93.578540792155735,190.53331460283431,-149.79153394899626,-133.23895875357653,32.336171790504714,-50.962782759468013,-34.924758156499955,74.345422376845676,68.28971454797616,55.248573377173194,-56.305793422797002,42.83997229266712,13.64613984123546,-108.87774869901418,-24.473603452352972,21.105514031806205,-8.7713779226524942,-49.334616967408678,185.6801578822537,-65.559064461517224,98.602626963142086,-60.383398900651216,69.451605254898652,81.471209916290363,73.712713824705631,243.89216039999712,26.934191957521463,-52.068857432500749,50.802630499605627,117.92553087978479,-118.80434033846845,60.426335893783659,-10.462106066291454,103.3600057410123,-1.3318605288121574,-119.03738160234364,85.223325169601168,16.511409943870504,-4.9384966333554559,-140.07127004529158,84.627407373602296,-71.19420153730762,4.7919363481931043,71.05443050101718,-28.988234336519334,-38.01736740360775,-106.50753818488747,1.8702114317579586,46.998428836249154,-28.610459125546683,-70.121689609155979,-72.238935974591868,9.7823743078323986,-154.79463235289279,129.06103332233991,68.916612697711003,48.528977135186913,-19.763076870122369,-107.58130003667738,101.23071551960234,88.064797784783465,-12.339055271112425,-74.173317014918581,54.764010323056205,45.454436411397246,79.505278000519695,-61.947441220473692,-30.886627200498012,104.06332571209407,-113.148511393587,-59.646034864853895,7.2342666220412681,190.03832423132758,74.540050485641657,-116.68587145056819,32.751958806453374,-133.08679292529484,-35.401762994006276,12.568934541195631,-0.21411658706502279,-100.73465225852908,177.50836380523879,-4.9154904820255876,-45.288390616304333,97.919789093955956,-55.29543220092728,-6.6686853889954385,-44.928692604723594,-124.01833855914046,86.919445397230234,61.492377480967733,101.39539249010738,-28.494739325531263,3.3694844200278382,52.875062708043771,-76.670350712723319,15.367336699070645,99.62474104481808,-37.645934354969206,-3.4402239445595626,48.813212375880696,-55.022605479508123,-58.251345702234119,-51.787443812914375,-41.696350865931464,27.575885366999316,-86.588458909872131,49.580504213255693,-70.839089180683033,5.7540385228952715,-60.375298181899161,97.527000326345188,-176.78947680190606,49.489834240221981,-164.10856929766194,18.357206264337378,-3.280124355839213,59.847906645477075,-13.67126238555057,-121.55347112409009,41.480768413584201,13.067466247590474,50.626677987797379,-134.84586973146628,22.853311193146403,-32.79252441584854,-42.228680086658905,-55.279129879814072,123.97475107461766,70.145849107736169,-127.518017771074,36.837045810968128,-11.43438085913979,-24.713409827830205,39.088697354898756,46.702039583114008,43.034291427190801,-76.344268634339159,149.85486022490375,46.10449099475769,-116.31952951015899,-15.799677762603917,-52.390434185102045,42.142796264231237,-52.761713307933263,184.14921753810907,-32.449228198211699,-43.542062947603192,46.647167135983409,21.049746356099128,9.0508311238568808,-88.699482545007172,-116.67727838468281,101.73124604970513,-21.198205445308915,-16.616775253085727,17.644115328499861,-37.233032070886225,113.36633804995604,135.45463059123512,97.202248715620968,148.7458513927069,119.43455520873907,-48.959195988436974,72.17046668136544,47.434483824748419,141.35158752827709,93.373340416758438,134.91216530395042,109.93937744914399,63.533162864077497,-34.798853095158954,32.65027447804259,-16.743357788349151,-3.240205088089283,-145.52002939682708,-27.021904631892898,-46.017832137182552,64.818676926609484,63.227169316137086,-61.460939910919166,13.645452619117009,-9.2935555829674641,-25.753365921237034,52.278382267871436,135.7965885298085,87.154919473655895,-73.372512844052665,8.118849414384357,84.013535874681025,22.001249694388711,-14.462369839209423,-104.32840628566501,-26.016956584407311,32.759813062342339,41.073478427195482,95.770735508022113,55.508629565964384,145.86145946823399,-52.871154161019994,19.634115046621055,-192.30190240312373,-93.882005653225093,-38.057651214304094,0.20739462312679713,-18.15988544431616,-17.391813403812861,-67.687926033127312,-48.902674318720941,26.276372259754776,168.4384231364734,127.65086364383735,161.89885800013445,64.104317626160594,-78.958805387004134,-48.530293988892304,-9.580335450507274,15.532023988331467,32.92502554445273,68.240734766512077,65.878389321429538,140.32314185056006,-89.169294296028355,2.7605924281113658,112.14106907154189,44.865426961199844,-7.375642413306096,-45.237404272461845,54.826514116329562,58.352253044789478,-131.3755112110988,51.979408485642175,-64.860794490431999,-70.789227100928258,55.499923792158711,42.684353128172475,-79.23355140701058,19.149254775630354,-139.7951533630181,52.532620740111838,26.012722464757459,-16.829125589497266,-42.741323143769272,151.30741977766141,21.065349372552518,-187.20016638412775,-77.812909514942206,-48.346498832910633,-75.290305596953999,10.031106691709404,-61.424580143067487,-33.297780894830424,-64.51715083594101,-28.086155543975984,-46.266616960043734,126.01251848422609,80.525882087202561,27.26222651324241,-13.628231478046317,128.59944599353818,-92.287338654246128,-63.457164412626163,83.622557312864274,-1.3452699780464172,9.9525315500795841,66.818621708837597,23.713824121960865,185.04252885473747,-13.818994822093629,-52.592083784481218,87.66225329153481,-8.4186480444385836,-35.980231480617263,-38.217018170253375,-5.3317434173623539,-122.78137491320169,19.913772081432501,-16.965476163727015,-94.419470121629985,-44.714166373828171,39.700931810834646,-159.00526336302769,-27.793965574221087,-112.38248942744283,20.342446743283503,-92.089584278042395,36.329275760366492,102.11831154887199,139.98106756246648,-4.4166370190134945,-62.624200167036214,3.2110753106741186,-66.199222565588585,48.271807457047338,4.4155941499602278,-42.65750031998649,-1.5332338459827675,-20.981487826215371,53.468564240017734,-87.37302389510532,90.453509093106319,-40.151668973420811,-187.59032490176969,-158.01814118126475,63.127821600964985,41.207780647784006,29.676753697740679,-11.754924861250682,-80.544906619159903,-104.85102209120117,52.004628343933454,-109.1627351981993,15.033371591614671,-65.476720355522616,-45.056831134551459,25.461685858425071,-96.521153120024977,-12.909448476282233,-52.436795414194314,30.145759132969104,-43.436020258206625,-23.757759345853167,87.964710924516012,72.335977002899511,18.517591617217853,-106.78739887196571,-101.11040422105989,20.158039507194935,87.111272424656789,94.274415695503052,-33.003734567367339,-70.885468322711745,-24.98959752205154,-39.117237431205893,-13.072152458507981,20.8643090863334,-86.905920254652159,57.096570477778847,-142.41134999317433,72.720465625126707,-36.977928627408858,106.41570845902329,166.41083427472572,-142.45662915899914,-69.469461624418798,-60.618279367578481,28.166235199384182,33.044846140217224,-79.865104295539965,147.70544224774949,-8.845475773300862,-2.2929372229957892,-8.5614873560464027,9.3222679822024404,36.003267341900994,6.9260762341554667,38.736007198348474,4.4128130931198584,58.471497087432795,-14.409924812341998,80.376703009464848,-30.901016295583553,39.090952035559773,-52.103301936696923,81.542583119089613,-76.322804941332862,-70.991870244233965,-149.25013697144578,-67.826821751102543,-15.964398516795892,53.678393306722924,-35.404380670938913,-47.096004748796062,-59.562186091602904,40.442671783176152,52.53489325582531,-44.497791341274052,115.60145291288237,157.93303587330621,-83.658247511897201,-99.400126066571943,114.64288688321935,21.988592208291738,-113.8207603139783,-80.530951490868404,-45.760318343954097,-117.37152417923892,-101.90385342138134,12.446984092760829,-79.387219422824643,-7.5413297122826464,46.289772635180107,-58.06929019055513,-2.4896451404589754,-83.719430816097542,148.85986437258478,62.484302076183951,30.053687877414841,-16.473156133593612,21.693461655127912,-2.5257607614654063,-2.4120083576301141,53.205649340965486,-103.53737627761974,98.023486151302308,-102.78671084121147,36.503249310346703,15.771416738514013,-32.376784602600779,-91.720537913168442,81.181085373254234,74.688740538671368,6.8383060795527442,-147.39950500652589,-127.56494451583157,-53.253718762271227,-61.99968747402211,148.00346901739294,93.875176825313616,-181.85871424534614,80.178450135017528,166.24921120917975,-111.41298241748042,-51.180849195588621,65.648702192321892,-33.096224612906717,102.21118761398614,-200.52344180261116,-104.37400332441247,-28.822984241295764,-9.7736989000130077,31.257467154120583,62.141975255541269,-53.613022781046951,131.32925917236727,-134.16771699908602,-27.741808504283263,77.507674889165841,22.552076811718521,14.473557320564245,-95.578698405125664,8.3154353877684457,15.825818827972125,142.53227206753766,127.29420685477643,-129.19084460018519,6.2557688132347327,-1.2707527623058128,-64.761346190285536,-13.595522549003363,-0.88971934281289577,-23.847473739716417,-65.663455576493817,34.233581648464323,-25.958277602363641,-27.877191400896681,27.325076085087886,-54.750214778760821,-23.055556100342493,21.742602553565362,-49.297109706196395,-16.132913983501588,-15.19337509001744,-56.705522027991819,-65.031144561189137,32.93682765371377,-38.373959522777781,-71.815141507484725,8.8764042869700752,71.300663630330206,-65.423568670876705,98.467499611106987,-21.570083025818271,-41.407803660298093,73.64837987904869,-9.9755478263422432,-49.060078578441676,-33.071425547339047,-39.192030467954133,-13.716718911826881,16.613806195655215,-82.526443610541804,5.169134191362506,-20.148660231807433,7.4240030696666182,-39.862667578248519,-11.608368331143877,17.274535281360084,17.970733568113733,-14.216857668906336,3.6797616178773973,44.454605771952295,-15.875425563290243,17.883337213157724,26.918753427719885,-41.512344103078533,-45.960829694816447,-129.36415546017921,-60.188989637180192,-34.303368876994554,-6.0964330304954402,46.566412901990816,55.307038963401993,-40.150713846915728,-35.045828646013867,47.731813213827124,-63.287179317664453,-2.0330853750184477,38.452938373429866,99.09089604112053,-52.647903711926311,-70.550349354447036,24.11601266219008,-45.317654269826335,43.016517634942076,13.499845464739874,-126.97443208972953,-38.092538426803145,-27.047304230866267,-52.465495274363015,-79.11208049123691,-31.743589759692256,33.538569626116129,-62.223641963508094,8.9559199259342606,77.485969184067514,-55.693307012857986,-39.031031236854751,4.2042780152251158,59.799794944421087,-76.979296351980409,-32.918825467495978,-49.293063564053028,13.96603864223796,-104.24016332620853,10.886093215060544,-4.2362345541523787,-5.6787410093879398,-13.747338335179251,-10.406813723587476,62.217570077889746,-3.9440021862584906,-53.018511272723714,-35.061796642839909,20.153534455516983,24.325966616110488,-14.315560159030696,-74.081344083544451,45.117047927696163,14.994263267258722,-31.463282243112815,-4.738011905939703,-0.61343303369628188,16.169890411712633,-3.3143138213307708,-43.972307755940619,-27.583868412928457,2.3309372336778935,-4.1559197464718096,-65.348545803450463,-31.315065227988306,37.587965247734033,4.8337388252352333,-5.2743777056073853,-68.236968417736961,-24.163305504358021,77.379112158703876,89.151202085182092,24.449617170337337,-10.808685648153451,93.879095808188026,-63.461778995492821,84.96150329877787,-0.4567781287638546,-77.287087390387683,5.860834000158178,-41.47468269440153,109.96690489844256,28.480293021806027,-1.1384546120510568,-31.66124506539655,-30.295089992984529,-22.003919585867738,-17.040209780633496,-39.727159804697116,35.293963147656982,-75.433253121062506,-110.97760927092584,-94.511333894780307,-43.396732070794506,19.184443388257286,-79.566290965303779,-14.445093241065567,-130.21494723020714,24.028436998064304,27.574191315461512,99.006846163494316,148.34837156586067,3.1164547138571956,-66.581102445403388,108.93798490560027,27.860978155348192,99.263057481532087,137.67683605492289,98.238476729614376,82.050080835628677,-30.846771528780394,-38.848943697011407,-151.52580265678898,-23.085452524497573,-103.20505965923358,-69.695557958326603,-151.94931321556138,-56.698770899962568,-44.244268246518949,96.431220796645974,54.636649459394619,65.916085384038951,-99.691591502766613,-105.32378204731303,117.89556852479058,23.561827130038658,69.670983653183498,-26.496708760125806,100.16306384415586,-23.986015522122312,-8.9205419588190438,27.269591938192473,-49.948900730150044,-21.636178849143221,40.251745850601388,-175.88566446471202,121.02127006349639,-58.705707679402565,-131.74698611746521,94.428480403963292,23.407472803464771,-12.969250633874029,-156.00462201687304,-19.893387902305872,-126.36832634339356,82.109617665627141,81.175997149397702,131.28298213066748,-111.54433496254336,53.913203070377577,-47.874126144994435,-157.26213849507931,98.970939959962209,64.785509921499056,74.949832666417734,2.3943053024580863,71.943861559683398,-54.064716441336614,119.9470895626408,102.64444873301193,-41.43924251814493,-153.17923335205302,-30.157381701159125,162.54078734846553,-73.218532781930847,-98.902035585088612,168.56466972816787,-103.47902821533133,105.06675058139163,-32.441282640701473,-124.24153637379339,-9.3384026356082437,58.949297151994216,1.1361940487115199,-143.63443245111748,-39.990039188890464,-135.94775680647041,24.98204083033454,24.854440491032292,-30.304864119269187,-60.335538148695917,-13.710668040106732,-25.199536365736037,23.808788449438126,-114.88020888945202,-155.66053750311079,9.0046911591556551,113.12815716042138,122.63533991656894,-33.482055831114451,61.123100881636937,-109.59008080515775,67.338081878636814,91.09220861431514,-75.950423698077827,92.907958881581536,-116.25680641396622,-181.18547629835007,-30.048421095222892,-2.430483522465515,42.19940196970569,78.763499401013803,97.388741946285563,25.46591298811569,5.8100475046727951,60.446728672289161,-79.746213871810838,-51.24353246629115,-98.543324624424571,-45.710991764998866,46.23552608323358,106.4545463039031,80.164495323704585,-40.236005976096045,-57.678856357054087,73.335908161250671,-73.823595032719922,4.0779625649603677,-78.634878372347018,-4.1439557397619211,-61.496409755590868,-77.452650340685935,13.966721374594425,41.896848309353636,-38.299419380606807,75.450909077261002,-12.769250369128709,-41.619507166370127,-14.358672551956118,78.093343643023502,-190.32934126820089,-59.953595409903599,19.979619361285174,106.9411237467083,147.84430735934981,41.835753557539412,70.498344484801891,54.953209127062507,-161.6168972649516,-57.29103422170391,-11.120932947379096,200.27362023727099,170.34705622991839,51.170934277021573,-35.769404808577818,-1.2617357946309085,5.7733635971920236,145.44495765575286,-129.97231511254623,-12.048828208839371,-58.043246812282504,63.862399496522599,157.19066152342219,139.58459754798326,60.296129220070881,-12.722363164197503,-32.735170295150155,-54.075676117233087,42.918559843778411,-19.949518233881033,47.268857334069523,0.57102375373373349,1.8660472834751118,-130.62557032535196,-155.44647876835842,125.58575533919966,41.251809614615091,148.23955118833496,-102.78293654934606,70.879233054849863,121.84042592983329,95.453309080252922,2.8379782514438139,-26.685311052776868,175.82016495143463,155.95545525114633,-4.7495948332295939,28.898629396828994,100.55148583558642,32.555836631053033,-38.449269109233484,32.839177766909053,-2.7607425243413126,30.575838003990292,184.13494643010765,50.212890478314741,102.28933582405148,-59.495124505651475,-73.012905574191493,7.2364341626763178,50.824146708493039,-56.511569477308456,56.863766603900146,-3.0725547025755056,-41.193976122107841,-122.23861507115561,53.045004330050674,35.424723024065102,-125.66311782804777,-72.307000486922561,151.53571429072798,-134.30617999138303,-12.258035763561242,12.463941158702514,82.254238193952645,87.797015338568841,-260.88903090995723,-80.278470504183602,27.788169157095329,-74.548746209856276,20.912345936097253,46.17675226826762,26.091447071051221,-17.341605132206759,-61.530732681311065,226.10503423881778,-35.524624704206033,-77.681432817613057,77.872081969406608,18.041755320159638,-54.899531173731752,75.849446333657824,30.295323973494245,-57.391133032665124,-68.279314760038233,-24.010359856354725,-100.99115086588935,137.76475778729804,-5.1299337737093698,16.71712273186057,-16.882900230006488,34.191176680690553,32.687871272617684,-0.74099342206544883,-171.71827883823312,186.66238938309431,-49.724473072138835,132.5285181102831,-2.1617068172205292,68.101953330376134,-16.031280394055052,102.25569402947315,6.2103723258133314,10.088865046883623,6.6571168775211973,-57.458276416549815,-150.15421933509901,-37.354725052834425,-111.75698157935143,25.299371839802113,-61.872740624833327,115.29938107507198,151.87064571127388,-75.641270440907306,-2.3692480948370296,71.940185070177534,-2.686600933670956,-112.67464182282328,123.52630822609738,-30.567793832620737,-70.274748315635108,-71.611110315891622,-38.932265377077272,-18.680495495325985,-87.561606580877168,-55.720003020617554,91.279291776234601,-74.419560874086045,-56.89347996022839,-115.4734426572608,-39.81306316227225,1.3175897145011675,-55.842624215916757,-70.036194635494468,-88.086798562817563,-17.337570976996133,-1.7519627646127844,-110.11425062478565,74.793598749861744,41.789594679278323,112.1410480654625,10.093142833681583,52.287716854677939,18.55733102340082,27.253802427982603,-107.25963649015493,60.963224863300951,23.949608610164105,38.768426824035799,56.305272659966427,101.73394384182393,93.378686106027558,125.53123029472967,143.15754946609917,-108.43167454250421,-23.160379995452097,74.442740163219639,62.584486313465078,-140.90039337184862,-48.444369316234621,-0.5810619689434624,17.467698649293098,37.007565039342715,-58.132538824943978,-76.897079976841027,-81.94896654479399,-127.72385296276032,-18.876972341023652,69.359268696872874,22.891112913449973,17.806139423379793,89.109950543583579,193.89033666605286,70.518181264447094,51.940650640674107,-18.059277217638581,-85.859610926824303,114.42537557373826,-34.289084377239746,20.556316100310539,-114.18091288488827,-68.422198667056648,-7.503315802643975,52.133711857264089,-100.4110464765853,-70.433959114011145,-24.942164294074317,40.461817376029103,-29.390014722985242,-4.5283140034731755,-79.720347074984318,101.74746393546064,-122.28031830725625,21.079971236577197,-30.842734642366636,-41.536223925442656,36.683055020054695,-71.256451605475192,79.925455742561411,52.838172760208607,-1.4500184181747002,-51.91959643024839,-4.6115747110892684,54.122021380550621,29.853949124570633,88.218070903389489,-200.26674089088186,16.814823910842939,38.620730279666617,-105.02863337629175,32.68729274104286,-0.27012863407121301,162.60343312640194,-25.445962315995303,-52.768553051341691,-106.1922053884385,88.375485438939961,-97.534526529664873,5.2345626714706768,-17.1947234629314,71.911319262898203,-41.663831746252974,9.9493756828863482,-82.590763129044419,-96.625249132426276,-72.681607098958295,110.45881236639974,-15.827896791660365,60.96347880652587,1.706264805976911,-113.5819724701378,57.578506586574591,18.001246991424125,-11.941887553751357,-28.609495434594855,36.762911817928881,-80.716718705420249,-211.35994771319679,-116.53376517865676,15.91903870947184,135.17409147583288,-38.101936542477517,70.6369327336146,18.191160252773916,-52.642511932805405,-99.152394656637767,78.504601813700077,-88.546071168289586,-78.46700807387333,58.645600478530881,-117.90484700554748,-22.896437013883236,-76.713967955012407,156.55185971625991,-123.77776700196924,100.32510111686682,116.07341957303591,11.059594406080862,-64.495351045312105,9.7190087247743584,225.19719951315989,-178.393552843962,209.71236317776828,-6.6187516053724806,128.74725008401975,-101.49293513682883,-20.262061422731506,93.238460451082815,-3.0428853037846126,-5.1622161058199723,-42.339302418043701,81.173549497899842,-11.190182146677973,10.77194899122572,30.294562505383023,-12.288130566509302,90.922837508842349,60.015887962654233,103.70207551134064,-4.2697245940954787,55.783468673080378,28.666069087288292,212.58213685402038,-167.70383620672703,-59.729972282541539,-16.650198591848266,-70.922627300597071,41.525302458758716,139.58052365342115,173.2533707980844,9.3166752934875205,104.41826193346846,-77.074601894000764,183.98790025949376,38.964419889658259,274.46999084732806,-45.51394701835639,-73.495549173174879,-115.20902088559916,-121.48195379670236,-6.4555446496898909,-59.50868272033928,348.80282549778201,67.371270438249127,-94.49743868264845,-265.62191964659797,169.74812519107354,117.22286724924911,-40.971198380212101,89.84587341386306,11.450319360873474,-41.453497223245407,47.226067843622758,-19.148369043327143,105.2371009014787,-90.452856873904182,273.66917064853362,-159.67011537859582,-24.942138418813101,336.2468604244512,-29.812570403259286,38.432318094325133,114.37707834890304,120.81234789727459,23.281652783321782,-24.887058315700152,11.688763159901214,33.11761399015154,-27.201600631416319,-234.42355015417806,165.52243012664246,92.261269124384583,-163.05303850216353,-93.325977552309041,-91.432306721070532,29.425601973779024,264.57697249780051,-128.0186044181944,-68.454011943620529,66.781439246269201,-32.189750882112328,42.985761329955842,-242.98776944724301,139.18764002841937,94.716045677990991,-173.90343170021339,-37.171266535848034,72.82627532528889,126.99401347052209,119.9111222798528,-155.26603218244597,54.505856328113126,-70.153779418464993,96.596153647339449,42.897977567507589,-40.904649959784308,-86.0105185642186,79.739788064655315,-11.727783126939208,-99.922293329541588,37.991698790461129,-150.11160847179798,-42.72373787290168,-30.544502931486601,-176.15182065002566,178.5399977782163,94.48916175225294,-19.384926599054072,368.54650506910559,109.3300853711703,-198.20122956819336,82.121586500572931,-161.48857618058236,18.613613145534345,-254.08832951255897,20.066739058044121,-37.69679215597391,28.306692281821988,-62.258954080389124,50.420867899083497,39.703046013432711,44.755529407047355,-82.225708041749343,69.920947867202088,-168.64102163490531,-40.98627638218089,10.919001523342512,108.62499000809663,-191.40362522750007,-27.574529982723533,-159.53853517983961,80.63958120075165,-72.073592914218864,46.342160964160087,-237.62342661785192,-56.598508608834521,-167.58379939761073,-145.65834898384713,81.227724528405759,-78.45730117474335,-103.58945427991567,-70.599475780214831,-196.40338178072153,43.638512781046501,-188.66396341510745,-40.065900417301336,-51.060533038483698,158.03622002398401,137.77179200250691,135.12253194471413,-100.16779373239061,130.80815927646822,31.004495925098936,234.7110622699098,-252.30252389738513,-41.929482882161778,25.972546022627704,-51.038579418347496,48.353171856578179,185.59643569479829,-12.185750849267063,-30.200798911584197,99.932566187883864,-90.658596881933391,-67.710899333609177,-35.98805728071887,-276.02501529858642,204.95946363376518,237.21062725674597,-122.51602074613334,-7.8175950669449632,-52.194523556209717,110.21121070061645,264.51826301337934,259.33259449812005,213.12951978388753,86.021004868746346,-315.72145961622368,12.892605264696527,-220.35108814457391,95.591166354342747,47.442631873578428,11.029631204253022,-108.13123118945339,27.735638490969873,59.274376188033855,-131.50331497149972,73.179187087480898,-205.94201524958675,13.362196584457564,115.56597093957254,-18.591015838795016,14.862364346642195,-47.822638964499397,-192.54530080892698,-0.68224340643430992,-8.4147403489872801,3.9169912098454134,-64.735330286313214,83.547943532322563,-138.50359191574555,-43.666562803427112,81.607945450932604,106.64402849346898,120.33173823595699,43.076346604084748,13.109679154173229,223.01493270821129,-196.30922561481702,-76.721832776445154,86.120408775035699,-75.273861644007908,-20.768175046460058,129.37558220684022,-190.89751996772185,-21.296520774639163,-44.360893002047064,12.719112268306503,-203.32958041657923,29.925537187679964,-84.991157711722238,76.143179547377997,-258.36694108747474,2.2580361173353225,138.85202301956184,49.72521714117525,56.976672817666412,96.233056117042338,-39.40037594603271,-44.054969859793005,52.431028339398878,135.15483840662628,62.732383826662776,149.8197389747958,-67.523155262399101,-132.81634653150701,39.495381049395995,-25.332830798083883,32.255423689298709,-81.036643440843676,-0.29971852233957463,129.38326323458585,122.07395484288587,-145.58253189624298,37.769022794831493,-186.89358549214961,122.01534724227919,-38.867946227507097,-160.85086735605316,66.592104471827554,-43.062101135674155,106.25023851280042,114.12869662981534,176.52064669843273,-74.229183734570213,-98.377047702518894,38.679080999850648,-70.956011578802716,-41.377697974700169,-33.194136564728282,152.00391941878681,-97.781084174932474,83.32309645351998,177.91346985974545,122.4018771979943,115.8823969835889,132.7030532676454,-44.61472796580739,174.67392874518052,-109.31858063347643,-142.4671030727888,-91.810440386262712,87.03649550898183,-3.4640096253720642,59.562298627260162,40.182342387096746,203.68421663709279,104.12057254405805,-34.559304534998894,-171.68440982995665,60.076323046690355,-7.1607018172384684,228.48827416024187,117.09585996802048,3.219410066821581,147.89373247082278,64.135777575871316,-5.1007014197765983,-3.5301025414576515,-28.050749236651061,-190.95062849756306,215.48059529761042,120.18797133667238,57.35869051549669,-154.2544400367477,113.617581735267,77.806301294266063,-3.8865811514000335,-19.136284804419411,15.449306995363376,-222.12049108167253,-54.963442687453856,314.44422976606643,-83.81211337398905,-268.19424491194883,-190.80983875027417,-166.52697866265399,175.32230787121941,-102.87267272901533,-169.79348261117178,-54.089570846662497,-227.69381783736392,8.2020672741760947,69.495496482877769,80.584590302162297,13.224462253469909,95.662633530074245,57.295962686050473,-78.694136370421148,60.382105824543956,49.786330019319252,-12.538736092407248,-145.5992102643587,154.33413656630057,-105.05916095655789,-103.821981575932,68.175739041406004,100.89435275240126,28.310887166582745,26.463912218284456,22.890164731801082,-24.226672049974027,92.14361107871342,-125.00002634453867,165.99578501681663,-28.531838069353938,-110.7133208044971,-117.73363766101792,109.00743320170352,171.63698628783766,158.35358250040309,-227.08595535663528,-25.508982188424458,11.047435295070422,44.706489410560621,58.362004756617239,-31.904388070013997,-3.0241908960843773,-162.26881664784813,59.486918218017678,53.777881190401885,-42.294930805620041,82.742705749522003,106.69701822711286,89.70755209465338,-26.142480857437619,187.49267868144221,26.333548824146206,43.213689891197014,-51.842143601332523,19.893732028041082,99.07105945738391,-84.961186045528521,130.63930168800709,-7.4510491290980241,-5.5224432328732256,-23.54568500560579,-92.12221422055525,98.623545292905291,-243.79543149420542,-125.30523195573163,-60.09814940361553,103.80079667961974,-170.05614088440944,-8.1617776525596959,-53.212254407596561,140.67758656845695,-249.02558035220008,189.43712288686518,150.16389226719349,64.094531069404837,-102.32258368719845,-191.64725613725827,-8.5754627696042789,-39.179827057450218,122.00817587398519,-6.6012885552856382,152.65602820479447,413.2941641318252,48.918744874171409,101.75874815320296,-98.557663831478223,-251.59128936288465,-33.321995601281884,82.470758415268804,-91.129681689783268,-36.937043192495629,-35.624772976576381,-178.23755132886924,-153.6186779790113,65.684117392172595,-21.145473447912451,193.89241432588886,83.82820581586256,-1.3902984153881519,100.52085587794578,110.07208134164739,-107.93286899461339,150.22101640879524,-125.69772626838618,-202.03457758823004,-205.20811202090164,-241.30458072226844,53.253354591197315,430.36190909630176,10.988591039908016,104.76398328765899,-33.98338274058365,81.986098017511381,275.00660347410025,-17.927566666822955,-110.67644243526152,161.91138259596704,18.998827533661384,-86.706219900235396,-287.984010514293,-141.67359622927475,-247.04202433217478,-134.65683887319594,-108.18848833715251,-224.3851908593557,-219.97933832044276,48.45577622030779,-13.023950854247254,-92.007534506415595,-40.161145811984397,-40.626600868672796,257.74013491974137,38.808720754589849,-140.83154297891818,-10.153255731215225,91.618032265233694,-101.92678546058249,8.0578699959039852,57.328983615741258,196.09919339913151,56.050964365127612,109.02337262300554,-14.030891643341457,-136.96387663459129,30.317509941162751,-226.61904663239625,-48.250162951457597,-316.89580038732271,35.997120561377088,196.71428214948941,-106.77473243777413,51.492042046202855,-6.9257743077085161,-44.544941935134034,-4.3575421655936211,124.09905595506154,-50.994380876943303,35.366393346883712,56.459552286458411,261.57760490534304,69.013348130983076,215.711462290741,97.746247499286781,88.124732808454013,39.460539929295848,-21.529112521414337,-246.03619772223752,-143.05997384242983,95.162641432841383,-74.584112673167283,-124.04811054480216,80.012169279882642,-110.06890015388086,8.2060842241795129,85.546793814429734,45.932745981219867,175.93753418354336,90.065412746970551,-7.9694883972347839,60.667099096092635,74.414891250837769,54.285391932255536,259.82072683437315,2.5702621798067007,176.2812124221677,-27.243868921943488,-5.974501325569392,-232.9926733529735,81.241081899468625,64.904281728301171,-58.449926381428867,163.83691842060114,200.77681085920901,121.9004754738767,174.29260712907822,161.91206542872402,126.74743745823311,-113.92954916432639,260.39877134445447,133.520014123919,-156.62542696765405,-316.29899238183248,179.23377063318765,39.529779589643759,-62.797561964459618,-164.23030046105697,-147.74190211850515,-6.0927207130787941,-37.617453596105705,68.61449477288005,-40.569966337205237,11.750902999686232,22.124926371150117,-122.7057875263326,-132.86054030688689,-93.163788597256911,82.009584294826908,154.8000394878199,1.104219481571648,-46.428251844100998,-93.407167719032628,-90.527065740268128,179.46619380959646,-99.275098749970937,34.32306971844335,-233.82644564589481,-77.43295778222452,-162.21439469447665,-9.9682710746169132,115.70347616865588,-99.165898367295341,-14.772039072238265,-63.983178231469857,72.929223992747467,-58.086867534916685,-119.86106447614202,84.492405514878769,-107.49713406055213,-22.177774228125571,-47.021233455560441,394.76048380513043,-71.713067797396022,116.34841024529726,69.972512205900301,-26.362882460978462,87.591465714793884,-6.8974128035608544,-247.38570872851301,-152.33555964628462,116.3314851911467,129.07564282103502,17.595762901186788,-57.174520242681162,-78.109376008547898,-27.42506205505633,152.44313024886731,95.724800580484171,68.285428155675618,46.314488031353228,63.370996481806003,298.26569521019985,206.99053810958787,-108.30691914120649,124.86891813944743,-89.739374735147351,11.50115637048949,-155.39584026268216,156.01148507433919,102.88247513129309,-21.62103861141911,25.744150287645397,-259.58890772148067,-93.765495309421595,74.337657726761861,-3.9335475784990308,63.867944637774372,249.22611558134747,-211.94916171854263,-185.40259141916874,106.70136163667252,-62.134274083242467,156.28190682506789,4.0488576678192914,177.95654259040677,-136.79709885104558,46.953070451677306,-28.617337343546438,276.95720334308277,-72.247821349745493,-361.24004230664656,-53.00517849626803,170.75443223084969,95.655866741633616,-144.6996711578725,-130.97436886535397,14.925293453175193,-48.701881793902373,40.52377221169651,100.07284517726518,97.257065589823085,-53.276828911246056,38.828282872048334,58.240408712375171,96.742523665575504,-190.33478463505429,104.48762157581785,174.90037577821397,10.013747384895346,-137.74313818269758,179.34185315090011,70.232727197148066,76.609868729920819,145.78309884762308,-53.594700272381928,86.478857225733734,-140.55005759801958,75.176331024794351,-40.88092739461144,-64.003343878409822,0.86641078014169892,44.397174789546582,88.430450109278794,32.395558038723998,220.45310744938971,453.93391214266876,-3.8004573709909337,-30.173298421421691,-49.761019610208166,-7.6986466542385585,-11.948178629839052,-38.028681149602932,29.663815679667195,115.95481600592696,54.876638395970502,-46.901290831519304,-72.382989144936261,-25.890641781774718,86.93687016858496,138.32021312361627,-21.654499195690747,39.245813432683612,65.203708970193645,-79.77560407784496,-122.42922960117912,87.107907425479155,-225.17259333435223,35.215877187856535,-153.61595375821264,269.73816406728071,80.974707505469837,147.07395909212971,-52.874079855377602,44.513395183327361,12.217244542102804,104.61927650804937,207.91143887417473,27.696836148354635,173.47931825047857,176.00386337431516,230.56478353585436,75.028759531252419,-6.3044382822782268,206.0172138360829,183.71491525651291,-80.447171656201732,-7.0995075331553963,83.536457067281702,-36.727095993357892,10.396520966322534,-21.14019038965364,-36.286489024003373,-221.14810603860533,-122.74650744948832,-133.25956182082447,-102.14159613804506,-55.89629044869524,27.213201501313861,42.08488108003548,-88.692571694638104,38.954029745808711,-25.482665222251832,27.168807787934721,214.8047155036991,-42.900264471430162,96.554631641332321,-42.380905478596418,-309.73835917986338,-84.887545296692124,201.46140901867136,-6.7891513805569836,169.48198163852331,110.2120931523915,-95.161236729775339,165.39072201742238,121.38548121199443,-37.377654197122474,-121.78589981833312,98.89333114104349,30.641936903285064,-92.714628245609816,33.527474655231615,-80.181657881621291,24.76387350956038,-12.782409276434743,72.289784642644662,-109.52420584158673,-60.544338955409543,-26.349007667655918,3.000035032873285,-195.45421753445959,5.1985137743425014,69.649979082389351,99.578342334462249,126.79674157231059,-127.09126034518957,72.016040601057739,-26.557312287267251,138.62744591580866,71.685142665125824,32.506546597605862,-138.19663747592475,-188.7791400706235,259.87010502890109,-146.8479951045685,-137.83462141812277,74.321468109981026,271.0486885101256,41.167215314950305,123.93362412672624,-131.80247425728641,-160.1493633378085,-16.488552570194166,-158.68024727172715,51.045604754483762,-17.058908019089372,-58.763382557886985,21.285851273978672,-17.015370726370001,257.01916669743389,-74.831852995329911,-81.941165043018998,129.25983289245829,-24.585206584377769,6.1027952036023905,-54.78358869604542,-33.192445454375367,-225.5623363272818,-286.9891257466511,-67.86498084234654,-310.94898130033539,-2.7764531825142456,170.58403689907732,-1.6098229676073856,239.22169964639849,267.69964526685635,104.4237384503745,84.401266301544737,-4.8921514146447791,19.238457911292642,-170.29099581155353,30.934745172059323,77.629234395343531,269.70070955484772,272.62197825280828,42.090236235436251,186.68129710253905,180.64772489253073,165.41765055472695,103.47368262784711,-74.508044332431524,-107.54039725225698,48.091943314942,-4.7589310595242438,0.73182089902880421,183.08751772748457,-46.9745307681995,-87.382885816655119,-108.2983723312495,189.4684997214016,-162.92200271210604,-177.41851723444137,-117.94384898372775,7.6984108953054147,-132.99568357418795,-89.675600835375874,-112.5451559541948,-178.0954267153478,-126.27682416485297,-121.07450428318491,-26.66396047210921,-91.877465249512582,-39.501785716214101,-52.773363963833319,-74.430833938663241,-134.11778103468714,-4.7917490413246853,-114.99771553796974,68.693938905233068,207.58835084649425,-95.901679318760728,216.91327593556571,51.609613948132392,11.383209555256201,-24.633023436644848,17.009491690572553,166.88367020035301,3.8621274286228795,7.0372182863551167,76.101676251987286,-128.21122009597343,87.0681797736395,222.75887306404698,207.76642435887754,81.167826270013336,-232.68108554979693,17.878715912238853,-62.006040689287516,-21.848227806382329,48.094663297934538,-220.22553180668262,-85.597581536286015,89.186571595521116,35.312298914904375,89.972322533911097,-63.560070367281938,-100.14907354534274,128.5857204902463,-70.257669833930009,-35.838097415448601,64.975730213542533,229.26129356358837,-7.8420510999636122,-58.285983767956239,13.229567509080645,-68.548148433152789,-39.202546678452634,206.56309206845219,39.479218866434479,191.32755957254466,173.08184539051234,-110.70850780109059,209.2585200510477,-28.498051019058337,118.05665352553123,144.16748493695155,-199.36754082154721,167.56001085486756,-285.44459802583179,-14.593059273002552,158.97326560021591,-15.929642674319592,123.83231255432224,-18.970559564447441,38.335378947771588,-218.04560025278266,-32.456962764830919,-31.875059431018954,109.07346003133145,-118.46398657022041,-37.97195531059743,-71.933107214709864,-37.939692796352666,170.103462542984,-133.46834657484243,297.97669162630876,-63.549726604872973,-150.50854328335021,143.41963279710089,-2.5019524592823927,40.47462187898028,-43.202333600117683,37.485363305332243,126.71713553836624,-20.074695789447475,124.84612333701703,69.871080830097569,-138.18872902670253,4.5971015346527366,-71.187192607902688,-371.46148717715914,58.17257176847356,47.112461441320036,-53.804779201908111,244.29071934667223,-117.14046310902732,249.70164409429236,-306.81332665504067,-165.12054161427091,34.104269942266612,-284.70542873441951,127.20146371841018,140.53634073717859,-152.88516758040561,-68.729715867573987,163.79582088345273,-29.351358040688396,-70.635153143197641,169.40948274861375,54.580044602562651,30.197991729187439,-38.492274108537543,83.753141240054333,-7.3516263309235086,-267.81469842574228,-55.539977927329289,-213.05336448772289,-105.21018200828833,108.52760594212025,-39.475385516086611,60.761618852646137,-242.14946011595416,-257.79766468103793,149.19082219832094,-10.260565948518028,-69.18434382071365,67.967031640876272,-78.150613549534626,-107.32875473825646,103.05497460028926,-22.014574033191366,164.65294405843167,-176.62821441970505,-122.95466214933339,-37.342269584234408,65.569889923947997,-75.162937428156766,10.673415108243324,142.96914650784498,-152.99113682689131,-5.6383879602257139,80.758616533712967,68.347069902285199,43.898559940097797,169.33648028850547,28.49055214894247,-179.09839317065453,71.428138152411151,-89.291732839856039,139.047799865359,-1.2857330942780507,-242.17564580986308,-65.854987882045805,-229.3760751104187,-43.947175553616631,-84.668249467011933,163.91205203794686,86.260253933377442,-91.161552881590993,182.23364977910643,-76.937594672894619,-0.80556965648173673,57.81875961416435,-178.4334457808468,123.29153674775804,8.3823563495014071,50.416440765831659,-60.069578581064931,47.304132414120602,-101.58180823174348,-213.81641577308238,105.52194855175912,-47.338955160230398,-71.133249746687738,-76.180555753136304,85.789787908850826,57.945929022421403,8.822430322319466,0.30521093055671145,53.389645525182452,56.22344407407212,-21.316339454265027,-146.29721400046526,-47.898787146266756,111.92661425628955,96.505453527734801,-23.985321752537438,30.134103021876236,9.233446251798302,0.30269598115051366,101.9106700496352,137.95227718513553,40.760891448977688,-10.985280164334899,-4.6480101792248121,-108.68363295242054,-91.749090927934361,-121.4074710623226,18.873019307241982,-75.009980455272711,-62.729391356209518,-111.87849117320033,-79.625618600136931,-73.854809463007172,94.17977173789518,166.93680974306329,-51.121580020427515,91.657927642096382,-189.59887767194428,50.926221321853276,92.812603664781676,-71.093214893028318,-37.62427887517353,83.58708236049344,-150.19942887751864,-20.911502226224343,-67.179595697958149,-53.166019524424541,82.014249416681935,149.14196319960547,-58.735067050426174,120.4017257081685,62.429356731346616,187.61413403574718,12.340425386663256,-57.995787389838782,-109.678219903447,-53.341709260560592,21.442749652728715,9.0790540761103813,65.180110686346978,148.4544446446661,12.016303433255878,50.23257642855873,-12.246376235071025,-158.58776148544564,-17.362458980795495,41.584135388081101,-85.001883619495004,-48.517800928201964,10.622313980406709,-143.10684923931967,110.55689098553898,-7.0529956322559428,39.908525522934745,84.209394869868845,-54.340696033279315,57.707601017312413,-16.512492862633756,42.035116523956752,66.537732322794142,35.751302268323514,99.098172815146967,105.45853157880212,-2.453670244861847,-213.02517069412323,-123.05975412790536,9.2623665759911251,-130.4225276566041,48.008413498068251,-64.897637299468983,-150.33397677141298,6.7674802511251677,246.15824449565756,224.82495137438846,-68.577185099180809,-81.253759227315712,13.174791981905974,65.971820997132255,-24.595405890891627,159.61910045979727,29.395646526968939,-158.8868829212972,-29.699106174244402,-92.131308904870863,-114.29520182262146,-211.19442056842945,21.28584171706288,65.442065034377336,18.686145677393547,-14.780643111100016,67.432813406375459,37.652597559961094,-3.9367813525493816,130.05593643646139,-173.10575511355259,140.4660747527241,76.175826160959929,-80.656274721738185,-49.437169198994255,66.35798441729861,-82.007791036994178,-25.041058615684499,-150.99944451268689,-17.154524397655763,85.037970638282701,-44.798860175314296,7.2660844724150637,89.162311496439983,-218.24640538116432,-21.086412270635677,4.4442511094135355,-67.327615647642176,15.064592311985876,-37.949082031279531,106.59788598084508,-4.0916603411999333,64.279759558918016,-31.501546627906976,156.56665317570653,49.946710765658075,2.7905546555791467,-6.7579547634969188,54.459034867013123,154.81079412737881,-74.929571884940117,-35.364947952617172,160.8030311446928,-137.7356055658893,-107.76497252273035,196.70951382590863,91.408719223900789,132.46182227501168,-227.53103050562686,-4.2424016946511465,73.127211341308865,38.99858840568556,41.097371212636858,-84.587126889944031,-199.29275943726753,108.61293046506576,21.430360603368285,-109.88887137366737,-104.02897284676395,-178.5808526422652,116.66014904022387,105.10206787677063,62.695228206478298,64.22758919270521,-5.1749574617219594,60.244492709150322,50.753775759375827,74.054038317842142,85.355710136337407,31.791198200262016,3.6345577723266871,92.72913383426436,-232.99722475931836,-102.46366913896156,-140.4126183623857,-169.84260290741014,15.261839604849467,193.61977570542578,121.55801068012076,-34.578196604948296,-40.694835925105757,-10.882456315234151,119.35881310543159,-71.534424646326713,271.53782684675821,-2.8538283248017748,62.45701143723263,108.92930409905722,10.51293890357276,160.67720805270238,-250.1218406503055,47.53514614235624,-85.02943194461092,-14.444158767180667,59.993986979519768,-189.24623821680387,58.67071298071842,-124.6321059181609,43.371353411566005,31.429381741618812,-13.090423046740476,-26.718398926871437,54.490523526851902,-57.899494983495913,-127.38246456026758,116.57976581915797,194.94866684885258,-169.00485174919962,-100.95653351933657,-90.301748890488838,-21.801933776658636,-12.443906355763758,-75.292241092528315,-293.35427443061479,-159.25325171326267,142.89460235090542,-136.6288387795467,-175.80597811421748,47.218412692812983,24.863045778226482,-49.704186417417361,-45.903434172380969,81.924589899084623,-292.36441268957412,-49.361916343846701,-51.960852954060215,-179.62398773854957,-85.674352463507404,58.092036176151836,55.198787062272743,-140.50205890111499,170.64119034875065,37.0272858707079,25.503427247579538,-62.949913574277396,117.16071045804316,-78.667412922309879,58.316254804482469,-83.589646759962704,4.928805517736393,-73.889881029684361,97.876438356934642,-91.861047364807078,1.1166754880299763,68.79210126758079,-2.4026375597092748,-145.53607674627335,-137.92312400304326,54.376208592846837,-20.387367286631161,59.395893947366602,-65.017812311934193,-18.99285128878962,-24.026818121832036,-155.6560781441093,33.476651413293588,-110.86833722473398,-1.0647560710649904,-7.4373277377353588,68.198762065613266,-65.070564612450596,96.869807374381224,-23.804688218206714,69.866885828718296,-22.287525647663536,-279.34395627522986,88.593294387768466,-42.684447364958629,141.68152135136972,84.203804169287324,-19.056668930171902,-116.28875029347557,13.611316058369276,-16.493000045810895,-102.32430954450592,74.743089996958119,-48.49484359946446,-49.229798110944927,-74.391640742938506,56.896051155158816,-31.754079032315353,9.7105919945034529,-65.547401340755499,3.1534270858486124,-85.808283090929407,0.66171208769647905,-89.726446733603382,-1.2718652991837152,22.558171849882683,-107.47446768173378,24.843484410934391,-12.45647833122085,-72.132699524803542,56.958127425569508,4.6791260528946879,168.68052714274864,17.836831257103547,-10.610512593627767,-62.520796785026619,-19.206805635015215,118.38398151523158,-101.48971734395218,150.80206200654675,106.36283838883722,36.188657058441066,175.77384761837789,-86.884630958896523,-24.228392719031003,53.218821456576784,-3.9726568165826563,-122.776823874877,-175.39239791509013,-16.808229012374071,-49.101281357959039,-145.93117111251718,-81.59751929343895,-158.38477499103769,12.769433695095472,18.22547314201309,124.01472283545627,-211.41555131855679,96.753084651414184,72.130010743258438,29.684357449226098,72.577176603843469,-41.27300362554368,-125.17786646672819,-175.60144600700593,8.8407303145431086,30.798575566279339,-19.082510660149147,-57.963104936726168,37.441335003657116,-129.87594182546241,-25.935150689839162,-104.32682463522779,-18.476261483506647,0.76819996880135477,-4.2928406805506896,-1.3204447186912915,86.157542424305646,78.613238218634706,63.448430057829647,-97.662257618846525,-4.3006126722758644,122.35590948651972,16.848597792633353,170.47564340504249,69.957314880049495,-76.08759891039324,97.521480112030574,-139.68646176533269,-122.99307483494947,192.97874417525315,121.9625327791011,-20.875921226023991,-29.737023613645825,84.450737610321085,-83.404649942566408,-6.4299151547947773,-33.503882451784719,68.43066566035229,-120.36536237300501,162.69536727173335,17.530960611775953,-4.7993086394770543,-9.8409231842802107,-71.38973116268258,-51.458751490476089,31.789485916834238,276.46649956154482,218.61992083682856,69.019727757454106,-99.635261844084027,24.994315506966089,-41.53521241260529,162.86818797239107,50.198431305705938,39.000346491060725,-27.761332089894623,97.790528713387403,-8.1014322849164984,12.516118680864359,38.512061756745254,-161.50591284035994,-139.3337009053422,58.680318638088892,20.575873315020594,89.514798864786499,29.512033484528402,173.25358403862208,48.830527138167824,92.215340825466811,-51.755024755032359,-77.295905338826628,-27.61354087441212,14.668019086740287,96.732245675560364,13.861800735495265,184.89904040686372,12.866579572370597,0.50960464207020095,-6.4532076601683599,-162.20242589619463,12.331398680052224,7.3818517279784857,10.140025749662126,47.91635287581682,51.483928291239458,48.545862915230366,-61.715793006804383,-159.89342256947191,-142.33418035602818,-30.879823957978665,-62.645145713933147,-221.03311161871068,-71.729714080905779,42.560725154776982,-44.264917481181726,17.293743984335492,0.11043960344935311,-118.21376294523562,-125.9633083780175,120.644544132655,-95.328499279465575,-1.2984977830387567,-46.430971313638715,92.552070752988669,56.760231248433627,-39.325154941571071,-28.415236691219039,-131.1488635653167,-6.0592713050122882,56.868510895577657,57.626720607701493,-105.52932890302165,40.91080286740543,-61.021515410947259,-105.69558014673774,44.692955203123006,-177.42147650977327,-57.627236179891881,-10.276008795385508,-253.20259414681607,-12.357632526224013,146.0903980182764,124.64309004045211,61.493422271532886,78.290068916238411,0.020646218921683612,4.6563259871760803,-94.223188032327243,24.537637012725739,-128.12305099542448,52.774909743520794,75.309426984691839,13.814553022536103,1.0930038847946939,155.06636968625742,73.272516417599263,28.240279135321877,76.800953289186481,141.93156231684668,71.140767041149331,-258.9424872476273,-48.279983383993503,277.27364477077759,107.70365185714402,-26.227275969894571,48.15889344660301,76.738383283348639,-6.2346047838914789,-46.851490435570859,-3.9722497738186355,70.28705107462342,38.836671436125847,53.983782075862138,-51.011842952772042,101.02309796010478,9.5751552202592265,150.59290242598482,-83.946247501771069,47.154780710587659,-18.414313065305194,56.642934683568598,-137.1702474998134,-98.025400645514978,-25.906164367966774,172.19361729283071,30.889201510646757,-95.134907089811733,-46.016796362526371,27.235723152483093,-97.087767682274176,-37.524247179123478,138.56772024342621,-127.39910480833612,76.360325450724048,-35.768665103492872,-35.10505469810041,-18.036448165523613,-59.772900232248567,-130.44097403357989,7.0767741868347329,103.10065833378391,-101.07654060834346,-84.350786869245212,90.122731345917899,-141.53431155376484,-95.210357410640341,-67.588218806561144,281.22399619641112,-78.943033004630919,-96.160780642757473,-69.378562936354541,170.26169910634997,-45.12607747845999,23.391189567683238,-16.877254716470109,94.425742015892965,-156.62550607016266,-98.224103690489841,-26.949057989829988,36.048167438077478,-18.547129058772807,-138.04189264166104,-45.707147872572271,-8.693504959213687,94.097239196543256,-45.022164251073207,-46.046749679184551,-72.461298439653788,-50.105096655783683,113.09755709974277,65.394535790777951,-89.44288132032159,-143.32208247811892,-81.418246597191796,18.157029471550253,3.3386940449598832,-57.509784366856096,106.18034240421335,-63.322872083564562,91.181182679191039,57.242902995183861,189.11038970578105,96.074395347386599,-284.15654418990016,-57.783687265928776,38.752385155661869,38.226617665774015,17.478955478396067,-74.52180560872975,-3.6870722882012927,34.017683213238662,-247.37959688686539,-233.73889928525881,184.15261382157601,-44.185881845032696,274.18924341506693,-159.22408397778182,-164.21752947614817,24.73372699518697,-115.33910005884287,83.670120291799194,0.27578833708511041,170.15285627625039,60.014683359573596,-129.64594056860781,-92.640072481419153,295.83255741450375,88.130972439973561,-221.46620274085498,236.40289062895229,69.119956537050342,-73.328797261967495,-41.298578942103262,-40.499473305766969,118.68925310666719,-20.553586391127638,199.19580902924855,57.889186396812505,44.357230216864266,-94.96189027211112,-119.77819878658251,55.961879007340649,108.56485103372026,87.123051103179023,-82.379782948018047,24.563268867325739,-14.928158864801979,7.6108499471685285,-2.0105492428872083,-247.34014326174423,50.119806486581496,52.187806847439454,138.56259623785826,118.9209744823992,-63.125584527370776,-115.49549468960163,103.58865022765933,-39.925968179998307,18.608022277328686,255.18368984902767,-120.17777679197386,-70.294320870019476,-168.99189599459572,348.37279974385552,-19.474551025899601,38.452723270775373,-181.22147779678954,-40.40796148268214,40.229652678686328,59.028735482875021,9.2288945878729507,39.681841285399841,94.85636614306965,-239.50480005965423,-164.16008013405744,119.04434369204371,-29.826078039790609,-143.63517774844573,141.689210097645,-113.11291232302167,249.02033388472159,35.639902173222282,-48.669753031395146,40.918071589982439,164.19300497801331,174.80243452602426,-126.33135024480384,-37.740216916894781,42.832937495955967,-137.08203277239801,131.25676408933512,-82.648530565623133,-107.5646155955007,70.149103097672381,23.730733871624693,44.317555867250789,-68.096610878763755,-18.609207400595871,-58.722978743497599,183.4674247665809,59.27771728362044,-118.20220759200583,24.995886059477883,-39.080747155904568,-88.719706935585123,104.54682559381615,273.62840339620124,-58.544096250858175,108.81302530867166,-82.577532992264139,-5.7891474280365856,27.951859409634139,-12.718788114490781,130.9709631077406,-164.13155663657665,-63.761170935867597,-43.058008754669622,-13.127147626240095,-14.9380111981352,-11.056535923364052,93.837922896223546,84.282147148829381,120.1609028670222,96.825439170545934,-5.7502718681107652,-14.222042434285711,-30.569774642874492,-188.19025435521775,37.128409062845186,-46.29664571779098,52.559274844651739,94.39185959057626,51.68482168676401,45.059772990997914,9.2359296830616344,-238.17662767749337,-97.098889731961592,210.08542087306409,-106.65456529517739,-140.3611656046368,57.673872091804327,-123.95347966574579,11.977354402989535,-41.172561774903144,28.907085413331064,24.273009593132159,-154.49871556624072,97.302213949138235,122.85940005253428,-68.060689111064647,-299.31446769349066,319.9503333217769,40.567081588446115,218.24410701025857,92.980187700082439,-127.31618281260248,-118.46742567504148,-73.849418063090042,-142.82155938002722,-199.96639185193439,22.156354043926115,-126.28226227719176,-27.787182021714635,-133.26077154556191,-177.37426935716945,32.68726146831348,-93.56313585491182,-105.1487253128537,177.23172745528544,-47.743364425729993,-72.920429021728069,133.49175459279533,16.506936253409211,-188.40185635552635,70.462224676794193,144.66585484835608,-121.76474912373672,-73.00955874961322,-2.6023020802807508,128.63020664809869,-28.08378912043419,-91.598287571876824,-177.70896314483701,-131.51767039810505,-72.684593827410339,-51.589793418413691,-206.53349968552126,125.54001551452274,-184.08633703397408,76.457743089485959,-62.844891512943548,103.38672503823696,241.7820817355769,-228.43120907639224,104.18924819552018,-96.454642735206932,82.722767655182608,-96.135474379203828,-46.477836499722947,17.094236017563588,60.806731067712604,-96.351370632204237,-94.814918986315575,191.02705595690514,-192.45472281595005,-75.951214912623186,19.50212671464589,210.0209738569888,-66.916365452030391,-139.76109514419869,284.26137325207117,5.7981986489860553,95.016840148059487,41.744455136916059,86.560112390681709,33.571822948733306,9.9765360064456843,25.267196466108842,-14.702515276785121,14.849551985120517,158.12268335886495,45.642111827107414,-1.735760074700238,-141.13688113644838,231.45937585282778,-115.51234950109371,-26.759373359401607,-211.42825656340048,-34.230445724197395,188.71276639473942,52.043138206923729,-81.423807464023724,-202.94188797490386,-80.976881756567181,-89.164644573903956,43.685319499329985,36.422395321774154,-41.119512498684067,46.640105092464815,-78.187937752356248,-143.63524708193404,-26.951735869695092,155.1030429115435,126.42508718232146,-33.460532626217265,-13.590595226438893,15.629196903875467,193.21310130172344,-20.024941489239467,18.481512380419247,173.0486238686284,9.0939237698996607,-309.60203266114434,1.1064976071180581,-82.171453410828633,131.79579083715967,-221.20000444800291,-5.9832170677974901,160.69881322947981,-94.852599679896286,0.49075895115595358,18.299546784675414,-128.02098888145321,100.33204737075067,229.65347796197116,24.852920239601055,76.714281141828479,-5.2683942338324243,111.79241421089461,-107.13775625294687,-331.02568334602961,25.038260566696025,109.89664320834112,7.0387618803303553,-37.50313061717236,14.802356734126221,-15.126501384535196,99.199777145650799,-14.121256826572974,175.75676039781385,-241.62638154110749,-10.306966085798678,-60.971539638591352,11.67184106912314,44.619676028229037,-70.735937406784501,-26.322344158924508,81.948215239444522,479.35111622382334,156.29999297662494,41.174536957770151,96.07418060011041,202.1347716044946,-182.87166390791947,114.15848326687791,-27.784109212628191,-221.92900671939901,-222.66139903627061,59.610773550566165,-71.131063743330373,56.932273996502673,-21.953680560400855,119.586573721778,-70.154778889115846,53.315812933797737,132.4583659055138,21.613059868107563,-34.76044462467754,-137.03393298234988,-168.4182902620847,17.998441636480592,-19.862958369429506,207.14247815178337,-21.376151490681195,34.82648367786615,110.61555796718903,35.02053772912501,-62.113277475151577,-54.4372176730418,-68.591104434801778,207.06771312270828,-129.1431317743149,-44.024606669232895,-70.961569300107428,-26.477371885847305,93.124601276206818,-27.913258255225699,-85.172957037953523,162.65774333264048,253.11020560072666,-137.94117111168282,-277.43128512206368,189.4859805631072,195.69779167626848,147.49634919459854,300.31166138745652,-244.55489890630997,-20.264909020874079,-277.29366775025085,100.85080748502511,-76.292418121694837,-3.1912225959913272,113.78593413705153,90.360987191573741,-69.144474957791303,36.557630695319084,5.5104708620135341,113.80114762981296,-138.21661380829892,129.48177963720534,158.20358650163794,-40.694486582389871,92.153380314238291,-117.81384196853492,55.039010839257884,-139.78138078150337,-57.878371461112749,-112.4519166708306,216.86037526520295,-283.66292742343217,134.74062369900972,-106.59479073969896,-82.613157710417994,94.782191745699464,5.586825357672204,-165.47588436255899,200.56381908691554,-156.89223240243541,-360.50434867850265,38.787608862692885,-104.93973507119503,201.65571906074311,86.835211180543979,-193.53941681591007,-48.230698126047457,-11.633299483574049,69.963641806436144,268.77855673536158,58.738881008542762,30.018121795341649,-109.93320737853438,93.133548329650253,-76.484541149598869,-85.941524133277511,-77.230695556545413,-31.248497189926365,-57.968981009928854,-107.71913236424709,161.3074359698752,0.38508864498534479,-156.0050168692818,-223.24846169254997,-88.193740404393026,12.386921193965236,105.36397646124523,-172.11706208792276,-138.6506496402512,227.47671391309137,-56.576267866292994,135.76056038383209,-151.42015787003973,-98.806077756966857,33.473955429161236,51.589943231588833,-133.53023611103697,-24.652173370857611,-179.06783566916036,264.48716278864214,153.2074806701811,5.30447954906262,210.93164564934341,-75.958139738788503,32.112217389193432,-15.191593471502344,-5.1995931865422449,128.71772963585462,-47.297624206281078,84.327819394921164,78.128178211401419,-40.348712683994158,-90.037800131616748,143.7179765051898,71.364767959155785,-3.5113898796412926,-177.58249045904805,-55.08378595177124,107.47678895600492,23.127239776114507,166.98151904855609,-217.99301138890596,-144.92529897579419,-94.804536343809573,77.324971020503199,-102.29495000561035,17.67658492487103,116.84074846456507,243.24514945860278,-286.82125992599947,-27.177916923317053,-29.542238917631444,154.48477094269825,111.58500054537438,-26.621870630178506,-1.0296611800529973,-85.088987360292293,-51.801814740644133,35.625626696067002,-313.81521095962506,-87.337800353078507,-90.964541372370093,-26.09646072813732,179.87277256636781,-170.85416661707575,232.76328923508277,-98.476014877705694,-191.72037592895396,6.317854927464527,-34.950517983851277,-141.93164684272745,146.64232747314227,-4.2770539365423517,123.50728029052836,142.82538938037453,22.756519201622396,103.62296167969185,165.8632786294877,40.594122915737998,-5.2118039977828232,129.19842786684669,-56.939603556043707,22.465235124632756,-156.09655629066944,6.8064084514065826,108.36591640152503,-9.7146166873551323,211.05367907994011,-68.540225612212751,-10.981560399198123,-11.944123837233413,-204.5249182132701,-169.08719065204619,-47.151831915974668,-21.136731963364774,262.29760653947716,-162.83241926528666,-156.60891281211755,-134.24790524869076,-191.59609757844751,45.159676167780901,-193.08045073792826,11.237908920660701,-115.02307742635944,184.16979361369553,-62.167817062402676,-88.437775886888488,-26.309765211635757,-105.93394394671799,36.979081090543104,-57.162661888553053,-76.866433517742166,46.045194586450251,-238.04324990611866,-25.289820150187488,-132.67675852649916,105.78324645754547,-22.984935264729216,38.468569221064712,142.24622940921995,-189.59712306320702,-192.7141650084009,-12.472297519210798,6.4089245809322115,-52.372884136408864,124.84231249847053,-105.13238540778406,65.61257110786805,105.10380621629713,76.279766442098207,-87.934255842050405,-145.7459386220049,-8.2975245876112389,-66.008546245071315,27.165130231921413,-25.753457133327146,-102.20057617816897,216.20258144113589,183.58657949658178,27.897625090533516,-80.845142875845184,-169.30608551553269,-102.41482043344487,-65.751511754132039,-122.28947212198455,-81.672651364696748,60.193476550710194,28.118889759028718,-44.208996952505331,-113.31590444854479,177.59020655964724,-95.152405330428053,188.54686634120992,-89.628863906074088,45.458823654897714,18.849156538697798,76.918282758005887,42.329712529374817,52.742129696449346,-70.715587214751949,196.64103279897162,84.249793810607656,207.37965756750117,-75.639770706149619,-172.9884062994019,64.413358104271083,119.62498564137415,32.631896164104425,125.52158740664694,42.297428080669732,3.2693077830026311,8.934178822541293,23.156504110282192,-42.409216794815165,-62.318639627540918,-120.48263700026313,-183.11962435315627,253.16150588462182,197.31380728391005,-182.46755712275944,-182.17327820298874,239.42599054365368,144.93498277464886,113.17408441957386,-11.785805213359648,7.8688348678981157,-160.99993468331431,125.14493395698786,67.400912094029636,300.10442095449582,18.097690827104842,19.050314479112107,44.487538073701856,-31.742515490282294,-54.091882803637446,-133.81696141719866,-135.19379961611315,69.86038433157826,-54.230371658952649,176.19004548428998,-44.494105801929585,-3.4497525722038986,26.522611947063631,41.291125861031681,-196.84364474188584,115.05136497437729,-179.63056914020194,175.23254754115072,-150.43178245799726,108.14768825738187,-1.2519411450295621,-213.75051642210394,-146.60806500526024,-32.391585625687085,-73.654796051811246,-73.331082170987088,30.121740507915995,262.56260891911762,-18.628926818217622,-22.86380650706316,-128.30689841050986,-58.974273932532235,-27.413750836973051,-19.455381938638006,-132.06168805360824,82.624467472081164,-71.509125912978405,-141.29049514887285,3.2686254396499104,318.12095353782274,-60.384521574929828,99.674226634034184,-37.125248083023308,56.982425669052404,34.37289618771652,167.46118558632566,-143.86315366317135,-28.82291528292005,-6.5127869924391391,-77.496032647134257,-75.447541908412433,334.88244516524878,102.37116720429023,119.79284400722511,-73.141857246770712,-39.201766238980213,-82.094118682535182,81.708867725330322,-1.2448208216343488,132.00294241002598,-109.83712748049875,27.880183570688821,83.431693978294931,35.415560550232264,90.877059372693225,100.41480897304189,111.79958908807463,77.344344899533851,-27.937307158152962,-237.93216800587709,-248.15495619905391,8.9986460678028806,30.723048753452666,-120.44118198416916,-47.341263683854351,144.02890013352894,144.18666045188809,68.38730184228092,-138.59369235706097,-79.801223413087513,116.79668650528046,-80.32342103787343,-74.841082070295585,-33.269669000633279,104.24472144573878,52.665481656095309,-175.33651887113899,-4.4189274596058965,-191.87092840387231,-137.93702755817506,56.415636889001391,-137.07249999836634,-228.21602533235622,258.71802661480979,324.20787375075747,92.958595292422785,-73.14082573755951,4.0439973018215802,65.735328559125279,35.08708417554206,-111.083549761325,205.34819893246862,117.36223522254464,-127.49293356474345,-34.939034659797336,-1.4066855872126958,-38.720693417494203,11.678543662220751,7.8854022306657185,10.050197450704289,57.532183623097218,-82.51238767157929,238.79066866024016,-129.35083229872296,93.332179361165743,-91.25824121128106,-198.6071503110978,30.245363502370488,52.730331342407929,72.738118853661987,170.59397607914781,182.61866241626686,5.4369260538208337,39.883201833185893,132.55712659869769,-100.5146146143946,-87.166272564437747,28.529509948656852,304.57656414328557,24.76771561552631,16.780453717618883,-13.488667053193637,-10.96388428963612,102.78762959913057,49.902786912598643,54.852261668651444,-87.907541553102092,195.72049059745763,-167.8922910693816,-163.04668153258746,48.117383191435316,-166.33976735619967,-123.03648754847001,216.25188977962884,-72.359495985132511,-48.165234529946332,-24.421897068413013,-79.414440973997472,-307.74735537084587,44.541379607721524,-54.743283921739042,-4.3044134825067459,65.253180244389057,151.9693290830956,19.17500887170776,108.46247551853253,274.49233312725914,-127.02515636781339,-24.44825007858509,107.98085492331651,20.439710270805733,-140.48839357023834,-99.922992950178298,35.970670148135433,-98.629576320419062,45.89063617343254,-122.03113658209398,210.061875279047,-115.68667662053764,153.31532504333248,-55.187580062427578,193.67017515924184,-60.5453311644536,232.62854863261896,-37.536813090103635,-172.65181966872535,-106.88724091962803,-5.195475735281633,-70.122777090456438,-78.649362977605932,45.452572937929361,38.98549886536442,57.683221620666139,-21.424324139728043,77.900703945655906,301.69271510615738,-21.258548864223027,-218.45407120456758,-90.746733152884218,157.37434404336966,-72.607302212865747,32.266308599012149,-40.249980874776348,85.044273791097211,31.657497471268726,19.330382745497559,42.984372265353592,17.797432505649795,40.605133321560714,50.296959771362211,129.35272031885827,128.78145141654298,3.501462553931006,-251.80501604317277,38.668312920231926,-2.2541927902999817,58.521182431725265,107.36837335510602,234.34587840491562,-73.17878602570218,-79.543605818866581,-4.0094241514917748,77.912403811363106,-68.950973286371948,138.50022287095533,-124.86691619492126,-77.620752314370577,38.47880188662878,-133.6539332642692,48.358113541439025,-160.25721969888031,105.67861613933158,-105.67943078601945,184.52147493475627,-123.4059782117244,-51.892200398801592,28.959912302606512,-22.219353238687809,92.782846565565421,-68.744780843572258,-90.214681528840686,-10.685930926011789,-106.18561215899851,-57.674767705432963,-12.587592782909059,15.52957611693261,110.87077018157608,-265.64005363625847,-23.64869080747259,69.069076624205223,86.519518593729828,123.07144714586943,-146.9869929009071,-147.91895367268586,133.56087370801561,-72.675134692892385,105.65061020541648,19.617286790124695,-27.76427062905271,-144.52436492726065,18.44633412322635,-161.67888264836941,165.79797833266713,-59.01212955118293,-60.423146816749586,53.702881289793368,-22.321384000141762,-12.836036576751852,125.57251148367489,-117.18311520201783,21.207714250615041,-108.79851835387757,-104.25789864353025,-203.17495706505287,-4.5732180640704314,65.517698782363823,93.393586858217731,-41.626900821758476,180.44529662608718,-187.52067480147531,-49.782528938322805,39.537698930233461,163.28909366746973,67.817273347092453,93.940936851039652,48.833724431233598,98.969209644315228,137.00081852738654,-116.77843538601097,-53.821922763275509,30.189506464652425,-25.955305050568555,-230.53511268670587,159.23089655225152,11.765272032822029,-13.573933989399066,6.1114253909088596,-0.12960442885575674,-25.058327750987672,-176.1562195984047,-6.8785217760592161,-75.935240323871909,-43.074631034816065,-43.095189147937546,193.48733667858144,-2.6601097866936527,52.377813626824562,-36.552275642219506,-308.23584734905899,95.6627708904591,-154.07390131362652,175.28324611889133,136.85423894925802,72.825939972336727,53.363204308776687,-50.826293241115394,-84.423071526532937,1.94689067479176,250.14019136671843,-9.4341425010265851,-71.657189302199328,-89.502671528878182,-30.56607489350742,-110.88043921902113,-69.320870134979486,-275.01606680452824,143.77341044438401,-170.2569578390808,52.279219414464073,203.23463564759589,-11.972320042203442,134.69597211952876,153.15744969099185,118.48845197238003,29.993793979916674,45.773382013083385,29.468734313847747,80.051768791352032,-167.27164994301407,187.00045834650834,51.886594972719145,116.29853327227615,-128.6485469760525,10.156589593465668,-123.25813507759494,316.44306813115554,118.59188607688868,-88.484494736441491,-92.96591108154999,111.53540921048214,-27.38252521522103,-3.7721828286495835,-281.45538582402361,-95.169350639787467,55.180520759021562,83.425475420184398,-101.2956634552841,280.00432030085796,-129.22406032210239,-179.95360121089593,56.208548858679421,-17.908169199308357,182.1855165238461,-23.753307097192547,24.697198661399554,172.25132512794559,-106.54587926554478,-84.633209648109201,126.98372044068276,58.486553132616692,180.58934510757325,39.590525435606381,278.71913904569476,51.708671124107923,-82.367060011351498,-170.67240599343501,-151.01041247480646,228.4242779555274,39.313158508742973,-126.23588545964472,-119.52885305730737,46.121958015122388,-39.700852582955598,-36.766439345281654,16.870683995129532,-234.11092792744799,-87.072476308897137,-266.92423435237947,-5.9628012620857511,179.1344199999163,48.993326079929993,15.182223966796634,193.60342278256513,73.998869259649908,-136.87673870200618,-176.48805601690935,-81.079165125719783,90.006142910650539,18.667275914828707,97.106017003492113,-11.00003971166398,8.19096266348852,139.0639268634103,-32.99337234120911,65.601466187080945,79.43674959599106,33.262075955824585,82.981845371142953,248.85624722461245,110.53384735511399,151.76739279919735,141.99632743320601,66.902673639235474,189.18916299702533,157.27390141620964,-64.219197821082673,150.08999955257161,-4.5047179420809016,-175.81287821502235,18.724381667231,-43.534813987211614,70.830103570966116,-77.852211220113205,118.32113349769863,102.05421009485676,-145.68508117742959,85.340892555684292,12.258730042437811,23.994932163173928,-50.802457668212753,-121.06915379993359,240.65136200079712,77.179164765183302,29.566261195528796,-121.72703766287222,-144.41551794428921,285.41812447627387,23.003586836753684,22.019548290188791,-310.90065376654979,-134.22906922181218,195.04812961419918,16.424931333037989,185.90362108980383,70.006634956481804,82.568947309860789,85.23097738215688,-111.7297672259195,210.61420908420331,-17.54319607640576,36.548585630556161,-134.43898253530412,57.468582139072865,-220.16376324709265,-178.91739944857173,-43.673685638116773,-36.247288419979959,55.939526423812119,-156.27781847470601,-7.4368263781878738,-137.47839431842129,41.991593937203568,72.726371171514899,19.988095522203238,42.896671759501665,-69.557512920897139,105.38442307624311,138.55633147024781,-116.35547388516304,-157.76700382574589,119.72340605905367,187.47299461960205,-130.39348818467698,-60.993969519461459,173.87010994005277,-100.09766824135664,127.75805953700061,170.27931339096614,224.13311055950351,-19.495523517784918,54.253964981053187,29.259675389135907,278.91284196614879,-87.240513855651869,-211.81588212387601,-47.126908077033931,-232.88361314352085,30.745113389892566,116.10087126527807,54.100154004042423,-228.22296733869464,-44.782624968415412,-181.49408822741759,-163.50569329479359,-21.640016165401288,112.47594148791218,119.52102798559723,-97.674033948876129,-70.740440941064719,-141.91166105087342,133.94617486141669,-64.792471414044314,-254.9630793023359,-55.251780954293991,-148.02289744579298,-89.961526452109268,7.9994930073500541,159.17129938708086,45.322074857409831,-202.78530110867806,71.428695486105738,49.638293299207334,144.82666475911606,164.02478105455805,-49.088107638019792,112.89564849308272,318.12382820478263,32.132051595810267,135.96451765088705,-130.73012611543527,-6.5840573243564364,135.72938427833148,-98.774995104165043,7.017007330174124,115.79163812813931,70.823237787679133,-133.18462060100549,-22.418504480314738,418.14319349140254,231.76379191196196,140.34231562952937,-99.556427584932464,-5.2474704446535725,-186.76647774329945,-201.8204999360571,-80.901678241815645,-30.712996531029788,-100.80049349372763,209.5588695809877,89.343296508215332,118.38058928142453,55.199996221234954,-204.24931878523216,116.41170815192888,-108.32812412106824,-20.37475595032242,-32.127209480856074,16.359968712759958,-30.794300365319828,40.26645176079203,-107.60956200099525,206.99629104515617,73.645951289509554,85.220009459552386,254.08528484871712,-88.456347098136149,30.762912213456531,-140.09088409731066,-137.21978779194521,-108.47247889975334,-55.162910725890242,53.807377440594557,-47.017002038453576,26.390058449361021,-153.20895839027594,79.101227305828786,239.59921337999333,-57.501782350912343,6.1065520363018848,46.511454120881609,81.584147886446516,174.98303540917627,131.01603124957057,-10.486454007793785,18.691657951285904,-18.801624598714341,13.78195883378261,81.52895535937796,-79.403533772557694,-147.44788317581126,-78.949463081179971,43.734745893055447,-187.71099485374936,-106.84804826552229,-72.376987547762823,31.397593399894703,-118.12898632639944,147.27368118061207,-116.77649512535987,105.16782781659377,-87.032609895203322,-162.51738788536181,155.44387876332888,-250.82736143119502,143.1631338950906,13.405888511888577,-23.860651205073168,57.598170090761087,142.274470957413,-96.486296823589413,113.26363137194753,-111.69696918027856,-134.79341543798526,-36.134582271709604,141.31587918883486,-7.7056404898686068,-62.672282527334097,-54.336160407090304,-97.14720990739103,217.36274099273265,42.394527695770122,37.481783911436168,38.791786756181189,109.16998561823503,-272.8763511101821,40.217185650270771,-31.594961765802637,121.42462676076482,57.233667137064742,169.44286674903742,-156.89683645937549,8.3789109092254677,-157.31016057923392,168.89064225097425,-137.32384548331322,65.297904363767628,54.823720094667621,182.51486029280525,134.41086279008596,20.512925156150956,-82.05222744121545,-205.23393651448646,-22.473170069380117,-54.184698380928069,-218.98641834772985,78.429174594595452,109.19131950580132,-181.89238370659891,41.401737107956691,107.56674093196899,-55.34743915163304,225.53777697383171,-73.236736473359656,28.986863872657722,-154.61473059864619,162.25658614796345,325.8271757386089,-42.368089324532349,-78.160705232958904,-160.66414530189897,-83.636564412521039,-27.214956533110652,310.51733863943804,128.18464656952904,152.63295717544227,-115.2948631407957,-71.057865814507323,-93.69888086681965,-213.71962937921626,-229.97204548885978,-43.617041575030903,0.14267821132679614,-69.842425064367518,-8.5897027428662867,121.35091706600403,115.0173075694466,222.62590380385677,-184.42144992509762,-195.33362981404915,-3.6312742891265177,-168.45386400841437,97.382631300611507,-133.56585712541437,42.077487108589921,-208.86826329611699,-41.044935255839221,12.427271771519834,-66.373825952118153,-208.38199261589222,-121.54686901065446,-340.19882003351415,36.452672713446077,12.347924777106329,86.357477151872885,7.1199948975249896,-173.78097097050761,-94.54004965164755,-137.76959023597141,160.69544993509956,204.8777695271026,-211.01964888456854,-466.84985435610002,100.10563438462223,-106.8972284763783,207.73957632839148,144.54303696964791,-278.14388620668763,126.24938245704547,-242.4482065572829,-48.622047098746307,-214.76497639103718,327.94591206201881,143.30611198329481,99.132717522087788,158.25160817368302,-215.29881808272086,-28.582833449044571,-320.02415152014009,-32.381229628299941,154.13240993582903,-53.00898064793131,-79.729171259177619,-106.72965744715468,-56.552986003303545,75.492942875320409,-122.66559913815431,268.12792281151241,-205.83171945343486,-112.72826928402259,-19.286359350955692,-53.124604792564298,-163.76692938087115,80.010647183828553,68.7754784611258,-39.807537109600219,-130.7921284779882,-85.633057426979178,280.71755691988278,-58.890767295941501,-102.20431830430343,-11.490062140080965,140.77902530068002,45.250493325192309,-76.628806429167412,23.638830563682667,-56.122672549246779,-66.907619335068404,-79.280622237934978,-110.50378571422219,-60.629233856386577,167.5845299233207,13.930830680001907,162.36133762270978,144.24765018339195,235.25646969059011,76.967183989847996,-205.55396913692135,-67.48714888026602,-107.23000669414982,-77.165113676618375,-291.60793311713888,268.22551093642642,-101.29836753834991,43.138334834553042,116.21548792097011,1.6337471056170081,-74.865191982970401,-35.868437772051784,-131.12932476497403,-51.846125677115992,-120.21453314250223,121.0134397706023,68.521566649995208,176.86842197163543,46.593401861882569,262.06942800843689,-125.18197164972887,-108.50075309342327,-168.17192657217402,22.859771651641331,-29.455414283519502,175.24670771048955,-0.85768953806486437,-20.127608642320752,-181.9656470715436,148.1489606897193,-54.131984241539527,-57.147800404657588,175.5698863068788,3.4905018470435323,105.93416421160865,-30.154237015863181,50.380976151963516,85.039906559865273,-16.205059723698014,-29.525758155792282,148.28039106809206,97.243726097134683,90.579310179760512,102.03293277116926,14.320142539567701,52.086130269658618,-248.17337472422471,195.29335916206128,-172.12862174910697,79.426462550349299,-179.51436639097579,-151.07654350584767,-91.640596078265958,-135.9879628571548,95.665938500919367,86.898638570385089,-60.26547224846523,-87.612088998737974,165.93800606224036,41.654857626317401,-172.67446574553901,-12.875547545558895,-169.02845640666337,65.46779559670432,37.030006128164302,-52.376118927463928,-20.900142291568457,126.4311244269032,7.705424114198081,17.67734198866339,132.07579451315658,16.248029649406931,-274.61380324355929,-199.56986916286624,-72.196835335344076,-547.7879535779357,70.840212074631765,-39.957824158911791,-12.057235132341908,-286.90566716974962,-34.864797429060232,-45.864009123445655,148.05752534513243,80.029342127783693,64.787552937064589,58.221594730832116,52.312054868350486,-78.030844008262648,-42.132674625892307,-74.074209622855051,-68.931849899004959,-77.18645895954316,-8.2103258803117249,275.92577680902781,49.280695808389908,-49.778759780575946,-30.576968766383779,69.132948682977343,-224.69994955180084,-30.362192379933809,78.28964595077305,-28.515340703698577,-13.314184114247126,-40.809660100554922,17.768782781567477,-50.238703038259182,-190.43695474346202,155.20320234678422,0.93539168556711161,21.178776153769661,-96.810133728347395,-61.010957434352086,136.05241168817395,-10.506691713479945,-170.57267154423212,-62.243472041352327,-80.228289848436972,-7.5406717969980974,-42.333430988834181,-119.85903133095697,117.11690312364519,7.7617351317046825,21.698727156093174,244.9050734658606,-353.90412430278923,142.8676216270498,31.806101659485364,-3.7963071600692544,109.14662174719217,117.60249235629246,-16.656257436499288,-111.72954287897063,-44.313806502107894,-19.221717731195028,-22.127484995326654,-6.4024988277425265,-66.928466766044693,170.70738319342064,244.47703784039564,-50.570859238902038,-75.585207820979804,39.737859753051893,-32.772350455329807,-110.97358626194435,73.695364819308466,-38.182638537106641,94.45675916951113,-28.75022937760793,26.942764727701515,69.786346627802473,129.7070316979553,-42.120323526665359,134.77776663299531,101.30629720583546,-8.0548267616205038,-18.584682480220035,176.72465609780403,22.968986252682299,-113.92488587020063,-79.056047648767304,48.220920003614999,-62.236645591279604,-117.16033636546996,-367.10828912140892,-171.07188809758134,-120.68068565024282,83.267071854728002,85.537254722587903,256.60064030368352,29.060115125343515,-69.816248907680617,45.736885518512544,-127.72502496069995,-0.9710145633530658,-39.157255946078024,-179.08583166331823,103.64623235521697,26.30488436567893,-166.63157020676533,21.267693760429239,-83.397236641306222,59.781325967670078,256.59638244452321,-82.669675474226636,-279.90862763368693,50.674968325445391,-49.367045387191773,-180.50302044682499,-35.949916832365517,110.64917858469525,83.123715356353244,-4.5921864227263569,-258.45700308432419,93.8860439994247,-153.15364990486188,-125.73866024419551,-113.34269969178058,-52.247218707135985,256.92737566864935,-59.978007759165791,157.64084901528548,-149.86097942137337,-118.75246314509111,-117.46708895430601,51.42589169920285,-49.897567580131806,255.62209089901407,-17.226591237948767,-263.53634805606964,-179.09340852696255,262.39455719797854,34.68227373083019,-237.41523759363756,287.70388980236669,-23.043103444815216,-16.166903043606258,13.840009325391648,193.44360114868459,37.569804047880261,94.542494177735733,162.26831141087587,135.58489477098172,89.094582756593908,224.08475379187962,147.58201842580667,35.760043371844894,126.76526799927703,25.067777728350784,-99.713399140030575,123.48776174725228,49.981732421358835,-236.66025599765783,-2.1265080576351707,-14.337642540602538,72.436856874239595,-241.04443231333786,176.85732064343318,62.338027946062397,27.258782128246093,-30.099721173168426,227.06787003576753,15.928592255982565,-110.16273545159146,-17.651296834714287,70.639848102653616,230.70294377008281,12.508801772640012,-232.7731704651051,-87.392983024225103,5.8530837653198908,72.501369202744868,-80.928405452568157,244.17199232047165,-79.760224918210554,207.9031404844948,-115.79580409545073,-2.6819939029479514,275.8822400824593,-99.24497362736966,-27.244308845478741,0.28784099706348343,204.97135669486136,102.74130605052495,316.08037176324029,-140.81246618550111,88.919946152664352,112.96842864776822,-65.180725197239141,54.877787789675523,-174.82784582809435,129.96903857793262,162.62690540471536,-1.3130493078006253,58.711417695013758,-107.62887257362529,131.34218657712205,-106.14187284717087,100.77745293402916,34.510136884157831,-182.4860584622464,-142.10188739869932,20.297925905670034,-90.873767903394366,20.27202913235017,5.9914709846349687,64.853331954520243,147.27133017951616,-65.224143657273956,-8.2828492744265461,-59.536627136431974,135.90215374633948,-61.092393027560469,120.07598425200823,-71.574327801720301,-29.916291163002455,-61.339422511735357,-125.00469113895575,112.84614230706225,-58.582606850266444,8.1804687595139001,0.69226268392286272,-155.98180730054153,-77.232114016349016,42.843636025100821,-59.678172848726504,-153.14878975069774,8.6885516098154199,65.49325997496085,-14.488192165859189,255.77730632392428,13.221664018297435,-260.02825762973305,127.93485353128467,120.0434737847082,-71.074524706506651,219.22539442261308,-7.6885750124107801,103.84185590194645,144.10705967650506,-8.6966750940006747,34.58842371075373,184.50552741987002,15.847344671231767,51.040879046897771,136.31891568784465,-89.105256717138587,108.78319301222564,24.515185589563757,16.664620922994104,26.039558372734326,10.583511150787729,-28.29633440364676,-52.624847334712676,-170.95286060299256,140.71191337970654,-38.677161213691853,219.80651194365677,46.627683232396308,29.329608884216299,-89.449611597543992,6.4977138866157986,112.87893924568542,39.284327324438465,29.821197617337312,35.958745978424815,-16.365675225461288,-0.66730193719567588,24.632308404409621,-78.322862303232142,-128.17119251287022,10.349685856097231,69.91105980474488,129.7242454560473,94.978918506999094,-18.421147419667243,-117.10694113148853,53.145476213036972,35.793792138359265,184.90100398386329,118.2108750310056,-136.22604715192085,37.771119882182035,-161.48603668980752,-84.554938018000414,86.939189599462011,146.00729967412477,122.86969862195161,70.536250344130323,-111.50993995782592,-92.992658075505943,274.38803629214044,-160.05560629585437,129.72296757386596,172.67882457874987,-89.660948373048072,41.390850910350999,-194.3387527149518,96.573342049011316,-5.7498993382255037,-28.127818647130272,39.565850375117506,-219.21734291649648,32.484970742026356,-56.715828228839754,-245.50615953057823,54.765045528180707,80.929122440468532,154.96538115415129,-225.31588309260769,-85.194692634659546,-64.935019532191987,25.821550372713808,314.6253645875974,-112.59867511819243,-135.78307154012435,22.720173264350741,-16.152253029512259,-158.84638764200145,207.4191148058427,84.697842589676767,-3.5540219427902677,-98.678248013957202,-39.341581594033173,302.72208820282151,-89.644233050050815,-8.82334695553876,-16.761042373257453,73.412004742880143,-45.03428407038524,63.460880336251165,-413.64383938144761,-109.57530263005134,17.186832404633236,-93.760307544031406,-37.76730369064218,-176.62242192049337,-58.046042069563796,19.672625225043802,-49.288914372219232,127.29009891293462,-138.21451717154815,153.02220042083542,14.326800358596984,-46.274329431588896,88.447515557143277,-89.009181023549502,30.385595354149757,69.963626130528638,61.066538566086479,-76.759598731019537,81.426223545975148,-99.864032456635627,-5.3579003295708816,-226.52658222415278,-13.203467640804945,-115.2498161979951,62.680549095962533,-203.19113734004227,25.541357982817011,22.338747469450091,201.33353024908004,-75.794335047532229,-299.07792308191273,3.4062456905466263,122.69534380943519,-133.07070233677175,51.64384720999611,-46.169048513643446,15.216013556119613,-30.4304947891316,8.6697304597151046,5.4824199753194236,10.466240315513957,115.61847999190591,71.457591320350986,-112.42602129621719,16.385863105940491,196.47722939794897,66.976383257689903,199.19893517732282,19.740987093867517,-27.825388154098341,168.67113731968374,-154.79693704332752,-52.871300084101279,-92.928496389174995,-68.404780125122812,232.73487994980621,209.09434873483227,-83.104034544681753,-90.903210528370323,117.11117140878952,-101.05099186879083,-10.999912082629024,10.555401346067718,7.358326783877061,146.48281756345403,35.192783112022823,-41.54328671991685,-183.62133684035683,-30.576998905486548,-47.727889726524943,-126.15503071296334,57.432645040885404,44.118833262079995,124.22212521980251,156.57746230426022,-344.93012542616879,94.571123681596205,-104.8210708561279,-71.308182963452538,41.620819685293668,148.95551027645854,-129.52740785637491,-41.383302751998947,-54.47615672968999,51.670993474174196,-237.31049679748298,90.463524918717155,131.60976575294941,28.270845906350814,-107.06329715998704,-62.314852288764982,-73.461381890077277,153.12981602437893,-108.42664682110336,51.759012000953405,1.1732388361228914,71.974871697980632,-78.357247452086682,-89.907435138932897,22.045876466803492,1.5418611571952923,-170.8782523985862,38.669774624489406,-46.788513931760818,-28.963012668672956,181.33351505935363,276.12825272751769,37.079238934893198,23.912148267211698,47.173080153605554,44.937997669564311,-171.75371482789583,149.09274615245863,29.672688761751488,209.81183766528824,166.14030858756445,-25.479861743096642,43.474936437922835,-10.389006337526894,61.931143854680052,91.182930541616486,-167.43806843392554,230.74156837741936,53.812616977000943,-284.50143837480863,-9.085902401017421,204.20495265911342,-84.528287856172426,-100.65806644142847,-27.128800180770405,51.055357936286427,-125.35787399467358,-3.5790457084238714,98.092196014239022,231.07367225288735,-83.609824038232048,-190.49046077558057,13.000200138921606,42.866714878586741,-25.911835708370347,61.034160719932025,124.69419113853519,-162.01277867722769,219.35440279951303,-41.948217562157573,-20.579445803850689,-54.621340582447104,108.37345425287734,-120.79075141248485,-56.653068688773978,-119.54492239625867,-184.46966650484003,-87.275072806589122,32.669077128144011,-145.63257370319454,-237.96809701621169,-116.402512588592,83.239453636417267,-45.759165659546852]} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/medium.json b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/medium.json new file mode 100644 index 000000000000..6f956976e745 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/medium.json @@ -0,0 +1 @@ +{"lengths":[123,80,26,29,73,68,21,58,26,115],"offsets":[0,123,203,229,258,331,399,420,478,504],"input":[-7.8569456655532122,8.3142158109694719,-2.9747217055410147,3.8523499481379986,6.445686761289835,-7.3424742929637432,-4.9654210451990366,6.1685327347368002,-5.47020073980093,2.3362016119062901,4.5405878499150276,-6.3398926798254251,5.4237588122487068,-2.8855218272656202,3.0347048211842775,4.2840316519141197,1.7200855072587729,9.4772122148424387,3.5058472864329815,2.7754487749189138,6.9676600396633148,5.4624194093048573,6.8831331934779882,4.8197149112820625,4.9486298952251673,-8.3772339578717947,3.8288827426731586,-7.9676356632262468,7.947424054145813,-7.6437815092504025,-9.0358075313270092,-4.8171714693307877,-2.2008444834500551,-9.5931723061949015,7.5530529581010342,4.1612041741609573,-2.6413340494036674,7.0986892562359571,7.6704633701592684,-2.5219994410872459,-7.2445478290319443,0.88465902023017406,8.4642381872981787,-1.5486415755003691,-8.0188932921737432,6.4604539331048727,0.84938251413404942,-4.4280000403523445,-1.3966345973312855,6.7623899783939123,-4.5115019474178553,-4.8131872992962599,4.7611013147979975,-0.17008666880428791,1.3534343335777521,7.1709332894533873,1.8759302236139774,8.7593612167984247,-1.4158824551850557,3.2636428810656071,-7.9539941251277924,-2.77924501337111,9.2291167750954628,-6.2342104781419039,1.6245233360677958,3.3638002630323172,-4.6088746283203363,-1.3558359909802675,-7.5354327540844679,-8.0182786099612713,-3.2085821125656366,-6.6395127400755882,9.7094038408249617,5.950506990775466,-9.8288812022656202,5.9936348535120487,-4.9788918532431126,-0.23533816449344158,4.6715457737445831,-5.3300658520311117,-2.4167385417968035,1.8753873649984598,-0.36446353420615196,-5.5385439936071634,-6.3088656403124332,6.8952121492475271,7.830724623054266,-9.0111207775771618,-9.9069010000675917,-5.285107409581542,-6.8001959379762411,9.1068954672664404,-0.40773211978375912,7.2463378589600325,9.2005305085331202,-6.6835928149521351,8.8555850461125374,-4.1819824185222387,-6.5784625709056854,-4.2204024363309145,7.6962978113442659,-8.3225462399423122,2.9653584118932486,-1.2210698425769806,-2.5207754876464605,-6.6735623404383659,-2.5622297171503305,-3.3947979379445314,3.6311086546629667,8.0432655941694975,3.1649824138730764,-6.1404670029878616,-2.8288890141993761,-5.1376055274158716,-7.7360612247139215,0.019013946875929832,-0.43251644819974899,-9.3038700148463249,9.8566659167408943,0.98421806469559669,1.753099299967289,4.3400265276432037,2.8259623236954212,-4.0511252731084824,-7.2624185774475336,0.53099025972187519,4.3533775582909584,7.2167345229536295,-8.3427379745990038,3.6028738785535097,-6.4986166916787624,-2.2507096454501152,-7.6769504323601723,-6.5058984979987144,-4.6360285207629204,2.2686935123056173,9.9319573305547237,6.4070106204599142,2.627626471221447,2.5182006414979696,3.3982796221971512,-5.1142848748713732,4.2141462676227093,7.1564311720430851,-1.8611572030931711,-0.46904869377613068,-3.3013217058032751,-5.3138570114970207,-9.9947555549442768,-1.8566119112074375,-4.076327932998538,9.1564764454960823,-7.100230623036623,6.4239413104951382,7.1817340236157179,3.4038693737238646,8.8326690718531609,-9.3307619728147984,-2.1164718642830849,8.4574386849999428,4.1721232421696186,0.87544205598533154,-6.4452799409627914,-5.8199399430304766,4.2694101948291063,-4.0227438323199749,9.7444569692015648,-4.9115641042590141,-8.6578604578971863,7.3392946179956198,-8.4752196446061134,-3.0165549647063017,0.76076283119618893,6.1409881245344877,-8.4124646242707968,-8.2929276954382658,0.76423612423241138,4.5166242122650146,-9.0967508498579264,-9.0915264934301376,-1.285767974331975,-9.9022763967514038,-7.5593994371592999,9.1736787557601929,2.0189981162548065,-6.6985660418868065,-2.7994401566684246,9.8093432188034058,5.6316334567964077,-9.1363692842423916,5.041446490213275,-8.4087212663143873,-5.3783104941248894,6.7355614062398672,4.5806856453418732,7.5837553665041924,0.1765824481844902,7.8212862741202116,-7.6414513867348433,-9.8734383936971426,-2.8790818806737661,-8.7291127536445856,9.8019594326615334,1.5323397144675255,-5.9663286898285151,3.9137416146695614,-1.7445733584463596,-1.0443708021193743,7.2599988617002964,-1.1989963240921497,8.4688498545438051,-4.0403501410037279,-6.1647732090204954,8.6567059997469187,-6.7421162407845259,5.2523666247725487,-3.4740180801600218,-7.8218221757560968,-1.3652908895164728,-6.4439125265926123,-2.8378066141158342,4.9842926021665335,-8.9941181149333715,-4.1431498154997826,6.081096725538373,4.992791973054409,-6.1451915372163057,-2.2341358289122581,-9.1208157502114773,6.4496930688619614,-0.0084629002958536148,-2.2358870785683393,1.4459312614053488,1.7668000143021345,-5.3920675348490477,-4.4790221471339464,1.0748163238167763,4.4380410574376583,-9.8438346479088068,-5.328926183283329,-3.2623258884996176,-9.9111552815884352,3.213183032348752,3.9673280902206898,-1.1166783515363932,-8.012984748929739,5.765340281650424,-1.9257629197090864,-6.2973283603787422,0.80227608792483807,3.8542942889034748,-0.87577797472476959,0.79965020529925823,-0.27891501784324646,-7.7246288117021322,-7.8364204708486795,-6.718836622312665,-3.4870855323970318,-7.446492025628686,6.8085452355444431,-8.7800946552306414,-7.0508609153330326,-3.8193809241056442,7.6648569200187922,3.2503930013626814,9.3552775960415602,-5.8492918498814106,-9.0480884723365307,8.7770528811961412,-4.0720787830650806,0.57193941436707973,-7.4141799937933683,9.876864543184638,0.46253286302089691,-6.2100893259048462,7.0287291705608368,-8.1486971117556095,4.8476572055369616,-5.4252303391695023,-1.846274621784687,9.662495469674468,-2.4384872987866402,-3.6559715308248997,-5.9134689252823591,-7.6721952389925718,-6.5853635314851999,-0.20484695211052895,-2.8626474644988775,7.4841200187802315,5.6052924692630768,8.1506530288606882,8.025598106905818,6.2275238335132599,5.9931968525052071,7.6596252154558897,-4.6788656245917082,2.3054891265928745,8.3558469451963902,-3.2802484277635813,8.8647271599620581,9.4695251155644655,-5.691230334341526,7.4918044358491898,-5.2427097875624895,5.7766376622021198,7.9493120964616537,4.0885457023978233,-3.8122695405036211,7.1858811751008034,-6.8949555791914463,-3.518395172432065,6.3323876541107893,8.4394304547458887,1.507797222584486,1.5480100363492966,-2.5952287018299103,1.9912662915885448,7.2126565687358379,3.1190854497253895,2.4692562036216259,0.78911185264587402,2.6029918529093266,8.4841704741120338,-6.546696936711669,9.664611704647541,-6.8709260877221823,0.3452681377530098,2.9216721747070551,4.5443414244800806,-3.2535649370402098,-2.6658440381288528,-4.8406914342194796,2.4991054460406303,2.4653294216841459,-5.2083121985197067,3.8969169743359089,-4.516303576529026,-5.514167807996273,3.381686108186841,-4.0014749765396118,7.2101162374019623,0.42373670265078545,1.7428430262953043,-8.0371651519089937,-0.63469277694821358,-7.2814288735389709,1.0249437019228935,6.2288844957947731,8.8618478272110224,1.076579550281167,-5.927411736920476,-2.0090305525809526,-5.7764346897602081,-4.5377977471798658,-6.7666941042989492,-7.8277856484055519,-1.5933757554739714,0.13374353758990765,7.8277155756950378,0.41582022793591022,8.6906524281948805,3.7955069448798895,-8.9146694354712963,-8.8491934724152088,-8.3946818765252829,-9.4182861968874931,6.8638934567570686,1.457459693774581,-4.4748370628803968,-8.5864725895226002,7.1551989484578371,-2.5711390096694231,6.8667226191610098,9.0071922354400158,3.880049791187048,-8.0030508898198605,-7.2762895748019218,7.401137612760067,-9.0800061542540789,-7.6634273491799831,0.77656061388552189,-8.3456780854612589,-5.8115694019943476,4.9530934542417526,6.6418024618178606,8.7741060089319944,6.3998390454798937,2.0949657261371613,-9.9109461531043053,6.7280054651200771,-2.412016810849309,1.2335194367915392,-8.238737927749753,-8.468337906524539,-7.3551829718053341,1.4398135617375374,-1.0533783491700888,-4.1298444848507643,9.7037890460342169,-8.4173490945249796,9.6137806959450245,-1.1876897513866425,-1.5015825908631086,2.9014618694782257,4.8697412852197886,5.7418970577418804,4.0639726631343365,3.1886593624949455,-8.2019913289695978,9.1317480709403753,-2.7100219763815403,-7.3392999917268753,8.3850598614662886,7.701235543936491,-5.3340745251625776,-9.7905078902840614,-9.0661103650927544,5.883101187646389,-2.7182149235159159,-5.0381625443696976,3.6021556053310633,1.429365249350667,3.341835280880332,6.2256701663136482,-5.1613877806812525,-7.44439204223454,2.1029661595821381,4.5523388125002384,-8.8414644170552492,1.5075516141951084,-2.5799301639199257,-0.88620693422853947,5.5201277416199446,-3.2129251305013895,0.36738477647304535,-5.3639806807041168,7.5767356809228659,2.1967268269509077,0.38787601515650749,-0.96773196943104267,-4.6711395401507616,-7.8422096092253923,-4.0168853662908077,8.2076955679804087,6.739553539082408,-8.3235376328229904,6.303018257021904,-5.1720266416668892,-6.2517287116497755,7.195572629570961,-4.0106802247464657,-7.5024904403835535,5.6431880127638578,5.0610529445111752,1.1169562675058842,-7.3159250244498253,1.2481350731104612,-2.5937382038682699,7.042065542191267,-4.0042990166693926,-0.25352624244987965,-1.0154805798083544,-7.1820345241576433,-8.4542254637926817,9.8326421249657869,-2.7836504857987165,-4.8136583436280489,-3.1557407695800066,1.4649392291903496,1.2337147258222103,-4.9565151892602444,-4.1507464274764061,-1.5951608214527369,-9.8678603768348694,-9.1293524298816919,2.9737177863717079,-0.72506291791796684,-6.1323888599872589,-7.0595395378768444,-9.680990083143115,-8.4003248903900385,-4.2604202684015036,-4.8834061063826084,4.5936100650578737,4.8044776357710361,8.8557402603328228,-1.5732970181852579,-2.4029186926782131,-5.8544083870947361,4.9582705367356539,-6.3469720166176558,6.441345289349556,-0.30959323048591614,-3.3333489391952753,-3.5955688823014498,9.2738452740013599,5.5176709778606892,-4.5037536509335041,5.4124317690730095,6.7408634256571531,-6.3082739617675543,-3.1604465376585722,2.3750950954854488,-1.7766333278268576,0.12372356839478016,-0.57790676131844521,7.1211362536996603,4.9371499195694923,-1.3211848959326744,-5.1544780191034079,8.6879708431661129,-1.2738926522433758,9.6862620301544666,-2.9939051251858473,1.4366158284246922,5.2023178339004517,-4.6440466586500406,7.5078499782830477,4.4347220193594694,-5.6269076559692621,8.5630603414028883,-0.64469676464796066,4.5815497729927301,2.1071488037705421,-5.1499602757394314,4.6176835987716913,9.4083589501678944,6.2890273611992598,-0.317012844607234,-8.034803532063961,-0.94294802285730839,-8.127349279820919,3.6406686995178461,8.7189395446330309,-0.78292685560882092,1.3484099134802818,2.7255046740174294,7.5571557972580194,-6.88237807713449,7.8716819919645786,-0.64062118530273438,-6.9201881345361471,-7.6019530463963747,-6.0248320177197456,0.64830929040908813,-3.8656727597117424,9.63797552511096,5.4548042267560959,-1.1052399594336748,4.2320714052766562,8.4242198616266251,5.8633585460484028,5.4672075808048248,7.3579316306859255,4.757052781060338,-8.2137932255864143,-9.2227284517139196,-6.3970818743109703,4.244966646656394,5.1545418333262205,-7.615288682281971,9.8431355413049459,-6.4208019897341728,5.5809865426272154,-0.35905612632632256,5.3437602799385786,-7.4208549875766039,-2.3097560182213783,-0.069338064640760422,-5.3647746983915567,-5.7683195918798447,-8.1473476067185402,7.5287883728742599,-3.6536799184978008,-7.3983405251055956,-3.9091850910335779,-1.6737773362547159,8.8243747223168612,-8.733894694596529,9.4318778160959482,1.5706072002649307,-2.8046945948153734,1.4980012457817793,-3.0929721612483263,-3.5830600466579199,-0.49015396274626255,1.9824225455522537,-1.4241831284016371,3.7542280647903681,-2.688807426020503,9.213648084551096,-6.2164925783872604,-0.59073534794151783,-8.4889192134141922,6.7347919661551714,-8.351293858140707,-0.19586087204515934,8.166400259360671,-7.3106987494975328,9.0861382335424423,-9.2745594773441553,2.4788699485361576,2.3673227056860924,7.5928112491965294,-7.6211970672011375,-9.459089832380414,1.0771914105862379,4.356124410405755,-6.6169219557195902,9.3927166890352964,3.3895443845540285,8.0725759826600552,-4.2153179924935102,-6.8494545668363571,1.2171198334544897,-3.8668713439255953,9.49337063357234,-4.9196089897304773,-3.8682506419718266],"expected":[-2.2085090912878513,26.237317848867761,-64.167847869611023,10.247914659448554,-22.69250263214315,-26.845502234815179,-68.984934119821332,-19.842035273387204,28.952150487738908,16.881098143406547,41.550940825134056,56.576834048434073,80.704958489680507,43.836408870892882,-92.463443632161443,21.537528903009026,-24.982085981226867,13.650962945253401,49.659374336614192,15.409559517730557,60.413807126591202,-17.814095648117629,10.588697806933856,-17.100957157325904,-32.787413012341418,7.380335616029182,92.816680860811005,-59.499306985813035,-39.629682186559911,-40.929987043008801,-42.094585481010917,3.5204714356974627,-73.566767445466013,73.519844488012552,40.215826513025881,-31.409088247058641,-29.144368578114864,-25.522723894937858,-30.952237310449863,-17.300551551318158,51.456371273476279,-58.878406022784418,19.038054149306248,-18.166391325799147,-13.223629739080188,0.099963984712452714,-26.606478461490148,-5.2643007261751933,-18.269548226655125,-76.243198682230471,15.401094501464838,54.891026576925739,-27.452540563134935,39.316034302746118,41.517068278095508,-47.642409732579253,9.5439485131564243,3.8322256364611809,10.287850622704855,34.375793857707052,11.682273271755871,-61.838815540722251,-1.8144597344861992,58.638316374830865,18.536386522966648,30.005612803781652,-25.830322916351562,-68.883813264466795,50.460454435348097,13.025335077869505,46.194906598539106,92.360406491524714,-80.473807892709416,-53.934804486230107,48.222155643373704,28.601935470177743,5.6314600530036927,-40.324870045693203,15.293622829954334,-60.824859785677511,-53.500163832142235,-47.270525591447949,-106.86021624839698,7.2690047568626781,-11.295084848416511,11.229681086675942,-44.50196777956053,-35.555847666995795,-75.074929010657556,-138.84188126799995,-67.729867119648191,37.2159028191262,-62.10884059197371,-22.981849557091437,98.662345965897529,-38.399304701147457,-59.155492916379629,-0.72167177501114566,55.648175041627823,26.6039246778261,-9.0903074122367613,8.9304842572320524,53.820839202461244,24.828073551071562,0.51518630672157162,-7.8531187564510416,-58.831343257502652,29.055950698559485,-12.793983925003067,-66.972661293704377,45.970655290233182,-42.086997329215336,35.901936187090897,-18.747241894091896,-4.2515530200741285,13.694806980209137,-57.767471986903267,-44.914467637981609,14.281909891380147,-44.098668956705303,96.26145304490916,-28.160305690976717,23.858421773710781,-49.653363227844238,-0.68399244226584077,-39.56657555198715,1.7529709761888519,43.336195896606462,-61.860041349640028,3.1213346213609778,-16.74450627186598,28.505071549427619,73.29252792519199,-17.068705043240097,-17.603882048152371,-56.926375191779947,-42.507952183334048,-43.330627509676681,15.707337066746323,-80.290383056166959,0.93006898714275898,-36.316022651103509,-9.0881341028993088,40.407232756117381,54.018553930455141,51.721205801574094,17.769080442605624,21.351386254072718,22.365393323933599,33.163194753297056,-91.958575863940808,-3.9826727703467686,34.163808450400701,2.6702790456768479,-10.141078171917719,18.316989937705241,-8.7488694902422246,93.718493020319869,-10.095921547904002,-7.8111555506780164,-18.374773701754357,59.055045883975247,17.085918402299285,-3.0307211633771658,35.265025352882553,14.693360453945935,-62.496132694187082,71.031325981541102,-52.591212061759634,-43.855388700089151,107.23439895340144,-2.3161255284725684,31.279360192029309,13.460813399668391,25.261488519215028,25.571100305789784,-23.520187894549881,18.300335947770826,7.6301100358878919,20.280356400407104,18.524205860084773,22.710379608207738,-27.254558626186373,-62.352172692915403,22.713274633225893,76.667007509504245,-10.875067977568563,-10.512983957836454,-53.944876584309959,87.937239156658279,-59.757676646477861,-1.1852542157813346,-44.511653675165945,-5.0177338786954806,-57.418340766959126,41.840756773377684,49.712603016137678,2.2239546954885068,-10.771329405078415,17.303882963562941,-0.14496889002263291,15.279721445511948,38.338554035872221,-28.33958612754941,5.1289939460762826,-22.389722317040107,-25.114869010485499,4.9897114739528163,-19.288379516304225,-9.9003606931911072,-3.8708059452249177,1.5333754073594559,13.048897502579214,-34.590895720664989,12.215570646511731,-2.9444290061001954,1.4608028635786408,26.649217843445264,-13.708215465569383,5.1283895522256024,-16.615712098852313,-28.364575766626686,26.911484159514757,44.493140078492345,32.231428989325238,-24.935509889299347,5.115719302026803,-11.358734773856721,33.1505879573524,-51.158746760338545,-0.10246840256324319,5.553890893451662,2.6208884740111626,-29.9787171050219,-2.2487369460096436,-20.60476189176644,40.66704037541512,-8.3813611685355554,5.0181384549518917,-12.5071286780897,-2.9418030334479739,23.335429687579982,19.960921034873575,2.1726729389608597,27.130907683236046,26.490475249904243,-9.8817449180249728,-45.417210624868844,13.521418004159965,9.5823160223257542,15.080134471741069,2.2273683670500137,2.8989636065562459,-13.751849163458623,-2.9760595101604959,19.385803321646161,10.352323583928966,-10.0437665074317,81.41750562004745,-55.450782286226904,56.63893647397159,23.053660677289166,-4.7875041788294954,-71.049329563862273,-5.9626052906174394,5.9159915820481128,18.935649399035498,-11.811551573935791,-45.646319574168757,-42.251599437672461,43.989072888055354,16.23566937241106,-7.6179744494285249,-45.773814033041894,12.350038466122092,7.7912072248973256,69.227726491202077,-9.8761873202056591,8.4533962134462026,26.827825571979769,-24.891008820667349,15.52891947661054,53.068187319172132,-5.3884142001370314,-14.790719068869983,13.349801843920615,-50.654673752059345,21.363671354454635,-47.047652860902197,28.104573464000733,-31.507540837772829,-15.972535383816588,-36.475975375718392,-61.001059332408474,-29.371831520523394,12.793299307760032,3.2312979554035817,14.782042504736294,19.697442756820585,29.574117996565231,-39.990726983768369,21.002399557644083,-25.041582433563967,26.300034515450694,-8.7072394444958494,-62.150918965776611,3.2908822652876282,-18.997571353317099,-34.007085139902124,-0.63705432107137971,83.311174658260981,-50.688772847553068,-60.384098236329493,-48.141840004573659,7.4854926028273709,-27.174199881967933,12.105554670836066,75.880720100257363,-9.6035944561026358,34.693508474205657,-48.606735412860942,1.5988010253877862,-53.905830519770603,-47.508290306773183,45.797700939876968,-36.323544180569321,19.914143193965415,-16.755818399711401,11.09581015513915,-60.348672402469631,52.29244561094044,-62.377935349941254,10.183814950562541,8.100717127093187,-12.127939928975541,-16.65440481383839,-16.926367872734993,-9.1657543910838335,-6.9838953548543703,-34.120654811464327,119.59049877395796,-26.532250607798495,-47.505613452696423,43.202542296111446,23.813062287419626,64.185348166972361,46.936784981023429,-44.101459678086762,2.2429958499061242,0.025541637233965631,14.155474045490202,-27.111204636367365,-73.763668349357744,81.619719302017685,-17.503117824426155,-30.01938507418145,14.5787914175169,-4.3015146072859878,-2.1912379256402694,-40.148939491354938,15.808093831794499,21.640873098591037,38.465300492640324,14.560387544727691,-15.605808701366186,6.8269659951329231,1.6143423479861561,-16.109831055253427,11.884863374210314,46.252026710354748,-45.464442296977253,-0.89378067331452016,65.494333034572705,-33.840237074139651,-27.914281813273533,41.800339376062148,-34.952715936152202,14.195199916314678,-60.291815503837277,-12.256755609440571,-7.5251204362494288,8.8390760688496055,-44.340658543072045,19.273079017103775,-21.383709216401328,19.127656220574654,11.761604178211051,8.8589089172463176,-45.625400094271868,72.510636589602285,-11.448567756926602,18.27240143110285,9.2338541769087126,-0.074543685195866516,-31.005394246876605,-46.060717700834253,20.771593875040523,-43.29650268663373,-34.74038690328598,0.17565261572599411,-13.965589662271469,-30.671366663612439,-6.5924941721801584,-13.514142665023357,14.914230496391372,18.167176291253863,-21.301544198356112,-2.0833520650084099,-23.961320660406493,-50.420810535108785,24.510437526512842,-10.363214556594908,-28.841775236651301,-20.637081217777219,14.133013125764837,6.3569885825494445,-27.794987436856715,-2.9144507022449027,-19.569961582322087,17.863569713933249,-57.505097333341837,-16.88341910206946,-23.601918131758481,3.9106352795485186,-22.56144810419179,10.736355180571923,-4.2799887079082879,19.8479861796996,-19.699153811740182,36.53623878641222,-29.963017004320552,3.6626906058452562,2.3342326452540618,33.272741279806858,12.776330006609296,-13.457864697811354,-37.15832243774102,4.4262801731397801,29.508017586293469,4.6529281837512011,8.4826403683971936,-40.750782782348857,-68.066445925623881,-5.7437518739606013,3.9626989390135847,-31.607388230630171,-11.887494823751197,-15.245249553806023,35.646797543084681,-44.591021416346607,-4.8298671444138677,8.6595811097719686,-53.099366951627175,23.919829031064001,39.726719439924857,70.853938274048275,-10.992952525212015,-13.529303882776972,-2.3676915060683026,73.719086927618235,-41.325481858461934,-0.034910765240443453,5.2676125930631592,8.791715234078346,9.0134886965164611,-41.538708759764191,-14.039516808510246,30.895412671007058,35.686866812969242,23.711524774346781,-10.574511831669994,22.701326755170573,-12.292594076936254,-22.625582436868896,0.47377379653097051,-27.928827022211692,-16.679600791368181,53.707202598452568,-14.476545201614499,-30.350720961468671,11.134525935812015,-45.240498853382519,3.2231787908433729,-10.254916756851891,24.558141248667454,25.008661296409699,26.191811160921212,-2.9440251494707965,-9.7604155913286981,1.4018707225115268,18.782130927282363,-29.356453496010147,30.928163052559579,-12.919131957717468,-33.677561599568719,11.731764716184998,1.6567104791079998,15.384086405033326,-0.15103645714184033,-7.5979637772504773,7.3612712578933648,19.585022372525327,-16.88819963915401,-37.966871904209256,42.566117960959673,38.860927051000139,-61.17852617839862,3.1046270582899833,5.0384566506880262,-1.9337729309236593,-56.552661057674506,-23.472310948097871,40.7982558786765,1.5917117948157724,-20.335313584876165,-16.348570729064772,-21.990777141951217,-8.9769747959244555,48.050652010408605,28.884123742842288,-89.589641780379964,-98.013557077754683,23.589383216448756,38.203603325283126,-11.057650251438318,42.568125615111661,-49.928143703804011,40.404460584196073,-0.16824972017960249,-41.850592128976565,11.915071270365658,30.157898387923503,25.03858279253123,20.227685664071366,24.156246551180111,-5.3463904675169447,41.85981143369721,-3.0384512331387317,-65.505836472936949,-123.27011766775914,-2.4014730884486406,11.831173413997902,-11.532735257411534,7.3408877081501034,-39.467998636347474,4.4803537116640815,-40.136424070798043,-45.821476515624795,-49.47689628250469,-53.091801572822156,9.5163325383754085,-52.43826415737972,-27.930158012682192,6.4345000245140529,17.353729856777218,-18.860321782721069,-86.153170887378934,55.018926347098159,-17.162646996407506,18.619096218673725,16.567158838484307,-11.155446135235856,20.281961220956891,-6.5961462778592894,57.259287593558078,-68.304506309637674,2.5999948580621393,73.088055763505906,47.524254360593744,-50.511658914215836,-46.249442701148141,-28.011195266685842,-19.114942825685528,62.116813270306061,14.888239451454904,69.109072202328576,-19.168614658861525,-2.5602412619034958,-9.7277613546151791,2.1373854276240678,41.469028225422548,-53.701419606291012,4.548009981865353,26.131448919980198,-6.8327621605372144,36.407724647100636,15.348183968995087,30.158038606907425,63.634083523452617,47.127166023535835,-34.539227778194942,73.832870709740163,-32.85218084513285,7.004221816349288,-63.922198300301481,52.614565114721785,-51.38552493259126,-0.90823787997593364,44.98002704888038,-78.532396445297096,131.53861964154373,20.510041906319639,-4.0125112729229251,-74.837515011558509,26.620001034953617,5.5683599324587902,-33.389123590529707,57.084456972920592,136.33440007821901,-61.574636287223285,16.768822608060344,-88.72227841116019,14.03121397926836,17.455174793261808,-42.092391362578454,35.818004764740976,31.232942394250788,39.817824497534751,-28.551892805227705]} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/runner.c b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/runner.c new file mode 100644 index 000000000000..83735d958f19 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/runner.c @@ -0,0 +1,318 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +/** +* Generate FFTPACK test fixtures. +* +* ## Notes +* +* - Run this script from the directory in which fixtures should be written. +* +*/ + +#include +#include +#include + +/** +* Define prototypes for external functions. +*/ +extern void rffti( int n, double *wsave ); +extern void rfftf( int n, double *r, double *wsave ); + +/** +* Generates a random number on the interval [0,1]. +* +* @return random number +*/ +double rand_double( void ) { + int r = rand(); + return (double)r / ( (double)RAND_MAX + 1.0 ); +} + +/** +* Generates an array of pseudorandom integers drawn from a uniform distribution. +* +* ## Notes +* +* - WARNING: the method used here is not particularly robust, as some integer values may be sampled more frequently than others. +* +* +* @param out output array +* @param len array length +* @param a lower bound (inclusive) +* @param b upper bound (exclusive) +*/ +void rand_array_i32( int *out, const unsigned int len, const int a, const int b ) { + unsigned int i; + unsigned int r; + double delta; + + delta = (double)b - (double)a; + + for ( i = 0; i < len; i++ ) { + r = (unsigned int)( delta * rand_double() ); // truncation + out[ i ] = (int)( a + r ); + } +} + +/** +* Generates an array of pseudorandom numbers drawn from a uniform distribution. +* +* @param out output array +* @param len array length +* @param a lower bound (inclusive) +* @param b upper bound (exclusive) +*/ +void rand_array_f64( double *out, const unsigned int len, const double a, const double b ) { + unsigned int i; + double delta; + + delta = b - a; + + for ( i = 0; i < len; i++ ) { + out[ i ] = a + ( rand_double()*delta ); + } +} + +/** +* Writes an array of doubles to a file as a series of comma-separated values. +* +* @param f file to write to +* @param x array of doubles +* @param len array length +*/ +void write_array_f64( FILE *f, const double *x, const unsigned int len ) { + unsigned int i; + + for ( i = 0; i < len; i++ ) { + fprintf( f, "%.17g", x[ i ] ); + if ( i < len-1 ) { + fprintf( f, "," ); + } + } +} + +/** +* Writes an array of integers to a file as a series of comma-separated values. +* +* @param f file to write to +* @param x array of integers +* @param len array length +*/ +void write_array_i32( FILE *f, const int *x, const unsigned int len ) { + unsigned int i; + + for ( i = 0; i < len; i++ ) { + fprintf( f, "%d", x[ i ] ); + if ( i < len-1 ) { + fprintf( f, "," ); + } + } +} + +/** +* Writes a named array of doubles to a file as JSON. +* +* @param f file to write to +* @param name array name +* @param x data +* @param len array length +*/ +void write_named_array_f64( FILE *f, const char *name, const double *x, const unsigned int len ) { + fprintf( f, "\"%s\":[", name ); + write_array_f64( f, x, len ); + fprintf( f, "]" ); +} + +/** +* Writes a named array of integers to a file as JSON. +* +* @param f file to write to +* @param name array name +* @param x data +* @param len array length +*/ +void write_named_array_i32( FILE *f, const char *name, const int *x, const unsigned int len ) { + fprintf( f, "\"%s\":[", name ); + write_array_i32( f, x, len ); + fprintf( f, "]" ); +} + +/** +* Writes data to a file as JSON. +* +* ## Notes +* +* - This function SHOULD be tailored to the input data (e.g., input types, output types, number of arguments, etc) and may vary from use case to use case. +* +* +* @param f file to write to +* @param lengths sequence lengths +* @param offsets offsets +* @param input input values +* @param expected results +* @param num number of sequence lengths +* @param total total array length +*/ +void write_data_as_json( FILE *f, const int *lengths, const int *offsets, const double *input, const double *expected, const unsigned int num, const unsigned int total ) { + fprintf( f, "{" ); + write_named_array_i32( f, "lengths", lengths, num ); + fprintf( f, "," ); + write_named_array_i32( f, "offsets", offsets, num ); + fprintf( f, "," ); + write_named_array_f64( f, "input", input, total ); + fprintf( f, "," ); + write_named_array_f64( f, "expected", expected, total ); + fprintf( f, "}\n" ); +} + +/** +* Generates test fixtures. +* +* @param lengths sequence lengths +* @param offsets input offsets into flat arrays +* @param num number of sequence lengths +* @param total total number of input and output values +* @param name output filename +*/ +void generate( const int *lengths, const int *offsets, const unsigned int num, const unsigned int total, const char *name ) { + unsigned int i; + unsigned int j; + double *expected; + double *input; + double *wsave; + FILE *f; + int off; + int n; + + // Allocate output arrays: + input = (double*) malloc( total * sizeof(double) ); + if ( input == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + expected = (double*) malloc( total * sizeof(double) ); + if ( expected == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + + // Generate fixture data: + for ( i = 0; i < num; i++ ) { + n = lengths[ i ]; + off = offsets[ i ]; + + rand_array_f64( input + off, (unsigned int)n, -10.0, 10.0 ); + for ( j = 0; j < (unsigned int)n; j++ ) { + expected[ off + j ] = input[ off + j ]; + } + + wsave = (double*) calloc( 2*n + 15, sizeof(double) ); + if ( wsave == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + rffti( n, wsave ); + rfftf( n, expected + off, wsave ); + free( wsave ); + } + // Open a new file: + f = fopen( name, "w" ); + if ( f == NULL ) { + printf( "Error opening file.\n" ); + exit( 1 ); + } + + // Write data as JSON: + write_data_as_json( f, lengths, offsets, input, expected, num, total ); + + // Close the file: + fclose( f ); + + // Free allocated memory: + free( input ); + free( expected ); +} + +/** +* Computes offsets into flat input and output arrays for each sequence length. +* +* @param offsets output array of offsets +* @param lengths sequence lengths +* @param num number of sequence lengths +* @return total number of values +*/ +unsigned int compute_offsets( int *offsets, const int *lengths, const unsigned int num ) { + unsigned int total; + unsigned int i; + + total = 0; + for ( i = 0; i < num; i++ ) { + offsets[ i ] = total; + total += lengths[ i ]; + } + return total; +} + +/** +* Main execution sequence. +*/ +int main( void ) { + unsigned int total; + unsigned int num; + int *lengths; + int *offsets; + + // Use the current time to seed the random number generator: + srand( time( NULL ) ); + + // Define the number of sequence lengths per range: + num = 10; + + // Allocate arrays: + lengths = (int*) malloc( num * sizeof(int) ); + if ( lengths == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + offsets = (int*) malloc( num * sizeof(int) ); + if ( offsets == NULL ) { + printf( "Error allocating memory.\n" ); + exit( 1 ); + } + + // Generate fixture data: + rand_array_i32( lengths, num, 2, 16 ); + total = compute_offsets( offsets, lengths, num ); + generate( lengths, offsets, num, total, "small.json" ); + + rand_array_i32( lengths, num, 16, 128 ); + total = compute_offsets( offsets, lengths, num ); + generate( lengths, offsets, num, total, "medium.json" ); + + rand_array_i32( lengths, num, 128, 1024 ); + total = compute_offsets( offsets, lengths, num ); + generate( lengths, offsets, num, total, "large.json" ); + + // Free allocated memory: + free( lengths ); + free( offsets ); + + return 0; +} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/small.json b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/small.json new file mode 100644 index 000000000000..8d557d1163b5 --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/fixtures/c/fftpack/small.json @@ -0,0 +1 @@ +{"lengths":[4,13,5,5,15,10,10,2,10,15],"offsets":[0,4,17,22,27,42,52,62,64,74],"input":[-9.116728724911809,-4.8596726823598146,3.4812678024172783,9.668060727417469,-8.9032003656029701,3.9114638883620501,-0.026319427415728569,-2.3505385220050812,-5.5008794739842415,6.7187159508466721,1.4591167215257883,3.3748283609747887,0.74036757461726665,3.3579106442630291,-3.5956973303109407,7.115019578486681,2.1341895684599876,9.3241720646619797,-8.6399579886347055,8.2260956522077322,-4.010230703279376,0.05261685699224472,4.3315941374748945,1.1027806997299194,-5.564692746847868,-5.7909615617245436,-8.6909349635243416,-8.5439217090606689,2.3078472074121237,7.9881112929433584,-3.8133587222546339,8.8800034765154123,6.2185775488615036,-4.3670093547552824,3.6738187074661255,5.8711233921349049,-4.0290241781622171,4.1906843520700932,-7.1679836977273226,7.6980144530534744,0.52905097603797913,-8.2401633262634277,7.5749892555177212,-7.1554449666291475,-1.5635318774729967,1.7198013328015804,4.7010921128094196,-8.7447449564933777,7.0715260319411755,-8.8618475571274757,-1.0718837380409241,4.8500846140086651,-4.6277761366218328,0.96651383675634861,4.1981401853263378,-1.8577941041439772,-3.9454446267336607,8.9122058637440205,7.4440999515354633,-7.0119780208915472,9.685426251962781,2.9591707978397608,-5.2162992861121893,9.6579357422888279,0.92617449350655079,6.2147978693246841,-7.8920833580195904,-2.2449817415326834,8.5919307451695204,4.5801795646548271,-0.92194274067878723,4.9084284529089928,-4.0428752824664116,-8.6048257909715176,-1.3070579431951046,-7.7227832470089197,3.1819853372871876,-0.37233305163681507,2.1984764840453863,9.7943628113716841,-6.1440743599087,-3.4577368106693029,5.8174742758274078,-5.7097223773598671,-3.3039627131074667,-9.7012667916715145,-9.1909652855247259,7.446452509611845,-7.4725344125181437],"expected":[-0.8270728774368763,-12.597996527329087,14.527733409777284,-10.443848967552185,8.4349771682173014,-9.7567153511884861,8.5923802120769253,4.57425773203913,4.0866333108592272,-14.22715060271884,-6.6576554982603335,-26.372765919953665,2.8296022954701328,-8.980587583926571,-6.8431158070115705,-7.3253292347795274,-19.352006438403265,4.952695881947875,3.259831328816762,1.0747977763238268,17.574250891864249,16.746805214608187,-14.612214434891939,11.173642831905873,-9.4473745727180862,6.9614497292273327,-5.541407201183806,11.195770418271422,-14.991257708546126,-15.946231614575851,-17.300471915627686,-4.6130790288011587,-19.788622037389842,-4.3067661197842559,-5.5157193718121711,-30.002457820459789,-25.180834475904703,-12.913945229888764,18.854087307931454,19.383661310646723,-5.7544798257416492,19.640630053430741,-1.47995974868536,6.3230358066860246,-1.1461816305236983,9.6659206372041417,15.672241202115009,17.024128064244636,19.603107401239232,-11.850330015300589,-4.8679641623852099,34.904343318194151,16.722563998773694,-6.1633397371209089,8.1826596782807925,2.5224321416795537,-2.68207208227156,-32.079778889875975,12.531437445164677,-0.17263982326092409,-15.643991329488166,8.7863272521644831,4.4416364561766386,-14.874235028401017,1.5148022118955851,-16.303884263575817,-3.8387589572180141,14.638762167581284,-6.9882295533190071,11.265068834141644,-29.609707780796953,-1.6302781281256387,0.023841251436460542,-8.1923944968730211,-25.943685574457049,-6.2112734554560713,-26.110422946311445,-2.2624743686374584,8.8755320203980546,-8.2645672629549143,25.11030762650708,-12.000561912417531,-15.582412082646586,-21.114386739209294,5.5941560454209212,34.194765437856233,-13.8671250199453,18.827406514084274,-0.55489016140835545]} diff --git a/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/test.js b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/test.js new file mode 100644 index 000000000000..344e70a53fef --- /dev/null +++ b/lib/node_modules/@stdlib/fft/base/fftpack/rfftf/test/test.js @@ -0,0 +1,387 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* 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. +*/ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var Float64Array = require( '@stdlib/array/float64' ); +var isAlmostSameValue = require( '@stdlib/number/float64/base/assert/is-almost-same-value' ); +var rffti = require( '@stdlib/fft/base/fftpack/rffti' ); +var rfftf = require( './../lib' ); + + +// FIXTURES // + +var small = require( './fixtures/c/fftpack/small.json' ); +var medium = require( './fixtures/c/fftpack/medium.json' ); +var large = require( './fixtures/c/fftpack/large.json' ); + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof rfftf, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 7', function test( t ) { + t.strictEqual( rfftf.length, 7, 'returns expected value' ); + t.end(); +}); + +tape( 'the function returns a reference to the input array', function test( t ) { + var workspace; + var out; + var N; + var r; + + N = 4; + r = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + out = rfftf( N, r, 1, 0, workspace, 1, 0 ); + + t.strictEqual( out, r, 'same reference' ); + t.end(); +}); + +tape( 'the function returns all zeros for a zero sequence', function test( t ) { + var workspace; + var expected; + var N; + var r; + + N = 4; + r = new Float64Array( [ 0.0, 0.0, 0.0, 0.0 ] ); + expected = new Float64Array( [ 0.0, 0.0, 0.0, 0.0 ] ); + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + rfftf( N, r, 1, 0, workspace, 1, 0 ); + + t.deepEqual( r, expected, 'returns expected value' ); + t.end(); +}); + +tape( 'the function returns only a zero-frequency term for a constant sequence', function test( t ) { + var workspace; + var expected; + var N; + var r; + + N = 4; + r = new Float64Array( [ 1.0, 1.0, 1.0, 1.0 ] ); + expected = new Float64Array( [ 4.0, 0.0, 0.0, 0.0 ] ); + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + rfftf( N, r, 1, 0, workspace, 1, 0 ); + + t.deepEqual( r, expected, 'returns expected value' ); + t.end(); +}); + +tape( 'the function computes the exact two-point real FFT', function test( t ) { + var workspace; + var expected; + var N; + var r; + + N = 2; + r = new Float64Array( [ 3.0, -1.0 ] ); + + // For [ a, b ], output is [ a+b, a-b ]... + expected = new Float64Array( [ 2.0, 4.0 ] ); + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + rfftf( N, r, 1, 0, workspace, 1, 0 ); + + t.deepEqual( r, expected, 'returns expected value' ); + t.end(); +}); + +tape( 'the function computes a forward real-valued FFT (small sequence lengths)', function test( t ) { + var workspace; + var expected; + var lengths; + var offsets; + var input; + var ulps; + var off; + var y; + var e; + var N; + var i; + var k; + var r; + + lengths = small.lengths; + offsets = small.offsets; + input = small.input; + expected = small.expected; + + ulps = 20; + for ( k = 0; k < lengths.length; k++ ) { + N = lengths[ k ]; + off = offsets[ k ]; + r = new Float64Array( N ); + for ( i = 0; i < N; i++ ) { + r[ i ] = input[ off + i ]; + } + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + rfftf( N, r, 1, 0, workspace, 1, 0 ); + + for ( i = 0; i < N; i++ ) { + y = r[ i ]; + e = expected[ off + i ]; + t.strictEqual( isAlmostSameValue( y, e, ulps ), true, 'within tolerance. N: '+N+'. index: '+i+'. y: '+y+'. E: '+e+'.' ); + } + } + t.end(); +}); + +tape( 'the function computes a forward real-valued FFT (medium sequence lengths)', function test( t ) { + var workspace; + var expected; + var lengths; + var offsets; + var input; + var ulps; + var off; + var y; + var e; + var N; + var i; + var k; + var r; + + lengths = medium.lengths; + offsets = medium.offsets; + input = medium.input; + expected = medium.expected; + + ulps = 130; + for ( k = 0; k < lengths.length; k++ ) { + N = lengths[ k ]; + off = offsets[ k ]; + r = new Float64Array( N ); + for ( i = 0; i < N; i++ ) { + r[ i ] = input[ off + i ]; + } + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + rfftf( N, r, 1, 0, workspace, 1, 0 ); + + for ( i = 0; i < N; i++ ) { + y = r[ i ]; + e = expected[ off + i ]; + t.strictEqual( isAlmostSameValue( y, e, ulps ), true, 'within tolerance. N: '+N+'. index: '+i+'. y: '+y+'. E: '+e+'.' ); + } + } + t.end(); +}); + +tape( 'the function computes a forward real-valued FFT (large sequence lengths)', function test( t ) { + var workspace; + var expected; + var lengths; + var offsets; + var input; + var ulps; + var off; + var y; + var e; + var N; + var i; + var k; + var r; + + lengths = large.lengths; + offsets = large.offsets; + input = large.input; + expected = large.expected; + + ulps = 800; + for ( k = 0; k < lengths.length; k++ ) { + N = lengths[ k ]; + off = offsets[ k ]; + r = new Float64Array( N ); + for ( i = 0; i < N; i++ ) { + r[ i ] = input[ off + i ]; + } + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + rfftf( N, r, 1, 0, workspace, 1, 0 ); + + for ( i = 0; i < N; i++ ) { + y = r[ i ]; + e = expected[ off + i ]; + t.strictEqual( isAlmostSameValue( y, e, ulps ), true, 'within tolerance. N: '+N+'. index: '+i+'. y: '+y+'. E: '+e+'.' ); + } + } + t.end(); +}); + +tape( 'the function leaves a length-one sequence unchanged', function test( t ) { + var workspace; + var out; + var N; + var r; + + N = 1; + r = new Float64Array( [ 5.0 ] ); + workspace = new Float64Array( ( 2 * N ) + 34 ); + + rffti( N, workspace, 1, 0 ); + out = rfftf( N, r, 1, 0, workspace, 1, 0 ); + t.strictEqual( out, r, 'same reference' ); + t.strictEqual( r[ 0 ], 5.0, 'returns expected value' ); + t.end(); +}); + +tape( 'the function supports specifying a stride', function test( t ) { + var workspace; + var expected; + var v; + var i; + var N; + var r; + + N = 4; + r = new Float64Array([ + 1.0, // 0 + -999.0, + 2.0, // 1 + -999.0, + 3.0, // 2 + -999.0, + 4.0, // 3 + -999.0 + ]); + expected = new Float64Array([ + 10.0, // 0 + -999.0, + -2.0, // 1 + -999.0, + 2.0, // 2 + -999.0, + -2.0, // 3 + -999.0 + ]); + + workspace = new Float64Array( ( ( 2 * N ) + 34 ) * 2 ); + rffti( N, workspace, 2, 0 ); + rfftf( N, r, 2, 0, workspace, 2, 0 ); + + for ( i = 0; i < r.length; i++ ) { + v = r[ i ]; + t.strictEqual( isAlmostSameValue( v, expected[ i ], 1 ), true, 'within tolerance. index: '+i+'. y: '+v+'. E: '+expected[ i ]+'.' ); + } + t.end(); +}); + +tape( 'the function supports specifying a negative stride', function test( t ) { + var workspace; + var expected; + var v; + var i; + var N; + var r; + + N = 4; + r = new Float64Array([ + 4.0, // 3 + -999.0, + 3.0, // 2 + -999.0, + 2.0, // 1 + -999.0, + 1.0 // 0 + ]); + expected = new Float64Array([ + -2.0, // 3 + -999.0, + 2.0, // 2 + -999.0, + -2.0, // 1 + -999.0, + 10.0 // 0 + ]); + + workspace = new Float64Array( ( 2 * N ) + 34 ); + rffti( N, workspace, -1, workspace.length-1 ); + rfftf( N, r, -2, r.length-1, workspace, -1, workspace.length-1 ); + + for ( i = 0; i < r.length; i++ ) { + v = r[ i ]; + t.strictEqual( isAlmostSameValue( v, expected[ i ], 1 ), true, 'within tolerance. index: '+i+'. y: '+v+'. E: '+expected[ i ]+'.' ); + } + t.end(); +}); + +tape( 'the function supports an offset parameter', function test( t ) { + var workspace; + var expected; + var v; + var i; + var N; + var r; + + N = 4; + r = new Float64Array([ + -999.0, + 1.0, // 0 + -999.0, + 2.0, // 1 + -999.0, + 3.0, // 2 + -999.0, + 4.0, // 3 + -999.0 + ]); + expected = new Float64Array([ + -999.0, + 10.0, // 0 + -999.0, + -2.0, // 1 + -999.0, + 2.0, // 2 + -999.0, + -2.0, // 3 + -999.0 + ]); + + workspace = new Float64Array( 3 + ( ( ( 2 * N ) + 34 ) * 2 ) ); + rffti( N, workspace, 2, 3 ); + rfftf( N, r, 2, 1, workspace, 2, 3 ); + + for ( i = 0; i < r.length; i++ ) { + v = r[ i ]; + t.strictEqual( isAlmostSameValue( v, expected[ i ], 1 ), true, 'within tolerance. index: '+i+'. y: '+v+'. E: '+expected[ i ]+'.' ); + } + t.end(); +});