From 5d8d12e3564942f55932b9278a69917d0aa8ef82 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 15 Apr 2025 11:13:25 +0200 Subject: [PATCH 001/147] Port SR + VoIP pytests --- scripts/split_rendering/__init__.py | 0 scripts/split_rendering/isar_bstool.py | 384 ++ .../rotate_euler_quaternion_30s.csv | 6000 ++++++++++++++++ .../rotate_euler_quaternion_30s_delayed.csv | 6020 ++++++++++++++++ ...tate_euler_quaternion_30s_delayed_voip.csv | 6032 +++++++++++++++++ .../rotate_euler_quaternion_30s_voip.csv | 6012 ++++++++++++++++ .../rotate_euler_quaternion_5s.csv | 1000 --- .../rotate_euler_quaternion_5s_delayed.csv | 1020 --- tests/conftest.py | 225 + tests/split_rendering/constants.py | 2 +- tests/split_rendering/test_split_rendering.py | 118 +- tests/test_be_for_jbm_neutral_dly_profile.py | 153 +- 12 files changed, 24924 insertions(+), 2042 deletions(-) create mode 100644 scripts/split_rendering/__init__.py create mode 100755 scripts/split_rendering/isar_bstool.py create mode 100644 scripts/trajectories/rotate_euler_quaternion_30s.csv create mode 100644 scripts/trajectories/rotate_euler_quaternion_30s_delayed.csv create mode 100644 scripts/trajectories/rotate_euler_quaternion_30s_delayed_voip.csv create mode 100644 scripts/trajectories/rotate_euler_quaternion_30s_voip.csv delete mode 100644 scripts/trajectories/rotate_euler_quaternion_5s.csv delete mode 100644 scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv diff --git a/scripts/split_rendering/__init__.py b/scripts/split_rendering/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/split_rendering/isar_bstool.py b/scripts/split_rendering/isar_bstool.py new file mode 100755 index 0000000000..6b1e53b662 --- /dev/null +++ b/scripts/split_rendering/isar_bstool.py @@ -0,0 +1,384 @@ +#!/usr/bin/env python3 + +""" + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" + +from __future__ import annotations +import argparse +import math +import sys +from pathlib import Path + + +class IsarBstoolError(Exception): + pass + + +class IsarBitstream: + def __init__(self, file_path: Path) -> None: + self.file_path = file_path + + with open(file_path, "rb") as reader: + self.header = IsarFileHeader(reader) + self.frames = [] + + while reader.peek(1): + self.frames.append(IsarFileFrame(reader)) + + @property + def duration_seconds(self): + return self.num_frames * self.isar_frame_size_ms / 1000 + + @property + def duration_samples(self): + return int(self.duration_seconds * self.sample_rate) + + @property + def num_frames(self): + return len(self.frames) + + @property + def num_empty_frames(self): + return sum(frame.num_bits == 0 for frame in self.frames) + + @property + def sample_rate(self): + return self.header.sample_rate + + @property + def delay_ns(self): + return self.header.delay_ns + + @property + def delay_samples(self): + return round(self.header.delay_ns * self.sample_rate / 10**9) + + @property + def isar_frame_size_ms(self): + return self.header.isar_frame_size_ms + + @property + def isar_frame_size_samples(self): + return self.header.isar_frame_size_ms * self.sample_rate // 1000 + + @property + def pose_correction(self): + return self.header.pose_correction + + @property + def avg_bitrate_bps(self): + return sum(frame.num_bits for frame in self.frames) / self.duration_seconds + + @property + def avg_bitrate_non_empty_frames_bps(self): + return sum(frame.num_bits for frame in self.frames) / ( + (self.num_frames - self.num_empty_frames) * self.isar_frame_size_ms / 1000 + ) + + @property + def codec(self): + return self.header.codec + + @property + def codec_frame_size_ms(self): + return self.header.codec_frame_size_ms + + @property + def codec_frame_size_samples(self): + return self.header.codec_frame_size_ms * self.sample_rate // 1000 + + @property + def lc3plus_hires(self): + return self.header.lc3plus_hires + + def info(self): + return ( + "\n" + f"File : {self.file_path}\n" + f"Duration : {self.duration_seconds} s = {self.duration_samples} samples\n" + f"Frames : {self.num_frames} (incl. {self.num_empty_frames} empty)\n" + f"Sample Rate : {self.sample_rate} Hz\n" + f"Delay : {self.delay_ns} ns = {self.delay_samples} samples\n" + f"ISAR Frame Size : {self.isar_frame_size_ms} ms = {self.isar_frame_size_samples} samples\n" + f"Pose Correction : {self.pose_correction}\n" + f"Bitrate : {self.avg_bitrate_bps:.2f} bps (avg), {self.avg_bitrate_non_empty_frames_bps:.2f} bps (avg non-empty)\n" + f"Codec : {self.codec}\n" + f"Codec Frame Size : {self.codec_frame_size_ms} ms = {self.codec_frame_size_samples} samples\n" + f"LC3plus HIRES : {'ON' if self.lc3plus_hires else 'OFF'}\n" + ) + + def write(self, file_path: Path): + self.file_path = file_path + + with open(file_path, "wb") as writer: + writer.write(self.header.as_bytes) + + for frame in self.frames: + writer.write(frame.as_bytes) + + def trim(self, start_time_s: float, length_s: float | None = None) -> IsarBitstream: + if length_s is None: + length_s = self.duration_seconds + + start_time_ms = start_time_s * 1000 + length_ms = length_s * 1000 + + # Check for unusable values + if math.isinf(start_time_s) or math.isnan(start_time_s): + raise IsarBstoolError(f"start_time ({start_time_s} s) has unusable value") + if math.isinf(length_s) or math.isnan(length_s): + raise IsarBstoolError(f"length ({length_s} s) has unusable value") + + # Ensure times are not negative + if start_time_s < 0: + raise IsarBstoolError(f"start_time ({start_time_s} s) can't be negative") + if length_s < 0: + raise IsarBstoolError(f"length ({length_s} s) can't be negative") + + # We can only remove entire frames + if start_time_ms % self.isar_frame_size_ms != 0: + raise IsarBstoolError( + f"start_time ({start_time_s} s) must be an integer multiple of ISAR frame duration ({self.isar_frame_size_ms} ms)" + ) + if length_ms % self.isar_frame_size_ms != 0: + raise IsarBstoolError( + f"length ({length_s} s) must be an integer multiple of ISAR frame duration ({self.isar_frame_size_ms} ms)" + ) + + start_idx = int(start_time_ms / self.isar_frame_size_ms) + end_idx = start_idx + int(length_ms / self.isar_frame_size_ms) + self.frames = self.frames[start_idx : min(end_idx, len(self.frames))] + + return self + + def is_same_as(self, other: IsarBitstream) -> bool: + return self.header == other.header and self.frames == other.frames + + +class _AsBytes: + def __init__(self) -> None: + self.as_bytes = bytearray() + + def _read(self, reader, num_bytes): + bytes_ = reader.read(num_bytes) + self.as_bytes.extend(bytes_) + return bytes_ + + def __eq__(self, value: object, /) -> bool: + if not isinstance(value, _AsBytes): + return False + return self.as_bytes == value.as_bytes + + +class IsarFileHeader(_AsBytes): + def __init__(self, reader) -> None: + super().__init__() + + FILE_HEADER = b"MAIN_SPLITH" + file_header_top = self._read(reader, len(FILE_HEADER)) + if file_header_top != FILE_HEADER: + raise IsarBstoolError(f"Not a valid ISAR file: {reader.name}") + + self.delay_ns = _int_from_bytes(self._read(reader, 4)) + self.codec = _codec_from_bytes(self._read(reader, 4)) + self.pose_correction = _pose_corr_from_bytes(self._read(reader, 4)) + self.codec_frame_size_ms = _int_from_bytes(self._read(reader, 2)) + self.isar_frame_size_ms = _int_from_bytes(self._read(reader, 2)) + self.sample_rate = _int_from_bytes(self._read(reader, 4)) + self.lc3plus_hires = bool(_int_from_bytes(self._read(reader, 2))) + + +class IsarFileFrame(_AsBytes): + def __init__(self, reader) -> None: + super().__init__() + + FRAME_HEADER = b"SPLIT_FRAME" + frame_header = self._read(reader, len(FRAME_HEADER)) + if frame_header != FRAME_HEADER: + raise IsarBstoolError(f"Not a valid ISAR file: {reader.name}") + + version = _int_from_bytes(self._read(reader, 1)) + if version != 0: + raise IsarBstoolError( + f"Unupported version of ISAR file format: {reader.name}" + ) + + self.num_bits = _int_from_bytes(self._read(reader, 4)) + + payload_size = math.ceil(self.num_bits / 8) + self.payload = self._read(reader, payload_size) + + +###################################################################################### +# utilities +###################################################################################### + + +def _int_from_bytes(bytes_): + return int.from_bytes(bytes_, byteorder="little") + + +def _codec_from_bytes(bytes_): + # Refer to ISAR_SPLIT_REND_CODEC enum in C code + CODECS = ["LCLD", "LC3PLUS", "DEFAULT", "NONE"] + x = _int_from_bytes(bytes_) + + if x < len(CODECS): + return CODECS[x] + + return "UNKNOWN" + + +def _pose_corr_from_bytes(bytes_): + # Refer to ISAR_SPLIT_REND_POSE_CORRECTION_MODE enum in C code + POSE_CORR_MODES = ["NONE", "CLDFB"] + x = _int_from_bytes(bytes_) + + if x < len(POSE_CORR_MODES): + return POSE_CORR_MODES[x] + + return "UNKNOWN" + + +###################################################################################### +# subcommand functions +###################################################################################### + + +def _subcmd_info(args): + bs = IsarBitstream(args.file_in) + + match args.only: + case "duration_seconds": + print(bs.duration_seconds) + case "duration_samples": + print(bs.duration_samples) + case "num_frames": + print(bs.num_frames) + case "num_empty_frames": + print(bs.num_empty_frames) + case "sample_rate": + print(bs.sample_rate) + case "delay_ns": + print(bs.delay_ns) + case "delay_samples": + print(bs.delay_samples) + case "isar_frame_size_ms": + print(bs.isar_frame_size_ms) + case "isar_frame_size_samples": + print(bs.isar_frame_size_samples) + case "pose_correction": + print(bs.pose_correction) + case "avg_bitrate": + print(bs.avg_bitrate_bps) + case "avg_bitrate_non_empty_frames": + print(bs.avg_bitrate_non_empty_frames_bps) + case "codec": + print(bs.codec) + case "codec_frame_size_ms": + print(bs.codec_frame_size_ms) + case "codec_frame_size_samples": + print(bs.codec_frame_size_samples) + case "lc3plus_hires": + print("ON" if bs.lc3plus_hires else "OFF") + case None: + print(bs.info()) + case _: + raise IsarBstoolError(f"Not a valid parameter value: '{args.only}'") + + +def _subcmd_trim(args): + bs = IsarBitstream(args.file_in) + bs.trim(float(args.start_time), float(args.length) if args.length else None) + bs.write(args.file_out) + + +###################################################################################### +# main +###################################################################################### + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog="isar_bstool", + description="Utility for inspecting and modifying ISAR bitstreams", + ) + parser.set_defaults(func=lambda _: parser.print_help()) + subparsers = parser.add_subparsers(title="Commands") + + info = subparsers.add_parser("info", help="Print information about a bitstream") + info.add_argument("file_in", help="Path to input file") + info.add_argument( + "--only", + help="Print only a specific parameter", + default=None, + choices=[ + "duration_seconds", + "duration_samples", + "num_frames", + "num_empty_frames", + "sample_rate", + "delay_ns", + "delay_samples", + "isar_frame_size_ms", + "isar_frame_size_samples", + "pose_correction", + "avg_bitrate", + "avg_bitrate_non_empty_frames", + "codec", + "codec_frame_size_ms", + "codec_frame_size_samples", + "lc3plus_hires", + ], + ) + info.set_defaults(func=_subcmd_info) + + trim = subparsers.add_parser( + "trim", help="Remove initial frames from a bitstream file" + ) + trim.add_argument("file_in", help="Path to input file") + trim.add_argument("file_out", help="Path to output file") + trim.add_argument( + "start_time", + help="Start point (in s) from which content should be copied to the output.", + ) + trim.add_argument( + "--length", + help="Amount of time (in s) to copy to the output. If not given, content is copied until the end of the input is reached.", + default=None, + ) + trim.set_defaults(func=_subcmd_trim) + + args = parser.parse_args() + + try: + args.func(args) + except (FileNotFoundError, PermissionError, IsarBstoolError) as e: + print(e, file=sys.stderr) + sys.exit(1) diff --git a/scripts/trajectories/rotate_euler_quaternion_30s.csv b/scripts/trajectories/rotate_euler_quaternion_30s.csv new file mode 100644 index 0000000000..d4fdb053c1 --- /dev/null +++ b/scripts/trajectories/rotate_euler_quaternion_30s.csv @@ -0,0 +1,6000 @@ +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 diff --git a/scripts/trajectories/rotate_euler_quaternion_30s_delayed.csv b/scripts/trajectories/rotate_euler_quaternion_30s_delayed.csv new file mode 100644 index 0000000000..7df0cd9c9a --- /dev/null +++ b/scripts/trajectories/rotate_euler_quaternion_30s_delayed.csv @@ -0,0 +1,6020 @@ +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 diff --git a/scripts/trajectories/rotate_euler_quaternion_30s_delayed_voip.csv b/scripts/trajectories/rotate_euler_quaternion_30s_delayed_voip.csv new file mode 100644 index 0000000000..cd42f9f9ae --- /dev/null +++ b/scripts/trajectories/rotate_euler_quaternion_30s_delayed_voip.csv @@ -0,0 +1,6032 @@ +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 diff --git a/scripts/trajectories/rotate_euler_quaternion_30s_voip.csv b/scripts/trajectories/rotate_euler_quaternion_30s_voip.csv new file mode 100644 index 0000000000..ee015a29bf --- /dev/null +++ b/scripts/trajectories/rotate_euler_quaternion_30s_voip.csv @@ -0,0 +1,6012 @@ +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,0,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 diff --git a/scripts/trajectories/rotate_euler_quaternion_5s.csv b/scripts/trajectories/rotate_euler_quaternion_5s.csv deleted file mode 100644 index 0052e3d7c7..0000000000 --- a/scripts/trajectories/rotate_euler_quaternion_5s.csv +++ /dev/null @@ -1,1000 +0,0 @@ --3,360,0,0 --3,359.1,0,0 --3,358.2,0,0 --3,357.3,0,0 --3,356.4,0,0 --3,355.5,0,0 --3,354.6,0,0 --3,353.7,0,0 --3,352.8,0,0 --3,351.9,0,0 --3,351,0,0 --3,350.1,0,0 --3,349.2,0,0 --3,348.3,0,0 --3,347.4,0,0 --3,346.5,0,0 --3,345.6,0,0 --3,344.7,0,0 --3,343.8,0,0 --3,342.9,0,0 --3,342,0,0 --3,341.1,0,0 --3,340.2,0,0 --3,339.2,0,0 --3,338.3,0,0 --3,337.4,0,0 --3,336.5,0,0 --3,335.6,0,0 --3,334.7,0,0 --3,333.8,0,0 --3,332.9,0,0 --3,332,0,0 --3,331.1,0,0 --3,330.2,0,0 --3,329.3,0,0 --3,328.4,0,0 --3,327.5,0,0 --3,326.6,0,0 --3,325.7,0,0 --3,324.8,0,0 --3,323.9,0,0 --3,323,0,0 --3,322.1,0,0 --3,321.2,0,0 --3,320.3,0,0 --3,319.4,0,0 --3,318.5,0,0 --3,317.6,0,0 --3,316.7,0,0 --3,315.8,0,0 --3,314.9,0,0 --3,314,0,0 --3,313.1,0,0 --3,312.2,0,0 --3,311.3,0,0 --3,310.4,0,0 --3,309.5,0,0 --3,308.6,0,0 --3,307.7,0,0 --3,306.8,0,0 --3,305.9,0,0 --3,305,0,0 --3,304.1,0,0 --3,303.2,0,0 --3,302.3,0,0 --3,301.4,0,0 --3,300.5,0,0 --3,299.5,0,0 --3,298.6,0,0 --3,297.7,0,0 --3,296.8,0,0 --3,295.9,0,0 --3,295,0,0 --3,294.1,0,0 --3,293.2,0,0 --3,292.3,0,0 --3,291.4,0,0 --3,290.5,0,0 --3,289.6,0,0 --3,288.7,0,0 --3,287.8,0,0 --3,286.9,0,0 --3,286,0,0 --3,285.1,0,0 --3,284.2,0,0 --3,283.3,0,0 --3,282.4,0,0 --3,281.5,0,0 --3,280.6,0,0 --3,279.7,0,0 --3,278.8,0,0 --3,277.9,0,0 --3,277,0,0 --3,276.1,0,0 --3,275.2,0,0 --3,274.3,0,0 --3,273.4,0,0 --3,272.5,0,0 --3,271.6,0,0 --3,270.7,0,0 --3,269.8,0,0 --3,268.9,0,0 --3,268,0,0 --3,267.1,0,0 --3,266.2,0,0 --3,265.3,0,0 --3,264.4,0,0 --3,263.5,0,0 --3,262.6,0,0 --3,261.7,0,0 --3,260.8,0,0 --3,259.8,0,0 --3,258.9,0,0 --3,258,0,0 --3,257.1,0,0 --3,256.2,0,0 --3,255.3,0,0 --3,254.4,0,0 --3,253.5,0,0 --3,252.6,0,0 --3,251.7,0,0 --3,250.8,0,0 --3,249.9,0,0 --3,249,0,0 --3,248.1,0,0 --3,247.2,0,0 --3,246.3,0,0 --3,245.4,0,0 --3,244.5,0,0 --3,243.6,0,0 --3,242.7,0,0 --3,241.8,0,0 --3,240.9,0,0 --3,240,0,0 --3,239.1,0,0 --3,238.2,0,0 --3,237.3,0,0 --3,236.4,0,0 --3,235.5,0,0 --3,234.6,0,0 --3,233.7,0,0 --3,232.8,0,0 --3,231.9,0,0 --3,231,0,0 --3,230.1,0,0 --3,229.2,0,0 --3,228.3,0,0 --3,227.4,0,0 --3,226.5,0,0 --3,225.6,0,0 --3,224.7,0,0 --3,223.8,0,0 --3,222.9,0,0 --3,222,0,0 --3,221.1,0,0 --3,220.2,0,0 --3,219.2,0,0 --3,218.3,0,0 --3,217.4,0,0 --3,216.5,0,0 --3,215.6,0,0 --3,214.7,0,0 --3,213.8,0,0 --3,212.9,0,0 --3,212,0,0 --3,211.1,0,0 --3,210.2,0,0 --3,209.3,0,0 --3,208.4,0,0 --3,207.5,0,0 --3,206.6,0,0 --3,205.7,0,0 --3,204.8,0,0 --3,203.9,0,0 --3,203,0,0 --3,202.1,0,0 --3,201.2,0,0 --3,200.3,0,0 --3,199.4,0,0 --3,198.5,0,0 --3,197.6,0,0 --3,196.7,0,0 --3,195.8,0,0 --3,194.9,0,0 --3,194,0,0 --3,193.1,0,0 --3,192.2,0,0 --3,191.3,0,0 --3,190.4,0,0 --3,189.5,0,0 --3,188.6,0,0 --3,187.7,0,0 --3,186.8,0,0 --3,185.9,0,0 --3,185,0,0 --3,184.1,0,0 --3,183.2,0,0 --3,182.3,0,0 --3,181.4,0,0 --3,180.5,0,0 --3,179.5,-90,0 --3,178.6,-89.5,0 --3,177.7,-89.1,0 --3,176.8,-88.6,0 --3,175.9,-88.2,0 --3,175,-87.7,0 --3,174.1,-87.3,0 --3,173.2,-86.8,0 --3,172.3,-86.4,0 --3,171.4,-85.9,0 --3,170.5,-85.5,0 --3,169.6,-85,0 --3,168.7,-84.6,0 --3,167.8,-84.1,0 --3,166.9,-83.7,0 --3,166,-83.2,0 --3,165.1,-82.8,0 --3,164.2,-82.3,0 --3,163.3,-81.9,0 --3,162.4,-81.4,0 --3,161.5,-81,0 --3,160.6,-80.5,0 --3,159.7,-80.1,0 --3,158.8,-79.6,0 --3,157.9,-79.1,0 --3,157,-78.7,0 --3,156.1,-78.2,0 --3,155.2,-77.8,0 --3,154.3,-77.3,0 --3,153.4,-76.9,0 --3,152.5,-76.4,0 --3,151.6,-76,0 --3,150.7,-75.5,0 --3,149.8,-75.1,0 --3,148.9,-74.6,0 --3,148,-74.2,0 --3,147.1,-73.7,0 --3,146.2,-73.3,0 --3,145.3,-72.8,0 --3,144.4,-72.4,0 --3,143.5,-71.9,0 --3,142.6,-71.5,0 --3,141.7,-71,0 --3,140.8,-70.6,0 --3,139.8,-70.1,0 --3,138.9,-69.6,0 --3,138,-69.2,0 --3,137.1,-68.7,0 --3,136.2,-68.3,0 --3,135.3,-67.8,0 --3,134.4,-67.4,0 --3,133.5,-66.9,0 --3,132.6,-66.5,0 --3,131.7,-66,0 --3,130.8,-65.6,0 --3,129.9,-65.1,0 --3,129,-64.7,0 --3,128.1,-64.2,0 --3,127.2,-63.8,0 --3,126.3,-63.3,0 --3,125.4,-62.9,0 --3,124.5,-62.4,0 --3,123.6,-62,0 --3,122.7,-61.5,0 --3,121.8,-61.1,0 --3,120.9,-60.6,0 --3,120,-60.2,0 --3,119.1,-59.7,0 --3,118.2,-59.2,0 --3,117.3,-58.8,0 --3,116.4,-58.3,0 --3,115.5,-57.9,0 --3,114.6,-57.4,0 --3,113.7,-57,0 --3,112.8,-56.5,0 --3,111.9,-56.1,0 --3,111,-55.6,0 --3,110.1,-55.2,0 --3,109.2,-54.7,0 --3,108.3,-54.3,0 --3,107.4,-53.8,0 --3,106.5,-53.4,0 --3,105.6,-52.9,0 --3,104.7,-52.5,0 --3,103.8,-52,0 --3,102.9,-51.6,0 --3,102,-51.1,0 --3,101.1,-50.7,0 --3,100.2,-50.2,0 --3,99.2,-49.7,0 --3,98.3,-49.3,0 --3,97.4,-48.8,0 --3,96.5,-48.4,0 --3,95.6,-47.9,0 --3,94.7,-47.5,0 --3,93.8,-47,0 --3,92.9,-46.6,0 --3,92,-46.1,0 --3,91.1,-45.7,0 --3,90.2,-45.2,0 --3,89.3,-44.8,90 --3,88.4,-44.3,89.1 --3,87.5,-43.9,88.2 --3,86.6,-43.4,87.3 --3,85.7,-43,86.4 --3,84.8,-42.5,85.5 --3,83.9,-42.1,84.5 --3,83,-41.6,83.6 --3,82.1,-41.2,82.7 --3,81.2,-40.7,81.8 --3,80.3,-40.3,80.9 --3,79.4,-39.8,80 --3,78.5,-39.3,79.1 --3,77.6,-38.9,78.2 --3,76.7,-38.4,77.3 --3,75.8,-38,76.4 --3,74.9,-37.5,75.5 --3,74,-37.1,74.5 --3,73.1,-36.6,73.6 --3,72.2,-36.2,72.7 --3,71.3,-35.7,71.8 --3,70.4,-35.3,70.9 --3,69.5,-34.8,70 --3,68.6,-34.4,69.1 --3,67.7,-33.9,68.2 --3,66.8,-33.5,67.3 --3,65.9,-33,66.4 --3,65,-32.6,65.5 --3,64.1,-32.1,64.5 --3,63.2,-31.7,63.6 --3,62.3,-31.2,62.7 --3,61.4,-30.8,61.8 --3,60.5,-30.3,60.9 --3,59.5,-29.8,60 --3,58.6,-29.4,59.1 --3,57.7,-28.9,58.2 --3,56.8,-28.5,57.3 --3,55.9,-28,56.4 --3,55,-27.6,55.5 --3,54.1,-27.1,54.5 --3,53.2,-26.7,53.6 --3,52.3,-26.2,52.7 --3,51.4,-25.8,51.8 --3,50.5,-25.3,50.9 --3,49.6,-24.9,50 --3,48.7,-24.4,49.1 --3,47.8,-24,48.2 --3,46.9,-23.5,47.3 --3,46,-23.1,46.4 --3,45.1,-22.6,45.5 --3,44.2,-22.2,44.5 --3,43.3,-21.7,43.6 --3,42.4,-21.3,42.7 --3,41.5,-20.8,41.8 --3,40.6,-20.4,40.9 --3,39.7,-19.9,40 --3,38.8,-19.4,39.1 --3,37.9,-19,38.2 --3,37,-18.5,37.3 --3,36.1,-18.1,36.4 --3,35.2,-17.6,35.5 --3,34.3,-17.2,34.5 --3,33.4,-16.7,33.6 --3,32.5,-16.3,32.7 --3,31.6,-15.8,31.8 --3,30.7,-15.4,30.9 --3,29.8,-14.9,30 --3,28.9,-14.5,29.1 --3,28,-14,28.2 --3,27.1,-13.6,27.3 --3,26.2,-13.1,26.4 --3,25.3,-12.7,25.5 --3,24.4,-12.2,24.5 --3,23.5,-11.8,23.6 --3,22.6,-11.3,22.7 --3,21.7,-10.9,21.8 --3,20.8,-10.4,20.9 --3,19.8,-9.9,20 --3,18.9,-9.5,19.1 --3,18,-9,18.2 --3,17.1,-8.6,17.3 --3,16.2,-8.1,16.4 --3,15.3,-7.7,15.5 --3,14.4,-7.2,14.5 --3,13.5,-6.8,13.6 --3,12.6,-6.3,12.7 --3,11.7,-5.9,11.8 --3,10.8,-5.4,10.9 --3,9.9,-5,10 --3,9,-4.5,9.1 --3,8.1,-4.1,8.2 --3,7.2,-3.6,7.3 --3,6.3,-3.2,6.4 --3,5.4,-2.7,5.5 --3,4.5,-2.3,4.5 --3,3.6,-1.8,3.6 --3,2.7,-1.4,2.7 --3,1.8,-0.9,1.8 --3,0.9,-0.5,0.9 --3,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -0.9,0,0,0.3 -0.9,0,0,0.3 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.8,0,0,0.5 -0.8,0,0,0.5 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.5,0,0,0.8 -0.5,0,0,0.8 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.3,0,0,0.9 -0.3,0,0,0.9 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,0.9 -0.3,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.8 -0.5,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.7,0,0,0.8 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.8,0,0,0.7 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.5 -0.8,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.3 -0.9,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0 --3,0,0,0 --3,0.9,-0.5,0.9 --3,1.8,-0.9,1.8 --3,2.7,-1.4,2.7 --3,3.6,-1.8,3.6 --3,4.5,-2.3,4.5 --3,5.4,-2.7,5.5 --3,6.3,-3.2,6.4 --3,7.2,-3.6,7.3 --3,8.1,-4.1,8.2 --3,9,-4.5,9.1 --3,9.9,-5,10 --3,10.8,-5.4,10.9 --3,11.7,-5.9,11.8 --3,12.6,-6.3,12.7 --3,13.5,-6.8,13.6 --3,14.4,-7.2,14.5 --3,15.3,-7.7,15.5 --3,16.2,-8.1,16.4 --3,17.1,-8.6,17.3 --3,18,-9,18.2 --3,18.9,-9.5,19.1 --3,19.8,-9.9,20 --3,20.8,-10.4,20.9 --3,21.7,-10.9,21.8 --3,22.6,-11.3,22.7 --3,23.5,-11.8,23.6 --3,24.4,-12.2,24.5 --3,25.3,-12.7,25.5 --3,26.2,-13.1,26.4 --3,27.1,-13.6,27.3 --3,28,-14,28.2 --3,28.9,-14.5,29.1 --3,29.8,-14.9,30 --3,30.7,-15.4,30.9 --3,31.6,-15.8,31.8 --3,32.5,-16.3,32.7 --3,33.4,-16.7,33.6 --3,34.3,-17.2,34.5 --3,35.2,-17.6,35.5 --3,36.1,-18.1,36.4 --3,37,-18.5,37.3 --3,37.9,-19,38.2 --3,38.8,-19.4,39.1 --3,39.7,-19.9,40 --3,40.6,-20.4,40.9 --3,41.5,-20.8,41.8 --3,42.4,-21.3,42.7 --3,43.3,-21.7,43.6 --3,44.2,-22.2,44.5 --3,45.1,-22.6,45.5 --3,46,-23.1,46.4 --3,46.9,-23.5,47.3 --3,47.8,-24,48.2 --3,48.7,-24.4,49.1 --3,49.6,-24.9,50 --3,50.5,-25.3,50.9 --3,51.4,-25.8,51.8 --3,52.3,-26.2,52.7 --3,53.2,-26.7,53.6 --3,54.1,-27.1,54.5 --3,55,-27.6,55.5 --3,55.9,-28,56.4 --3,56.8,-28.5,57.3 --3,57.7,-28.9,58.2 --3,58.6,-29.4,59.1 --3,59.5,-29.8,60 --3,60.5,-30.3,60.9 --3,61.4,-30.8,61.8 --3,62.3,-31.2,62.7 --3,63.2,-31.7,63.6 --3,64.1,-32.1,64.5 --3,65,-32.6,65.5 --3,65.9,-33,66.4 --3,66.8,-33.5,67.3 --3,67.7,-33.9,68.2 --3,68.6,-34.4,69.1 --3,69.5,-34.8,70 --3,70.4,-35.3,70.9 --3,71.3,-35.7,71.8 --3,72.2,-36.2,72.7 --3,73.1,-36.6,73.6 --3,74,-37.1,74.5 --3,74.9,-37.5,75.5 --3,75.8,-38,76.4 --3,76.7,-38.4,77.3 --3,77.6,-38.9,78.2 --3,78.5,-39.3,79.1 --3,79.4,-39.8,80 --3,80.3,-40.3,80.9 --3,81.2,-40.7,81.8 --3,82.1,-41.2,82.7 --3,83,-41.6,83.6 --3,83.9,-42.1,84.5 --3,84.8,-42.5,85.5 --3,85.7,-43,86.4 --3,86.6,-43.4,87.3 --3,87.5,-43.9,88.2 --3,88.4,-44.3,89.1 --3,89.3,-44.8,90 --3,90.2,-45.2,0 --3,91.1,-45.7,0 --3,92,-46.1,0 --3,92.9,-46.6,0 --3,93.8,-47,0 --3,94.7,-47.5,0 --3,95.6,-47.9,0 --3,96.5,-48.4,0 --3,97.4,-48.8,0 --3,98.3,-49.3,0 --3,99.2,-49.7,0 --3,100.2,-50.2,0 --3,101.1,-50.7,0 --3,102,-51.1,0 --3,102.9,-51.6,0 --3,103.8,-52,0 --3,104.7,-52.5,0 --3,105.6,-52.9,0 --3,106.5,-53.4,0 --3,107.4,-53.8,0 --3,108.3,-54.3,0 --3,109.2,-54.7,0 --3,110.1,-55.2,0 --3,111,-55.6,0 --3,111.9,-56.1,0 --3,112.8,-56.5,0 --3,113.7,-57,0 --3,114.6,-57.4,0 --3,115.5,-57.9,0 --3,116.4,-58.3,0 --3,117.3,-58.8,0 --3,118.2,-59.2,0 --3,119.1,-59.7,0 --3,120,-60.2,0 --3,120.9,-60.6,0 --3,121.8,-61.1,0 --3,122.7,-61.5,0 --3,123.6,-62,0 --3,124.5,-62.4,0 --3,125.4,-62.9,0 --3,126.3,-63.3,0 --3,127.2,-63.8,0 --3,128.1,-64.2,0 --3,129,-64.7,0 --3,129.9,-65.1,0 --3,130.8,-65.6,0 --3,131.7,-66,0 --3,132.6,-66.5,0 --3,133.5,-66.9,0 --3,134.4,-67.4,0 --3,135.3,-67.8,0 --3,136.2,-68.3,0 --3,137.1,-68.7,0 --3,138,-69.2,0 --3,138.9,-69.6,0 --3,139.8,-70.1,0 --3,140.8,-70.6,0 --3,141.7,-71,0 --3,142.6,-71.5,0 --3,143.5,-71.9,0 --3,144.4,-72.4,0 --3,145.3,-72.8,0 --3,146.2,-73.3,0 --3,147.1,-73.7,0 --3,148,-74.2,0 --3,148.9,-74.6,0 --3,149.8,-75.1,0 --3,150.7,-75.5,0 --3,151.6,-76,0 --3,152.5,-76.4,0 --3,153.4,-76.9,0 --3,154.3,-77.3,0 --3,155.2,-77.8,0 --3,156.1,-78.2,0 --3,157,-78.7,0 --3,157.9,-79.1,0 --3,158.8,-79.6,0 --3,159.7,-80.1,0 --3,160.6,-80.5,0 --3,161.5,-81,0 --3,162.4,-81.4,0 --3,163.3,-81.9,0 --3,164.2,-82.3,0 --3,165.1,-82.8,0 --3,166,-83.2,0 --3,166.9,-83.7,0 --3,167.8,-84.1,0 --3,168.7,-84.6,0 --3,169.6,-85,0 --3,170.5,-85.5,0 --3,171.4,-85.9,0 --3,172.3,-86.4,0 --3,173.2,-86.8,0 --3,174.1,-87.3,0 --3,175,-87.7,0 --3,175.9,-88.2,0 --3,176.8,-88.6,0 --3,177.7,-89.1,0 --3,178.6,-89.5,0 --3,179.5,-90,0 --3,180.5,0,0 --3,181.4,0,0 --3,182.3,0,0 --3,183.2,0,0 --3,184.1,0,0 --3,185,0,0 --3,185.9,0,0 --3,186.8,0,0 --3,187.7,0,0 --3,188.6,0,0 --3,189.5,0,0 --3,190.4,0,0 --3,191.3,0,0 --3,192.2,0,0 --3,193.1,0,0 --3,194,0,0 --3,194.9,0,0 --3,195.8,0,0 --3,196.7,0,0 --3,197.6,0,0 --3,198.5,0,0 --3,199.4,0,0 --3,200.3,0,0 --3,201.2,0,0 --3,202.1,0,0 --3,203,0,0 --3,203.9,0,0 --3,204.8,0,0 --3,205.7,0,0 --3,206.6,0,0 --3,207.5,0,0 --3,208.4,0,0 --3,209.3,0,0 --3,210.2,0,0 --3,211.1,0,0 --3,212,0,0 --3,212.9,0,0 --3,213.8,0,0 --3,214.7,0,0 --3,215.6,0,0 --3,216.5,0,0 --3,217.4,0,0 --3,218.3,0,0 --3,219.2,0,0 --3,220.2,0,0 --3,221.1,0,0 --3,222,0,0 --3,222.9,0,0 --3,223.8,0,0 --3,224.7,0,0 --3,225.6,0,0 --3,226.5,0,0 --3,227.4,0,0 --3,228.3,0,0 --3,229.2,0,0 --3,230.1,0,0 --3,231,0,0 --3,231.9,0,0 --3,232.8,0,0 --3,233.7,0,0 --3,234.6,0,0 --3,235.5,0,0 --3,236.4,0,0 --3,237.3,0,0 --3,238.2,0,0 --3,239.1,0,0 --3,240,0,0 --3,240.9,0,0 --3,241.8,0,0 --3,242.7,0,0 --3,243.6,0,0 --3,244.5,0,0 --3,245.4,0,0 --3,246.3,0,0 --3,247.2,0,0 --3,248.1,0,0 --3,249,0,0 --3,249.9,0,0 --3,250.8,0,0 --3,251.7,0,0 --3,252.6,0,0 --3,253.5,0,0 --3,254.4,0,0 --3,255.3,0,0 --3,256.2,0,0 --3,257.1,0,0 --3,258,0,0 --3,258.9,0,0 --3,259.8,0,0 --3,260.8,0,0 --3,261.7,0,0 --3,262.6,0,0 --3,263.5,0,0 --3,264.4,0,0 --3,265.3,0,0 --3,266.2,0,0 --3,267.1,0,0 --3,268,0,0 --3,268.9,0,0 --3,269.8,0,0 --3,270.7,0,0 --3,271.6,0,0 --3,272.5,0,0 --3,273.4,0,0 --3,274.3,0,0 --3,275.2,0,0 --3,276.1,0,0 --3,277,0,0 --3,277.9,0,0 --3,278.8,0,0 --3,279.7,0,0 --3,280.6,0,0 --3,281.5,0,0 --3,282.4,0,0 --3,283.3,0,0 --3,284.2,0,0 --3,285.1,0,0 --3,286,0,0 --3,286.9,0,0 --3,287.8,0,0 --3,288.7,0,0 --3,289.6,0,0 --3,290.5,0,0 --3,291.4,0,0 --3,292.3,0,0 --3,293.2,0,0 --3,294.1,0,0 --3,295,0,0 --3,295.9,0,0 --3,296.8,0,0 --3,297.7,0,0 --3,298.6,0,0 --3,299.5,0,0 --3,300.5,0,0 --3,301.4,0,0 --3,302.3,0,0 --3,303.2,0,0 --3,304.1,0,0 --3,305,0,0 --3,305.9,0,0 --3,306.8,0,0 --3,307.7,0,0 --3,308.6,0,0 --3,309.5,0,0 --3,310.4,0,0 --3,311.3,0,0 --3,312.2,0,0 --3,313.1,0,0 --3,314,0,0 --3,314.9,0,0 --3,315.8,0,0 --3,316.7,0,0 --3,317.6,0,0 --3,318.5,0,0 --3,319.4,0,0 --3,320.3,0,0 --3,321.2,0,0 --3,322.1,0,0 --3,323,0,0 --3,323.9,0,0 --3,324.8,0,0 --3,325.7,0,0 --3,326.6,0,0 --3,327.5,0,0 --3,328.4,0,0 --3,329.3,0,0 --3,330.2,0,0 --3,331.1,0,0 --3,332,0,0 --3,332.9,0,0 --3,333.8,0,0 --3,334.7,0,0 --3,335.6,0,0 --3,336.5,0,0 --3,337.4,0,0 --3,338.3,0,0 --3,339.2,0,0 --3,340.2,0,0 --3,341.1,0,0 --3,342,0,0 --3,342.9,0,0 --3,343.8,0,0 --3,344.7,0,0 --3,345.6,0,0 --3,346.5,0,0 --3,347.4,0,0 --3,348.3,0,0 --3,349.2,0,0 --3,350.1,0,0 --3,351,0,0 --3,351.9,0,0 --3,352.8,0,0 --3,353.7,0,0 --3,354.6,0,0 --3,355.5,0,0 --3,356.4,0,0 --3,357.3,0,0 --3,358.2,0,0 --3,359.1,0,0 --3,360,0,0 diff --git a/scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv b/scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv deleted file mode 100644 index 99c54e3c52..0000000000 --- a/scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv +++ /dev/null @@ -1,1020 +0,0 @@ --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,360,0,0 --3,359.1,0,0 --3,358.2,0,0 --3,357.3,0,0 --3,356.4,0,0 --3,355.5,0,0 --3,354.6,0,0 --3,353.7,0,0 --3,352.8,0,0 --3,351.9,0,0 --3,351,0,0 --3,350.1,0,0 --3,349.2,0,0 --3,348.3,0,0 --3,347.4,0,0 --3,346.5,0,0 --3,345.6,0,0 --3,344.7,0,0 --3,343.8,0,0 --3,342.9,0,0 --3,342,0,0 --3,341.1,0,0 --3,340.2,0,0 --3,339.2,0,0 --3,338.3,0,0 --3,337.4,0,0 --3,336.5,0,0 --3,335.6,0,0 --3,334.7,0,0 --3,333.8,0,0 --3,332.9,0,0 --3,332,0,0 --3,331.1,0,0 --3,330.2,0,0 --3,329.3,0,0 --3,328.4,0,0 --3,327.5,0,0 --3,326.6,0,0 --3,325.7,0,0 --3,324.8,0,0 --3,323.9,0,0 --3,323,0,0 --3,322.1,0,0 --3,321.2,0,0 --3,320.3,0,0 --3,319.4,0,0 --3,318.5,0,0 --3,317.6,0,0 --3,316.7,0,0 --3,315.8,0,0 --3,314.9,0,0 --3,314,0,0 --3,313.1,0,0 --3,312.2,0,0 --3,311.3,0,0 --3,310.4,0,0 --3,309.5,0,0 --3,308.6,0,0 --3,307.7,0,0 --3,306.8,0,0 --3,305.9,0,0 --3,305,0,0 --3,304.1,0,0 --3,303.2,0,0 --3,302.3,0,0 --3,301.4,0,0 --3,300.5,0,0 --3,299.5,0,0 --3,298.6,0,0 --3,297.7,0,0 --3,296.8,0,0 --3,295.9,0,0 --3,295,0,0 --3,294.1,0,0 --3,293.2,0,0 --3,292.3,0,0 --3,291.4,0,0 --3,290.5,0,0 --3,289.6,0,0 --3,288.7,0,0 --3,287.8,0,0 --3,286.9,0,0 --3,286,0,0 --3,285.1,0,0 --3,284.2,0,0 --3,283.3,0,0 --3,282.4,0,0 --3,281.5,0,0 --3,280.6,0,0 --3,279.7,0,0 --3,278.8,0,0 --3,277.9,0,0 --3,277,0,0 --3,276.1,0,0 --3,275.2,0,0 --3,274.3,0,0 --3,273.4,0,0 --3,272.5,0,0 --3,271.6,0,0 --3,270.7,0,0 --3,269.8,0,0 --3,268.9,0,0 --3,268,0,0 --3,267.1,0,0 --3,266.2,0,0 --3,265.3,0,0 --3,264.4,0,0 --3,263.5,0,0 --3,262.6,0,0 --3,261.7,0,0 --3,260.8,0,0 --3,259.8,0,0 --3,258.9,0,0 --3,258,0,0 --3,257.1,0,0 --3,256.2,0,0 --3,255.3,0,0 --3,254.4,0,0 --3,253.5,0,0 --3,252.6,0,0 --3,251.7,0,0 --3,250.8,0,0 --3,249.9,0,0 --3,249,0,0 --3,248.1,0,0 --3,247.2,0,0 --3,246.3,0,0 --3,245.4,0,0 --3,244.5,0,0 --3,243.6,0,0 --3,242.7,0,0 --3,241.8,0,0 --3,240.9,0,0 --3,240,0,0 --3,239.1,0,0 --3,238.2,0,0 --3,237.3,0,0 --3,236.4,0,0 --3,235.5,0,0 --3,234.6,0,0 --3,233.7,0,0 --3,232.8,0,0 --3,231.9,0,0 --3,231,0,0 --3,230.1,0,0 --3,229.2,0,0 --3,228.3,0,0 --3,227.4,0,0 --3,226.5,0,0 --3,225.6,0,0 --3,224.7,0,0 --3,223.8,0,0 --3,222.9,0,0 --3,222,0,0 --3,221.1,0,0 --3,220.2,0,0 --3,219.2,0,0 --3,218.3,0,0 --3,217.4,0,0 --3,216.5,0,0 --3,215.6,0,0 --3,214.7,0,0 --3,213.8,0,0 --3,212.9,0,0 --3,212,0,0 --3,211.1,0,0 --3,210.2,0,0 --3,209.3,0,0 --3,208.4,0,0 --3,207.5,0,0 --3,206.6,0,0 --3,205.7,0,0 --3,204.8,0,0 --3,203.9,0,0 --3,203,0,0 --3,202.1,0,0 --3,201.2,0,0 --3,200.3,0,0 --3,199.4,0,0 --3,198.5,0,0 --3,197.6,0,0 --3,196.7,0,0 --3,195.8,0,0 --3,194.9,0,0 --3,194,0,0 --3,193.1,0,0 --3,192.2,0,0 --3,191.3,0,0 --3,190.4,0,0 --3,189.5,0,0 --3,188.6,0,0 --3,187.7,0,0 --3,186.8,0,0 --3,185.9,0,0 --3,185,0,0 --3,184.1,0,0 --3,183.2,0,0 --3,182.3,0,0 --3,181.4,0,0 --3,180.5,0,0 --3,179.5,-90,0 --3,178.6,-89.5,0 --3,177.7,-89.1,0 --3,176.8,-88.6,0 --3,175.9,-88.2,0 --3,175,-87.7,0 --3,174.1,-87.3,0 --3,173.2,-86.8,0 --3,172.3,-86.4,0 --3,171.4,-85.9,0 --3,170.5,-85.5,0 --3,169.6,-85,0 --3,168.7,-84.6,0 --3,167.8,-84.1,0 --3,166.9,-83.7,0 --3,166,-83.2,0 --3,165.1,-82.8,0 --3,164.2,-82.3,0 --3,163.3,-81.9,0 --3,162.4,-81.4,0 --3,161.5,-81,0 --3,160.6,-80.5,0 --3,159.7,-80.1,0 --3,158.8,-79.6,0 --3,157.9,-79.1,0 --3,157,-78.7,0 --3,156.1,-78.2,0 --3,155.2,-77.8,0 --3,154.3,-77.3,0 --3,153.4,-76.9,0 --3,152.5,-76.4,0 --3,151.6,-76,0 --3,150.7,-75.5,0 --3,149.8,-75.1,0 --3,148.9,-74.6,0 --3,148,-74.2,0 --3,147.1,-73.7,0 --3,146.2,-73.3,0 --3,145.3,-72.8,0 --3,144.4,-72.4,0 --3,143.5,-71.9,0 --3,142.6,-71.5,0 --3,141.7,-71,0 --3,140.8,-70.6,0 --3,139.8,-70.1,0 --3,138.9,-69.6,0 --3,138,-69.2,0 --3,137.1,-68.7,0 --3,136.2,-68.3,0 --3,135.3,-67.8,0 --3,134.4,-67.4,0 --3,133.5,-66.9,0 --3,132.6,-66.5,0 --3,131.7,-66,0 --3,130.8,-65.6,0 --3,129.9,-65.1,0 --3,129,-64.7,0 --3,128.1,-64.2,0 --3,127.2,-63.8,0 --3,126.3,-63.3,0 --3,125.4,-62.9,0 --3,124.5,-62.4,0 --3,123.6,-62,0 --3,122.7,-61.5,0 --3,121.8,-61.1,0 --3,120.9,-60.6,0 --3,120,-60.2,0 --3,119.1,-59.7,0 --3,118.2,-59.2,0 --3,117.3,-58.8,0 --3,116.4,-58.3,0 --3,115.5,-57.9,0 --3,114.6,-57.4,0 --3,113.7,-57,0 --3,112.8,-56.5,0 --3,111.9,-56.1,0 --3,111,-55.6,0 --3,110.1,-55.2,0 --3,109.2,-54.7,0 --3,108.3,-54.3,0 --3,107.4,-53.8,0 --3,106.5,-53.4,0 --3,105.6,-52.9,0 --3,104.7,-52.5,0 --3,103.8,-52,0 --3,102.9,-51.6,0 --3,102,-51.1,0 --3,101.1,-50.7,0 --3,100.2,-50.2,0 --3,99.2,-49.7,0 --3,98.3,-49.3,0 --3,97.4,-48.8,0 --3,96.5,-48.4,0 --3,95.6,-47.9,0 --3,94.7,-47.5,0 --3,93.8,-47,0 --3,92.9,-46.6,0 --3,92,-46.1,0 --3,91.1,-45.7,0 --3,90.2,-45.2,0 --3,89.3,-44.8,90 --3,88.4,-44.3,89.1 --3,87.5,-43.9,88.2 --3,86.6,-43.4,87.3 --3,85.7,-43,86.4 --3,84.8,-42.5,85.5 --3,83.9,-42.1,84.5 --3,83,-41.6,83.6 --3,82.1,-41.2,82.7 --3,81.2,-40.7,81.8 --3,80.3,-40.3,80.9 --3,79.4,-39.8,80 --3,78.5,-39.3,79.1 --3,77.6,-38.9,78.2 --3,76.7,-38.4,77.3 --3,75.8,-38,76.4 --3,74.9,-37.5,75.5 --3,74,-37.1,74.5 --3,73.1,-36.6,73.6 --3,72.2,-36.2,72.7 --3,71.3,-35.7,71.8 --3,70.4,-35.3,70.9 --3,69.5,-34.8,70 --3,68.6,-34.4,69.1 --3,67.7,-33.9,68.2 --3,66.8,-33.5,67.3 --3,65.9,-33,66.4 --3,65,-32.6,65.5 --3,64.1,-32.1,64.5 --3,63.2,-31.7,63.6 --3,62.3,-31.2,62.7 --3,61.4,-30.8,61.8 --3,60.5,-30.3,60.9 --3,59.5,-29.8,60 --3,58.6,-29.4,59.1 --3,57.7,-28.9,58.2 --3,56.8,-28.5,57.3 --3,55.9,-28,56.4 --3,55,-27.6,55.5 --3,54.1,-27.1,54.5 --3,53.2,-26.7,53.6 --3,52.3,-26.2,52.7 --3,51.4,-25.8,51.8 --3,50.5,-25.3,50.9 --3,49.6,-24.9,50 --3,48.7,-24.4,49.1 --3,47.8,-24,48.2 --3,46.9,-23.5,47.3 --3,46,-23.1,46.4 --3,45.1,-22.6,45.5 --3,44.2,-22.2,44.5 --3,43.3,-21.7,43.6 --3,42.4,-21.3,42.7 --3,41.5,-20.8,41.8 --3,40.6,-20.4,40.9 --3,39.7,-19.9,40 --3,38.8,-19.4,39.1 --3,37.9,-19,38.2 --3,37,-18.5,37.3 --3,36.1,-18.1,36.4 --3,35.2,-17.6,35.5 --3,34.3,-17.2,34.5 --3,33.4,-16.7,33.6 --3,32.5,-16.3,32.7 --3,31.6,-15.8,31.8 --3,30.7,-15.4,30.9 --3,29.8,-14.9,30 --3,28.9,-14.5,29.1 --3,28,-14,28.2 --3,27.1,-13.6,27.3 --3,26.2,-13.1,26.4 --3,25.3,-12.7,25.5 --3,24.4,-12.2,24.5 --3,23.5,-11.8,23.6 --3,22.6,-11.3,22.7 --3,21.7,-10.9,21.8 --3,20.8,-10.4,20.9 --3,19.8,-9.9,20 --3,18.9,-9.5,19.1 --3,18,-9,18.2 --3,17.1,-8.6,17.3 --3,16.2,-8.1,16.4 --3,15.3,-7.7,15.5 --3,14.4,-7.2,14.5 --3,13.5,-6.8,13.6 --3,12.6,-6.3,12.7 --3,11.7,-5.9,11.8 --3,10.8,-5.4,10.9 --3,9.9,-5,10 --3,9,-4.5,9.1 --3,8.1,-4.1,8.2 --3,7.2,-3.6,7.3 --3,6.3,-3.2,6.4 --3,5.4,-2.7,5.5 --3,4.5,-2.3,4.5 --3,3.6,-1.8,3.6 --3,2.7,-1.4,2.7 --3,1.8,-0.9,1.8 --3,0.9,-0.5,0.9 --3,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -0.9,0,0,0.3 -0.9,0,0,0.3 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.8,0,0,0.5 -0.8,0,0,0.5 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.5,0,0,0.8 -0.5,0,0,0.8 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.3,0,0,0.9 -0.3,0,0,0.9 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.1,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.2,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,1 -0.3,0,0,0.9 -0.3,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.4,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.9 -0.5,0,0,0.8 -0.5,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.6,0,0,0.8 -0.7,0,0,0.8 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.7,0,0,0.7 -0.8,0,0,0.7 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.6 -0.8,0,0,0.5 -0.8,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.5 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.4 -0.9,0,0,0.3 -0.9,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.3 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.2 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0.1 -1,0,0,0 -1,0,0,0 -1,0,0,0 -1,0,0,0 --3,0,0,0 --3,0.9,-0.5,0.9 --3,1.8,-0.9,1.8 --3,2.7,-1.4,2.7 --3,3.6,-1.8,3.6 --3,4.5,-2.3,4.5 --3,5.4,-2.7,5.5 --3,6.3,-3.2,6.4 --3,7.2,-3.6,7.3 --3,8.1,-4.1,8.2 --3,9,-4.5,9.1 --3,9.9,-5,10 --3,10.8,-5.4,10.9 --3,11.7,-5.9,11.8 --3,12.6,-6.3,12.7 --3,13.5,-6.8,13.6 --3,14.4,-7.2,14.5 --3,15.3,-7.7,15.5 --3,16.2,-8.1,16.4 --3,17.1,-8.6,17.3 --3,18,-9,18.2 --3,18.9,-9.5,19.1 --3,19.8,-9.9,20 --3,20.8,-10.4,20.9 --3,21.7,-10.9,21.8 --3,22.6,-11.3,22.7 --3,23.5,-11.8,23.6 --3,24.4,-12.2,24.5 --3,25.3,-12.7,25.5 --3,26.2,-13.1,26.4 --3,27.1,-13.6,27.3 --3,28,-14,28.2 --3,28.9,-14.5,29.1 --3,29.8,-14.9,30 --3,30.7,-15.4,30.9 --3,31.6,-15.8,31.8 --3,32.5,-16.3,32.7 --3,33.4,-16.7,33.6 --3,34.3,-17.2,34.5 --3,35.2,-17.6,35.5 --3,36.1,-18.1,36.4 --3,37,-18.5,37.3 --3,37.9,-19,38.2 --3,38.8,-19.4,39.1 --3,39.7,-19.9,40 --3,40.6,-20.4,40.9 --3,41.5,-20.8,41.8 --3,42.4,-21.3,42.7 --3,43.3,-21.7,43.6 --3,44.2,-22.2,44.5 --3,45.1,-22.6,45.5 --3,46,-23.1,46.4 --3,46.9,-23.5,47.3 --3,47.8,-24,48.2 --3,48.7,-24.4,49.1 --3,49.6,-24.9,50 --3,50.5,-25.3,50.9 --3,51.4,-25.8,51.8 --3,52.3,-26.2,52.7 --3,53.2,-26.7,53.6 --3,54.1,-27.1,54.5 --3,55,-27.6,55.5 --3,55.9,-28,56.4 --3,56.8,-28.5,57.3 --3,57.7,-28.9,58.2 --3,58.6,-29.4,59.1 --3,59.5,-29.8,60 --3,60.5,-30.3,60.9 --3,61.4,-30.8,61.8 --3,62.3,-31.2,62.7 --3,63.2,-31.7,63.6 --3,64.1,-32.1,64.5 --3,65,-32.6,65.5 --3,65.9,-33,66.4 --3,66.8,-33.5,67.3 --3,67.7,-33.9,68.2 --3,68.6,-34.4,69.1 --3,69.5,-34.8,70 --3,70.4,-35.3,70.9 --3,71.3,-35.7,71.8 --3,72.2,-36.2,72.7 --3,73.1,-36.6,73.6 --3,74,-37.1,74.5 --3,74.9,-37.5,75.5 --3,75.8,-38,76.4 --3,76.7,-38.4,77.3 --3,77.6,-38.9,78.2 --3,78.5,-39.3,79.1 --3,79.4,-39.8,80 --3,80.3,-40.3,80.9 --3,81.2,-40.7,81.8 --3,82.1,-41.2,82.7 --3,83,-41.6,83.6 --3,83.9,-42.1,84.5 --3,84.8,-42.5,85.5 --3,85.7,-43,86.4 --3,86.6,-43.4,87.3 --3,87.5,-43.9,88.2 --3,88.4,-44.3,89.1 --3,89.3,-44.8,90 --3,90.2,-45.2,0 --3,91.1,-45.7,0 --3,92,-46.1,0 --3,92.9,-46.6,0 --3,93.8,-47,0 --3,94.7,-47.5,0 --3,95.6,-47.9,0 --3,96.5,-48.4,0 --3,97.4,-48.8,0 --3,98.3,-49.3,0 --3,99.2,-49.7,0 --3,100.2,-50.2,0 --3,101.1,-50.7,0 --3,102,-51.1,0 --3,102.9,-51.6,0 --3,103.8,-52,0 --3,104.7,-52.5,0 --3,105.6,-52.9,0 --3,106.5,-53.4,0 --3,107.4,-53.8,0 --3,108.3,-54.3,0 --3,109.2,-54.7,0 --3,110.1,-55.2,0 --3,111,-55.6,0 --3,111.9,-56.1,0 --3,112.8,-56.5,0 --3,113.7,-57,0 --3,114.6,-57.4,0 --3,115.5,-57.9,0 --3,116.4,-58.3,0 --3,117.3,-58.8,0 --3,118.2,-59.2,0 --3,119.1,-59.7,0 --3,120,-60.2,0 --3,120.9,-60.6,0 --3,121.8,-61.1,0 --3,122.7,-61.5,0 --3,123.6,-62,0 --3,124.5,-62.4,0 --3,125.4,-62.9,0 --3,126.3,-63.3,0 --3,127.2,-63.8,0 --3,128.1,-64.2,0 --3,129,-64.7,0 --3,129.9,-65.1,0 --3,130.8,-65.6,0 --3,131.7,-66,0 --3,132.6,-66.5,0 --3,133.5,-66.9,0 --3,134.4,-67.4,0 --3,135.3,-67.8,0 --3,136.2,-68.3,0 --3,137.1,-68.7,0 --3,138,-69.2,0 --3,138.9,-69.6,0 --3,139.8,-70.1,0 --3,140.8,-70.6,0 --3,141.7,-71,0 --3,142.6,-71.5,0 --3,143.5,-71.9,0 --3,144.4,-72.4,0 --3,145.3,-72.8,0 --3,146.2,-73.3,0 --3,147.1,-73.7,0 --3,148,-74.2,0 --3,148.9,-74.6,0 --3,149.8,-75.1,0 --3,150.7,-75.5,0 --3,151.6,-76,0 --3,152.5,-76.4,0 --3,153.4,-76.9,0 --3,154.3,-77.3,0 --3,155.2,-77.8,0 --3,156.1,-78.2,0 --3,157,-78.7,0 --3,157.9,-79.1,0 --3,158.8,-79.6,0 --3,159.7,-80.1,0 --3,160.6,-80.5,0 --3,161.5,-81,0 --3,162.4,-81.4,0 --3,163.3,-81.9,0 --3,164.2,-82.3,0 --3,165.1,-82.8,0 --3,166,-83.2,0 --3,166.9,-83.7,0 --3,167.8,-84.1,0 --3,168.7,-84.6,0 --3,169.6,-85,0 --3,170.5,-85.5,0 --3,171.4,-85.9,0 --3,172.3,-86.4,0 --3,173.2,-86.8,0 --3,174.1,-87.3,0 --3,175,-87.7,0 --3,175.9,-88.2,0 --3,176.8,-88.6,0 --3,177.7,-89.1,0 --3,178.6,-89.5,0 --3,179.5,-90,0 --3,180.5,0,0 --3,181.4,0,0 --3,182.3,0,0 --3,183.2,0,0 --3,184.1,0,0 --3,185,0,0 --3,185.9,0,0 --3,186.8,0,0 --3,187.7,0,0 --3,188.6,0,0 --3,189.5,0,0 --3,190.4,0,0 --3,191.3,0,0 --3,192.2,0,0 --3,193.1,0,0 --3,194,0,0 --3,194.9,0,0 --3,195.8,0,0 --3,196.7,0,0 --3,197.6,0,0 --3,198.5,0,0 --3,199.4,0,0 --3,200.3,0,0 --3,201.2,0,0 --3,202.1,0,0 --3,203,0,0 --3,203.9,0,0 --3,204.8,0,0 --3,205.7,0,0 --3,206.6,0,0 --3,207.5,0,0 --3,208.4,0,0 --3,209.3,0,0 --3,210.2,0,0 --3,211.1,0,0 --3,212,0,0 --3,212.9,0,0 --3,213.8,0,0 --3,214.7,0,0 --3,215.6,0,0 --3,216.5,0,0 --3,217.4,0,0 --3,218.3,0,0 --3,219.2,0,0 --3,220.2,0,0 --3,221.1,0,0 --3,222,0,0 --3,222.9,0,0 --3,223.8,0,0 --3,224.7,0,0 --3,225.6,0,0 --3,226.5,0,0 --3,227.4,0,0 --3,228.3,0,0 --3,229.2,0,0 --3,230.1,0,0 --3,231,0,0 --3,231.9,0,0 --3,232.8,0,0 --3,233.7,0,0 --3,234.6,0,0 --3,235.5,0,0 --3,236.4,0,0 --3,237.3,0,0 --3,238.2,0,0 --3,239.1,0,0 --3,240,0,0 --3,240.9,0,0 --3,241.8,0,0 --3,242.7,0,0 --3,243.6,0,0 --3,244.5,0,0 --3,245.4,0,0 --3,246.3,0,0 --3,247.2,0,0 --3,248.1,0,0 --3,249,0,0 --3,249.9,0,0 --3,250.8,0,0 --3,251.7,0,0 --3,252.6,0,0 --3,253.5,0,0 --3,254.4,0,0 --3,255.3,0,0 --3,256.2,0,0 --3,257.1,0,0 --3,258,0,0 --3,258.9,0,0 --3,259.8,0,0 --3,260.8,0,0 --3,261.7,0,0 --3,262.6,0,0 --3,263.5,0,0 --3,264.4,0,0 --3,265.3,0,0 --3,266.2,0,0 --3,267.1,0,0 --3,268,0,0 --3,268.9,0,0 --3,269.8,0,0 --3,270.7,0,0 --3,271.6,0,0 --3,272.5,0,0 --3,273.4,0,0 --3,274.3,0,0 --3,275.2,0,0 --3,276.1,0,0 --3,277,0,0 --3,277.9,0,0 --3,278.8,0,0 --3,279.7,0,0 --3,280.6,0,0 --3,281.5,0,0 --3,282.4,0,0 --3,283.3,0,0 --3,284.2,0,0 --3,285.1,0,0 --3,286,0,0 --3,286.9,0,0 --3,287.8,0,0 --3,288.7,0,0 --3,289.6,0,0 --3,290.5,0,0 --3,291.4,0,0 --3,292.3,0,0 --3,293.2,0,0 --3,294.1,0,0 --3,295,0,0 --3,295.9,0,0 --3,296.8,0,0 --3,297.7,0,0 --3,298.6,0,0 --3,299.5,0,0 --3,300.5,0,0 --3,301.4,0,0 --3,302.3,0,0 --3,303.2,0,0 --3,304.1,0,0 --3,305,0,0 --3,305.9,0,0 --3,306.8,0,0 --3,307.7,0,0 --3,308.6,0,0 --3,309.5,0,0 --3,310.4,0,0 --3,311.3,0,0 --3,312.2,0,0 --3,313.1,0,0 --3,314,0,0 --3,314.9,0,0 --3,315.8,0,0 --3,316.7,0,0 --3,317.6,0,0 --3,318.5,0,0 --3,319.4,0,0 --3,320.3,0,0 --3,321.2,0,0 --3,322.1,0,0 --3,323,0,0 --3,323.9,0,0 --3,324.8,0,0 --3,325.7,0,0 --3,326.6,0,0 --3,327.5,0,0 --3,328.4,0,0 --3,329.3,0,0 --3,330.2,0,0 --3,331.1,0,0 --3,332,0,0 --3,332.9,0,0 --3,333.8,0,0 --3,334.7,0,0 --3,335.6,0,0 --3,336.5,0,0 --3,337.4,0,0 --3,338.3,0,0 --3,339.2,0,0 --3,340.2,0,0 --3,341.1,0,0 --3,342,0,0 --3,342.9,0,0 --3,343.8,0,0 --3,344.7,0,0 --3,345.6,0,0 --3,346.5,0,0 --3,347.4,0,0 --3,348.3,0,0 --3,349.2,0,0 --3,350.1,0,0 --3,351,0,0 --3,351.9,0,0 --3,352.8,0,0 --3,353.7,0,0 --3,354.6,0,0 --3,355.5,0,0 --3,356.4,0,0 --3,357.3,0,0 --3,358.2,0,0 --3,359.1,0,0 --3,360,0,0 diff --git a/tests/conftest.py b/tests/conftest.py index 5d3632a762..721933f47d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -128,6 +128,12 @@ def pytest_addoption(parser): help="If specified, use given binary as DUT decoder.", ) + parser.addoption( + "--dut_postrend_path", + action="store", + help="If specified, use given binary as DUT ISAR post-renderer.", + ) + parser.addoption( "--ref_encoder_path", action="store", @@ -140,6 +146,12 @@ def pytest_addoption(parser): help="If specified, use given binary as REF decoder.", ) + parser.addoption( + "--ref_postrend_path", + action="store", + help="If specified, use given binary as REF ISAR post-renderer.", + ) + parser.addoption( "--test_vector_path", action="store", @@ -1316,3 +1328,216 @@ def get_format_from_enc_opts(enc_opts: str) -> str: format = IVAS_ENC_FORMATS[enc_format_str] return format + + +@pytest.fixture(scope="session") +def dut_postrend_path(request) -> Optional[str]: + """ + Return path of DUT postrend binary. + """ + if request.config.option.dut_postrend_path: + return request.config.option.dut_postrend_path + + if request.config.option.update_ref == "1": + return None + + here = Path(__file__).parent.resolve() + system = platform.system() + + if system == "Windows": + path = here.joinpath("../ISAR_post_rend.exe") + elif system in ["Darwin", "Linux"]: + path = here.joinpath("../ISAR_post_rend") + else: + raise ValueError(f'Wrong system "{system}"!') + + path = str(path.resolve()) + + if not os.path.isfile(path): + raise FileNotFoundError(f"DUT postrend binary {path} not found!\n!") + + return path + + +class PostRendFrontend: + def __init__(self, path, postrend_type, timeout=None, fr=20) -> None: + self._path = Path(path).absolute() + self._type = postrend_type + self.returncode = None + self.stdout = None + self.stderr = None + self.timeout = timeout + self.fr = fr + + def run( + self, + output_sampling_rate: int, + input_path: Path, + output_path: Path, + head_trajectory: Path, + metadata_input_path: Optional[Path] = None, + quiet_mode: Optional[bool] = True, + bfi_file: Optional[Path] = None, + add_option_list: Optional[list] = None, + run_dir: Optional[Path] = None, + ) -> None: + command = [str(self._path)] + + # add optional parameters + if quiet_mode: + command.extend(["-q"]) + + if bfi_file is not None: + command.extend(["-prbfi", str(bfi_file)]) + + if add_option_list is not None: + command.extend(add_option_list) + + if metadata_input_path is not None: + # If we have metadata input file, then input format must be PCM + command.extend(["-if", "BINAURAL_SPLIT_PCM"]) + command.extend(["-im", str(metadata_input_path)]) + else: + command.extend(["-if", "BINAURAL_SPLIT_CODED"]) + + command.extend( + [ + "-fr", + str(self.fr), + "-fs", + str(output_sampling_rate), + "-i", + str(input_path), + "-o", + str(output_path), + "-T", + str(head_trajectory), + ] + ) + + cmd_str = textwrap.indent(" ".join(command), prefix="\t") + log_dbg_msg(f"{self._type} post-rend command:\n{cmd_str}") + + try: + with tempfile.TemporaryDirectory() as tmp_dir: + if run_dir is None: + cwd = Path(tmp_dir).absolute() + else: + cwd = Path(run_dir).absolute() + result = run( + command, + capture_output=True, + check=False, + timeout=self.timeout, + cwd=cwd, + ) + except TimeoutExpired: + pytest.fail(f"{self._type} post-rend run timed out after {self.timeout}s.") + + self.returncode = result.returncode + self.stderr = result.stderr.decode("ascii") + self.stdout = result.stdout.decode("ascii") + if self.stdout: + stdout_str = textwrap.indent(self.stdout, prefix="\t") + log_dbg_msg(f"{self._type} post-rend stdout:\n{stdout_str}") + if self.stderr: + stderr_str = textwrap.indent(self.stderr, prefix="\t") + log_dbg_msg(f"{self._type} post-rend stderr:\n{stderr_str}") + if self.returncode: + pytest.fail( + f"{self._type} post-rend terminated with a non-0 return code: {self.returncode}" + ) + if self.stderr and "UndefinedBehaviorSanitizer" in self.stderr: + pytest.fail("Undefined Behaviour runtime error encountered") + + def _check_run(self): + if self.returncode is not None: + if self.returncode: + pytest.fail( + f"{self._type} post-rend terminated with a non-0 return code: {self.returncode}" + ) + else: + logger.warning("%s post-rend was set-up, but not run", self._type) + # next assert is not OK since stderr contains messages even when decoding was successful + # assert not self.stderr, self._type + " decoder stderr is not empty" + + +@pytest.fixture(scope="function") +def dut_postrend_frontend(dut_postrend_path, request) -> Optional[PostRendFrontend]: + """ + Return a :class:`conftest.PostRendFrontend` instance as DUT for the test session. + """ + postrend = None + + if dut_postrend_path and request.node.funcargs["out_format"] in [ + "BINAURAL_SPLIT_CODED", + "BINAURAL_SPLIT_PCM", + ]: + timeout = request.config.getoption("--testcase_timeout") + postrend = PostRendFrontend( + dut_postrend_path, + "DUT", + timeout=timeout, + fr=request.config.option.dut_fr, + ) + + yield postrend + + # Fixture teardown + if postrend is not None: + postrend._check_run() + + +@pytest.fixture(scope="session") +def ref_postrend_path(request) -> Optional[str]: + """ + Return path of DUT postrend binary. + """ + if request.config.option.ref_postrend_path: + return request.config.option.ref_postrend_path + + if request.config.option.update_ref == "0": + return None + + here = Path(__file__).parent.resolve() + system = platform.system() + + if system == "Windows": + path = here.joinpath("../ISAR_post_rend_ref.exe") + elif system in ["Darwin", "Linux"]: + path = here.joinpath("../ISAR_post_rend_ref") + else: + raise ValueError(f'Wrong system "{system}"!') + + path = str(path.resolve()) + + if not os.path.isfile(path): + raise FileNotFoundError(f"REF postrend binary {path} not found!\n!") + + return path + + +@pytest.fixture(scope="function") +def ref_postrend_frontend(ref_postrend_path, request) -> Optional[PostRendFrontend]: + """ + Return a :class:`conftest.PostRendFrontend` instance as REF for the test session. + """ + postrend = None + + if ref_postrend_path and request.node.funcargs["out_format"] in [ + "BINAURAL_SPLIT_CODED", + "BINAURAL_SPLIT_PCM", + ]: + timeout = request.config.getoption("--testcase_timeout") + postrend = PostRendFrontend( + ref_postrend_path, + "REF", + timeout=timeout, + fr=request.config.option.dut_fr, + ) + + yield postrend + + # Fixture teardown + if postrend is not None: + postrend._check_run() diff --git a/tests/split_rendering/constants.py b/tests/split_rendering/constants.py index 5869ec3b78..8b3b53f86b 100644 --- a/tests/split_rendering/constants.py +++ b/tests/split_rendering/constants.py @@ -104,7 +104,7 @@ RENDERER_CONFIGS_TO_TEST_PLC = RENDERER_CONFIGS_FASTCONV_RENDERER + RENDERER_CON """ Trajectories """ SPLIT_REND_HR_TRAJECTORIES_TO_TEST = [ - "rotate_euler_quaternion_5s", + "rotate_euler_quaternion_30s", ] """ IVAS specific constants """ diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index a881a7ad23..f08d08cd4a 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -32,8 +32,18 @@ import pytest -from tests.split_rendering.utils import * +from tempfile import TemporaryDirectory +from pathlib import Path +import filecmp +from tests.split_rendering.utils import * +from tests.split_rendering.constants import SCRIPTS_DIR, TESTV_DIR +from tests.test_be_for_jbm_neutral_dly_profile import ( + INPUT_FILES, + get_options_cod, +) +from split_rendering.isar_bstool import IsarBitstream +from pyaudio3dtools import audioarray, audiofile """ Ambisonics """ @@ -585,3 +595,109 @@ def test_framing_combinations_full_chain_split( get_odg=get_odg, get_odg_bin=get_odg_bin, ) + + +IN_FORMATS = [ + "MC_5_1", + "ISM4", + "FOA", + "MASA2TC", + "OSBA_ISM3_HOA3", + "OMASA_ISM4", +] + +DELAY_PROFILES = ["dly_error_profile_0.dat", "dly_error_profile_5.dat"] + + +# Compares PCM output and tracefile from a VoIP BINAURAL_SPLIT_PCM chain with equivalent BINAURAL +# chain to ensure time-scaling and other JBM operations are the BE between the two. +@pytest.mark.parametrize("in_format", IN_FORMATS) +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) +def test_be_splitrend_vs_binaural( + in_format, + delay_profile, + dut_encoder_frontend, + dut_decoder_frontend, + bitrate=128000, +): + with TemporaryDirectory() as tmp_dir: + tmp_dir = Path(tmp_dir) + + sampling_rate_khz = 48 + delay_profile_path = SCRIPTS_DIR / "dly_error_profiles" / delay_profile + delay_profile_id = int(delay_profile[-5]) + + # run encoder + bitstream_file = (tmp_dir / f"{in_format}-dly{delay_profile_id}.192").absolute() + dtx = False + wav_in = TESTV_DIR / INPUT_FILES[in_format] + dut_encoder_frontend.run( + bitrate, + sampling_rate_khz, + wav_in, + bitstream_file, + add_option_list=get_options_cod(in_format, dtx), + run_dir=tmp_dir, + ) + + def run_decoder(out_format): + options = [] + + # Head trajectory must be static due to the slight time shift between audio outputs of BINAURAL/SPLIT_PCM + head_traj = Path(SCRIPTS_DIR / "trajectories/const000.csv") + options.extend(["-T", str(head_traj)]) + + wav_out = ( + tmp_dir + / f"{in_format}-{bitrate}-{out_format}-dly{delay_profile_id}.wav" + ).absolute() + + trace_out = wav_out.with_suffix(".trace") + options.extend(["-Tracefile", str(trace_out)]) + + if out_format == "BINAURAL_SPLIT_PCM": + isar_md_file = wav_out.with_suffix(".isarmd") + options.extend(["-om", str(isar_md_file)]) + else: + isar_md_file = None + + dut_decoder_frontend.run( + out_format, + sampling_rate_khz, + bitstream_file, + wav_out, + netsim_profile=delay_profile_path, + add_option_list=options, + ) + + return wav_out, trace_out, isar_md_file + + wav_out_bin, trace_out_bin, _ = run_decoder("BINAURAL") + wav_out_sr, trace_out_sr, isar_md_out_sr = run_decoder("BINAURAL_SPLIT_PCM") + + # Delay-align audio + assert isar_md_out_sr is not None + sr_delay_samples = IsarBitstream(isar_md_out_sr).delay_samples + audio_sr, _ = audiofile.readfile(str(wav_out_sr)) + audio_bin, _ = audiofile.readfile(str(wav_out_bin)) + audio_sr = audio_sr[sr_delay_samples:] + audio_bin = audio_bin[:-sr_delay_samples] + + # Ensure audio and tracefiles are BE + audio_cmp_result = audioarray.compare( + audio_bin, audio_sr, fs=sampling_rate_khz * 1000, per_frame=False + ) + tracefiles_equal = filecmp.cmp(trace_out_bin, trace_out_sr) + failed = not audio_cmp_result["bitexact"] or not tracefiles_equal + if failed: + message = [] + if not audio_cmp_result["bitexact"]: + message.append( + "Difference found between delay-aligned BINAURAL audio and BINAURAL_SPLIT_PCM audio! " + f"Max abs diff: {audio_cmp_result['max_abs_diff']}" + ) + if not tracefiles_equal: + message.append( + "Difference found between BINAURAL tracefile and BINAURAL_SPLIT_PCM tracefile!" + ) + pytest.fail("; ".join(message)) diff --git a/tests/test_be_for_jbm_neutral_dly_profile.py b/tests/test_be_for_jbm_neutral_dly_profile.py index ec67ab22a3..0e2b2420f1 100644 --- a/tests/test_be_for_jbm_neutral_dly_profile.py +++ b/tests/test_be_for_jbm_neutral_dly_profile.py @@ -4,12 +4,15 @@ import sys import re import numpy as np from tempfile import TemporaryDirectory +from pathlib import Path from .constants import TESTV_DIR, SCRIPTS_DIR +from .split_rendering.constants import HR_TRAJECTORY_DIR sys.path.append(str(SCRIPTS_DIR)) from pyaudio3dtools import audiofile, audioarray +from split_rendering.isar_bstool import IsarBitstream DTX_ON = "DTX_ON" DTX_OFF = "DTX_OFF" @@ -76,12 +79,29 @@ TESTCASES_NO_DTX = [ ["OSBA_ISM3_HOA3", 128000, "EXT"], ["OSBA_ISM2_HOA3", 96000, "5_1"], ["OSBA_ISM1_HOA2", 32000, "mono"], + # BINAURAL_SPLIT_PCM as output + ["ISM4", 128000, "BINAURAL_SPLIT_PCM"], + ["MC_5_1", 128000, "BINAURAL_SPLIT_PCM"], + ["FOA", 128000, "BINAURAL_SPLIT_PCM"], + ["OMASA_ISM2", 128000, "BINAURAL_SPLIT_PCM"], + # BINAURAL_SPLIT_CODED with LC3plus + ["MC_5_1", 128000, "BINAURAL_SPLIT_CODED"], + ["ISM4", 128000, "BINAURAL_SPLIT_CODED"], + # BINAURAL_SPLIT_CODED with LCLD + ["HOA3", 128000, "BINAURAL_SPLIT_CODED"], + ["OSBA_ISM4_FOA", 128000, "BINAURAL_SPLIT_CODED"], + ] DLY_PROFILE = SCRIPTS_DIR.joinpath("dly_error_profiles/dly_error_profile_0.dat") JBM_NEUTRAL_DELAY_MS = 60 -def get_options(in_format, dtx): +def is_split_rend(format) -> bool: + return format in ["BINAURAL_SPLIT_CODED", "BINAURAL_SPLIT_PCM"] + + +def get_options_cod(in_format, dtx): + # NOTE: this function is shared with another test in tests/split_rendering/test_split_rendering.py options = list() if dtx: @@ -124,6 +144,32 @@ def get_options(in_format, dtx): return options +def get_options_dec( + output_format: str, + output_file: Path, + is_voip: bool, +): + options = [] + + if output_format == "BINAURAL_SPLIT_PCM": + options.extend(["-om", str(output_file.with_suffix(".isarmd"))]) + + if is_split_rend(output_format): + # In VoIP configs account for VoIP delay by using the appropriately delayed head rotation file + options.extend( + [ + "-T", + str( + HR_TRAJECTORY_DIR + / f"rotate_euler_quaternion_30s_delayed{'_voip' if is_voip else ''}.csv" + ), + ] + ) + + return options + + +# NOTE: this list is shared with another test in tests/split_rendering/test_split_rendering.py INPUT_FILES = { "stereo": "stvST48n.wav", "ISM1": "stv1ISM48s.wav", @@ -158,6 +204,33 @@ OUTPUT_FOLDER_IF_KEEP_FILES_NEUTRAL = OUTPUT_FOLDER_IF_KEEP_FILES.joinpath( "neutral-profile" ) +def compare_audio(non_voip_output, voip_output, sampling_rate_khz): + # compare no-jbm and jbm output + x, _ = audiofile.readfile(non_voip_output) + x_jbm, _ = audiofile.readfile(voip_output) + + # strip jbm delay + # TODO: this may need to be adapted to handle variable offsets based on outcome of #1122 + cmp_result = audioarray.compare( + x, + x_jbm, + fs=sampling_rate_khz * 1000, + per_frame=False, + test_start_offset_ms=JBM_NEUTRAL_DELAY_MS, + ) + if not cmp_result["bitexact"]: + pytest.fail( + f"Difference between no jbm and zero-delay jbm decoding found! Max abs diff: {cmp_result['max_abs_diff']}" + ) + + +def compare_isar_files(non_voip_isar, voip_isar): + isar_bs = IsarBitstream(non_voip_isar) + isar_bs_voip = IsarBitstream(voip_isar).trim(JBM_NEUTRAL_DELAY_MS / 1000) + if not isar_bs_voip.is_same_as(isar_bs): + pytest.fail( + "Difference between no jbm and zero-delay jbm decoding found! ISAR files differ" + ) @pytest.mark.parametrize( "in_format,bitrate,out_format", TESTCASES_NO_DTX + TESTCASES_WITH_DTX @@ -168,6 +241,7 @@ def test_be_for_jbm_neutral_dly_profile_no_dtx( out_format, dut_encoder_frontend, dut_decoder_frontend, + dut_postrend_frontend, keep_files, ): run_test( @@ -177,6 +251,7 @@ def test_be_for_jbm_neutral_dly_profile_no_dtx( DTX_OFF, dut_encoder_frontend, dut_decoder_frontend, + dut_postrend_frontend, keep_files, ) @@ -188,6 +263,7 @@ def test_be_for_jbm_neutral_dly_profile_with_dtx( out_format, dut_encoder_frontend, dut_decoder_frontend, + dut_postrend_frontend, keep_files, ): run_test( @@ -197,6 +273,7 @@ def test_be_for_jbm_neutral_dly_profile_with_dtx( DTX_ON, dut_encoder_frontend, dut_decoder_frontend, + dut_postrend_frontend, keep_files, ) @@ -208,6 +285,7 @@ def run_test( dtx, dut_encoder_frontend, dut_decoder_frontend, + dut_postrend_frontend, keep_files, ): if keep_files: @@ -216,6 +294,7 @@ def run_test( with TemporaryDirectory() as tmp_dir: tmp_dir = pathlib.Path(tmp_dir) + output_ext = "wav" if out_format != "BINAURAL_SPLIT_CODED" else "isarbs" output_dir_no_jbm = ( OUTPUT_FOLDER_IF_KEEP_FILES_NO_JBM if keep_files else tmp_dir ) @@ -243,7 +322,7 @@ def run_test( input_file = tmp_dir.joinpath(f"{input_file.stem}-plus-noise.wav") audiofile.writefile(input_file, input_signal, fs) - options = get_options(in_format, dtx == DTX_ON) + options = get_options_cod(in_format, dtx == DTX_ON) dut_encoder_frontend.run( bitrate, sampling_rate_khz, @@ -255,33 +334,67 @@ def run_test( # run decoder without network simulation output = output_dir_no_jbm.joinpath( - f"{in_format}-{bitrate}-{out_format}-{dtx}.wav" + f"{in_format}-{bitrate}-{out_format}-{dtx}.{output_ext}" ).absolute() - dut_decoder_frontend.run(out_format, sampling_rate_khz, bitstream_file, output) + non_voip_options = get_options_dec(out_format, output, is_voip=False) + dut_decoder_frontend.run( + out_format, + sampling_rate_khz, + bitstream_file, + output, + add_option_list=non_voip_options, + ) # run decoder with network simulation - output_jbm = output_dir_neutral.joinpath(output.with_suffix(".jbm-0.wav").name) + output_jbm = output_dir_neutral.joinpath(output.with_suffix(f".jbm-0.{output_ext}").name) + voip_options = get_options_dec(out_format, output_jbm, is_voip=True) dut_decoder_frontend.run( out_format, sampling_rate_khz, bitstream_file, output_jbm, netsim_profile=DLY_PROFILE, + add_option_list=voip_options, + ) + + if out_format == "BINAURAL_SPLIT_CODED": + # With `BINAURAL_SPLIT_CODED` the main output is an ISAR bitstream + compare_isar_files(output, output_jbm) + else: + # Otherwise audio output + compare_audio(output, output_jbm, sampling_rate_khz) + + # With `BINAURAL_SPLIT_PCM` there is an additional metadata output file + if out_format == "BINAURAL_SPLIT_PCM": + isar_md_file = Path(non_voip_options[non_voip_options.index("-om") + 1]) + isar_md_file_voip = Path(voip_options[voip_options.index("-om") + 1]) + compare_isar_files(isar_md_file, isar_md_file_voip) + else: + isar_md_file = None + isar_md_file_voip = None + + # We will test ISAR_post_rend below. Only applies to split rendering. + if not is_split_rend(out_format): + return + + # Render non-voip output + postrend_output = output_dir_no_jbm.joinpath(output.with_suffix(".postrend.wav").name) + dut_postrend_frontend.run( + sampling_rate_khz, + output, + postrend_output, + str(HR_TRAJECTORY_DIR / f"rotate_euler_quaternion_30s.csv"), + isar_md_file, ) - # compare no-jbm and jbm output - x, _ = audiofile.readfile(output) - x_jbm, _ = audiofile.readfile(output_jbm) - - # strip jbm delay - cmp_result = audioarray.compare( - x, - x_jbm, - fs=sampling_rate_khz * 1000, - per_frame=False, - test_start_offset_ms=JBM_NEUTRAL_DELAY_MS, + # Render voip output + postrend_output_voip = output_dir_neutral.joinpath(output_jbm.with_suffix(".postrend.wav").name) + dut_postrend_frontend.run( + sampling_rate_khz, + output_jbm, + postrend_output_voip, + str(HR_TRAJECTORY_DIR / f"rotate_euler_quaternion_30s_voip.csv"), + isar_md_file_voip, ) - if not cmp_result["bitexact"]: - pytest.fail( - f"Difference between no jbm and zero-delay jbm decoding found! Max abs diff: {cmp_result['max_abs_diff']}" - ) + + compare_audio(postrend_output, postrend_output_voip, sampling_rate_khz) -- GitLab From 543c4018835716eeaf8f539860bae6ce39f50649 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 22 Apr 2025 16:02:53 +0200 Subject: [PATCH 002/147] Port C changes --- apps/decoder.c | 121 ++++++- apps/isar_post_rend.c | 10 + lib_com/options.h | 2 +- lib_dec/lib_dec.c | 500 ++++++++++++++++++++++++++++- lib_dec/lib_dec.h | 21 ++ lib_isar/isar_prot.h | 15 + lib_isar/isar_splitRend_lcld_enc.c | 5 + lib_isar/isar_splitRendererPre.c | 64 +++- lib_isar/lib_isar_pre_rend.c | 7 +- lib_isar/lib_isar_pre_rend.h | 5 + lib_rend/lib_rend.c | 20 ++ 11 files changed, 751 insertions(+), 19 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 50c8b043e9..f1f205850d 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -171,7 +171,11 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, +#endif + IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, IVAS_DEC_HANDLE hIvasDec, const IVAS_AUDIO_CONFIG OutputConfig, const int32_t output_Fs ); #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); @@ -756,7 +760,11 @@ int main( if ( arg.voipMode ) { - error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, hIvasDec, pcmBuf ); + error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + &splitRendBits, +#endif + hIvasDec, pcmBuf ); } else { @@ -1872,7 +1880,11 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t i = 0; i < numInitialBadFrames; ++i ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( isSplitRend ) +#else if ( *splitRendWriter != NULL ) +#endif { ISAR_SPLIT_REND_BITS_DATA splitRendBitsZero; splitRendBitsZero.bits_buf = NULL; @@ -1890,7 +1902,12 @@ static ivas_error initOnFirstGoodFrame( return error; } } + +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( !isSplitCoded ) +#else else +#endif { if ( *pRemainingDelayNumSamples < *numOutSamples ) @@ -2098,6 +2115,14 @@ static ivas_error decodeG192( return error; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( !isSplitRend ) + { + /* Ensure split rendering output struct is not used when not outputting to a split rendering format */ + splitRendBits = NULL; + } +#endif + if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error ); @@ -2433,7 +2458,11 @@ static ivas_error decodeG192( } /* decode transport channels, do TSM and feed to renderer */ - if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, isSplitRend, splitRendBits ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, +#ifndef FIX_1119_SPLIT_RENDERING_VOIP + isSplitRend, +#endif + splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -2984,6 +3013,9 @@ static ivas_error decodeVoIP( RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, +#endif IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) { @@ -3035,6 +3067,29 @@ static ivas_error decodeVoIP( bool parametersAvailableForEditing = false; uint16_t nSamplesRendered = 0; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + SplitFileReadWrite *splitRendWriter = NULL; + int16_t isSplitRend, isSplitCoded; + + if ( ( error = IVAS_DEC_is_split_rendering_enabled( hIvasDec, &isSplitRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_enabled, code: %d\n", error ); + return error; + } + + if ( !isSplitRend ) + { + /* Ensure split rendering output struct is not used when not outputting to a split rendering format */ + splitRendBits = NULL; + } + + if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error ); + return error; + } +#endif + vec_pos_update = 0; if ( ( error = IVAS_DEC_GetRenderFramesizeMs( hIvasDec, &systemTimeInc_ms ) ) != IVAS_ERR_OK ) { @@ -3325,6 +3380,27 @@ static ivas_error decodeVoIP( /* decode and get samples */ while ( nSamplesRendered < nOutSamples ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( isSplitRend ) + { + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, +#ifdef SUPPORT_JBM_TRACEFILE + writeJbmTraceFileFrameWrapper, + jbmTraceWriter, +#endif + &bitstreamReadDone, + &nSamplesRendered, + ¶metersAvailableForEditing, + systemTime_ms + ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + else + { +#endif #ifdef SUPPORT_JBM_TRACEFILE if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #else @@ -3334,6 +3410,9 @@ static ivas_error decodeVoIP( fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + } +#endif if ( bitstreamReadDone == true ) { @@ -3413,9 +3492,17 @@ static ivas_error decodeVoIP( /* Once good frame decoded, catch up */ if ( decodedGoodFrame ) { +#ifndef FIX_1119_SPLIT_RENDERING_VOIP SplitFileReadWrite *splitRendWriter = NULL; +#endif - if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, NULL, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, + if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + &vec_pos_len, +#else + NULL, +#endif + delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, &splitRendWriter ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in initOnFirstGoodFrame(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -3431,6 +3518,18 @@ static ivas_error decodeVoIP( /* Write current frame */ if ( decodedGoodFrame ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( isSplitRend ) + { + if ( split_rend_write_bitstream_to_file( splitRendWriter, splitRendBits->bits_buf, &splitRendBits->bits_read, &splitRendBits->bits_written ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to write to bitstream file!\n" ); + goto cleanup; + } + } + if ( !isSplitCoded ) + { +#endif if ( delayNumSamples < nOutSamples ) { if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) @@ -3444,6 +3543,9 @@ static ivas_error decodeVoIP( { delayNumSamples -= nOutSamples; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + } +#endif /* Write ISM metadata to external file(s) */ if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) @@ -3602,11 +3704,19 @@ static ivas_error decodeVoIP( *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( afWriter != NULL) + { +#endif if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); goto cleanup; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + } +#endif /*------------------------------------------------------------------------------------------* * Printouts after decoding has finished @@ -3651,6 +3761,9 @@ cleanup: EVS_RTPDUMP_DEPACKER_close( &rtpdumpDepacker ); AudioFileWriter_close( &afWriter ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + split_rend_reader_writer_close( &splitRendWriter ); +#endif JbmOffsetFileWriter_close( &jbmOffsetWriter ); #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriter_close( &jbmTraceWriter ); diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index aa004c4cc3..1ec675f45b 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -1103,6 +1103,16 @@ int main( fprintf( stderr, "\nISAR_POST_REND_FeedSplitBinauralBitstream failed: %s\n", ivas_error_to_string( error ) ); goto cleanup; } + +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + /* Set BFI if frame is empty */ + int16_t frameEmpty = (int16_t) ( bitsBuffer.config.bitsWritten == 0 ); + if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, frameEmpty ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } +#endif } } diff --git a/lib_com/options.h b/lib_com/options.h index dc1b88d11d..c335aaa419 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,8 +159,8 @@ /* only BE switches wrt selection floating point code */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define UNIFIED_DECODING_PATHS_LEFTOVERS /* VA: issue 880: remove leftovers after NONBE_UNIFIED_DECODING_PATHS */ +#define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ae919c2184..781036b82f 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -115,7 +115,11 @@ static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, c static ivas_error evs_dec_main( Decoder_Struct *st_ivas ); static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); -static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, uint8_t *nTransportChannels, const int16_t isSplitRend, ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); +static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, uint8_t *nTransportChannels, +#ifndef FIX_1119_SPLIT_RENDERING_VOIP + const int16_t isSplitRend, +#endif + ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); static ivas_error apa_setup( IVAS_DEC_HANDLE hIvasDec, const bool isInitialized_voip, const uint16_t nTransportChannels ); static PCM_RESOLUTION pcm_type_API_to_internal( const IVAS_DEC_PCM_TYPE pcmType ); static void *pcm_buffer_offset( void *buffer, const IVAS_DEC_PCM_TYPE pcmType, const int32_t offset ); @@ -1115,7 +1119,9 @@ ivas_error IVAS_DEC_ReadFormat( ivas_error IVAS_DEC_GetSamplesDecoder( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifndef FIX_1119_SPLIT_RENDERING_VOIP const int16_t isSplitRend, /* i : split rendering enabled flag */ +#endif ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { @@ -1145,7 +1151,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( * Setup all decoder parts (IVAS decoder, ISAR) *-----------------------------------------------------------------*/ - if ( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, isSplitRend, splitRendBits ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, +#ifndef FIX_1119_SPLIT_RENDERING_VOIP + isSplitRend, +#endif + splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -1836,6 +1846,203 @@ ivas_error IVAS_DEC_GetSamplesRenderer( } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +static int16_t isar_get_frame_size( + Decoder_Struct* st_ivas +) +{ + int32_t output_Fs; + int16_t nSamplesPerChannel; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + if ( st_ivas->hDecoderConfig->render_framesize != IVAS_RENDER_FRAMESIZE_20MS && + ( st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE || + st_ivas->hRenderConfig->split_rend_config.dof == 0 ) ) + { + nSamplesPerChannel = (int16_t) ( output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); + nSamplesPerChannel *= (int16_t) st_ivas->hDecoderConfig->render_framesize; + } + else + { + nSamplesPerChannel = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + } + + return nSamplesPerChannel; +} + +static ivas_error isar_render_poses( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ + float** p_head_pose_buf, + float *p_Cldfb_RealBuffer_Binaural[][CLDFB_NO_COL_MAX], + float *p_Cldfb_ImagBuffer_Binaural[][CLDFB_NO_COL_MAX], + int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ +) +{ + Decoder_Struct *st_ivas; + float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; + int16_t i, j; + ivas_error error; + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; + int16_t numPoses; + int16_t slots_rendered, slots_rendered_new; + + error = IVAS_ERR_OK; + st_ivas = hIvasDec->st_ivas; + *needNewFrame = false; + hSplitBinRend = st_ivas->hSplitBinRend; + + numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; + + /* init flush buffer for rate switch if not already initizalized */ + if ( hIvasDec->flushbuffer == NULL ) + { + hIvasDec->flushbuffer = (void *) malloc( numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float ) ); + if ( hIvasDec->flushbuffer == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate flush buffer" ); + } + hIvasDec->pcmType = IVAS_DEC_PCM_FLOAT; + set_zero( (float *) hIvasDec->flushbuffer, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); + } + + if ( st_ivas->hTcBuffer == NULL || hIvasDec->hasBeenFedFrame ) + { + slots_rendered = 0; + } + else + { + /* this is needed for OMASA-DISC, because the td-rend granularity is 240 samples at 48kHz, leading to wrong slot count. */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + slots_rendered = st_ivas->hTcBuffer->n_samples_rendered / NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + } + else + { + slots_rendered = st_ivas->hTcBuffer->n_samples_rendered / st_ivas->hTcBuffer->n_samples_granularity; + } + } + + /* render */ + if ( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesAsked, IVAS_DEC_PCM_FLOAT, pcmBuf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) + { + return error; + } + + // TODO: 1119 - Check if this early return can be simplified. ATM we early return through two stack frames. + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } + + /* change buffer layout */ + for ( i = 0; i < *nOutSamples; ++i ) + { + for ( j = 0; j < BINAURAL_CHANNELS * numPoses; ++j ) + { + p_head_pose_buf[j][i] = pcmBuf[i * BINAURAL_CHANNELS * numPoses + j]; + } + } + + if ( st_ivas->hTcBuffer == NULL ) + { + slots_rendered_new = 0; + } + else + { + /* this is needed for OMASA-DISC, because the td-rend granularity is 240 samples at 48kHz, leading to wrong slot count. */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + slots_rendered_new = st_ivas->hTcBuffer->n_samples_rendered / NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + } + else + { + slots_rendered_new = st_ivas->hTcBuffer->n_samples_rendered / st_ivas->hTcBuffer->n_samples_granularity; + } + } + + for ( i = 0; i < BINAURAL_CHANNELS * numPoses; ++i ) + { + for ( j = slots_rendered; j < slots_rendered_new; ++j ) + { + mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[i][j], p_Cldfb_RealBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); + mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[i][j], p_Cldfb_ImagBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); + } + } + + return error; +} + +static ivas_error isar_generate_metadata_and_bitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + float** p_head_pose_buf, + float *p_Cldfb_RealBuffer_Binaural[][CLDFB_NO_COL_MAX], + float *p_Cldfb_ImagBuffer_Binaural[][CLDFB_NO_COL_MAX], + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ +) +{ + Decoder_Struct *st_ivas; + AUDIO_CONFIG output_config; + int32_t output_Fs; + ivas_error error; + ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; + int16_t max_band; + int16_t pcm_out_flag; + int16_t td_input; + int16_t ro_md_flag; + IVAS_QUATERNION Quaternion; + + error = IVAS_ERR_OK; + st_ivas = hIvasDec->st_ivas; + output_config = st_ivas->hDecoderConfig->output_config; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hSplitBinRend = st_ivas->hSplitBinRend; + + max_band = (int16_t) ( ( BINAURAL_MAXBANDS * output_Fs ) / 48000 ); + pcm_out_flag = ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; + td_input = st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC; + + if ( st_ivas->hBinRendererTd != NULL ) + { + ro_md_flag = 1; + } + else + { + ro_md_flag = 0; + } + + if ( st_ivas->hHeadTrackData != NULL ) + { + Quaternion = st_ivas->hHeadTrackData->Quaternions[0]; + } + else + { + Quaternion.w = -3.0f; + Quaternion.x = 0.0f; + Quaternion.y = 0.0f; + Quaternion.z = 0.0f; + } + + if ( ( error = ISAR_PRE_REND_MultiBinToSplitBinaural( &hSplitBinRend->splitrend, + Quaternion, + st_ivas->hRenderConfig->split_rend_config.splitRendBitRate, + st_ivas->hRenderConfig->split_rend_config.codec, + st_ivas->hRenderConfig->split_rend_config.isar_frame_size_ms, + st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, + splitRendBits, + p_Cldfb_RealBuffer_Binaural, + p_Cldfb_ImagBuffer_Binaural, + max_band, p_head_pose_buf, 1, !td_input, pcm_out_flag, ro_md_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} +#endif /* FIX_1119_SPLIT_RENDERING_VOIP */ + + /*---------------------------------------------------------------------* * IVAS_DEC_GetSplitBinauralBitstream( ) * @@ -1850,6 +2057,82 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + Decoder_Struct *st_ivas; + ivas_error error; + float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; + float* p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + int32_t i, j; + int16_t pcm_out_flag; + int16_t numSamplesPerChannelToOutput; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + error = IVAS_ERR_UNKNOWN; + st_ivas = hIvasDec->st_ivas; + + if ( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; + numSamplesPerChannelToOutput = isar_get_frame_size(st_ivas); + + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] = head_pose_buf[i]; + + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; + p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; + } + } + + if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, nOutSamples, needNewFrame)) != IVAS_ERR_OK ) + { + return error; + } + // TODO: 1119 - Check if this early return can be simplified. ATM we early return through two stack frames. + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } + + if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, splitRendBits ) ) ) + { + return error; + } + + /* convert to int16 with limiting for BINAURAL_SPLIT_PCM */ + if ( pcm_out_flag ) + { + // TODO: 1119 - remove duplicated if/else branches + if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) + { +#ifndef DISABLE_LIMITER + ivas_limiter_dec( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToOutput, st_ivas->BER_detect ); +#endif + } + else + { + ivas_limiter_dec( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToOutput, st_ivas->BER_detect ); + } + +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_head_pose_buf, numSamplesPerChannelToOutput, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); + } +#else Decoder_Struct *st_ivas; AUDIO_CONFIG output_config; int32_t output_Fs; @@ -2036,6 +2319,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( #endif ivas_syn_output( pOutput, numSamplesPerChannelToDecode, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf_out ); } +#endif return error; } @@ -2050,7 +2334,9 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */ +#ifndef FIX_1119_SPLIT_RENDERING_VOIP const int16_t isSplitRend, /* i : split rendering enabled flag */ +#endif ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { @@ -2074,7 +2360,11 @@ static ivas_error ivas_dec_setup_all( st_ivas = hIvasDec->st_ivas; /* Setup IVAS split rendering */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( splitRendBits != NULL ) +#else if ( isSplitRend ) +#endif { if ( ( error = isar_set_split_rend_setup( st_ivas->hSplitBinRend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hCombinedOrientationData, splitRendBits ) ) != IVAS_ERR_OK ) { @@ -2106,7 +2396,11 @@ static ivas_error ivas_dec_setup_all( * - reconfigure the ISAR handle in case of bitrate switching (renderer might change) *-----------------------------------------------------------------*/ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( st_ivas->ini_frame == 0 && splitRendBits != NULL ) +#else if ( st_ivas->ini_frame == 0 && isSplitRend ) +#endif { if ( ( error = ivas_dec_init_split_rend( st_ivas ) ) != IVAS_ERR_OK ) { @@ -3422,17 +3716,31 @@ ivas_error IVAS_DEC_TSM_SetQuality( #endif +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * ivas_dec_voip_get_samples_common( ) + * + * Main function to output one frame in VoIP. Holds common code for + * regular output configs and split rendering configs. + *---------------------------------------------------------------------*/ +static ivas_error ivas_dec_voip_get_samples_common +#else /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSamples( ) * * Main function to decode one frame in VoIP *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_GetSamples( +ivas_error IVAS_DEC_VoIP_GetSamples +#endif +( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ void *pcmBuf, /* o : output synthesis signal */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ +#endif #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter, @@ -3453,6 +3761,17 @@ ivas_error IVAS_DEC_VoIP_GetSamples( ivas_error error; uint8_t nOutChannels; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + int32_t i, j; + int16_t nSlotsRendered; + float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; + float* p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; +#endif + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->hVoIP == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -3469,14 +3788,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return IVAS_ERR_WRONG_PARAMS; } -#ifdef TMP_FIX_1119_SPLIT_RENDERING_VOIP - if ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || - hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) - { - return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Split rendering is not integrated with VoIP mode" ); - } -#endif - /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ while ( *nSamplesRendered < nSamplesPerChannel ) { @@ -3622,7 +3933,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { if ( hIvasDec->nSamplesAvailableNext == 0 || hIvasDec->nSamplesAvailableNext == hIvasDec->nSamplesFrame ) { - if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, 0, NULL ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + splitRendBits +#else + 0, NULL +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -3644,20 +3961,179 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } } +// TODO: 1119 - extract to a function? +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + nSlotsRendered = *nSamplesRendered / NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* Move output pointers forward */ + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] = &head_pose_buf[i][*nSamplesRendered]; + + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_RealBuffer_Binaural[i][j] = &Cldfb_RealBuffer_Binaural[i][j][nSlotsRendered]; + p_Cldfb_ImagBuffer_Binaural[i][j] = &Cldfb_ImagBuffer_Binaural[i][j][nSlotsRendered]; + } + } + + /* Render head poses from time-scaled transport channels */ + if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, &nSamplesRendered_loop, &tmp )) != IVAS_ERR_OK ) + { + return error; + } + } + else + { +#endif /* render IVAS frames directly to the output buffer */ if ( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesToRender, pcmType, pcm_buffer_offset( pcmBuf, pcmType, *nSamplesRendered * nOutChannels ), &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + } +#endif *nSamplesRendered += nSamplesRendered_loop; update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); } } +// TODO: 1119 - extract to a function? +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( hIvasDec->hasDecodedFirstGoodFrame && + ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || + hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + /* Set pointers to beginning of head pose buffers */ + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] = head_pose_buf[i]; + + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; + p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; + } + } + + /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ + if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, splitRendBits ) ) ) + { + return error; + } + + /* Synthesise PCM output if split PCM */ + if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) + { + #ifndef DISABLE_LIMITER + ivas_limiter_dec( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); + #endif + } + else + { + ivas_limiter_dec( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); + } + + #ifdef DEBUGGING + st_ivas->noClipping += + #endif + ivas_syn_output( p_head_pose_buf, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf ); + } + } +#endif + return IVAS_ERR_OK; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetSamples( ) + * + * Main function to decode one frame in VoIP + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_GetSamples ( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ + void *pcmBuf, /* o : output synthesis signal */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void *jbmWriter, +#endif + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const uint32_t systemTimestamp_ms /* i : current system timestamp */ +) +{ + return ivas_dec_voip_get_samples_common( + hIvasDec, + nSamplesPerChannel, + pcmType, + pcmBuf, + NULL, +#ifdef SUPPORT_JBM_TRACEFILE + jbmWriterFn, + jbmWriter, +#endif + bitstreamReadDone, + nSamplesRendered, + parametersAvailableForEditing, + systemTimestamp_ms + ); +} + +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + void *pcmBuf, /* o : output synthesis signal */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void* jbmWriter +#endif + , + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const uint32_t systemTimestamp_ms /* i : current system timestamp */ +) +{ + ivas_error error = IVAS_ERR_UNKNOWN; + int16_t nSamplesPerChannel = 0; + + if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nSamplesPerChannel ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError getting render frame size in samples\n" ); + return error; + } + + return ivas_dec_voip_get_samples_common( + hIvasDec, + nSamplesPerChannel, + IVAS_DEC_PCM_INT16, + pcmBuf, + splitRendBits, +#ifdef SUPPORT_JBM_TRACEFILE + jbmWriterFn, + jbmWriter, +#endif + bitstreamReadDone, + nSamplesRendered, + parametersAvailableForEditing, + systemTimestamp_ms + ); +} +#endif + /*---------------------------------------------------------------------* * update_voip_rendered20ms( ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 588399ef2a..b8a60066a3 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -162,7 +162,9 @@ ivas_error IVAS_DEC_ReadFormat( /*! r: decoder error code */ ivas_error IVAS_DEC_GetSamplesDecoder( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifndef FIX_1119_SPLIT_RENDERING_VOIP const int16_t isSplitRend, /* i : split rendering enabled flag */ +#endif ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ); @@ -321,6 +323,25 @@ ivas_error IVAS_DEC_VoIP_GetSamples( const uint32_t systemTimestamp_ms /* i : current system timestamp */ ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + void *pcmBuf, /* o : output synthesis signal */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriterFn jbmWriterFn, + void* jbmWriter +#endif + , + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + uint16_t *nSamplesRendered, + bool *parametersAvailableForEditing, + const uint32_t systemTimestamp_ms /* i : current system timestamp */ +); +#endif + ivas_error IVAS_DEC_Flush( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 7f66b317b5..f842b0a53b 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -67,8 +67,13 @@ void isar_splitBinPreRendClose( void lc3plusTimeAlignCldfbPoseCorr( SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX] /* i/o: Binaural signals, imag. part */ +#else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: Binaural signals, real part */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* i/o: Binaural signals, imag. part */ +#endif ); ivas_error splitRendLc3plusEncodeAndWrite( @@ -183,8 +188,13 @@ void isar_splitBinLCLDEncClose( void isar_splitBinLCLDEncProcess( ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc, /* i/o: ISAR LCLD encoder handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_In_Real[][CLDFB_NO_COL_MAX], + float *Cldfb_In_Imag[][CLDFB_NO_COL_MAX], +#else float Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif const int32_t available_bits, ISAR_SPLIT_REND_BITS_HANDLE pBits /* i/o: ISAR bits handle */ ); @@ -271,8 +281,13 @@ void isar_rend_CldfbSplitPreRendProcess( const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i : binaural pre-renderer handle */ const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float* Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i : Binaural signals, real part */ + float* Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i : Binaural signals, imag. part */ +#else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, real part */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, imag. part */ +#endif ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ const int32_t target_md_bits, /* i : ISAR MD bitrate */ const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ diff --git a/lib_isar/isar_splitRend_lcld_enc.c b/lib_isar/isar_splitRend_lcld_enc.c index ac43233e1a..171b5162b3 100644 --- a/lib_isar/isar_splitRend_lcld_enc.c +++ b/lib_isar/isar_splitRend_lcld_enc.c @@ -158,8 +158,13 @@ void isar_splitBinLCLDEncClose( void isar_splitBinLCLDEncProcess( ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc, /* i/o: ISAR LCLD encoder handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_In_Real[][CLDFB_NO_COL_MAX], + float *Cldfb_In_Imag[][CLDFB_NO_COL_MAX], +#else float Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif const int32_t available_bits, ISAR_SPLIT_REND_BITS_HANDLE pBits /* i/o: ISAR bits handle */ ) diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index c7098f997f..e7470c000e 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -53,7 +53,15 @@ * Local function declarations *---------------------------------------------------------------------*/ -static void isar_SplitRenderer_GetRotMd( ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, float Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t low_res, const int16_t ro_md_flag ); +static void isar_SplitRenderer_GetRotMd( ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float* Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], + float* Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], +#else + float Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif + const int16_t low_res, const int16_t ro_md_flag ); /*------------------------------------------------------------------------- @@ -271,11 +279,21 @@ static void ComputePostPredCov( static void ComputeBandedCrossCov( +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_RealBuffer1[][CLDFB_NO_COL_MAX], + float *Cldfb_ImagBuffer1[][CLDFB_NO_COL_MAX], +#else float Cldfb_RealBuffer1[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer1[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif const int16_t ch_start_idx1, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float* Cldfb_RealBuffer2[][CLDFB_NO_COL_MAX], + float* Cldfb_ImagBuffer2[][CLDFB_NO_COL_MAX], +#else float Cldfb_RealBuffer2[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer2[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif const int16_t ch_start_idx2, float out_cov_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float out_cov_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS], @@ -340,8 +358,13 @@ static void ComputeBandedCrossCov( static void ComputeBandedCov( +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float * Cldfb_RealBuffer[][CLDFB_NO_COL_MAX], + float * Cldfb_ImagBuffer[][CLDFB_NO_COL_MAX], +#else float Cldfb_RealBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif const int16_t ch_start_idx, float out_cov_re[][BINAURAL_CHANNELS], float out_cov_im[][BINAURAL_CHANNELS], @@ -1347,8 +1370,13 @@ static void isar_SplitRenderer_quant_code( static void isar_SplitRenderer_GetRotMd( ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i/o: binaural renderer handle */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ + float *Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ +#else float Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Reference Binaural signals */ float Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Reference Binaural signals */ +#endif const int16_t low_res, const int16_t ro_md_flag /* i : Flag to indicate real only metadata for yaw */ ) @@ -1433,8 +1461,13 @@ void isar_rend_CldfbSplitPreRendProcess( const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i : binaural pre-renderer handle */ const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i : Binaural signals, real part */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i : Binaural signals, imag. part */ +#else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, real part */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, imag. part */ +#endif ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ const int32_t target_md_bits, /* i : ISAR MD bitrate */ const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ @@ -1893,6 +1926,11 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( uint8_t useLc3plus; float *in_delayed[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; int16_t i; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + int16_t j; + float *p_Cldfb_In_BinReal[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + float *p_Cldfb_In_BinImag[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; +#endif int32_t num_slots; push_wmops( "isar_renderMultiTDBinToSplitBinaural" ); @@ -1902,6 +1940,17 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( useLc3plus = hSplitBin->hLc3plusEnc != NULL; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + for ( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) + { + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_In_BinReal[i][j] = Cldfb_In_BinReal[i][j]; + p_Cldfb_In_BinImag[i][j] = Cldfb_In_BinImag[i][j]; + } + } +#endif + if ( useLc3plus ) { /*this should always have the time resolution of pose correction MD. Note that this does not change frame size of LC3plus*/ @@ -1963,7 +2012,11 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( { target_md_bits = isar_get_split_rend_md_target_brate( SplitRendBitRate, pcm_out_flag ) * L_FRAME48k / 48000; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + isar_rend_CldfbSplitPreRendProcess( hSplitBin->hBinHrSplitPreRend, headPosition, &hSplitBin->multiBinPoseData, p_Cldfb_In_BinReal, p_Cldfb_In_BinImag, pBits, target_md_bits, low_res_pre_rend_rot, ro_md_flag ); +#else isar_rend_CldfbSplitPreRendProcess( hSplitBin->hBinHrSplitPreRend, headPosition, &hSplitBin->multiBinPoseData, Cldfb_In_BinReal, Cldfb_In_BinImag, pBits, target_md_bits, low_res_pre_rend_rot, ro_md_flag ); +#endif } if ( pcm_out_flag == 0 ) @@ -1978,7 +2031,11 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( pBits->codec_frame_size_ms = codec_frame_size_ms; pBits->isar_frame_size_ms = isar_frame_size_ms; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + isar_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, p_Cldfb_In_BinReal, p_Cldfb_In_BinImag, available_bits, pBits ); +#else isar_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal, Cldfb_In_BinImag, available_bits, pBits ); +#endif } else { @@ -2040,8 +2097,13 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( void lc3plusTimeAlignCldfbPoseCorr( SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX] /* i/o: Binaural signals, imag. part */ +#else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: Binaural signals, real part */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* ii/: Binaural signals, imag. part */ +#endif ) { float Cldfb_In_BinReal_tmp[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][2][CLDFB_NO_CHANNELS_MAX]; diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 09323f6eed..0e8c7ad50c 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -273,7 +273,7 @@ void ISAR_PRE_REND_GetMultiBinPoseData( * *------------------------------------------------------------------------*/ -ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( +ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural ( SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ const int32_t SplitRendBitRate, /* i : Split renderer bitrate */ @@ -281,8 +281,13 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( const int16_t isar_frame_size_ms, /* i : ISAR framesize */ int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float* Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + float* Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ +#else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB real buffer */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB imag buffer */ +#endif const int16_t max_bands, /* i : CLDFB bands */ float *output[], /* i/o: PCM in/out buffer */ const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ diff --git a/lib_isar/lib_isar_pre_rend.h b/lib_isar/lib_isar_pre_rend.h index 9f9f098f39..e1124a714c 100644 --- a/lib_isar/lib_isar_pre_rend.h +++ b/lib_isar/lib_isar_pre_rend.h @@ -71,8 +71,13 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( const int16_t isar_frame_size_ms, /* i : ISAR framesize */ int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float* Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + float* Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ +#else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB real buffer */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB imag buffer */ +#endif const int16_t max_bands, /* i : CLDFB bands */ float *output[], /* i/o: PCM in/out buffer */ const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 2d77b66ed6..6d97493190 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7463,6 +7463,21 @@ static ivas_error getSamplesInternal( int16_t i, ro_md_flag; float *tmpBinaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS], tmpBinaural_buff[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k]; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + int32_t j; + + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; + p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; + } + } +#endif + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) { tmpBinaural[ch] = tmpBinaural_buff[ch]; @@ -7499,8 +7514,13 @@ static ivas_error getSamplesInternal( hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms, hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, &bits, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + p_Cldfb_RealBuffer_Binaural, + p_Cldfb_ImagBuffer_Binaural, +#else Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, +#endif ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, -- GitLab From d38aa90143c326f2a1965a5c878068340f325891 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 28 Apr 2025 09:30:41 +0200 Subject: [PATCH 003/147] Add fix for missing assignment of secondary renderer --- lib_dec/ivas_output_config.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 430b57afa2..31bc424739 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -499,11 +499,22 @@ RENDERER_TYPE ivas_renderer_secondary_select( renderer_type = RENDERER_DISABLE; output_config = st_ivas->hDecoderConfig->output_config; - if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && output_config == IVAS_AUDIO_CONFIG_BINAURAL ) + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) +#else + output_config == IVAS_AUDIO_CONFIG_BINAURAL +#endif + ) { renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } - else if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && ( + output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM +#endif + ) ) { renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } -- GitLab From e7c1525d65284cd36112222eba37432926bff327 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 23 May 2025 11:31:05 +0200 Subject: [PATCH 004/147] [tmp] crude fix for out of bounds array access --- lib_dec/ivas_stat_dec.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 89d53452bb..e0702a345a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -823,15 +823,15 @@ typedef struct renderer_struct typedef struct { - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; } ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA, *ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE; typedef struct { - float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; IVAS_AUDIO_CONFIG config; } ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA, *ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE; -- GitLab From 0746d6644b52411ee038b5526015d004755c395b Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 10 Jun 2025 12:33:24 +0200 Subject: [PATCH 005/147] Add missing preprocessor switch --- lib_dec/ivas_stat_dec.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index e0702a345a..efc5f736d6 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -830,8 +830,13 @@ typedef struct typedef struct { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP // TODO 1119: This double space should not be needed - we always output 20ms of content float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; +#else + float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; +#endif IVAS_AUDIO_CONFIG config; } ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA, *ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE; -- GitLab From 08776d370533956b6d0d171b9d21cc366f552eb2 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 11 Jun 2025 10:15:42 +0200 Subject: [PATCH 006/147] Store CLDFB content used for SR in a ring buffer --- lib_dec/cldfb_ring_buffer.c | 227 +++++++++++++++++++ lib_dec/cldfb_ring_buffer.h | 66 ++++++ lib_dec/ivas_dirac_dec.c | 9 + lib_dec/ivas_mc_param_dec.c | 9 + lib_dec/ivas_mc_paramupmix_dec.c | 9 + lib_dec/ivas_omasa_dec.c | 11 + lib_dec/ivas_osba_dec.c | 19 +- lib_dec/ivas_stat_dec.h | 9 + lib_dec/lib_dec.c | 150 ++++++------ lib_isar/lib_isar_pre_rend.c | 4 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 18 ++ 11 files changed, 455 insertions(+), 76 deletions(-) create mode 100644 lib_dec/cldfb_ring_buffer.c create mode 100644 lib_dec/cldfb_ring_buffer.h diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c new file mode 100644 index 0000000000..8e91d37486 --- /dev/null +++ b/lib_dec/cldfb_ring_buffer.c @@ -0,0 +1,227 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "cldfb_ring_buffer.h" +#include "cnst.h" +#include "prot.h" +#include "ivas_error_utils.h" +#include +#include +#include + +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + +struct CldfbRingBuffer { + float* real; + float* imag; + uint32_t capacity; + uint32_t write_pos; + uint32_t read_pos; + int16_t is_full; +}; + +ivas_error CLDFB_RB_Open( CLDFB_RING_BUFFER_HANDLE *ph, int16_t capacity_columns ) +{ + CLDFB_RING_BUFFER_HANDLE h; + int32_t capacity; + capacity = capacity_columns * CLDFB_NO_CHANNELS_MAX; + + if ( ( h = malloc( sizeof( struct CldfbRingBuffer ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); + } + h->real = NULL; + h->imag = NULL; + h->capacity = 0; + h->write_pos = 0; + h->read_pos = 0; + h->is_full = 0; + *ph = h; + + if ( ( h->real = malloc( capacity * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); + } + if ( ( h->imag = malloc( capacity * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); + } + h->capacity = capacity; + + return IVAS_ERR_OK; +} + +void CLDFB_RB_Close( CLDFB_RING_BUFFER_HANDLE *ph ) +{ + CLDFB_RING_BUFFER_HANDLE h; + + if ( ph == NULL ) + { + return; + } + h = *ph; + + if ( h == NULL ) + { + return; + } + + if ( h->real != NULL ) + { + free( h->real ); + } + if ( h->imag != NULL ) + { + free( h->imag ); + } + + free( h ); + *ph = NULL; + + return; +} + +void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* imag, uint16_t num_bands ) +{ + assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); + assert( !CLDFB_RB_IsFull( h ) ); + + mvr2r( real, &h->real[h->write_pos], (int16_t) num_bands ); + mvr2r( imag, &h->imag[h->write_pos], (int16_t) num_bands ); + + h->write_pos += CLDFB_NO_CHANNELS_MAX; + if ( h->write_pos == h->capacity ) + { + h->write_pos = 0; + } + + if ( h->read_pos == h->write_pos ) + { + h->is_full = 1; + } + + return; +} + +void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ) +{ + CLDFB_RB_Front( h, real, imag, num_bands ); + + h->read_pos += CLDFB_NO_CHANNELS_MAX; + if ( h->read_pos == h->capacity ) + { + h->read_pos = 0; + } + + if ( h->is_full ) + { + h->is_full = 0; + } +} + +void CLDFB_RB_Front( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ) +{ + assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); + assert( !CLDFB_RB_IsEmpty( h ) ); + + mvr2r( &h->real[h->read_pos], real, (int16_t) num_bands ); + mvr2r( &h->imag[h->read_pos], imag, (int16_t) num_bands ); + + return; +} + +static uint32_t rb_num_floats( CLDFB_RING_BUFFER_HANDLE h ) +{ + uint16_t ret; + + if ( CLDFB_RB_IsFull( h ) ) + { + return h->capacity; + } + + if ( h->read_pos <= h->write_pos ) + { + ret = h->write_pos - h->read_pos; + } + else + { + /* wrap around */ + ret = h->write_pos + h->capacity - h->read_pos; + } + + return ret; +} + +int16_t CLDFB_RB_GetNthLastPushed( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, uint16_t n ) +{ + uint32_t offset; + offset = ( n + 1 ) * CLDFB_NO_CHANNELS_MAX; + + /* Trying to access column that was already popped, error */ + if ( rb_num_floats( h ) < offset ) + { + *p_real = NULL; + *p_imag = NULL; + return -1; + } + + if ( offset <= h->write_pos ) + { + *p_real = &h->real[h->write_pos - offset]; + *p_imag = &h->imag[h->write_pos - offset]; + } + else + { + /* wrap around */ + *p_real = &h->real[h->write_pos + h->capacity - offset]; + *p_imag = &h->imag[h->write_pos + h->capacity - offset]; + } + + return 0; +} + +int16_t CLDFB_RB_IsEmpty( CLDFB_RING_BUFFER_HANDLE h ) +{ + return (int16_t) ( h->read_pos == h->write_pos && !h->is_full ); +} + +int16_t CLDFB_RB_IsFull( CLDFB_RING_BUFFER_HANDLE h ) +{ + return h->is_full; +} + +uint16_t CLDFB_RB_Size( CLDFB_RING_BUFFER_HANDLE h ) +{ + return rb_num_floats( h ) / CLDFB_NO_CHANNELS_MAX; +} + +#endif diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h new file mode 100644 index 0000000000..cb276d7549 --- /dev/null +++ b/lib_dec/cldfb_ring_buffer.h @@ -0,0 +1,66 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef CLDFB_RING_BUFFER_H +#define CLDFB_RING_BUFFER_H + +#include "ivas_error.h" +#include + +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + +typedef struct CldfbRingBuffer* CLDFB_RING_BUFFER_HANDLE; + +ivas_error CLDFB_RB_Open( CLDFB_RING_BUFFER_HANDLE *ph, int16_t capacity_columns ); + +void CLDFB_RB_Close( CLDFB_RING_BUFFER_HANDLE *ph ); + +void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* imag, uint16_t num_bands ); + +void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ); + +void CLDFB_RB_Front( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ); + +/** + * Get pointers into the last nth pushed CLDFB column. + * TODO: describe n more precisely + */ +int16_t CLDFB_RB_GetNthLastPushed( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, uint16_t n ); + +int16_t CLDFB_RB_IsEmpty( CLDFB_RING_BUFFER_HANDLE h ); + +int16_t CLDFB_RB_IsFull( CLDFB_RING_BUFFER_HANDLE h ); + +uint16_t CLDFB_RB_Size( CLDFB_RING_BUFFER_HANDLE h ); + +#endif /* FIX_1119_SPLIT_RENDERING_VOIP */ +#endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index cfc4b0bc30..0b0ceecdd6 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2328,8 +2328,17 @@ void ivas_dirac_dec_render_sf( { for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + CLDFB_RB_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], + hSpatParamRendCom->num_freq_bands + ); +#else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], hSpatParamRendCom->num_freq_bands ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], hSpatParamRendCom->num_freq_bands ); +#endif } } } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 643781bfcc..77af926a1d 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1820,8 +1820,17 @@ void ivas_param_mc_dec_render( { for ( ch = 0; ch < nchan_out_cldfb; ch++ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + CLDFB_RB_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], + hParamMC->num_freq_bands + ); +#else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], hParamMC->num_freq_bands ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], hParamMC->num_freq_bands ); +#endif } } } diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index c06e8b3fa1..45fcd5f440 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -790,8 +790,17 @@ static void ivas_mc_paramupmix_dec_sf( { for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + CLDFB_RB_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], + maxBand + ); +#else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); +#endif } } } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index beaf645fa0..c4d33ce425 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -751,9 +751,13 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( float data_separated_objects[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; float *p_sepobj[BINAURAL_CHANNELS]; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *re, *im; +#else int16_t slot_idx_start; slot_idx_start = st_ivas->hSpatParamRendCom->slots_rendered; +#endif for ( n = 0; n < BINAURAL_CHANNELS; n++ ) { @@ -795,8 +799,15 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( cldfbAnalysis_ts( &( p_rend_obj[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n] ); /* note: this intentionally differs from OSBA by: no scaling by 0.5 */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + // TODO 1119: Double-check indexing here + CLDFB_RB_GetNthLastPushed( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, cldfb_slots - slot_idx - 1 ); + v_add( re, Cldfb_RealBuffer, re, num_cldfb_bands ); + v_add( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); +#else v_add( st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx], Cldfb_RealBuffer, st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx], num_cldfb_bands ); v_add( st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx], Cldfb_ImagBuffer, st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx], num_cldfb_bands ); +#endif } } } diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index afa273fdbb..c2b6548738 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -137,9 +137,13 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( float output_separated_objects[BINAURAL_CHANNELS][L_FRAME48k]; float *p_sepobj[BINAURAL_CHANNELS]; int16_t channel_offset; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *re, *im; +#else int16_t slot_idx_start; slot_idx_start = st_ivas->hSpatParamRendCom->slots_rendered; +#endif for ( n = 0; n < BINAURAL_CHANNELS; n++ ) { @@ -180,16 +184,27 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( { cldfbAnalysis_ts( &( output_f[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n] ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + // TODO 1119: Double-check indexing here + CLDFB_RB_GetNthLastPushed( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, cldfb_slots - slot_idx - 1 ); + + for ( b = 0; b < num_cldfb_bands; b++ ) + { + re[b] = 0.5f * re[b] + 0.5f * Cldfb_RealBuffer[b]; + im[b] = 0.5f * im[b] + 0.5f * Cldfb_ImagBuffer[b]; + } +#else for ( b = 0; b < num_cldfb_bands; b++ ) { - st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx][b] = + st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx][b] = ( 0.5f * st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx][b] ) + ( 0.5f * Cldfb_RealBuffer[b] ); - st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx][b] = + st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx][b] = ( 0.5f * st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx][b] ) + ( 0.5f * Cldfb_ImagBuffer[b] ); } +#endif } } } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index efc5f736d6..eca95d41f9 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -40,6 +40,9 @@ #include "stat_dec.h" #include "ivas_stat_com.h" #include "ivas_stat_rend.h" +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +#include "cldfb_ring_buffer.h" +#endif /*----------------------------------------------------------------------------------* @@ -821,12 +824,14 @@ typedef struct renderer_struct * IVAS decoder specific ISAR wrapper structures *----------------------------------------------------------------------------------*/ +#ifndef FIX_1119_SPLIT_RENDERING_VOIP typedef struct { float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; } ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA, *ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE; +#endif typedef struct { @@ -843,7 +848,11 @@ typedef struct typedef struct { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + CLDFB_RING_BUFFER_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; +#else ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE hMultiBinCldfbData; /*scratch buffer for frame by frame processing*/ +#endif ISAR_SPLIT_REND_BITS_HANDLE hSplitRendBits; /*scratch buffer for frame by frame processing*/ SPLIT_REND_WRAPPER splitrend; ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE hCldfbDataOut; /*buffer to store cldfb data before binauralization*/ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 781036b82f..5854b58195 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1874,8 +1874,6 @@ static ivas_error isar_render_poses( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ float** p_head_pose_buf, - float *p_Cldfb_RealBuffer_Binaural[][CLDFB_NO_COL_MAX], - float *p_Cldfb_ImagBuffer_Binaural[][CLDFB_NO_COL_MAX], int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) @@ -1886,7 +1884,6 @@ static ivas_error isar_render_poses( ivas_error error; ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; int16_t numPoses; - int16_t slots_rendered, slots_rendered_new; error = IVAS_ERR_OK; st_ivas = hIvasDec->st_ivas; @@ -1907,23 +1904,6 @@ static ivas_error isar_render_poses( set_zero( (float *) hIvasDec->flushbuffer, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); } - if ( st_ivas->hTcBuffer == NULL || hIvasDec->hasBeenFedFrame ) - { - slots_rendered = 0; - } - else - { - /* this is needed for OMASA-DISC, because the td-rend granularity is 240 samples at 48kHz, leading to wrong slot count. */ - if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { - slots_rendered = st_ivas->hTcBuffer->n_samples_rendered / NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - } - else - { - slots_rendered = st_ivas->hTcBuffer->n_samples_rendered / st_ivas->hTcBuffer->n_samples_granularity; - } - } - /* render */ if ( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesAsked, IVAS_DEC_PCM_FLOAT, pcmBuf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) { @@ -1945,40 +1925,12 @@ static ivas_error isar_render_poses( } } - if ( st_ivas->hTcBuffer == NULL ) - { - slots_rendered_new = 0; - } - else - { - /* this is needed for OMASA-DISC, because the td-rend granularity is 240 samples at 48kHz, leading to wrong slot count. */ - if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { - slots_rendered_new = st_ivas->hTcBuffer->n_samples_rendered / NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - } - else - { - slots_rendered_new = st_ivas->hTcBuffer->n_samples_rendered / st_ivas->hTcBuffer->n_samples_granularity; - } - } - - for ( i = 0; i < BINAURAL_CHANNELS * numPoses; ++i ) - { - for ( j = slots_rendered; j < slots_rendered_new; ++j ) - { - mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[i][j], p_Cldfb_RealBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); - mvr2r( hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[i][j], p_Cldfb_ImagBuffer_Binaural[i][j - slots_rendered], CLDFB_NO_CHANNELS_MAX ); - } - } - return error; } static ivas_error isar_generate_metadata_and_bitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ float** p_head_pose_buf, - float *p_Cldfb_RealBuffer_Binaural[][CLDFB_NO_COL_MAX], - float *p_Cldfb_ImagBuffer_Binaural[][CLDFB_NO_COL_MAX], ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { @@ -1992,6 +1944,12 @@ static ivas_error isar_generate_metadata_and_bitstream( int16_t td_input; int16_t ro_md_flag; IVAS_QUATERNION Quaternion; + int16_t i, j, num_poses; + // TODO 1119: If data could be read directly from the ring buffer, these large buffers could be removed + float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; + float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; error = IVAS_ERR_OK; st_ivas = hIvasDec->st_ivas; @@ -2003,6 +1961,27 @@ static ivas_error isar_generate_metadata_and_bitstream( pcm_out_flag = ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; td_input = st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC; + if ( !td_input ) + { + num_poses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; + + for ( i = 0; i < (int16_t) ( BINAURAL_CHANNELS * num_poses ); ++i ) + { + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + { + CLDFB_RB_Pop( + hSplitBinRend->hMultiBinCldfbData[i], + Cldfb_RealBuffer_Binaural[i][j], + Cldfb_ImagBuffer_Binaural[i][j], + CLDFB_NO_CHANNELS_MAX + ); + + p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; + p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; + } + } + } + if ( st_ivas->hBinRendererTd != NULL ) { ro_md_flag = 1; @@ -2097,7 +2076,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( } } - if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, nOutSamples, needNewFrame)) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame)) != IVAS_ERR_OK ) { return error; } @@ -2107,7 +2086,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_OK; } - if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, splitRendBits ) ) ) + if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ) ) ) { return error; } @@ -3762,14 +3741,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples uint8_t nOutChannels; #ifdef FIX_1119_SPLIT_RENDERING_VOIP - int32_t i, j; - int16_t nSlotsRendered; + int32_t i; float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; float* p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; - float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; #endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->hVoIP == NULL ) @@ -3965,22 +3939,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { - nSlotsRendered = *nSamplesRendered / NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - /* Move output pointers forward */ for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { p_head_pose_buf[i] = &head_pose_buf[i][*nSamplesRendered]; - - for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) - { - p_Cldfb_RealBuffer_Binaural[i][j] = &Cldfb_RealBuffer_Binaural[i][j][nSlotsRendered]; - p_Cldfb_ImagBuffer_Binaural[i][j] = &Cldfb_ImagBuffer_Binaural[i][j][nSlotsRendered]; - } } /* Render head poses from time-scaled transport channels */ - if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, &nSamplesRendered_loop, &tmp )) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, &nSamplesRendered_loop, &tmp )) != IVAS_ERR_OK ) { return error; } @@ -4012,16 +3978,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { p_head_pose_buf[i] = head_pose_buf[i]; - - for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) - { - p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; - p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; - } } /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ - if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, splitRendBits ) ) ) + if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ) ) ) { return error; } @@ -5242,6 +5202,9 @@ static ivas_error ivas_create_handle_isar( ) { ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + int16_t i; +#endif if ( ( hSplitBinRend = (ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_WRAPPER ) ) ) == NULL ) { @@ -5250,7 +5213,14 @@ static ivas_error ivas_create_handle_isar( isar_init_split_rend_handles( &hSplitBinRend->splitrend ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + for ( i = 0; i < (int16_t) ( MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS ); ++i ) + { + hSplitBinRend->hMultiBinCldfbData[i] = NULL; + } +#else hSplitBinRend->hMultiBinCldfbData = NULL; +#endif hSplitBinRend->hCldfbDataOut = NULL; hSplitBinRend->numTdSamplesPerChannelCached = 0; @@ -5270,10 +5240,24 @@ static void ivas_destroy_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend /* i/o: ISAR split binaural rendering handle */ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + int16_t i; +#endif + if ( *hSplitBinRend != NULL ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + for ( i = 0; i < (int16_t) ( MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS ); ++i ) + { + if ( ( *hSplitBinRend )->hMultiBinCldfbData[i] != NULL ) + { + CLDFB_RB_Close( &( *hSplitBinRend )->hMultiBinCldfbData[i] ); + } + } +#else free( ( *hSplitBinRend )->hMultiBinCldfbData ); ( *hSplitBinRend )->hMultiBinCldfbData = NULL; +#endif ISAR_PRE_REND_close( &( *hSplitBinRend )->splitrend, NULL ); @@ -5458,6 +5442,9 @@ static ivas_error ivas_dec_init_split_rend( ivas_error error; int16_t cldfb_in_flag, pcm_out_flag; int16_t mixed_td_cldfb_flag; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + int16_t i, num_poses; +#endif pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; cldfb_in_flag = 0; @@ -5470,6 +5457,24 @@ static ivas_error ivas_dec_init_split_rend( cldfb_in_flag = 1; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); + num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + assert( num_poses <= MAX_HEAD_ROT_POSES ); + + if ( cldfb_in_flag ) + { + for ( i = 0; i < (int16_t) ( num_poses * BINAURAL_CHANNELS ); ++i ) + { + /* note: this is intra-frame heap memory */ + error = CLDFB_RB_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], 2 * CLDFB_NO_COL_MAX ); /* TODO: 2x space to fit scaled frames is only needed in VoIP mode */ + if ( error != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); + } + } + } +#else /* note: this is intra-frame heap memory */ if ( ( st_ivas->hSplitBinRend->hMultiBinCldfbData = (ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA ) ) ) == NULL ) { @@ -5477,6 +5482,7 @@ static ivas_error ivas_dec_init_split_rend( } ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); +#endif if ( cldfb_in_flag == 1 && ( st_ivas->hSplitBinRend->splitrend.multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) { diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 0e8c7ad50c..22807d1300 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -282,8 +282,8 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural ( int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float* Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ - float* Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ + float* Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + float* Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ #else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB real buffer */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB imag buffer */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index cc1bccb131..d23133d30e 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -797,8 +797,17 @@ static void ivas_dirac_dec_binaural_internal( { for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + CLDFB_RB_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], + tmp_Cldfb_out_re[ch][i], + tmp_Cldfb_out_im[ch][i], + CLDFB_NO_CHANNELS_MAX + ); +#else mvr2r( tmp_Cldfb_out_re[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); mvr2r( tmp_Cldfb_out_im[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); +#endif } } } @@ -866,8 +875,17 @@ static void ivas_dirac_dec_binaural_internal( { for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + CLDFB_RB_Push( + st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + tmp_Cldfb_out_re[ch][i], + tmp_Cldfb_out_im[ch][i], + CLDFB_NO_CHANNELS_MAX + ); +#else mvr2r( tmp_Cldfb_out_re[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); mvr2r( tmp_Cldfb_out_im[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); +#endif } } -- GitLab From a667e45c2ff5bb47f6da54f071a901b8d551c08e Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 11 Jun 2025 10:50:59 +0200 Subject: [PATCH 007/147] Remove unused variables --- lib_dec/lib_dec.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 5854b58195..541727b364 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2041,11 +2041,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( ivas_error error; float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; float* p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; - float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; - int32_t i, j; + int32_t i; int16_t pcm_out_flag; int16_t numSamplesPerChannelToOutput; @@ -2068,12 +2064,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { p_head_pose_buf[i] = head_pose_buf[i]; - - for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) - { - p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; - p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; - } } if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame)) != IVAS_ERR_OK ) -- GitLab From a4c646dfaaa66fe1912d9e03dc38a0a8af2a30dc Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 13 Jun 2025 14:13:16 +0200 Subject: [PATCH 008/147] Fix typo in comment --- tests/split_rendering/test_split_rendering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index f08d08cd4a..a4bdca36dd 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -610,7 +610,7 @@ DELAY_PROFILES = ["dly_error_profile_0.dat", "dly_error_profile_5.dat"] # Compares PCM output and tracefile from a VoIP BINAURAL_SPLIT_PCM chain with equivalent BINAURAL -# chain to ensure time-scaling and other JBM operations are the BE between the two. +# chain to ensure time-scaling and other JBM operations are BE between the two. @pytest.mark.parametrize("in_format", IN_FORMATS) @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) def test_be_splitrend_vs_binaural( -- GitLab From aba18db5c0e4f21df9c64e0369a5b94640f4df89 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 13 Jun 2025 14:11:25 +0200 Subject: [PATCH 009/147] Add a temporary workaround to fix IVAS_DEC_Flush with BINAURAL_SPLIT_PCM output --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 6 ++++++ lib_dec/ivas_stat_dec.h | 4 ++++ lib_dec/lib_dec.c | 8 ++++++++ 4 files changed, 19 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index c335aaa419..4c5013cb5d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,6 +161,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define UNIFIED_DECODING_PATHS_LEFTOVERS /* VA: issue 880: remove leftovers after NONBE_UNIFIED_DECODING_PATHS */ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ +#define TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Workaround for incorrect implementation of decoder flush with split rendering */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 68e9099896..b11fe466fd 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1467,6 +1467,12 @@ ivas_error ivas_jbm_dec_render( if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { nchan_out_syn_output = BINAURAL_CHANNELS * st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; +#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + if ( st_ivas->flushing ) + { + nchan_out_syn_output = BINAURAL_CHANNELS; + } +#endif } else { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index eca95d41f9..1389e53f77 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1146,6 +1146,10 @@ typedef struct Decoder_Struct int16_t ism_extmeta_active; /* Extended metadata active in decoder */ int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */ +#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + int16_t flushing; +#endif + } Decoder_Struct; /* clang-format on */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 541727b364..ade85b1a30 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4134,6 +4134,10 @@ ivas_error IVAS_DEC_Flush( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + hIvasDec->st_ivas->flushing = 1; +#endif + *nSamplesFlushed = min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); nSamplesToRender = (uint16_t) *nSamplesFlushed; @@ -4149,6 +4153,10 @@ ivas_error IVAS_DEC_Flush( *nSamplesFlushed = 0; } +#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + hIvasDec->st_ivas->flushing = 0; +#endif + return error; } -- GitLab From 52aeec044074d527064c4e4153ee1c246a6f58f5 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 25 Jun 2025 15:38:08 +0200 Subject: [PATCH 010/147] CLDFB ring buffer: replace CLDFB_RB_GetNthLastPushed with CLDFB_RB_GetByIdx --- lib_dec/cldfb_ring_buffer.c | 35 +++++++++++++++-------------------- lib_dec/cldfb_ring_buffer.h | 8 +------- lib_dec/ivas_omasa_dec.c | 3 +-- lib_dec/ivas_osba_dec.c | 3 +-- 4 files changed, 18 insertions(+), 31 deletions(-) diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index 8e91d37486..0282d928f5 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -134,7 +134,11 @@ void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ) { - CLDFB_RB_Front( h, real, imag, num_bands ); + assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); + assert( !CLDFB_RB_IsEmpty( h ) ); + + mvr2r( &h->real[h->read_pos], real, (int16_t) num_bands ); + mvr2r( &h->imag[h->read_pos], imag, (int16_t) num_bands ); h->read_pos += CLDFB_NO_CHANNELS_MAX; if ( h->read_pos == h->capacity ) @@ -146,15 +150,6 @@ void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_ { h->is_full = 0; } -} - -void CLDFB_RB_Front( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ) -{ - assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !CLDFB_RB_IsEmpty( h ) ); - - mvr2r( &h->real[h->read_pos], real, (int16_t) num_bands ); - mvr2r( &h->imag[h->read_pos], imag, (int16_t) num_bands ); return; } @@ -181,31 +176,31 @@ static uint32_t rb_num_floats( CLDFB_RING_BUFFER_HANDLE h ) return ret; } -int16_t CLDFB_RB_GetNthLastPushed( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, uint16_t n ) +int16_t CLDFB_RB_GetByIdx( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, int16_t col_idx ) { + int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; + int32_t num_floats = (int32_t) rb_num_floats(h); uint32_t offset; - offset = ( n + 1 ) * CLDFB_NO_CHANNELS_MAX; - /* Trying to access column that was already popped, error */ - if ( rb_num_floats( h ) < offset ) + if ( idx < -num_floats || num_floats <= idx ) { *p_real = NULL; *p_imag = NULL; return -1; } - if ( offset <= h->write_pos ) + if ( idx >= 0 ) { - *p_real = &h->real[h->write_pos - offset]; - *p_imag = &h->imag[h->write_pos - offset]; + offset = ( h->read_pos + idx ) % h->capacity; } else { - /* wrap around */ - *p_real = &h->real[h->write_pos + h->capacity - offset]; - *p_imag = &h->imag[h->write_pos + h->capacity - offset]; + offset = ( h->write_pos + h->capacity + idx ) % h->capacity; } + *p_real = &h->real[offset]; + *p_imag = &h->imag[offset]; + return 0; } diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h index cb276d7549..eee1bf1faa 100644 --- a/lib_dec/cldfb_ring_buffer.h +++ b/lib_dec/cldfb_ring_buffer.h @@ -48,13 +48,7 @@ void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ); -void CLDFB_RB_Front( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ); - -/** - * Get pointers into the last nth pushed CLDFB column. - * TODO: describe n more precisely - */ -int16_t CLDFB_RB_GetNthLastPushed( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, uint16_t n ); +int16_t CLDFB_RB_GetByIdx( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, int16_t idx ); int16_t CLDFB_RB_IsEmpty( CLDFB_RING_BUFFER_HANDLE h ); diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index c4d33ce425..cd1ae88521 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -800,8 +800,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( /* note: this intentionally differs from OSBA by: no scaling by 0.5 */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - // TODO 1119: Double-check indexing here - CLDFB_RB_GetNthLastPushed( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, cldfb_slots - slot_idx - 1 ); + CLDFB_RB_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); v_add( re, Cldfb_RealBuffer, re, num_cldfb_bands ); v_add( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); #else diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index c2b6548738..3f474cc172 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -185,8 +185,7 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( cldfbAnalysis_ts( &( output_f[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n] ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP - // TODO 1119: Double-check indexing here - CLDFB_RB_GetNthLastPushed( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, cldfb_slots - slot_idx - 1 ); + CLDFB_RB_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); for ( b = 0; b < num_cldfb_bands; b++ ) { -- GitLab From 49bfaa8394846e119dea0f5272f1ef8b0ccc30c3 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 25 Jun 2025 15:58:32 +0200 Subject: [PATCH 011/147] Save memory by using values directly from the CLDFB ring buffer --- lib_dec/cldfb_ring_buffer.c | 10 ++++++++-- lib_dec/lib_dec.c | 26 ++++++++++++++++---------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index 0282d928f5..cfb5362d36 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -137,8 +137,14 @@ void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_ assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); assert( !CLDFB_RB_IsEmpty( h ) ); - mvr2r( &h->real[h->read_pos], real, (int16_t) num_bands ); - mvr2r( &h->imag[h->read_pos], imag, (int16_t) num_bands ); + if ( real != NULL ) + { + mvr2r( &h->real[h->read_pos], real, (int16_t) num_bands ); + } + if ( imag != NULL ) + { + mvr2r( &h->imag[h->read_pos], imag, (int16_t) num_bands ); + } h->read_pos += CLDFB_NO_CHANNELS_MAX; if ( h->read_pos == h->capacity ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ade85b1a30..1bda91d724 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1945,9 +1945,6 @@ static ivas_error isar_generate_metadata_and_bitstream( int16_t ro_md_flag; IVAS_QUATERNION Quaternion; int16_t i, j, num_poses; - // TODO 1119: If data could be read directly from the ring buffer, these large buffers could be removed - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; @@ -1969,15 +1966,24 @@ static ivas_error isar_generate_metadata_and_bitstream( { for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) { + /* Save pointers to first CLDFB column in the ring buffer. Allows us to save + * significant amounts of memory by not copying CLDFB values into a separate buffer. */ + CLDFB_RB_GetByIdx( + hSplitBinRend->hMultiBinCldfbData[i], + &p_Cldfb_RealBuffer_Binaural[i][j], + &p_Cldfb_ImagBuffer_Binaural[i][j], + 0 + ); + /* Pop the CLDFB column we just saved pointers to. This is fine as long as we use + * the saved columns only before any new columns are pushed to the buffer - the new + * columns could potentially overwrite the old columns we wanted to use. + * This requirement is fulfilled in this case. */ CLDFB_RB_Pop( - hSplitBinRend->hMultiBinCldfbData[i], - Cldfb_RealBuffer_Binaural[i][j], - Cldfb_ImagBuffer_Binaural[i][j], - CLDFB_NO_CHANNELS_MAX + hSplitBinRend->hMultiBinCldfbData[i], + NULL, + NULL, + CLDFB_NO_CHANNELS_MAX ); - - p_Cldfb_RealBuffer_Binaural[i][j] = Cldfb_RealBuffer_Binaural[i][j]; - p_Cldfb_ImagBuffer_Binaural[i][j] = Cldfb_ImagBuffer_Binaural[i][j]; } } } -- GitLab From adaf54fd997116f8e0713f6d47394dad1a061134 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 25 Jun 2025 18:10:36 +0200 Subject: [PATCH 012/147] Handle leftover TODOs --- lib_dec/ivas_stat_dec.h | 6 +++--- lib_dec/lib_dec.c | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 1389e53f77..4bb1a5cc90 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -827,15 +827,15 @@ typedef struct renderer_struct #ifndef FIX_1119_SPLIT_RENDERING_VOIP typedef struct { - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; } ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA, *ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE; #endif typedef struct { -#ifdef FIX_1119_SPLIT_RENDERING_VOIP // TODO 1119: This double space should not be needed - we always output 20ms of content +#ifdef FIX_1119_SPLIT_RENDERING_VOIP float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; #else diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 1bda91d724..d9d0dd6d47 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1909,8 +1909,6 @@ static ivas_error isar_render_poses( { return error; } - - // TODO: 1119 - Check if this early return can be simplified. ATM we early return through two stack frames. if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { return IVAS_ERR_OK; @@ -2076,7 +2074,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( { return error; } - // TODO: 1119 - Check if this early return can be simplified. ATM we early return through two stack frames. if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { return IVAS_ERR_OK; @@ -2090,7 +2087,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( /* convert to int16 with limiting for BINAURAL_SPLIT_PCM */ if ( pcm_out_flag ) { - // TODO: 1119 - remove duplicated if/else branches if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { #ifndef DISABLE_LIMITER @@ -3931,7 +3927,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples } } -// TODO: 1119 - extract to a function? #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { @@ -3964,7 +3959,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples } } -// TODO: 1119 - extract to a function? #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( hIvasDec->hasDecodedFirstGoodFrame && ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || @@ -5447,7 +5441,7 @@ static ivas_error ivas_dec_init_split_rend( int16_t cldfb_in_flag, pcm_out_flag; int16_t mixed_td_cldfb_flag; #ifdef FIX_1119_SPLIT_RENDERING_VOIP - int16_t i, num_poses; + int16_t i, num_poses, cldfb_buffer_capacity; #endif pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; @@ -5468,10 +5462,20 @@ static ivas_error ivas_dec_init_split_rend( if ( cldfb_in_flag ) { + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + /* With TSM we need more space for stretched frames */ + cldfb_buffer_capacity = CLDFB_NO_COL_MAX * 2; + } + else + { + cldfb_buffer_capacity = CLDFB_NO_COL_MAX; + } + for ( i = 0; i < (int16_t) ( num_poses * BINAURAL_CHANNELS ); ++i ) { /* note: this is intra-frame heap memory */ - error = CLDFB_RB_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], 2 * CLDFB_NO_COL_MAX ); /* TODO: 2x space to fit scaled frames is only needed in VoIP mode */ + error = CLDFB_RB_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], cldfb_buffer_capacity ); if ( error != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); -- GitLab From b4bf26f916ff550444b4539de567184221ff1621 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 11:29:53 +0200 Subject: [PATCH 013/147] Minor cleanup --- lib_dec/ivas_dirac_dec.c | 5 ++--- lib_dec/ivas_osba_dec.c | 4 ++-- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 8 ++++++++ lib_isar/isar_splitRendererPre.c | 26 ++++++++++++++++++++++---- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 351a05416d..80262f605a 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1667,16 +1667,15 @@ static void binRenderer_split( { for ( ch = 0; ch < nchan_out; ch++ ) { - #ifdef FIX_1119_SPLIT_RENDERING_VOIP CLDFB_RB_Push( - hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], + hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], num_freq_bands ); #else - mvr2r( Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands ); + mvr2r( Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands ); mvr2r( Cldfb_ImagBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands ); #endif } diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 3f474cc172..39a927c74a 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -195,11 +195,11 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( #else for ( b = 0; b < num_cldfb_bands; b++ ) { - st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx][b] = + st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx][b] = ( 0.5f * st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[n][slot_idx_start + slot_idx][b] ) + ( 0.5f * Cldfb_RealBuffer[b] ); - st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx][b] = + st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx][b] = ( 0.5f * st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[n][slot_idx_start + slot_idx][b] ) + ( 0.5f * Cldfb_ImagBuffer[b] ); } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 66f6e15c95..f1fa590de5 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -836,7 +836,7 @@ typedef struct typedef struct { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* Double space to account for TSM */ float Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS][2 * CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; #else float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 2101acb75d..e42138534e 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -3748,6 +3748,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples return IVAS_ERR_WRONG_PARAMS; } +#ifndef FIX_1119_SPLIT_RENDERING_VOIP + if ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || + hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) + { + return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Split rendering is not integrated with VoIP mode" ); + } +#endif + /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ while ( *nSamplesRendered < nSamplesPerChannel ) { diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index e7470c000e..94aabfe3ce 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -2012,11 +2012,22 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( { target_md_bits = isar_get_split_rend_md_target_brate( SplitRendBitRate, pcm_out_flag ) * L_FRAME48k / 48000; + isar_rend_CldfbSplitPreRendProcess( + hSplitBin->hBinHrSplitPreRend, + headPosition, + &hSplitBin->multiBinPoseData, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - isar_rend_CldfbSplitPreRendProcess( hSplitBin->hBinHrSplitPreRend, headPosition, &hSplitBin->multiBinPoseData, p_Cldfb_In_BinReal, p_Cldfb_In_BinImag, pBits, target_md_bits, low_res_pre_rend_rot, ro_md_flag ); + p_Cldfb_In_BinReal, + p_Cldfb_In_BinImag, #else - isar_rend_CldfbSplitPreRendProcess( hSplitBin->hBinHrSplitPreRend, headPosition, &hSplitBin->multiBinPoseData, Cldfb_In_BinReal, Cldfb_In_BinImag, pBits, target_md_bits, low_res_pre_rend_rot, ro_md_flag ); + Cldfb_In_BinReal, + Cldfb_In_BinImag, #endif + pBits, + target_md_bits, + low_res_pre_rend_rot, + ro_md_flag + ); } if ( pcm_out_flag == 0 ) @@ -2031,11 +2042,18 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( pBits->codec_frame_size_ms = codec_frame_size_ms; pBits->isar_frame_size_ms = isar_frame_size_ms; + isar_splitBinLCLDEncProcess( + hSplitBin->hSplitBinLCLDEnc, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - isar_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, p_Cldfb_In_BinReal, p_Cldfb_In_BinImag, available_bits, pBits ); + p_Cldfb_In_BinReal, + p_Cldfb_In_BinImag, #else - isar_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal, Cldfb_In_BinImag, available_bits, pBits ); + Cldfb_In_BinReal, + Cldfb_In_BinImag, #endif + available_bits, + pBits + ); } else { -- GitLab From 2c5914eaaaa03368aef30da5eac0651e3f896ce9 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 11:34:58 +0200 Subject: [PATCH 014/147] Rename CLDFB ring buffer --- lib_dec/cldfb_ring_buffer.c | 32 ++++++++++---------- lib_dec/cldfb_ring_buffer.h | 22 +++++++------- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_mc_param_dec.c | 2 +- lib_dec/ivas_mc_paramupmix_dec.c | 2 +- lib_dec/ivas_omasa_dec.c | 2 +- lib_dec/ivas_osba_dec.c | 2 +- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 8 ++--- lib_rend/ivas_dirac_dec_binaural_functions.c | 4 +-- 10 files changed, 39 insertions(+), 39 deletions(-) diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index cfb5362d36..43a922f1b0 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -40,7 +40,7 @@ #ifdef FIX_1119_SPLIT_RENDERING_VOIP -struct CldfbRingBuffer { +struct CldfbRingBuf { float* real; float* imag; uint32_t capacity; @@ -49,13 +49,13 @@ struct CldfbRingBuffer { int16_t is_full; }; -ivas_error CLDFB_RB_Open( CLDFB_RING_BUFFER_HANDLE *ph, int16_t capacity_columns ) +ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ) { - CLDFB_RING_BUFFER_HANDLE h; + CLDFB_RINGBUF_HANDLE h; int32_t capacity; capacity = capacity_columns * CLDFB_NO_CHANNELS_MAX; - if ( ( h = malloc( sizeof( struct CldfbRingBuffer ) ) ) == NULL ) + if ( ( h = malloc( sizeof( struct CldfbRingBuf ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); } @@ -80,9 +80,9 @@ ivas_error CLDFB_RB_Open( CLDFB_RING_BUFFER_HANDLE *ph, int16_t capacity_columns return IVAS_ERR_OK; } -void CLDFB_RB_Close( CLDFB_RING_BUFFER_HANDLE *ph ) +void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ) { - CLDFB_RING_BUFFER_HANDLE h; + CLDFB_RINGBUF_HANDLE h; if ( ph == NULL ) { @@ -110,10 +110,10 @@ void CLDFB_RB_Close( CLDFB_RING_BUFFER_HANDLE *ph ) return; } -void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* imag, uint16_t num_bands ) +void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float* real, const float* imag, uint16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !CLDFB_RB_IsFull( h ) ); + assert( !CLDFB_RINGBUF_IsFull( h ) ); mvr2r( real, &h->real[h->write_pos], (int16_t) num_bands ); mvr2r( imag, &h->imag[h->write_pos], (int16_t) num_bands ); @@ -132,10 +132,10 @@ void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* return; } -void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ) +void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float* real, float* imag, uint16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !CLDFB_RB_IsEmpty( h ) ); + assert( !CLDFB_RINGBUF_IsEmpty( h ) ); if ( real != NULL ) { @@ -160,11 +160,11 @@ void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_ return; } -static uint32_t rb_num_floats( CLDFB_RING_BUFFER_HANDLE h ) +static uint32_t rb_num_floats( CLDFB_RINGBUF_HANDLE h ) { uint16_t ret; - if ( CLDFB_RB_IsFull( h ) ) + if ( CLDFB_RINGBUF_IsFull( h ) ) { return h->capacity; } @@ -182,7 +182,7 @@ static uint32_t rb_num_floats( CLDFB_RING_BUFFER_HANDLE h ) return ret; } -int16_t CLDFB_RB_GetByIdx( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, int16_t col_idx ) +int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float** p_real, float** p_imag, int16_t col_idx ) { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; int32_t num_floats = (int32_t) rb_num_floats(h); @@ -210,17 +210,17 @@ int16_t CLDFB_RB_GetByIdx( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p return 0; } -int16_t CLDFB_RB_IsEmpty( CLDFB_RING_BUFFER_HANDLE h ) +int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ) { return (int16_t) ( h->read_pos == h->write_pos && !h->is_full ); } -int16_t CLDFB_RB_IsFull( CLDFB_RING_BUFFER_HANDLE h ) +int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ) { return h->is_full; } -uint16_t CLDFB_RB_Size( CLDFB_RING_BUFFER_HANDLE h ) +uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ) { return rb_num_floats( h ) / CLDFB_NO_CHANNELS_MAX; } diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h index eee1bf1faa..59fbcce5ee 100644 --- a/lib_dec/cldfb_ring_buffer.h +++ b/lib_dec/cldfb_ring_buffer.h @@ -30,31 +30,31 @@ *******************************************************************************************************/ -#ifndef CLDFB_RING_BUFFER_H -#define CLDFB_RING_BUFFER_H +#ifndef CLDFB_RINGBUF_H +#define CLDFB_RINGBUF_H #include "ivas_error.h" #include #ifdef FIX_1119_SPLIT_RENDERING_VOIP -typedef struct CldfbRingBuffer* CLDFB_RING_BUFFER_HANDLE; +typedef struct CldfbRingBuf* CLDFB_RINGBUF_HANDLE; -ivas_error CLDFB_RB_Open( CLDFB_RING_BUFFER_HANDLE *ph, int16_t capacity_columns ); +ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ); -void CLDFB_RB_Close( CLDFB_RING_BUFFER_HANDLE *ph ); +void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ); -void CLDFB_RB_Push( CLDFB_RING_BUFFER_HANDLE h, const float* real, const float* imag, uint16_t num_bands ); +void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float* real, const float* imag, uint16_t num_bands ); -void CLDFB_RB_Pop( CLDFB_RING_BUFFER_HANDLE h, float* real, float* imag, uint16_t num_bands ); +void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float* real, float* imag, uint16_t num_bands ); -int16_t CLDFB_RB_GetByIdx( CLDFB_RING_BUFFER_HANDLE h, float** p_real, float** p_imag, int16_t idx ); +int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float** p_real, float** p_imag, int16_t idx ); -int16_t CLDFB_RB_IsEmpty( CLDFB_RING_BUFFER_HANDLE h ); +int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ); -int16_t CLDFB_RB_IsFull( CLDFB_RING_BUFFER_HANDLE h ); +int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ); -uint16_t CLDFB_RB_Size( CLDFB_RING_BUFFER_HANDLE h ); +uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ); #endif /* FIX_1119_SPLIT_RENDERING_VOIP */ #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 80262f605a..2ca50dc21f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1668,7 +1668,7 @@ static void binRenderer_split( for ( ch = 0; ch < nchan_out; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_Push( + CLDFB_RINGBUF_Push( hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 50f156e552..0775d1e15b 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1787,7 +1787,7 @@ void ivas_param_mc_dec_render( for ( ch = 0; ch < nchan_out_cldfb; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_Push( + CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 45fcd5f440..d5732fec4e 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -791,7 +791,7 @@ static void ivas_mc_paramupmix_dec_sf( for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_Push( + CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index cd1ae88521..af8465e787 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -800,7 +800,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( /* note: this intentionally differs from OSBA by: no scaling by 0.5 */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); + CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); v_add( re, Cldfb_RealBuffer, re, num_cldfb_bands ); v_add( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); #else diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 39a927c74a..65392ec896 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -185,7 +185,7 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( cldfbAnalysis_ts( &( output_f[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n] ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); + CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); for ( b = 0; b < num_cldfb_bands; b++ ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index f1fa590de5..ef9b8b3d36 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -849,7 +849,7 @@ typedef struct typedef struct { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RING_BUFFER_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; + CLDFB_RINGBUF_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; #else ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE hMultiBinCldfbData; /*scratch buffer for frame by frame processing*/ #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index e42138534e..8a0e8f2fa9 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1960,7 +1960,7 @@ static ivas_error isar_generate_metadata_and_bitstream( { /* Save pointers to first CLDFB column in the ring buffer. Allows us to save * significant amounts of memory by not copying CLDFB values into a separate buffer. */ - CLDFB_RB_GetByIdx( + CLDFB_RINGBUF_GetByIdx( hSplitBinRend->hMultiBinCldfbData[i], &p_Cldfb_RealBuffer_Binaural[i][j], &p_Cldfb_ImagBuffer_Binaural[i][j], @@ -1970,7 +1970,7 @@ static ivas_error isar_generate_metadata_and_bitstream( * the saved columns only before any new columns are pushed to the buffer - the new * columns could potentially overwrite the old columns we wanted to use. * This requirement is fulfilled in this case. */ - CLDFB_RB_Pop( + CLDFB_RINGBUF_Pop( hSplitBinRend->hMultiBinCldfbData[i], NULL, NULL, @@ -5225,7 +5225,7 @@ static void ivas_destroy_handle_isar( { if ( ( *hSplitBinRend )->hMultiBinCldfbData[i] != NULL ) { - CLDFB_RB_Close( &( *hSplitBinRend )->hMultiBinCldfbData[i] ); + CLDFB_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinCldfbData[i] ); } } #else @@ -5454,7 +5454,7 @@ static ivas_error ivas_dec_init_split_rend( for ( i = 0; i < (int16_t) ( num_poses * BINAURAL_CHANNELS ); ++i ) { /* note: this is intra-frame heap memory */ - error = CLDFB_RB_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], cldfb_buffer_capacity ); + error = CLDFB_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], cldfb_buffer_capacity ); if ( error != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 85d6c57483..4aad1d076f 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -796,7 +796,7 @@ static void ivas_dirac_dec_binaural_internal( for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_Push( + CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], @@ -874,7 +874,7 @@ static void ivas_dirac_dec_binaural_internal( for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RB_Push( + CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], -- GitLab From c050055e2964622132fd9889faaf037d5eb76fd7 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 11:43:44 +0200 Subject: [PATCH 015/147] Disable VoIP split rendering tests for mixed formats (will be finalised separately) --- tests/split_rendering/test_split_rendering.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index a4bdca36dd..43af49b5f1 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -602,8 +602,9 @@ IN_FORMATS = [ "ISM4", "FOA", "MASA2TC", - "OSBA_ISM3_HOA3", - "OMASA_ISM4", + # Mixed formats to be finalised in a follow-up issue + # "OSBA_ISM3_HOA3", + # "OMASA_ISM4", ] DELAY_PROFILES = ["dly_error_profile_0.dat", "dly_error_profile_5.dat"] @@ -613,7 +614,7 @@ DELAY_PROFILES = ["dly_error_profile_0.dat", "dly_error_profile_5.dat"] # chain to ensure time-scaling and other JBM operations are BE between the two. @pytest.mark.parametrize("in_format", IN_FORMATS) @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) -def test_be_splitrend_vs_binaural( +def test_voip_be_splitrend_vs_binaural( in_format, delay_profile, dut_encoder_frontend, -- GitLab From f88052ca0b0181c541d6019d7e3bad15e8528248 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 11:55:36 +0200 Subject: [PATCH 016/147] Fix formatting --- apps/decoder.c | 98 +++++----- lib_dec/cldfb_ring_buffer.c | 15 +- lib_dec/cldfb_ring_buffer.h | 8 +- lib_dec/ivas_dirac_dec.c | 5 +- lib_dec/ivas_mc_param_dec.c | 5 +- lib_dec/ivas_mc_paramupmix_dec.c | 5 +- lib_dec/ivas_omasa_dec.c | 2 +- lib_dec/ivas_osba_dec.c | 4 +- lib_dec/ivas_output_config.c | 15 +- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 185 +++++++++---------- lib_isar/isar_splitRendererPre.c | 63 ++++--- lib_isar/lib_isar_pre_rend.c | 32 ++-- lib_rend/ivas_dirac_dec_binaural_functions.c | 6 +- 14 files changed, 217 insertions(+), 228 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 0a64284a99..abf7468d2b 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -171,11 +171,12 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, +static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ISAR_SPLIT_REND_BITS_DATA *splitRendBits, + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, #endif - IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); + IVAS_DEC_HANDLE hIvasDec, + int16_t *pcmBuf ); static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, IVAS_DEC_HANDLE hIvasDec, const IVAS_AUDIO_CONFIG OutputConfig, const int32_t output_Fs ); #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); @@ -758,9 +759,9 @@ int main( { error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - &splitRendBits, + &splitRendBits, #endif - hIvasDec, pcmBuf ); + hIvasDec, pcmBuf ); } else { @@ -2456,9 +2457,9 @@ static ivas_error decodeG192( /* decode transport channels, do TSM and feed to renderer */ if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, #ifndef FIX_1119_SPLIT_RENDERING_VOIP - isSplitRend, + isSplitRend, #endif - splitRendBits ) ) != IVAS_ERR_OK ) + splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -3377,37 +3378,36 @@ static ivas_error decodeVoIP( while ( nSamplesRendered < nOutSamples ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - if ( isSplitRend ) - { - if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, + if ( isSplitRend ) + { + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, #ifdef SUPPORT_JBM_TRACEFILE - writeJbmTraceFileFrameWrapper, - jbmTraceWriter, + writeJbmTraceFileFrameWrapper, + jbmTraceWriter, #endif - &bitstreamReadDone, - &nSamplesRendered, - ¶metersAvailableForEditing, - systemTime_ms - ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; + &bitstreamReadDone, + &nSamplesRendered, + ¶metersAvailableForEditing, + systemTime_ms ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } } - } - else - { + else + { #endif #ifdef SUPPORT_JBM_TRACEFILE - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &bitstreamReadDone, &nSamplesRendered, ¶meterAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #endif - { - fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } #ifdef FIX_1119_SPLIT_RENDERING_VOIP - } + } #endif if ( bitstreamReadDone == true ) @@ -3494,11 +3494,11 @@ static ivas_error decodeVoIP( if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - &vec_pos_len, + &vec_pos_len, #else - NULL, + NULL, #endif - delayNumSamples_orig, &delayNumSamples, &delayTimeScale, + delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, &splitRendWriter ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in initOnFirstGoodFrame(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -3526,19 +3526,19 @@ static ivas_error decodeVoIP( if ( !isSplitCoded ) { #endif - if ( delayNumSamples < nOutSamples ) - { - if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + if ( delayNumSamples < nOutSamples ) { - fprintf( stderr, "\nOutput audio file writer error\n" ); - goto cleanup; + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; } - delayNumSamples = 0; - } - else - { - delayNumSamples -= nOutSamples; - } #ifdef FIX_1119_SPLIT_RENDERING_VOIP } #endif @@ -3702,14 +3702,14 @@ static ivas_error decodeVoIP( memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP - if ( afWriter != NULL) + if ( afWriter != NULL ) { #endif - if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); - goto cleanup; - } + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } #ifdef FIX_1119_SPLIT_RENDERING_VOIP } #endif diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index 43a922f1b0..af64749025 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -40,9 +40,10 @@ #ifdef FIX_1119_SPLIT_RENDERING_VOIP -struct CldfbRingBuf { - float* real; - float* imag; +struct CldfbRingBuf +{ + float *real; + float *imag; uint32_t capacity; uint32_t write_pos; uint32_t read_pos; @@ -110,7 +111,7 @@ void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ) return; } -void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float* real, const float* imag, uint16_t num_bands ) +void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float *imag, uint16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); assert( !CLDFB_RINGBUF_IsFull( h ) ); @@ -132,7 +133,7 @@ void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float* real, const float* return; } -void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float* real, float* imag, uint16_t num_bands ) +void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); assert( !CLDFB_RINGBUF_IsEmpty( h ) ); @@ -182,10 +183,10 @@ static uint32_t rb_num_floats( CLDFB_RINGBUF_HANDLE h ) return ret; } -int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float** p_real, float** p_imag, int16_t col_idx ) +int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t col_idx ) { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; - int32_t num_floats = (int32_t) rb_num_floats(h); + int32_t num_floats = (int32_t) rb_num_floats( h ); uint32_t offset; if ( idx < -num_floats || num_floats <= idx ) diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h index 59fbcce5ee..4486f0c628 100644 --- a/lib_dec/cldfb_ring_buffer.h +++ b/lib_dec/cldfb_ring_buffer.h @@ -38,17 +38,17 @@ #ifdef FIX_1119_SPLIT_RENDERING_VOIP -typedef struct CldfbRingBuf* CLDFB_RINGBUF_HANDLE; +typedef struct CldfbRingBuf *CLDFB_RINGBUF_HANDLE; ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ); void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ); -void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float* real, const float* imag, uint16_t num_bands ); +void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float *imag, uint16_t num_bands ); -void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float* real, float* imag, uint16_t num_bands ); +void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16_t num_bands ); -int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float** p_real, float** p_imag, int16_t idx ); +int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t idx ); int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 2ca50dc21f..6c88bab9e6 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1670,10 +1670,9 @@ static void binRenderer_split( #ifdef FIX_1119_SPLIT_RENDERING_VOIP CLDFB_RINGBUF_Push( hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], - Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], + Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], - num_freq_bands - ); + num_freq_bands ); #else mvr2r( Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands ); mvr2r( Cldfb_ImagBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands ); diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 0775d1e15b..bb013b8d78 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1787,12 +1787,11 @@ void ivas_param_mc_dec_render( for ( ch = 0; ch < nchan_out_cldfb; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], - hParamMC->num_freq_bands - ); + hParamMC->num_freq_bands ); #else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], hParamMC->num_freq_bands ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], hParamMC->num_freq_bands ); diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index d5732fec4e..8fddef8ac8 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -791,12 +791,11 @@ static void ivas_mc_paramupmix_dec_sf( for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], - maxBand - ); + maxBand ); #else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index af8465e787..3ea63bfdf3 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -800,7 +800,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( /* note: this intentionally differs from OSBA by: no scaling by 0.5 */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); + CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); v_add( re, Cldfb_RealBuffer, re, num_cldfb_bands ); v_add( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); #else diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 65392ec896..e251f4da7a 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -189,8 +189,8 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( for ( b = 0; b < num_cldfb_bands; b++ ) { - re[b] = 0.5f * re[b] + 0.5f * Cldfb_RealBuffer[b]; - im[b] = 0.5f * im[b] + 0.5f * Cldfb_ImagBuffer[b]; + re[b] = 0.5f * re[b] + 0.5f * Cldfb_RealBuffer[b]; + im[b] = 0.5f * im[b] + 0.5f * Cldfb_ImagBuffer[b]; } #else for ( b = 0; b < num_cldfb_bands; b++ ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index f3e3e1b1cf..b74d2b6d8e 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -499,22 +499,21 @@ RENDERER_TYPE ivas_renderer_secondary_select( renderer_type = RENDERER_DISABLE; output_config = st_ivas->hDecoderConfig->output_config; - if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) #else - output_config == IVAS_AUDIO_CONFIG_BINAURAL + output_config == IVAS_AUDIO_CONFIG_BINAURAL #endif - ) + ) { renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } - else if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && ( - output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB #ifdef FIX_1119_SPLIT_RENDERING_VOIP - || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM + || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM #endif - ) ) + ) ) { renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ef9b8b3d36..a05adf8f88 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -853,7 +853,7 @@ typedef struct #else ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE hMultiBinCldfbData; /*scratch buffer for frame by frame processing*/ #endif - ISAR_SPLIT_REND_BITS_HANDLE hSplitRendBits; /*scratch buffer for frame by frame processing*/ + ISAR_SPLIT_REND_BITS_HANDLE hSplitRendBits; /*scratch buffer for frame by frame processing*/ SPLIT_REND_WRAPPER splitrend; ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE hCldfbDataOut; /*buffer to store cldfb data before binauralization*/ int16_t numTdSamplesPerChannelCached; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 8a0e8f2fa9..0a64b9f352 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -116,9 +116,9 @@ static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_form static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, uint8_t *nTransportChannels, #ifndef FIX_1119_SPLIT_RENDERING_VOIP - const int16_t isSplitRend, + const int16_t isSplitRend, #endif - ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); + ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); static ivas_error apa_setup( IVAS_DEC_HANDLE hIvasDec, const bool isInitialized_voip, const uint16_t nTransportChannels ); static PCM_RESOLUTION pcm_type_API_to_internal( const IVAS_DEC_PCM_TYPE pcmType ); static void *pcm_buffer_offset( void *buffer, const IVAS_DEC_PCM_TYPE pcmType, const int32_t offset ); @@ -1113,9 +1113,9 @@ ivas_error IVAS_DEC_ReadFormat( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetSamplesDecoder( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ #ifndef FIX_1119_SPLIT_RENDERING_VOIP - const int16_t isSplitRend, /* i : split rendering enabled flag */ + const int16_t isSplitRend, /* i : split rendering enabled flag */ #endif ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) @@ -1149,9 +1149,9 @@ ivas_error IVAS_DEC_GetSamplesDecoder( if ( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, #ifndef FIX_1119_SPLIT_RENDERING_VOIP - isSplitRend, + isSplitRend, #endif - splitRendBits ) ) != IVAS_ERR_OK ) + splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -1842,8 +1842,7 @@ ivas_error IVAS_DEC_GetSamplesRenderer( #ifdef FIX_1119_SPLIT_RENDERING_VOIP static int16_t isar_get_frame_size( - Decoder_Struct* st_ivas -) + Decoder_Struct *st_ivas ) { int32_t output_Fs; int16_t nSamplesPerChannel; @@ -1865,11 +1864,11 @@ static int16_t isar_get_frame_size( } static ivas_error isar_render_poses( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ - float** p_head_pose_buf, - int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ - bool *needNewFrame /* o : indication that the decoder needs a new frame */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ + float **p_head_pose_buf, + int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { Decoder_Struct *st_ivas; @@ -1921,9 +1920,9 @@ static ivas_error isar_render_poses( } static ivas_error isar_generate_metadata_and_bitstream( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - float** p_head_pose_buf, - ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + float **p_head_pose_buf, + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { Decoder_Struct *st_ivas; @@ -1964,18 +1963,16 @@ static ivas_error isar_generate_metadata_and_bitstream( hSplitBinRend->hMultiBinCldfbData[i], &p_Cldfb_RealBuffer_Binaural[i][j], &p_Cldfb_ImagBuffer_Binaural[i][j], - 0 - ); - /* Pop the CLDFB column we just saved pointers to. This is fine as long as we use + 0 ); + /* Pop the CLDFB column we just saved pointers to. This is fine as long as we use * the saved columns only before any new columns are pushed to the buffer - the new * columns could potentially overwrite the old columns we wanted to use. * This requirement is fulfilled in this case. */ CLDFB_RINGBUF_Pop( - hSplitBinRend->hMultiBinCldfbData[i], + hSplitBinRend->hMultiBinCldfbData[i], NULL, NULL, - CLDFB_NO_CHANNELS_MAX - ); + CLDFB_NO_CHANNELS_MAX ); } } } @@ -2038,7 +2035,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( Decoder_Struct *st_ivas; ivas_error error; float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; - float* p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + float *p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; int32_t i; int16_t pcm_out_flag; int16_t numSamplesPerChannelToOutput; @@ -2050,21 +2047,21 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( error = IVAS_ERR_UNKNOWN; st_ivas = hIvasDec->st_ivas; - + if ( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 ) { return IVAS_ERR_WRONG_PARAMS; } pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; - numSamplesPerChannelToOutput = isar_get_frame_size(st_ivas); + numSamplesPerChannelToOutput = isar_get_frame_size( st_ivas ); for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { p_head_pose_buf[i] = head_pose_buf[i]; } - if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame)) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) { return error; } @@ -2297,10 +2294,10 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( *---------------------------------------------------------------------*/ static ivas_error ivas_dec_setup_all( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */ #ifndef FIX_1119_SPLIT_RENDERING_VOIP - const int16_t isSplitRend, /* i : split rendering enabled flag */ + const int16_t isSplitRend, /* i : split rendering enabled flag */ #endif ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) @@ -3698,23 +3695,23 @@ static ivas_error ivas_dec_voip_get_samples_common ivas_error IVAS_DEC_VoIP_GetSamples #endif -( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ - void *pcmBuf, /* o : output synthesis signal */ + ( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ + void *pcmBuf, /* o : output synthesis signal */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ #endif #ifdef SUPPORT_JBM_TRACEFILE - JbmTraceFileWriterFn jbmWriterFn, - void *jbmWriter, + JbmTraceFileWriterFn jbmWriterFn, + void *jbmWriter, #endif - bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ - uint16_t *nSamplesRendered, /* o : number of samples rendered */ - bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ - const uint32_t systemTimestamp_ms /* i : current system timestamp */ -) + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const uint32_t systemTimestamp_ms /* i : current system timestamp */ + ) { Decoder_Struct *st_ivas; DECODER_CONFIG_HANDLE hDecoderConfig; @@ -3729,7 +3726,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples #ifdef FIX_1119_SPLIT_RENDERING_VOIP int32_t i; float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; - float* p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + float *p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; #endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->hVoIP == NULL ) @@ -3901,13 +3898,13 @@ ivas_error IVAS_DEC_VoIP_GetSamples { if ( hIvasDec->nSamplesAvailableNext == 0 || hIvasDec->nSamplesAvailableNext == hIvasDec->nSamplesFrame ) { - if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - splitRendBits + splitRendBits #else - 0, NULL + 0, NULL #endif - ) ) != IVAS_ERR_OK ) + ) ) != IVAS_ERR_OK ) { return error; } @@ -3930,7 +3927,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples } #ifdef FIX_1119_SPLIT_RENDERING_VOIP - if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { /* Move output pointers forward */ for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) @@ -3939,7 +3936,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples } /* Render head poses from time-scaled transport channels */ - if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, &nSamplesRendered_loop, &tmp )) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) { return error; } @@ -3947,11 +3944,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples else { #endif - /* render IVAS frames directly to the output buffer */ - if ( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesToRender, pcmType, pcm_buffer_offset( pcmBuf, pcmType, *nSamplesRendered * nOutChannels ), &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + if ( ( error = IVAS_DEC_GetSamplesRenderer( hIvasDec, nSamplesToRender, pcmType, pcm_buffer_offset( pcmBuf, pcmType, *nSamplesRendered * nOutChannels ), &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } #ifdef FIX_1119_SPLIT_RENDERING_VOIP } #endif @@ -3962,9 +3959,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples } #ifdef FIX_1119_SPLIT_RENDERING_VOIP - if ( hIvasDec->hasDecodedFirstGoodFrame && - ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || - hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + if ( hIvasDec->hasDecodedFirstGoodFrame && + ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || + hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { /* Set pointers to beginning of head pose buffers */ for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) @@ -3983,18 +3980,18 @@ ivas_error IVAS_DEC_VoIP_GetSamples { if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { - #ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER ivas_limiter_dec( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); - #endif +#endif } else { ivas_limiter_dec( st_ivas->hLimiter, p_head_pose_buf, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); } - #ifdef DEBUGGING +#ifdef DEBUGGING st_ivas->noClipping += - #endif +#endif ivas_syn_output( p_head_pose_buf, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) pcmBuf ); } } @@ -4010,7 +4007,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples * Main function to decode one frame in VoIP *---------------------------------------------------------------------*/ -ivas_error IVAS_DEC_VoIP_GetSamples ( +ivas_error IVAS_DEC_VoIP_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ @@ -4026,37 +4023,36 @@ ivas_error IVAS_DEC_VoIP_GetSamples ( ) { return ivas_dec_voip_get_samples_common( - hIvasDec, - nSamplesPerChannel, - pcmType, - pcmBuf, - NULL, + hIvasDec, + nSamplesPerChannel, + pcmType, + pcmBuf, + NULL, #ifdef SUPPORT_JBM_TRACEFILE - jbmWriterFn, - jbmWriter, + jbmWriterFn, + jbmWriter, #endif - bitstreamReadDone, - nSamplesRendered, - parametersAvailableForEditing, - systemTimestamp_ms - ); + bitstreamReadDone, + nSamplesRendered, + parametersAvailableForEditing, + systemTimestamp_ms ); } /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ - void *pcmBuf, /* o : output synthesis signal */ - ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + void *pcmBuf, /* o : output synthesis signal */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, - void* jbmWriter + void *jbmWriter #endif , - bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ - uint16_t *nSamplesRendered, /* o : number of samples rendered */ - bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ - const uint32_t systemTimestamp_ms /* i : current system timestamp */ + bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ + const uint32_t systemTimestamp_ms /* i : current system timestamp */ ) { ivas_error error = IVAS_ERR_UNKNOWN; @@ -4069,20 +4065,19 @@ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( } return ivas_dec_voip_get_samples_common( - hIvasDec, - nSamplesPerChannel, - IVAS_DEC_PCM_INT16, - pcmBuf, - splitRendBits, + hIvasDec, + nSamplesPerChannel, + IVAS_DEC_PCM_INT16, + pcmBuf, + splitRendBits, #ifdef SUPPORT_JBM_TRACEFILE - jbmWriterFn, - jbmWriter, + jbmWriterFn, + jbmWriter, #endif - bitstreamReadDone, - nSamplesRendered, - parametersAvailableForEditing, - systemTimestamp_ms - ); + bitstreamReadDone, + nSamplesRendered, + parametersAvailableForEditing, + systemTimestamp_ms ); } #endif diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 94aabfe3ce..370e02398d 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -55,13 +55,14 @@ static void isar_SplitRenderer_GetRotMd( ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float* Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], - float* Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], + float *Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], + float *Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], #else - float Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], #endif - const int16_t low_res, const int16_t ro_md_flag ); + const int16_t low_res, + const int16_t ro_md_flag ); /*------------------------------------------------------------------------- @@ -288,8 +289,8 @@ static void ComputeBandedCrossCov( #endif const int16_t ch_start_idx1, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float* Cldfb_RealBuffer2[][CLDFB_NO_COL_MAX], - float* Cldfb_ImagBuffer2[][CLDFB_NO_COL_MAX], + float *Cldfb_RealBuffer2[][CLDFB_NO_COL_MAX], + float *Cldfb_ImagBuffer2[][CLDFB_NO_COL_MAX], #else float Cldfb_RealBuffer2[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer2[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -359,8 +360,8 @@ static void ComputeBandedCrossCov( static void ComputeBandedCov( #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float * Cldfb_RealBuffer[][CLDFB_NO_COL_MAX], - float * Cldfb_ImagBuffer[][CLDFB_NO_COL_MAX], + float *Cldfb_RealBuffer[][CLDFB_NO_COL_MAX], + float *Cldfb_ImagBuffer[][CLDFB_NO_COL_MAX], #else float Cldfb_RealBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -1368,11 +1369,11 @@ static void isar_SplitRenderer_quant_code( *------------------------------------------------------------------------*/ static void isar_SplitRenderer_GetRotMd( - ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i/o: binaural renderer handle */ - MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i/o: binaural renderer handle */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ - float *Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ + float *Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ + float *Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX], /* o : Reference Binaural signals */ #else float Cldfb_RealBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Reference Binaural signals */ float Cldfb_ImagBuffer_Ref_Binaural[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : Reference Binaural signals */ @@ -1458,20 +1459,20 @@ static void isar_SplitRenderer_GetRotMd( *------------------------------------------------------------------------*/ void isar_rend_CldfbSplitPreRendProcess( - const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i : binaural pre-renderer handle */ - const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ - MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ + const ISAR_BIN_HR_SPLIT_PRE_REND_HANDLE hBinHrSplitPreRend, /* i : binaural pre-renderer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i : Binaural signals, real part */ - float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i : Binaural signals, imag. part */ + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i : Binaural signals, real part */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i : Binaural signals, imag. part */ #else - float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, real part */ - float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, imag. part */ + float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, real part */ + float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Binaural signals, imag. part */ #endif - ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ - const int32_t target_md_bits, /* i : ISAR MD bitrate */ - const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ - const int16_t ro_md_flag /* i : real only metadata for yaw flag */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits handle */ + const int32_t target_md_bits, /* i : ISAR MD bitrate */ + const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ + const int16_t ro_md_flag /* i : real only metadata for yaw flag */ ) { push_wmops( "isar_rend_CldfbSplitPreRendProcess" ); @@ -1943,7 +1944,7 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( #ifdef FIX_1119_SPLIT_RENDERING_VOIP for ( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) { - for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) { p_Cldfb_In_BinReal[i][j] = Cldfb_In_BinReal[i][j]; p_Cldfb_In_BinImag[i][j] = Cldfb_In_BinImag[i][j]; @@ -2026,8 +2027,7 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( pBits, target_md_bits, low_res_pre_rend_rot, - ro_md_flag - ); + ro_md_flag ); } if ( pcm_out_flag == 0 ) @@ -2052,8 +2052,7 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( Cldfb_In_BinImag, #endif available_bits, - pBits - ); + pBits ); } else { @@ -2114,10 +2113,10 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( *------------------------------------------------------------------------*/ void lc3plusTimeAlignCldfbPoseCorr( - SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renderer handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ - float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX] /* i/o: Binaural signals, imag. part */ + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX] /* i/o: Binaural signals, imag. part */ #else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: Binaural signals, real part */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* ii/: Binaural signals, imag. part */ diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 22807d1300..23ff136c51 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -273,27 +273,27 @@ void ISAR_PRE_REND_GetMultiBinPoseData( * *------------------------------------------------------------------------*/ -ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural ( - SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ - const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ - const int32_t SplitRendBitRate, /* i : Split renderer bitrate */ - ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ - const int16_t isar_frame_size_ms, /* i : ISAR framesize */ - int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ - ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ +ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + const int32_t SplitRendBitRate, /* i : Split renderer bitrate */ + ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ + const int16_t isar_frame_size_ms, /* i : ISAR framesize */ + int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float* Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ - float* Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ #else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB real buffer */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB imag buffer */ #endif - const int16_t max_bands, /* i : CLDFB bands */ - float *output[], /* i/o: PCM in/out buffer */ - const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ - const int16_t cldfb_in_flag, /* i : Flag to indicate CLDFB or time doamin input */ - const int16_t pcm_out_flag, /* i : Flag to indicate PCM output */ - const int16_t ro_md_flag /* i : Flag to indicate real only metadata for yaw */ + const int16_t max_bands, /* i : CLDFB bands */ + float *output[], /* i/o: PCM in/out buffer */ + const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ + const int16_t cldfb_in_flag, /* i : Flag to indicate CLDFB or time doamin input */ + const int16_t pcm_out_flag, /* i : Flag to indicate PCM output */ + const int16_t ro_md_flag /* i : Flag to indicate real only metadata for yaw */ ) { ivas_error error; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 4aad1d076f..33328e365c 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -800,8 +800,7 @@ static void ivas_dirac_dec_binaural_internal( st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], - CLDFB_NO_CHANNELS_MAX - ); + CLDFB_NO_CHANNELS_MAX ); #else mvr2r( tmp_Cldfb_out_re[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); mvr2r( tmp_Cldfb_out_im[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); @@ -878,8 +877,7 @@ static void ivas_dirac_dec_binaural_internal( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], - CLDFB_NO_CHANNELS_MAX - ); + CLDFB_NO_CHANNELS_MAX ); #else mvr2r( tmp_Cldfb_out_re[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); mvr2r( tmp_Cldfb_out_im[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); -- GitLab From a236486e232f4ddce6c9c88080e8e68f8248211e Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 12:00:42 +0200 Subject: [PATCH 017/147] Remove unused variable --- lib_dec/ivas_dirac_dec.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 6c88bab9e6..07c164d222 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1637,7 +1637,9 @@ static void binRenderer_split( float Cldfb_ImagBuffer_Binaural[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ +#ifndef FIX_1119_SPLIT_RENDERING_VOIP const int16_t slot_idx_start, +#endif const int16_t num_freq_bands, const int16_t nchan_out ) { @@ -2397,7 +2399,13 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { binRenderer_split( st_ivas->hBinRenderer, st_ivas->hSplitBinRend, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx], - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer, slot_idx_start, hSpatParamRendCom->num_freq_bands, st_ivas->hDecoderConfig->nchan_out ); + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer, slot_idx_start, hSpatParamRendCom->num_freq_bands +#ifndef FIX_1119_SPLIT_RENDERING_VOIP + , + st_ivas->hDecoderConfig->nchan_out +#endif + ); + } else { -- GitLab From e95780d9134e3c3535ccbf8ef4a066b4a7e1acce Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 12:02:51 +0200 Subject: [PATCH 018/147] Fix formatting again --- lib_dec/ivas_dirac_dec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 07c164d222..c1445a2c87 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2404,8 +2404,7 @@ void ivas_dirac_dec_render_sf( , st_ivas->hDecoderConfig->nchan_out #endif - ); - + ); } else { -- GitLab From e8c2162d2d15a7e1fbb95a76941d8ad190604edb Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 12:09:20 +0200 Subject: [PATCH 019/147] Fix msvc warnings --- lib_dec/lib_dec.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0a64b9f352..d40da41681 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2061,7 +2061,8 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( p_head_pose_buf[i] = head_pose_buf[i]; } - if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) + error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ); + if ( error != IVAS_ERR_OK ) { return error; } @@ -2070,7 +2071,8 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_OK; } - if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ) ) ) + error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); + if ( error != IVAS_ERR_OK ) { return error; } @@ -3970,7 +3972,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples } /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ - if ( ( error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ) ) ) + error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); + if ( error != IVAS_ERR_OK ) { return error; } -- GitLab From fad8d217b58631feafb08f47027cf981b0fe1587 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 12:16:34 +0200 Subject: [PATCH 020/147] Add new files to msvc workspace --- Workspace_msvc/lib_dec.vcxproj | 4 +++- Workspace_msvc/lib_dec.vcxproj.filters | 8 +++++++- lib_dec/cldfb_ring_buffer.h | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 3c7ea3e597..944e264667 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -147,6 +147,7 @@ + @@ -312,6 +313,7 @@ + @@ -348,4 +350,4 @@ - \ No newline at end of file + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 8eddbb60a0..5197d66457 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -277,6 +277,9 @@ decoder_all_c + + decoder_all_c + decoder_all_c @@ -517,6 +520,9 @@ + + decoder_h + decoder_h @@ -569,4 +575,4 @@ {c33b80b3-67ce-466b-91c0-4adfc9efcb5c} - \ No newline at end of file + diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h index 4486f0c628..20979174c6 100644 --- a/lib_dec/cldfb_ring_buffer.h +++ b/lib_dec/cldfb_ring_buffer.h @@ -30,8 +30,8 @@ *******************************************************************************************************/ -#ifndef CLDFB_RINGBUF_H -#define CLDFB_RINGBUF_H +#ifndef CLDFB_RING_BUFFER_H +#define CLDFB_RING_BUFFER_H #include "ivas_error.h" #include -- GitLab From 2ba5e1a27f4f3722751d0303317f13d4abd4bacd Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 12:24:54 +0200 Subject: [PATCH 021/147] Fix new msvc warnings --- lib_dec/cldfb_ring_buffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index af64749025..fab273bd63 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -163,7 +163,7 @@ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16 static uint32_t rb_num_floats( CLDFB_RINGBUF_HANDLE h ) { - uint16_t ret; + uint32_t ret; if ( CLDFB_RINGBUF_IsFull( h ) ) { @@ -223,7 +223,7 @@ int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ) uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ) { - return rb_num_floats( h ) / CLDFB_NO_CHANNELS_MAX; + return (uint16_t) ( rb_num_floats( h ) / CLDFB_NO_CHANNELS_MAX ); } #endif -- GitLab From 263aa417281f19f23ad180df1c9c5bdba2456274 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 12:35:21 +0200 Subject: [PATCH 022/147] Increase timeout for test cases in split-rendering-smoke-test --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8e3e1cba90..11589a6fc4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -680,7 +680,7 @@ split-rendering-smoke-test: stage: test script: - make -j - - testcase_timeout=10 + - testcase_timeout=15 - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" -- GitLab From b2bbac705eff9fef4697e6bc138e6b3d50a22ba7 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 13:30:28 +0200 Subject: [PATCH 023/147] Increase timeout even more for test cases in split-rendering-smoke-test --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 11589a6fc4..0337687ed9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -680,7 +680,7 @@ split-rendering-smoke-test: stage: test script: - make -j - - testcase_timeout=15 + - testcase_timeout=20 - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" -- GitLab From f622375e99a8caef9e185a4309aab2f3e01df4d7 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 13:52:22 +0200 Subject: [PATCH 024/147] Fix wrong argument removed --- lib_dec/ivas_dirac_dec.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c1445a2c87..16ca09a42e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2399,11 +2399,11 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { binRenderer_split( st_ivas->hBinRenderer, st_ivas->hSplitBinRend, st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx], - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer, slot_idx_start, hSpatParamRendCom->num_freq_bands + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer, #ifndef FIX_1119_SPLIT_RENDERING_VOIP - , - st_ivas->hDecoderConfig->nchan_out + slot_idx_start, #endif + hSpatParamRendCom->num_freq_bands, st_ivas->hDecoderConfig->nchan_out ); } else -- GitLab From 74cf1096d7c724b17286bf96505f22294577cf88 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 14:08:38 +0200 Subject: [PATCH 025/147] Fix formatting again, again --- lib_dec/ivas_dirac_dec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 16ca09a42e..df747b0d1e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2403,8 +2403,7 @@ void ivas_dirac_dec_render_sf( #ifndef FIX_1119_SPLIT_RENDERING_VOIP slot_idx_start, #endif - hSpatParamRendCom->num_freq_bands, st_ivas->hDecoderConfig->nchan_out - ); + hSpatParamRendCom->num_freq_bands, st_ivas->hDecoderConfig->nchan_out ); } else { -- GitLab From 5f8e03b45ad3a3d174ab6a8125131d7756ac000d Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 26 Jun 2025 14:13:09 +0200 Subject: [PATCH 026/147] Increase timeout (again) for test cases in split-rendering-smoke-test --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0337687ed9..9ca78cbe07 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -680,7 +680,7 @@ split-rendering-smoke-test: stage: test script: - make -j - - testcase_timeout=20 + - testcase_timeout=30 - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" -- GitLab From 53cd2f556a2c4e9a27500da4099ae1e5e41979ae Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 27 Jun 2025 15:20:50 +0200 Subject: [PATCH 027/147] Fix merge error that broke CLDFB path in split rendering --- lib_dec/ivas_dirac_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index df747b0d1e..b075df36b9 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1672,8 +1672,8 @@ static void binRenderer_split( #ifdef FIX_1119_SPLIT_RENDERING_VOIP CLDFB_RINGBUF_Push( hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], - Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], - Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], + Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], + Cldfb_ImagBuffer_Binaural_loc[pos_idx][ch][slot_idx], num_freq_bands ); #else mvr2r( Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_idx_start + slot_idx], num_freq_bands ); -- GitLab From bd046407fd5eef4531676baa26326d7b4ca77bfd Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 27 Jun 2025 16:10:38 +0200 Subject: [PATCH 028/147] Do not overwrite BFI status in ISAR_post_rend --- apps/isar_post_rend.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index 843bbe85c1..9595c8d380 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -1110,10 +1110,13 @@ int main( #ifdef FIX_1119_SPLIT_RENDERING_VOIP /* Set BFI if frame is empty */ int16_t frameEmpty = (int16_t) ( bitsBuffer.config.bitsWritten == 0 ); - if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, frameEmpty ) ) != IVAS_ERR_OK ) + if ( frameEmpty ) { - fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); - goto cleanup; + if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, 1 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } } #endif } -- GitLab From 6f1bb9ec7b70cbebe36a6d81d879107c29f7aed2 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 30 Jun 2025 10:57:28 +0200 Subject: [PATCH 029/147] Move test_voip_be_splitrend_vs_binaural into a separate file and CI job --- .gitlab-ci.yml | 24 ++- tests/split_rendering/test_split_rendering.py | 119 +------------- .../test_voip_be_splitrend_vs_binaural.py | 152 ++++++++++++++++++ tests/test_be_for_jbm_neutral_dly_profile.py | 4 +- 4 files changed, 178 insertions(+), 121 deletions(-) create mode 100644 tests/split_rendering/test_voip_be_splitrend_vs_binaural.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9ca78cbe07..ff74e8f7e3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -680,7 +680,7 @@ split-rendering-smoke-test: stage: test script: - make -j - - testcase_timeout=30 + - testcase_timeout=10 - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" @@ -693,6 +693,28 @@ split-rendering-smoke-test: junit: - report-junit.xml +# test split rendering in VoIP mode against BINAURAL output +split-rendering-voip-be-to-binaural: + extends: + - .test-job-linux + - .rules-merge-request-to-main + needs: ["build-codec-linux-make"] + stage: test + script: + - make -j + - testcase_timeout=30 + - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_voip_be_splitrend_vs_binaural.py --testcase_timeout=$testcase_timeout + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + expose_as: "VoIP split rendering vs BINAURAL make pytest results" + reports: + junit: + - report-junit.xml + lc3-wrapper-unit-test: extends: - .test-job-linux diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index 43af49b5f1..71db62a4b3 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -32,19 +32,9 @@ import pytest -from tempfile import TemporaryDirectory -from pathlib import Path -import filecmp - from tests.split_rendering.utils import * -from tests.split_rendering.constants import SCRIPTS_DIR, TESTV_DIR -from tests.test_be_for_jbm_neutral_dly_profile import ( - INPUT_FILES, - get_options_cod, -) -from split_rendering.isar_bstool import IsarBitstream -from pyaudio3dtools import audioarray, audiofile + """ Ambisonics """ @@ -595,110 +585,3 @@ def test_framing_combinations_full_chain_split( get_odg=get_odg, get_odg_bin=get_odg_bin, ) - - -IN_FORMATS = [ - "MC_5_1", - "ISM4", - "FOA", - "MASA2TC", - # Mixed formats to be finalised in a follow-up issue - # "OSBA_ISM3_HOA3", - # "OMASA_ISM4", -] - -DELAY_PROFILES = ["dly_error_profile_0.dat", "dly_error_profile_5.dat"] - - -# Compares PCM output and tracefile from a VoIP BINAURAL_SPLIT_PCM chain with equivalent BINAURAL -# chain to ensure time-scaling and other JBM operations are BE between the two. -@pytest.mark.parametrize("in_format", IN_FORMATS) -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) -def test_voip_be_splitrend_vs_binaural( - in_format, - delay_profile, - dut_encoder_frontend, - dut_decoder_frontend, - bitrate=128000, -): - with TemporaryDirectory() as tmp_dir: - tmp_dir = Path(tmp_dir) - - sampling_rate_khz = 48 - delay_profile_path = SCRIPTS_DIR / "dly_error_profiles" / delay_profile - delay_profile_id = int(delay_profile[-5]) - - # run encoder - bitstream_file = (tmp_dir / f"{in_format}-dly{delay_profile_id}.192").absolute() - dtx = False - wav_in = TESTV_DIR / INPUT_FILES[in_format] - dut_encoder_frontend.run( - bitrate, - sampling_rate_khz, - wav_in, - bitstream_file, - add_option_list=get_options_cod(in_format, dtx), - run_dir=tmp_dir, - ) - - def run_decoder(out_format): - options = [] - - # Head trajectory must be static due to the slight time shift between audio outputs of BINAURAL/SPLIT_PCM - head_traj = Path(SCRIPTS_DIR / "trajectories/const000.csv") - options.extend(["-T", str(head_traj)]) - - wav_out = ( - tmp_dir - / f"{in_format}-{bitrate}-{out_format}-dly{delay_profile_id}.wav" - ).absolute() - - trace_out = wav_out.with_suffix(".trace") - options.extend(["-Tracefile", str(trace_out)]) - - if out_format == "BINAURAL_SPLIT_PCM": - isar_md_file = wav_out.with_suffix(".isarmd") - options.extend(["-om", str(isar_md_file)]) - else: - isar_md_file = None - - dut_decoder_frontend.run( - out_format, - sampling_rate_khz, - bitstream_file, - wav_out, - netsim_profile=delay_profile_path, - add_option_list=options, - ) - - return wav_out, trace_out, isar_md_file - - wav_out_bin, trace_out_bin, _ = run_decoder("BINAURAL") - wav_out_sr, trace_out_sr, isar_md_out_sr = run_decoder("BINAURAL_SPLIT_PCM") - - # Delay-align audio - assert isar_md_out_sr is not None - sr_delay_samples = IsarBitstream(isar_md_out_sr).delay_samples - audio_sr, _ = audiofile.readfile(str(wav_out_sr)) - audio_bin, _ = audiofile.readfile(str(wav_out_bin)) - audio_sr = audio_sr[sr_delay_samples:] - audio_bin = audio_bin[:-sr_delay_samples] - - # Ensure audio and tracefiles are BE - audio_cmp_result = audioarray.compare( - audio_bin, audio_sr, fs=sampling_rate_khz * 1000, per_frame=False - ) - tracefiles_equal = filecmp.cmp(trace_out_bin, trace_out_sr) - failed = not audio_cmp_result["bitexact"] or not tracefiles_equal - if failed: - message = [] - if not audio_cmp_result["bitexact"]: - message.append( - "Difference found between delay-aligned BINAURAL audio and BINAURAL_SPLIT_PCM audio! " - f"Max abs diff: {audio_cmp_result['max_abs_diff']}" - ) - if not tracefiles_equal: - message.append( - "Difference found between BINAURAL tracefile and BINAURAL_SPLIT_PCM tracefile!" - ) - pytest.fail("; ".join(message)) diff --git a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py new file mode 100644 index 0000000000..1df8c05634 --- /dev/null +++ b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 + +""" + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" + +import pytest + +from tempfile import TemporaryDirectory +from pathlib import Path +import filecmp + +from tests.split_rendering.utils import * +from tests.split_rendering.constants import SCRIPTS_DIR, TESTV_DIR +from tests.test_be_for_jbm_neutral_dly_profile import ( + INPUT_FILES, + get_options_cod, +) +from split_rendering.isar_bstool import IsarBitstream +from pyaudio3dtools import audioarray, audiofile + +IN_FORMATS = [ + "MC_5_1", + "ISM4", + "FOA", + "MASA2TC", + # Mixed formats to be finalised in a follow-up issue + # "OSBA_ISM3_HOA3", + # "OMASA_ISM4", +] + +DELAY_PROFILES = ["dly_error_profile_0.dat", "dly_error_profile_5.dat"] + + +# Compares PCM output and tracefile from a VoIP BINAURAL_SPLIT_PCM chain with equivalent BINAURAL +# chain to ensure time-scaling and other JBM operations are BE between the two. +@pytest.mark.parametrize("in_format", IN_FORMATS) +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) +def test_voip_be_splitrend_vs_binaural( + in_format, + delay_profile, + dut_encoder_frontend, + dut_decoder_frontend, + bitrate=128000, +): + with TemporaryDirectory() as tmp_dir: + tmp_dir = Path(tmp_dir) + + sampling_rate_khz = 48 + delay_profile_path = SCRIPTS_DIR / "dly_error_profiles" / delay_profile + delay_profile_id = int(delay_profile[-5]) + + # run encoder + bitstream_file = (tmp_dir / f"{in_format}-dly{delay_profile_id}.192").absolute() + dtx = False + wav_in = TESTV_DIR / INPUT_FILES[in_format] + dut_encoder_frontend.run( + bitrate, + sampling_rate_khz, + wav_in, + bitstream_file, + add_option_list=get_options_cod(in_format, dtx), + run_dir=tmp_dir, + ) + + def run_decoder(out_format): + options = [] + + # Head trajectory must be static due to the slight time shift between audio outputs of BINAURAL/SPLIT_PCM + head_traj = Path(SCRIPTS_DIR / "trajectories/const000.csv") + options.extend(["-T", str(head_traj)]) + + wav_out = ( + tmp_dir + / f"{in_format}-{bitrate}-{out_format}-dly{delay_profile_id}.wav" + ).absolute() + + trace_out = wav_out.with_suffix(".trace") + options.extend(["-Tracefile", str(trace_out)]) + + if out_format == "BINAURAL_SPLIT_PCM": + isar_md_file = wav_out.with_suffix(".isarmd") + options.extend(["-om", str(isar_md_file)]) + else: + isar_md_file = None + + dut_decoder_frontend.run( + out_format, + sampling_rate_khz, + bitstream_file, + wav_out, + netsim_profile=delay_profile_path, + add_option_list=options, + ) + + return wav_out, trace_out, isar_md_file + + wav_out_bin, trace_out_bin, _ = run_decoder("BINAURAL") + wav_out_sr, trace_out_sr, isar_md_out_sr = run_decoder("BINAURAL_SPLIT_PCM") + + # Delay-align audio + assert isar_md_out_sr is not None + sr_delay_samples = IsarBitstream(isar_md_out_sr).delay_samples + audio_sr, _ = audiofile.readfile(str(wav_out_sr)) + audio_bin, _ = audiofile.readfile(str(wav_out_bin)) + audio_sr = audio_sr[sr_delay_samples:] + audio_bin = audio_bin[:-sr_delay_samples] + + # Ensure audio and tracefiles are BE + audio_cmp_result = audioarray.compare( + audio_bin, audio_sr, fs=sampling_rate_khz * 1000, per_frame=False + ) + tracefiles_equal = filecmp.cmp(trace_out_bin, trace_out_sr) + failed = not audio_cmp_result["bitexact"] or not tracefiles_equal + if failed: + message = [] + if not audio_cmp_result["bitexact"]: + message.append( + "Difference found between delay-aligned BINAURAL audio and BINAURAL_SPLIT_PCM audio! " + f"Max abs diff: {audio_cmp_result['max_abs_diff']}" + ) + if not tracefiles_equal: + message.append( + "Difference found between BINAURAL tracefile and BINAURAL_SPLIT_PCM tracefile!" + ) + pytest.fail("; ".join(message)) diff --git a/tests/test_be_for_jbm_neutral_dly_profile.py b/tests/test_be_for_jbm_neutral_dly_profile.py index 0e2b2420f1..c755c11e6b 100644 --- a/tests/test_be_for_jbm_neutral_dly_profile.py +++ b/tests/test_be_for_jbm_neutral_dly_profile.py @@ -101,7 +101,7 @@ def is_split_rend(format) -> bool: def get_options_cod(in_format, dtx): - # NOTE: this function is shared with another test in tests/split_rendering/test_split_rendering.py + # NOTE: this function is shared with another test in tests/split_rendering/test_voip_be_splitrend_vs_binaural.py options = list() if dtx: @@ -169,7 +169,7 @@ def get_options_dec( return options -# NOTE: this list is shared with another test in tests/split_rendering/test_split_rendering.py +# NOTE: this list is shared with another test in tests/split_rendering/test_voip_be_splitrend_vs_binaural.py INPUT_FILES = { "stereo": "stvST48n.wav", "ISM1": "stv1ISM48s.wav", -- GitLab From cbffa05dbbe6d730858d0131362919320259f2e6 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 30 Jun 2025 11:46:06 +0200 Subject: [PATCH 030/147] Add documentation to cldfb_ring_buffer.h --- lib_dec/cldfb_ring_buffer.h | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h index 20979174c6..3403bc1add 100644 --- a/lib_dec/cldfb_ring_buffer.h +++ b/lib_dec/cldfb_ring_buffer.h @@ -40,20 +40,70 @@ typedef struct CldfbRingBuf *CLDFB_RINGBUF_HANDLE; +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_Open( ) + * + * Allocate a ring buffer for CLDFB data with the given capacity of CLDFB columns. + * Each column is expected to contain at most CLDFB_NO_CHANNELS_MAX frequency bands. + * + * May return IVAS_ERR_FAILED_ALLOC on failed allocation, or IVAS_ERR_OK otherwise. + *---------------------------------------------------------------------*/ ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_Close( ) + * + * Dellocate CLDFB ring buffer. The given handle will be set to NULL. + *---------------------------------------------------------------------*/ void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_Push( ) + * + * Push a single column onto the back of the CLDFB ring buffer from real and imag arrays. + *---------------------------------------------------------------------*/ void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float *imag, uint16_t num_bands ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_Pop( ) + * + * Pop a single column from the front of the CLDFB ring buffer into real and imag arrays. + *---------------------------------------------------------------------*/ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16_t num_bands ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_GetByIdx( ) + * + * Get pointers into a specific column in the CLDFB ring buffer based on given index. + * Non-negative indices access from the front of the ring buffer, negative indexes access + * from the back, similar to Python arrays. For example: + * + * - index 0 accesses the front of the buffer, i.e. the oldest CLDFB column in the queue. + * - index -1 accesses the back of the buffer, i.e. the newest (last pushed) CLDFB column in the queue. + * + * Returns -1 if given an invalid index (p_real and p_imag will be set to NULL in that case), or 0 otherwise. + *---------------------------------------------------------------------*/ int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t idx ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_IsEmpty( ) + * + * Returns 1 if the ring buffer is empty, or 0 otherwise. + *---------------------------------------------------------------------*/ int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_IsFull( ) + * + * Returns 1 if the ring buffer is full, or 0 otherwise. + *---------------------------------------------------------------------*/ int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ); +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_Size( ) + * + * Returns the number of CLDFB columns currently stored in the ring buffer. + *---------------------------------------------------------------------*/ uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ); #endif /* FIX_1119_SPLIT_RENDERING_VOIP */ -- GitLab From 460039173e01a9ded385763630ea2fa5b5c50366 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 30 Jun 2025 12:07:06 +0200 Subject: [PATCH 031/147] Fix copyright date --- scripts/split_rendering/isar_bstool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/split_rendering/isar_bstool.py b/scripts/split_rendering/isar_bstool.py index 6b1e53b662..735d221f49 100755 --- a/scripts/split_rendering/isar_bstool.py +++ b/scripts/split_rendering/isar_bstool.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other -- GitLab From 41c559e5fe14851a71839bbb772facb25dcf8226 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 30 Jun 2025 16:44:50 +0200 Subject: [PATCH 032/147] Clean up whitespace --- tests/split_rendering/test_split_rendering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index 71db62a4b3..a881a7ad23 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -34,7 +34,7 @@ import pytest from tests.split_rendering.utils import * - + """ Ambisonics """ -- GitLab From 514658b5111ac672a3670ca27413cbc6c93a492f Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 30 Jun 2025 16:47:32 +0200 Subject: [PATCH 033/147] Remove leftover TODO (already resolved on main) --- tests/test_be_for_jbm_neutral_dly_profile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_be_for_jbm_neutral_dly_profile.py b/tests/test_be_for_jbm_neutral_dly_profile.py index c755c11e6b..8642bc5658 100644 --- a/tests/test_be_for_jbm_neutral_dly_profile.py +++ b/tests/test_be_for_jbm_neutral_dly_profile.py @@ -210,7 +210,6 @@ def compare_audio(non_voip_output, voip_output, sampling_rate_khz): x_jbm, _ = audiofile.readfile(voip_output) # strip jbm delay - # TODO: this may need to be adapted to handle variable offsets based on outcome of #1122 cmp_result = audioarray.compare( x, x_jbm, -- GitLab From db229008338ccc6ee8f5f305d5daaf46b0cf801a Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 1 Jul 2025 10:06:53 +0200 Subject: [PATCH 034/147] Add issue number to TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR switch --- lib_com/options.h | 2 +- lib_dec/ivas_jbm_dec.c | 2 +- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4260d7894c..1fc99e7c72 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,7 +161,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ -#define TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Workaround for incorrect implementation of decoder flush with split rendering */ +#define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1335_EXTREND_RETCODE /* FhG: Add modification of returncode for external renderer when an error occurs */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 15a6898f75..835f896efa 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1312,7 +1312,7 @@ ivas_error ivas_jbm_dec_render( if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { nchan_out_syn_output = BINAURAL_CHANNELS * st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; -#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR if ( st_ivas->flushing ) { nchan_out_syn_output = BINAURAL_CHANNELS; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index a05adf8f88..53651d186a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1147,7 +1147,7 @@ typedef struct Decoder_Struct int16_t ism_extmeta_active; /* Extended metadata active in decoder */ int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */ -#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR int16_t flushing; #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index d40da41681..b57971b897 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4134,7 +4134,7 @@ ivas_error IVAS_DEC_Flush( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR hIvasDec->st_ivas->flushing = 1; #endif @@ -4153,7 +4153,7 @@ ivas_error IVAS_DEC_Flush( *nSamplesFlushed = 0; } -#ifdef TMP_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR hIvasDec->st_ivas->flushing = 0; #endif -- GitLab From e0d505fe1dabc16af2b5dc1da098309a441c67b8 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 1 Jul 2025 10:37:19 +0200 Subject: [PATCH 035/147] Add issue number to disabled OMASA and OSBA tests in test_voip_be_splitrend_vs_binaural.py --- tests/split_rendering/test_voip_be_splitrend_vs_binaural.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py index 1df8c05634..3c7b1da6ec 100644 --- a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py +++ b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py @@ -50,7 +50,7 @@ IN_FORMATS = [ "ISM4", "FOA", "MASA2TC", - # Mixed formats to be finalised in a follow-up issue + # Mixed formats to be finalised in a follow-up issue #1343 # "OSBA_ISM3_HOA3", # "OMASA_ISM4", ] -- GitLab From a425704b90c4337443f42317eff6ced83af9c5ac Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 2 Jul 2025 12:11:17 +0200 Subject: [PATCH 036/147] Do not allocate a bigger CLDFB ring buffer when TSM is enabled --- lib_dec/lib_dec.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index b57971b897..bdb69ab8fc 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -5418,7 +5418,7 @@ static ivas_error ivas_dec_init_split_rend( int16_t cldfb_in_flag, pcm_out_flag; int16_t mixed_td_cldfb_flag; #ifdef FIX_1119_SPLIT_RENDERING_VOIP - int16_t i, num_poses, cldfb_buffer_capacity; + int16_t i, num_poses; #endif pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; @@ -5439,20 +5439,10 @@ static ivas_error ivas_dec_init_split_rend( if ( cldfb_in_flag ) { - if ( st_ivas->hDecoderConfig->Opt_tsm ) - { - /* With TSM we need more space for stretched frames */ - cldfb_buffer_capacity = CLDFB_NO_COL_MAX * 2; - } - else - { - cldfb_buffer_capacity = CLDFB_NO_COL_MAX; - } - for ( i = 0; i < (int16_t) ( num_poses * BINAURAL_CHANNELS ); ++i ) { /* note: this is intra-frame heap memory */ - error = CLDFB_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], cldfb_buffer_capacity ); + error = CLDFB_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], CLDFB_NO_COL_MAX ); if ( error != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); -- GitLab From d04cb56426f420cfc5a6c9cdc1c74d436be5c111 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 8 Jul 2025 13:53:27 +0200 Subject: [PATCH 037/147] Minor changes to CLDFB_RINGBUF --- lib_dec/cldfb_ring_buffer.c | 31 +++++++++---------------------- lib_dec/cldfb_ring_buffer.h | 20 +++++++++----------- 2 files changed, 18 insertions(+), 33 deletions(-) diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index fab273bd63..c6be06b1ea 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -161,10 +161,9 @@ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16 return; } -static uint32_t rb_num_floats( CLDFB_RINGBUF_HANDLE h ) +/* Returns total number of buffered samples (including number of channels) */ +static uint32_t total_size( CLDFB_RINGBUF_HANDLE h ) { - uint32_t ret; - if ( CLDFB_RINGBUF_IsFull( h ) ) { return h->capacity; @@ -172,29 +171,19 @@ static uint32_t rb_num_floats( CLDFB_RINGBUF_HANDLE h ) if ( h->read_pos <= h->write_pos ) { - ret = h->write_pos - h->read_pos; - } - else - { - /* wrap around */ - ret = h->write_pos + h->capacity - h->read_pos; + return h->write_pos - h->read_pos; } - - return ret; + /* else wrap around */ + return h->write_pos + h->capacity - h->read_pos; } -int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t col_idx ) +void CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t col_idx ) { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; - int32_t num_floats = (int32_t) rb_num_floats( h ); + int32_t num_floats = (int32_t) total_size( h ); uint32_t offset; - if ( idx < -num_floats || num_floats <= idx ) - { - *p_real = NULL; - *p_imag = NULL; - return -1; - } + assert( -num_floats <= idx && idx <= num_floats ); if ( idx >= 0 ) { @@ -207,8 +196,6 @@ int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float ** *p_real = &h->real[offset]; *p_imag = &h->imag[offset]; - - return 0; } int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ) @@ -223,7 +210,7 @@ int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ) uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ) { - return (uint16_t) ( rb_num_floats( h ) / CLDFB_NO_CHANNELS_MAX ); + return (uint16_t) ( total_size( h ) / CLDFB_NO_CHANNELS_MAX ); } #endif diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h index 3403bc1add..68143bdfa0 100644 --- a/lib_dec/cldfb_ring_buffer.h +++ b/lib_dec/cldfb_ring_buffer.h @@ -41,7 +41,7 @@ typedef struct CldfbRingBuf *CLDFB_RINGBUF_HANDLE; /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Open( ) + * CLDFB_RINGBUF_Open() * * Allocate a ring buffer for CLDFB data with the given capacity of CLDFB columns. * Each column is expected to contain at most CLDFB_NO_CHANNELS_MAX frequency bands. @@ -51,28 +51,28 @@ typedef struct CldfbRingBuf *CLDFB_RINGBUF_HANDLE; ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Close( ) + * CLDFB_RINGBUF_Close() * * Dellocate CLDFB ring buffer. The given handle will be set to NULL. *---------------------------------------------------------------------*/ void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Push( ) + * CLDFB_RINGBUF_Push() * * Push a single column onto the back of the CLDFB ring buffer from real and imag arrays. *---------------------------------------------------------------------*/ void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float *imag, uint16_t num_bands ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Pop( ) + * CLDFB_RINGBUF_Pop() * * Pop a single column from the front of the CLDFB ring buffer into real and imag arrays. *---------------------------------------------------------------------*/ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16_t num_bands ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_GetByIdx( ) + * CLDFB_RINGBUF_GetByIdx() * * Get pointers into a specific column in the CLDFB ring buffer based on given index. * Non-negative indices access from the front of the ring buffer, negative indexes access @@ -80,27 +80,25 @@ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16 * * - index 0 accesses the front of the buffer, i.e. the oldest CLDFB column in the queue. * - index -1 accesses the back of the buffer, i.e. the newest (last pushed) CLDFB column in the queue. - * - * Returns -1 if given an invalid index (p_real and p_imag will be set to NULL in that case), or 0 otherwise. *---------------------------------------------------------------------*/ -int16_t CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t idx ); +void CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t idx ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_IsEmpty( ) + * CLDFB_RINGBUF_IsEmpty() * * Returns 1 if the ring buffer is empty, or 0 otherwise. *---------------------------------------------------------------------*/ int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_IsFull( ) + * CLDFB_RINGBUF_IsFull() * * Returns 1 if the ring buffer is full, or 0 otherwise. *---------------------------------------------------------------------*/ int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ); /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Size( ) + * CLDFB_RINGBUF_Size() * * Returns the number of CLDFB columns currently stored in the ring buffer. *---------------------------------------------------------------------*/ -- GitLab From ba61e9a73be35370a04f2c961837ecad827c57ed Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Jul 2025 14:53:23 +0200 Subject: [PATCH 038/147] framework-related and formal improvements --- Workspace_msvc/lib_dec.vcxproj | 5 +- Workspace_msvc/lib_dec.vcxproj.filters | 11 +- Workspace_msvc/lib_isar.vcxproj | 2 +- apps/decoder.c | 45 ++--- lib_com/ivas_prot.h | 37 ++++ lib_dec/cldfb_ring_buffer.h | 108 ----------- ...ring_buffer.c => ivas_cldfb_ring_buffer.c} | 155 ++++++++++----- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_mc_param_dec.c | 2 +- lib_dec/ivas_mc_paramupmix_dec.c | 2 +- lib_dec/ivas_omasa_dec.c | 2 +- lib_dec/ivas_osba_dec.c | 2 +- lib_dec/ivas_stat_dec.h | 7 +- lib_dec/lib_dec.c | 182 +++++++++--------- lib_dec/lib_dec.h | 11 +- lib_isar/isar_prot.h | 6 +- lib_isar/isar_splitRend_lcld_enc.c | 8 +- lib_isar/isar_stat.h | 13 ++ lib_rend/ivas_dirac_dec_binaural_functions.c | 4 +- lib_rend/lib_rend.c | 5 +- 20 files changed, 300 insertions(+), 309 deletions(-) delete mode 100644 lib_dec/cldfb_ring_buffer.h rename lib_dec/{cldfb_ring_buffer.c => ivas_cldfb_ring_buffer.c} (56%) diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 944e264667..a8639d192c 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -147,7 +147,6 @@ - @@ -207,6 +206,7 @@ + @@ -313,7 +313,6 @@ - @@ -350,4 +349,4 @@ - + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 5197d66457..e081cb0870 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -277,9 +277,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c @@ -518,11 +515,11 @@ decoder_all_c + + decoder_ivas_c + - - decoder_h - decoder_h @@ -575,4 +572,4 @@ {c33b80b3-67ce-466b-91c0-4adfc9efcb5c} - + \ No newline at end of file diff --git a/Workspace_msvc/lib_isar.vcxproj b/Workspace_msvc/lib_isar.vcxproj index fceeb731ce..5bee827041 100644 --- a/Workspace_msvc/lib_isar.vcxproj +++ b/Workspace_msvc/lib_isar.vcxproj @@ -197,4 +197,4 @@ - + \ No newline at end of file diff --git a/apps/decoder.c b/apps/decoder.c index abf7468d2b..4fde8aa1c5 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -171,12 +171,11 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ISAR_SPLIT_REND_BITS_DATA *splitRendBits, +static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#else +static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #endif - IVAS_DEC_HANDLE hIvasDec, - int16_t *pcmBuf ); static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, IVAS_DEC_HANDLE hIvasDec, const IVAS_AUDIO_CONFIG OutputConfig, const int32_t output_Fs ); #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); @@ -757,11 +756,11 @@ int main( if ( arg.voipMode ) { - error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - &splitRendBits, + error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, hIvasDec, pcmBuf ); +#else + error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, hIvasDec, pcmBuf ); #endif - hIvasDec, pcmBuf ); } else { @@ -1906,7 +1905,6 @@ static ivas_error initOnFirstGoodFrame( else #endif { - if ( *pRemainingDelayNumSamples < *numOutSamples ) { if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, *numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) @@ -2115,7 +2113,7 @@ static ivas_error decodeG192( #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( !isSplitRend ) { - /* Ensure split rendering output struct is not used when not outputting to a split rendering format */ + /* Ensure split rendering output struct is not used when not outputting to a split rendering output configuration */ splitRendBits = NULL; } #endif @@ -2455,11 +2453,11 @@ static ivas_error decodeG192( } /* decode transport channels, do TSM and feed to renderer */ - if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, -#ifndef FIX_1119_SPLIT_RENDERING_VOIP - isSplitRend, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, splitRendBits ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, isSplitRend, splitRendBits ) ) != IVAS_ERR_OK ) #endif - splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -3380,15 +3378,11 @@ static ivas_error decodeVoIP( #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( isSplitRend ) { - if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, #ifdef SUPPORT_JBM_TRACEFILE - writeJbmTraceFileFrameWrapper, - jbmTraceWriter, + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, nOutSamples, (void *) pcmBuf, splitRendBits, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #endif - &bitstreamReadDone, - &nSamplesRendered, - ¶metersAvailableForEditing, - systemTime_ms ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -3398,7 +3392,7 @@ static ivas_error decodeVoIP( { #endif #ifdef SUPPORT_JBM_TRACEFILE - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &bitstreamReadDone, &nSamplesRendered, ¶meterAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #endif @@ -3490,15 +3484,13 @@ static ivas_error decodeVoIP( { #ifndef FIX_1119_SPLIT_RENDERING_VOIP SplitFileReadWrite *splitRendWriter = NULL; -#endif - if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, +#endif #ifdef FIX_1119_SPLIT_RENDERING_VOIP - &vec_pos_len, + if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, &vec_pos_len, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, #else - NULL, + if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, NULL, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, #endif - delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, &splitRendWriter ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in initOnFirstGoodFrame(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -3523,6 +3515,7 @@ static ivas_error decodeVoIP( goto cleanup; } } + if ( !isSplitCoded ) { #endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 8121030b1c..283d96ff4b 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5195,6 +5195,43 @@ void ivas_binaural_add_LFE( float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + +/*---------------------------------------------------------------------------------* + * Multi-pose ring buffer Prototypes +*-----------------------------------------------------------------------------------*/ + +ivas_error ivas_CLDFB_RINGBUF_Open( + ISAR_CLDFB_RINGBUF_HANDLE *ph, + const int16_t capacity_columns +); + +void ivas_CLDFB_RINGBUF_Close( + ISAR_CLDFB_RINGBUF_HANDLE *ph +); + +void ivas_CLDFB_RINGBUF_Push( + ISAR_CLDFB_RINGBUF_HANDLE h, + const float *real, + const float *imag, + const int16_t num_bands +); + +void ivas_CLDFB_RINGBUF_Pop( + ISAR_CLDFB_RINGBUF_HANDLE h, + float *real, + float *imag, + const int16_t num_bands +); + +void ivas_CLDFB_RINGBUF_GetByIdx( + ISAR_CLDFB_RINGBUF_HANDLE h, + float **p_real, + float **p_imag, + const int16_t idx +); + +#endif /*----------------------------------------------------------------------------------* * renderer prototypes diff --git a/lib_dec/cldfb_ring_buffer.h b/lib_dec/cldfb_ring_buffer.h deleted file mode 100644 index 68143bdfa0..0000000000 --- a/lib_dec/cldfb_ring_buffer.h +++ /dev/null @@ -1,108 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#ifndef CLDFB_RING_BUFFER_H -#define CLDFB_RING_BUFFER_H - -#include "ivas_error.h" -#include - -#ifdef FIX_1119_SPLIT_RENDERING_VOIP - -typedef struct CldfbRingBuf *CLDFB_RINGBUF_HANDLE; - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Open() - * - * Allocate a ring buffer for CLDFB data with the given capacity of CLDFB columns. - * Each column is expected to contain at most CLDFB_NO_CHANNELS_MAX frequency bands. - * - * May return IVAS_ERR_FAILED_ALLOC on failed allocation, or IVAS_ERR_OK otherwise. - *---------------------------------------------------------------------*/ -ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Close() - * - * Dellocate CLDFB ring buffer. The given handle will be set to NULL. - *---------------------------------------------------------------------*/ -void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Push() - * - * Push a single column onto the back of the CLDFB ring buffer from real and imag arrays. - *---------------------------------------------------------------------*/ -void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float *imag, uint16_t num_bands ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Pop() - * - * Pop a single column from the front of the CLDFB ring buffer into real and imag arrays. - *---------------------------------------------------------------------*/ -void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16_t num_bands ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_GetByIdx() - * - * Get pointers into a specific column in the CLDFB ring buffer based on given index. - * Non-negative indices access from the front of the ring buffer, negative indexes access - * from the back, similar to Python arrays. For example: - * - * - index 0 accesses the front of the buffer, i.e. the oldest CLDFB column in the queue. - * - index -1 accesses the back of the buffer, i.e. the newest (last pushed) CLDFB column in the queue. - *---------------------------------------------------------------------*/ -void CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t idx ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_IsEmpty() - * - * Returns 1 if the ring buffer is empty, or 0 otherwise. - *---------------------------------------------------------------------*/ -int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_IsFull() - * - * Returns 1 if the ring buffer is full, or 0 otherwise. - *---------------------------------------------------------------------*/ -int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ); - -/*---------------------------------------------------------------------* - * CLDFB_RINGBUF_Size() - * - * Returns the number of CLDFB columns currently stored in the ring buffer. - *---------------------------------------------------------------------*/ -uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ); - -#endif /* FIX_1119_SPLIT_RENDERING_VOIP */ -#endif diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/ivas_cldfb_ring_buffer.c similarity index 56% rename from lib_dec/cldfb_ring_buffer.c rename to lib_dec/ivas_cldfb_ring_buffer.c index c6be06b1ea..01ce9cd7c0 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/ivas_cldfb_ring_buffer.c @@ -30,33 +30,63 @@ *******************************************************************************************************/ -#include "cldfb_ring_buffer.h" +#include +#include "options.h" #include "cnst.h" #include "prot.h" -#include "ivas_error_utils.h" +#include "ivas_prot.h" #include -#include -#include +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" #ifdef FIX_1119_SPLIT_RENDERING_VOIP -struct CldfbRingBuf +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_IsEmpty() + * + * Returns 1 if the ring buffer is empty, or 0 otherwise. + *---------------------------------------------------------------------*/ + +static int16_t ivas_CLDFB_RINGBUF_IsEmpty( + ISAR_CLDFB_RINGBUF_HANDLE h ) +{ + return (int16_t) ( h->read_pos == h->write_pos && !h->is_full ); +} + +/*---------------------------------------------------------------------* + * CLDFB_RINGBUF_IsFull() + * + * Returns 1 if the ring buffer is full, or 0 otherwise. + *---------------------------------------------------------------------*/ + +static int16_t ivas_CLDFB_RINGBUF_IsFull( + ISAR_CLDFB_RINGBUF_HANDLE h ) { - float *real; - float *imag; - uint32_t capacity; - uint32_t write_pos; - uint32_t read_pos; - int16_t is_full; -}; - -ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_columns ) + return h->is_full; +} + + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Open() + * + * Allocate a ring buffer for CLDFB data with the given capacity of CLDFB columns. + * Each column is expected to contain at most CLDFB_NO_CHANNELS_MAX frequency bands. + * + * May return IVAS_ERR_FAILED_ALLOC on failed allocation, or IVAS_ERR_OK otherwise. + *---------------------------------------------------------------------*/ + +ivas_error ivas_CLDFB_RINGBUF_Open( + ISAR_CLDFB_RINGBUF_HANDLE *ph, + const int16_t capacity_columns ) { - CLDFB_RINGBUF_HANDLE h; + ISAR_CLDFB_RINGBUF_HANDLE h; int32_t capacity; + capacity = capacity_columns * CLDFB_NO_CHANNELS_MAX; - if ( ( h = malloc( sizeof( struct CldfbRingBuf ) ) ) == NULL ) + if ( ( h = malloc( sizeof( ISAR_CLDFB_RINGBUF_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); } @@ -81,9 +111,17 @@ ivas_error CLDFB_RINGBUF_Open( CLDFB_RINGBUF_HANDLE *ph, int16_t capacity_column return IVAS_ERR_OK; } -void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ) + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Close() + * + * Dellocate CLDFB ring buffer. The given handle will be set to NULL. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_Close( + ISAR_CLDFB_RINGBUF_HANDLE *ph ) { - CLDFB_RINGBUF_HANDLE h; + ISAR_CLDFB_RINGBUF_HANDLE h; if ( ph == NULL ) { @@ -111,13 +149,24 @@ void CLDFB_RINGBUF_Close( CLDFB_RINGBUF_HANDLE *ph ) return; } -void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float *imag, uint16_t num_bands ) + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Push() + * + * Push a single column onto the back of the CLDFB ring buffer from real and imag arrays. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_Push( + ISAR_CLDFB_RINGBUF_HANDLE h, + const float *real, + const float *imag, + const int16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !CLDFB_RINGBUF_IsFull( h ) ); + assert( !ivas_CLDFB_RINGBUF_IsFull( h ) ); - mvr2r( real, &h->real[h->write_pos], (int16_t) num_bands ); - mvr2r( imag, &h->imag[h->write_pos], (int16_t) num_bands ); + mvr2r( real, &h->real[h->write_pos], num_bands ); + mvr2r( imag, &h->imag[h->write_pos], num_bands ); h->write_pos += CLDFB_NO_CHANNELS_MAX; if ( h->write_pos == h->capacity ) @@ -133,18 +182,29 @@ void CLDFB_RINGBUF_Push( CLDFB_RINGBUF_HANDLE h, const float *real, const float return; } -void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16_t num_bands ) + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_Pop() + * + * Pop a single column from the front of the CLDFB ring buffer into real and imag arrays. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_Pop( + ISAR_CLDFB_RINGBUF_HANDLE h, + float *real, + float *imag, + const int16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !CLDFB_RINGBUF_IsEmpty( h ) ); + assert( !ivas_CLDFB_RINGBUF_IsEmpty( h ) ); if ( real != NULL ) { - mvr2r( &h->real[h->read_pos], real, (int16_t) num_bands ); + mvr2r( &h->real[h->read_pos], real, num_bands ); } if ( imag != NULL ) { - mvr2r( &h->imag[h->read_pos], imag, (int16_t) num_bands ); + mvr2r( &h->imag[h->read_pos], imag, num_bands ); } h->read_pos += CLDFB_NO_CHANNELS_MAX; @@ -161,10 +221,12 @@ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16 return; } + /* Returns total number of buffered samples (including number of channels) */ -static uint32_t total_size( CLDFB_RINGBUF_HANDLE h ) +static uint32_t CLDFB_RINGBUF_total_size( + ISAR_CLDFB_RINGBUF_HANDLE h ) { - if ( CLDFB_RINGBUF_IsFull( h ) ) + if ( ivas_CLDFB_RINGBUF_IsFull( h ) ) { return h->capacity; } @@ -173,14 +235,31 @@ static uint32_t total_size( CLDFB_RINGBUF_HANDLE h ) { return h->write_pos - h->read_pos; } + /* else wrap around */ return h->write_pos + h->capacity - h->read_pos; } -void CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_imag, int16_t col_idx ) + +/*---------------------------------------------------------------------* + * ivas_CLDFB_RINGBUF_GetByIdx() + * + * Get pointers into a specific column in the CLDFB ring buffer based on given index. + * Non-negative indices access from the front of the ring buffer, negative indexes access + * from the back, similar to Python arrays. For example: + * + * - index 0 accesses the front of the buffer, i.e. the oldest CLDFB column in the queue. + * - index -1 accesses the back of the buffer, i.e. the newest (last pushed) CLDFB column in the queue. + *---------------------------------------------------------------------*/ + +void ivas_CLDFB_RINGBUF_GetByIdx( + ISAR_CLDFB_RINGBUF_HANDLE h, + float **p_real, + float **p_imag, + const int16_t col_idx ) { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; - int32_t num_floats = (int32_t) total_size( h ); + int32_t num_floats = (int32_t) CLDFB_RINGBUF_total_size( h ); uint32_t offset; assert( -num_floats <= idx && idx <= num_floats ); @@ -196,21 +275,7 @@ void CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_i *p_real = &h->real[offset]; *p_imag = &h->imag[offset]; -} - -int16_t CLDFB_RINGBUF_IsEmpty( CLDFB_RINGBUF_HANDLE h ) -{ - return (int16_t) ( h->read_pos == h->write_pos && !h->is_full ); -} -int16_t CLDFB_RINGBUF_IsFull( CLDFB_RINGBUF_HANDLE h ) -{ - return h->is_full; -} - -uint16_t CLDFB_RINGBUF_Size( CLDFB_RINGBUF_HANDLE h ) -{ - return (uint16_t) ( total_size( h ) / CLDFB_NO_CHANNELS_MAX ); + return; } - #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 0ea8d67a6a..b53d8cc200 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1670,7 +1670,7 @@ static void binRenderer_split( for ( ch = 0; ch < nchan_out; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + ivas_CLDFB_RINGBUF_Push( hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural_loc[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural_loc[pos_idx][ch][slot_idx], diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index bb013b8d78..b0ce85ce51 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1787,7 +1787,7 @@ void ivas_param_mc_dec_render( for ( ch = 0; ch < nchan_out_cldfb; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 8fddef8ac8..ccae387180 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -791,7 +791,7 @@ static void ivas_mc_paramupmix_dec_sf( for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 3ea63bfdf3..f92d987c3f 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -800,7 +800,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( /* note: this intentionally differs from OSBA by: no scaling by 0.5 */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); + ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); v_add( re, Cldfb_RealBuffer, re, num_cldfb_bands ); v_add( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); #else diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index e251f4da7a..582fc08b65 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -185,7 +185,7 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( cldfbAnalysis_ts( &( output_f[n][num_cldfb_bands * slot_idx] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, num_cldfb_bands, st_ivas->hSplitBinRend->splitrend.hCldfbHandles->cldfbAna[n] ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); + ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); for ( b = 0; b < num_cldfb_bands; b++ ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 53651d186a..6cc208cf8b 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -40,9 +40,6 @@ #include "stat_dec.h" #include "ivas_stat_com.h" #include "ivas_stat_rend.h" -#ifdef FIX_1119_SPLIT_RENDERING_VOIP -#include "cldfb_ring_buffer.h" -#endif /*----------------------------------------------------------------------------------* @@ -831,8 +828,8 @@ typedef struct float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; } ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA, *ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE; -#endif +#endif typedef struct { #ifdef FIX_1119_SPLIT_RENDERING_VOIP @@ -849,7 +846,7 @@ typedef struct typedef struct { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; + ISAR_CLDFB_RINGBUF_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; #else ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE hMultiBinCldfbData; /*scratch buffer for frame by frame processing*/ #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index bdb69ab8fc..0160b48549 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -114,11 +114,11 @@ static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, c static ivas_error evs_dec_main( Decoder_Struct *st_ivas ); static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); -static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, uint8_t *nTransportChannels, -#ifndef FIX_1119_SPLIT_RENDERING_VOIP - const int16_t isSplitRend, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, uint8_t *nTransportChannels, ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); +#else +static ivas_error ivas_dec_setup_all( IVAS_DEC_HANDLE hIvasDec, uint8_t *nTransportChannels, const int16_t isSplitRend, ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); #endif - ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); static ivas_error apa_setup( IVAS_DEC_HANDLE hIvasDec, const bool isInitialized_voip, const uint16_t nTransportChannels ); static PCM_RESOLUTION pcm_type_API_to_internal( const IVAS_DEC_PCM_TYPE pcmType ); static void *pcm_buffer_offset( void *buffer, const IVAS_DEC_PCM_TYPE pcmType, const int32_t offset ); @@ -1147,11 +1147,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( * Setup all decoder parts (IVAS decoder, ISAR) *-----------------------------------------------------------------*/ - if ( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, -#ifndef FIX_1119_SPLIT_RENDERING_VOIP - isSplitRend, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, splitRendBits ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_dec_setup_all( hIvasDec, &nTransportChannels, isSplitRend, splitRendBits ) ) != IVAS_ERR_OK ) #endif - splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -1841,11 +1841,19 @@ ivas_error IVAS_DEC_GetSamplesRenderer( #ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * isar_get_frame_size( ) + * + * + *---------------------------------------------------------------------*/ + static int16_t isar_get_frame_size( - Decoder_Struct *st_ivas ) + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) { int32_t output_Fs; int16_t nSamplesPerChannel; + output_Fs = st_ivas->hDecoderConfig->output_Fs; if ( st_ivas->hDecoderConfig->render_framesize != IVAS_RENDER_FRAMESIZE_20MS && @@ -1863,27 +1871,29 @@ static int16_t isar_get_frame_size( return nSamplesPerChannel; } + +/*---------------------------------------------------------------------* + * isar_render_poses( ) + * + * + *---------------------------------------------------------------------*/ + static ivas_error isar_render_poses( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ - float **p_head_pose_buf, - int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ - bool *needNewFrame /* o : indication that the decoder needs a new frame */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ + float **p_head_pose_buf, /* o : PCM buffer with head-pose data */ + int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { - Decoder_Struct *st_ivas; float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; int16_t i, j; ivas_error error; - ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; int16_t numPoses; - error = IVAS_ERR_OK; - st_ivas = hIvasDec->st_ivas; *needNewFrame = false; - hSplitBinRend = st_ivas->hSplitBinRend; - numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; + numPoses = hIvasDec->st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; /* init flush buffer for rate switch if not already initizalized */ if ( hIvasDec->flushbuffer == NULL ) @@ -1902,6 +1912,7 @@ static ivas_error isar_render_poses( { return error; } + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { return IVAS_ERR_OK; @@ -1919,15 +1930,19 @@ static ivas_error isar_render_poses( return error; } + +/*---------------------------------------------------------------------* + * isar_generate_metadata_and_bitstream( ) + * + * + *---------------------------------------------------------------------*/ + static ivas_error isar_generate_metadata_and_bitstream( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - float **p_head_pose_buf, - ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float **p_head_pose_buf, /* i/o: PCM buffer with head-pose data */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { - Decoder_Struct *st_ivas; - AUDIO_CONFIG output_config; - int32_t output_Fs; ivas_error error; ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; int16_t max_band; @@ -1939,14 +1954,10 @@ static ivas_error isar_generate_metadata_and_bitstream( float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; - error = IVAS_ERR_OK; - st_ivas = hIvasDec->st_ivas; - output_config = st_ivas->hDecoderConfig->output_config; - output_Fs = st_ivas->hDecoderConfig->output_Fs; hSplitBinRend = st_ivas->hSplitBinRend; - max_band = (int16_t) ( ( BINAURAL_MAXBANDS * output_Fs ) / 48000 ); - pcm_out_flag = ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; + max_band = (int16_t) ( ( BINAURAL_MAXBANDS * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; td_input = st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC; if ( !td_input ) @@ -1959,20 +1970,13 @@ static ivas_error isar_generate_metadata_and_bitstream( { /* Save pointers to first CLDFB column in the ring buffer. Allows us to save * significant amounts of memory by not copying CLDFB values into a separate buffer. */ - CLDFB_RINGBUF_GetByIdx( - hSplitBinRend->hMultiBinCldfbData[i], - &p_Cldfb_RealBuffer_Binaural[i][j], - &p_Cldfb_ImagBuffer_Binaural[i][j], - 0 ); + ivas_CLDFB_RINGBUF_GetByIdx( hSplitBinRend->hMultiBinCldfbData[i], &p_Cldfb_RealBuffer_Binaural[i][j], &p_Cldfb_ImagBuffer_Binaural[i][j], 0 ); + /* Pop the CLDFB column we just saved pointers to. This is fine as long as we use * the saved columns only before any new columns are pushed to the buffer - the new * columns could potentially overwrite the old columns we wanted to use. * This requirement is fulfilled in this case. */ - CLDFB_RINGBUF_Pop( - hSplitBinRend->hMultiBinCldfbData[i], - NULL, - NULL, - CLDFB_NO_CHANNELS_MAX ); + ivas_CLDFB_RINGBUF_Pop( hSplitBinRend->hMultiBinCldfbData[i], NULL, NULL, CLDFB_NO_CHANNELS_MAX ); } } } @@ -2036,7 +2040,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( ivas_error error; float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; float *p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; - int32_t i; + int16_t i; int16_t pcm_out_flag; int16_t numSamplesPerChannelToOutput; @@ -2045,7 +2049,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - error = IVAS_ERR_UNKNOWN; st_ivas = hIvasDec->st_ivas; if ( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 ) @@ -2061,18 +2064,17 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( p_head_pose_buf[i] = head_pose_buf[i]; } - error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ); - if ( error != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) { return error; } + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { return IVAS_ERR_OK; } - error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); - if ( error != IVAS_ERR_OK ) + if ( ( error = isar_generate_metadata_and_bitstream( st_ivas, p_head_pose_buf, splitRendBits ) ) != IVAS_ERR_OK ) { return error; } @@ -2285,7 +2287,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( } #endif - return error; + return IVAS_ERR_OK; } @@ -3681,13 +3683,16 @@ ivas_error IVAS_DEC_TSM_SetQuality( #endif #ifdef FIX_1119_SPLIT_RENDERING_VOIP + /*---------------------------------------------------------------------* * ivas_dec_voip_get_samples_common( ) * * Main function to output one frame in VoIP. Holds common code for * regular output configs and split rendering configs. *---------------------------------------------------------------------*/ + static ivas_error ivas_dec_voip_get_samples_common + #else /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSamples( ) @@ -3703,7 +3708,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ void *pcmBuf, /* o : output synthesis signal */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ + float **p_head_pose_buf, /* i : PCM buffer with head-pose data */ #endif #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, @@ -3724,11 +3730,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples int16_t result; ivas_error error; uint8_t nOutChannels; - #ifdef FIX_1119_SPLIT_RENDERING_VOIP int32_t i; - float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; - float *p_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; #endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->hVoIP == NULL ) @@ -3753,8 +3756,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples { return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Split rendering is not integrated with VoIP mode" ); } -#endif +#endif /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ while ( *nSamplesRendered < nSamplesPerChannel ) { @@ -3776,7 +3779,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; dataUnit = NULL; - /* pop one access unit from the jitter buffer */ result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); if ( result != 0 ) @@ -3900,13 +3902,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples { if ( hIvasDec->nSamplesAvailableNext == 0 || hIvasDec->nSamplesAvailableNext == hIvasDec->nSamplesFrame ) { - if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, #ifdef FIX_1119_SPLIT_RENDERING_VOIP - splitRendBits + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, splitRendBits ) ) != IVAS_ERR_OK ) #else - 0, NULL + if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, 0, NULL ) ) != IVAS_ERR_OK ) #endif - ) ) != IVAS_ERR_OK ) { return error; } @@ -3929,12 +3929,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples } #ifdef FIX_1119_SPLIT_RENDERING_VOIP - if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + if ( splitRendBits != NULL ) { /* Move output pointers forward */ for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { - p_head_pose_buf[i] = &head_pose_buf[i][*nSamplesRendered]; + p_head_pose_buf[i] += *nSamplesRendered; } /* Render head poses from time-scaled transport channels */ @@ -3942,6 +3942,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples { return error; } + + /* Set pointers back to the beginning of head pose buffers */ + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] -= *nSamplesRendered; + } } else { @@ -3961,25 +3967,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples } #ifdef FIX_1119_SPLIT_RENDERING_VOIP - if ( hIvasDec->hasDecodedFirstGoodFrame && - ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || - hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + if ( hIvasDec->hasDecodedFirstGoodFrame && splitRendBits != NULL ) { - /* Set pointers to beginning of head pose buffers */ - for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) - { - p_head_pose_buf[i] = head_pose_buf[i]; - } - /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ - error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); - if ( error != IVAS_ERR_OK ) + if ( ( error = isar_generate_metadata_and_bitstream( st_ivas, p_head_pose_buf, splitRendBits ) ) != IVAS_ERR_OK ) { return error; } /* Synthesise PCM output if split PCM */ - if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { @@ -4004,6 +4001,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples } #ifdef FIX_1119_SPLIT_RENDERING_VOIP + /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSamples( ) * @@ -4011,10 +4009,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_VoIP_GetSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ - void *pcmBuf, /* o : output synthesis signal */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + void *pcmBuf, /* o : output synthesis signal */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter, @@ -4028,9 +4025,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return ivas_dec_voip_get_samples_common( hIvasDec, nSamplesPerChannel, - pcmType, + IVAS_DEC_PCM_INT16, pcmBuf, NULL, + NULL, #ifdef SUPPORT_JBM_TRACEFILE jbmWriterFn, jbmWriter, @@ -4044,27 +4042,27 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ void *pcmBuf, /* o : output synthesis signal */ ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, - void *jbmWriter + void *jbmWriter, #endif - , bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ uint16_t *nSamplesRendered, /* o : number of samples rendered */ bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ ) { - ivas_error error = IVAS_ERR_UNKNOWN; - int16_t nSamplesPerChannel = 0; + int16_t i; + float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; + float *pp_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; - if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nSamplesPerChannel ) ) != IVAS_ERR_OK ) + /* Set pointers to beginning of head pose buffers */ + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { - fprintf( stderr, "\nError getting render frame size in samples\n" ); - return error; + pp_head_pose_buf[i] = head_pose_buf[i]; } return ivas_dec_voip_get_samples_common( @@ -4073,6 +4071,7 @@ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( IVAS_DEC_PCM_INT16, pcmBuf, splitRendBits, + pp_head_pose_buf, #ifdef SUPPORT_JBM_TRACEFILE jbmWriterFn, jbmWriter, @@ -5186,7 +5185,7 @@ static ivas_error ivas_create_handle_isar( isar_init_split_rend_handles( &hSplitBinRend->splitrend ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP - for ( i = 0; i < (int16_t) ( MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS ); ++i ) + for ( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) { hSplitBinRend->hMultiBinCldfbData[i] = NULL; } @@ -5219,11 +5218,11 @@ static void ivas_destroy_handle_isar( if ( *hSplitBinRend != NULL ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - for ( i = 0; i < (int16_t) ( MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS ); ++i ) + for ( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) { if ( ( *hSplitBinRend )->hMultiBinCldfbData[i] != NULL ) { - CLDFB_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinCldfbData[i] ); + ivas_CLDFB_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinCldfbData[i] ); } } #else @@ -5439,11 +5438,10 @@ static ivas_error ivas_dec_init_split_rend( if ( cldfb_in_flag ) { - for ( i = 0; i < (int16_t) ( num_poses * BINAURAL_CHANNELS ); ++i ) + for ( i = 0; i < num_poses * BINAURAL_CHANNELS; ++i ) { /* note: this is intra-frame heap memory */ - error = CLDFB_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], CLDFB_NO_COL_MAX ); - if ( error != IVAS_ERR_OK ) + if ( ( error = ivas_CLDFB_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinCldfbData[i], CLDFB_NO_COL_MAX ) ) != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); } diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 73c55bd1f0..181417c70a 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -311,7 +311,9 @@ ivas_error IVAS_DEC_TSM_SetQuality( ivas_error IVAS_DEC_VoIP_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ +#ifndef FIX_1119_SPLIT_RENDERING_VOIP const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ +#endif void *pcmBuf, /* o : output synthesis signal */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, @@ -327,17 +329,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ void *pcmBuf, /* o : output synthesis signal */ ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, - void* jbmWriter + void* jbmWriter, #endif - , bool *bitstreamReadDone, /* o : flag indicating that bitstream was read */ - uint16_t *nSamplesRendered, - bool *parametersAvailableForEditing, + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + bool *parametersAvailableForEditing, /* o : indicates whether objects editing is available */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ ); #endif diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index f842b0a53b..53d70184f0 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -189,13 +189,13 @@ void isar_splitBinLCLDEncClose( void isar_splitBinLCLDEncProcess( ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc, /* i/o: ISAR LCLD encoder handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *Cldfb_In_Real[][CLDFB_NO_COL_MAX], - float *Cldfb_In_Imag[][CLDFB_NO_COL_MAX], + float *Cldfb_In_Real[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + float *Cldfb_In_Imag[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, imag. part */ #else float Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], #endif - const int32_t available_bits, + const int32_t available_bits, /* i : available bit-budget */ ISAR_SPLIT_REND_BITS_HANDLE pBits /* i/o: ISAR bits handle */ ); diff --git a/lib_isar/isar_splitRend_lcld_enc.c b/lib_isar/isar_splitRend_lcld_enc.c index 171b5162b3..1ecb83887b 100644 --- a/lib_isar/isar_splitRend_lcld_enc.c +++ b/lib_isar/isar_splitRend_lcld_enc.c @@ -159,14 +159,14 @@ void isar_splitBinLCLDEncClose( void isar_splitBinLCLDEncProcess( ISAR_BIN_HR_SPLIT_LCLD_ENC_HANDLE hSplitBinLCLDEnc, /* i/o: ISAR LCLD encoder handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *Cldfb_In_Real[][CLDFB_NO_COL_MAX], - float *Cldfb_In_Imag[][CLDFB_NO_COL_MAX], + float *Cldfb_In_Real[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, real part */ + float *Cldfb_In_Imag[][CLDFB_NO_COL_MAX], /* i/o: Binaural signals, imag. part */ #else float Cldfb_In_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Cldfb_In_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], #endif - const int32_t available_bits, - ISAR_SPLIT_REND_BITS_HANDLE pBits /* i/o: ISAR bits handle */ + const int32_t available_bits, /* i : available bit-budget */ + ISAR_SPLIT_REND_BITS_HANDLE pBits /* i/o: ISAR bits handle */ ) { int32_t iBitsWritten, itr, available_bits_itr, rem_itr, available_bits_local; diff --git a/lib_isar/isar_stat.h b/lib_isar/isar_stat.h index 587c3c8ea7..0e0577d570 100644 --- a/lib_isar/isar_stat.h +++ b/lib_isar/isar_stat.h @@ -345,4 +345,17 @@ typedef struct } SPLIT_REND_WRAPPER; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +typedef struct +{ + float *real; + float *imag; + uint32_t capacity; + uint32_t write_pos; + uint32_t read_pos; + int16_t is_full; + +} ISAR_CLDFB_RINGBUF_DATA, *ISAR_CLDFB_RINGBUF_HANDLE; +#endif + #endif /* ISAR_STAT_H */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 33328e365c..98f05e7b8e 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -796,7 +796,7 @@ static void ivas_dirac_dec_binaural_internal( for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], @@ -873,7 +873,7 @@ static void ivas_dirac_dec_binaural_internal( for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - CLDFB_RINGBUF_Push( + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 9401b9e553..7edde29027 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7462,11 +7462,10 @@ static ivas_error getSamplesInternal( int16_t ch; int16_t i, ro_md_flag; float *tmpBinaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS], tmpBinaural_buff[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k]; - #ifdef FIX_1119_SPLIT_RENDERING_VOIP float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; - int32_t j; + int16_t j; for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { @@ -7521,7 +7520,7 @@ static ivas_error getSamplesInternal( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, #endif - ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), + (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, -- GitLab From d76762fdab6169deda87e038aad73c6a9255a6dd Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 5 Aug 2025 17:22:08 +0200 Subject: [PATCH 039/147] address comments --- apps/decoder.c | 4 +-- lib_dec/ivas_cldfb_ring_buffer.c | 8 ++++-- lib_dec/lib_dec.c | 26 ++++++++++++++++---- lib_dec/lib_dec.h | 4 +-- lib_rend/ivas_dirac_dec_binaural_functions.c | 13 ++-------- 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 4fde8aa1c5..21d9c66873 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3379,7 +3379,7 @@ static ivas_error decodeVoIP( if ( isSplitRend ) { #ifdef SUPPORT_JBM_TRACEFILE - if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, nOutSamples, (void *) pcmBuf, splitRendBits, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #endif @@ -3392,7 +3392,7 @@ static ivas_error decodeVoIP( { #endif #ifdef SUPPORT_JBM_TRACEFILE - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, ¶metersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &bitstreamReadDone, &nSamplesRendered, ¶meterAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_dec/ivas_cldfb_ring_buffer.c b/lib_dec/ivas_cldfb_ring_buffer.c index 01ce9cd7c0..82f79687ff 100644 --- a/lib_dec/ivas_cldfb_ring_buffer.c +++ b/lib_dec/ivas_cldfb_ring_buffer.c @@ -42,9 +42,12 @@ #include "wmc_auto.h" #ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * CLDFB ring-buffer functions needed in split-rendering outputs + *---------------------------------------------------------------------*/ /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_IsEmpty() + * ivas_CLDFB_RINGBUF_IsEmpty() * * Returns 1 if the ring buffer is empty, or 0 otherwise. *---------------------------------------------------------------------*/ @@ -55,8 +58,9 @@ static int16_t ivas_CLDFB_RINGBUF_IsEmpty( return (int16_t) ( h->read_pos == h->write_pos && !h->is_full ); } + /*---------------------------------------------------------------------* - * CLDFB_RINGBUF_IsFull() + * ivas_CLDFB_RINGBUF_IsFull() * * Returns 1 if the ring buffer is full, or 0 otherwise. *---------------------------------------------------------------------*/ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0160b48549..25865123b0 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4009,9 +4009,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_VoIP_GetSamples( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ - void *pcmBuf, /* o : output synthesis signal */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ + void *pcmBuf, /* o : output synthesis signal */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter, @@ -4025,7 +4026,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return ivas_dec_voip_get_samples_common( hIvasDec, nSamplesPerChannel, - IVAS_DEC_PCM_INT16, + pcmType, pcmBuf, NULL, NULL, @@ -4039,10 +4040,17 @@ ivas_error IVAS_DEC_VoIP_GetSamples( systemTimestamp_ms ); } + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetSplitBinauralBitstream( ) + * + * Main function to decode one split-rendering frame in VoIP + *---------------------------------------------------------------------*/ + /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ void *pcmBuf, /* o : output synthesis signal */ ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ #ifdef SUPPORT_JBM_TRACEFILE @@ -4058,6 +4066,14 @@ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( int16_t i; float head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES][L_FRAME48k]; float *pp_head_pose_buf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES]; + ivas_error error = IVAS_ERR_UNKNOWN; + int16_t nSamplesPerChannel = 0; + + if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nSamplesPerChannel ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError getting render frame size in samples\n" ); + return error; + } /* Set pointers to beginning of head pose buffers */ for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 181417c70a..18298954c4 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -311,9 +311,7 @@ ivas_error IVAS_DEC_TSM_SetQuality( ivas_error IVAS_DEC_VoIP_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ -#ifndef FIX_1119_SPLIT_RENDERING_VOIP const IVAS_DEC_PCM_TYPE pcmType, /* i : type for the decoded PCM resolution */ -#endif void *pcmBuf, /* o : output synthesis signal */ #ifdef SUPPORT_JBM_TRACEFILE JbmTraceFileWriterFn jbmWriterFn, @@ -329,7 +327,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + /* const IVAS_DEC_PCM_TYPE pcmType, */ /* i : type for the decoded PCM resolution */ void *pcmBuf, /* o : output synthesis signal */ ISAR_SPLIT_REND_BITS_DATA *splitRendBits, /* o : output split rendering bits */ #ifdef SUPPORT_JBM_TRACEFILE diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 98f05e7b8e..0e314632d3 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -796,11 +796,7 @@ static void ivas_dirac_dec_binaural_internal( for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ivas_CLDFB_RINGBUF_Push( - st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], - tmp_Cldfb_out_re[ch][i], - tmp_Cldfb_out_im[ch][i], - CLDFB_NO_CHANNELS_MAX ); + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], CLDFB_NO_CHANNELS_MAX ); #else mvr2r( tmp_Cldfb_out_re[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); mvr2r( tmp_Cldfb_out_im[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); @@ -861,7 +857,6 @@ static void ivas_dirac_dec_binaural_internal( hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0, nchanSeparateChannels, st_ivas->hMasaIsmData ); - /* re-use reverb and decorr from main direction for the sides */ ivas_dirac_dec_binaural_process_output( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, config_data.processReverb, subframe, tmp_Cldfb_out_re, tmp_Cldfb_out_im, @@ -873,11 +868,7 @@ static void ivas_dirac_dec_binaural_internal( for ( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe]; i++ ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP - ivas_CLDFB_RINGBUF_Push( - st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], - tmp_Cldfb_out_re[ch][i], - tmp_Cldfb_out_im[ch][i], - CLDFB_NO_CHANNELS_MAX ); + ivas_CLDFB_RINGBUF_Push( st_ivas->hSplitBinRend->hMultiBinCldfbData[pos_idx * BINAURAL_CHANNELS + ch], tmp_Cldfb_out_re[ch][i], tmp_Cldfb_out_im[ch][i], CLDFB_NO_CHANNELS_MAX ); #else mvr2r( tmp_Cldfb_out_re[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); mvr2r( tmp_Cldfb_out_im[ch][i], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][hSpatParamRendCom->slots_rendered + i], CLDFB_NO_CHANNELS_MAX ); -- GitLab From ce4f93c05a7d3575cffacfb4f7d6e97215102e89 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 11 Aug 2025 09:56:59 +0200 Subject: [PATCH 040/147] Remove unneeded postfix from struct name ISAR_CLDFB_RINGBUF_DATA --- lib_dec/ivas_cldfb_ring_buffer.c | 2 +- lib_isar/isar_stat.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_cldfb_ring_buffer.c b/lib_dec/ivas_cldfb_ring_buffer.c index 82f79687ff..fdabe30fe8 100644 --- a/lib_dec/ivas_cldfb_ring_buffer.c +++ b/lib_dec/ivas_cldfb_ring_buffer.c @@ -90,7 +90,7 @@ ivas_error ivas_CLDFB_RINGBUF_Open( capacity = capacity_columns * CLDFB_NO_CHANNELS_MAX; - if ( ( h = malloc( sizeof( ISAR_CLDFB_RINGBUF_DATA ) ) ) == NULL ) + if ( ( h = malloc( sizeof( ISAR_CLDFB_RINGBUF ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to allocate memory for CLDFB ring buffer\n" ); } diff --git a/lib_isar/isar_stat.h b/lib_isar/isar_stat.h index 0e0577d570..b244370dd3 100644 --- a/lib_isar/isar_stat.h +++ b/lib_isar/isar_stat.h @@ -355,7 +355,7 @@ typedef struct uint32_t read_pos; int16_t is_full; -} ISAR_CLDFB_RINGBUF_DATA, *ISAR_CLDFB_RINGBUF_HANDLE; +} ISAR_CLDFB_RINGBUF, *ISAR_CLDFB_RINGBUF_HANDLE; #endif #endif /* ISAR_STAT_H */ -- GitLab From 3d3cc22cc9695ab618002aec144bd7b9242b5248 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 11 Aug 2025 11:08:12 +0200 Subject: [PATCH 041/147] Ensure splitRendBits is not NULL when outputting to split rendering config --- lib_dec/lib_dec.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 25865123b0..0de65e331a 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -3750,7 +3750,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples return IVAS_ERR_WRONG_PARAMS; } -#ifndef FIX_1119_SPLIT_RENDERING_VOIP +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || + hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && + splitRendBits == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } +#else if ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) { -- GitLab From 1571d77dcc2a9bca28a2deecdfbd9c1eea7f3989 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 12:15:40 +0200 Subject: [PATCH 042/147] Remove fprintf call from library internals --- lib_dec/lib_dec.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index bdb69ab8fc..bd38ab5e5e 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4063,7 +4063,6 @@ ivas_error IVAS_DEC_VoIP_GetSplitBinauralBitstream( if ( ( error = IVAS_DEC_GetRenderFramesizeSamples( hIvasDec, &nSamplesPerChannel ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError getting render frame size in samples\n" ); return error; } -- GitLab From f6a1bc21e687ea4656ee23f39421e874730cd8f4 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 16:49:24 +0200 Subject: [PATCH 043/147] Fix split rendering with frame sizes other than 20 ms --- lib_dec/lib_dec.c | 5 +++-- lib_isar/lib_isar_pre_rend.c | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index bd38ab5e5e..609eab8707 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1935,7 +1935,7 @@ static ivas_error isar_generate_metadata_and_bitstream( int16_t td_input; int16_t ro_md_flag; IVAS_QUATERNION Quaternion; - int16_t i, j, num_poses; + int16_t i, j, num_poses, num_cldfb_slots; float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; @@ -1952,10 +1952,11 @@ static ivas_error isar_generate_metadata_and_bitstream( if ( !td_input ) { num_poses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; + num_cldfb_slots = hIvasDec->st_ivas->hDecoderConfig->render_framesize * JBM_CLDFB_SLOTS_IN_SUBFRAME; for ( i = 0; i < (int16_t) ( BINAURAL_CHANNELS * num_poses ); ++i ) { - for ( j = 0; j < CLDFB_NO_COL_MAX; ++j ) + for ( j = 0; j < num_cldfb_slots; ++j ) { /* Save pointers to first CLDFB column in the ring buffer. Allows us to save * significant amounts of memory by not copying CLDFB values into a separate buffer. */ diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 23ff136c51..dd713d0134 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -381,20 +381,22 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( } else { - int16_t ch, slot_idx; + int16_t ch, slot_idx, num_slots; + num_slots = isar_frame_size_ms * 1000000 / CLDFB_SLOT_NS; + /* CLDFB synthesis of main pose */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { float *Cldfb_In_BinReal_p[CLDFB_NO_COL_MAX]; float *Cldfb_In_BinImag_p[CLDFB_NO_COL_MAX]; - for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + for ( slot_idx = 0; slot_idx < num_slots; slot_idx++ ) { Cldfb_In_BinReal_p[slot_idx] = Cldfb_In_BinReal[ch][slot_idx]; Cldfb_In_BinImag_p[slot_idx] = Cldfb_In_BinImag[ch][slot_idx]; } - cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * CLDFB_NO_COL_MAX, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); + cldfbSynthesis( Cldfb_In_BinReal_p, Cldfb_In_BinImag_p, output[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); } pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; -- GitLab From 11220e779847aa168b7cd544b24306d245fbcd35 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 18:40:16 +0200 Subject: [PATCH 044/147] Fix signal scaling in OSBA --- lib_dec/ivas_osba_dec.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index e9cb54b6bc..145c36c9f7 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -186,12 +186,8 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( #ifdef FIX_1119_SPLIT_RENDERING_VOIP CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[n], &re, &im, slot_idx - cldfb_slots ); - - for ( b = 0; b < num_cldfb_bands; b++ ) - { - re[b] = 0.5f * re[b] + 0.5f * Cldfb_RealBuffer[b]; - im[b] = 0.5f * im[b] + 0.5f * Cldfb_ImagBuffer[b]; - } + v_add( re, Cldfb_RealBuffer, re, num_cldfb_bands ); + v_add( im, Cldfb_ImagBuffer, im, num_cldfb_bands ); #else for ( b = 0; b < num_cldfb_bands; b++ ) { -- GitLab From 0dd84471328ac23817452775e22f6e0880645943 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 18:44:10 +0200 Subject: [PATCH 045/147] Remove unused variable --- lib_dec/ivas_osba_dec.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 145c36c9f7..23374a3f03 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -161,7 +161,10 @@ ivas_error ivas_osba_dirac_td_binaural_jbm( if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { - int16_t slot_idx, num_cldfb_bands, b, nchan_transport_orig; + int16_t slot_idx, num_cldfb_bands, nchan_transport_orig; +#ifndef FIX_1119_SPLIT_RENDERING_VOIP + int16_t b; +#endif int16_t cldfb_slots; float Cldfb_RealBuffer[CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer[CLDFB_NO_CHANNELS_MAX]; -- GitLab From 2d963fd424e888d63dc2636fe2b83903cb91ef49 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 18:47:47 +0200 Subject: [PATCH 046/147] Fix int conversion warnings --- lib_dec/lib_dec.c | 2 +- lib_isar/lib_isar_pre_rend.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 609eab8707..1b73d7ca23 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1952,7 +1952,7 @@ static ivas_error isar_generate_metadata_and_bitstream( if ( !td_input ) { num_poses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; - num_cldfb_slots = hIvasDec->st_ivas->hDecoderConfig->render_framesize * JBM_CLDFB_SLOTS_IN_SUBFRAME; + num_cldfb_slots = (int16_t) hIvasDec->st_ivas->hDecoderConfig->render_framesize * JBM_CLDFB_SLOTS_IN_SUBFRAME; for ( i = 0; i < (int16_t) ( BINAURAL_CHANNELS * num_poses ); ++i ) { diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index dd713d0134..a3e7cdde64 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -382,7 +382,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( else { int16_t ch, slot_idx, num_slots; - num_slots = isar_frame_size_ms * 1000000 / CLDFB_SLOT_NS; + num_slots = (int16_t) isar_frame_size_ms * 1000000 / CLDFB_SLOT_NS; /* CLDFB synthesis of main pose */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) -- GitLab From e95802d13529901d5b940cf6e9be34f8dd53bb7e Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 18:51:51 +0200 Subject: [PATCH 047/147] Try to fix integer conversion warning again --- lib_isar/lib_isar_pre_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index a3e7cdde64..46ff7d3bee 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -382,7 +382,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( else { int16_t ch, slot_idx, num_slots; - num_slots = (int16_t) isar_frame_size_ms * 1000000 / CLDFB_SLOT_NS; + num_slots = (int16_t) ( isar_frame_size_ms * 1000000 / CLDFB_SLOT_NS ); /* CLDFB synthesis of main pose */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) -- GitLab From 91adc344be8e143e461377c9458119ccefeb8989 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 19:10:42 +0200 Subject: [PATCH 048/147] Modify test in preparation for -no_delay_cmp being required with -Tracefile in IVAS_dec --- .../test_voip_be_splitrend_vs_binaural.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py index 3c7b1da6ec..dd9c4f317c 100644 --- a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py +++ b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py @@ -102,7 +102,7 @@ def test_voip_be_splitrend_vs_binaural( ).absolute() trace_out = wav_out.with_suffix(".trace") - options.extend(["-Tracefile", str(trace_out)]) + options.extend(["-Tracefile", str(trace_out), "-no_delay_cmp"]) if out_format == "BINAURAL_SPLIT_PCM": isar_md_file = wav_out.with_suffix(".isarmd") @@ -124,13 +124,16 @@ def test_voip_be_splitrend_vs_binaural( wav_out_bin, trace_out_bin, _ = run_decoder("BINAURAL") wav_out_sr, trace_out_sr, isar_md_out_sr = run_decoder("BINAURAL_SPLIT_PCM") - # Delay-align audio - assert isar_md_out_sr is not None - sr_delay_samples = IsarBitstream(isar_md_out_sr).delay_samples + # Note regarding delay alignment: both output audio files contain the same decoder delay. + # + # - When outputting to BINAURAL with -no_delay_cmp, decoder delay is present in the audio + # output, as expected. + # + # - When outputting to BINAURAL_SPLIT_PCM, decoder delay is never compensated in output + # audio (irrespective of the -no_delay_cmp flag). The delay value is saved in the ISAR + # metadata file and compensated at the post-rendering stage. audio_sr, _ = audiofile.readfile(str(wav_out_sr)) audio_bin, _ = audiofile.readfile(str(wav_out_bin)) - audio_sr = audio_sr[sr_delay_samples:] - audio_bin = audio_bin[:-sr_delay_samples] # Ensure audio and tracefiles are BE audio_cmp_result = audioarray.compare( -- GitLab From 57d6702efe20e4046027117191387447918cf139 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 13 Aug 2025 15:12:54 +0200 Subject: [PATCH 049/147] Fix missing initialisation of tmp st_ivas->flushing flag --- lib_dec/ivas_init_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 0b04eedb3b..3d93f68b02 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1234,6 +1234,10 @@ ivas_error ivas_init_decoder_front( } } +#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR + st_ivas->flushing = 0; +#endif + return error; } -- GitLab From cfc9dcaa1d721034c8bbc1692e8cc59aaaa28159 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 13 Aug 2025 15:45:49 +0200 Subject: [PATCH 050/147] Avoid flushing audio when outputting to ISAR bitstream --- apps/decoder.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/decoder.c b/apps/decoder.c index c02e770135..9c9054d62a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -3629,7 +3629,11 @@ static ivas_error decodeVoIP( goto cleanup; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( nSamplesFlushed && !isSplitCoded ) +#else if ( nSamplesFlushed ) +#endif { /* Write current frame */ if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) -- GitLab From 75b1060a7d4e8d6a8ce366edf527253f7bd089d3 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 13 Aug 2025 16:13:48 +0200 Subject: [PATCH 051/147] Fix formatting --- lib_isar/lib_isar_pre_rend.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 66d965001a..5318d217b2 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -272,26 +272,26 @@ void ISAR_PRE_REND_GetMultiBinPoseData( *------------------------------------------------------------------------*/ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( - SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ - const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ - const int32_t SplitRendBitRate, /* i : Split renderer bitrate */ - ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ - const int16_t isar_frame_size_ms, /* i : ISAR framesize */ - int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ - ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ + SPLIT_REND_WRAPPER *hSplitBin, /* i/o: Split renderer pre-renerer handle */ + const IVAS_QUATERNION headPosition, /* i : head rotation QUATERNION */ + const int32_t SplitRendBitRate, /* i : Split renderer bitrate */ + ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ + const int16_t isar_frame_size_ms, /* i : ISAR framesize */ + int16_t codec_frame_size_ms, /* i/o: ISAR transport codec framesize */ + ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: ISAR bits struct handle */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ - float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ + float *Cldfb_In_BinReal[][CLDFB_NO_COL_MAX], /* i/o: CLDFB real buffer */ + float *Cldfb_In_BinImag[][CLDFB_NO_COL_MAX], /* i/o: CLDFB imag buffer */ #else float Cldfb_In_BinReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB real buffer */ float Cldfb_In_BinImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB imag buffer */ #endif - const int16_t max_bands, /* i : CLDFB bands */ - float *output[], /* i/o: PCM in/out buffer */ - const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ - const int16_t cldfb_in_flag, /* i : Flag to indicate CLDFB or time domain input */ - const int16_t pcm_out_flag, /* i : Flag to indicate PCM output */ - const int16_t ro_md_flag /* i : Flag to indicate real only metadata for yaw */ + const int16_t max_bands, /* i : CLDFB bands */ + float *output[], /* i/o: PCM in/out buffer */ + const int16_t low_res_pre_rend_rot, /* i : low time resolution pre-renderer flag */ + const int16_t cldfb_in_flag, /* i : Flag to indicate CLDFB or time domain input */ + const int16_t pcm_out_flag, /* i : Flag to indicate PCM output */ + const int16_t ro_md_flag /* i : Flag to indicate real only metadata for yaw */ ) { ivas_error error; -- GitLab From ab4e5f4778b0c737b291dd76d10db0cbc536821d Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 14 Aug 2025 10:38:52 +0200 Subject: [PATCH 052/147] Keep function name prefixes consistent in ivas_cldfb_ring_buffer.c --- lib_dec/ivas_cldfb_ring_buffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_cldfb_ring_buffer.c b/lib_dec/ivas_cldfb_ring_buffer.c index fdabe30fe8..bc0e2c6ee0 100644 --- a/lib_dec/ivas_cldfb_ring_buffer.c +++ b/lib_dec/ivas_cldfb_ring_buffer.c @@ -227,7 +227,7 @@ void ivas_CLDFB_RINGBUF_Pop( /* Returns total number of buffered samples (including number of channels) */ -static uint32_t CLDFB_RINGBUF_total_size( +static uint32_t ivas_CLDFB_RINGBUF_total_size( ISAR_CLDFB_RINGBUF_HANDLE h ) { if ( ivas_CLDFB_RINGBUF_IsFull( h ) ) @@ -263,7 +263,7 @@ void ivas_CLDFB_RINGBUF_GetByIdx( const int16_t col_idx ) { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; - int32_t num_floats = (int32_t) CLDFB_RINGBUF_total_size( h ); + int32_t num_floats = (int32_t) ivas_CLDFB_RINGBUF_total_size( h ); uint32_t offset; assert( -num_floats <= idx && idx <= num_floats ); -- GitLab From d7fd842515cda390c0b770c9421c27f3bea9e1c4 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 14 Aug 2025 11:35:21 +0200 Subject: [PATCH 053/147] [tmp] extend timeout of renderer sanitizer tests --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f3a23e827..1b9a05f639 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -550,7 +550,7 @@ renderer-smoke-test: - .rules-merge-request-to-main needs: ["build-codec-linux-cmake"] stage: test - timeout: "30 minutes" + timeout: "60 minutes" artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" expire_in: 1 week @@ -570,7 +570,7 @@ renderer-smoke-test: - mv IVAS_dec IVAS_dec_ref - mv IVAS_rend IVAS_rend_ref - mv ISAR_post_rend ISAR_post_rend_ref - - testcase_timeout=180 + - testcase_timeout=360 # test renderer executable with cmake + asan renderer-asan: -- GitLab From caff271eef5cf95f95a13b9bf4f9dec07ec9fd99 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 14 Aug 2025 11:37:36 +0200 Subject: [PATCH 054/147] Revert "[tmp] extend timeout of renderer sanitizer tests" This reverts commit d7fd842515cda390c0b770c9421c27f3bea9e1c4. --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1b9a05f639..0f3a23e827 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -550,7 +550,7 @@ renderer-smoke-test: - .rules-merge-request-to-main needs: ["build-codec-linux-cmake"] stage: test - timeout: "60 minutes" + timeout: "30 minutes" artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" expire_in: 1 week @@ -570,7 +570,7 @@ renderer-smoke-test: - mv IVAS_dec IVAS_dec_ref - mv IVAS_rend IVAS_rend_ref - mv ISAR_post_rend ISAR_post_rend_ref - - testcase_timeout=360 + - testcase_timeout=180 # test renderer executable with cmake + asan renderer-asan: -- GitLab From fd09a4ce0b1d18f860009b8fb5a40bdde05f4f5d Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 21 Aug 2025 17:04:14 +0200 Subject: [PATCH 055/147] Extend split rendering tests to also run decoder in VoIP mode --- tests/split_rendering/constants.py | 11 ++++++++ tests/split_rendering/test_split_rendering.py | 26 ++++++++++++++++++- tests/split_rendering/utils.py | 22 ++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/tests/split_rendering/constants.py b/tests/split_rendering/constants.py index 0e5f715da2..7d58a03b0c 100644 --- a/tests/split_rendering/constants.py +++ b/tests/split_rendering/constants.py @@ -56,6 +56,14 @@ CUSTOM_LAYOUT_DIR = SCRIPTS_DIR.joinpath("ls_layouts") HR_TRAJECTORY_DIR = SCRIPTS_DIR.joinpath("trajectories") TESTV_DIR = SCRIPTS_DIR.joinpath("testv") +if platform.system() == "Windows": + TOOLS_DIR = SCRIPTS_DIR / "tools" / "Win32" +elif platform.system() == "Linux": + TOOLS_DIR = SCRIPTS_DIR / "tools"/ "Linux" +elif platform.system() == "Darwin": + TOOLS_DIR = SCRIPTS_DIR / "tools" / "Darwin" +else: + assert False, "Unsupported platform" """ Renderer configurations """ RENDERER_CONFIGS_DEFAULT_CODEC = [ @@ -180,6 +188,9 @@ INPUT_DURATION_SEC = 5 """ PLC constants """ PLC_ERROR_PATTERNS = [str(ep.stem) for ep in ERROR_PATTERNS_DIR.glob("*.ep")] +""" Delay profiles for testing VoIP mode """ +DELAY_PROFILES = [None, "dly_error_profile_5"] + """ Encoder commandline template """ SPLIT_PRE_COD_CMD = [ str(TESTS_DIR.parent.parent.joinpath("IVAS_cod")), diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index c284bf19f4..c6a795ca0c 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -37,6 +37,7 @@ from tests.split_rendering.utils import * """ Ambisonics """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_AMBI) @@ -54,6 +55,7 @@ def test_ambisonics_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -73,6 +75,7 @@ def test_ambisonics_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -114,6 +117,7 @@ def test_ambisonics_external_split( """ Multichannel """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MC) @@ -131,6 +135,7 @@ def test_multichannel_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -150,6 +155,7 @@ def test_multichannel_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -191,6 +197,7 @@ def test_multichannel_external_split( """ ISM """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_ISM) @@ -208,6 +215,7 @@ def test_ism_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -227,6 +235,7 @@ def test_ism_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -268,6 +277,7 @@ def test_ism_external_split( """ MASA """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MASA) @@ -285,6 +295,7 @@ def test_masa_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -304,6 +315,7 @@ def test_masa_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -345,6 +357,7 @@ def test_masa_external_split( """ OMASA """ +# @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) # Waiting for issue #1343 to be resolved @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_OMASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_OMASA) @@ -362,6 +375,7 @@ def test_omasa_full_chain_split( bitrate, render_config, trajectory, + delay_profile=None, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -381,6 +395,7 @@ def test_omasa_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -425,6 +440,7 @@ def test_omasa_external_split( """ OSBA """ +# @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) # Waiting for issue #1343 to be resolved @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_OSBA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_OSBA) @@ -442,6 +458,7 @@ def test_osba_full_chain_split( bitrate, render_config, trajectory, + delay_profile=None, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -461,6 +478,7 @@ def test_osba_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -552,6 +570,7 @@ full_chain_split_pcm_params = [ ] +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("in_fmt,bitrate,render_config", full_chain_split_pcm_params) def test_full_chain_split_pcm( record_property, @@ -565,6 +584,7 @@ def test_full_chain_split_pcm( in_fmt, bitrate, render_config, + delay_profile, ): trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") @@ -586,6 +606,7 @@ def test_full_chain_split_pcm( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -671,9 +692,10 @@ def test_framing_combinations_external_split( ) +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_FRAMING) -@pytest.mark.parametrize("in_fmt", ["5_1"]) +@pytest.mark.parametrize("in_fmt", ["5_1", "FOA"]) @pytest.mark.parametrize("pre_rend_fr", SPLIT_RENDERER_PRE_FRAMINGS) @pytest.mark.parametrize("post_rend_fr", SPLIT_RENDERER_POST_FRAMINGS) def test_framing_combinations_full_chain_split( @@ -690,6 +712,7 @@ def test_framing_combinations_full_chain_split( trajectory, post_rend_fr, pre_rend_fr, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -711,4 +734,5 @@ def test_framing_combinations_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) diff --git a/tests/split_rendering/utils.py b/tests/split_rendering/utils.py index 1a6ff61edc..ffb14eb55a 100644 --- a/tests/split_rendering/utils.py +++ b/tests/split_rendering/utils.py @@ -50,6 +50,7 @@ from tests.renderer.utils import ( run_isar_post_rend_cmd, run_ivas_isar_dec_cmd, run_ivas_isar_enc_cmd, + run_cmd, ) from tests.split_rendering.constants import * @@ -184,6 +185,7 @@ def run_full_chain_split_rendering( get_ssnr=False, get_odg=False, get_odg_bin=False, + delay_profile: Path | None=None, ) -> str: """ Runs the full split rendering chain consisting of @@ -201,6 +203,9 @@ def run_full_chain_split_rendering( renderer_fmt_for_filename = renderer_fmt.replace("BINAURAL_", "") filename_base = f"{in_fmt}_{bitrate}_{renderer_fmt_for_filename}_full_cfg_{render_config.stem}_fr_pre_{pre_rend_fr}_post_{post_rend_fr}" + if delay_profile: + filename_base += f"_{delay_profile.stem}" + ivas_bitstream_stem = f"{filename_base}.192" # NOTE: the split bitstream files need to have ".bit" extension otherwise the conformance test breaks split_bitstream_stem = f"{filename_base}.splt.bit" @@ -253,6 +258,20 @@ def run_full_chain_split_rendering( run_ivas_isar_enc_cmd(cmd) + if delay_profile: + rtp_bitstream = ivas_bitstream.with_suffix(".rtpg192") + cmd = [ + str(TOOLS_DIR / f"networkSimulator_g192{EXE_SUFFIX}"), + str(delay_profile), + str(ivas_bitstream), + str(rtp_bitstream), + str(tmp_dir / "tmp.netsimtrace"), + "1", + "0" + ] + run_cmd(cmd, test_info=test_info) + ivas_bitstream = rtp_bitstream + # decode to split-rendering bitstream cmd = SPLIT_PRE_DEC_CMD[:] @@ -269,6 +288,9 @@ def run_full_chain_split_rendering( if renderer_fmt == "BINAURAL_SPLIT_PCM": cmd[5:5] = ["-om", str(split_md_file)] + if delay_profile: + cmd[5:5] = ["-voip"] + run_ivas_isar_dec_cmd(cmd) # run split renderer -- GitLab From d66368c96f9d7206f8fb400db0eb81623042bf71 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 27 Aug 2025 12:48:40 +0200 Subject: [PATCH 056/147] Prepare TD_RINGBUF for use in split rendering --- lib_rend/ivas_prot_rend.h | 26 +++++++ lib_rend/ivas_td_ring_buffer.c | 129 +++++++++++++++++++++++++++++++++ lib_rend/lib_rend.c | 23 ++++++ 3 files changed, 178 insertions(+) diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 2268f62add..49909d1a6b 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1596,6 +1596,31 @@ void ivas_TD_RINGBUF_Close( TD_RINGBUF_HANDLE *ph /* i/o: Ring buffer handle */ ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +void ivas_TD_RINGBUF_PushInterleaved( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float *data, /* i : Input audio in interleaved channels layout */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ +); + +void ivas_TD_RINGBUF_PushChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float *p_channels[], /* i : Array of pointers to each input channel */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to store */ +); + +void ivas_TD_RINGBUF_PushConstant( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float value, /* i : Value to push */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ +); + +void ivas_TD_RINGBUF_PopChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + float *p_channels[], /* i : Array of pointers to each output channel */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to pop */ +); +#else void ivas_TD_RINGBUF_Push( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input data */ @@ -1612,6 +1637,7 @@ void ivas_TD_RINGBUF_Pop( float *data, /* i : Output data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to retrieve*/ ); +#endif uint32_t ivas_TD_RINGBUF_Size( const TD_RINGBUF_HANDLE h /* i : Ring buffer handle */ diff --git a/lib_rend/ivas_td_ring_buffer.c b/lib_rend/ivas_td_ring_buffer.c index 5c9c6089bb..2604fd9539 100644 --- a/lib_rend/ivas_td_ring_buffer.c +++ b/lib_rend/ivas_td_ring_buffer.c @@ -66,6 +66,40 @@ static int16_t ivas_td_ringbuf_has_space_for_num_samples( return (int16_t) ( ivas_td_ringbuf_total_size( h ) + num_samples <= h->capacity ); } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +static void ivas_td_ringbuf_push_interleaved( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float *data, /* i : Input audio in interleaved channels layout */ + const uint32_t num_samples_per_channel, /* i : Number of samples per channel to push */ + const uint16_t read_stride /* i: : 1 for normal operation, 0 for reading from a single input value */ +) +{ + uint32_t s, read_s; + + assert( h != NULL ); + assert( data != NULL ); + assert( read_stride == 0 || read_stride == 1 ); + assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); + + for ( s = 0, read_s = 0; s < num_samples_per_channel * h->num_channels; ++s, read_s += read_stride ) + { + h->data[h->write_pos] = data[read_s]; + ++h->write_pos; + + if ( h->write_pos == h->capacity ) + { + h->write_pos = 0; + } + } + + if ( h->read_pos == h->write_pos ) + { + h->is_full = 1; + } + + return; +} +#endif /*-----------------------------------------------------------------------* * Global function definitions @@ -150,6 +184,36 @@ void ivas_TD_RINGBUF_Close( } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PushInterleaved() + * + * Push samples from a buffer with interleaved channel layout onto the back of the TD ring buffer. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PushInterleaved( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float *data, /* i : Input audio in interleaved channels layout */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ +) +{ + ivas_td_ringbuf_push_interleaved( h, data, num_samples_per_channel, 1 ); + + return; +} + +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PushChannels() + * + * Push samples from channel pointers onto the back of the TD ring buffer. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PushChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float *p_channels[], /* i : Array of pointers to each input channel */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ +) +#else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_Push() * @@ -162,17 +226,30 @@ void ivas_TD_RINGBUF_Push( const float *data, /* i : Input data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to store */ ) +#endif { uint32_t s; uint16_t c; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + assert( h != NULL ); + assert( p_channels != NULL ); + for ( c = 0; c < h->num_channels; ++c ) + { + assert( p_channels[c] != NULL ); + } +#endif assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); for ( s = 0; s < num_samples_per_channel; ++s ) { for ( c = 0; c < h->num_channels; ++c ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + h->data[h->write_pos] = p_channels[c][s]; +#else h->data[h->write_pos] = *( data + c * num_samples_per_channel + s ); +#endif ++h->write_pos; if ( h->write_pos == h->capacity ) @@ -191,6 +268,24 @@ void ivas_TD_RINGBUF_Push( } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PushConstant() + * + * Push samples with a constant value onto the back of the TD ring buffer. + *---------------------------------------------------------------------*/ + +void ivas_TD_RINGBUF_PushConstant( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float value, /* i : Value to push */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ +) +{ + ivas_td_ringbuf_push_interleaved( h, &value, num_samples_per_channel, 0 ); + + return; +} +#else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushZeros() * @@ -232,8 +327,22 @@ void ivas_TD_RINGBUF_PushZeros( return; } +#endif + +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +/*---------------------------------------------------------------------* + * ivas_TD_RINGBUF_PopChannels() + * + * Pop samples from the front of the TD ring buffer to an array of channel pointers. + *---------------------------------------------------------------------*/ +void ivas_TD_RINGBUF_PopChannels( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + float *p_channels[], /* i : Array of pointers to each output channel */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to pop */ +) +#else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_Pop() * @@ -245,17 +354,30 @@ void ivas_TD_RINGBUF_Pop( float *data, /* i : Output data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to retrieve */ ) +#endif { uint32_t s; uint16_t c; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + assert( h != NULL ); + assert( p_channels != NULL ); + for ( c = 0; c < h->num_channels; ++c ) + { + assert( p_channels[c] != NULL ); + } +#endif assert( ivas_td_ringbuf_total_size( h ) >= num_samples_per_channel * h->num_channels ); for ( s = 0; s < num_samples_per_channel; ++s ) { for ( c = 0; c < h->num_channels; ++c ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + p_channels[c][s] = h->data[h->read_pos]; +#else *( data + c * num_samples_per_channel + s ) = h->data[h->read_pos]; +#endif ++h->read_pos; if ( h->read_pos == h->capacity ) @@ -265,10 +387,17 @@ void ivas_TD_RINGBUF_Pop( } } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( num_samples_per_channel != 0 ) + { + h->is_full = 0; + } +#else if ( h->is_full ) { h->is_full = 0; } +#endif return; } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 25352b2711..77a58f2c27 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1479,6 +1479,11 @@ static ivas_error alignInputDelay( int16_t maxGlobalDelaySamples; int32_t numSamplesToPush, numSamplesToPop; uint32_t ringBufferSize, preDelay; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + int32_t i; + const float *p_read_channels[MAX_INPUT_CHANNELS]; + float *p_write_channels[MAX_INPUT_CHANNELS]; +#endif maxGlobalDelaySamples = latencyNsToSamples( sampleRateOut, maxGlobalDelayNs ); maxGlobalDelaySamples *= cldfb2tdSampleFact; @@ -1501,7 +1506,11 @@ static ivas_error alignInputDelay( /* for the first frame we need to push zeros to align the input delay to the global delay * and then push a frame of actual data */ +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ivas_TD_RINGBUF_PushConstant( inputBase->delayBuffer, 0, preDelay ); +#else ivas_TD_RINGBUF_PushZeros( inputBase->delayBuffer, preDelay ); +#endif /* for ISM inputs, ensure the metadata sync delay is updated */ if ( getAudioConfigType( inputBase->inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) @@ -1519,8 +1528,22 @@ static ivas_error alignInputDelay( numSamplesToPush = flushInputs ? 0 : inputAudio.config.numSamplesPerChannel; numSamplesToPop = flushInputs ? ivas_TD_RINGBUF_Size( inputBase->delayBuffer ) : (uint32_t) inputAudio.config.numSamplesPerChannel; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + for ( i = 0; i < inputAudio.config.numChannels; ++i ) + { + p_read_channels[i] = inputAudio.data + i * numSamplesToPush; + } + ivas_TD_RINGBUF_PushChannels( inputBase->delayBuffer, p_read_channels, numSamplesToPush ); + + for ( i = 0; i < inputAudio.config.numChannels; ++i ) + { + p_write_channels[i] = inputBase->inputBuffer.data + i * numSamplesToPop; + } + ivas_TD_RINGBUF_PopChannels( inputBase->delayBuffer, p_write_channels, numSamplesToPop ); +#else ivas_TD_RINGBUF_Push( inputBase->delayBuffer, inputAudio.data, numSamplesToPush ); ivas_TD_RINGBUF_Pop( inputBase->delayBuffer, inputBase->inputBuffer.data, numSamplesToPop ); +#endif } else { -- GitLab From 3bdd36d26dd83ffc46add1ce012533bf1d7f6d9f Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 27 Aug 2025 16:21:24 +0200 Subject: [PATCH 057/147] Keep head poses in ring buffer to persist data between calls to IVAS_DEC_VoIP_GetSplitBinauralBitstream --- lib_dec/ivas_stat_dec.h | 1 + lib_dec/lib_dec.c | 83 ++++++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 22 deletions(-) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 39a50b5e52..b0e6631361 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -849,6 +849,7 @@ typedef struct typedef struct { #ifdef FIX_1119_SPLIT_RENDERING_VOIP + TD_RINGBUF_HANDLE hMultiBinTdData; CLDFB_RINGBUF_HANDLE hMultiBinCldfbData[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS]; #else ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE hMultiBinCldfbData; /*scratch buffer for frame by frame processing*/ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 1b73d7ca23..3b3a439357 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -129,6 +129,10 @@ static ivas_error ivas_dec_init_split_rend( Decoder_Struct *st_ivas ); static ivas_error ivas_create_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); static void ivas_destroy_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); static int16_t get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +static int16_t get_render_frame_size_samples( Decoder_Struct *st_ivas ); +static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct* st_ivas ); +#endif static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesRendered ); @@ -637,6 +641,13 @@ ivas_error IVAS_DEC_GetRenderFramesize( return IVAS_ERR_OK; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +static int16_t get_render_frame_size_samples( Decoder_Struct *st_ivas ) +{ + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * st_ivas->hDecoderConfig->render_framesize / ( FRAMES_PER_SEC * IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ); +} +#endif + /*---------------------------------------------------------------------* * IVAS_DEC_GetGetRenderFramesizeSamples( ) * @@ -653,7 +664,11 @@ ivas_error IVAS_DEC_GetRenderFramesizeSamples( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + *render_framesize = get_render_frame_size_samples( hIvasDec->st_ivas ); +#else *render_framesize = (int16_t) ( hIvasDec->st_ivas->hDecoderConfig->output_Fs * hIvasDec->st_ivas->hDecoderConfig->render_framesize / ( FRAMES_PER_SEC * IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ); +#endif return IVAS_ERR_OK; } @@ -1866,14 +1881,12 @@ static int16_t isar_get_frame_size( static ivas_error isar_render_poses( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ - float **p_head_pose_buf, int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { Decoder_Struct *st_ivas; float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; - int16_t i, j; ivas_error error; ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; int16_t numPoses; @@ -1907,13 +1920,9 @@ static ivas_error isar_render_poses( return IVAS_ERR_OK; } - /* change buffer layout */ - for ( i = 0; i < *nOutSamples; ++i ) + if ( !ivas_dec_split_rend_cldfb_in( st_ivas ) ) { - for ( j = 0; j < BINAURAL_CHANNELS * numPoses; ++j ) - { - p_head_pose_buf[j][i] = pcmBuf[i * BINAURAL_CHANNELS * numPoses + j]; - } + ivas_TD_RINGBUF_PushInterleaved( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, pcmBuf, *nOutSamples ); } return error; @@ -2057,12 +2066,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; numSamplesPerChannelToOutput = isar_get_frame_size( st_ivas ); - for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) - { - p_head_pose_buf[i] = head_pose_buf[i]; - } - - error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ); + error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, nOutSamples, needNewFrame ); if ( error != IVAS_ERR_OK ) { return error; @@ -2072,6 +2076,16 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_OK; } + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] = head_pose_buf[i]; + } + + if ( !ivas_dec_split_rend_cldfb_in( st_ivas ) ) + { + ivas_TD_RINGBUF_PopChannels( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, *nOutSamples ); + } + error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); if ( error != IVAS_ERR_OK ) { @@ -3932,14 +3946,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { - /* Move output pointers forward */ - for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) - { - p_head_pose_buf[i] = &head_pose_buf[i][*nSamplesRendered]; - } - /* Render head poses from time-scaled transport channels */ - if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) { return error; } @@ -3966,12 +3974,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples ( hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hIvasDec->st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - /* Set pointers to beginning of head pose buffers */ for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) { p_head_pose_buf[i] = head_pose_buf[i]; } + if ( !ivas_dec_split_rend_cldfb_in( st_ivas ) ) + { + ivas_TD_RINGBUF_PopChannels( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, *nSamplesRendered ); + } + /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); if ( error != IVAS_ERR_OK ) @@ -5186,6 +5198,7 @@ static ivas_error ivas_create_handle_isar( isar_init_split_rend_handles( &hSplitBinRend->splitrend ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP + hSplitBinRend->hMultiBinTdData = NULL; for ( i = 0; i < (int16_t) ( MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS ); ++i ) { hSplitBinRend->hMultiBinCldfbData[i] = NULL; @@ -5219,6 +5232,10 @@ static void ivas_destroy_handle_isar( if ( *hSplitBinRend != NULL ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( ( *hSplitBinRend )->hMultiBinTdData != NULL ) + { + ivas_TD_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinTdData ); + } for ( i = 0; i < (int16_t) ( MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS ); ++i ) { if ( ( *hSplitBinRend )->hMultiBinCldfbData[i] != NULL ) @@ -5403,6 +5420,16 @@ static ivas_error ivas_dec_reconfig_split_rend( return IVAS_ERR_OK; } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP +static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct* st_ivas ) +{ + + return st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM; +} +#endif /*-------------------------------------------------------------------* * ivas_dec_init_split_rend() @@ -5424,6 +5451,9 @@ static ivas_error ivas_dec_init_split_rend( pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; cldfb_in_flag = 0; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + cldfb_in_flag = ivas_dec_split_rend_cldfb_in( st_ivas ); +#else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || @@ -5431,6 +5461,7 @@ static ivas_error ivas_dec_init_split_rend( { cldfb_in_flag = 1; } +#endif #ifdef FIX_1119_SPLIT_RENDERING_VOIP ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); @@ -5449,6 +5480,14 @@ static ivas_error ivas_dec_init_split_rend( } } } + else + { + error = ivas_TD_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinTdData, get_render_frame_size_samples( st_ivas ), num_poses * BINAURAL_CHANNELS ); + if ( error != IVAS_ERR_OK ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); + } + } #else /* note: this is intra-frame heap memory */ if ( ( st_ivas->hSplitBinRend->hMultiBinCldfbData = (ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA ) ) ) == NULL ) -- GitLab From a2a0096b0d0e8aa46745040c842f722ab0a4c9f4 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 29 Aug 2025 10:16:00 +0200 Subject: [PATCH 058/147] Formatting --- lib_dec/lib_dec.c | 14 +++++++------- lib_rend/ivas_td_ring_buffer.c | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 3b3a439357..f9f3121d35 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -131,7 +131,7 @@ static void ivas_destroy_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplit static int16_t get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP static int16_t get_render_frame_size_samples( Decoder_Struct *st_ivas ); -static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct* st_ivas ); +static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct *st_ivas ); #endif static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesRendered ); @@ -1881,8 +1881,8 @@ static int16_t isar_get_frame_size( static ivas_error isar_render_poses( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ - int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ - bool *needNewFrame /* o : indication that the decoder needs a new frame */ + int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ + bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) { Decoder_Struct *st_ivas; @@ -5421,13 +5421,13 @@ static ivas_error ivas_dec_reconfig_split_rend( } #ifdef FIX_1119_SPLIT_RENDERING_VOIP -static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct* st_ivas ) +static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct *st_ivas ) { return st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || - st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM; + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM; } #endif diff --git a/lib_rend/ivas_td_ring_buffer.c b/lib_rend/ivas_td_ring_buffer.c index 2604fd9539..6381a00e90 100644 --- a/lib_rend/ivas_td_ring_buffer.c +++ b/lib_rend/ivas_td_ring_buffer.c @@ -275,10 +275,10 @@ void ivas_TD_RINGBUF_Push( * Push samples with a constant value onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ -void ivas_TD_RINGBUF_PushConstant( - TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ - const float value, /* i : Value to push */ - const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ +void ivas_TD_RINGBUF_PushConstant( + TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ + const float value, /* i : Value to push */ + const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) { ivas_td_ringbuf_push_interleaved( h, &value, num_samples_per_channel, 0 ); -- GitLab From 5c74a6b28ba5e39d9afe9feb15c21d096a7ed90b Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 29 Aug 2025 14:07:42 +0200 Subject: [PATCH 059/147] Increase timeout for renderer sanitizer jobs --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bca6cb6c64..7a02bd69e5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -550,7 +550,7 @@ renderer-smoke-test: - .rules-merge-request-to-main needs: ["build-codec-linux-cmake"] stage: test - timeout: "1 hour" + timeout: "90 minutes" artifacts: name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" expire_in: 1 week -- GitLab From e26011eb64ffdc39e4001a770e924ee833dd287b Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 29 Aug 2025 15:03:23 +0200 Subject: [PATCH 060/147] Clean up in tests/split_rendering/test_voip_be_splitrend_vs_binaural.py --- .../test_voip_be_splitrend_vs_binaural.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py index dd9c4f317c..fcd6cb231f 100644 --- a/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py +++ b/tests/split_rendering/test_voip_be_splitrend_vs_binaural.py @@ -42,7 +42,6 @@ from tests.test_be_for_jbm_neutral_dly_profile import ( INPUT_FILES, get_options_cod, ) -from split_rendering.isar_bstool import IsarBitstream from pyaudio3dtools import audioarray, audiofile IN_FORMATS = [ @@ -67,7 +66,7 @@ def test_voip_be_splitrend_vs_binaural( delay_profile, dut_encoder_frontend, dut_decoder_frontend, - bitrate=128000, + ivas_bitrate=128000, ): with TemporaryDirectory() as tmp_dir: tmp_dir = Path(tmp_dir) @@ -81,7 +80,7 @@ def test_voip_be_splitrend_vs_binaural( dtx = False wav_in = TESTV_DIR / INPUT_FILES[in_format] dut_encoder_frontend.run( - bitrate, + ivas_bitrate, sampling_rate_khz, wav_in, bitstream_file, @@ -92,13 +91,16 @@ def test_voip_be_splitrend_vs_binaural( def run_decoder(out_format): options = [] - # Head trajectory must be static due to the slight time shift between audio outputs of BINAURAL/SPLIT_PCM - head_traj = Path(SCRIPTS_DIR / "trajectories/const000.csv") + # With CLDFB pose correction (default with BINAURAL_SPLIT_PCM), a 20 ms audio frame is + # rendered with only one head position (first of the 4 per frame). If we want to compare + # the output from BINAURAL_SPLIT_PCM to output from BINAURAL, the head trajectory must + # be static. + head_traj = Path(SCRIPTS_DIR / "trajectories/const000.csv") options.extend(["-T", str(head_traj)]) wav_out = ( tmp_dir - / f"{in_format}-{bitrate}-{out_format}-dly{delay_profile_id}.wav" + / f"{in_format}-{ivas_bitrate}-{out_format}-dly{delay_profile_id}.wav" ).absolute() trace_out = wav_out.with_suffix(".trace") @@ -122,7 +124,7 @@ def test_voip_be_splitrend_vs_binaural( return wav_out, trace_out, isar_md_file wav_out_bin, trace_out_bin, _ = run_decoder("BINAURAL") - wav_out_sr, trace_out_sr, isar_md_out_sr = run_decoder("BINAURAL_SPLIT_PCM") + wav_out_sr, trace_out_sr, _ = run_decoder("BINAURAL_SPLIT_PCM") # Note regarding delay alignment: both output audio files contain the same decoder delay. # -- GitLab From f461fe5ea8afcb2d482ccdc20b7c675e1b831680 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 29 Aug 2025 17:02:52 +0200 Subject: [PATCH 061/147] Fix usan problems in CLDFB_RINGBUF_GetByIdx --- lib_dec/cldfb_ring_buffer.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib_dec/cldfb_ring_buffer.c b/lib_dec/cldfb_ring_buffer.c index c6be06b1ea..959929d572 100644 --- a/lib_dec/cldfb_ring_buffer.c +++ b/lib_dec/cldfb_ring_buffer.c @@ -153,10 +153,7 @@ void CLDFB_RINGBUF_Pop( CLDFB_RINGBUF_HANDLE h, float *real, float *imag, uint16 h->read_pos = 0; } - if ( h->is_full ) - { - h->is_full = 0; - } + h->is_full = 0; return; } @@ -181,17 +178,29 @@ void CLDFB_RINGBUF_GetByIdx( CLDFB_RINGBUF_HANDLE h, float **p_real, float **p_i { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; int32_t num_floats = (int32_t) total_size( h ); - uint32_t offset; + uint32_t offset, uidx; assert( -num_floats <= idx && idx <= num_floats ); if ( idx >= 0 ) { - offset = ( h->read_pos + idx ) % h->capacity; + offset = h->read_pos + idx; + if ( h->capacity <= offset ) + { + offset -= h->capacity; + } } else { - offset = ( h->write_pos + h->capacity + idx ) % h->capacity; + uidx = (uint32_t) -idx; + if ( uidx <= h->write_pos ) + { + offset = h->write_pos - uidx; + } + else + { + offset = h->write_pos + h->capacity - uidx; + } } *p_real = &h->real[offset]; -- GitLab From 7668943b3c92f859dfe88a800a290b68dbe7159c Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 1 Sep 2025 12:30:58 +0200 Subject: [PATCH 062/147] Combined orientation data: use the same indexing for helper head poses as for the main pose This fixes an out-of-bounds array access in split rendering --- lib_rend/ivas_dirac_dec_binaural_functions.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 33328e365c..7b2630fd67 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -854,11 +854,19 @@ static void ivas_dirac_dec_binaural_internal( mvr2r( st_ivas->hDiracDecBin[0]->ChCrossIm, hDiracDecBin->ChCrossIm, hSpatParamRendCom->num_freq_bands ); ivas_dirac_dec_binaural_formulate_target_covariance_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_local, subframe, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, +#else hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0, +#endif subFrameTotalEne, IIReneLimiter, st_ivas->hMasaIsmData ); ivas_dirac_dec_binaural_determine_processing_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat_local, subframe, +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, +#else hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0, +#endif nchanSeparateChannels, st_ivas->hMasaIsmData ); -- GitLab From 69eb1fe9f2b960bb7192001ce78cc47870024b77 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 1 Sep 2025 13:25:44 +0200 Subject: [PATCH 063/147] [tmp] Remove new test cases in test_split_rendering.py Those were causing CI to fail at the comparison stage, as the main branch has no corresponding test outputs to compare to. The new test cases will be merged later via a separate MR. --- tests/split_rendering/test_split_rendering.py | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index 8f4d71a406..cac6c9b949 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -37,7 +37,6 @@ from tests.split_rendering.utils import * """ Ambisonics """ -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_AMBI) @@ -55,7 +54,6 @@ def test_ambisonics_full_chain_split( bitrate, render_config, trajectory, - delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -75,7 +73,6 @@ def test_ambisonics_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -117,7 +114,6 @@ def test_ambisonics_external_split( """ Multichannel """ -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MC) @@ -135,7 +131,6 @@ def test_multichannel_full_chain_split( bitrate, render_config, trajectory, - delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -155,7 +150,6 @@ def test_multichannel_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -197,7 +191,6 @@ def test_multichannel_external_split( """ ISM """ -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_ISM) @@ -215,7 +208,6 @@ def test_ism_full_chain_split( bitrate, render_config, trajectory, - delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -235,7 +227,6 @@ def test_ism_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -277,7 +268,6 @@ def test_ism_external_split( """ MASA """ -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MASA) @@ -295,7 +285,6 @@ def test_masa_full_chain_split( bitrate, render_config, trajectory, - delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -315,7 +304,6 @@ def test_masa_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -357,7 +345,6 @@ def test_masa_external_split( """ OMASA """ -# @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) # Waiting for issue #1343 to be resolved @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_OMASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_OMASA) @@ -375,7 +362,6 @@ def test_omasa_full_chain_split( bitrate, render_config, trajectory, - delay_profile=None, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -395,7 +381,6 @@ def test_omasa_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -437,7 +422,6 @@ def test_omasa_external_split( """ OSBA """ -# @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) # Waiting for issue #1343 to be resolved @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_OSBA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_OSBA) @@ -455,7 +439,6 @@ def test_osba_full_chain_split( bitrate, render_config, trajectory, - delay_profile=None, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -475,7 +458,6 @@ def test_osba_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -567,7 +549,6 @@ full_chain_split_pcm_params = [ ] -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("in_fmt,bitrate,render_config", full_chain_split_pcm_params) def test_full_chain_split_pcm( record_property, @@ -581,7 +562,6 @@ def test_full_chain_split_pcm( in_fmt, bitrate, render_config, - delay_profile, ): trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") @@ -603,7 +583,6 @@ def test_full_chain_split_pcm( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -689,10 +668,9 @@ def test_framing_combinations_external_split( ) -@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_FRAMING) -@pytest.mark.parametrize("in_fmt", ["5_1", "FOA"]) +@pytest.mark.parametrize("in_fmt", ["5_1"]) @pytest.mark.parametrize("pre_rend_fr", SPLIT_RENDERER_PRE_FRAMINGS) @pytest.mark.parametrize("post_rend_fr", SPLIT_RENDERER_POST_FRAMINGS) def test_framing_combinations_full_chain_split( @@ -709,7 +687,6 @@ def test_framing_combinations_full_chain_split( trajectory, post_rend_fr, pre_rend_fr, - delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -731,5 +708,4 @@ def test_framing_combinations_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, - delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) -- GitLab From 1b771d88f2951b1c0f6dc1973bc0ec6978db0df2 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Mon, 1 Sep 2025 13:37:52 +0200 Subject: [PATCH 064/147] Revert "[tmp] Remove new test cases in test_split_rendering.py" This reverts commit 69eb1fe9f2b960bb7192001ce78cc47870024b77. --- tests/split_rendering/test_split_rendering.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/split_rendering/test_split_rendering.py b/tests/split_rendering/test_split_rendering.py index cac6c9b949..8f4d71a406 100644 --- a/tests/split_rendering/test_split_rendering.py +++ b/tests/split_rendering/test_split_rendering.py @@ -37,6 +37,7 @@ from tests.split_rendering.utils import * """ Ambisonics """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_AMBI) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_AMBI) @@ -54,6 +55,7 @@ def test_ambisonics_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -73,6 +75,7 @@ def test_ambisonics_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -114,6 +117,7 @@ def test_ambisonics_external_split( """ Multichannel """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MC) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MC) @@ -131,6 +135,7 @@ def test_multichannel_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -150,6 +155,7 @@ def test_multichannel_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -191,6 +197,7 @@ def test_multichannel_external_split( """ ISM """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_ISM) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_ISM) @@ -208,6 +215,7 @@ def test_ism_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -227,6 +235,7 @@ def test_ism_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -268,6 +277,7 @@ def test_ism_external_split( """ MASA """ +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_MASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_MASA) @@ -285,6 +295,7 @@ def test_masa_full_chain_split( bitrate, render_config, trajectory, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -304,6 +315,7 @@ def test_masa_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -345,6 +357,7 @@ def test_masa_external_split( """ OMASA """ +# @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) # Waiting for issue #1343 to be resolved @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_OMASA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_OMASA) @@ -362,6 +375,7 @@ def test_omasa_full_chain_split( bitrate, render_config, trajectory, + delay_profile=None, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -381,6 +395,7 @@ def test_omasa_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -422,6 +437,7 @@ def test_omasa_external_split( """ OSBA """ +# @pytest.mark.parametrize("delay_profile", DELAY_PROFILES) # Waiting for issue #1343 to be resolved @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_TO_TEST_OSBA) @pytest.mark.parametrize("bitrate", IVAS_BITRATES_OSBA) @@ -439,6 +455,7 @@ def test_osba_full_chain_split( bitrate, render_config, trajectory, + delay_profile=None, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -458,6 +475,7 @@ def test_osba_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -549,6 +567,7 @@ full_chain_split_pcm_params = [ ] +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("in_fmt,bitrate,render_config", full_chain_split_pcm_params) def test_full_chain_split_pcm( record_property, @@ -562,6 +581,7 @@ def test_full_chain_split_pcm( in_fmt, bitrate, render_config, + delay_profile, ): trajectory = SPLIT_REND_HR_TRAJECTORIES_TO_TEST[0] post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") @@ -583,6 +603,7 @@ def test_full_chain_split_pcm( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) @@ -668,9 +689,10 @@ def test_framing_combinations_external_split( ) +@pytest.mark.parametrize("delay_profile", DELAY_PROFILES) @pytest.mark.parametrize("trajectory", SPLIT_REND_HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("render_config", RENDERER_CONFIGS_FRAMING) -@pytest.mark.parametrize("in_fmt", ["5_1"]) +@pytest.mark.parametrize("in_fmt", ["5_1", "FOA"]) @pytest.mark.parametrize("pre_rend_fr", SPLIT_RENDERER_PRE_FRAMINGS) @pytest.mark.parametrize("post_rend_fr", SPLIT_RENDERER_POST_FRAMINGS) def test_framing_combinations_full_chain_split( @@ -687,6 +709,7 @@ def test_framing_combinations_full_chain_split( trajectory, post_rend_fr, pre_rend_fr, + delay_profile, ): post_trajectory = HR_TRAJECTORY_DIR.joinpath(f"{trajectory}.csv") pre_trajectory = post_trajectory.with_stem(f"{post_trajectory.stem}_delayed") @@ -708,4 +731,5 @@ def test_framing_combinations_full_chain_split( get_ssnr=get_ssnr, get_odg=get_odg, get_odg_bin=get_odg_bin, + delay_profile=SCRIPTS_DIR / "dly_error_profiles" / f"{delay_profile}.dat" if delay_profile else None, ) -- GitLab From 460279d98e38aa2477627b89112a474efe5c2da9 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 2 Sep 2025 08:44:46 +0200 Subject: [PATCH 065/147] Use 512 kbps, 3 DOF as default config for split rendering in test_be_for_jbm_neutral_dly_profile.py --- tests/test_be_for_jbm_neutral_dly_profile.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_be_for_jbm_neutral_dly_profile.py b/tests/test_be_for_jbm_neutral_dly_profile.py index 8642bc5658..b6f333b984 100644 --- a/tests/test_be_for_jbm_neutral_dly_profile.py +++ b/tests/test_be_for_jbm_neutral_dly_profile.py @@ -7,7 +7,7 @@ from tempfile import TemporaryDirectory from pathlib import Path from .constants import TESTV_DIR, SCRIPTS_DIR -from .split_rendering.constants import HR_TRAJECTORY_DIR +from .split_rendering.constants import HR_TRAJECTORY_DIR, RENDER_CFG_DIR sys.path.append(str(SCRIPTS_DIR)) from pyaudio3dtools import audiofile, audioarray @@ -151,7 +151,9 @@ def get_options_dec( ): options = [] - if output_format == "BINAURAL_SPLIT_PCM": + if "BINAURAL_SPLIT" in output_format.upper(): + options.extend(["-render_config", str(RENDER_CFG_DIR / "split_renderer_config_3dof_512k_default.txt")]) + options.extend(["-om", str(output_file.with_suffix(".isarmd"))]) if is_split_rend(output_format): -- GitLab From 887ffd0cf20aa77456600fc73f18b44c393db6da Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 2 Sep 2025 08:45:45 +0200 Subject: [PATCH 066/147] Minor improvements in test_be_for_jbm_neutral_dly_profile.py --- tests/test_be_for_jbm_neutral_dly_profile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_be_for_jbm_neutral_dly_profile.py b/tests/test_be_for_jbm_neutral_dly_profile.py index b6f333b984..dee54b7d94 100644 --- a/tests/test_be_for_jbm_neutral_dly_profile.py +++ b/tests/test_be_for_jbm_neutral_dly_profile.py @@ -90,14 +90,13 @@ TESTCASES_NO_DTX = [ # BINAURAL_SPLIT_CODED with LCLD ["HOA3", 128000, "BINAURAL_SPLIT_CODED"], ["OSBA_ISM4_FOA", 128000, "BINAURAL_SPLIT_CODED"], - ] DLY_PROFILE = SCRIPTS_DIR.joinpath("dly_error_profiles/dly_error_profile_0.dat") JBM_NEUTRAL_DELAY_MS = 60 def is_split_rend(format) -> bool: - return format in ["BINAURAL_SPLIT_CODED", "BINAURAL_SPLIT_PCM"] + return format.upper() in ["BINAURAL_SPLIT_CODED", "BINAURAL_SPLIT_PCM"] def get_options_cod(in_format, dtx): @@ -154,6 +153,7 @@ def get_options_dec( if "BINAURAL_SPLIT" in output_format.upper(): options.extend(["-render_config", str(RENDER_CFG_DIR / "split_renderer_config_3dof_512k_default.txt")]) + if output_format.upper() == "BINAURAL_SPLIT_PCM": options.extend(["-om", str(output_file.with_suffix(".isarmd"))]) if is_split_rend(output_format): -- GitLab From 18c66bcd57f4f110c493de71307ad518fdf88b52 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 14:52:29 +0200 Subject: [PATCH 067/147] move scripts/ambi_converter.c to apps --- {scripts => apps}/ambi_converter.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {scripts => apps}/ambi_converter.c (100%) diff --git a/scripts/ambi_converter.c b/apps/ambi_converter.c similarity index 100% rename from scripts/ambi_converter.c rename to apps/ambi_converter.c -- GitLab From e5d32506d39217025bbb5b83a31a9cc6faa74388 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 15:13:21 +0200 Subject: [PATCH 068/147] add ambi_converter to Makefile --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index 63ac29842b..ff161f10cf 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ CLI_APIDEC ?= IVAS_dec CLI_APIENC ?= IVAS_cod CLI_APIREND ?= IVAS_rend CLI_APIPOSTREND ?= ISAR_post_rend +CLI_AMBICONVERT ?= ambi_converter LIB_LIBCOM ?= libivascom.a LIB_LIBDEBUG ?= libivasdebug.a LIB_LIBDEC ?= libivasdec.a @@ -154,6 +155,7 @@ OBJS_CLI_APIDEC = $(OBJDIR)/decoder.o OBJS_CLI_APIENC = $(OBJDIR)/encoder.o OBJS_CLI_APPREND = $(OBJDIR)/renderer.o OBJS_CLI_APPPOSTREND = $(OBJDIR)/isar_post_rend.o +OBJS_CLI_AMBICONVERT = $(OBJDIR)/ambi_converter.o DEPS = $(addprefix $(OBJDIR)/,$(SRCS_LIBCOM:.c=.P) $(SRCS_LIBDEBUG:.c=.P) $(SRCS_LIBDEC:.c=.P) \ $(SRCS_LIBENC:.c=.P) $(SRCS_LIBUTIL:.c=.P) $(SRCS_LIBREND:.c=.P) $(SRCS_LIBISAR:.c=.P) \ @@ -204,6 +206,9 @@ $(CLI_APIREND): $(OBJS_CLI_APPREND) $(LIB_LIBREND) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(CLI_APIPOSTREND): $(OBJS_CLI_APPPOSTREND) $(LIB_LIBISAR) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LC3PLUS) $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APPPOSTREND) -L. -lisar -livasutil -livasdebug -livascom -llc3plus $(LDLIBS) -o $(CLI_APIPOSTREND) +$(CLI_AMBICONVERT): $(OBJS_CLI_AMBICONVERT) $(OBJS_LIBUTIL) $(LIB_LIBUTIL) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_AMBICONVERT) $(LDLIBS) -o $(CLI_AMBICONVERT) + libs: $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBREND) $(LIB_LIBISAR) $(LIB_LC3PLUS) $(LIB_LIBUTIL) clean: -- GitLab From b3eadcb26bc040618958fd3de693fbf492ef47f8 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 15:14:11 +0200 Subject: [PATCH 069/147] fix compile warnings --- apps/ambi_converter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index afab8195e1..e499622fbb 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -126,7 +126,7 @@ int main( int argc, char *argv[] ) break; } - for ( int16_t i = 0; i < numSamplesRead32; i++ ) + for ( uint16_t i = 0; i < numSamplesRead32; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { @@ -141,7 +141,7 @@ int main( int argc, char *argv[] ) } - for ( int16_t i = 0; i < numSamplesRead32; i++ ) + for ( uint16_t i = 0; i < numSamplesRead32; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { -- GitLab From fecc42d499711e017cd9b825630a5bf31c6c05ac Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 15:33:09 +0200 Subject: [PATCH 070/147] fix problems with ambi_converter in Makefile --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ff161f10cf..c72aaacd8d 100644 --- a/Makefile +++ b/Makefile @@ -151,6 +151,7 @@ OBJS_LIBREND = $(addprefix $(OBJDIR)/,$(SRCS_LIBREND:.c=.o)) OBJS_LIBISAR = $(addprefix $(OBJDIR)/,$(SRCS_LIBISAR:.c=.o)) OBJS_LC3PLUS = $(addprefix $(OBJDIR)/,$(SRCS_LC3PLUS:.c=.o)) OBJS_LIBUTIL = $(addprefix $(OBJDIR)/,$(SRCS_LIBUTIL:.c=.o)) +OBJS_AMBICONVERT = $(OBJDIR)/ambi_convert.o OBJS_CLI_APIDEC = $(OBJDIR)/decoder.o OBJS_CLI_APIENC = $(OBJDIR)/encoder.o OBJS_CLI_APPREND = $(OBJDIR)/renderer.o @@ -206,8 +207,8 @@ $(CLI_APIREND): $(OBJS_CLI_APPREND) $(LIB_LIBREND) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(CLI_APIPOSTREND): $(OBJS_CLI_APPPOSTREND) $(LIB_LIBISAR) $(LIB_LIBCOM) $(LIB_LIBUTIL) $(LIB_LIBDEBUG) $(LIB_LC3PLUS) $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_APPPOSTREND) -L. -lisar -livasutil -livasdebug -livascom -llc3plus $(LDLIBS) -o $(CLI_APIPOSTREND) -$(CLI_AMBICONVERT): $(OBJS_CLI_AMBICONVERT) $(OBJS_LIBUTIL) $(LIB_LIBUTIL) - $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_AMBICONVERT) $(LDLIBS) -o $(CLI_AMBICONVERT) +$(CLI_AMBICONVERT): $(OBJS_CLI_AMBICONVERT) $(OBJS_AMBICONVERT) + $(QUIET_LINK)$(CC) $(LDFLAGS) $(OBJS_CLI_AMBICONVERT) $(OBJS_AMBICONVERT) $(LDLIBS) -o $(CLI_AMBICONVERT) libs: $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBREND) $(LIB_LIBISAR) $(LIB_LC3PLUS) $(LIB_LIBUTIL) @@ -215,7 +216,7 @@ clean: $(QUIET)$(RM) $(OBJS_LIBENC) $(OBJS_LIBDEC) $(DEPS) $(QUIET)$(RM) $(DEPS:.P=.d) $(QUIET)test ! -d $(OBJDIR) || rm -rf $(OBJDIR) - $(QUIET)$(RM) $(CLI_APIENC) $(CLI_APIDEC) $(CLI_APIREND) $(CLI_APIPOSTREND) $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBUTIL) $(LIB_LIBREND) $(LIB_LIBISAR) $(LIB_LC3PLUS) + $(QUIET)$(RM) $(CLI_APIENC) $(CLI_APIDEC) $(CLI_APIREND) $(CLI_APIPOSTREND) $(CLI_AMBICONVERT) $(LIB_LIBENC) $(LIB_LIBDEBUG) $(LIB_LIBCOM) $(LIB_LIBDEC) $(LIB_LIBUTIL) $(LIB_LIBREND) $(LIB_LIBISAR) $(LIB_LC3PLUS) $(OBJDIR)/%.o : %.c | $(OBJDIR) $(QUIET_CC)$(CC) $(CFLAGS) -c -MD -o $@ $< -- GitLab From 5edab42920deb634f36db722c07cde9147a16c68 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 15:54:45 +0200 Subject: [PATCH 071/147] add ambi_converter to CMakeLists.txt --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index de4727bec8..03743f6e7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -206,12 +206,16 @@ add_executable(ISAR_post_rend apps/isar_post_rend.c) target_link_libraries(ISAR_post_rend lib_isar lib_util) target_include_directories(ISAR_post_rend PRIVATE lib_isar) +add_executable(ambi_converter apps/ambi_converter.c) +target_link_libraries(ambi_converter lib_util m) + if(COPY_EXECUTABLES_FROM_BUILD_DIR) # Optionally copy executables to the same place where Make puts them (useful for tests that expect executables in specific places) add_custom_command(TARGET IVAS_cod POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") add_custom_command(TARGET IVAS_dec POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") add_custom_command(TARGET IVAS_rend POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") add_custom_command(TARGET ISAR_post_rend POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + add_custom_command(TARGET ambi_conveter POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") if (NOT WMOPS) add_custom_command(TARGET ivas_lc3plus_unit_test POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/split_rendering/lc3plus_float") endif() -- GitLab From 1aa3861666eef98e41f7292fe99e227f2bb07062 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 16:28:44 +0200 Subject: [PATCH 072/147] add include directories --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03743f6e7a..3e825c8f5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -208,6 +208,7 @@ target_include_directories(ISAR_post_rend PRIVATE lib_isar) add_executable(ambi_converter apps/ambi_converter.c) target_link_libraries(ambi_converter lib_util m) +target_include_directories(ambi_converter PRIVATE lib_util) if(COPY_EXECUTABLES_FROM_BUILD_DIR) # Optionally copy executables to the same place where Make puts them (useful for tests that expect executables in specific places) -- GitLab From 58b820dd933d3e10a62c6c2bc02ed7a4cec48ef1 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 16:35:10 +0200 Subject: [PATCH 073/147] include m only on unix --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e825c8f5e..6cd346ead0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,7 +207,10 @@ target_link_libraries(ISAR_post_rend lib_isar lib_util) target_include_directories(ISAR_post_rend PRIVATE lib_isar) add_executable(ambi_converter apps/ambi_converter.c) -target_link_libraries(ambi_converter lib_util m) + target_link_libraries(ambi_converter lib_util) +if(UNIX) + target_link_libraries(ambi_converter m) +endif() target_include_directories(ambi_converter PRIVATE lib_util) if(COPY_EXECUTABLES_FROM_BUILD_DIR) -- GitLab From 7cf42faa359d39fbe96c40340f595e8c02a3c5e3 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 Sep 2025 17:25:14 +0200 Subject: [PATCH 074/147] fix cmake error --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cd346ead0..fe516c9ec8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,7 +219,7 @@ if(COPY_EXECUTABLES_FROM_BUILD_DIR) add_custom_command(TARGET IVAS_dec POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") add_custom_command(TARGET IVAS_rend POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") add_custom_command(TARGET ISAR_post_rend POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") - add_custom_command(TARGET ambi_conveter POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") + add_custom_command(TARGET ambi_converter POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/") if (NOT WMOPS) add_custom_command(TARGET ivas_lc3plus_unit_test POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/split_rendering/lc3plus_float") endif() -- GitLab From b146c8a0e32348cee95c86b27dd052825888d885 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 3 Sep 2025 20:31:26 +0200 Subject: [PATCH 075/147] add VS project --- Workspace_msvc/Workspace_msvc.sln | 8 ++ Workspace_msvc/ambi_converter.vcxproj | 166 ++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 Workspace_msvc/ambi_converter.vcxproj diff --git a/Workspace_msvc/Workspace_msvc.sln b/Workspace_msvc/Workspace_msvc.sln index ac2e76b52f..6a38a0e430 100644 --- a/Workspace_msvc/Workspace_msvc.sln +++ b/Workspace_msvc/Workspace_msvc.sln @@ -31,6 +31,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_isar", "lib_isar.vcxpro EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "isar_post_rend", "isar_post_rend.vcxproj", "{12374ADC-0E5C-4FDD-B903-71D572413831}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ambi_converter", "ambi_converter.vcxproj", "{2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -111,6 +113,12 @@ Global {12374ADC-0E5C-4FDD-B903-71D572413831}.Release|Win32.ActiveCfg = Release|Win32 {12374ADC-0E5C-4FDD-B903-71D572413831}.Release|Win32.Build.0 = Release|Win32 {12374ADC-0E5C-4FDD-B903-71D572413831}.Release|x64.ActiveCfg = Release|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Debug|Win32.ActiveCfg = Debug|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Debug|Win32.Build.0 = Debug|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Debug|x64.ActiveCfg = Debug|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Release|Win32.ActiveCfg = Release|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Release|Win32.Build.0 = Release|Win32 + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Workspace_msvc/ambi_converter.vcxproj b/Workspace_msvc/ambi_converter.vcxproj new file mode 100644 index 0000000000..5a489f3786 --- /dev/null +++ b/Workspace_msvc/ambi_converter.vcxproj @@ -0,0 +1,166 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + ambi_converter + {2074FFD6-8056-4C5F-8A08-0B2607D1FEFF} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + ambi_converter + + + ..\ + .\Release_$(ProjectName)\ + false + false + ambi_converter + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_rend;..\lib_lc3plus;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + false + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_isar;..\lib_rend;..\lib_lc3plus;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + false + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + + + + + + + + + \ No newline at end of file -- GitLab From 1206d900cd62645946654237c3e634539a1964b6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 4 Sep 2025 09:37:17 +0200 Subject: [PATCH 076/147] fix compile warnings --- apps/ambi_converter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index e499622fbb..affd3cf5a8 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -119,7 +119,7 @@ int main( int argc, char *argv[] ) while ( ReadWavShort( wavFile_in, samples, numSamples, &numSamplesRead32 ) == __TWI_SUCCESS ) { - int16_t err = 0; + int32_t err = 0; if ( !numSamplesRead32 ) { @@ -145,7 +145,7 @@ int main( int argc, char *argv[] ) { for ( int16_t j = 0; j < numChannels; j++ ) { - int s1_i; + int16_t s1_i; float s1 = out[j][i]; if ( s1 < INT16_MIN ) { -- GitLab From d54356dbd9cac9465c27cd246e5532221a804708 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 9 Sep 2025 11:22:44 +0200 Subject: [PATCH 077/147] Fix offset in renderer directivity, found in BASOP. This syncs the code with the BASOP --- lib_rend/ivas_objectRenderer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 6e836e141c..06896f2c06 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -726,7 +726,7 @@ ivas_error ivas_td_binaural_open_ext( if ( NULL != hRendCfg ) { #ifdef NONBE_1377_REND_DIRATT_CONF - ism_number = id & 0x00FF; /* Exctract ISM number from ID */ + ism_number = ( id & 0x00FF ) - 1; /* Extract ISM number from ID */ directivity = hRendCfg->directivity + 3 * ism_number; #else directivity = hRendCfg->directivity; -- GitLab From ca7b3a430bba47cd40302c29389c89e7b615778a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 9 Sep 2025 14:32:58 +0200 Subject: [PATCH 078/147] Add id in renderer configuration struct --- lib_com/common_api_types.h | 4 ++++ lib_rend/ivas_objectRenderer.c | 8 ++------ lib_rend/ivas_prot_rend.h | 4 ++-- lib_rend/ivas_render_config.c | 4 ++++ lib_rend/lib_rend.c | 17 ++++++++++++++--- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index f5b13c0dea..056a8d9da5 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -337,6 +337,10 @@ typedef struct _IVAS_RENDER_CONFIG ISAR_SPLIT_REND_CONFIG_DATA split_rend_config; float directivity[IVAS_MAX_NUM_OBJECTS * 3]; float distAtt[3]; +#ifdef NONBE_1377_REND_DIRATT_CONF + int16_t object_id[IVAS_MAX_NUM_OBJECTS]; + int16_t number_of_objects; +#endif } IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 06896f2c06..10946f0b3c 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -680,8 +680,8 @@ ivas_error ivas_td_binaural_open_ext( RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ LSSETUP_CUSTOM_STRUCT *customLsInput, #ifdef NONBE_1377_REND_DIRATT_CONF - const int32_t outFs, /* i: output sampling rate */ - const IVAS_REND_InputId id /* i: ISM ID */ + const int32_t outFs, /* i: output sampling rate */ + const int16_t ism_number /* i: ISM number */ ) #else const int32_t outFs ) @@ -692,9 +692,6 @@ ivas_error ivas_td_binaural_open_ext( IVAS_FORMAT ivas_format; IVAS_OUTPUT_SETUP hTransSetup; ivas_error error; -#ifdef NONBE_1377_REND_DIRATT_CONF - int16_t ism_number; -#endif float *distAtt = NULL; float *directivity = NULL; @@ -726,7 +723,6 @@ ivas_error ivas_td_binaural_open_ext( if ( NULL != hRendCfg ) { #ifdef NONBE_1377_REND_DIRATT_CONF - ism_number = ( id & 0x00FF ) - 1; /* Extract ISM number from ID */ directivity = hRendCfg->directivity + 3 * ism_number; #else directivity = hRendCfg->directivity; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 2617bae683..354076e8d8 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -662,8 +662,8 @@ ivas_error ivas_td_binaural_open_ext( RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ LSSETUP_CUSTOM_STRUCT *customLsInput, #ifdef NONBE_1377_REND_DIRATT_CONF - const int32_t outFs, /* i: output sampling rate */ - const IVAS_REND_InputId id /* i: ISM ID */ + const int32_t output_Fs, /* i: output sampling rate */ + const int16_t ism_number /* i: ISM number */ #else const int32_t output_Fs #endif diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index c3a39b426e..1e9bed9b10 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -136,6 +136,10 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->distAtt[1] = 1.0f; /* Default ref dist */ ( *hRenderConfig )->distAtt[2] = 1.0f; /* Default rolloff factor */ +#ifdef NONBE_1377_REND_DIRATT_CONF + ( *hRenderConfig )->number_of_objects = 0; +#endif + /* ISAR-related parameters */ ( *hRenderConfig )->split_rend_config.splitRendBitRate = ISAR_MAX_SPLIT_REND_BITRATE; ( *hRenderConfig )->split_rend_config.dof = 3; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 4d12d71e39..656d6c75f8 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1569,6 +1569,9 @@ static ivas_error setRendInputActiveIsm( AUDIO_CONFIG outConfig; input_ism *inputIsm; int16_t i; +#ifdef NONBE_1377_REND_DIRATT_CONF + int16_t ism_number; +#endif inputIsm = (input_ism *) input; rendCtx = inputIsm->base.ctx; @@ -1609,7 +1612,11 @@ static ivas_error setRendInputActiveIsm( if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { #ifdef NONBE_1377_REND_DIRATT_CONF - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, id ) ) != IVAS_ERR_OK ) + ism_number = hRendCfg->number_of_objects; + hRendCfg->object_id[ism_number] = id; + hRendCfg->number_of_objects++; + + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, ism_number ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif @@ -1621,7 +1628,7 @@ static ivas_error setRendInputActiveIsm( for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { #ifdef NONBE_1377_REND_DIRATT_CONF - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, id ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, ism_number ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif @@ -1643,7 +1650,11 @@ static ivas_error setRendInputActiveIsm( else { #ifdef NONBE_1377_REND_DIRATT_CONF - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, id ) ) != IVAS_ERR_OK ) + ism_number = hRendCfg->number_of_objects; + hRendCfg->object_id[ism_number] = id; + hRendCfg->number_of_objects++; + + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, ism_number ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif -- GitLab From 64a77f08e39587a14d93408ace303147ffe63c07 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 9 Sep 2025 22:01:53 +0200 Subject: [PATCH 079/147] Change to object id within inputIsm structs --- apps/renderer.c | 3 +++ lib_com/common_api_types.h | 4 --- lib_rend/ivas_objectRenderer.c | 4 +-- lib_rend/ivas_prot_rend.h | 2 +- lib_rend/ivas_render_config.c | 4 --- lib_rend/lib_rend.c | 48 ++++++++++++++++++++++++---------- lib_rend/lib_rend.h | 6 +++++ 7 files changed, 46 insertions(+), 25 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 26c4b349d2..18e0f838e3 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1228,6 +1228,9 @@ int main( { masaIds[i] = 0u; } +#ifdef NONBE_1377_REND_DIRATT_CONF + IVAS_REND_SetObjectIDs( hIvasRend ); +#endif for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 056a8d9da5..f5b13c0dea 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -337,10 +337,6 @@ typedef struct _IVAS_RENDER_CONFIG ISAR_SPLIT_REND_CONFIG_DATA split_rend_config; float directivity[IVAS_MAX_NUM_OBJECTS * 3]; float distAtt[3]; -#ifdef NONBE_1377_REND_DIRATT_CONF - int16_t object_id[IVAS_MAX_NUM_OBJECTS]; - int16_t number_of_objects; -#endif } IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 10946f0b3c..d016ed0da4 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -681,7 +681,7 @@ ivas_error ivas_td_binaural_open_ext( LSSETUP_CUSTOM_STRUCT *customLsInput, #ifdef NONBE_1377_REND_DIRATT_CONF const int32_t outFs, /* i: output sampling rate */ - const int16_t ism_number /* i: ISM number */ + const int16_t object_id /* i: Object ID */ ) #else const int32_t outFs ) @@ -723,7 +723,7 @@ ivas_error ivas_td_binaural_open_ext( if ( NULL != hRendCfg ) { #ifdef NONBE_1377_REND_DIRATT_CONF - directivity = hRendCfg->directivity + 3 * ism_number; + directivity = hRendCfg->directivity + 3 * object_id; #else directivity = hRendCfg->directivity; #endif diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 354076e8d8..32c2992c1a 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -663,7 +663,7 @@ ivas_error ivas_td_binaural_open_ext( LSSETUP_CUSTOM_STRUCT *customLsInput, #ifdef NONBE_1377_REND_DIRATT_CONF const int32_t output_Fs, /* i: output sampling rate */ - const int16_t ism_number /* i: ISM number */ + const int16_t object_id /* i: Object ID */ #else const int32_t output_Fs #endif diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 1e9bed9b10..c3a39b426e 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -136,10 +136,6 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->distAtt[1] = 1.0f; /* Default ref dist */ ( *hRenderConfig )->distAtt[2] = 1.0f; /* Default rolloff factor */ -#ifdef NONBE_1377_REND_DIRATT_CONF - ( *hRenderConfig )->number_of_objects = 0; -#endif - /* ISAR-related parameters */ ( *hRenderConfig )->split_rend_config.splitRendBitRate = ISAR_MAX_SPLIT_REND_BITRATE; ( *hRenderConfig )->split_rend_config.dof = 3; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 656d6c75f8..645a23f2c8 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -122,6 +122,9 @@ typedef struct float nonDiegeticPanGain; OMASA_ANA_HANDLE hOMasa; uint16_t total_num_objects; +#ifdef NONBE_1377_REND_DIRATT_CONF + int16_t object_id; +#endif float ism_metadata_delay_ms; } input_ism; @@ -1569,9 +1572,6 @@ static ivas_error setRendInputActiveIsm( AUDIO_CONFIG outConfig; input_ism *inputIsm; int16_t i; -#ifdef NONBE_1377_REND_DIRATT_CONF - int16_t ism_number; -#endif inputIsm = (input_ism *) input; rendCtx = inputIsm->base.ctx; @@ -1612,11 +1612,7 @@ static ivas_error setRendInputActiveIsm( if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { #ifdef NONBE_1377_REND_DIRATT_CONF - ism_number = hRendCfg->number_of_objects; - hRendCfg->object_id[ism_number] = id; - hRendCfg->number_of_objects++; - - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, ism_number ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, inputIsm->object_id ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif @@ -1628,7 +1624,7 @@ static ivas_error setRendInputActiveIsm( for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { #ifdef NONBE_1377_REND_DIRATT_CONF - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, ism_number ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, inputIsm->object_id ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif @@ -1650,11 +1646,7 @@ static ivas_error setRendInputActiveIsm( else { #ifdef NONBE_1377_REND_DIRATT_CONF - ism_number = hRendCfg->number_of_objects; - hRendCfg->object_id[ism_number] = id; - hRendCfg->number_of_objects++; - - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, ism_number ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, inputIsm->object_id ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif @@ -3970,6 +3962,34 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return IVAS_ERR_OK; } +#ifdef NONBE_1377_REND_DIRATT_CONF +/*-------------------------------------------------------------------* + * IVAS_REND_SetObjectIDs() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetObjectIDs( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +) +{ + int16_t i; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) + { + hIvasRend->inputsIsm[i].object_id = i; + } + + return IVAS_ERR_OK; +} +#endif + /*-------------------------------------------------------------------* * IVAS_REND_SetInputGain() diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index ac9516521d..4df7d85961 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -152,6 +152,12 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ ); +#ifdef NONBE_1377_REND_DIRATT_CONF +ivas_error IVAS_REND_SetObjectIDs( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +); +#endif + ivas_error IVAS_REND_SetInputGain( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ -- GitLab From dfdff212d7078c53c02c951284f8154de93523af Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 9 Sep 2025 22:05:11 +0200 Subject: [PATCH 080/147] Merge with main and clang format --- lib_rend/ivas_objectRenderer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index d016ed0da4..f0fb90fe4e 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -680,7 +680,7 @@ ivas_error ivas_td_binaural_open_ext( RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ LSSETUP_CUSTOM_STRUCT *customLsInput, #ifdef NONBE_1377_REND_DIRATT_CONF - const int32_t outFs, /* i: output sampling rate */ + const int32_t outFs, /* i: output sampling rate */ const int16_t object_id /* i: Object ID */ ) #else -- GitLab From 6b196ffc73ce9c29d27f39a46ea016b85fdf45a1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 10 Sep 2025 12:02:40 +0200 Subject: [PATCH 081/147] update --- Workspace_msvc/lib_dec.vcxproj | 1 - Workspace_msvc/lib_dec.vcxproj.filters | 3 - Workspace_msvc/lib_rend.vcxproj | 1 + Workspace_msvc/lib_rend.vcxproj.filters | 3 + lib_dec/lib_dec.c | 69 ++++++++++++++----- .../ivas_cldfb_ring_buffer.c | 25 ++++--- lib_rend/lib_rend.c | 3 +- 7 files changed, 70 insertions(+), 35 deletions(-) rename {lib_dec => lib_rend}/ivas_cldfb_ring_buffer.c (92%) diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index a8639d192c..3c7ea3e597 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -206,7 +206,6 @@ - diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index e081cb0870..8eddbb60a0 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -515,9 +515,6 @@ decoder_all_c - - decoder_ivas_c - diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 854c99a979..1d55ed1942 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -138,6 +138,7 @@ + diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters index 2d1d7d46c0..f290958973 100644 --- a/Workspace_msvc/lib_rend.vcxproj.filters +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -119,6 +119,9 @@ rend_c + + rend_c + diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 8fa078af78..8a437c4c4f 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -130,8 +130,8 @@ static ivas_error ivas_create_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *h static void ivas_destroy_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); static int16_t get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP -static int16_t get_render_frame_size_samples( Decoder_Struct *st_ivas ); -static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct *st_ivas ); +static int16_t get_render_frame_size_samples( const DECODER_CONFIG_HANDLE hDecoderConfig ); +static int16_t ivas_dec_split_rend_cldfb_in( const RENDERER_TYPE renderer_type ); #endif static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesRendered ); @@ -641,13 +641,23 @@ ivas_error IVAS_DEC_GetRenderFramesize( return IVAS_ERR_OK; } + #ifdef FIX_1119_SPLIT_RENDERING_VOIP -static int16_t get_render_frame_size_samples( Decoder_Struct *st_ivas ) +/*---------------------------------------------------------------------* + * get_render_frame_size_samples( ) + * + * + *---------------------------------------------------------------------*/ + +static int16_t get_render_frame_size_samples( + const DECODER_CONFIG_HANDLE hDecoderConfig /* i : configuration structure */ +) { - return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * st_ivas->hDecoderConfig->render_framesize / ( FRAMES_PER_SEC * IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ); + return (int16_t) ( hDecoderConfig->output_Fs * hDecoderConfig->render_framesize / ( FRAMES_PER_SEC * IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ); } #endif + /*---------------------------------------------------------------------* * IVAS_DEC_GetGetRenderFramesizeSamples( ) * @@ -665,7 +675,7 @@ ivas_error IVAS_DEC_GetRenderFramesizeSamples( } #ifdef FIX_1119_SPLIT_RENDERING_VOIP - *render_framesize = get_render_frame_size_samples( hIvasDec->st_ivas ); + *render_framesize = get_render_frame_size_samples( hIvasDec->st_ivas->hDecoderConfig ); #else *render_framesize = (int16_t) ( hIvasDec->st_ivas->hDecoderConfig->output_Fs * hIvasDec->st_ivas->hDecoderConfig->render_framesize / ( FRAMES_PER_SEC * IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ) ); #endif @@ -673,6 +683,7 @@ ivas_error IVAS_DEC_GetRenderFramesizeSamples( return IVAS_ERR_OK; } + /*---------------------------------------------------------------------* * IVAS_DEC_GetGetRenderFramesizeMs( ) * @@ -1904,6 +1915,7 @@ static ivas_error isar_render_poses( ) { float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; + Decoder_Struct *st_ivas; ivas_error error; int16_t i, j, numPoses; @@ -1914,7 +1926,9 @@ static ivas_error isar_render_poses( *needNewFrame = false; - numPoses = hIvasDec->st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; + st_ivas = hIvasDec->st_ivas; + + numPoses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; /* init flush buffer for rate switch if not already initizalized */ if ( hIvasDec->flushbuffer == NULL ) @@ -1939,9 +1953,9 @@ static ivas_error isar_render_poses( return IVAS_ERR_OK; } - if ( !ivas_dec_split_rend_cldfb_in( hIvasDec->st_ivas ) ) + if ( !ivas_dec_split_rend_cldfb_in( st_ivas->renderer_type ) ) { - ivas_TD_RINGBUF_PushInterleaved( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, pcmBuf, *nOutSamples ); + ivas_TD_RINGBUF_PushInterleaved( st_ivas->hSplitBinRend->hMultiBinTdData, pcmBuf, *nOutSamples ); } /* change buffer layout */ @@ -3792,6 +3806,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples } #endif + /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ while ( *nSamplesRendered < nSamplesPerChannel ) { @@ -4003,7 +4018,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( hIvasDec->hasDecodedFirstGoodFrame && splitRendBits != NULL ) { - if ( !ivas_dec_split_rend_cldfb_in( st_ivas ) ) + if ( !ivas_dec_split_rend_cldfb_in( st_ivas->renderer_type ) ) { ivas_TD_RINGBUF_PopChannels( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, *nSamplesRendered ); } @@ -4083,7 +4098,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSplitBinauralBitstream( ) * - * Main function to decode one split-rendering frame in VoIP + * Main function to decode one split-rendering frame in VoIP *---------------------------------------------------------------------*/ /*! r: error code */ @@ -5456,17 +5471,33 @@ static ivas_error ivas_dec_reconfig_split_rend( return IVAS_ERR_OK; } + #ifdef FIX_1119_SPLIT_RENDERING_VOIP -static int16_t ivas_dec_split_rend_cldfb_in( Decoder_Struct *st_ivas ) -{ +/*-------------------------------------------------------------------* + * ivas_dec_split_rend_cldfb_in() + * + * + *-------------------------------------------------------------------*/ - return st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || - st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM; +static int16_t ivas_dec_split_rend_cldfb_in( + const RENDERER_TYPE renderer_type /* i : renderer type */ +) +{ + if ( renderer_type == RENDERER_BINAURAL_FASTCONV || + renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + renderer_type == RENDERER_BINAURAL_PARAMETRIC || + renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + { + return 1; + } + else + { + return 0; + } } #endif + /*-------------------------------------------------------------------* * ivas_dec_init_split_rend() * @@ -5488,7 +5519,7 @@ static ivas_error ivas_dec_init_split_rend( cldfb_in_flag = 0; #ifdef FIX_1119_SPLIT_RENDERING_VOIP - cldfb_in_flag = ivas_dec_split_rend_cldfb_in( st_ivas ); + cldfb_in_flag = ivas_dec_split_rend_cldfb_in( st_ivas->renderer_type ); #else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || @@ -5501,6 +5532,7 @@ static ivas_error ivas_dec_init_split_rend( #ifdef FIX_1119_SPLIT_RENDERING_VOIP ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); + num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; assert( num_poses <= MAX_HEAD_ROT_POSES ); @@ -5517,8 +5549,7 @@ static ivas_error ivas_dec_init_split_rend( } else { - error = ivas_TD_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinTdData, get_render_frame_size_samples( st_ivas ), num_poses * BINAURAL_CHANNELS ); - if ( error != IVAS_ERR_OK ) + if ( ( error = ivas_TD_RINGBUF_Open( &st_ivas->hSplitBinRend->hMultiBinTdData, get_render_frame_size_samples( st_ivas->hDecoderConfig ), num_poses * BINAURAL_CHANNELS ) ) != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for split rendering structure" ); } diff --git a/lib_dec/ivas_cldfb_ring_buffer.c b/lib_rend/ivas_cldfb_ring_buffer.c similarity index 92% rename from lib_dec/ivas_cldfb_ring_buffer.c rename to lib_rend/ivas_cldfb_ring_buffer.c index ec4a30be0f..5d1d2a055c 100644 --- a/lib_dec/ivas_cldfb_ring_buffer.c +++ b/lib_rend/ivas_cldfb_ring_buffer.c @@ -47,12 +47,12 @@ *---------------------------------------------------------------------*/ /*---------------------------------------------------------------------* - * ivas_CLDFB_RINGBUF_IsEmpty() + * ivas_cldfb_ringbuf_IsEmpty() * * Returns 1 if the ring buffer is empty, or 0 otherwise. *---------------------------------------------------------------------*/ -static int16_t ivas_CLDFB_RINGBUF_IsEmpty( +static int16_t ivas_cldfb_ringbuf_IsEmpty( ISAR_CLDFB_RINGBUF_HANDLE h ) { return (int16_t) ( h->read_pos == h->write_pos && !h->is_full ); @@ -60,12 +60,12 @@ static int16_t ivas_CLDFB_RINGBUF_IsEmpty( /*---------------------------------------------------------------------* - * ivas_CLDFB_RINGBUF_IsFull() + * ivas_cldfb_ringbuf_IsFull() * * Returns 1 if the ring buffer is full, or 0 otherwise. *---------------------------------------------------------------------*/ -static int16_t ivas_CLDFB_RINGBUF_IsFull( +static int16_t ivas_cldfb_ringbuf_IsFull( ISAR_CLDFB_RINGBUF_HANDLE h ) { return h->is_full; @@ -167,7 +167,7 @@ void ivas_CLDFB_RINGBUF_Push( const int16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !ivas_CLDFB_RINGBUF_IsFull( h ) ); + assert( !ivas_cldfb_ringbuf_IsFull( h ) ); mvr2r( real, &h->real[h->write_pos], num_bands ); mvr2r( imag, &h->imag[h->write_pos], num_bands ); @@ -200,7 +200,7 @@ void ivas_CLDFB_RINGBUF_Pop( const int16_t num_bands ) { assert( num_bands <= CLDFB_NO_CHANNELS_MAX ); - assert( !ivas_CLDFB_RINGBUF_IsEmpty( h ) ); + assert( !ivas_cldfb_ringbuf_IsEmpty( h ) ); if ( real != NULL ) { @@ -223,11 +223,16 @@ void ivas_CLDFB_RINGBUF_Pop( } -/* Returns total number of buffered samples (including number of channels) */ -static uint32_t ivas_CLDFB_RINGBUF_total_size( +/*---------------------------------------------------------------------* + * ivas_cldfb_ringbuf_total_size() + * + * Returns total number of buffered samples (including number of channels) + *---------------------------------------------------------------------*/ + +static uint32_t ivas_cldfb_ringbuf_total_size( ISAR_CLDFB_RINGBUF_HANDLE h ) { - if ( ivas_CLDFB_RINGBUF_IsFull( h ) ) + if ( ivas_cldfb_ringbuf_IsFull( h ) ) { return h->capacity; } @@ -260,7 +265,7 @@ void ivas_CLDFB_RINGBUF_GetByIdx( const int16_t col_idx ) { int32_t idx = col_idx * CLDFB_NO_CHANNELS_MAX; - int32_t num_floats = (int32_t) ivas_CLDFB_RINGBUF_total_size( h ); + int32_t num_floats = (int32_t) ivas_cldfb_ringbuf_total_size( h ); uint32_t offset, uidx; assert( -num_floats <= idx && idx <= num_floats ); diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index a0d737fce2..8a16ff77b8 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1480,7 +1480,7 @@ static ivas_error alignInputDelay( int32_t numSamplesToPush, numSamplesToPop; uint32_t ringBufferSize, preDelay; #ifdef FIX_1119_SPLIT_RENDERING_VOIP - int32_t i; + int16_t i; const float *p_read_channels[MAX_INPUT_CHANNELS]; float *p_write_channels[MAX_INPUT_CHANNELS]; #endif @@ -7864,7 +7864,6 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( IVAS_REND_AudioBufferConfig *pSplitEncBufConfig; ISAR_SPLIT_REND_CONFIG_HANDLE pSplitRendConfig; ISAR_SPLIT_REND_BITS_DATA bits; - #ifdef FIX_1119_SPLIT_RENDERING_VOIP float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; -- GitLab From 9255c1265fad88780dab22b8147a015e66d60ec9 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 12 Sep 2025 15:41:23 +0200 Subject: [PATCH 082/147] Fix incorrectly merged changes from 3bdd36d26dd83ffc46add1ce012533bf1d7f6d9f --- lib_dec/lib_dec.c | 51 +++++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 8a437c4c4f..008c033210 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1909,7 +1909,6 @@ static int16_t isar_get_frame_size( static ivas_error isar_render_poses( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesAsked, /* i : number of samples wanted by the caller */ - float **p_head_pose_buf, /* o : PCM buffer with head-pose data */ int16_t *nOutSamples, /* o : number of samples per channel written to output buffer */ bool *needNewFrame /* o : indication that the decoder needs a new frame */ ) @@ -1917,7 +1916,7 @@ static ivas_error isar_render_poses( float pcmBuf[BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES * L_FRAME48k]; Decoder_Struct *st_ivas; ivas_error error; - int16_t i, j, numPoses; + int16_t numPoses; if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -1958,15 +1957,6 @@ static ivas_error isar_render_poses( ivas_TD_RINGBUF_PushInterleaved( st_ivas->hSplitBinRend->hMultiBinTdData, pcmBuf, *nOutSamples ); } - /* change buffer layout */ - for ( i = 0; i < *nOutSamples; ++i ) - { - for ( j = 0; j < BINAURAL_CHANNELS * numPoses; ++j ) - { - p_head_pose_buf[j][i] = pcmBuf[i * BINAURAL_CHANNELS * numPoses + j]; - } - } - return error; } @@ -2100,12 +2090,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; numSamplesPerChannelToOutput = isar_get_frame_size( st_ivas ); - for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) - { - p_head_pose_buf[i] = head_pose_buf[i]; - } - - if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, p_head_pose_buf, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, numSamplesPerChannelToOutput, nOutSamples, needNewFrame ) ) != IVAS_ERR_OK ) { return error; } @@ -2115,6 +2100,16 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_OK; } + for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) + { + p_head_pose_buf[i] = head_pose_buf[i]; + } + + if ( !ivas_dec_split_rend_cldfb_in( st_ivas->renderer_type ) ) + { + ivas_TD_RINGBUF_PopChannels( st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, *nOutSamples ); + } + if ( ( error = isar_generate_metadata_and_bitstream( st_ivas, p_head_pose_buf, splitRendBits ) ) != IVAS_ERR_OK ) { return error; @@ -3771,9 +3766,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples int16_t result; ivas_error error; uint8_t nOutChannels; -#ifdef FIX_1119_SPLIT_RENDERING_VOIP - int16_t i; -#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->hVoIP == NULL ) { @@ -3980,23 +3972,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( splitRendBits != NULL ) { - /* Move output pointers forward */ - for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) - { - p_head_pose_buf[i] += *nSamplesRendered; - } - /* Render head poses from time-scaled transport channels */ - if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, p_head_pose_buf, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) + if ( ( error = isar_render_poses( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &tmp ) ) != IVAS_ERR_OK ) { return error; } - - /* Set pointers back to the beginning of head pose buffers */ - for ( i = 0; i < BINAURAL_CHANNELS * MAX_HEAD_ROT_POSES; ++i ) - { - p_head_pose_buf[i] -= *nSamplesRendered; - } } else { @@ -5254,6 +5234,7 @@ static ivas_error ivas_create_handle_isar( isar_init_split_rend_handles( &hSplitBinRend->splitrend ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP + hSplitBinRend->hMultiBinTdData = NULL; for ( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) { hSplitBinRend->hMultiBinCldfbData[i] = NULL; @@ -5287,6 +5268,10 @@ static void ivas_destroy_handle_isar( if ( *hSplitBinRend != NULL ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP + if ( ( *hSplitBinRend )->hMultiBinTdData != NULL ) + { + ivas_TD_RINGBUF_Close( &( *hSplitBinRend )->hMultiBinTdData ); + } for ( i = 0; i < MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS; ++i ) { if ( ( *hSplitBinRend )->hMultiBinCldfbData[i] != NULL ) -- GitLab From a87ea2fdddba44b98972b3d1189bfefe076954ed Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 12 Sep 2025 15:56:16 +0200 Subject: [PATCH 083/147] Apply formatting patch --- lib_rend/lib_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 8a16ff77b8..2fea668620 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7953,7 +7953,7 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, #endif - (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), + ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, -- GitLab From cefea0671548825ccf7a3b139ba37197042b308d Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 Sep 2025 09:55:43 +0200 Subject: [PATCH 084/147] accept FIX_1372_OSBA_OBJECT_EDITING and FIX_1372_OSBA_OBJECT_EDITING --- lib_com/options.h | 3 +-- lib_dec/ivas_sba_dec.c | 2 -- lib_dec/ivas_spar_decoder.c | 5 ----- lib_rend/ivas_reverb.c | 8 -------- 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ee846da36c..b3ff1cdb4c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,8 +163,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ -#define FIX_1995_REVERB_INIT /* issue 1995: Fix use-of-uninitialized-value in ivas_binaural_reverb_init() */ -#define FIX_1372_OSBA_OBJECT_EDITING /* VA: issue 1372: Fix OSBA object-editing in BINAURAL_ROOM_IR */ + /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 72f42e458c..6049eff75e 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -729,12 +729,10 @@ ivas_error ivas_sba_dec_render( { nchan_out = max( nchan_internal, st_ivas->hDecoderConfig->nchan_out - st_ivas->nchan_ism ); } -#ifdef FIX_1372_OSBA_OBJECT_EDITING else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { nchan_out = BINAURAL_CHANNELS; } -#endif } nchan_out = min( nchan_out, ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 2a575c6177..dd8bf56d42 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1406,11 +1406,7 @@ void ivas_spar_dec_upmixer_sf( p_tc[i] = st_ivas->hTcBuffer->tc[i + nchan_ism] + slot_idx_start * slot_size; } -#ifdef FIX_1372_OSBA_OBJECT_EDITING if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) -#else - if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) -#endif { for ( i = 0; i < nchan_ism; i++ ) { @@ -1462,7 +1458,6 @@ void ivas_spar_dec_upmixer_sf( } } #endif - /*---------------------------------------------------------------------* * TD Decorr and pcm ingest *---------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index b4adf013fb..cbc12cebdc 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1892,11 +1892,7 @@ ivas_error ivas_binaural_reverb_init( } else { -#ifdef FIX_1995_REVERB_INIT for ( bin = 0; bin < numBins; bin++ ) -#else - for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) -#endif { revTimes[bin] = defaultTimes[bin]; revEne[bin] = defaultEne[bin]; @@ -1904,11 +1900,7 @@ ivas_error ivas_binaural_reverb_init( preDelay = 10; } -#ifdef FIX_1995_REVERB_INIT for ( bin = 0; bin < numBins; bin++ ) -#else - for ( bin = 0; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) -#endif { /* Adjust the room effect parameters when the reverberation time is less than a threshold value, to avoid spectral artefacts with the synthetic reverberator. */ -- GitLab From 14b23c311abc912989acc48acd7cbfabe519320a Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 Sep 2025 10:05:25 +0200 Subject: [PATCH 085/147] accept NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING, NONBE_FIX_1376_MDCT_CONCEALMENT, and NONBE_1377_REND_DIRATT_CONF --- apps/renderer.c | 3 +-- lib_com/options.h | 4 +--- lib_dec/ivas_ism_dec.c | 5 ----- lib_dec/ivas_masa_dec.c | 3 +-- lib_dec/ivas_mct_dec.c | 5 ----- lib_dec/ivas_mdct_core_dec.c | 12 +++--------- lib_dec/ivas_sba_dec.c | 14 +------------- lib_dec/lib_dec.c | 14 ++------------ lib_rend/ivas_objectRenderer.c | 32 ++++++-------------------------- lib_rend/ivas_prot_rend.h | 14 +++++--------- lib_rend/lib_rend.c | 27 ++------------------------- lib_rend/lib_rend.h | 2 -- 12 files changed, 22 insertions(+), 113 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 18e0f838e3..917a6f3a90 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1228,9 +1228,8 @@ int main( { masaIds[i] = 0u; } -#ifdef NONBE_1377_REND_DIRATT_CONF + IVAS_REND_SetObjectIDs( hIvasRend ); -#endif for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { diff --git a/lib_com/options.h b/lib_com/options.h index b3ff1cdb4c..77f6098c21 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -175,9 +175,7 @@ #define NONBE_1244_FIX_SWB_BWE_MEMORY /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */ #define NONBE_1122_KEEP_EVS_MODE_UNCHANGED /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR. */ #define NONBE_1328_FIX_NON_LINEARITY /* VA: Fix possible issue when computing bwe_exc_extended and previous frame were almost 0 */ -#define NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING /* FhG: Fix assert being hit in JBM code during rate switching */ -#define NONBE_FIX_1376_MDCT_CONCEALMENT /* FhG: fix concealment artifact in MDCT Stereo with DTX, in case transition frame gets lost */ -#define NONBE_1377_REND_DIRATT_CONF /* Eri: Issue 1377: Error in directivity attenuation configuration for both IVAS_dec and IVAS_rend */ + /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index d89076863a..c29dd20a67 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -121,7 +121,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } -#ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv render what still fits in the new granularity */ tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); @@ -139,7 +138,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( } } -#endif if ( st_ivas->ism_mode != last_ism_mode ) { /* EFAP handle */ @@ -296,9 +294,6 @@ static ivas_error ivas_ism_bitrate_switching_dec( tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); tc_nchan_allocate_new = tc_nchan_tc_new; tc_nchan_full_new = tc_nchan_tc_new; -#ifndef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING - tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index f44f872abd..a3855196dd 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1501,7 +1501,7 @@ ivas_error ivas_masa_dec_reconfigure( tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; } } -#ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { if ( n_samples_granularity > st_ivas->hTcBuffer->n_samples_granularity ) @@ -1519,7 +1519,6 @@ ivas_error ivas_masa_dec_reconfigure( /* flush already done in IVAS_DEC_ReadFormat() */ } } -#endif } else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index eaa094b68b..abc6f074e0 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -788,7 +788,6 @@ static ivas_error ivas_mc_dec_reconfig( } } -#ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv render what still fits in the new granularity */ tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); @@ -806,7 +805,6 @@ static ivas_error ivas_mc_dec_reconfig( } } -#endif if ( st_ivas->mc_mode == MC_MODE_MCT ) { st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); @@ -1315,9 +1313,6 @@ static ivas_error ivas_mc_dec_reconfig( tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); tc_nchan_allocate_new = tc_nchan_tc_new; tc_nchan_full_new = tc_nchan_tc_new; -#ifndef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING - tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs ); -#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 426be4d02d..db6a874b09 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -1104,17 +1104,11 @@ void ivas_mdct_core_tns_ns( decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1 ); sns_shape_spectrum( x[ch][k], st->hTcxCfg->psychParamsCurrent, &sns_int_scf[0], st->hTcxCfg->psychParamsCurrent->nBins ); -#ifdef NONBE_FIX_1376_MDCT_CONCEALMENT - /* - 2025-09-07, mul: - in case of PLC, applying SNS up to L_spec might not be enough: In case the transition frame from DTX after an inactive period is lost, L_spec is assumed to represent a regular TCX frame, + + /* In case of PLC, applying SNS up to L_spec might not be enough: In case the transition frame from DTX after an inactive period is lost, L_spec is assumed to represent a regular TCX frame, however, this frame is nevertheless acting as an transition frame as also visible in L_frameTCX; thus, the safer approach to prevent high frequency artifacts is to apply the SNS up to L_frameTCX; - in case this is not necessary, x[] is filled with zeros, and the multiplication is not causing any additional harm - */ + in case this is not necessary, x[] is filled with zeros, and the multiplication is not causing any additional harm */ v_multc( x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf[FDNS_NPTS - 1], x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, max( L_spec[ch], L_frameTCX[ch] ) - st->hTcxCfg->psychParamsCurrent->nBins ); -#else - v_multc( x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf[FDNS_NPTS - 1], x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, L_spec[ch] - st->hTcxCfg->psychParamsCurrent->nBins ); -#endif decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0 ); } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 6049eff75e..649cda2f12 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -162,8 +162,7 @@ ivas_error ivas_sba_dec_reconfigure( /* determine new granularity */ granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, ivas_renderer_secondary_select( st_ivas ), st_ivas->hDecoderConfig->output_Fs ); -#ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING - /* flush renderer on granularity change form 5ms to 1.25ms, again only possible for binaural rendering */ + /* flush renderer on granularity change from 5ms to 1.25ms, again only possible for binaural rendering */ if ( granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { /* flush already done in IVAS_DEC_ReadFormat() */ @@ -182,17 +181,6 @@ ivas_error ivas_sba_dec_reconfigure( } st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->nb_subframes - 1] = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; } -#else - if ( granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) - { - /* make sure the changed number of slots in the last subframe is not lost in the following steps */ - if ( st_ivas->hSpatParamRendCom != NULL ) - { - st_ivas->hSpatParamRendCom->subframe_nbslots[st_ivas->hSpatParamRendCom->nb_subframes - 1] = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; - } - st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->nb_subframes - 1] = st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; - } -#endif } /* save old */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 41feeafec2..cf922e27b4 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1058,7 +1058,7 @@ ivas_error IVAS_DEC_ReadFormat( } } - /* JBM: compensate when binaural renderer granularity changes (happens in bitrate switching) */ + /* JBM: compensate when binaural renderer granularity goes down (happens in bitrate switching) */ if ( st_ivas->ini_active_frame > 0 && st_ivas->hDecoderConfig->Opt_tsm && ( ( renderer_type_old != st_ivas->renderer_type ) || ( renderer_type_sec_old != renderer_type_sec_new ) ) ) @@ -1072,7 +1072,7 @@ ivas_error IVAS_DEC_ReadFormat( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - /* when granularity goes down, render what still fits in the new granularity */ + /* when granularity goes down from 5ms to 1.25ms, render what still fits in the new granularity */ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, pcm_type_API_to_internal( hIvasDec->pcmType ), hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) @@ -1080,16 +1080,6 @@ ivas_error IVAS_DEC_ReadFormat( return error; } } -#ifndef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING - /* when granularity goes up, discard samples at the beginning of the frame */ - else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) - { - if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } -#endif } } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index f0fb90fe4e..a4e15c79de 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -534,16 +534,10 @@ ivas_error TDREND_Update_object_positions( const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ ) { -#ifndef NONBE_1377_REND_DIRATT_CONF - TDREND_DirAtten_t *DirAtten_p; -#endif int16_t nS; float Pos[3]; float Dir[3]; ivas_error error; -#ifndef NONBE_1377_REND_DIRATT_CONF - DirAtten_p = hBinRendererTd->DirAtten_p; -#endif /* For each source, write the frame data to the source object*/ for ( nS = 0; nS < num_src; nS++ ) @@ -560,12 +554,6 @@ ivas_error TDREND_Update_object_positions( return error; } -#ifndef NONBE_1377_REND_DIRATT_CONF - if ( ( error = TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif if ( ( error = TDREND_MIX_SRC_SetGain( hBinRendererTd, nS, hIsmMetaData[nS]->gain ) ) != IVAS_ERR_OK ) { return error; @@ -675,17 +663,13 @@ ivas_error TDREND_Update_listener_orientation( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_open_ext( - TDREND_WRAPPER *pTDRend, - AUDIO_CONFIG inConfig, - RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ - LSSETUP_CUSTOM_STRUCT *customLsInput, -#ifdef NONBE_1377_REND_DIRATT_CONF - const int32_t outFs, /* i: output sampling rate */ - const int16_t object_id /* i: Object ID */ + TDREND_WRAPPER *pTDRend, /* i/o: TD Renderer wrapper structure */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ + LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const int32_t outFs, /* i : output sampling rate */ + const int16_t object_id /* i : Object ID */ ) -#else - const int32_t outFs ) -#endif { int16_t nchan_transport; AUDIO_CONFIG transport_config; @@ -722,11 +706,7 @@ ivas_error ivas_td_binaural_open_ext( if ( NULL != hRendCfg ) { -#ifdef NONBE_1377_REND_DIRATT_CONF directivity = hRendCfg->directivity + 3 * object_id; -#else - directivity = hRendCfg->directivity; -#endif distAtt = hRendCfg->distAtt; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 32c2992c1a..6cce3e77f8 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -657,16 +657,12 @@ ivas_error ivas_td_binaural_open_unwrap( ); ivas_error ivas_td_binaural_open_ext( - TDREND_WRAPPER *pTDRend, - const AUDIO_CONFIG inConfig, + TDREND_WRAPPER *pTDRend, /* i/o: TD Renderer wrapper structure */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */ - LSSETUP_CUSTOM_STRUCT *customLsInput, -#ifdef NONBE_1377_REND_DIRATT_CONF - const int32_t output_Fs, /* i: output sampling rate */ - const int16_t object_id /* i: Object ID */ -#else - const int32_t output_Fs -#endif + LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t object_id /* i : Object ID */ ); void ivas_td_binaural_close( diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 645a23f2c8..cd5fdfcb9d 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -122,9 +122,7 @@ typedef struct float nonDiegeticPanGain; OMASA_ANA_HANDLE hOMasa; uint16_t total_num_objects; -#ifdef NONBE_1377_REND_DIRATT_CONF int16_t object_id; -#endif float ism_metadata_delay_ms; } input_ism; @@ -1611,11 +1609,7 @@ static ivas_error setRendInputActiveIsm( if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { -#ifdef NONBE_1377_REND_DIRATT_CONF if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, inputIsm->object_id ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1623,11 +1617,7 @@ static ivas_error setRendInputActiveIsm( /* Open TD renderer wrappers */ for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { -#ifdef NONBE_1377_REND_DIRATT_CONF if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, inputIsm->object_id ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1645,11 +1635,7 @@ static ivas_error setRendInputActiveIsm( } else { -#ifdef NONBE_1377_REND_DIRATT_CONF if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, inputIsm->object_id ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2406,11 +2392,7 @@ static ivas_error initMcBinauralRendering( if ( useTDRend && inputMc->tdRendWrapper.hBinRendererTd == NULL ) { -#ifdef NONBE_1377_REND_DIRATT_CONF if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2420,11 +2402,7 @@ static ivas_error initMcBinauralRendering( /* Open TD renderer wrappers */ for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { -#ifdef NONBE_1377_REND_DIRATT_CONF if ( ( error = ivas_td_binaural_open_ext( &inputMc->splitTdRendWrappers[i], inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, 0 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_open_ext( &inputMc->splitTdRendWrappers[i], inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -3962,7 +3940,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return IVAS_ERR_OK; } -#ifdef NONBE_1377_REND_DIRATT_CONF + /*-------------------------------------------------------------------* * IVAS_REND_SetObjectIDs() * @@ -3988,7 +3966,6 @@ ivas_error IVAS_REND_SetObjectIDs( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -7943,7 +7920,7 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, - ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), + (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 4df7d85961..c03dd72485 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -152,11 +152,9 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for input */ ); -#ifdef NONBE_1377_REND_DIRATT_CONF ivas_error IVAS_REND_SetObjectIDs( IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ ); -#endif ivas_error IVAS_REND_SetInputGain( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -- GitLab From d3225b603d217a7816ff2f011f5c4ea0265ca39c Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 Sep 2025 10:07:48 +0200 Subject: [PATCH 086/147] handle return error code from IVAS_REND_SetObjectIDs() --- apps/renderer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/renderer.c b/apps/renderer.c index 917a6f3a90..dc44806e79 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1229,7 +1229,11 @@ int main( masaIds[i] = 0u; } - IVAS_REND_SetObjectIDs( hIvasRend ); + if ( ( error = IVAS_REND_SetObjectIDs( hIvasRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_SetObjectIDs: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { -- GitLab From fe75ef08c0773cc3faea93f53ad4a57712761ca8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 Sep 2025 10:18:26 +0200 Subject: [PATCH 087/147] clang-format --- lib_rend/lib_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index cd5fdfcb9d..0f56db1ae3 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7920,7 +7920,7 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, - (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), + ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, -- GitLab From 9f446259e52e3620d339a85e6457292b39f48bad Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 16 Sep 2025 10:55:06 +0200 Subject: [PATCH 088/147] Pop from ring buffers in one unified place --- lib_dec/lib_dec.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 11c645bd08..ab29c22adc 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1933,6 +1933,7 @@ static ivas_error isar_render_poses( static ivas_error isar_generate_metadata_and_bitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ float **p_head_pose_buf, + int16_t nSamples, /* i : duration of audio (in samples per channel) for which metadata should be generated */ ISAR_SPLIT_REND_BITS_DATA *splitRendBits /* o : output split rendering bits */ ) { @@ -1943,10 +1944,10 @@ static ivas_error isar_generate_metadata_and_bitstream( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; int16_t max_band; int16_t pcm_out_flag; - int16_t td_input; + int16_t cldfb_in_flag; int16_t ro_md_flag; IVAS_QUATERNION Quaternion; - int16_t i, j, num_poses, num_cldfb_slots; + int16_t i, j, num_poses, num_cldfb_slots, n_samples_in_cldfb_slot; float *p_Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; float *p_Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX]; @@ -1958,12 +1959,15 @@ static ivas_error isar_generate_metadata_and_bitstream( max_band = (int16_t) ( ( BINAURAL_MAXBANDS * output_Fs ) / 48000 ); pcm_out_flag = ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; - td_input = st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC; + cldfb_in_flag = ivas_dec_split_rend_cldfb_in( st_ivas ); - if ( !td_input ) + if ( cldfb_in_flag ) { + n_samples_in_cldfb_slot = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + assert( nSamples % n_samples_in_cldfb_slot == 0 ); + num_cldfb_slots = nSamples / n_samples_in_cldfb_slot; + num_poses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; - num_cldfb_slots = (int16_t) hIvasDec->st_ivas->hDecoderConfig->render_framesize * JBM_CLDFB_SLOTS_IN_SUBFRAME; for ( i = 0; i < (int16_t) ( BINAURAL_CHANNELS * num_poses ); ++i ) { @@ -1988,6 +1992,11 @@ static ivas_error isar_generate_metadata_and_bitstream( } } } + else + { + ivas_TD_RINGBUF_PopChannels( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, nSamples ); + } + if ( st_ivas->hBinRendererTd != NULL ) { @@ -2019,7 +2028,7 @@ static ivas_error isar_generate_metadata_and_bitstream( splitRendBits, p_Cldfb_RealBuffer_Binaural, p_Cldfb_ImagBuffer_Binaural, - max_band, p_head_pose_buf, 1, !td_input, pcm_out_flag, ro_md_flag ) ) != IVAS_ERR_OK ) + max_band, p_head_pose_buf, 1, cldfb_in_flag, pcm_out_flag, ro_md_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -2083,12 +2092,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( p_head_pose_buf[i] = head_pose_buf[i]; } - if ( !ivas_dec_split_rend_cldfb_in( st_ivas ) ) - { - ivas_TD_RINGBUF_PopChannels( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, *nOutSamples ); - } - - error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); + error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, *nOutSamples, splitRendBits ); if ( error != IVAS_ERR_OK ) { return error; @@ -3981,13 +3985,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples p_head_pose_buf[i] = head_pose_buf[i]; } - if ( !ivas_dec_split_rend_cldfb_in( st_ivas ) ) - { - ivas_TD_RINGBUF_PopChannels( hIvasDec->st_ivas->hSplitBinRend->hMultiBinTdData, p_head_pose_buf, *nSamplesRendered ); - } - /* Analyse head poses over entire frame, generate ISAR metadata and maybe encode if split coded */ - error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, splitRendBits ); + error = isar_generate_metadata_and_bitstream( hIvasDec, p_head_pose_buf, *nSamplesRendered, splitRendBits ); if ( error != IVAS_ERR_OK ) { return error; -- GitLab From c6bc453782752bddd85ff4615782d822fc6a1870 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 16 Sep 2025 16:41:27 +0200 Subject: [PATCH 089/147] revert improvements --- apps/renderer.c | 6 +----- lib_dec/ivas_mdct_core_dec.c | 10 ++++++---- lib_dec/lib_dec.c | 4 ++-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index dc44806e79..917a6f3a90 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1229,11 +1229,7 @@ int main( masaIds[i] = 0u; } - if ( ( error = IVAS_REND_SetObjectIDs( hIvasRend ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nIVAS_REND_SetObjectIDs: %s\n", ivas_error_to_string( error ) ); - goto cleanup; - } + IVAS_REND_SetObjectIDs( hIvasRend ); for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index db6a874b09..4e7f54eecf 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -1104,10 +1104,12 @@ void ivas_mdct_core_tns_ns( decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1 ); sns_shape_spectrum( x[ch][k], st->hTcxCfg->psychParamsCurrent, &sns_int_scf[0], st->hTcxCfg->psychParamsCurrent->nBins ); - - /* In case of PLC, applying SNS up to L_spec might not be enough: In case the transition frame from DTX after an inactive period is lost, L_spec is assumed to represent a regular TCX frame, - however, this frame is nevertheless acting as an transition frame as also visible in L_frameTCX; thus, the safer approach to prevent high frequency artifacts is to apply the SNS up to L_frameTCX; - in case this is not necessary, x[] is filled with zeros, and the multiplication is not causing any additional harm */ + /* + 2025-09-07, mul: + in case of PLC, applying SNS up to L_spec might not be enough : In case the transition frame from DTX after an inactive period is lost, L_spec is assumed to represent a regular TCX frame, however, this frame is nevertheless acting as an transition frame as also visible in L_frameTCX; + thus, the safer approach to prevent high frequency artifacts is to apply the SNS up to L_frameTCX; + in case this is not necessary, x[] is filled with zeros, and the multiplication is not causing any additional harm * / + */ v_multc( x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf[FDNS_NPTS - 1], x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, max( L_spec[ch], L_frameTCX[ch] ) - st->hTcxCfg->psychParamsCurrent->nBins ); decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0 ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index cf922e27b4..7d3a639337 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1058,7 +1058,7 @@ ivas_error IVAS_DEC_ReadFormat( } } - /* JBM: compensate when binaural renderer granularity goes down (happens in bitrate switching) */ + /* JBM: compensate when binaural renderer granularity changes (happens in bitrate switching) */ if ( st_ivas->ini_active_frame > 0 && st_ivas->hDecoderConfig->Opt_tsm && ( ( renderer_type_old != st_ivas->renderer_type ) || ( renderer_type_sec_old != renderer_type_sec_new ) ) ) @@ -1072,7 +1072,7 @@ ivas_error IVAS_DEC_ReadFormat( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - /* when granularity goes down from 5ms to 1.25ms, render what still fits in the new granularity */ + /* when granularity goes down, render what still fits in the new granularity */ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, pcm_type_API_to_internal( hIvasDec->pcmType ), hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) -- GitLab From 6f3ec62e2d85c7250d7cb6c0acb690c749c3223c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 18 Sep 2025 08:06:15 +0200 Subject: [PATCH 090/147] Add missing error code handling from IVAS_REND_SetObjectIDs --- apps/renderer.c | 8 + lib_com/options.h | 2 +- scripts/testv/headrot.csv | 5371 +------------------------------------ 3 files changed, 10 insertions(+), 5371 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 917a6f3a90..cf5a7e33d2 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1229,7 +1229,15 @@ int main( masaIds[i] = 0u; } +#ifdef FIX_1377_HANDLE_ERROR_CODE + if ( ( error = IVAS_REND_SetObjectIDs( hIvasRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_SetObjectIDs: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } +#else IVAS_REND_SetObjectIDs( hIvasRend ); +#endif for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { diff --git a/lib_com/options.h b/lib_com/options.h index 77f6098c21..693f3610f9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ - +#define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ /* #################### End BE switches ################################## */ diff --git a/scripts/testv/headrot.csv b/scripts/testv/headrot.csv index b298d22c89..9970bb2db0 100644 --- a/scripts/testv/headrot.csv +++ b/scripts/testv/headrot.csv @@ -2728,5373 +2728,4 @@ 0.707107,0.000000,0.000000,0.707107 0.707107,0.000000,0.000000,0.707107 0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.0000 \ No newline at end of file -- GitLab From 32ed6759b3e174fa2793c2433d7a04d2725bb37f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 18 Sep 2025 09:13:47 +0200 Subject: [PATCH 091/147] Restore headrot.csv --- scripts/testv/headrot.csv | 5371 ++++++++++++++++++++++++++++++++++++- 1 file changed, 5370 insertions(+), 1 deletion(-) diff --git a/scripts/testv/headrot.csv b/scripts/testv/headrot.csv index 9970bb2db0..b298d22c89 100644 --- a/scripts/testv/headrot.csv +++ b/scripts/testv/headrot.csv @@ -2728,4 +2728,5373 @@ 0.707107,0.000000,0.000000,0.707107 0.707107,0.000000,0.000000,0.707107 0.707107,0.000000,0.000000,0.707107 -0.707107,0.000000,0.0000 \ No newline at end of file +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 +0.707107,0.000000,0.000000,0.707107 -- GitLab From 6f55d5cc3c1b2272e31d6d61fa9599f3a0668000 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Thu, 18 Sep 2025 12:52:33 +0300 Subject: [PATCH 092/147] Change head tracking parameter to not be a pointer --- lib_rend/ivas_prot_rend.h | 2 +- lib_rend/ivas_rotation.c | 12 ++++++------ lib_rend/lib_rend.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 6cce3e77f8..0bd66308bc 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1322,7 +1322,7 @@ ivas_error combine_external_and_head_orientations_dec( ); ivas_error combine_external_and_head_orientations_rend( - IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + IVAS_REND_HeadRotData hHeadTrackData, /* i : head track data */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ); diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 9385bc753e..a8e9acdfcb 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -887,7 +887,7 @@ ivas_error combine_external_and_head_orientations_dec( *------------------------------------------------------------------------*/ ivas_error combine_external_and_head_orientations_rend( - IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + IVAS_REND_HeadRotData hHeadTrackData, /* i : head track data */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) @@ -898,14 +898,14 @@ ivas_error combine_external_and_head_orientations_rend( int16_t i; sr_pose_pred_axis = DEFAULT_AXIS; - if ( hHeadTrackData != NULL ) + if ( hHeadTrackData.hOrientationTracker != NULL ) { - if ( hHeadTrackData->headRotEnabled ) + if ( hHeadTrackData.headRotEnabled ) { - headRotQuaternions = hHeadTrackData->headPositions; - listenerPos = hHeadTrackData->Pos; + headRotQuaternions = hHeadTrackData.headPositions; + listenerPos = hHeadTrackData.Pos; } - sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; + sr_pose_pred_axis = hHeadTrackData.sr_pose_pred_axis; } else if ( hExtOrientationData != NULL ) { diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 0f56db1ae3..645772e610 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5058,7 +5058,7 @@ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - return combine_external_and_head_orientations_rend( &hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); + return combine_external_and_head_orientations_rend( hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); } -- GitLab From f214d4658f5c1473723cf710fd4722a8c65a014c Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Thu, 18 Sep 2025 13:04:40 +0300 Subject: [PATCH 093/147] Revert head tracking parameter back to pointer, move head tracking data readings under headRotEnabled --- lib_rend/ivas_prot_rend.h | 2 +- lib_rend/ivas_rotation.c | 13 +++++-------- lib_rend/lib_rend.c | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 0bd66308bc..6cce3e77f8 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1322,7 +1322,7 @@ ivas_error combine_external_and_head_orientations_dec( ); ivas_error combine_external_and_head_orientations_rend( - IVAS_REND_HeadRotData hHeadTrackData, /* i : head track data */ + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ); diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index a8e9acdfcb..b9286d3d96 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -887,7 +887,7 @@ ivas_error combine_external_and_head_orientations_dec( *------------------------------------------------------------------------*/ ivas_error combine_external_and_head_orientations_rend( - IVAS_REND_HeadRotData hHeadTrackData, /* i : head track data */ + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) @@ -898,14 +898,11 @@ ivas_error combine_external_and_head_orientations_rend( int16_t i; sr_pose_pred_axis = DEFAULT_AXIS; - if ( hHeadTrackData.hOrientationTracker != NULL ) + if ( hHeadTrackData->headRotEnabled ) { - if ( hHeadTrackData.headRotEnabled ) - { - headRotQuaternions = hHeadTrackData.headPositions; - listenerPos = hHeadTrackData.Pos; - } - sr_pose_pred_axis = hHeadTrackData.sr_pose_pred_axis; + headRotQuaternions = hHeadTrackData->headPositions; + listenerPos = hHeadTrackData->Pos; + sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; } else if ( hExtOrientationData != NULL ) { diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 645772e610..0f56db1ae3 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5058,7 +5058,7 @@ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - return combine_external_and_head_orientations_rend( hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); + return combine_external_and_head_orientations_rend( &hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); } -- GitLab From 4d5a719b35ef33bbd2f375c16fb1a0adaf28aab1 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Thu, 18 Sep 2025 13:13:57 +0300 Subject: [PATCH 094/147] Add switche for issue 1383 --- lib_com/options.h | 1 + lib_rend/ivas_rotation.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 77f6098c21..27394d6ff3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,6 +163,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ +#define FIX_1383_HEAD_TRACK_SANITIZER /* Nok: issue 1383: Fix head tracking struc values reading in renderer */ /* #################### End BE switches ################################## */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index b9286d3d96..ad42bd515e 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -898,10 +898,20 @@ ivas_error combine_external_and_head_orientations_rend( int16_t i; sr_pose_pred_axis = DEFAULT_AXIS; +#ifdef FIX_1383_HEAD_TRACK_SANITIZER if ( hHeadTrackData->headRotEnabled ) { headRotQuaternions = hHeadTrackData->headPositions; listenerPos = hHeadTrackData->Pos; +#else + if ( hHeadTrackData != NULL ) + { + if ( hHeadTrackData->headRotEnabled ) + { + headRotQuaternions = hHeadTrackData->headPositions; + listenerPos = hHeadTrackData->Pos; + } +#endif sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; } else if ( hExtOrientationData != NULL ) -- GitLab From a8ff3ed81f31a5b9a6480cdd2d3c0baad132a124 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 18 Sep 2025 16:40:48 +0200 Subject: [PATCH 095/147] Fix python type hints not compatible with Python 3.9 --- tests/split_rendering/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/split_rendering/utils.py b/tests/split_rendering/utils.py index ffb14eb55a..1d54d24e08 100644 --- a/tests/split_rendering/utils.py +++ b/tests/split_rendering/utils.py @@ -34,7 +34,7 @@ import re import sys from pathlib import Path from tempfile import TemporaryDirectory -from typing import Tuple +from typing import Tuple, Optional import numpy as np import pytest @@ -185,7 +185,7 @@ def run_full_chain_split_rendering( get_ssnr=False, get_odg=False, get_odg_bin=False, - delay_profile: Path | None=None, + delay_profile: Optional[Path]=None, ) -> str: """ Runs the full split rendering chain consisting of -- GitLab From 2ae1d602f5486eb72eeb70b8e375b714bad24936 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 19 Sep 2025 10:38:44 +0300 Subject: [PATCH 096/147] Fixes issue 1344. --- lib_com/options.h | 1 + lib_rend/ivas_dirac_ana.c | 8 +++++++ lib_rend/ivas_masa_merge.c | 23 ++++++++++++++++++++ lib_rend/ivas_mcmasa_ana.c | 43 ++++++++++++++++++++++++++++++++++++++ lib_rend/ivas_omasa_ana.c | 8 +++++++ lib_rend/ivas_prot_rend.h | 11 ++++++++++ lib_rend/ivas_stat_rend.h | 5 +++++ lib_rend/lib_rend.c | 9 ++++++++ 8 files changed, 108 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..caa8210e61 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -176,6 +176,7 @@ #define NONBE_1244_FIX_SWB_BWE_MEMORY /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */ #define NONBE_1122_KEEP_EVS_MODE_UNCHANGED /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR. */ #define NONBE_1328_FIX_NON_LINEARITY /* VA: Fix possible issue when computing bwe_exc_extended and previous frame were almost 0 */ +#define NONBE_1344_REND_MASA_LOW_FS /* Nokia: Issue 1344: Fix sanitizer errors when using IVAS_rend to render MASA with lower sampling rates */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index f6273106de..973182504a 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -235,6 +235,14 @@ void ivas_dirac_ana( /* Estimate MASA parameters from the SBA signals */ ivas_dirac_param_est_ana( hDirAC, data_in_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); +#ifdef NONBE_1344_REND_MASA_LOW_FS + /* Add zeros to higher bands in case of lower sampling rates */ + if ( hDirAC->nbands < MASA_FREQUENCY_BANDS ) + { + ivas_masa_zero_high_bands( hDirAC->nbands, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + } +#endif + /* Create MASA metadata buffer from the estimated values */ ivas_create_masa_out_meta( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index 37ee8cc7ef..cd5af80ff1 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -37,6 +37,9 @@ #include "ivas_prot.h" #include "ivas_cnst.h" #include "prot.h" +#ifdef NONBE_1344_REND_MASA_LOW_FS +#include "ivas_rom_com.h" +#endif #include "wmc_auto.h" @@ -326,6 +329,9 @@ ivas_error masaPrerendOpen( { MASA_PREREND_HANDLE hMasaPrerend; int16_t i; +#ifdef NONBE_1344_REND_MASA_LOW_FS + int16_t maxBin; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -336,6 +342,23 @@ ivas_error masaPrerendOpen( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); } +#ifdef NONBE_1344_REND_MASA_LOW_FS + /* Determine the number of bands and band grouping */ + hMasaPrerend->nbands = MASA_FREQUENCY_BANDS; + mvs2s( MASA_band_grouping_24, hMasaPrerend->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hMasaPrerend->nbands + 1; i++ ) + { + if ( hMasaPrerend->band_grouping[i] >= maxBin ) + { + hMasaPrerend->band_grouping[i] = maxBin; + hMasaPrerend->nbands = i; + break; + } + } +#endif + hMasaPrerend->num_Cldfb_instances = numTransports; for ( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) { diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 7851921030..6dec9feaa1 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -393,6 +393,14 @@ void ivas_mcmasa_ana( /* Analysis */ ivas_mcmasa_param_est_ana( hMcMasa, data_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_inp ); +#ifdef NONBE_1344_REND_MASA_LOW_FS + /* Add zeros to higher bands in case of lower sampling rates */ + if ( hMcMasa->nbands < MASA_FREQUENCY_BANDS ) + { + ivas_masa_zero_high_bands( hMcMasa->nbands, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + } +#endif + /* Create MASA metadata buffer from the estimated values */ ivas_create_masa_out_meta( hMcMasa->hMasaOut, hMcMasa->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); @@ -1131,3 +1139,38 @@ void ivas_create_masa_out_meta( return; } + + +#ifdef NONBE_1344_REND_MASA_LOW_FS +/*------------------------------------------------------------------------- + * ivas_masa_zero_high_bands() + * + * + *------------------------------------------------------------------------*/ + +void ivas_masa_zero_high_bands( + const int16_t nbands, /* i : Number of frequency bands with estimated values */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i/o : Estimated surround coherence */ +) +{ + int16_t sf, band; + + for (sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++) + { + for ( band = nbands; band < MASA_FREQUENCY_BANDS; band++ ) + { + elevation_m_values[sf][band] = 0.0f; + azimuth_m_values[sf][band] = 0.0f; + energyRatio[sf][band] = 0.0f; + spreadCoherence[sf][band] = 0.0f; + surroundingCoherence[sf][band] = 0.0f; + } + } + + return; +} +#endif diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index e7f58262ed..566099d5b7 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -261,6 +261,14 @@ void ivas_omasa_ana( /* Estimate MASA parameters from the objects */ ivas_omasa_param_est_ana( hOMasa, data_in_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_ism ); +#ifdef NONBE_1344_REND_MASA_LOW_FS + /* Add zeros to higher bands in case of lower sampling rates */ + if ( hOMasa->nbands < MASA_FREQUENCY_BANDS ) + { + ivas_masa_zero_high_bands( hOMasa->nbands, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + } +#endif + /* Create MASA metadata buffer from the estimated values */ ivas_create_masa_out_meta( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 51a1da9933..cca2f34dc6 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1476,6 +1476,17 @@ void ivas_create_masa_out_meta( float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : Estimated surround coherence */ ); +#ifdef NONBE_1344_REND_MASA_LOW_FS +void ivas_masa_zero_high_bands( + const int16_t nbands, /* i : Number of frequency bands with estimated values */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i/o : Estimated surround coherence */ +); +#endif + ivas_error ivas_dirac_ana_open( DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ int32_t input_Fs diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 69fcb30fb8..5416e980b5 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1526,6 +1526,11 @@ typedef struct ivas_dirac_ana_data_structure typedef struct ivas_masa_prerend_data_structure { +#ifdef NONBE_1344_REND_MASA_LOW_FS + int16_t nbands; + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; +#endif + /* CLDFB analysis */ int16_t num_Cldfb_instances; HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MASA_MAX_TRANSPORT_CHANNELS]; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 52994cdba1..78bf020db5 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7312,10 +7312,19 @@ static void renderMasaToMasa( } /* Compute channel energy for metadata processing */ +#ifdef NONBE_1344_REND_MASA_LOW_FS + for ( band_m_idx = 0; band_m_idx < masaInput->hMasaPrerend->nbands; band_m_idx++ ) +#else for ( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ ) +#endif { +#ifdef NONBE_1344_REND_MASA_LOW_FS + brange[0] = masaInput->hMasaPrerend->band_grouping[band_m_idx]; + brange[1] = masaInput->hMasaPrerend->band_grouping[band_m_idx + 1]; +#else brange[0] = MASA_band_grouping_24[band_m_idx]; brange[1] = MASA_band_grouping_24[band_m_idx + 1]; +#endif for ( j = brange[0]; j < brange[1]; j++ ) { for ( i = 0; i < numAnalysisChannels; i++ ) -- GitLab From 45010f473cb44fb18a499aaba0ba6ca898c90cdc Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 19 Sep 2025 10:47:27 +0300 Subject: [PATCH 097/147] Clang format --- lib_rend/ivas_mcmasa_ana.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 6dec9feaa1..2f67607e94 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -1159,7 +1159,7 @@ void ivas_masa_zero_high_bands( { int16_t sf, band; - for (sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++) + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { for ( band = nbands; band < MASA_FREQUENCY_BANDS; band++ ) { -- GitLab From 6ff5e14582ff89cd64997c5afc1d0bd33016a55f Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 19 Sep 2025 10:38:34 +0200 Subject: [PATCH 098/147] issue 1388: fix use-of-uninitialized value in ivas_init_decoder(); under FIX_1388_MSAN_ivas_init_decoder --- lib_com/options.h | 1 + lib_dec/lib_dec.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..1d89aac74e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,7 @@ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ +#define FIX_1388_MSAN_ivas_init_decoder /* VA: issue 1388: fix use-of-uninitialized value in ivas_init_decoder() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0f54199425..c2c9489998 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -857,12 +857,23 @@ ivas_error IVAS_DEC_FeedFrame_Serial( { ivas_error error; +#ifdef FIX_1388_MSAN_ivas_init_decoder + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + +#endif if ( !hIvasDec->isInitialized ) { /* Once first frame is fed, finish initialization in EVS Mono. * In IVAS mode, initialization is done in ivas_dec(). */ if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { +#ifdef FIX_1388_MSAN_ivas_init_decoder + hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = ACELP_8k00; + +#endif if ( ( error = ivas_init_decoder( hIvasDec->st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -875,10 +886,12 @@ ivas_error IVAS_DEC_FeedFrame_Serial( st->prev_use_partial_copy = 0; hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = hIvasDec->hVoIP->hCurrentDataUnit->dataSize * FRAMES_PER_SEC; } +#ifndef FIX_1388_MSAN_ivas_init_decoder else { hIvasDec->st_ivas->hDecoderConfig->ivas_total_brate = ACELP_8k00; } +#endif hIvasDec->isInitialized = true; } } @@ -908,6 +921,7 @@ ivas_error IVAS_DEC_FeedFrame_Serial( bfi = 2; } } + if ( ( error = read_indices( hIvasDec->st_ivas, serial, num_bits, &hIvasDec->prev_ft_speech, &hIvasDec->CNG, bfi ) ) != IVAS_ERR_OK ) { return error; -- GitLab From 677cdfb335ea08cfd415acca77de1ab08c19f5a9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 19 Sep 2025 11:20:02 +0200 Subject: [PATCH 099/147] issue 1384: fix use-of-uninitialized value in stereo_tcx_core_enc(); under FIX_1384_MSAN_stereo_tcx_core_enc --- lib_com/options.h | 1 + lib_dec/ivas_tcx_core_dec.c | 29 +++++++++++++++++++++++++++-- lib_enc/ivas_tcx_core_enc.c | 5 ++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..93fe135c81 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,7 @@ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ +#define FIX_1384_MSAN_stereo_tcx_core_enc /* VA: issue 1384: fix use-of-uninitialized value in stereo_tcx_core_enc() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index fc66dbc22a..94d5c89409 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -277,7 +277,7 @@ void stereo_tcx_core_dec( } /*--------------------------------------------------------------------------------* - * LPC PARAMETERS + * LPC envelope decoding *--------------------------------------------------------------------------------*/ st->acelp_cfg.midLpc = 0; @@ -288,6 +288,9 @@ void stereo_tcx_core_dec( { int16_t tcx_lpc_cdk; +#ifdef FIX_1384_MSAN_stereo_tcx_core_enc + tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); +#else if ( bfi && st->use_partial_copy && st->rf_frame_type == RF_TCXFD ) { tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); @@ -296,6 +299,7 @@ void stereo_tcx_core_dec( { tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); } +#endif mvr2r( st->lsf_old, &lsf[0], M ); mvr2r( st->lsp_old, &lsp[0], M ); @@ -532,6 +536,7 @@ void stereo_tcx_core_dec( if ( st->core == TCX_10_CORE || st->core == TCX_20_CORE ) { +#ifndef FIX_1384_MSAN_stereo_tcx_core_enc if ( st->enablePlcWaveadjust || /* bfi */ ( st->last_total_brate >= HQ_48k && /* recovery */ st->last_codec_mode == MODE2 ) ) @@ -549,6 +554,7 @@ void stereo_tcx_core_dec( } } } +#endif if ( !bfi && st->hTonalMDCTConc != NULL ) { @@ -834,7 +840,11 @@ static void dec_prm_tcx( getTCXMode( st, st, 0 /* <- MCT_flag */ ); /* last_core for error concealment */ +#ifdef FIX_1384_MSAN_stereo_tcx_core_enc + if ( st->element_mode != IVAS_CPE_MDCT ) +#else if ( !st->use_partial_copy && st->element_mode != IVAS_CPE_MDCT ) +#endif { st->last_core_from_bs = get_next_indice( st, 1 ); /* Store decoder memory of last_core */ if ( st->last_core == ACELP_CORE && st->last_core_from_bs != ACELP_CORE ) @@ -860,8 +870,10 @@ static void dec_prm_tcx( } } +#ifndef FIX_1384_MSAN_stereo_tcx_core_enc if ( !st->use_partial_copy ) { +#endif if ( st->element_mode != IVAS_CPE_MDCT ) { getTCXWindowing( st->core, st->last_core, st->element_mode, st->hTcxCfg, st ); @@ -872,8 +884,9 @@ static void dec_prm_tcx( { st->dec_glr_idx = -1; } +#ifndef FIX_1384_MSAN_stereo_tcx_core_enc } - +#endif #ifdef DEBUG_MODE_TCX fprintf( pF, "\t TCX Header: %d bits: %d %d %d %d\n", st->next_bit_pos - start_bit_pos, st->tcxonly, st->core, st->tcxonly ? st->clas_dec : st->hTcxCfg->coder_type, st->hTcxCfg->tcx_curr_overlap_mode ); nbits_tcx = st->next_bit_pos; @@ -895,6 +908,17 @@ static void dec_prm_tcx( * TCX20/10 parameters *--------------------------------------------------------------------------------*/ +#ifdef FIX_1384_MSAN_stereo_tcx_core_enc + getTCXparam( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); + + if ( *total_nbbits - bitsRead[0] < ( st->next_bit_pos - start_bit_pos ) ) + { + st->BER_detect = 1; + st->next_bit_pos = start_bit_pos + *total_nbbits - bitsRead[0]; + } + + bitsRead[0] = st->next_bit_pos - start_bit_pos; +#else if ( st->use_partial_copy == 0 ) { getTCXparam( st, st, hm_cfg, param, bits_common, start_bit_pos, NULL, NULL, NULL, -1 ); @@ -910,6 +934,7 @@ static void dec_prm_tcx( bitsRead[0] = st->next_bit_pos - start_bit_pos; } +#endif return; } diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 91adac9a0f..a2f96032d0 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -310,7 +310,7 @@ void stereo_tcx_core_enc( } /*--------------------------------------------------------------* - * Envelope Quantization and FDNS + * LPC Envelope Quantization and FDNS *---------------------------------------------------------------*/ if ( !st->enableTcxLpc ) @@ -336,6 +336,9 @@ void stereo_tcx_core_enc( } } +#ifdef FIX_1384_MSAN_stereo_tcx_core_enc + st->acelp_cfg.midLpc = 0; +#endif last_core_orig = st->last_core; for ( n = 0; n < n_subframes; n++ ) { -- GitLab From e41c8c8b629ddb9d015417883377a846ea6185c3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Sun, 21 Sep 2025 20:43:12 +0200 Subject: [PATCH 100/147] remove more dependencies on st->enablePlcWaveadjust --- lib_dec/ivas_tcx_core_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 94d5c89409..b7e5c11f95 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -398,10 +398,12 @@ void stereo_tcx_core_dec( lsp2a_stab( st->lsp_old, st->old_Aq_12_8, M ); } +#ifndef FIX_1384_MSAN_stereo_tcx_core_enc if ( st->enablePlcWaveadjust && bfi ) { st->hPlcInfo->nbLostCmpt++; } +#endif /*--------------------------------------------------------------------------------* * TD-TCX concealment @@ -679,10 +681,12 @@ void stereo_tcx_core_dec( if ( !bfi ) { +#ifndef FIX_1384_MSAN_stereo_tcx_core_enc if ( st->enablePlcWaveadjust ) { st->hPlcInfo->nbLostCmpt = 0; } +#endif if ( param[1 + NOISE_FILL_RANGES] != 0 ) { -- GitLab From 77af76759ac8e849cd5a82d1352dd7fcda50ee88 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 22 Sep 2025 14:00:20 +0200 Subject: [PATCH 101/147] use new ivas_CLDFB_RINGBUF_GetByIdx in DEBUGGING code too --- lib_dec/ivas_binRenderer_internal.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 8cda55017c..840b75e46f 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1301,6 +1301,9 @@ void ivas_binaural_cldfb( float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *re, *im; +#endif int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch; /* Implement a 5 msec loops */ @@ -1396,8 +1399,14 @@ void ivas_binaural_cldfb( maxBand ); } +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[( pos_idx * BINAURAL_CHANNELS ) + ch], &re, &im, ( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx ); + mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], re, maxBand ); + mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], im, maxBand ); +#else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx], maxBand ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx], maxBand ); +#endif } } } @@ -1445,6 +1454,9 @@ void ivas_binaural_cldfb_sf( float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + float *re, *im; +#endif int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch; int16_t slots_to_render, first_sf, last_sf; int16_t slot_index_start, slot_index_start_cldfb; @@ -1537,8 +1549,14 @@ void ivas_binaural_cldfb_sf( { for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) { +#ifdef FIX_1119_SPLIT_RENDERING_VOIP + ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[( pos_idx * BINAURAL_CHANNELS ) + ch], &re, &im, slot_index_start + slot_idx ); + mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], re, maxBand ); + mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], im, maxBand ); +#else mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); +#endif } } } -- GitLab From 281fb519fbbec75c15f9f291d0016c3eba5e9107 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 22 Sep 2025 18:16:35 +0200 Subject: [PATCH 102/147] [CI] make the prepare_instrumentation capable of dealing with lib_basop; see BASOP MR2260 --- scripts/prepare_instrumentation.sh | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/scripts/prepare_instrumentation.sh b/scripts/prepare_instrumentation.sh index 52549c7789..3698b12b26 100755 --- a/scripts/prepare_instrumentation.sh +++ b/scripts/prepare_instrumentation.sh @@ -200,6 +200,13 @@ if [ $? -ne 0 ]; then exit -1 fi +LIB_BASOP=0 +basop_dir="" +if [ -d $targetdir/lib_basop ]; then + LIB_BASOP=1 + basop_dir="$targetdir/lib_basop/*.c" +fi + # strip switches, to remove the macros (turn on extended globing to allow !(pattern*) matching) shopt -s extglob if coan_exists; then @@ -209,13 +216,16 @@ if coan_exists; then coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/apps/*.[hc] if [ $ISAR -eq 0 ]; then - coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/lib_{com,dec,enc,rend,util}/!(wmc_auto*).[hc] + coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/lib_{com,dec,enc,rend,util,debug}/!(wmc_auto*).[hc] else coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/lib_{com,dec,enc,isar,lc3plus,rend,util,debug}/!(wmc_auto*).[hc] if [ $LC3PLUS_FFT -eq 1 ]; then coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/lib_lc3plus/fft/!(wmc_auto*).[hc] fi fi + if [ $LIB_BASOP -eq 1 ]; then + coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/lib_basop/!(wmc_auto*).[hc] + fi coan source --replace --no-transients -E -K --file $ifdef_list $targetdir/lib_lc3plus/!(wmc_auto*).[hc] else $scriptdir/strip_defines_cppp.sh $targetdir $ifdef_list @@ -227,21 +237,22 @@ find $targetdir -name "*.[ch]" -exec sed -i.bak -e "s/\(0x[0-9a-fA-F]*\)UL/\(\(u # run wmc_tool, exit if the command fails set -e +rm -f wmc_tool_output.txt touch wmc_tool_output.txt trap 'echo "Error calling WMC tool: $?"; cat wmc_tool_output.txt' ERR -"$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/encoder.c" "$targetdir/lib_enc/*.c" "$targetdir/lib_com/*.c" >>wmc_tool_output.txt 2>&1 -"$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" "$targetdir/lib_rend/*.c" >>wmc_tool_output.txt 2>&1 +"$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/encoder.c" "$targetdir/lib_enc/*.c" "$targetdir/lib_com/*.c" "$basop_dir" >>wmc_tool_output.txt 2>&1 +"$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" "$targetdir/lib_rend/*.c" "$basop_dir" >>wmc_tool_output.txt 2>&1 for bak_file in $targetdir/lib_rend/*.bak; do mv "$bak_file" "${bak_file%.*}"; done # restore fresh .c files to avoid time-consuming des-instrumentation of files by the WMC tool if [ $ISAR -eq 0 ]; then - "$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" >>wmc_tool_output.txt 2>&1 + "$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" "$basop_dir" >>wmc_tool_output.txt 2>&1 else - "$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" "$targetdir/lib_lc3plus/*.c" "$lc3plus_fftdir" >>wmc_tool_output.txt 2>&1 + "$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" "$targetdir/lib_lc3plus/*.c" "$lc3plus_fftdir" "$basop_dir" >>wmc_tool_output.txt 2>&1 for bak_file in $targetdir/lib_lc3plus/*.bak; do mv "$bak_file" "${bak_file%.*}"; done # restore fresh .c files to avoid time-consuming des-instrumentation of files by the WMC tool if [ -n "$lc3plus_fftdir" ]; then for bak_file in $targetdir/lib_lc3plus/fft/*.bak; do mv "$bak_file" "${bak_file%.*}"; done # restore fresh .c files to avoid time-consuming des-instrumentation of files by the WMC tool fi # ISAR post rend - "$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/isar_post_rend.c" "$targetdir/lib_isar/*.c" "$targetdir/lib_lc3plus/*.c" "$lc3plus_fftdir" >>wmc_tool_output.txt 2>&1 + "$scriptdir/tools/$system/wmc_tool" $wmc_opt -m "$targetdir/apps/isar_post_rend.c" "$targetdir/lib_isar/*.c" "$targetdir/lib_lc3plus/*.c" "$lc3plus_fftdir" "$basop_dir" >>wmc_tool_output.txt 2>&1 fi trap - ERR set +e -- GitLab From b0ec5f47effb63aaeda6c7a8edb4a88b7dbb3de3 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 23 Sep 2025 14:52:09 +0200 Subject: [PATCH 103/147] address HRTF leftovers --- apps/decoder.c | 2 +- apps/renderer.c | 6 ++--- lib_com/common_api_types.h | 2 +- lib_dec/ivas_binRenderer_internal.c | 8 ++---- lib_dec/lib_dec.c | 4 +-- lib_dec/lib_dec.h | 2 +- lib_rend/ivas_crend.c | 14 +++++------ lib_rend/ivas_stat_rend.h | 5 ++-- lib_rend/lib_rend.c | 38 ++++++++++++++--------------- lib_rend/lib_rend.h | 6 ++--- lib_util/hrtf_file_reader.c | 21 +++++++--------- lib_util/hrtf_file_reader.h | 4 +-- 12 files changed, 52 insertions(+), 60 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 41089d057e..444367122d 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -150,7 +150,7 @@ typedef struct hrtfFileReader *hrtfReader; char *hrtfFileName; - IVAS_DEC_HRTF_HANDLE *hHrtfTD; + IVAS_DEC_HRTF_TD_HANDLE *hHrtfTD; IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics; diff --git a/apps/renderer.c b/apps/renderer.c index cf5a7e33d2..caa1ce00d8 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -682,7 +682,7 @@ int main( IVAS_DEC_HRTF_CREND_HANDLE *hHrtfCrend = NULL; IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; - IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; + IVAS_DEC_HRTF_TD_HANDLE *hHrtfTD = NULL; IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; IsmPositionProvider *positionProvider = NULL; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; @@ -961,9 +961,9 @@ int main( if ( hrtfFileReader != NULL ) { - if ( ( error = IVAS_REND_GetHrtfHandle( hIvasRend, &hHrtfTD ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_GetHrtfTdHandle( hIvasRend, &hHrtfTD ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nIVAS_REND_GetHrtfHandle failed: %s\n\n", ivas_error_to_string( error ) ); + fprintf( stderr, "\nIVAS_REND_GetHrtfTdHandle failed: %s\n\n", ivas_error_to_string( error ) ); goto cleanup; } diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index f5b13c0dea..80c90d6b31 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -176,7 +176,7 @@ typedef enum typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; typedef struct ivas_masa_decoder_ext_out_meta_struct *IVAS_MASA_DECODER_EXT_OUT_META_HANDLE; -typedef struct ivas_hrtf_TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE; +typedef struct ivas_hrtf_TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_TD_HANDLE; typedef struct ivas_hrtf_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; typedef struct ivas_hrtf_fastconv_struct *IVAS_DEC_HRTF_FASTCONV_HANDLE; typedef struct ivas_hrtf_parambin_struct *IVAS_DEC_HRTF_PARAMBIN_HANDLE; diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 8cda55017c..d6ba1e0c15 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -795,8 +795,6 @@ ivas_error ivas_rend_openCldfbRend( int16_t convBand; ivas_error error; - error = IVAS_ERR_OK; - /*-----------------------------------------------------------------* * prepare library opening *-----------------------------------------------------------------*/ @@ -866,7 +864,7 @@ ivas_error ivas_rend_openCldfbRend( pCldfbRend->hCldfbRend = hBinRenderer; - return error; + return IVAS_ERR_OK; } @@ -885,8 +883,6 @@ ivas_error ivas_binRenderer_open( ivas_error error; const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics; - error = IVAS_ERR_OK; - /*-----------------------------------------------------------------* * prepare library opening *-----------------------------------------------------------------*/ @@ -1045,7 +1041,7 @@ ivas_error ivas_binRenderer_open( /* Copy the handles to main handle */ st_ivas->hBinRenderer = hBinRenderer; - return error; + return IVAS_ERR_OK; } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0f54199425..95ebbcb1c7 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2943,8 +2943,8 @@ ivas_error IVAS_DEC_FeedCustomLsData( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfTDrendHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : HRTF handle */ ) { if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfTD == NULL ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 18298954c4..3fff28470d 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -457,7 +457,7 @@ ivas_error IVAS_DEC_FeedCustomLsData( /*! r: error code */ ivas_error IVAS_DEC_GetHrtfTDrendHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : HRTF handle */ ); /*! r: error code */ diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index b120fd6c6a..9134667502 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -104,15 +104,15 @@ ivas_error ivas_Crend_hrtf_init( *------------------------------------------------------------------------*/ static ivas_error ivas_hrtf_open( - HRTFS_HANDLE *hHrtf_out /* o : HRTF handle */ + HRTFS_CREND_HANDLE *hHrtf_out /* o : HRTF handle */ ) { - HRTFS_HANDLE hHrtf; + HRTFS_CREND_HANDLE hHrtf; ivas_error error; if ( *hHrtf_out == NULL ) { - if ( ( hHrtf = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) + if ( ( hHrtf = (HRTFS_CREND_HANDLE) malloc( sizeof( HRTFS_CREND_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend HRTFS Handle\n" ); } @@ -140,7 +140,7 @@ static ivas_error ivas_hrtf_open( *------------------------------------------------------------------------*/ static void ivas_hrtf_close( - HRTFS_HANDLE *hHrtf /* i/o: HRTF handle */ + HRTFS_CREND_HANDLE *hHrtf /* i/o: Crend HRTF handle */ ) { if ( hHrtf == NULL || *hHrtf == NULL ) @@ -172,7 +172,7 @@ static ivas_error ivas_rend_initCrend( int16_t i, j, tmp, tmp2; int16_t nchan_in; IVAS_REND_AudioConfigType inConfigType; - HRTFS_HANDLE hHrtf; + HRTFS_CREND_HANDLE hHrtf; ivas_error error; inConfigType = getAudioConfigType( inConfig ); @@ -1158,13 +1158,11 @@ ivas_error ivas_rend_openCrend( { int16_t i, subframe_length; int32_t max_total_ir_len; - HRTFS_HANDLE hHrtf; + HRTFS_CREND_HANDLE hHrtf; CREND_HANDLE hCrend; ivas_error error; int16_t pos_idx; - error = IVAS_ERR_OK; - if ( ( error = ivas_rend_initCrendWrapper( pCrend, num_poses ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 69fcb30fb8..2552ef8ca1 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1182,7 +1182,7 @@ typedef struct ivas_hrtf_crend_structure uint16_t *pIndex_frequency_max_dyn[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; uint16_t *pIndex_frequency_max_diffuse_dyn[BINAURAL_CHANNELS]; -} HRTFS_DATA, *HRTFS_HANDLE, HRTFS_CREND_DATA, *HRTFS_CREND_HANDLE; // VE: all instance of HRTFS_DATAand *HRTFS_HANDLE should be renamed to HRTFS_CREND_DATA and *HRTFS_CREND_HANDLE +} HRTFS_CREND_DATA, *HRTFS_CREND_HANDLE; /* Main Crend structure */ typedef struct ivas_crend_state_t @@ -1209,7 +1209,7 @@ typedef struct ivas_binaural_crend_wrapper_struct { int32_t binaural_latency_ns; CREND_HANDLE hCrend[MAX_HEAD_ROT_POSES]; - HRTFS_HANDLE hHrtfCrend; + HRTFS_CREND_HANDLE hHrtfCrend; } CREND_WRAPPER, *CREND_WRAPPER_HANDLE; @@ -1272,6 +1272,7 @@ typedef struct ivas_hrtf_statistics_struct float *average_energy_r_dyn; float *inter_aural_coherence_dyn; int16_t fromROM; /* Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/ + } HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 52994cdba1..c917353459 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -183,10 +183,10 @@ typedef struct typedef struct hrtf_handles { - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; + IVAS_DEC_HRTF_CREND_HANDLE hHrtfCrend; IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; - IVAS_DEC_HRTF_HANDLE hHrtfTD; + IVAS_DEC_HRTF_TD_HANDLE hHrtfTD; IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics; } hrtf_handles; @@ -1672,7 +1672,7 @@ static ivas_error setRendInputActiveIsm( } else if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { - if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, 1, rendCtx.pSplitRendWrapper != NULL ? rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hHrtfCrend, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, 1, rendCtx.pSplitRendWrapper != NULL ? rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ) != IVAS_ERR_OK ) { return error; } @@ -2631,7 +2631,7 @@ static ivas_error setRendInputActiveMc( if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) { - if ( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, FALSE ) ) != IVAS_ERR_OK ) + if ( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hHrtfCrend, hrtfs->hHrtfStatistics, FALSE ) ) != IVAS_ERR_OK ) { return error; } @@ -2948,7 +2948,7 @@ static ivas_error setRendInputActiveSba( } } - if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics ) ) != IVAS_ERR_OK ) + if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hHrtfCrend, hrtfs->hHrtfStatistics ) ) != IVAS_ERR_OK ) { return error; } @@ -3241,7 +3241,7 @@ ivas_error IVAS_REND_Open( hIvasRend->hHrtfs.hHrtfFastConv = NULL; hIvasRend->hHrtfs.hHrtfParambin = NULL; hIvasRend->hHrtfs.hHrtfTD = NULL; - hIvasRend->hHrtfs.hSetOfHRTF = NULL; + hIvasRend->hHrtfs.hHrtfCrend = NULL; hIvasRend->hHrtfs.hHrtfStatistics = NULL; if ( asHrtfBinary ) { @@ -3249,7 +3249,7 @@ ivas_error IVAS_REND_Open( { return error; } - if ( ( error = ivas_HRTF_CRend_binary_open( &( hIvasRend->hHrtfs.hSetOfHRTF ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_HRTF_CRend_binary_open( &( hIvasRend->hHrtfs.hHrtfCrend ) ) ) != IVAS_ERR_OK ) { return error; } @@ -3947,7 +3947,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, + hIvasRend->hHrtfs.hHrtfCrend, hIvasRend->hHrtfs.hHrtfStatistics, FALSE ) ) != IVAS_ERR_OK ) { @@ -4807,7 +4807,7 @@ ivas_error IVAS_REND_SetHeadRotation( hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, + hIvasRend->hHrtfs.hHrtfCrend, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ) != IVAS_ERR_OK ) { @@ -4871,7 +4871,7 @@ ivas_error IVAS_REND_DisableHeadRotation( hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, + hIvasRend->hHrtfs.hHrtfCrend, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ) != IVAS_ERR_OK ) { @@ -7961,7 +7961,7 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, #endif - ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), + (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, @@ -8093,7 +8093,7 @@ void IVAS_REND_Close( /* Parametric binauralizer HRTF filters */ ivas_HRTF_binary_close( &( hIvasRend->hHrtfs.hHrtfTD ) ); - ivas_HRTF_CRend_binary_close( &( hIvasRend->hHrtfs.hSetOfHRTF ) ); + ivas_HRTF_CRend_binary_close( &( hIvasRend->hHrtfs.hHrtfCrend ) ); ivas_HRTF_fastconv_binary_close( &( hIvasRend->hHrtfs.hHrtfFastConv ) ); ivas_HRTF_parambin_binary_close( &( hIvasRend->hHrtfs.hHrtfParambin ) ); ivas_HRTF_statistics_close( &( hIvasRend->hHrtfs.hHrtfStatistics ) ); @@ -8250,14 +8250,14 @@ int32_t IVAS_REND_GetCntFramesLimited( /*---------------------------------------------------------------------* - * IVAS_REND_GetHrtfHandle( ) + * IVAS_REND_GetHrtfTdHandle( ) * * *---------------------------------------------------------------------*/ -ivas_error IVAS_REND_GetHrtfHandle( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ +ivas_error IVAS_REND_GetHrtfTdHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : TD rend. HRTF handle */ ) { if ( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfTD == NULL ) @@ -8279,15 +8279,15 @@ ivas_error IVAS_REND_GetHrtfHandle( ivas_error IVAS_REND_GetHrtfCRendHandle( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hHrtfCrend /* o : Crend HRTF handle */ ) { - if ( hIvasRend == NULL || hIvasRend->hHrtfs.hSetOfHRTF == NULL ) + if ( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfCrend == NULL ) { return IVAS_ERR_WRONG_PARAMS; } - *hSetOfHRTF = &hIvasRend->hHrtfs.hSetOfHRTF; + *hHrtfCrend = &hIvasRend->hHrtfs.hHrtfCrend; return IVAS_ERR_OK; } diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index c03dd72485..2e635ad479 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -194,15 +194,15 @@ ivas_error IVAS_REND_GetDelay( ); /*! r: error code */ -ivas_error IVAS_REND_GetHrtfHandle( +ivas_error IVAS_REND_GetHrtfTdHandle( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ - IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ + IVAS_DEC_HRTF_TD_HANDLE **hHrtfTD /* o : TD rend. HRTF handle */ ); /*! r: error code */ ivas_error IVAS_REND_GetHrtfCRendHandle( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ - IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hHrtfCrend /* o : Crend HRTF handle */ ); ivas_error IVAS_REND_GetHrtfFastConvHandle( diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 3347a0c9ab..66c886b7b6 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -436,8 +436,8 @@ static ivas_error TDREND_LoadBSplineBinaryITD( --------------------------------------------------------------------*/ static ivas_error TDREND_LoadBSplineBinary( - IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ - FILE *f_hrtf /* i : HR filter data file handle */ + IVAS_DEC_HRTF_TD_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ + FILE *f_hrtf /* i : HR filter data file handle */ ) { ModelParams_t *model; @@ -882,9 +882,9 @@ ivas_error load_reverb_binary( --------------------------------------------------------------------*/ static ivas_error TDREND_MIX_LoadHRTF( - FILE *f_hrtf, /* i/o: File pointer to HRTF file */ - const int32_t sampleRate, /* i : sample rate */ - IVAS_DEC_HRTF_HANDLE HrFiltSet_p /* o : Loaded HR filter set */ + FILE *f_hrtf, /* i/o: File pointer to HRTF file */ + const int32_t sampleRate, /* i : sample rate */ + IVAS_DEC_HRTF_TD_HANDLE HrFiltSet_p /* o : Loaded HR filter set */ ) { int16_t tmp; @@ -1006,7 +1006,7 @@ static ivas_error TDREND_MIX_LoadHRTF( *---------------------------------------------------------------------*/ ivas_error load_TDrend_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ + IVAS_DEC_HRTF_TD_HANDLE hHrtf, /* i/o: TD rend. HRTF handle */ const int32_t sampleRate, /* i : sample rate */ const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ) @@ -1029,7 +1029,7 @@ ivas_error load_TDrend_HRTF_binary( *---------------------------------------------------------------------*/ void destroy_td_hrtf( - IVAS_DEC_HRTF_HANDLE *hHrtf /* i/o: HRTF handle */ + IVAS_DEC_HRTF_TD_HANDLE *hHrtf /* i/o: TD rend. HRTF handle */ ) { int16_t i; @@ -1099,8 +1099,8 @@ void destroy_td_hrtf( *---------------------------------------------------------------------*/ static ivas_error create_Crend_HRTF_from_rawdata( - HRTFS_HANDLE *hHRTF, /* i/o: HRTF CRend handle */ - char *hrtf_data /* i : pointer to binary file */ + HRTFS_CREND_HANDLE *hHRTF, /* i/o: HRTF CRend handle */ + char *hrtf_data /* i : pointer to binary file */ ) { int16_t i, j, k; @@ -1112,7 +1112,6 @@ static ivas_error create_Crend_HRTF_from_rawdata( ivas_error error; Word16 factorQ; - if ( hrtf_data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -1254,7 +1253,6 @@ static ivas_error create_Crend_HRTF_from_rawdata( } } - /* coeff_im (the size depends on pIndex_frequency_max) */ for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { @@ -2095,7 +2093,6 @@ void destroy_hrtf_statistics( IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ) { - if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) && ( ( *hHrtfStatistics )->fromROM == FALSE ) ) { if ( ( *hHrtfStatistics )->average_energy_l != NULL ) diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 727e660dfb..938b5c1595 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -99,7 +99,7 @@ void hrtfFileReader_close( *---------------------------------------------------------------------*/ ivas_error load_TDrend_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ + IVAS_DEC_HRTF_TD_HANDLE hHrtf, /* i/o: TD rend. HRTF handle */ const int32_t sampleRate, /* i : sample rate */ const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); @@ -192,7 +192,7 @@ void destroy_parambin_hrtf( *---------------------------------------------------------------------*/ void destroy_td_hrtf( - IVAS_DEC_HRTF_HANDLE *hHRTF /* i/o: HRTF handle */ + IVAS_DEC_HRTF_TD_HANDLE *hHRTF /* i/o: TD rend. HRTF handle */ ); /*---------------------------------------------------------------------* -- GitLab From c587e4dfa79af18844a2772a9eb07d545e8a1d27 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 23 Sep 2025 15:46:20 +0200 Subject: [PATCH 104/147] clang-format --- lib_rend/lib_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index c917353459..31efac60e4 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -7961,7 +7961,7 @@ ivas_error IVAS_REND_GetSplitBinauralBitstream( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, #endif - (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), + ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, -- GitLab From e7e90bc604f4e7b1f8664f5d4d270d09b3ebc0a2 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 23 Sep 2025 16:49:34 +0200 Subject: [PATCH 105/147] add test for comparing flt and fx ambi_converter for BE --- .../test_be_ambi_converter_fixed_to_float.py | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 tests/test_be_ambi_converter_fixed_to_float.py diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py new file mode 100644 index 0000000000..238a9ed695 --- /dev/null +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -0,0 +1,99 @@ +import pytest +import subprocess +import sys +from enum import Enum +from pathlib import Path +from tempfile import TemporaryDirectory + +HERE = Path(__file__).absolute().parent +TESTV_DIR = HERE.parent / "scripts/testv" + +sys.path.append(str(HERE.parent / "scripts")) +from pyaudio3dtools import audiofile, audioarray + + +class AMBI_CONVENTION(int, Enum): + ACN_SN3D = 0 + ACN_N3D = 1 + FUMA_MAXN = 2 + FUMA_FUMA = 3 + SID_SN3D = 4 + SID_N3D = 5 + + +def run_ambi_converter( + bin_path: Path, + infile: Path, + outfile: str, + convention_in: AMBI_CONVENTION, + convention_out: AMBI_CONVENTION, +): + cmd = [ + str(bin_path), + str(infile), + outfile, + f"{int(convention_in)}", + f"{int(convention_out)}", + ] + + p = subprocess.run(cmd, capture_output=True) + if p.returncode != 0: + pytest.fail( + f"Ambisonics converter run failed: {p.stdout.decode('utf8') + p.stderr.decode('utf8')}" + ) + + +INPUT_FILES = [TESTV_DIR / "stv3OA48c.wav"] +CONVENTIONS = [c.value for c in AMBI_CONVENTION] +AMBI_CONVERTER_PATH_FLOAT = HERE.parent / "ambi_converter_flt" +AMBI_CONVERTER_PATH_FIXED = HERE.parent / "ambi_converter_fx" + + +@pytest.mark.parametrize("infile", INPUT_FILES) +@pytest.mark.parametrize("convention_out", CONVENTIONS) +@pytest.mark.parametrize("convention_in", CONVENTIONS) +def test_ambi_converter( + infile: Path, + convention_in: AMBI_CONVENTION, + convention_out: AMBI_CONVENTION, + # needs to be passed to correctly report errors + test_info, +): + if ( + convention_out != AMBI_CONVENTION.ACN_SN3D + and convention_in != AMBI_CONVENTION.ACN_SN3D + ): + pytest.skip("One of in and out convention needs to be ACN_SN3D") + + with TemporaryDirectory() as tmp_dir: + outfile_base = Path(tmp_dir) / ( + infile.stem + f"-{str(convention_in)}-to-{str(convention_out)}" + ) + + outfile_flt = str(outfile_base) + "-flt.wav" + outfile_fx = str(outfile_base) + "-fx.wav" + + run_ambi_converter( + AMBI_CONVERTER_PATH_FLOAT, + infile, + outfile_flt, + convention_in, + convention_out, + ) + + run_ambi_converter( + AMBI_CONVERTER_PATH_FIXED, + infile, + outfile_fx, + convention_in, + convention_out, + ) + + s_flt, _ = audiofile.readfile(outfile_flt) + s_fx, _ = audiofile.readfile(outfile_fx) + + cmp_result = audioarray.compare(s_flt, s_fx, fs=48000, per_frame=False) + if not cmp_result["bitexact"]: + pytest.fail( + f"Difference between float and fixed ambi_converter output found! Max abs diff: {cmp_result['max_abs_diff']}" + ) -- GitLab From 3b669c894593b720d80ef4aaeb90a8951093d7f4 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 24 Sep 2025 08:58:15 +0200 Subject: [PATCH 106/147] introduce dummy threshold and use xfail instead of skip --- tests/test_be_ambi_converter_fixed_to_float.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py index 238a9ed695..0ff1499809 100644 --- a/tests/test_be_ambi_converter_fixed_to_float.py +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -47,6 +47,7 @@ INPUT_FILES = [TESTV_DIR / "stv3OA48c.wav"] CONVENTIONS = [c.value for c in AMBI_CONVENTION] AMBI_CONVERTER_PATH_FLOAT = HERE.parent / "ambi_converter_flt" AMBI_CONVERTER_PATH_FIXED = HERE.parent / "ambi_converter_fx" +THRESHOLD_FAIL = 2 @pytest.mark.parametrize("infile", INPUT_FILES) @@ -63,7 +64,7 @@ def test_ambi_converter( convention_out != AMBI_CONVENTION.ACN_SN3D and convention_in != AMBI_CONVENTION.ACN_SN3D ): - pytest.skip("One of in and out convention needs to be ACN_SN3D") + pytest.xfail("One of in and out convention needs to be ACN_SN3D") with TemporaryDirectory() as tmp_dir: outfile_base = Path(tmp_dir) / ( @@ -93,7 +94,7 @@ def test_ambi_converter( s_fx, _ = audiofile.readfile(outfile_fx) cmp_result = audioarray.compare(s_flt, s_fx, fs=48000, per_frame=False) - if not cmp_result["bitexact"]: + if abs(cmp_result["max_abs_diff"]) > THRESHOLD_FAIL: pytest.fail( f"Difference between float and fixed ambi_converter output found! Max abs diff: {cmp_result['max_abs_diff']}" ) -- GitLab From 6787be9c192062160e248a5a49c688d0862091ef Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 24 Sep 2025 10:36:16 +0200 Subject: [PATCH 107/147] remove strip_split_rendering.{py,sh} --- scripts/strip_split_rendering.py | 34 -------------------------------- scripts/strip_split_rendering.sh | 33 ------------------------------- 2 files changed, 67 deletions(-) delete mode 100644 scripts/strip_split_rendering.py delete mode 100755 scripts/strip_split_rendering.sh diff --git a/scripts/strip_split_rendering.py b/scripts/strip_split_rendering.py deleted file mode 100644 index 40da43bbcb..0000000000 --- a/scripts/strip_split_rendering.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 - -# -# (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, -# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., -# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, -# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other -# contributors to this repository. All Rights Reserved. -# -# This software is protected by copyright law and by international treaties. -# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, -# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., -# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, -# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other -# contributors to this repository retain full ownership rights in their respective contributions in -# the software. This notice grants no license of any kind, including but not limited to patent -# license, nor is any license granted by implication, estoppel or otherwise. -# -# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making -# contributions. -# -# This software is provided "AS IS", without any express or implied warranties. The software is in the -# development stage. It is intended exclusively for experts who have experience with such software and -# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability -# and fitness for a particular purpose are hereby disclaimed and excluded. -# -# Any dispute, controversy or claim arising under or in relation to providing this software shall be -# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in -# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and -# the United Nations Convention on Contracts on the International Sales of Goods. -# - -import glob -import os diff --git a/scripts/strip_split_rendering.sh b/scripts/strip_split_rendering.sh deleted file mode 100755 index f663b72243..0000000000 --- a/scripts/strip_split_rendering.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# -# (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, -# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., -# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, -# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other -# contributors to this repository. All Rights Reserved. -# -# This software is protected by copyright law and by international treaties. -# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, -# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., -# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, -# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other -# contributors to this repository retain full ownership rights in their respective contributions in -# the software. This notice grants no license of any kind, including but not limited to patent -# license, nor is any license granted by implication, estoppel or otherwise. -# -# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making -# contributions. -# -# This software is provided "AS IS", without any express or implied warranties. The software is in the -# development stage. It is intended exclusively for experts who have experience with such software and -# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability -# and fitness for a particular purpose are hereby disclaimed and excluded. -# -# Any dispute, controversy or claim arising under or in relation to providing this software shall be -# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in -# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and -# the United Nations Convention on Contracts on the International Sales of Goods. -# - -OUTDIR=$1 -- GitLab From e3e65b3d99ae4d08dbd7559ce5654219796a2c3f Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 24 Sep 2025 11:38:05 +0200 Subject: [PATCH 108/147] Remove unused code under DEBUGGING --- lib_com/ivas_prot.h | 14 -- lib_dec/ivas_binRenderer_internal.c | 305 ---------------------------- lib_dec/ivas_jbm_dec.c | 6 - 3 files changed, 325 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b702dc027f..eb75ab124d 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5161,20 +5161,6 @@ ivas_error ivas_allocate_binaural_hrtf( const int16_t allocate_init_flag /* i : Memory allocation flag */ ); -#ifdef DEBUGGING -void ivas_binaural_cldfb( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -); - -void ivas_binaural_cldfb_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t n_samples_to_render, /* i : output frame length per channel */ - const int16_t slot_size, /* i : JBM slot size */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -); -#endif - void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, /* i/o: pose correction data handle */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 840b75e46f..13282efdd8 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1285,311 +1285,6 @@ void ivas_binaural_add_LFE( } -#ifdef DEBUGGING -/*-------------------------------------------------------------------------* - * ivas_binaural_cldfb() - * - * Perform CLDFB analysis, fastconv binaural rendering and CLDFB synthesis - *-------------------------------------------------------------------------*/ - -void ivas_binaural_cldfb( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -) -{ - float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *re, *im; -#endif - int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch; - - /* Implement a 5 msec loops */ - maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); - - for ( subframeIdx = 0; subframeIdx < ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); subframeIdx++ ) - { - for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) - { - index_slot = subframeIdx * MAX_PARAM_SPATIAL_SUBFRAMES + slot_idx; - - /* Implement CLDFB analysis */ - idx_in = 0; - idx_lfe = 0; - - for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) - { - if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[idx_lfe] == ch ) ) - { - if ( idx_lfe < ( st_ivas->hIntSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else - { - cldfbAnalysis_ts( &( output_f[ch][maxBand * index_slot] ), Cldfb_RealBuffer[idx_in][slot_idx], Cldfb_ImagBuffer[idx_in][slot_idx], maxBand, st_ivas->cldfbAnaDec[idx_in] ); - idx_in++; - } - } - /*LFE handling for split rendering cases*/ - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) - { - for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) - { - ch = st_ivas->hIntSetup.index_lfe[idx_lfe]; - cldfbAnalysis_ts( &( output_f[ch][maxBand * index_slot] ), Cldfb_RealBuffer[idx_in][slot_idx], Cldfb_ImagBuffer[idx_in][slot_idx], maxBand, st_ivas->cldfbAnaDec[idx_in] ); - idx_in++; - } - - if ( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) - { - for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) - { - mvr2r( Cldfb_RealBuffer[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_RealBuffer[ch][( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx], maxBand ); - mvr2r( Cldfb_ImagBuffer[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_ImagBuffer[ch][( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx], maxBand ); - } - st_ivas->hSplitBinRend->hCldfbDataOut->config = st_ivas->hIntSetup.output_config; - } - } - } - - /* Implement binaural rendering */ - ivas_binRenderer( - st_ivas->hBinRenderer, - &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, - st_ivas->hCombinedOrientationData, - JBM_CLDFB_SLOTS_IN_SUBFRAME, -#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG - NULL, -#endif - Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, - Cldfb_RealBuffer, Cldfb_ImagBuffer ); - - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) - { - int16_t pos_idx; - for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) - { - if ( st_ivas->hIntSetup.num_lfe > 0 ) - { - v_multc( Cldfb_RealBuffer[st_ivas->hIntSetup.nchan_out_woLFE][slot_idx], GAIN_LFE, Cldfb_RealBuffer[st_ivas->hIntSetup.nchan_out_woLFE][slot_idx], maxBand ); - v_multc( Cldfb_ImagBuffer[st_ivas->hIntSetup.nchan_out_woLFE][slot_idx], GAIN_LFE, Cldfb_ImagBuffer[st_ivas->hIntSetup.nchan_out_woLFE][slot_idx], maxBand ); - } - } - - for ( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) - { - for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) - { - for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) - { - if ( st_ivas->hIntSetup.num_lfe > 0 ) - { - v_add( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], - Cldfb_RealBuffer[st_ivas->hIntSetup.nchan_out_woLFE][slot_idx], - Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], - maxBand ); - - v_add( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], - Cldfb_ImagBuffer[st_ivas->hIntSetup.nchan_out_woLFE][slot_idx], - Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], - maxBand ); - } - -#ifdef FIX_1119_SPLIT_RENDERING_VOIP - ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[( pos_idx * BINAURAL_CHANNELS ) + ch], &re, &im, ( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx ); - mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], re, maxBand ); - mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], im, maxBand ); -#else - mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx], maxBand ); - mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][( subframeIdx * JBM_CLDFB_SLOTS_IN_SUBFRAME ) + slot_idx], maxBand ); -#endif - } - } - } - } - - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, maxBand * MAX_PARAM_SPATIAL_SUBFRAMES ); - - /* Implement CLDFB synthesis */ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - - index_slot = subframeIdx * MAX_PARAM_SPATIAL_SUBFRAMES; - - for ( slot_idx = 0; slot_idx < MAX_PARAM_SPATIAL_SUBFRAMES; slot_idx++ ) - { - RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[0][ch][slot_idx]; - ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[0][ch][slot_idx]; - } - - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * maxBand] ), maxBand * MAX_PARAM_SPATIAL_SUBFRAMES, st_ivas->cldfbSynDec[ch] ); - } - } - - return; -} - - -/*-------------------------------------------------------------------------* - * ivas_binaural_cldfb_sf() - * - * Perform CLDFB analysis, fastconv binaural rendering and CLDFB synthesis - *-------------------------------------------------------------------------*/ - -void ivas_binaural_cldfb_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t n_samples_to_render, /* i : output frame length per channel */ - const int16_t slot_size, /* i : JBM slot size */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -) -{ - float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#ifdef FIX_1119_SPLIT_RENDERING_VOIP - float *re, *im; -#endif - int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch; - int16_t slots_to_render, first_sf, last_sf; - int16_t slot_index_start, slot_index_start_cldfb; - - /* Implement a 5 msec loops */ - maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); - - /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); - first_sf = st_ivas->hTcBuffer->subframes_rendered; - last_sf = first_sf; - slot_index_start = st_ivas->hTcBuffer->slots_rendered; - slot_index_start_cldfb = 0; - st_ivas->hTcBuffer->slots_rendered += slots_to_render; - - while ( slots_to_render > 0 ) - { - slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; - last_sf++; - } - for ( subframeIdx = first_sf; subframeIdx < last_sf; subframeIdx++ ) - { - for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) - { - index_slot = slot_index_start + slot_idx; - - /* Implement CLDFB analysis */ - idx_in = 0; - idx_lfe = 0; - - for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) - { - if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[idx_lfe] == ch ) ) - { - if ( idx_lfe < ( st_ivas->hIntSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else - { - cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][maxBand * index_slot] ), Cldfb_RealBuffer[idx_in][slot_idx], Cldfb_ImagBuffer[idx_in][slot_idx], maxBand, st_ivas->cldfbAnaDec[idx_in] ); - idx_in++; - } - } - - /*LFE handling for split rendering cases*/ - if ( ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || - ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) - { - for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) - { - ch = st_ivas->hIntSetup.index_lfe[idx_lfe]; - cldfbAnalysis_ts( &( output_f[ch][maxBand * index_slot] ), Cldfb_RealBuffer[idx_in][slot_idx], Cldfb_ImagBuffer[idx_in][slot_idx], maxBand, st_ivas->cldfbAnaDec[idx_in] ); - idx_in++; - } - - if ( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) - { - for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) - { - mvr2r( Cldfb_RealBuffer[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_RealBuffer[ch][slot_index_start + slot_idx], maxBand ); - mvr2r( Cldfb_ImagBuffer[ch][slot_idx], st_ivas->hSplitBinRend->hCldfbDataOut->Cldfb_ImagBuffer[ch][slot_index_start + slot_idx], maxBand ); - } - st_ivas->hSplitBinRend->hCldfbDataOut->config = st_ivas->hIntSetup.output_config; - } - } - } - - /* Implement binaural rendering */ - ivas_binRenderer( - st_ivas->hBinRenderer, - &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, - st_ivas->hCombinedOrientationData, - st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], -#ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG - NULL, -#endif - Cldfb_RealBuffer_Binaural, - Cldfb_ImagBuffer_Binaural, - Cldfb_RealBuffer, - Cldfb_ImagBuffer ); - - if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) - { - int16_t pos_idx; - for ( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) - { - for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) - { - for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) - { -#ifdef FIX_1119_SPLIT_RENDERING_VOIP - ivas_CLDFB_RINGBUF_GetByIdx( st_ivas->hSplitBinRend->hMultiBinCldfbData[( pos_idx * BINAURAL_CHANNELS ) + ch], &re, &im, slot_index_start + slot_idx ); - mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], re, maxBand ); - mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], im, maxBand ); -#else - mvr2r( Cldfb_RealBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); - mvr2r( Cldfb_ImagBuffer_Binaural[pos_idx][ch][slot_idx], st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[( pos_idx * BINAURAL_CHANNELS ) + ch][slot_index_start + slot_idx], maxBand ); -#endif - } - } - } - } - - /* update combined orientation access index */ - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ); - - /* Implement CLDFB synthesis */ - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - - for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) - { - RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[0][ch][slot_idx]; - ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[0][ch][slot_idx]; - } - - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_index_start_cldfb * maxBand] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] ); - } - slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; - slot_index_start_cldfb += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; - } - - st_ivas->hTcBuffer->subframes_rendered = last_sf; - - return; -} -#endif - - /*------------------------------------------------------------------------- * ivas_binRenderer() * diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 5b8668c6d3..ef3b4d18e5 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1013,12 +1013,6 @@ ivas_error ivas_jbm_dec_render( return error; } } -#ifdef DEBUGGING - else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - ivas_binaural_cldfb_sf( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->nb_subframes, p_output ); - } -#endif } } else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) -- GitLab From 03c4146bace790ab9443a3b690fac906d067fb7d Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 24 Sep 2025 12:45:53 +0200 Subject: [PATCH 109/147] Add ambi_converter to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 20c6aa6fdc..9097b50575 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ IVAS_cod IVAS_dec IVAS_rend ISAR_post_rend +ambi_converter obj/ *.a *.o @@ -18,6 +19,7 @@ IVAS_cod.exe IVAS_dec.exe IVAS_rend.exe ISAR_post_rend.exe +ambi_converter.exe *.user .vs/ Debug_*/ -- GitLab From 0d4d4c22a699aec34b181fc79e30647c43b5df73 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 24 Sep 2025 12:46:05 +0200 Subject: [PATCH 110/147] Remove obsolete debugging option -force in IVAS_dec --- apps/decoder.c | 61 ------------------------------------ lib_dec/ivas_init_dec.c | 13 -------- lib_dec/ivas_output_config.c | 17 ---------- lib_dec/ivas_stat_dec.h | 4 --- lib_dec/lib_dec.c | 59 ---------------------------------- lib_dec/lib_dec.h | 16 ---------- 6 files changed, 170 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 41089d057e..58ac33889b 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -127,7 +127,6 @@ typedef struct bool tsmEnabled; IVAS_RENDER_FRAMESIZE renderFramesize; #ifdef DEBUGGING - IVAS_DEC_FORCED_REND_MODE forcedRendMode; #ifdef DEBUG_FOA_AGC FILE *agcBitstream; /* temporary */ #endif @@ -180,7 +179,6 @@ static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); static int16_t app_own_random( int16_t *seed ); -static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar ); #endif static void do_object_editing( IVAS_EDITABLE_PARAMETERS *editableParameters, ObjectEditFileReader *objectEditFileReader ); @@ -537,28 +535,6 @@ int main( #endif } - /*------------------------------------------------------------------------------------------* - * Binaural rendering mode: set and print info - *------------------------------------------------------------------------------------------*/ - - if ( arg.forcedRendMode != IVAS_DEC_FORCE_REND_UNFORCED ) - { - if ( ( error = IVAS_DEC_SetForcedRendMode( hIvasDec, arg.forcedRendMode ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError: Forcing binaural rendering mode failed (only TDREND and CLDFBREND are expected).\n\n" ); - goto cleanup; - } - - if ( arg.forcedRendMode == IVAS_DEC_FORCE_REND_TD_RENDERER ) - { - fprintf( stdout, "Forcing rendering to: TD renderer\n" ); - } - else if ( arg.forcedRendMode == IVAS_DEC_FORCE_REND_CLDFB_RENDERER ) - { - fprintf( stdout, "Forcing rendering to: CLDFB renderer\n" ); - } - } - /*-----------------------------------------------------------------* * Open Error pattern file for simulation *-----------------------------------------------------------------*/ @@ -965,7 +941,6 @@ static bool parseCmdlIVAS_dec( #ifdef DEBUGGING float ftmp; - arg->forcedRendMode = IVAS_DEC_FORCE_REND_UNFORCED; #ifdef DEBUG_FOA_AGC arg->agcBitstream = NULL; #endif @@ -1135,17 +1110,6 @@ static bool parseCmdlIVAS_dec( } i += 2; } - else if ( strcmp( argv_to_upper, "-FORCE" ) == 0 ) - { - i++; - if ( i < argc - 3 ) - { - strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); - argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; - arg->forcedRendMode = parseForcedRendModeDec( argv_to_upper ); - i++; - } - } #ifdef DEBUG_MODE_INFO #ifdef DEBUG_MODE_INFO_TWEAK /* Define additional subfolder for debug info output in ./res */ @@ -3900,31 +3864,6 @@ static void do_object_editing( } -#ifdef DEBUGGING - -/*---------------------------------------------------------------------* - * parseForcedRendModeDec() - * - * - *---------------------------------------------------------------------*/ - -static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( - char *forcedRendModeChar ) -{ - if ( ( strcmp( to_upper( forcedRendModeChar ), "TDREND" ) == 0 ) ) - { - return IVAS_DEC_FORCE_REND_TD_RENDERER; - } - if ( ( strcmp( to_upper( forcedRendModeChar ), "CLDFBREND" ) == 0 ) ) - { - return IVAS_DEC_FORCE_REND_CLDFB_RENDERER; - } - - return IVAS_DEC_FORCE_REND_UNDEFINED; -} -#endif - - /*---------------------------------------------------------------------* * load_hrtf_from_file() * diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 89416ab404..507a387e6e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1161,8 +1161,6 @@ ivas_error ivas_init_decoder_front( #ifdef DEBUGGING st_ivas->noClipping = 0; - - st_ivas->hDecoderConfig->force_rend = -1; #endif /*-------------------------------------------------------------------* * Allocate and initialize Custom loudspeaker layout handle @@ -3203,17 +3201,6 @@ static ivas_error doSanityChecks_IVAS( { return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_AND_PANNING_NOT_SUPPORTED, "Wrong set-up: Only object editing or Non-diegetic panning can be used." ); } -#ifdef DEBUGGING - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != IVAS_AUDIO_CONFIG_BINAURAL && output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" ); - } - - if ( ( st_ivas->hHrtfTD != NULL && st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_FORCE_MODE, "Incorrect debug configuration: Cannot force CLDFB renderer in combination with TD renderer HRTF file" ); - } -#endif return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 9d2e7734de..17ce37c4d4 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -95,21 +95,8 @@ void ivas_renderer_select( { if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { -#ifdef DEBUGGING - if ( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) - { - *renderer_type = RENDERER_BINAURAL_FASTCONV; - *internal_config = IVAS_AUDIO_CONFIG_HOA3; /* Render ISM to HOA3 before binauralization*/ - } - else - { - *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; - *internal_config = output_config; - } -#else *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; *internal_config = output_config; -#endif } else { @@ -198,11 +185,7 @@ void ivas_renderer_select( if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) { -#ifdef DEBUGGING - if ( ( ( ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1 || st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && st_ivas->mc_mode == MC_MODE_MCT && st_ivas->hDecoderConfig->force_rend != FORCE_CLDFB_RENDERER ) -#else if ( ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1 || st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->mc_mode == MC_MODE_MCT ) -#endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 0831079213..792c87ddc4 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1024,10 +1024,6 @@ typedef struct decoder_config_structure int16_t Opt_dpid_on; /* indicates whether Directivity pattern option is used */ int16_t Opt_aeid_on; /* indicates whether Acoustic environment option is used */ int16_t Opt_ObjEdit_on; /* indicates whether object editing option is used */ -#ifdef DEBUGGING - /* temp. development parameters */ - int16_t force_rend; /* forced TD/CLDFB binaural renderer (for ISM and MC) */ -#endif int16_t Opt_tsm; /* indicates whether time scaling modification is activated */ IVAS_RENDER_FRAMESIZE render_framesize; int16_t Opt_delay_comp; /* flag indicating delay compensation active */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0f54199425..a77c8f4edd 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4803,65 +4803,6 @@ int32_t IVAS_DEC_GetCntFramesLimited( } } - -/*---------------------------------------------------------------------* - * forcedRendModeApiToInternalDec() - * - * - *---------------------------------------------------------------------*/ - -static ivas_error forcedRendModeApiToInternalDec( - const IVAS_DEC_FORCED_REND_MODE forcedRendMode, - int16_t *forcedModeInternal ) -{ - switch ( forcedRendMode ) - { - case IVAS_DEC_FORCE_REND_TD_RENDERER: - *forcedModeInternal = FORCE_TD_RENDERER; - break; - case IVAS_DEC_FORCE_REND_CLDFB_RENDERER: - *forcedModeInternal = FORCE_CLDFB_RENDERER; - break; - case IVAS_DEC_FORCE_REND_UNFORCED: - *forcedModeInternal = -1; - break; - default: - return IVAS_ERR_INVALID_FORCE_MODE; - break; - } - - return IVAS_ERR_OK; -} - - -/*---------------------------------------------------------------------* - * IVAS_DEC_SetForcedRendMode() - * - * - *---------------------------------------------------------------------*/ - -ivas_error IVAS_DEC_SetForcedRendMode( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_DEC_FORCED_REND_MODE forcedRendMode /* i : forced renderer mode */ -) -{ - int16_t newForcedRend; - ivas_error error; - - if ( ( error = forcedRendModeApiToInternalDec( forcedRendMode, &newForcedRend ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( hIvasDec->st_ivas->hDecoderConfig->force_rend != newForcedRend ) - { - hIvasDec->st_ivas->hDecoderConfig->force_rend = newForcedRend; - } - - return IVAS_ERR_OK; -} - - #ifdef DEBUG_SBA_AUDIO_DUMP /*---------------------------------------------------------------------* * IVAS_DEC_GetSbaDebugParams( ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 18298954c4..da33ffca3c 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -64,16 +64,6 @@ typedef enum _IVAS_DEC_COMPLEXITY_LEVEL } IVAS_DEC_COMPLEXITY_LEVEL; -#ifdef DEBUGGING -typedef enum _IVAS_DEC_FORCED_REND_MODE -{ - IVAS_DEC_FORCE_REND_CLDFB_RENDERER, - IVAS_DEC_FORCE_REND_TD_RENDERER, - IVAS_DEC_FORCE_REND_UNFORCED, - IVAS_DEC_FORCE_REND_UNDEFINED = 0xffff -} IVAS_DEC_FORCED_REND_MODE; -#endif - typedef enum _IVAS_DEC_PCM_TYPE { IVAS_DEC_PCM_INT16, @@ -406,12 +396,6 @@ int32_t IVAS_DEC_GetCntFramesLimited( IVAS_DEC_HANDLE hIvasDec /* i : IVAS decoder handle */ ); -/*! r: error code */ -ivas_error IVAS_DEC_SetForcedRendMode( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const IVAS_DEC_FORCED_REND_MODE forcedRendMode /* i : forced renderer mode */ -); - #ifdef DEBUG_SBA_AUDIO_DUMP ivas_error IVAS_DEC_GetSbaDebugParams( const IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -- GitLab From 60a57723d8a0c2f5d4b7faa0014dc6a7cfab275c Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 24 Sep 2025 13:24:48 +0200 Subject: [PATCH 111/147] Apply formatting patch --- lib_dec/ivas_stat_dec.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 792c87ddc4..f1efb32a10 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1024,7 +1024,7 @@ typedef struct decoder_config_structure int16_t Opt_dpid_on; /* indicates whether Directivity pattern option is used */ int16_t Opt_aeid_on; /* indicates whether Acoustic environment option is used */ int16_t Opt_ObjEdit_on; /* indicates whether object editing option is used */ - int16_t Opt_tsm; /* indicates whether time scaling modification is activated */ + int16_t Opt_tsm; /* indicates whether time scaling modification is activated */ IVAS_RENDER_FRAMESIZE render_framesize; int16_t Opt_delay_comp; /* flag indicating delay compensation active */ -- GitLab From 22938cb097426f2170ac974ae4cc0bafc215d502 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 24 Sep 2025 14:07:08 +0200 Subject: [PATCH 112/147] implement keep_files arg and add printout of command --- tests/test_be_ambi_converter_fixed_to_float.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py index 0ff1499809..264b5565de 100644 --- a/tests/test_be_ambi_converter_fixed_to_float.py +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -7,6 +7,7 @@ from tempfile import TemporaryDirectory HERE = Path(__file__).absolute().parent TESTV_DIR = HERE.parent / "scripts/testv" +OUTPUT_FOLDER_IF_KEEP_FILES = HERE.joinpath("output-ambi_converter-be") sys.path.append(str(HERE.parent / "scripts")) from pyaudio3dtools import audiofile, audioarray @@ -35,12 +36,12 @@ def run_ambi_converter( f"{int(convention_in)}", f"{int(convention_out)}", ] + print(" ".join(cmd)) p = subprocess.run(cmd, capture_output=True) if p.returncode != 0: - pytest.fail( - f"Ambisonics converter run failed: {p.stdout.decode('utf8') + p.stderr.decode('utf8')}" - ) + msg = f"{p.stdout.decode('utf8')}\n{p.stderr.decode('utf8')}" + pytest.fail(f"Ambisonics converter run failed:\n{msg}") INPUT_FILES = [TESTV_DIR / "stv3OA48c.wav"] @@ -57,6 +58,7 @@ def test_ambi_converter( infile: Path, convention_in: AMBI_CONVENTION, convention_out: AMBI_CONVENTION, + keep_files, # needs to be passed to correctly report errors test_info, ): @@ -66,8 +68,13 @@ def test_ambi_converter( ): pytest.xfail("One of in and out convention needs to be ACN_SN3D") + if keep_files: + OUTPUT_FOLDER_IF_KEEP_FILES.mkdir(exist_ok=True, parents=True) + with TemporaryDirectory() as tmp_dir: - outfile_base = Path(tmp_dir) / ( + output_dir = OUTPUT_FOLDER_IF_KEEP_FILES if keep_files else tmp_dir + + outfile_base = Path(output_dir) / ( infile.stem + f"-{str(convention_in)}-to-{str(convention_out)}" ) -- GitLab From fa7a741a9e65585dada56e38062f162d69cc6cac Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 24 Sep 2025 14:41:04 +0200 Subject: [PATCH 113/147] improve testcase naming --- .../test_be_ambi_converter_fixed_to_float.py | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py index 264b5565de..265fd643b8 100644 --- a/tests/test_be_ambi_converter_fixed_to_float.py +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -1,5 +1,6 @@ import pytest import subprocess +import itertools import sys from enum import Enum from pathlib import Path @@ -45,15 +46,26 @@ def run_ambi_converter( INPUT_FILES = [TESTV_DIR / "stv3OA48c.wav"] -CONVENTIONS = [c.value for c in AMBI_CONVENTION] +CONVENTIONS = [c for c in AMBI_CONVENTION] AMBI_CONVERTER_PATH_FLOAT = HERE.parent / "ambi_converter_flt" AMBI_CONVERTER_PATH_FIXED = HERE.parent / "ambi_converter_fx" THRESHOLD_FAIL = 2 - -@pytest.mark.parametrize("infile", INPUT_FILES) -@pytest.mark.parametrize("convention_out", CONVENTIONS) -@pytest.mark.parametrize("convention_in", CONVENTIONS) +CONVENTIONS_FULL_COMBI = list(itertools.product(CONVENTIONS, CONVENTIONS)) +CONVENTIONS_TEST_PARAMS = [ + (c_in.value, c_out.value) for c_in, c_out in CONVENTIONS_FULL_COMBI +] +CONVENTIONS_TEST_PARAMS_IDS = [ + f"{c_in.name}-to-{c_out.name}" for c_in, c_out in CONVENTIONS_FULL_COMBI +] + + +@pytest.mark.parametrize("infile", INPUT_FILES, ids=[p.name for p in INPUT_FILES]) +@pytest.mark.parametrize( + "convention_in,convention_out", + CONVENTIONS_TEST_PARAMS, + ids=CONVENTIONS_TEST_PARAMS_IDS, +) def test_ambi_converter( infile: Path, convention_in: AMBI_CONVENTION, -- GitLab From 476debe59d8b8e336a2a7b8de40710ae1b85b0d5 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 24 Sep 2025 15:31:06 +0200 Subject: [PATCH 114/147] switch to other input files for ambi_converter test - use the spectral_test items now --- tests/test_be_ambi_converter_fixed_to_float.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py index 265fd643b8..8fdd81e3cc 100644 --- a/tests/test_be_ambi_converter_fixed_to_float.py +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -45,7 +45,9 @@ def run_ambi_converter( pytest.fail(f"Ambisonics converter run failed:\n{msg}") -INPUT_FILES = [TESTV_DIR / "stv3OA48c.wav"] +# test all ambisonics orders from 1 to 3 +INPUT_CH_NUM = [4, 9, 16] +INPUT_FILES = [TESTV_DIR / f"spectral_test_{ch}ch_48kHz.wav" for ch in INPUT_CH_NUM] CONVENTIONS = [c for c in AMBI_CONVENTION] AMBI_CONVERTER_PATH_FLOAT = HERE.parent / "ambi_converter_flt" AMBI_CONVERTER_PATH_FIXED = HERE.parent / "ambi_converter_fx" -- GitLab From c854546d9c44888cacf1f3dc8cc080549ddd05ce Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 25 Sep 2025 12:58:59 +0200 Subject: [PATCH 115/147] issue 1386: fix use-of-uninitialized value in ivas_spar_dec_open(); under FIX_1384_MSAN_ivas_spar_dec_open --- lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..03820b55cb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,7 @@ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ +#define FIX_1384_MSAN_ivas_spar_dec_open /* VA: issue 1386: fix use-of-uninitialized value in ivas_spar_dec_open() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 89416ab404..b5b13dcaf4 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1154,6 +1154,9 @@ ivas_error ivas_init_decoder_front( st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; +#ifdef FIX_1384_MSAN_ivas_spar_dec_open + st_ivas->sid_format = -1; +#endif st_ivas->sba_dirac_stereo_flag = 0; /* HRTF binauralization latency in ns */ -- GitLab From c7a29ef04ca97e9820daefd584346219dfd61134 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 25 Sep 2025 13:59:10 +0200 Subject: [PATCH 116/147] introduce define SID_FORMAT_NONE --- lib_com/ivas_cnst.h | 3 +++ lib_dec/ivas_init_dec.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 6163953764..ff0e1972fe 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -229,6 +229,9 @@ typedef enum /* format signaling in SID frames */ #define SID_FORMAT_NBITS 3 /* Bit 0 | Bit 1 | Bit 2 */ /*-------|-------|------ */ +#ifdef FIX_1384_MSAN_ivas_spar_dec_open +#define SID_FORMAT_NONE (-0x1) /* n/a| n/a| n/a*/ +#endif #define SID_DFT_STEREO 0x0 /* 0| 0| 0 */ #define SID_MDCT_STEREO 0x1 /* 1| 0| 0 */ #define SID_ISM 0x2 /* 0| 1| 0 */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b5b13dcaf4..04b1668bbb 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1155,7 +1155,7 @@ ivas_error ivas_init_decoder_front( st_ivas->mc_mode = MC_MODE_NONE; #ifdef FIX_1384_MSAN_ivas_spar_dec_open - st_ivas->sid_format = -1; + st_ivas->sid_format = SID_FORMAT_NONE; #endif st_ivas->sba_dirac_stereo_flag = 0; -- GitLab From 80f5e00d594d452d3e4583d4e33df442d97149ce Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 26 Sep 2025 13:38:35 +0200 Subject: [PATCH 117/147] The ambi_converter application is reading the correct amount of samples now. --- apps/ambi_converter.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index affd3cf5a8..d4fa974d81 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -78,7 +78,7 @@ int main( int argc, char *argv[] ) printf( "Ambisonics converter program\n" ); printf( "----------------------------------------------------------------------------------\n" ); printf( "Usage:\n" ); - printf( "./ambi_conveter input_file output_file input_convention output_convention\n" ); + printf( "./ambi_converter input_file output_file input_convention output_convention\n" ); printf( "\n" ); printf( "input_convention and output convention must be an integer number in [0,5]\n" ); printf( "the following conventions are supported:\n" ); @@ -117,6 +117,7 @@ int main( int argc, char *argv[] ) order = (int16_t) sqrtf( numChannels ) - 1; assert( order > 0 && order <= 3 ); + samples = L_FRAME48k * numChannels; while ( ReadWavShort( wavFile_in, samples, numSamples, &numSamplesRead32 ) == __TWI_SUCCESS ) { int32_t err = 0; @@ -126,7 +127,7 @@ int main( int argc, char *argv[] ) break; } - for ( uint16_t i = 0; i < numSamplesRead32; i++ ) + for ( uint16_t i = 0; i < numSamplesRead32 / numChannels; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { @@ -141,7 +142,7 @@ int main( int argc, char *argv[] ) } - for ( uint16_t i = 0; i < numSamplesRead32; i++ ) + for ( uint16_t i = 0; i < numSamplesRead32 / numChannels; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { -- GitLab From b83ac90a4e341ce0d7476997c29791b0ee82217d Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 26 Sep 2025 14:03:37 +0200 Subject: [PATCH 118/147] removed a warning where a 32 bit value was compared against a 16 bit value in main() of the ambi_converter.c application. --- apps/ambi_converter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index d4fa974d81..40091f613b 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -127,7 +127,7 @@ int main( int argc, char *argv[] ) break; } - for ( uint16_t i = 0; i < numSamplesRead32 / numChannels; i++ ) + for ( uint16_t i = 0; i < (uint16_t)numSamplesRead32 / numChannels; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { @@ -142,7 +142,7 @@ int main( int argc, char *argv[] ) } - for ( uint16_t i = 0; i < numSamplesRead32 / numChannels; i++ ) + for ( uint16_t i = 0; i < (uint16_t)numSamplesRead32 / numChannels; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { -- GitLab From f1134c0c8180b8f1b55ce880bc1b3b57ebf80e83 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 26 Sep 2025 14:09:35 +0200 Subject: [PATCH 119/147] typo in main() of ambi_converter.c --- apps/ambi_converter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index 40091f613b..fd7cd249ab 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -117,7 +117,7 @@ int main( int argc, char *argv[] ) order = (int16_t) sqrtf( numChannels ) - 1; assert( order > 0 && order <= 3 ); - samples = L_FRAME48k * numChannels; + numSamples = L_FRAME48k * numChannels; while ( ReadWavShort( wavFile_in, samples, numSamples, &numSamplesRead32 ) == __TWI_SUCCESS ) { int32_t err = 0; -- GitLab From a39f8e812cf4846210b75d84d10a703f57c44f68 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 26 Sep 2025 14:30:49 +0200 Subject: [PATCH 120/147] changed the output of the ambi_converter application. --- apps/ambi_converter.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index fd7cd249ab..1686fb2ad9 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -60,6 +60,7 @@ int main( int argc, char *argv[] ) int16_t samples[L_FRAME48k * AMBI_MAX_CHANNELS]; int16_t order = 0; int16_t numChannels; + const char *name_conventions[6]= { "ACN-SN3D", "ACN-N3D", "FuMa-MaxN", "FuMa-FuMa", "SID-SN3D", "SID-N3D" }; AMBI_FMT in_format, out_format; @@ -73,9 +74,9 @@ int main( int argc, char *argv[] ) out[j] = &samples_f_out[j * L_FRAME48k]; } + printf( "Ambisonics converter program\n" ); if ( argc != 5 ) { - printf( "Ambisonics converter program\n" ); printf( "----------------------------------------------------------------------------------\n" ); printf( "Usage:\n" ); printf( "./ambi_converter input_file output_file input_convention output_convention\n" ); @@ -97,8 +98,12 @@ int main( int argc, char *argv[] ) fileName_out = argv[2]; in_format = atoi( argv[3] ); out_format = atoi( argv[4] ); - - printf( "In %d, Out: %d\n", in_format, out_format ); + if ( in_format < 0 || out_format < 0 || in_format > 5 || out_format > 5 ) + { + printf( "input_convention and output convention must be an integer number in [0,5]\n" ); + return -1; + } + printf( "In: [%s], Out: [%s]\n",name_conventions[in_format], name_conventions[out_format] ); wavFile_in = OpenWav( fileName_in, &samplingRate, &numChannels, &samplesInFile, &bps ); if ( !wavFile_in ) -- GitLab From 0618df3da8c083a513e118c61e3136ff84067dfe Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 26 Sep 2025 14:43:58 +0200 Subject: [PATCH 121/147] applied the clang patch. --- apps/ambi_converter.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index 1686fb2ad9..673d4a63f4 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -60,7 +60,7 @@ int main( int argc, char *argv[] ) int16_t samples[L_FRAME48k * AMBI_MAX_CHANNELS]; int16_t order = 0; int16_t numChannels; - const char *name_conventions[6]= { "ACN-SN3D", "ACN-N3D", "FuMa-MaxN", "FuMa-FuMa", "SID-SN3D", "SID-N3D" }; + const char *name_conventions[6] = { "ACN-SN3D", "ACN-N3D", "FuMa-MaxN", "FuMa-FuMa", "SID-SN3D", "SID-N3D" }; AMBI_FMT in_format, out_format; @@ -103,7 +103,7 @@ int main( int argc, char *argv[] ) printf( "input_convention and output convention must be an integer number in [0,5]\n" ); return -1; } - printf( "In: [%s], Out: [%s]\n",name_conventions[in_format], name_conventions[out_format] ); + printf( "In: [%s], Out: [%s]\n", name_conventions[in_format], name_conventions[out_format] ); wavFile_in = OpenWav( fileName_in, &samplingRate, &numChannels, &samplesInFile, &bps ); if ( !wavFile_in ) @@ -132,7 +132,7 @@ int main( int argc, char *argv[] ) break; } - for ( uint16_t i = 0; i < (uint16_t)numSamplesRead32 / numChannels; i++ ) + for ( uint16_t i = 0; i < (uint16_t) numSamplesRead32 / numChannels; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { @@ -147,7 +147,7 @@ int main( int argc, char *argv[] ) } - for ( uint16_t i = 0; i < (uint16_t)numSamplesRead32 / numChannels; i++ ) + for ( uint16_t i = 0; i < (uint16_t) numSamplesRead32 / numChannels; i++ ) { for ( int16_t j = 0; j < numChannels; j++ ) { -- GitLab From 70e0a1328e3966ef04a563759f67017e46597ac1 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Sun, 28 Sep 2025 16:44:46 +0200 Subject: [PATCH 122/147] initialize pointer prm_sqQ, which might be uninitialized in case of bfi == 1 --- lib_com/options.h | 1 + lib_dec/ivas_mdct_core_dec.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..c835ce480a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,7 @@ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ +#define FIX_1387_INIT_PRM_SQQ /* FhG: initialize pointer prm_sqQ, which might be uninitialized in case of bfi == 1 */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 4e7f54eecf..eef4b37bf8 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -532,6 +532,9 @@ void ivas_mdct_core_invQ( set_s( total_nbbits, 0, CPE_CHANNELS ); set_s( bitsRead, 0, CPE_CHANNELS ); tmp_concealment_method = 0; +#ifdef FIX_1387_INIT_PRM_SQQ + prm_sqQ = NULL; /* set prm_sqQ to NULL - in case of bfi == 1 it's not set or needed, but it triggers sanitizers */ +#endif for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -- GitLab From b9c539e3d487aadaafab6f6acd3be26056778b57 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 29 Sep 2025 08:57:51 +0200 Subject: [PATCH 123/147] HRTF updates - bring float main in line with BASOP main; under FIX_HRTF_LEFTOVERS --- lib_com/options.h | 1 + lib_util/hrtf_file_reader.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..18b830f2b6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,7 @@ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ +#define FIX_HRTF_LEFTOVERS /* VA: HRTF updates - bring float main in line with BASOP main */ /* #################### End BE switches ################################## */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 66c886b7b6..0affb9401c 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -816,7 +816,11 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_r_dyn = (float *) malloc( lr_iac_len * sizeof( float ) ); hHrtfStatistics->inter_aural_coherence_dyn = (float *) malloc( lr_iac_len * sizeof( float ) ); +#ifdef FIX_HRTF_LEFTOVERS + if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL ) +#else if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL ) +#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } -- GitLab From 7f5feb6ab0b774838f68a5734c78e09907bc6412 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 29 Sep 2025 09:55:00 +0200 Subject: [PATCH 124/147] improve ambisonicsBuses init in the renderer app --- apps/renderer.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index caa1ce00d8..bf2587680a 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -2611,7 +2611,14 @@ static CmdlnArgs defaultArgs( args.outConfig.audioConfig = IVAS_AUDIO_CONFIG_INVALID; args.outConfig.outSetupCustom.num_spk = 0; args.outConfig.outSetupCustom.num_lfe = 0; +#ifdef FIX_HRTF_LEFTOVERS + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + args.inConfig.ambisonicsBuses[i].audioConfig = IVAS_AUDIO_CONFIG_INVALID; + } +#else args.inConfig.ambisonicsBuses->audioConfig = IVAS_AUDIO_CONFIG_INVALID; +#endif for ( i = 0; i < RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS; ++i ) { -- GitLab From 4438b209ae983fa169cc84e826f047db65c4b646 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 29 Sep 2025 10:49:31 +0200 Subject: [PATCH 125/147] make sure hIGFDec->infoIGFStopFreq is initialized --- lib_com/options.h | 1 + lib_dec/igf_dec.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..b0747cfe95 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,7 @@ #define FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add split rendering support to decoder in VoIP mode */ #define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */ #define FIX_1377_HANDLE_ERROR_CODE /* Eri: Add missing error code handling from IVAS_REND_SetObjectIDs */ +#define FIX_1385_INIT_IGF_STOP_FREQ /* FhG: Initialize infoIGFStopFreq in init_igf_dec() */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/igf_dec.c b/lib_dec/igf_dec.c index dac1f02787..ba7c4993fd 100755 --- a/lib_dec/igf_dec.c +++ b/lib_dec/igf_dec.c @@ -1592,6 +1592,9 @@ void init_igf_dec( hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0]; hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0]; hIGFDec->virtualSpec = &hIGFDec->virtualSpecBuf[0]; +#ifdef FIX_1385_INIT_IGF_STOP_FREQ + hIGFDec->infoIGFStopFreq = 0; +#endif return; } -- GitLab From 2f1d83406d9f9d81587204791c9a3ccf6132d01d Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 29 Sep 2025 11:00:53 +0200 Subject: [PATCH 126/147] ambi_convert() can handle samplerates other than 48k now. --- apps/ambi_converter.c | 16 +++++------ lib_util/ambi_convert.c | 64 +++++++++++++++++++++++------------------ lib_util/ambi_convert.h | 40 ++++++++++++++------------ 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index 673d4a63f4..928def1dc3 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -52,26 +52,26 @@ int main( int argc, char *argv[] ) uint32_t samplingRate; uint32_t samplesInFile; - uint32_t numSamples = L_FRAME48k; + uint32_t numSamples = AMBI_MAX_FRAME_LENGTH; uint32_t numSamplesRead32 = 0; uint32_t numSamplesClipped = 0; int16_t bps; - int16_t samples[L_FRAME48k * AMBI_MAX_CHANNELS]; + int16_t samples[AMBI_MAX_FRAME_LENGTH * AMBI_MAX_CHANNELS]; int16_t order = 0; int16_t numChannels; const char *name_conventions[6] = { "ACN-SN3D", "ACN-N3D", "FuMa-MaxN", "FuMa-FuMa", "SID-SN3D", "SID-N3D" }; AMBI_FMT in_format, out_format; - float samples_f_in[L_FRAME48k * AMBI_MAX_CHANNELS]; - float samples_f_out[L_FRAME48k * AMBI_MAX_CHANNELS]; + float samples_f_in[AMBI_MAX_FRAME_LENGTH * AMBI_MAX_CHANNELS]; + float samples_f_out[AMBI_MAX_FRAME_LENGTH * AMBI_MAX_CHANNELS]; float *in[AMBI_MAX_CHANNELS], *out[AMBI_MAX_CHANNELS]; for ( int16_t j = 0; j < AMBI_MAX_CHANNELS; j++ ) { - in[j] = &samples_f_in[j * L_FRAME48k]; - out[j] = &samples_f_out[j * L_FRAME48k]; + in[j] = &samples_f_in[j * AMBI_MAX_FRAME_LENGTH]; + out[j] = &samples_f_out[j * AMBI_MAX_FRAME_LENGTH]; } printf( "Ambisonics converter program\n" ); @@ -122,7 +122,7 @@ int main( int argc, char *argv[] ) order = (int16_t) sqrtf( numChannels ) - 1; assert( order > 0 && order <= 3 ); - numSamples = L_FRAME48k * numChannels; + numSamples = ( samplingRate * 20 * numChannels ) / 1000; /* 20ms worth of samples */ while ( ReadWavShort( wavFile_in, samples, numSamples, &numSamplesRead32 ) == __TWI_SUCCESS ) { int32_t err = 0; @@ -140,7 +140,7 @@ int main( int argc, char *argv[] ) } } - if ( ( err = convert_ambi_format( in, out, order, in_format, out_format ) ) != 0 ) + if ( ( err = convert_ambi_format( in, out, order, in_format, out_format, numSamples / numChannels ) ) != 0 ) { printf( "Error converting the input signal!\n" ); return err; diff --git a/lib_util/ambi_convert.c b/lib_util/ambi_convert.c index 282f4a0872..4c6a46d7c8 100644 --- a/lib_util/ambi_convert.c +++ b/lib_util/ambi_convert.c @@ -124,15 +124,16 @@ static const int16_t REORDER_ACN_SID[AMBI_MAX_CHANNELS] = { 0, --------------------------------------------------------------------------*/ AMBI_CONVERT_ERROR convert_ambi_format( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_FMT in_format, /* i: input ambisonics format */ - AMBI_FMT out_format /* i: output ambisonics format */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ + int16_t order, /* i: ambisonics order */ + AMBI_FMT in_format, /* i: input ambisonics format */ + AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ ) { - float tmp[AMBI_MAX_CHANNELS * L_FRAME48k]; + float tmp[AMBI_MAX_CHANNELS * AMBI_MAX_FRAME_LENGTH]; float *p_tmp[AMBI_MAX_CHANNELS]; AMBI_CONVERT_ERROR err = AMBI_CONVERT_OK; @@ -144,6 +145,11 @@ AMBI_CONVERT_ERROR convert_ambi_format( assert( order <= 3 ); + if ( frame_length > AMBI_MAX_FRAME_LENGTH ) + { + return AMBI_CONVERT_UNSUPPORTED_FRAME_LENGTH; + } + if ( in_format != AMBI_FMT_ACN_SN3D && out_format != AMBI_FMT_ACN_SN3D ) { assert( 0 && "Conversion only supported to and from ACN-SN3D" ); @@ -151,7 +157,7 @@ AMBI_CONVERT_ERROR convert_ambi_format( for ( int16_t j = 0; j < AMBI_MAX_CHANNELS; j++ ) { - p_tmp[j] = &tmp[j * L_FRAME48k]; + p_tmp[j] = &tmp[j * frame_length]; } switch ( in_format ) @@ -218,18 +224,18 @@ AMBI_CONVERT_ERROR convert_ambi_format( { if ( ch_ord_in != ch_ord_out ) { - if ( ( err = renormalize_channels( in, p_tmp, order, ch_norm_in, ch_norm_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = renormalize_channels( in, p_tmp, order, ch_norm_in, ch_norm_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } - if ( ( err = reorder_channels( p_tmp, out, order, ch_ord_in, ch_ord_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = reorder_channels( p_tmp, out, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } } else { - if ( ( err = renormalize_channels( in, out, order, ch_norm_in, ch_norm_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = renormalize_channels( in, out, order, ch_norm_in, ch_norm_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } @@ -237,7 +243,7 @@ AMBI_CONVERT_ERROR convert_ambi_format( } else if ( in_format == AMBI_FMT_ACN_SN3D && ch_ord_in != ch_ord_out ) { - if ( ( err = reorder_channels( in, out, order, ch_ord_in, ch_ord_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = reorder_channels( in, out, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } @@ -246,18 +252,18 @@ AMBI_CONVERT_ERROR convert_ambi_format( { if ( ch_ord_in != ch_ord_out ) { - if ( ( err = reorder_channels( in, p_tmp, order, ch_ord_in, ch_ord_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = reorder_channels( in, p_tmp, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } - if ( ( err = renormalize_channels( p_tmp, out, order, ch_norm_in, ch_norm_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = renormalize_channels( p_tmp, out, order, ch_norm_in, ch_norm_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } } else { - if ( ( err = renormalize_channels( in, out, order, ch_norm_in, ch_norm_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = renormalize_channels( in, out, order, ch_norm_in, ch_norm_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } @@ -265,7 +271,7 @@ AMBI_CONVERT_ERROR convert_ambi_format( } else if ( out_format == AMBI_FMT_ACN_SN3D && ch_ord_in != ch_ord_out ) { - if ( ( err = reorder_channels( in, out, order, ch_ord_in, ch_ord_out ) ) != AMBI_CONVERT_OK ) + if ( ( err = reorder_channels( in, out, order, ch_ord_in, ch_ord_out, frame_length ) ) != AMBI_CONVERT_OK ) { return err; } @@ -278,7 +284,7 @@ AMBI_CONVERT_ERROR convert_ambi_format( for ( i_chan = 0; i_chan < n_chan; i_chan++ ) { int16_t i = 0; - for ( i = 0; i < L_FRAME48k; i++ ) + for ( i = 0; i < frame_length; i++ ) { out[i_chan][i] = in[i_chan][i]; } @@ -299,11 +305,12 @@ AMBI_CONVERT_ERROR convert_ambi_format( --------------------------------------------------------------------------*/ AMBI_CONVERT_ERROR renormalize_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_NORM out_format /* i: output ambisonics format */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ + int16_t order, /* i: ambisonics order */ + AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ + AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ ) { int16_t n_chan = ( order + 1 ) * ( order + 1 ); @@ -358,7 +365,7 @@ AMBI_CONVERT_ERROR renormalize_channels( for ( i_chan = 0; i_chan < n_chan; i_chan++ ) { float conversion_factor = conversion_table[i_chan]; - for ( i = 0; i < L_FRAME48k; i++ ) + for ( i = 0; i < frame_length; i++ ) { out[i_chan][i] = in[i_chan][i] * conversion_factor; } @@ -374,11 +381,12 @@ AMBI_CONVERT_ERROR renormalize_channels( --------------------------------------------------------------------------*/ AMBI_CONVERT_ERROR reorder_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_ORDER out_format /* i: output ambisonics format */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ + int16_t order, /* i: ambisonics order */ + AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ + AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ ) { int16_t n_chan = ( order + 1 ) * ( order + 1 ); @@ -421,7 +429,7 @@ AMBI_CONVERT_ERROR reorder_channels( return AMBI_CONVERT_UNSUPPORTED_CONVERSION; } - for ( i = 0; i < L_FRAME48k; i++ ) + for ( i = 0; i < frame_length; i++ ) { for ( i_chan = 0; i_chan < n_chan; i_chan++ ) { diff --git a/lib_util/ambi_convert.h b/lib_util/ambi_convert.h index 825d65127c..c680a7ff55 100644 --- a/lib_util/ambi_convert.h +++ b/lib_util/ambi_convert.h @@ -35,8 +35,8 @@ #include -#define L_FRAME48k 960 -#define AMBI_MAX_CHANNELS 16 +#define AMBI_MAX_FRAME_LENGTH 960 /* 20ms at 48 kHz Sampling rate */ +#define AMBI_MAX_CHANNELS 16 typedef enum { @@ -66,30 +66,34 @@ typedef enum typedef enum { AMBI_CONVERT_OK = 0, - AMBI_CONVERT_UNSUPPORTED_CONVERSION + AMBI_CONVERT_UNSUPPORTED_CONVERSION, + AMBI_CONVERT_UNSUPPORTED_FRAME_LENGTH } AMBI_CONVERT_ERROR; AMBI_CONVERT_ERROR convert_ambi_format( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_FMT in_format, /* i: input ambisonics format */ - AMBI_FMT out_format /* i: output ambisonics format */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ + int16_t order, /* i: ambisonics order */ + AMBI_FMT in_format, /* i: input ambisonics format */ + AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ ); AMBI_CONVERT_ERROR renormalize_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_NORM out_format /* i: output ambisonics format */ -); - -AMBI_CONVERT_ERROR reorder_channels( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_ORDER out_format /* i: output ambisonics format */ + AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ + AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ +); + +AMBI_CONVERT_ERROR reorder_channels( + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ + int16_t order, /* i: ambisonics order */ + AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ + AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ + const int16_t frame_length /* i: input/output frame length */ ); #endif -- GitLab From 5c813befd3e879afe87ab232dfc6b972ffb945fe Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 29 Sep 2025 12:14:52 +0200 Subject: [PATCH 127/147] make ambisonics-converter function arguments const --- lib_util/ambi_convert.c | 18 +++++++++--------- lib_util/ambi_convert.h | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/lib_util/ambi_convert.c b/lib_util/ambi_convert.c index 4c6a46d7c8..cd4722d994 100644 --- a/lib_util/ambi_convert.c +++ b/lib_util/ambi_convert.c @@ -126,9 +126,9 @@ static const int16_t REORDER_ACN_SID[AMBI_MAX_CHANNELS] = { 0, AMBI_CONVERT_ERROR convert_ambi_format( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_FMT in_format, /* i: input ambisonics format */ - AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_FMT in_format, /* i: input ambisonics format */ + const AMBI_FMT out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ) { @@ -307,9 +307,9 @@ AMBI_CONVERT_ERROR convert_ambi_format( AMBI_CONVERT_ERROR renormalize_channels( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ) { @@ -383,9 +383,9 @@ AMBI_CONVERT_ERROR renormalize_channels( AMBI_CONVERT_ERROR reorder_channels( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ) { diff --git a/lib_util/ambi_convert.h b/lib_util/ambi_convert.h index c680a7ff55..6d833481ad 100644 --- a/lib_util/ambi_convert.h +++ b/lib_util/ambi_convert.h @@ -73,27 +73,27 @@ typedef enum AMBI_CONVERT_ERROR convert_ambi_format( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_FMT in_format, /* i: input ambisonics format */ - AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_FMT in_format, /* i: input ambisonics format */ + const AMBI_FMT out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ); AMBI_CONVERT_ERROR renormalize_channels( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ); AMBI_CONVERT_ERROR reorder_channels( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - int16_t order, /* i: ambisonics order */ - AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ - AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ + const AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ); #endif -- GitLab From 5f91263cad329aa4ae93eca4c2725fc8e180bcb6 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 29 Sep 2025 12:33:18 +0200 Subject: [PATCH 128/147] Missing cast in ambi_converter.c caused a Compiler Warning on MSVC. --- apps/ambi_converter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index 928def1dc3..4341925886 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -140,7 +140,7 @@ int main( int argc, char *argv[] ) } } - if ( ( err = convert_ambi_format( in, out, order, in_format, out_format, numSamples / numChannels ) ) != 0 ) + if ( ( err = convert_ambi_format( in, out, order, in_format, out_format, (const uint16_t) ( numSamples / numChannels ) ) ) != 0 ) { printf( "Error converting the input signal!\n" ); return err; -- GitLab From b622f8bac027d54c0525fd2bf8de03243d63bd56 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 29 Sep 2025 13:23:09 +0200 Subject: [PATCH 129/147] applied the clang patch --- apps/ambi_converter.c | 2 +- lib_util/ambi_convert.c | 18 +++++++++--------- lib_util/ambi_convert.h | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/ambi_converter.c b/apps/ambi_converter.c index 4341925886..ea880d26a9 100644 --- a/apps/ambi_converter.c +++ b/apps/ambi_converter.c @@ -140,7 +140,7 @@ int main( int argc, char *argv[] ) } } - if ( ( err = convert_ambi_format( in, out, order, in_format, out_format, (const uint16_t) ( numSamples / numChannels ) ) ) != 0 ) + if ( ( err = convert_ambi_format( in, out, order, in_format, out_format, ( const uint16_t )( numSamples / numChannels ) ) ) != 0 ) { printf( "Error converting the input signal!\n" ); return err; diff --git a/lib_util/ambi_convert.c b/lib_util/ambi_convert.c index cd4722d994..e91dd0f989 100644 --- a/lib_util/ambi_convert.c +++ b/lib_util/ambi_convert.c @@ -126,9 +126,9 @@ static const int16_t REORDER_ACN_SID[AMBI_MAX_CHANNELS] = { 0, AMBI_CONVERT_ERROR convert_ambi_format( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - const int16_t order, /* i: ambisonics order */ - const AMBI_FMT in_format, /* i: input ambisonics format */ - const AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_FMT in_format, /* i: input ambisonics format */ + const AMBI_FMT out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ) { @@ -305,12 +305,12 @@ AMBI_CONVERT_ERROR convert_ambi_format( --------------------------------------------------------------------------*/ AMBI_CONVERT_ERROR renormalize_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ const int16_t order, /* i: ambisonics order */ const AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ const AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ - const int16_t frame_length /* i: input/output frame length */ + const int16_t frame_length /* i: input/output frame length */ ) { int16_t n_chan = ( order + 1 ) * ( order + 1 ); @@ -381,12 +381,12 @@ AMBI_CONVERT_ERROR renormalize_channels( --------------------------------------------------------------------------*/ AMBI_CONVERT_ERROR reorder_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ const int16_t order, /* i: ambisonics order */ const AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ const AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ - const int16_t frame_length /* i: input/output frame length */ + const int16_t frame_length /* i: input/output frame length */ ) { int16_t n_chan = ( order + 1 ) * ( order + 1 ); diff --git a/lib_util/ambi_convert.h b/lib_util/ambi_convert.h index 6d833481ad..1b2ffb8c60 100644 --- a/lib_util/ambi_convert.h +++ b/lib_util/ambi_convert.h @@ -73,27 +73,27 @@ typedef enum AMBI_CONVERT_ERROR convert_ambi_format( float *in[], /* i: input ambisonics channels */ float *out[], /* o: output ambisonics channels */ - const int16_t order, /* i: ambisonics order */ - const AMBI_FMT in_format, /* i: input ambisonics format */ - const AMBI_FMT out_format, /* i: output ambisonics format */ + const int16_t order, /* i: ambisonics order */ + const AMBI_FMT in_format, /* i: input ambisonics format */ + const AMBI_FMT out_format, /* i: output ambisonics format */ const int16_t frame_length /* i: input/output frame length */ ); AMBI_CONVERT_ERROR renormalize_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ const int16_t order, /* i: ambisonics order */ const AMBI_CHANNEL_NORM in_format, /* i: input ambisonics format */ const AMBI_CHANNEL_NORM out_format, /* i: output ambisonics format */ - const int16_t frame_length /* i: input/output frame length */ + const int16_t frame_length /* i: input/output frame length */ ); AMBI_CONVERT_ERROR reorder_channels( - float *in[], /* i: input ambisonics channels */ - float *out[], /* o: output ambisonics channels */ + float *in[], /* i: input ambisonics channels */ + float *out[], /* o: output ambisonics channels */ const int16_t order, /* i: ambisonics order */ const AMBI_CHANNEL_ORDER in_format, /* i: input ambisonics format */ const AMBI_CHANNEL_ORDER out_format, /* i: output ambisonics format */ - const int16_t frame_length /* i: input/output frame length */ + const int16_t frame_length /* i: input/output frame length */ ); #endif -- GitLab From f517c3e04d0a375949dc7f049b05c068dd0b3746 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 29 Sep 2025 13:52:48 +0200 Subject: [PATCH 130/147] add mechanism to enable a trap on underflows - tested only on gcc so far --- apps/decoder.c | 6 +++ apps/encoder.c | 7 ++- apps/renderer.c | 6 +++ lib_com/options.h | 1 + lib_debug/flp_debug.h | 102 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100755 lib_debug/flp_debug.h diff --git a/apps/decoder.c b/apps/decoder.c index 41089d057e..14deb7de54 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -56,6 +56,9 @@ #include "debug.h" #endif #include "wmc_auto.h" +#ifdef DENORMAL_TRAP +#include "flp_debug.h" +#endif #define WMC_TOOL_SKIP @@ -229,6 +232,9 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif +#ifdef DENORMAL_TRAP + enable_denorm_trap(); +#endif hHrtfBinary.hHrtfTD = NULL; /* just to avoid compilation warning */ hHrtfBinary.hHrtfStatistics = NULL; /* just to avoid compilation warning */ diff --git a/apps/encoder.c b/apps/encoder.c index 61bb8ebb3f..4f3238f2d9 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -15,7 +15,6 @@ the software. This notice grants no license of any kind, including but not limited to patent license, nor is any license granted by implication, estoppel or otherwise. - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making Contributors are required to enter into the IVAS codec Public Collaboration agreement before making contributions. @@ -43,6 +42,9 @@ #include "debug.h" #endif #include "wmc_auto.h" +#ifdef DENORMAL_TRAP +#include "flp_debug.h" +#endif #define WMC_TOOL_SKIP @@ -206,6 +208,9 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif +#ifdef DENORMAL_TRAP + enable_denorm_trap(); +#endif /*------------------------------------------------------------------------------------------* * Parse command-line arguments diff --git a/apps/renderer.c b/apps/renderer.c index cf5a7e33d2..a9b1626f95 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -53,6 +53,9 @@ #include "debug.h" #endif #include "wmc_auto.h" +#ifdef DENORMAL_TRAP +#include "flp_debug.h" +#endif #define WMC_TOOL_SKIP @@ -723,6 +726,9 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif +#ifdef DENORMAL_TRAP + enable_denorm_trap(); +#endif for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) { diff --git a/lib_com/options.h b/lib_com/options.h index 8b761e69b2..14937ce1e4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -55,6 +55,7 @@ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ /*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ +/*#define DENORMAL_TRAP*/ /* Enable trap for denormals */ #ifdef DEBUGGING /*#define DBG_BITSTREAM_ANALYSIS*/ /* Write bitstream with annotations to a text file */ diff --git a/lib_debug/flp_debug.h b/lib_debug/flp_debug.h new file mode 100755 index 0000000000..d24d909272 --- /dev/null +++ b/lib_debug/flp_debug.h @@ -0,0 +1,102 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include + +#if defined(_MSC_VER) + // MSVC, x87 + #include +#elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) + // GCC/Clang, x86 SSE/AVX + #include +#endif + +/* + detect underflow execption, which results in a denormal; + this will not detect each and every denormal - otherwise, + all FLP values would have to be tested for denormals using + e.g. fpclassify()/fpstatus or bitmasks +*/ + + +static inline void enable_denorm_trap(void) { +#if defined(_MSC_VER) + // MSVC, x87 + unsigned int cw = _controlfp(0,0); + cw &= ~_EM_UNDERFLOW; + _controlfpEM_DENORMAL(cw, _MCW_EM); + +#elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) + // GCC/Clang, x86 SSE/AVX + unsigned int mx = _mm_getcsr(); + mx &= ~_MM_MASK_UNDERFLOW; // unmaks underflows + _mm_setcsr(mx); + +#elif defined(__aarch64__) + // AArch64 (Apple Silicon) + uint64_t fpcr; + __asm__ volatile("mrs %0, fpcr" : "=r"(fpcr)); + // disable sits 24(FZ) & 25(DN) --> allow denormals to happen + fpcr &= ~((1ull<<24)|(1ull<<25)); + // set bit 3 (UFE) to unmask underflow exceptions + fpcr |= (1ull<<3); + __asm__ volatile("msr fpcr, %0" :: "r"(fpcr)); + +#else + fprintf(stderr, "enable_denorm_trap() not supported on platform!\n"); +#endif +} + +static inline void disable_denorm_trap(void) { +#if defined(_MSC_VER) + unsigned int cw = _controlfp(0,0); + cw |= _EM_UNDERFLOW; + _controlfp(cw, _MCW_EM); + +#elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) + unsigned int mx = _mm_getcsr(); + mx |= _MM_MASK_UNDERFLOW; // mask underflows + _mm_setcsr(mx); + +#elif defined(__aarch64__) + // AArch64 (Apple Silicon) + uint64_t fpcr; + __asm__ volatile("mrs %0, fpcr" : "=r"(fpcr)); + // delete bit 3 (UFE), set bits 24/25 (FZ/DN) again + fpcr &= ~(1ull<<3); + fpcr |= (1ull<<24)|(1ull<<25); + __asm__ volatile("msr fpcr, %0" :: "r"(fpcr)); + +#else + fprintf(stderr, "disable_denorm_trap() not supported on platform!\n"); +#endif +} -- GitLab From b51ccce8fe1694fe0e7485f26db61803d2ebd074 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 29 Sep 2025 14:36:36 +0200 Subject: [PATCH 131/147] set correct UFE bit for AArch64 --- lib_debug/flp_debug.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_debug/flp_debug.h b/lib_debug/flp_debug.h index d24d909272..c11e97fe72 100755 --- a/lib_debug/flp_debug.h +++ b/lib_debug/flp_debug.h @@ -67,8 +67,8 @@ static inline void enable_denorm_trap(void) { __asm__ volatile("mrs %0, fpcr" : "=r"(fpcr)); // disable sits 24(FZ) & 25(DN) --> allow denormals to happen fpcr &= ~((1ull<<24)|(1ull<<25)); - // set bit 3 (UFE) to unmask underflow exceptions - fpcr |= (1ull<<3); + // set bit 11 (UFE) to unmask underflow exceptions + fpcr |= (1ull<<11); __asm__ volatile("msr fpcr, %0" :: "r"(fpcr)); #else @@ -91,8 +91,8 @@ static inline void disable_denorm_trap(void) { // AArch64 (Apple Silicon) uint64_t fpcr; __asm__ volatile("mrs %0, fpcr" : "=r"(fpcr)); - // delete bit 3 (UFE), set bits 24/25 (FZ/DN) again - fpcr &= ~(1ull<<3); + // delete bit 11 (UFE), set bits 24/25 (FZ/DN) again + fpcr &= ~(1ull<<11); fpcr |= (1ull<<24)|(1ull<<25); __asm__ volatile("msr fpcr, %0" :: "r"(fpcr)); -- GitLab From ddb7b3e9c5af0a798e036d0392b6c182775cc53e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 29 Sep 2025 14:52:07 +0200 Subject: [PATCH 132/147] fix copy & paste error --- lib_debug/flp_debug.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_debug/flp_debug.h b/lib_debug/flp_debug.h index c11e97fe72..87a208a69c 100755 --- a/lib_debug/flp_debug.h +++ b/lib_debug/flp_debug.h @@ -53,7 +53,7 @@ static inline void enable_denorm_trap(void) { // MSVC, x87 unsigned int cw = _controlfp(0,0); cw &= ~_EM_UNDERFLOW; - _controlfpEM_DENORMAL(cw, _MCW_EM); + _controlfp(cw, _MCW_EM); #elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) // GCC/Clang, x86 SSE/AVX -- GitLab From ad537ceb87fdec91b0664cbd4716986b3b17200b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 30 Sep 2025 10:36:44 +0300 Subject: [PATCH 133/147] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Archit Tamarapu --- lib_rend/ivas_masa_merge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index cd5af80ff1..997cdc84d1 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -345,7 +345,7 @@ ivas_error masaPrerendOpen( #ifdef NONBE_1344_REND_MASA_LOW_FS /* Determine the number of bands and band grouping */ hMasaPrerend->nbands = MASA_FREQUENCY_BANDS; - mvs2s( MASA_band_grouping_24, hMasaPrerend->band_grouping, 24 + 1 ); + mvs2s( MASA_band_grouping_24, hMasaPrerend->band_grouping, MASA_FREQUENCY_BANDS + 1 ); maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); for ( i = 1; i < hMasaPrerend->nbands + 1; i++ ) -- GitLab From fa69c6376b33643255a62dcba2fda1839bb630d7 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 30 Sep 2025 15:55:36 +0200 Subject: [PATCH 134/147] revised version of trap for floating-point exceptions --- apps/decoder.c | 6 +- apps/encoder.c | 6 +- apps/renderer.c | 6 +- lib_com/options.h | 2 +- lib_debug/flp_debug.h | 243 +++++++++++++++++++++++++++++++++++------- 5 files changed, 212 insertions(+), 51 deletions(-) mode change 100644 => 100755 lib_com/options.h mode change 100755 => 100644 lib_debug/flp_debug.h diff --git a/apps/decoder.c b/apps/decoder.c index 14deb7de54..74e78fa6e3 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -56,7 +56,7 @@ #include "debug.h" #endif #include "wmc_auto.h" -#ifdef DENORMAL_TRAP +#ifdef FLP_EXCEPTION_TRAP #include "flp_debug.h" #endif @@ -232,8 +232,8 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif -#ifdef DENORMAL_TRAP - enable_denorm_trap(); +#ifdef FLP_EXCEPTION_TRAP + enable_float_exception_trap( FLE_MASK_DENORM | FLE_MASK_UNDERFLOW ); #endif hHrtfBinary.hHrtfTD = NULL; /* just to avoid compilation warning */ diff --git a/apps/encoder.c b/apps/encoder.c index 4f3238f2d9..25550974df 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -42,7 +42,7 @@ #include "debug.h" #endif #include "wmc_auto.h" -#ifdef DENORMAL_TRAP +#ifdef FLP_EXCEPTION_TRAP #include "flp_debug.h" #endif @@ -208,8 +208,8 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif -#ifdef DENORMAL_TRAP - enable_denorm_trap(); +#ifdef FLP_EXECPTION_TRAP + enable_float_exception_trap( FLE_MASK_DENORM | FLE_MASK_UNDERFLOW ); #endif /*------------------------------------------------------------------------------------------* diff --git a/apps/renderer.c b/apps/renderer.c index a9b1626f95..fa12006ce3 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -53,7 +53,7 @@ #include "debug.h" #endif #include "wmc_auto.h" -#ifdef DENORMAL_TRAP +#ifdef FLP_EXCEPTION_TRAP #include "flp_debug.h" #endif @@ -726,8 +726,8 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif -#ifdef DENORMAL_TRAP - enable_denorm_trap(); +#ifdef FLP_EXCEPTION_TRAP + enable_float_exception_trap( FLE_MASK_DENORM | FLE_MASK_UNDERFLOW ); #endif for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) diff --git a/lib_com/options.h b/lib_com/options.h old mode 100644 new mode 100755 index 14937ce1e4..726a383feb --- a/lib_com/options.h +++ b/lib_com/options.h @@ -55,7 +55,7 @@ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ /*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ -/*#define DENORMAL_TRAP*/ /* Enable trap for denormals */ +/*#define FLP_EXCEPTION_TRAP*/ /* Enable trap for floating-point exceptions (e.g., denormals, underflow, overflow, ...) */ #ifdef DEBUGGING /*#define DBG_BITSTREAM_ANALYSIS*/ /* Write bitstream with annotations to a text file */ diff --git a/lib_debug/flp_debug.h b/lib_debug/flp_debug.h old mode 100755 new mode 100644 index 87a208a69c..d0fd894a2e --- a/lib_debug/flp_debug.h +++ b/lib_debug/flp_debug.h @@ -32,71 +32,232 @@ #include -#if defined(_MSC_VER) - // MSVC, x87 - #include -#elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) - // GCC/Clang, x86 SSE/AVX - #include +#if defined( _MSC_VER ) +// MSVC, x87 +#include +#elif defined( __GNUC__ ) && ( defined( __SSE__ ) || defined( __SSE2__ ) || defined( __AVX__ ) ) +// GCC/Clang, x86 SSE/AVX +#include #endif -/* - detect underflow execption, which results in a denormal; - this will not detect each and every denormal - otherwise, - all FLP values would have to be tested for denormals using +#define FLE_MASK_INVALID 0x080 +#define FLE_MASK_DENORM 0x100 +#define FLE_MASK_DIV_ZERO 0x200 +#define FLE_MASK_OVERFLOW 0x400 +#define FLE_MASK_UNDERFLOW 0x800 + +/* + detect underflow execption, which results in a denormal; + this will not detect each and every denormal - otherwise, + all FLP values would have to be tested for denormals using e.g. fpclassify()/fpstatus or bitmasks */ -static inline void enable_denorm_trap(void) { -#if defined(_MSC_VER) +static inline void enable_float_exception_trap( uint32_t fle_mask ) +{ + +#if defined( _MSC_VER ) + // MSVC, x87 - unsigned int cw = _controlfp(0,0); - cw &= ~_EM_UNDERFLOW; - _controlfp(cw, _MCW_EM); + unsigned int cw = _controlfp( 0, 0 ); + + if ( fle_mask & FLE_MASK_INVALID ) + { + cw &= ~_EM_INVALID; + } + if ( fle_mask & FLE_MASK_DENORM ) + { + cw &= ~_EM_DENORMAL; + } + if ( fle_mask & FLE_MASK_DIV_ZERO ) + { + cw &= ~_EM_ZERODIVIDE; + } + if ( fle_mask & FLE_MASK_OVERFLOW ) + { + cw &= ~_EM_OVERFLOW; + } + if ( fle_mask & FLE_MASK_UNDERFLOW ) + { + cw &= ~_EM_UNDERFLOW; + } + + _controlfp( cw, _MCW_EM ); + +#elif defined( __GNUC__ ) && ( defined( __SSE__ ) || defined( __SSE2__ ) || defined( __AVX__ ) ) -#elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) // GCC/Clang, x86 SSE/AVX unsigned int mx = _mm_getcsr(); - mx &= ~_MM_MASK_UNDERFLOW; // unmaks underflows - _mm_setcsr(mx); -#elif defined(__aarch64__) - // AArch64 (Apple Silicon) + if ( fle_mask & FLE_MASK_INVALID ) + { + mx &= ~_MM_MASK_INVALID; + } + if ( fle_mask & FLE_MASK_DENORM ) + { + mx &= ~_MM_MASK_DENORM; + } + if ( fle_mask & FLE_MASK_DIV_ZERO ) + { + mx &= ~_MM_MASK_DIV_ZERO; + } + if ( fle_mask & FLE_MASK_OVERFLOW ) + { + mx &= ~_MM_MASK_OVERFLOW; + } + if ( fle_mask & FLE_MASK_UNDERFLOW ) + { + mx &= ~_MM_MASK_UNDERFLOW; + } + + _mm_setcsr( mx ); + +#elif defined( __aarch64__ ) + + // AArch64 (e.g., Apple Silicon) uint64_t fpcr; - __asm__ volatile("mrs %0, fpcr" : "=r"(fpcr)); + __asm__ volatile( "mrs %0, fpcr" + : "=r"( fpcr ) ); + // disable sits 24(FZ) & 25(DN) --> allow denormals to happen - fpcr &= ~((1ull<<24)|(1ull<<25)); - // set bit 11 (UFE) to unmask underflow exceptions - fpcr |= (1ull<<11); - __asm__ volatile("msr fpcr, %0" :: "r"(fpcr)); + fpcr &= ~( ( 1ull << 24 ) | ( 1ull << 25 ) ); + + if ( fle_mask & FLE_MASK_INVALID ) + { + // set bit 8 (IOE) to unmask invalid operations exceptions + fpcr |= ( 1ull << 8 ); + } + if ( fle_mask & FLE_MASK_DENORM ) + { + // set bit 15 (IDE) to unmask input denormal exceptions + fpcr |= ( 1ull << 15 ); + } + if ( fle_mask & FLE_MASK_DIV_ZERO ) + { + // set bit 9 (DZE) to unmask div_zero exceptions + fpcr |= ( 1ull << 9 ); + } + if ( fle_mask & FLE_MASK_OVERFLOW ) + { + // set bit 10 (OFE) to unmask overflow exceptions + fpcr |= ( 1ull << 10 ); + } + if ( fle_mask & FLE_MASK_UNDERFLOW ) + { + // set bit 11 (UFE) to unmask underflow exceptions + fpcr |= ( 1ull << 11 ); + } + + __asm__ volatile( "msr fpcr, %0" ::"r"( fpcr ) ); #else - fprintf(stderr, "enable_denorm_trap() not supported on platform!\n"); + fprintf( stderr, "enable_float_exception_trap() not supported on platform!\n" ); #endif } -static inline void disable_denorm_trap(void) { -#if defined(_MSC_VER) - unsigned int cw = _controlfp(0,0); - cw |= _EM_UNDERFLOW; - _controlfp(cw, _MCW_EM); +static inline void disable_float_exception_trap( uint32_t fle_mask ) +{ + +#if defined( _MSC_VER ) -#elif defined(__GNUC__) && (defined(__SSE__)||defined(__SSE2__)||defined(__AVX__)) + // MSVC, x87 + unsigned int cw = _controlfp( 0, 0 ); + + if ( fle_mask & FLE_MASK_INVALID ) + { + cw |= _EM_INVALID; + } + if ( fle_mask & FLE_MASK_DENORM ) + { + cw |= _EM_DENORMAL; + } + if ( fle_mask & FLE_MASK_DIV_ZERO ) + { + cw |= _EM_ZERODIVIDE; + } + if ( fle_mask & FLE_MASK_OVERFLOW ) + { + cw |= _EM_OVERFLOW; + } + if ( fle_mask & FLE_MASK_UNDERFLOW ) + { + cw |= _EM_UNDERFLOW; + } + + _controlfp( cw, _MCW_EM ); + +#elif defined( __GNUC__ ) && ( defined( __SSE__ ) || defined( __SSE2__ ) || defined( __AVX__ ) ) + + // GCC/Clang, x86 SSE/AVX unsigned int mx = _mm_getcsr(); - mx |= _MM_MASK_UNDERFLOW; // mask underflows - _mm_setcsr(mx); -#elif defined(__aarch64__) + if ( fle_mask & FLE_MASK_INVALID ) + { + mx |= _MM_MASK_INVALID; + } + if ( fle_mask & FLE_MASK_DENORM ) + { + mx |= _MM_MASK_DENORM; + } + if ( fle_mask & FLE_MASK_DIV_ZERO ) + { + mx |= _MM_MASK_DIV_ZERO; + } + if ( fle_mask & FLE_MASK_OVERFLOW ) + { + mx |= _MM_MASK_OVERFLOW; + } + if ( fle_mask & FLE_MASK_UNDERFLOW ) + { + mx |= _MM_MASK_UNDERFLOW; + } + + _mm_setcsr( mx ); + +#elif defined( __aarch64__ ) + // AArch64 (Apple Silicon) uint64_t fpcr; - __asm__ volatile("mrs %0, fpcr" : "=r"(fpcr)); - // delete bit 11 (UFE), set bits 24/25 (FZ/DN) again - fpcr &= ~(1ull<<11); - fpcr |= (1ull<<24)|(1ull<<25); - __asm__ volatile("msr fpcr, %0" :: "r"(fpcr)); + __asm__ volatile( "mrs %0, fpcr" + : "=r"( fpcr ) ); + + if ( fle_mask & FLE_MASK_INVALID ) + { + // unset bit 8 (IOE) to mask invalid operations exceptions + fpcr &= ~( 1ull << 8 ); + } + if ( fle_mask & FLE_MASK_DENORM ) + { + // unset bit 15 (IDE) to mask input denormal exceptions + fpcr &= ~( 1ull << 15 ); + } + if ( fle_mask & FLE_MASK_DIV_ZERO ) + { + // unset bit 9 (DZE) to mask div_zero exceptions + fpcr &= ~( 1ull << 9 ); + } + if ( fle_mask & FLE_MASK_OVERFLOW ) + { + // unset bit 10 (OFE) to mask overflow exceptions + fpcr &= ~( 1ull << 10 ); + } + if ( fle_mask & FLE_MASK_UNDERFLOW ) + { + // unset bit 11 (UFE) to mask underflow exceptions + fpcr &= ~( 1ull << 11 ); + } + + + // set bits 24/25 (FZ/DN) again + fpcr |= ( 1ull << 24 ) | ( 1ull << 25 ); + fprintf( stderr, "float_exception_trap(): Setting bits 24/25 (FZ/DN) again\n" ); + + __asm__ volatile( "msr fpcr, %0" ::"r"( fpcr ) ); #else - fprintf(stderr, "disable_denorm_trap() not supported on platform!\n"); + + fprintf( stderr, "float_exception_trap() not supported on platform!\n" ); + #endif } -- GitLab From 403ba96b3daecff4542940416f5f9f6821f04f99 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 30 Sep 2025 16:01:46 +0200 Subject: [PATCH 135/147] fix typo --- apps/encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/encoder.c b/apps/encoder.c index 25550974df..4d9626edc3 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -208,7 +208,7 @@ int main( reset_wmops(); reset_mem( USE_BYTES ); #endif -#ifdef FLP_EXECPTION_TRAP +#ifdef FLP_EXCEPTION_TRAP enable_float_exception_trap( FLE_MASK_DENORM | FLE_MASK_UNDERFLOW ); #endif -- GitLab From 06e267f96e4c030d68ca586cdbca7a229eac5929 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 1 Oct 2025 09:25:29 +0200 Subject: [PATCH 136/147] tag renderer sanitizer tests for fast runners --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7a02bd69e5..543332ac81 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -549,6 +549,8 @@ renderer-smoke-test: - .test-job-linux - .rules-merge-request-to-main needs: ["build-codec-linux-cmake"] + tags: + - ivas-linux-fast stage: test timeout: "90 minutes" artifacts: -- GitLab From 96a93fcf342e15c6e7c8d0268552b0924b6ee359 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 1 Oct 2025 12:39:35 +0200 Subject: [PATCH 137/147] switch renderer sanity tests to run smoke test only --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 543332ac81..8c1654e120 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -581,7 +581,7 @@ renderer-asan: variables: SANITIZER_BUILD_STRING: "asan" script: - - python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout + - python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: expose_as: "renderer asan result" @@ -593,7 +593,7 @@ renderer-msan: variables: SANITIZER_BUILD_STRING: "msan" script: - - python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout + - python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: expose_as: "renderer msan result" @@ -605,7 +605,7 @@ renderer-usan: variables: SANITIZER_BUILD_STRING: "usan" script: - - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout + - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 python3 -m pytest -q --tb=no -n auto --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout artifacts: expose_as: "renderer usan result" -- GitLab From ae14c5361dd26fb59eef5df32f0881bc9c45067e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 1 Oct 2025 12:58:55 +0200 Subject: [PATCH 138/147] remove renaming from renderer-Xsan tests _ref suffix not needed anymore after switching to smoke test cases --- .gitlab-ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8c1654e120..dcfe8300ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -566,12 +566,6 @@ renderer-smoke-test: before_script: - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=$SANITIZER_BUILD_STRING -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - cmake --build cmake-build -- -j - # rename files to fit naming convention - # en- and decoder needed because of split rendering testcases - - mv IVAS_cod IVAS_cod_ref - - mv IVAS_dec IVAS_dec_ref - - mv IVAS_rend IVAS_rend_ref - - mv ISAR_post_rend ISAR_post_rend_ref - testcase_timeout=180 # test renderer executable with cmake + asan -- GitLab From c6d94f6b59d9820ab2a40e750a68b04a8ee6f926 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 2 Oct 2025 11:23:26 +0200 Subject: [PATCH 139/147] remove evs-be-linux and codec-comparison jobs from main push pl --- .gitlab-ci.yml | 214 +++++++++++++++++++++++++------------------------ 1 file changed, 108 insertions(+), 106 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dcfe8300ad..0473b241b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1118,113 +1118,115 @@ be-2-evs-windows: - cd evs_be_win_test - python ../ci/run_evs_be_win_test.py +# TODO: turn into manual job if needed # check bitexactness to EVS -be-2-evs-linux: - extends: - - .test-job-linux - - .rules-main-push - tags: - - be-2-evs-temp - stage: test - needs: ["build-codec-linux-cmake"] - timeout: "20 minutes" # To be revisited - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - - mkdir build - - cd build - - cmake .. - - make -j - - cd .. - - # copy over to never change the testvector dir - - cp -r $EVS_BE_TEST_DIR ./evs_be_test - - cp build/IVAS_cod ./evs_be_test/bin/EVS_cod - - cp build/IVAS_dec ./evs_be_test/bin/EVS_dec - - - cd evs_be_test - - python3 ../ci/run_evs_be_test.py - -codec-comparison-on-main-push: - extends: - - .test-job-linux-needs-testv-dir - - .rules-main-push - stage: compare - needs: ["build-codec-linux-cmake"] - timeout: "30 minutes" # To be revisited - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - latest_commit=$(git rev-parse HEAD) # Latest commit - - previous_merge_commit=$(git --no-pager log --merges HEAD~1 -n 1 --pretty=format:%H) - - echo "Comparing changes from $previous_merge_commit to $latest_commit" - - git --no-pager diff --stat $previous_merge_commit..$latest_commit - - # Rest is more or less placeholder adapted from MR self test. This should be replaced with more complex tests. - - ### build test binaries, initial clean for paranoia reasons - - make clean - - mkdir build - - cd build - - cmake .. - - make -j - - mv IVAS_cod ../IVAS_cod_test - - mv IVAS_dec ../IVAS_dec_test - - cd .. - - rm -rf build/* - - ### compare to the previous merge commit in the main branch - - git fetch origin main - - git checkout $previous_merge_commit - - echo "Building reference codec at commit $previous_merge_commit" - - ### build reference binaries - - cd build - - cmake .. - - make -j - - mv IVAS_cod ../IVAS_cod_ref - - mv IVAS_dec ../IVAS_dec_ref - - cd .. - - # helper variable - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_COMMIT_MESSAGE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[non[ -]*be\]" tmp.txt) || true - - ref_using_main=$(grep -c --ignore-case "\[ref[ -]*using[ -]*main\]" tmp.txt) || true - - ### re-checkout the latest commit in the main branch, if ref_using_main is not set - - if [ $ref_using_main == 0 ]; then git checkout $latest_commit;fi - - ### prepare pytest - # rename test binaries back - - mv IVAS_cod_test IVAS_cod - - mv IVAS_dec_test IVAS_dec - # create references - - testcase_timeout=60 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 --testcase_timeout=$testcase_timeout - - ### re-checkout the latest commit here, if ref_using_main is set - - if [ $ref_using_main -eq 1 ]; then git checkout $latest_commit;fi - - ### run pytest - - exit_code=0 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$? - - if [ $exit_code -ne 0 ] && [ $non_be_flag == 0 ]; then echo "pytest run had failures and non-BE flag not present"; exit $EXIT_CODE_FAIL; fi - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - if [ $exit_code -ne 0 ] && [ $zero_errors == 1 ]; then echo "pytest run had failures, but no errors and non-BE flag present"; exit $EXIT_CODE_NON_BE; fi - - if [ $exit_code -ne 0 ]; then echo "pytest run had errors"; exit $EXIT_CODE_FAIL; fi; - allow_failure: - exit_codes: - - 123 - artifacts: - name: "main-push--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "Results of comparison to previous merge commit" - reports: - junit: report-junit.xml +# be-2-evs-linux: +# extends: +# - .test-job-linux +# - .rules-main-push +# tags: +# - be-2-evs-temp +# stage: test +# needs: ["build-codec-linux-cmake"] +# timeout: "20 minutes" # To be revisited +# script: +# - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh +# +# - mkdir build +# - cd build +# - cmake .. +# - make -j +# - cd .. +# +# # copy over to never change the testvector dir +# - cp -r $EVS_BE_TEST_DIR ./evs_be_test +# - cp build/IVAS_cod ./evs_be_test/bin/EVS_cod +# - cp build/IVAS_dec ./evs_be_test/bin/EVS_dec +# +# - cd evs_be_test +# - python3 ../ci/run_evs_be_test.py + +# TODO: do we still need this? +# codec-comparison-on-main-push: +# extends: +# - .test-job-linux-needs-testv-dir +# - .rules-main-push +# stage: compare +# needs: ["build-codec-linux-cmake"] +# timeout: "30 minutes" # To be revisited +# script: +# - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh +# - latest_commit=$(git rev-parse HEAD) # Latest commit +# - previous_merge_commit=$(git --no-pager log --merges HEAD~1 -n 1 --pretty=format:%H) +# - echo "Comparing changes from $previous_merge_commit to $latest_commit" +# - git --no-pager diff --stat $previous_merge_commit..$latest_commit +# +# # Rest is more or less placeholder adapted from MR self test. This should be replaced with more complex tests. +# +# ### build test binaries, initial clean for paranoia reasons +# - make clean +# - mkdir build +# - cd build +# - cmake .. +# - make -j +# - mv IVAS_cod ../IVAS_cod_test +# - mv IVAS_dec ../IVAS_dec_test +# - cd .. +# - rm -rf build/* +# +# ### compare to the previous merge commit in the main branch +# - git fetch origin main +# - git checkout $previous_merge_commit +# - echo "Building reference codec at commit $previous_merge_commit" +# +# ### build reference binaries +# - cd build +# - cmake .. +# - make -j +# - mv IVAS_cod ../IVAS_cod_ref +# - mv IVAS_dec ../IVAS_dec_ref +# - cd .. +# +# # helper variable - "|| true" to prevent failures from grep not finding anything +# # write to temporary file as workaround for failures observed with piping echo +# - echo $CI_COMMIT_MESSAGE > tmp.txt +# - non_be_flag=$(grep -c --ignore-case "\[non[ -]*be\]" tmp.txt) || true +# - ref_using_main=$(grep -c --ignore-case "\[ref[ -]*using[ -]*main\]" tmp.txt) || true +# +# ### re-checkout the latest commit in the main branch, if ref_using_main is not set +# - if [ $ref_using_main == 0 ]; then git checkout $latest_commit;fi +# +# ### prepare pytest +# # rename test binaries back +# - mv IVAS_cod_test IVAS_cod +# - mv IVAS_dec_test IVAS_dec +# # create references +# - testcase_timeout=60 +# - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 --testcase_timeout=$testcase_timeout +# +# ### re-checkout the latest commit here, if ref_using_main is set +# - if [ $ref_using_main -eq 1 ]; then git checkout $latest_commit;fi +# +# ### run pytest +# - exit_code=0 +# - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$? +# - if [ $exit_code -ne 0 ] && [ $non_be_flag == 0 ]; then echo "pytest run had failures and non-BE flag not present"; exit $EXIT_CODE_FAIL; fi +# - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true +# - if [ $exit_code -ne 0 ] && [ $zero_errors == 1 ]; then echo "pytest run had failures, but no errors and non-BE flag present"; exit $EXIT_CODE_NON_BE; fi +# - if [ $exit_code -ne 0 ]; then echo "pytest run had errors"; exit $EXIT_CODE_FAIL; fi; +# allow_failure: +# exit_codes: +# - 123 +# artifacts: +# name: "main-push--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" +# expire_in: 1 week +# when: always +# paths: +# - report-junit.xml +# - report.html +# expose_as: "Results of comparison to previous merge commit" +# reports: +# junit: report-junit.xml # --------------------------------------------------------------- -- GitLab From 4ef010c7eb38bb957e0dd44e142e861b70c8df28 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 2 Oct 2025 11:25:15 +0200 Subject: [PATCH 140/147] Revert "tag renderer sanitizer tests for fast runners" This reverts commit 06e267f96e4c030d68ca586cdbca7a229eac5929. --- .gitlab-ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0473b241b4..9c53be7cae 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -549,8 +549,6 @@ renderer-smoke-test: - .test-job-linux - .rules-merge-request-to-main needs: ["build-codec-linux-cmake"] - tags: - - ivas-linux-fast stage: test timeout: "90 minutes" artifacts: -- GitLab From 68f57a5dd85747cdb5e88853f50f178a47a6b58e Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Mon, 6 Oct 2025 10:07:36 +0300 Subject: [PATCH 141/147] Add folder for IVAS conformance scripts. --- scripts/ivas_conformance/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 scripts/ivas_conformance/README.md diff --git a/scripts/ivas_conformance/README.md b/scripts/ivas_conformance/README.md new file mode 100644 index 0000000000..43952b6598 --- /dev/null +++ b/scripts/ivas_conformance/README.md @@ -0,0 +1,3 @@ +# IVAS conformance scripts + +This folder contains scripts for running IVAS conformance tests. This is a placeholder file for instructions. -- GitLab From bbecfe429b1d1069a94899dbbd702647019af0f8 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 6 Oct 2025 11:02:21 +0200 Subject: [PATCH 142/147] change error tolerance to +/- 1LSB max --- tests/test_be_ambi_converter_fixed_to_float.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py index 8fdd81e3cc..0d0b1f1ade 100644 --- a/tests/test_be_ambi_converter_fixed_to_float.py +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -51,7 +51,7 @@ INPUT_FILES = [TESTV_DIR / f"spectral_test_{ch}ch_48kHz.wav" for ch in INPUT_CH_ CONVENTIONS = [c for c in AMBI_CONVENTION] AMBI_CONVERTER_PATH_FLOAT = HERE.parent / "ambi_converter_flt" AMBI_CONVERTER_PATH_FIXED = HERE.parent / "ambi_converter_fx" -THRESHOLD_FAIL = 2 +THRESHOLD_FAIL = 1 CONVENTIONS_FULL_COMBI = list(itertools.product(CONVENTIONS, CONVENTIONS)) CONVENTIONS_TEST_PARAMS = [ -- GitLab From 2d92741efbef349f62ccbd315b6361d99b1f9403 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 6 Oct 2025 11:09:29 +0200 Subject: [PATCH 143/147] add other sampling rates --- tests/test_be_ambi_converter_fixed_to_float.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_be_ambi_converter_fixed_to_float.py b/tests/test_be_ambi_converter_fixed_to_float.py index 0d0b1f1ade..aa4202d3d1 100644 --- a/tests/test_be_ambi_converter_fixed_to_float.py +++ b/tests/test_be_ambi_converter_fixed_to_float.py @@ -47,7 +47,12 @@ def run_ambi_converter( # test all ambisonics orders from 1 to 3 INPUT_CH_NUM = [4, 9, 16] -INPUT_FILES = [TESTV_DIR / f"spectral_test_{ch}ch_48kHz.wav" for ch in INPUT_CH_NUM] +INPUT_FS = [16, 32, 48] +INPUT_FILES = [ + TESTV_DIR / f"spectral_test_{ch}ch_{fs}kHz.wav" + for ch in INPUT_CH_NUM + for fs in INPUT_FS +] CONVENTIONS = [c for c in AMBI_CONVENTION] AMBI_CONVERTER_PATH_FLOAT = HERE.parent / "ambi_converter_flt" AMBI_CONVERTER_PATH_FIXED = HERE.parent / "ambi_converter_fx" -- GitLab From 425b117660a1ec22ddd4d2bdc506f3997a3212cd Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 6 Oct 2025 14:36:52 +0200 Subject: [PATCH 144/147] add back trajectories files removed on main --- .../rotate_euler_quaternion_5s.csv | 1000 ++++++++++++++++ .../rotate_euler_quaternion_5s_delayed.csv | 1020 +++++++++++++++++ 2 files changed, 2020 insertions(+) create mode 100644 scripts/trajectories/rotate_euler_quaternion_5s.csv create mode 100644 scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv diff --git a/scripts/trajectories/rotate_euler_quaternion_5s.csv b/scripts/trajectories/rotate_euler_quaternion_5s.csv new file mode 100644 index 0000000000..0052e3d7c7 --- /dev/null +++ b/scripts/trajectories/rotate_euler_quaternion_5s.csv @@ -0,0 +1,1000 @@ +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 diff --git a/scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv b/scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv new file mode 100644 index 0000000000..99c54e3c52 --- /dev/null +++ b/scripts/trajectories/rotate_euler_quaternion_5s_delayed.csv @@ -0,0 +1,1020 @@ +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,360,0,0 +-3,359.1,0,0 +-3,358.2,0,0 +-3,357.3,0,0 +-3,356.4,0,0 +-3,355.5,0,0 +-3,354.6,0,0 +-3,353.7,0,0 +-3,352.8,0,0 +-3,351.9,0,0 +-3,351,0,0 +-3,350.1,0,0 +-3,349.2,0,0 +-3,348.3,0,0 +-3,347.4,0,0 +-3,346.5,0,0 +-3,345.6,0,0 +-3,344.7,0,0 +-3,343.8,0,0 +-3,342.9,0,0 +-3,342,0,0 +-3,341.1,0,0 +-3,340.2,0,0 +-3,339.2,0,0 +-3,338.3,0,0 +-3,337.4,0,0 +-3,336.5,0,0 +-3,335.6,0,0 +-3,334.7,0,0 +-3,333.8,0,0 +-3,332.9,0,0 +-3,332,0,0 +-3,331.1,0,0 +-3,330.2,0,0 +-3,329.3,0,0 +-3,328.4,0,0 +-3,327.5,0,0 +-3,326.6,0,0 +-3,325.7,0,0 +-3,324.8,0,0 +-3,323.9,0,0 +-3,323,0,0 +-3,322.1,0,0 +-3,321.2,0,0 +-3,320.3,0,0 +-3,319.4,0,0 +-3,318.5,0,0 +-3,317.6,0,0 +-3,316.7,0,0 +-3,315.8,0,0 +-3,314.9,0,0 +-3,314,0,0 +-3,313.1,0,0 +-3,312.2,0,0 +-3,311.3,0,0 +-3,310.4,0,0 +-3,309.5,0,0 +-3,308.6,0,0 +-3,307.7,0,0 +-3,306.8,0,0 +-3,305.9,0,0 +-3,305,0,0 +-3,304.1,0,0 +-3,303.2,0,0 +-3,302.3,0,0 +-3,301.4,0,0 +-3,300.5,0,0 +-3,299.5,0,0 +-3,298.6,0,0 +-3,297.7,0,0 +-3,296.8,0,0 +-3,295.9,0,0 +-3,295,0,0 +-3,294.1,0,0 +-3,293.2,0,0 +-3,292.3,0,0 +-3,291.4,0,0 +-3,290.5,0,0 +-3,289.6,0,0 +-3,288.7,0,0 +-3,287.8,0,0 +-3,286.9,0,0 +-3,286,0,0 +-3,285.1,0,0 +-3,284.2,0,0 +-3,283.3,0,0 +-3,282.4,0,0 +-3,281.5,0,0 +-3,280.6,0,0 +-3,279.7,0,0 +-3,278.8,0,0 +-3,277.9,0,0 +-3,277,0,0 +-3,276.1,0,0 +-3,275.2,0,0 +-3,274.3,0,0 +-3,273.4,0,0 +-3,272.5,0,0 +-3,271.6,0,0 +-3,270.7,0,0 +-3,269.8,0,0 +-3,268.9,0,0 +-3,268,0,0 +-3,267.1,0,0 +-3,266.2,0,0 +-3,265.3,0,0 +-3,264.4,0,0 +-3,263.5,0,0 +-3,262.6,0,0 +-3,261.7,0,0 +-3,260.8,0,0 +-3,259.8,0,0 +-3,258.9,0,0 +-3,258,0,0 +-3,257.1,0,0 +-3,256.2,0,0 +-3,255.3,0,0 +-3,254.4,0,0 +-3,253.5,0,0 +-3,252.6,0,0 +-3,251.7,0,0 +-3,250.8,0,0 +-3,249.9,0,0 +-3,249,0,0 +-3,248.1,0,0 +-3,247.2,0,0 +-3,246.3,0,0 +-3,245.4,0,0 +-3,244.5,0,0 +-3,243.6,0,0 +-3,242.7,0,0 +-3,241.8,0,0 +-3,240.9,0,0 +-3,240,0,0 +-3,239.1,0,0 +-3,238.2,0,0 +-3,237.3,0,0 +-3,236.4,0,0 +-3,235.5,0,0 +-3,234.6,0,0 +-3,233.7,0,0 +-3,232.8,0,0 +-3,231.9,0,0 +-3,231,0,0 +-3,230.1,0,0 +-3,229.2,0,0 +-3,228.3,0,0 +-3,227.4,0,0 +-3,226.5,0,0 +-3,225.6,0,0 +-3,224.7,0,0 +-3,223.8,0,0 +-3,222.9,0,0 +-3,222,0,0 +-3,221.1,0,0 +-3,220.2,0,0 +-3,219.2,0,0 +-3,218.3,0,0 +-3,217.4,0,0 +-3,216.5,0,0 +-3,215.6,0,0 +-3,214.7,0,0 +-3,213.8,0,0 +-3,212.9,0,0 +-3,212,0,0 +-3,211.1,0,0 +-3,210.2,0,0 +-3,209.3,0,0 +-3,208.4,0,0 +-3,207.5,0,0 +-3,206.6,0,0 +-3,205.7,0,0 +-3,204.8,0,0 +-3,203.9,0,0 +-3,203,0,0 +-3,202.1,0,0 +-3,201.2,0,0 +-3,200.3,0,0 +-3,199.4,0,0 +-3,198.5,0,0 +-3,197.6,0,0 +-3,196.7,0,0 +-3,195.8,0,0 +-3,194.9,0,0 +-3,194,0,0 +-3,193.1,0,0 +-3,192.2,0,0 +-3,191.3,0,0 +-3,190.4,0,0 +-3,189.5,0,0 +-3,188.6,0,0 +-3,187.7,0,0 +-3,186.8,0,0 +-3,185.9,0,0 +-3,185,0,0 +-3,184.1,0,0 +-3,183.2,0,0 +-3,182.3,0,0 +-3,181.4,0,0 +-3,180.5,0,0 +-3,179.5,-90,0 +-3,178.6,-89.5,0 +-3,177.7,-89.1,0 +-3,176.8,-88.6,0 +-3,175.9,-88.2,0 +-3,175,-87.7,0 +-3,174.1,-87.3,0 +-3,173.2,-86.8,0 +-3,172.3,-86.4,0 +-3,171.4,-85.9,0 +-3,170.5,-85.5,0 +-3,169.6,-85,0 +-3,168.7,-84.6,0 +-3,167.8,-84.1,0 +-3,166.9,-83.7,0 +-3,166,-83.2,0 +-3,165.1,-82.8,0 +-3,164.2,-82.3,0 +-3,163.3,-81.9,0 +-3,162.4,-81.4,0 +-3,161.5,-81,0 +-3,160.6,-80.5,0 +-3,159.7,-80.1,0 +-3,158.8,-79.6,0 +-3,157.9,-79.1,0 +-3,157,-78.7,0 +-3,156.1,-78.2,0 +-3,155.2,-77.8,0 +-3,154.3,-77.3,0 +-3,153.4,-76.9,0 +-3,152.5,-76.4,0 +-3,151.6,-76,0 +-3,150.7,-75.5,0 +-3,149.8,-75.1,0 +-3,148.9,-74.6,0 +-3,148,-74.2,0 +-3,147.1,-73.7,0 +-3,146.2,-73.3,0 +-3,145.3,-72.8,0 +-3,144.4,-72.4,0 +-3,143.5,-71.9,0 +-3,142.6,-71.5,0 +-3,141.7,-71,0 +-3,140.8,-70.6,0 +-3,139.8,-70.1,0 +-3,138.9,-69.6,0 +-3,138,-69.2,0 +-3,137.1,-68.7,0 +-3,136.2,-68.3,0 +-3,135.3,-67.8,0 +-3,134.4,-67.4,0 +-3,133.5,-66.9,0 +-3,132.6,-66.5,0 +-3,131.7,-66,0 +-3,130.8,-65.6,0 +-3,129.9,-65.1,0 +-3,129,-64.7,0 +-3,128.1,-64.2,0 +-3,127.2,-63.8,0 +-3,126.3,-63.3,0 +-3,125.4,-62.9,0 +-3,124.5,-62.4,0 +-3,123.6,-62,0 +-3,122.7,-61.5,0 +-3,121.8,-61.1,0 +-3,120.9,-60.6,0 +-3,120,-60.2,0 +-3,119.1,-59.7,0 +-3,118.2,-59.2,0 +-3,117.3,-58.8,0 +-3,116.4,-58.3,0 +-3,115.5,-57.9,0 +-3,114.6,-57.4,0 +-3,113.7,-57,0 +-3,112.8,-56.5,0 +-3,111.9,-56.1,0 +-3,111,-55.6,0 +-3,110.1,-55.2,0 +-3,109.2,-54.7,0 +-3,108.3,-54.3,0 +-3,107.4,-53.8,0 +-3,106.5,-53.4,0 +-3,105.6,-52.9,0 +-3,104.7,-52.5,0 +-3,103.8,-52,0 +-3,102.9,-51.6,0 +-3,102,-51.1,0 +-3,101.1,-50.7,0 +-3,100.2,-50.2,0 +-3,99.2,-49.7,0 +-3,98.3,-49.3,0 +-3,97.4,-48.8,0 +-3,96.5,-48.4,0 +-3,95.6,-47.9,0 +-3,94.7,-47.5,0 +-3,93.8,-47,0 +-3,92.9,-46.6,0 +-3,92,-46.1,0 +-3,91.1,-45.7,0 +-3,90.2,-45.2,0 +-3,89.3,-44.8,90 +-3,88.4,-44.3,89.1 +-3,87.5,-43.9,88.2 +-3,86.6,-43.4,87.3 +-3,85.7,-43,86.4 +-3,84.8,-42.5,85.5 +-3,83.9,-42.1,84.5 +-3,83,-41.6,83.6 +-3,82.1,-41.2,82.7 +-3,81.2,-40.7,81.8 +-3,80.3,-40.3,80.9 +-3,79.4,-39.8,80 +-3,78.5,-39.3,79.1 +-3,77.6,-38.9,78.2 +-3,76.7,-38.4,77.3 +-3,75.8,-38,76.4 +-3,74.9,-37.5,75.5 +-3,74,-37.1,74.5 +-3,73.1,-36.6,73.6 +-3,72.2,-36.2,72.7 +-3,71.3,-35.7,71.8 +-3,70.4,-35.3,70.9 +-3,69.5,-34.8,70 +-3,68.6,-34.4,69.1 +-3,67.7,-33.9,68.2 +-3,66.8,-33.5,67.3 +-3,65.9,-33,66.4 +-3,65,-32.6,65.5 +-3,64.1,-32.1,64.5 +-3,63.2,-31.7,63.6 +-3,62.3,-31.2,62.7 +-3,61.4,-30.8,61.8 +-3,60.5,-30.3,60.9 +-3,59.5,-29.8,60 +-3,58.6,-29.4,59.1 +-3,57.7,-28.9,58.2 +-3,56.8,-28.5,57.3 +-3,55.9,-28,56.4 +-3,55,-27.6,55.5 +-3,54.1,-27.1,54.5 +-3,53.2,-26.7,53.6 +-3,52.3,-26.2,52.7 +-3,51.4,-25.8,51.8 +-3,50.5,-25.3,50.9 +-3,49.6,-24.9,50 +-3,48.7,-24.4,49.1 +-3,47.8,-24,48.2 +-3,46.9,-23.5,47.3 +-3,46,-23.1,46.4 +-3,45.1,-22.6,45.5 +-3,44.2,-22.2,44.5 +-3,43.3,-21.7,43.6 +-3,42.4,-21.3,42.7 +-3,41.5,-20.8,41.8 +-3,40.6,-20.4,40.9 +-3,39.7,-19.9,40 +-3,38.8,-19.4,39.1 +-3,37.9,-19,38.2 +-3,37,-18.5,37.3 +-3,36.1,-18.1,36.4 +-3,35.2,-17.6,35.5 +-3,34.3,-17.2,34.5 +-3,33.4,-16.7,33.6 +-3,32.5,-16.3,32.7 +-3,31.6,-15.8,31.8 +-3,30.7,-15.4,30.9 +-3,29.8,-14.9,30 +-3,28.9,-14.5,29.1 +-3,28,-14,28.2 +-3,27.1,-13.6,27.3 +-3,26.2,-13.1,26.4 +-3,25.3,-12.7,25.5 +-3,24.4,-12.2,24.5 +-3,23.5,-11.8,23.6 +-3,22.6,-11.3,22.7 +-3,21.7,-10.9,21.8 +-3,20.8,-10.4,20.9 +-3,19.8,-9.9,20 +-3,18.9,-9.5,19.1 +-3,18,-9,18.2 +-3,17.1,-8.6,17.3 +-3,16.2,-8.1,16.4 +-3,15.3,-7.7,15.5 +-3,14.4,-7.2,14.5 +-3,13.5,-6.8,13.6 +-3,12.6,-6.3,12.7 +-3,11.7,-5.9,11.8 +-3,10.8,-5.4,10.9 +-3,9.9,-5,10 +-3,9,-4.5,9.1 +-3,8.1,-4.1,8.2 +-3,7.2,-3.6,7.3 +-3,6.3,-3.2,6.4 +-3,5.4,-2.7,5.5 +-3,4.5,-2.3,4.5 +-3,3.6,-1.8,3.6 +-3,2.7,-1.4,2.7 +-3,1.8,-0.9,1.8 +-3,0.9,-0.5,0.9 +-3,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.3 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.1,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.2,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,1 +0.3,0,0,0.9 +0.3,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.4,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.9 +0.5,0,0,0.8 +0.5,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.6,0,0,0.8 +0.7,0,0,0.8 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.7,0,0,0.7 +0.8,0,0,0.7 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.6 +0.8,0,0,0.5 +0.8,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.5 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.4 +0.9,0,0,0.3 +0.9,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.3 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.2 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0.1 +1,0,0,0 +1,0,0,0 +1,0,0,0 +1,0,0,0 +-3,0,0,0 +-3,0.9,-0.5,0.9 +-3,1.8,-0.9,1.8 +-3,2.7,-1.4,2.7 +-3,3.6,-1.8,3.6 +-3,4.5,-2.3,4.5 +-3,5.4,-2.7,5.5 +-3,6.3,-3.2,6.4 +-3,7.2,-3.6,7.3 +-3,8.1,-4.1,8.2 +-3,9,-4.5,9.1 +-3,9.9,-5,10 +-3,10.8,-5.4,10.9 +-3,11.7,-5.9,11.8 +-3,12.6,-6.3,12.7 +-3,13.5,-6.8,13.6 +-3,14.4,-7.2,14.5 +-3,15.3,-7.7,15.5 +-3,16.2,-8.1,16.4 +-3,17.1,-8.6,17.3 +-3,18,-9,18.2 +-3,18.9,-9.5,19.1 +-3,19.8,-9.9,20 +-3,20.8,-10.4,20.9 +-3,21.7,-10.9,21.8 +-3,22.6,-11.3,22.7 +-3,23.5,-11.8,23.6 +-3,24.4,-12.2,24.5 +-3,25.3,-12.7,25.5 +-3,26.2,-13.1,26.4 +-3,27.1,-13.6,27.3 +-3,28,-14,28.2 +-3,28.9,-14.5,29.1 +-3,29.8,-14.9,30 +-3,30.7,-15.4,30.9 +-3,31.6,-15.8,31.8 +-3,32.5,-16.3,32.7 +-3,33.4,-16.7,33.6 +-3,34.3,-17.2,34.5 +-3,35.2,-17.6,35.5 +-3,36.1,-18.1,36.4 +-3,37,-18.5,37.3 +-3,37.9,-19,38.2 +-3,38.8,-19.4,39.1 +-3,39.7,-19.9,40 +-3,40.6,-20.4,40.9 +-3,41.5,-20.8,41.8 +-3,42.4,-21.3,42.7 +-3,43.3,-21.7,43.6 +-3,44.2,-22.2,44.5 +-3,45.1,-22.6,45.5 +-3,46,-23.1,46.4 +-3,46.9,-23.5,47.3 +-3,47.8,-24,48.2 +-3,48.7,-24.4,49.1 +-3,49.6,-24.9,50 +-3,50.5,-25.3,50.9 +-3,51.4,-25.8,51.8 +-3,52.3,-26.2,52.7 +-3,53.2,-26.7,53.6 +-3,54.1,-27.1,54.5 +-3,55,-27.6,55.5 +-3,55.9,-28,56.4 +-3,56.8,-28.5,57.3 +-3,57.7,-28.9,58.2 +-3,58.6,-29.4,59.1 +-3,59.5,-29.8,60 +-3,60.5,-30.3,60.9 +-3,61.4,-30.8,61.8 +-3,62.3,-31.2,62.7 +-3,63.2,-31.7,63.6 +-3,64.1,-32.1,64.5 +-3,65,-32.6,65.5 +-3,65.9,-33,66.4 +-3,66.8,-33.5,67.3 +-3,67.7,-33.9,68.2 +-3,68.6,-34.4,69.1 +-3,69.5,-34.8,70 +-3,70.4,-35.3,70.9 +-3,71.3,-35.7,71.8 +-3,72.2,-36.2,72.7 +-3,73.1,-36.6,73.6 +-3,74,-37.1,74.5 +-3,74.9,-37.5,75.5 +-3,75.8,-38,76.4 +-3,76.7,-38.4,77.3 +-3,77.6,-38.9,78.2 +-3,78.5,-39.3,79.1 +-3,79.4,-39.8,80 +-3,80.3,-40.3,80.9 +-3,81.2,-40.7,81.8 +-3,82.1,-41.2,82.7 +-3,83,-41.6,83.6 +-3,83.9,-42.1,84.5 +-3,84.8,-42.5,85.5 +-3,85.7,-43,86.4 +-3,86.6,-43.4,87.3 +-3,87.5,-43.9,88.2 +-3,88.4,-44.3,89.1 +-3,89.3,-44.8,90 +-3,90.2,-45.2,0 +-3,91.1,-45.7,0 +-3,92,-46.1,0 +-3,92.9,-46.6,0 +-3,93.8,-47,0 +-3,94.7,-47.5,0 +-3,95.6,-47.9,0 +-3,96.5,-48.4,0 +-3,97.4,-48.8,0 +-3,98.3,-49.3,0 +-3,99.2,-49.7,0 +-3,100.2,-50.2,0 +-3,101.1,-50.7,0 +-3,102,-51.1,0 +-3,102.9,-51.6,0 +-3,103.8,-52,0 +-3,104.7,-52.5,0 +-3,105.6,-52.9,0 +-3,106.5,-53.4,0 +-3,107.4,-53.8,0 +-3,108.3,-54.3,0 +-3,109.2,-54.7,0 +-3,110.1,-55.2,0 +-3,111,-55.6,0 +-3,111.9,-56.1,0 +-3,112.8,-56.5,0 +-3,113.7,-57,0 +-3,114.6,-57.4,0 +-3,115.5,-57.9,0 +-3,116.4,-58.3,0 +-3,117.3,-58.8,0 +-3,118.2,-59.2,0 +-3,119.1,-59.7,0 +-3,120,-60.2,0 +-3,120.9,-60.6,0 +-3,121.8,-61.1,0 +-3,122.7,-61.5,0 +-3,123.6,-62,0 +-3,124.5,-62.4,0 +-3,125.4,-62.9,0 +-3,126.3,-63.3,0 +-3,127.2,-63.8,0 +-3,128.1,-64.2,0 +-3,129,-64.7,0 +-3,129.9,-65.1,0 +-3,130.8,-65.6,0 +-3,131.7,-66,0 +-3,132.6,-66.5,0 +-3,133.5,-66.9,0 +-3,134.4,-67.4,0 +-3,135.3,-67.8,0 +-3,136.2,-68.3,0 +-3,137.1,-68.7,0 +-3,138,-69.2,0 +-3,138.9,-69.6,0 +-3,139.8,-70.1,0 +-3,140.8,-70.6,0 +-3,141.7,-71,0 +-3,142.6,-71.5,0 +-3,143.5,-71.9,0 +-3,144.4,-72.4,0 +-3,145.3,-72.8,0 +-3,146.2,-73.3,0 +-3,147.1,-73.7,0 +-3,148,-74.2,0 +-3,148.9,-74.6,0 +-3,149.8,-75.1,0 +-3,150.7,-75.5,0 +-3,151.6,-76,0 +-3,152.5,-76.4,0 +-3,153.4,-76.9,0 +-3,154.3,-77.3,0 +-3,155.2,-77.8,0 +-3,156.1,-78.2,0 +-3,157,-78.7,0 +-3,157.9,-79.1,0 +-3,158.8,-79.6,0 +-3,159.7,-80.1,0 +-3,160.6,-80.5,0 +-3,161.5,-81,0 +-3,162.4,-81.4,0 +-3,163.3,-81.9,0 +-3,164.2,-82.3,0 +-3,165.1,-82.8,0 +-3,166,-83.2,0 +-3,166.9,-83.7,0 +-3,167.8,-84.1,0 +-3,168.7,-84.6,0 +-3,169.6,-85,0 +-3,170.5,-85.5,0 +-3,171.4,-85.9,0 +-3,172.3,-86.4,0 +-3,173.2,-86.8,0 +-3,174.1,-87.3,0 +-3,175,-87.7,0 +-3,175.9,-88.2,0 +-3,176.8,-88.6,0 +-3,177.7,-89.1,0 +-3,178.6,-89.5,0 +-3,179.5,-90,0 +-3,180.5,0,0 +-3,181.4,0,0 +-3,182.3,0,0 +-3,183.2,0,0 +-3,184.1,0,0 +-3,185,0,0 +-3,185.9,0,0 +-3,186.8,0,0 +-3,187.7,0,0 +-3,188.6,0,0 +-3,189.5,0,0 +-3,190.4,0,0 +-3,191.3,0,0 +-3,192.2,0,0 +-3,193.1,0,0 +-3,194,0,0 +-3,194.9,0,0 +-3,195.8,0,0 +-3,196.7,0,0 +-3,197.6,0,0 +-3,198.5,0,0 +-3,199.4,0,0 +-3,200.3,0,0 +-3,201.2,0,0 +-3,202.1,0,0 +-3,203,0,0 +-3,203.9,0,0 +-3,204.8,0,0 +-3,205.7,0,0 +-3,206.6,0,0 +-3,207.5,0,0 +-3,208.4,0,0 +-3,209.3,0,0 +-3,210.2,0,0 +-3,211.1,0,0 +-3,212,0,0 +-3,212.9,0,0 +-3,213.8,0,0 +-3,214.7,0,0 +-3,215.6,0,0 +-3,216.5,0,0 +-3,217.4,0,0 +-3,218.3,0,0 +-3,219.2,0,0 +-3,220.2,0,0 +-3,221.1,0,0 +-3,222,0,0 +-3,222.9,0,0 +-3,223.8,0,0 +-3,224.7,0,0 +-3,225.6,0,0 +-3,226.5,0,0 +-3,227.4,0,0 +-3,228.3,0,0 +-3,229.2,0,0 +-3,230.1,0,0 +-3,231,0,0 +-3,231.9,0,0 +-3,232.8,0,0 +-3,233.7,0,0 +-3,234.6,0,0 +-3,235.5,0,0 +-3,236.4,0,0 +-3,237.3,0,0 +-3,238.2,0,0 +-3,239.1,0,0 +-3,240,0,0 +-3,240.9,0,0 +-3,241.8,0,0 +-3,242.7,0,0 +-3,243.6,0,0 +-3,244.5,0,0 +-3,245.4,0,0 +-3,246.3,0,0 +-3,247.2,0,0 +-3,248.1,0,0 +-3,249,0,0 +-3,249.9,0,0 +-3,250.8,0,0 +-3,251.7,0,0 +-3,252.6,0,0 +-3,253.5,0,0 +-3,254.4,0,0 +-3,255.3,0,0 +-3,256.2,0,0 +-3,257.1,0,0 +-3,258,0,0 +-3,258.9,0,0 +-3,259.8,0,0 +-3,260.8,0,0 +-3,261.7,0,0 +-3,262.6,0,0 +-3,263.5,0,0 +-3,264.4,0,0 +-3,265.3,0,0 +-3,266.2,0,0 +-3,267.1,0,0 +-3,268,0,0 +-3,268.9,0,0 +-3,269.8,0,0 +-3,270.7,0,0 +-3,271.6,0,0 +-3,272.5,0,0 +-3,273.4,0,0 +-3,274.3,0,0 +-3,275.2,0,0 +-3,276.1,0,0 +-3,277,0,0 +-3,277.9,0,0 +-3,278.8,0,0 +-3,279.7,0,0 +-3,280.6,0,0 +-3,281.5,0,0 +-3,282.4,0,0 +-3,283.3,0,0 +-3,284.2,0,0 +-3,285.1,0,0 +-3,286,0,0 +-3,286.9,0,0 +-3,287.8,0,0 +-3,288.7,0,0 +-3,289.6,0,0 +-3,290.5,0,0 +-3,291.4,0,0 +-3,292.3,0,0 +-3,293.2,0,0 +-3,294.1,0,0 +-3,295,0,0 +-3,295.9,0,0 +-3,296.8,0,0 +-3,297.7,0,0 +-3,298.6,0,0 +-3,299.5,0,0 +-3,300.5,0,0 +-3,301.4,0,0 +-3,302.3,0,0 +-3,303.2,0,0 +-3,304.1,0,0 +-3,305,0,0 +-3,305.9,0,0 +-3,306.8,0,0 +-3,307.7,0,0 +-3,308.6,0,0 +-3,309.5,0,0 +-3,310.4,0,0 +-3,311.3,0,0 +-3,312.2,0,0 +-3,313.1,0,0 +-3,314,0,0 +-3,314.9,0,0 +-3,315.8,0,0 +-3,316.7,0,0 +-3,317.6,0,0 +-3,318.5,0,0 +-3,319.4,0,0 +-3,320.3,0,0 +-3,321.2,0,0 +-3,322.1,0,0 +-3,323,0,0 +-3,323.9,0,0 +-3,324.8,0,0 +-3,325.7,0,0 +-3,326.6,0,0 +-3,327.5,0,0 +-3,328.4,0,0 +-3,329.3,0,0 +-3,330.2,0,0 +-3,331.1,0,0 +-3,332,0,0 +-3,332.9,0,0 +-3,333.8,0,0 +-3,334.7,0,0 +-3,335.6,0,0 +-3,336.5,0,0 +-3,337.4,0,0 +-3,338.3,0,0 +-3,339.2,0,0 +-3,340.2,0,0 +-3,341.1,0,0 +-3,342,0,0 +-3,342.9,0,0 +-3,343.8,0,0 +-3,344.7,0,0 +-3,345.6,0,0 +-3,346.5,0,0 +-3,347.4,0,0 +-3,348.3,0,0 +-3,349.2,0,0 +-3,350.1,0,0 +-3,351,0,0 +-3,351.9,0,0 +-3,352.8,0,0 +-3,353.7,0,0 +-3,354.6,0,0 +-3,355.5,0,0 +-3,356.4,0,0 +-3,357.3,0,0 +-3,358.2,0,0 +-3,359.1,0,0 +-3,360,0,0 -- GitLab From cd5fddfae5d649148cbd3968f63869149ea03edd Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 7 Oct 2025 10:07:45 +0200 Subject: [PATCH 145/147] enable AEID tests again after this was ported to BASOP --- ci/remove_unsupported_testcases.py | 4 ---- tests/renderer/test_renderer.py | 1 - 2 files changed, 5 deletions(-) diff --git a/ci/remove_unsupported_testcases.py b/ci/remove_unsupported_testcases.py index 7d1bc7445c..b83b9c3271 100644 --- a/ci/remove_unsupported_testcases.py +++ b/ci/remove_unsupported_testcases.py @@ -51,10 +51,6 @@ TESTCASES = [ "OSBA 2OA 3ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing", "OSBA 3OA 4ISM at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, object editing, DISC", "OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, EXT out", - # aeid test cases which will change command line format - "Multi-channel 5_1 at 512 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (CREND)", - "Multi-channel 5_1 at 64 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (FastConv)", - "Multi-channel 5_1 at 32 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (ParamBin)", # self_test_ltv.prm "OMASA 2TC 2ISM at 96 kbps, 48kHz in, 48kHz out, FOA out, object editing, JBM Prof 5, DISC", "OMASA 2TC 4ISM at 80 kbps, 48kHz in, 48kHz out, BINAURAL out, default object editing, 1SEP-PARAM", diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index ef080ea15d..108ea0bc9e 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -209,7 +209,6 @@ def test_dynamic_acoustic_environment( ) -@pytest.mark.skip(reason="Not supported for BASOP code currently") @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL[2:]) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) @pytest.mark.parametrize("frame_size", FRAMING_TO_TEST) -- GitLab From 801e7b9b589ab8e6f6438888a04ff658f1a3cdf5 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 7 Oct 2025 10:48:22 +0200 Subject: [PATCH 146/147] re-sync prm files with main --- scripts/config/self_test.prm | 80 +++++++++++++++++--------------- scripts/config/self_test_ltv.prm | 76 +++++++++++++++--------------- 2 files changed, 80 insertions(+), 76 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index aa0413a891..28254ed77c 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -781,6 +781,10 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_EXOF_OtrAvg.tst +// SBA at 128 kbps, 48kHz in, 48kHz out, HOA3 out, mono detector test +../IVAS_cod -sba 3 128000 48 testv/stv3OA48c_mono.wav bit +../IVAS_dec HOA3 48 bit testv/stv3OA48c_mono.pcm_SBA_128000_48-48_HOA3.tst + // SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FER at 5% ../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g192 bit_error @@ -1437,15 +1441,15 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // Multi-channel 5_1 at 512 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (CREND) ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1:200,0:100,2:500 BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_reverb_sequence.tst +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid testv/aeid1.txt BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_reverb_sequence.tst // Multi-channel 5_1 at 64 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (FastConv) ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1:500,2:100,0:300 BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_MC_reverb_sequence.tst +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid testv/aeid2.txt BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_MC_reverb_sequence.tst // Multi-channel 5_1 at 32 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (ParamBin) ../IVAS_cod -mc 5_1 32000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 0:100,2:500,1:200 BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_32000_48-48_MC_reverb_sequence.tst +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid testv/aeid3.txt BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_32000_48-48_MC_reverb_sequence.tst // Multi-channel 5_1 at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config hospital_patientroom ../IVAS_cod -mc 5_1 32000 48 testv/stv51MC48c.wav bit @@ -1582,143 +1586,143 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // stereo at 32 kbps, 48 kHz in, 32 kHz out, DTX on, JBM Prof 0 ../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/stvST48n.wav_stereo_32000_48-32_DTX_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/stvST48n.wav_stereo_32000_48-32_DTX_JBM0.tst // 4 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, DTX on, EXT out, JBM Prof 0 ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/stv4ISM48s.wav_64000_48-48_DTX_EXT_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/stv4ISM48s.wav_64000_48-48_DTX_EXT_JBM0.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 32kHz out, DTX on, EXT out, JBM Prof 0 ../IVAS_cod -dtx -masa 1 testv/stv1MASA1TC48n.met 13200 48 testv/stv1MASA1TC48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 32 netsimoutput testv/stv1MASA1TC48n.wav_13200_48-32_DTX_EXT_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 32 netsimoutput testv/stv1MASA1TC48n.wav_13200_48-32_DTX_EXT_JBM0.tst // SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, JBM 0 ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 32 netsimoutput testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 32 netsimoutput testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_JBM0.tst // stereo at 48 kbps, 16 kHz in, 16 kHz out, DTX on, JBM Prof 5 ../IVAS_cod -stereo -dtx 48000 16 testv/stvST16n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 16 netsimoutput testv/stvST16n.wav_stereo_48000_16-16_DTX_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 16 netsimoutput testv/stvST16n.wav_stereo_48000_16-16_DTX_JBM5.tst // 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out, JBM Prof 5 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv4ISM48s.wav_32000_48-48_FOA_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv4ISM48s.wav_32000_48-48_FOA_JBM5.tst // 3 ISM with metadata bitrate switching from 48 kbps to 32 kbps, 48 kHz in, 32 kHz out, DTX, BINAURAL_ROOM_IR out, JBM Prof 5 ../IVAS_cod -dtx -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv ../scripts/switchPaths/sw_48-32k_10fr.bin 48 testv/stv3ISM48s.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 32 netsimoutput testv/stv3ISM48s.wav_sw_48-32_DTX_BINAURAL_ROOM_IR_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 32 netsimoutput testv/stv3ISM48s.wav_sw_48-32_DTX_BINAURAL_ROOM_IR_JBM5.tst // SBA at 80 kbps, 32kHz in, 32kHz out, HOA3 out, JBM Prof 5 ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP HOA3 32 netsimoutput testv/stv3OA32c.wav_SBA_80000_32-32_HOA3_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP HOA3 32 netsimoutput testv/stv3OA32c.wav_SBA_80000_32-32_HOA3_JBM5.tst // SBA at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -sba 1 13200 48 testv/stvFOA48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvFOA32c.wav_SBA_13200_48-48_BINAURAL_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvFOA32c.wav_SBA_13200_48-48_BINAURAL_JBM5.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, 7_1_4 out, JBM Prof 5 ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv51MC48c.wav_MC51_384000_48-48_7_1_4_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv51MC48c.wav_MC51_384000_48-48_7_1_4_JBM5.tst // Multi-channel 7_1_4 at 256 kbps, 48kHz in, 48kHz out, 7_1_4 out, JBM Prof 5 ../IVAS_cod -mc 7_1_4 256000 48 testv/stv714MC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv714MC48c.wav_MC714_256000_48-48_7_1_4_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv714MC48c.wav_MC714_256000_48-48_7_1_4_JBM5.tst // Multi-channel 7_1 bitrate switching, 48kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, HR, JBM Prof 5 ../IVAS_cod -mc 7_1 ../scripts/switchPaths/sw_24k4_384k.bin 48 testv/stv71MC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -T testv/headrot.csv -Tracefile tracefile_dec -VOIP binaural_room_reverb 32 netsimoutput testv/stv71MC48c.wav_MC71_brsw_48-32_BinauralRoomReverb_Headrot_JBM5.tst +../IVAS_dec -T testv/headrot.csv -no_delay_cmp -Tracefile tracefile_dec -VOIP binaural_room_reverb 32 netsimoutput testv/stv71MC48c.wav_MC71_brsw_48-32_BinauralRoomReverb_Headrot_JBM5.tst // Multi-channel 7_1_4 bitrate switching, 48kHz in, 48kHz out, BINAURAL out, HR, JBM Prof 5 ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_24k4_384k.bin 48 testv/stv714MC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -T testv/headrot.csv -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stv714MC48c.wav_MC714_brsw_48-48_BINAURAL_Headrot_JBM5.tst +../IVAS_dec -T testv/headrot.csv -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stv714MC48c.wav_MC714_brsw_48-48_BINAURAL_Headrot_JBM5.tst // MASA 1dir 1TC bitrate switching from 13.2 kbps to 128 kbps, 48kHz in, 32kHz out, 5_1 out, JBM Prof 5 ../IVAS_cod -masa 1 testv/stv1MASA1TC48n.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/stv1MASA1TC48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 5_1 32 netsimoutput testv/stv1MASA1TC48n.wav_sw_48-32_5_1_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 5_1 32 netsimoutput testv/stv1MASA1TC48n.wav_sw_48-32_5_1_JBM5.tst // MASA 1dir 1TC bitrate switching from 13.2 kbps to 128 kbps, 48kHz in, 48kHz out, STEREO out, JBM Prof 5 ../IVAS_cod -masa 1 testv/stv1MASA1TC48n.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/stv1MASA1TC48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 48 netsimoutput testv/stv1MASA1TC48n.wav_sw_48-48_STEREO_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 48 netsimoutput testv/stv1MASA1TC48n.wav_sw_48-48_STEREO_JBM5.tst // MASA 1dir 1TC bitrate switching from 13.2 kbps to 128 kbps, 48kHz in, 48kHz out, FOA out, JBM Prof 5 ../IVAS_cod -masa 1 testv/stv1MASA1TC48n.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/stv1MASA1TC48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv1MASA1TC48n.wav_sw_48-48_FOA_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv1MASA1TC48n.wav_sw_48-48_FOA_JBM5.tst // MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -masa 2 testv/stv1MASA2TC48n.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv1MASA2TC48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/stv1MASA2TC48n.wav_sw_48-16_BINAURAL_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/stv1MASA2TC48n.wav_sw_48-16_BINAURAL_JBM5.tst // MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 32kHz out, MONO out, JBM Prof 5 ../IVAS_cod -masa 2 testv/stv1MASA2TC48n.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv1MASA2TC48n.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP MONO 32 netsimoutput testv/stv1MASA2TC48n.wav_sw_48-32_MONO_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP MONO 32 netsimoutput testv/stv1MASA2TC48n.wav_sw_48-32_MONO_JBM5.tst // MASA 2dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, EXT out, JBM Prof 5 ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/stv2MASA2TC48c.wav_sw_48-48_EXT_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/stv2MASA2TC48c.wav_sw_48-48_EXT_JBM5.tst // MASA 2dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/stv2MASA2TC48c.wav_sw_48-16_BINAURAL_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/stv2MASA2TC48c.wav_sw_48-16_BINAURAL_JBM5.tst // OMASA 2Dir2TC 1ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, JBM Prof 5 ../IVAS_cod -ism_masa 1 2 testv/stvISM1.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_1ism.bin 48 testv/stvOMASA_1ISM_2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 48 netsimoutput testv/stvOMASA_1ISM_2MASA2TC48c.wav_BINAURAL_ROOM_IR_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 48 netsimoutput testv/stvOMASA_1ISM_2MASA2TC48c.wav_BINAURAL_ROOM_IR_sw_48-48_JBM5.tst // OMASA 2Dir2TC 2ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 48kHz out, 7.1 out, JBM Prof 5 ../IVAS_cod -ism_masa 2 2 testv/stvISM1.csv NULL testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_2ism.bin 48 testv/stvOMASA_2ISM_2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1 48 netsimoutput testv/stvOMASA_2ISM_2MASA2TC48c.wav_7_1_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 7_1 48 netsimoutput testv/stvOMASA_2ISM_2MASA2TC48c.wav_7_1_sw_48-48_JBM5.tst // OMASA 2Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 160 kbps, 48kHz in, 48kHz out, MONO out, JBM Prof 5 ../IVAS_cod -ism_masa 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin 48 testv/stvOMASA_3ISM_2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP MONO 48 netsimoutput testv/stvOMASA_3ISM_2MASA2TC48c.wav_MONO_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP MONO 48 netsimoutput testv/stvOMASA_3ISM_2MASA2TC48c.wav_MONO_sw_48-48_JBM5.tst // OMASA 2Dir1TC 3ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 32kHz out, STEREO out, JBM Prof 5 ../IVAS_cod -ism_masa 3 1 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stv2MASA1TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin 48 testv/stvOMASA_3ISM_2MASA1TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/stvOMASA_3ISM_2MASA1TC48c.wav_STEREO_sw_48-32_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/stvOMASA_3ISM_2MASA1TC48c.wav_STEREO_sw_48-32_JBM5.tst // OMASA 1Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.2 out, JBM Prof 5 ../IVAS_cod -ism_masa 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stv1MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin 32 testv/stvOMASA_3ISM_1MASA2TC32c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 5_1_2 48 netsimoutput testv/stvOMASA_3ISM_1MASA2TC32c.wav_5_1_2_sw_32-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 5_1_2 48 netsimoutput testv/stvOMASA_3ISM_1MASA2TC32c.wav_5_1_2_sw_32-48_JBM5.tst // OMASA 1Dir1TC 4ISM at br sw techs 13.2 to 512 kbps start 32 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -ism_masa 4 1 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv1MASA1TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_1MASA1TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvOMASA_4ISM_1MASA1TC48c.wav_BINAURAL_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvOMASA_4ISM_1MASA1TC48c.wav_BINAURAL_sw_48-48_JBM5.tst // OMASA 1Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, FOA out, JBM Prof 5 ../IVAS_cod -ism_masa 4 2 NULL testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv1MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/stvOMASA_4ISM_1MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stvOMASA_4ISM_1MASA2TC48c.wav_FOA_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stvOMASA_4ISM_1MASA2TC48c.wav_FOA_sw_48-48_JBM5.tst // OMASA 2Dir2TC 4ISM at 256 kbps, 48kHz in, 48kHz out, EXT out, JBM Prof 5 ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv testv/stvISM2.csv NULL testv/stvISM4.csv testv/stv2MASA2TC48c.met 256000 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/stvOMASA_4ISM_2MASA2TC48c.wav_EXT_256000_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/stvOMASA_4ISM_2MASA2TC48c.wav_EXT_256000_48-48_JBM5.tst // OMASA 1Dir1TC 4ISM 48 kbps 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out custom configuration ../IVAS_cod -ism_masa 4 1 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv1MASA1TC48c.met 48000 48 testv/stvOMASA_4ISM_1MASA1TC48c.wav bit @@ -1993,7 +1997,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g // OSBA 2OA 2ISM bitrate switching, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out, JBM Prof 5 ../IVAS_cod -ism_sba 2 2 testv/stvISM1.csv testv/stvISM2.csv ../scripts/switchPaths/sw_24k4_256k.bin 32 testv/stvOSBA_2ISM_2OA32c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_REVERB 48 netsimoutput testv/stvOSBA_2ISM_2OA32c.wav_BINAURAL_brsw_32-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_REVERB 48 netsimoutput testv/stvOSBA_2ISM_2OA32c.wav_BINAURAL_brsw_32-48_JBM5.tst // OMASA 2Dir2TC 4ISM at 80 kbps, 48kHz in, 48kHz out, BINAURAL out, default object editing, 1SEP-PARAM @@ -2003,12 +2007,12 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // OMASA 2Dir2TC 4ISM at 256 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism_masa 4 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv testv/stv2MASA2TC48c.met 256000 48 testv/stvOMASA_4ISM_2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_256000_48-48_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stvOMASA_4ISM_2MASA2TC48c.wav_BINAURAL_256000_48-48_OE_JBM5.tst // OMASA 2Dir2TC 2ISM at 96 kbps, 48kHz in, 48kHz out, FOA out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism_masa 2 2 testv/stvISM1.csv testv/stvISM2.csv testv/stv2MASA2TC48c.met 96000 48 testv/stvOMASA_2ISM_2MASA2TC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stvOMASA_2ISM_2MASA2TC48c.wav_FOA_96000_48-48_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stvOMASA_2ISM_2MASA2TC48c.wav_FOA_96000_48-48_OE_JBM5.tst // OMASA 2Dir2TC 2ISM br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_masa 2 2 testv/stvISM1.csv testv/stvISM2.csv testv/stv2MASA2TC48c.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_2ism.bin 48 testv/stvOMASA_2ISM_2MASA2TC48c.wav bit @@ -2021,7 +2025,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // OSBA 2OA 3ISM at 128 kbps, 48kHz in, 48kHz out, FOA out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stvOSBA_3ISM_2OA48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stvOSBA_3ISM_2OA48c.wav_FOA_128000_48-48_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stvOSBA_3ISM_2OA48c.wav_FOA_128000_48-48_OE_JBM5.tst // OSBA 2OA 3ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_sba 3 2 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stvOSBA_3ISM_2OA48c.wav bit @@ -2039,12 +2043,12 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, FOA out, object editing, JBM Prof 5, PARAM_ISM ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv3ISM48s.wav_24400_48-48_FOA_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv3ISM48s.wav_24400_48-48_FOA_OE_JBM5.tst // 3 ISM with metadata at 384 kbps, 48 kHz in, 48 kHz out, FOA out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 384000 48 testv/stv3ISM48s.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit NULL -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv3ISM48s.wav_384000_48-48_FOA_OE_JBM5.tst +../IVAS_dec -obj_edit NULL -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/stv3ISM48s.wav_384000_48-48_FOA_OE_JBM5.tst // 4 ISM with metadata bitrate switching from 32 kbps to 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out, object editing ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_32-48k_10fr.bin 48 testv/stv4ISM48s.wav bit @@ -2053,4 +2057,4 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // 4 ISM with metadata bitrate switching from 48 kbps to 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out, object editing, JBM Prof 5 ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_48-32k_10fr.bin 48 testv/stv4ISM48s.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stv4ISM48s.wav_sw_48-48_BINAURAL_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/stv4ISM48s.wav_sw_48-48_BINAURAL_OE_JBM5.tst diff --git a/scripts/config/self_test_ltv.prm b/scripts/config/self_test_ltv.prm index 6f924103eb..5db028d50a 100644 --- a/scripts/config/self_test_ltv.prm +++ b/scripts/config/self_test_ltv.prm @@ -1437,15 +1437,15 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // Multi-channel 5_1 at 512 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (CREND) ../IVAS_cod -mc 5_1 512000 48 testv/ltv48_MC51.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1:500,0:1000,2:500 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_MC51wav_MC51_512000_48-48_MC_reverb_sequence.tst +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid testv/aeid1.txt BINAURAL_ROOM_REVERB 48 bit testv/ltv48_MC51wav_MC51_512000_48-48_MC_reverb_sequence.tst // Multi-channel 5_1 at 64 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (FastConv) ../IVAS_cod -mc 5_1 64000 48 testv/ltv48_MC51.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 1:500,2:500,0:500 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_MC51.wav_MC51_64000_48-48_MC_reverb_sequence.tst +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid testv/aeid2.txt BINAURAL_ROOM_REVERB 48 bit testv/ltv48_MC51.wav_MC51_64000_48-48_MC_reverb_sequence.tst // Multi-channel 5_1 at 32 kbps, 48kHz in 48kHz out, BINAURAL_ROOM_REVERB out custom acoustic environment with a sequence (ParamBin) ../IVAS_cod -mc 5_1 32000 48 testv/ltv48_MC51.wav bit -../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid 0:1000,2:500,1:500 BINAURAL_ROOM_REVERB 48 bit testv/ltv48_MC51.wav_MC51_32000_48-48_MC_reverb_sequence.tst +../IVAS_dec -render_config testv/rend_config_combined.cfg -aeid testv/aeid3.txt BINAURAL_ROOM_REVERB 48 bit testv/ltv48_MC51.wav_MC51_32000_48-48_MC_reverb_sequence.tst // Multi-channel 5_1 at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config hospital_patientroom ../IVAS_cod -mc 5_1 32000 48 testv/ltv48_MC51.wav bit @@ -1582,143 +1582,143 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // stereo at 32 kbps, 48 kHz in, 32 kHz out, DTX on, JBM Prof 0 ../IVAS_cod -stereo -dtx 32000 48 testv/ltv48_STEREO.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/ltv48_STEREO.wav_stereo_32000_48-32_DTX_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/ltv48_STEREO.wav_stereo_32000_48-32_DTX_JBM0.tst // 4 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, DTX on, EXT out, JBM Prof 0 ../IVAS_cod -dtx -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 64000 48 testv/ltv48_4ISM.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_4ISM.wav_64000_48-48_DTX_EXT_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_4ISM.wav_64000_48-48_DTX_EXT_JBM0.tst // MASA 1dir 1TC at 13.2 kbps, 48kHz in, 32kHz out, DTX on, EXT out, JBM Prof 0 ../IVAS_cod -dtx -masa 1 testv/ltv48_MASA1TC.met 13200 48 testv/ltv48_MASA1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 32 netsimoutput testv/ltv48_MASA1TC.wav_13200_48-32_DTX_EXT_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 32 netsimoutput testv/ltv48_MASA1TC.wav_13200_48-32_DTX_EXT_JBM0.tst // SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, JBM 0 ../IVAS_cod -sba 3 -dtx 24400 32 testv/ltv32_HOA3.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_0.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 32 netsimoutput testv/ltv32_HOA3.wav_SBA_24400_32-32_DTX_Binaural_JBM0.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 32 netsimoutput testv/ltv32_HOA3.wav_SBA_24400_32-32_DTX_Binaural_JBM0.tst // stereo at 48 kbps, 16 kHz in, 16 kHz out, DTX on, JBM Prof 5 ../IVAS_cod -stereo -dtx 48000 16 testv/ltv16_STEREO.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 16 netsimoutput testv/ltv16_STEREO.wav_stereo_48000_16-16_DTX_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 16 netsimoutput testv/ltv16_STEREO.wav_stereo_48000_16-16_DTX_JBM5.tst // 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out, JBM Prof 5 ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 32000 48 testv/ltv48_4ISM.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_4ISM.wav_32000_48-48_FOA_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_4ISM.wav_32000_48-48_FOA_JBM5.tst // 3 ISM with metadata bitrate switching from 48 kbps to 32 kbps, 48 kHz in, 32 kHz out, DTX, BINAURAL_ROOM_IR out, JBM Prof 5 ../IVAS_cod -dtx -ism 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv ../scripts/switchPaths/sw_48-32k_10fr.bin 48 testv/ltv48_3ISM.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 32 netsimoutput testv/ltv48_3ISM.wav_sw_48-32_DTX_BINAURAL_ROOM_IR_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 32 netsimoutput testv/ltv48_3ISM.wav_sw_48-32_DTX_BINAURAL_ROOM_IR_JBM5.tst // SBA at 80 kbps, 32kHz in, 32kHz out, HOA3 out, JBM Prof 5 ../IVAS_cod -sba 3 80000 32 testv/ltv32_HOA3.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP HOA3 32 netsimoutput testv/ltv32_HOA3.wav_SBA_80000_32-32_HOA3_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP HOA3 32 netsimoutput testv/ltv32_HOA3.wav_SBA_80000_32-32_HOA3_JBM5.tst // SBA at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -sba 1 13200 48 testv/ltv48_FOA.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_FOA.wav_SBA_13200_48-48_BINAURAL_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_FOA.wav_SBA_13200_48-48_BINAURAL_JBM5.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, 7_1_4 out, JBM Prof 5 ../IVAS_cod -mc 5_1 384000 48 testv/ltv48_MC51.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/ltv48_MC51.wav_MC51_384000_48-48_7_1_4_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/ltv48_MC51.wav_MC51_384000_48-48_7_1_4_JBM5.tst // Multi-channel 7_1_4 at 256 kbps, 48kHz in, 48kHz out, 7_1_4 out, JBM Prof 5 ../IVAS_cod -mc 7_1_4 256000 48 testv/ltv48_MC714.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/ltv48_MC714.wav_MC714_256000_48-48_7_1_4_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/ltv48_MC714.wav_MC714_256000_48-48_7_1_4_JBM5.tst // Multi-channel 7_1 bitrate switching, 48kHz in, 32kHz out, BINAURAL_ROOM_REVERB out, HR, JBM Prof 5 ../IVAS_cod -mc 7_1 ../scripts/switchPaths/sw_24k4_384k.bin 48 testv/ltv48_MC71.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -T testv/headrot.csv -Tracefile tracefile_dec -VOIP binaural_room_reverb 32 netsimoutput testv/ltv48_MC71.wav_MC71_brsw_48-32_BinauralRoomReverb_Headrot_JBM5.tst +../IVAS_dec -T testv/headrot.csv -no_delay_cmp -Tracefile tracefile_dec -VOIP binaural_room_reverb 32 netsimoutput testv/ltv48_MC71.wav_MC71_brsw_48-32_BinauralRoomReverb_Headrot_JBM5.tst // Multi-channel 7_1_4 bitrate switching, 48kHz in, 48kHz out, BINAURAL out, HR, JBM Prof 5 ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_24k4_384k.bin 48 testv/ltv48_MC714.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -T testv/headrot.csv -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_MC714.wav_MC714_brsw_48-48_BINAURAL_Headrot_JBM5.tst +../IVAS_dec -T testv/headrot.csv -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_MC714.wav_MC714_brsw_48-48_BINAURAL_Headrot_JBM5.tst // MASA 1TC bitrate switching from 13.2 kbps to 128 kbps, 48kHz in, 32kHz out, 5_1 out, JBM Prof 5 ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/ltv48_MASA1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 5_1 32 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-32_5_1_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 5_1 32 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-32_5_1_JBM5.tst // MASA 1TC bitrate switching from 13.2 kbps to 128 kbps, 48kHz in, 48kHz out, STEREO out, JBM Prof 5 ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/ltv48_MASA1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 48 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-48_STEREO_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 48 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-48_STEREO_JBM5.tst // MASA 1TC bitrate switching from 13.2 kbps to 128 kbps, 48kHz in, 48kHz out, FOA out, JBM Prof 5 ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/ltv48_MASA1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-48_FOA_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-48_FOA_JBM5.tst // MASA 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MASA2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-16_BINAURAL_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-16_BINAURAL_JBM5.tst // MASA 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 32kHz out, MONO out, JBM Prof 5 ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MASA2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP MONO 32 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-32_MONO_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP MONO 32 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-32_MONO_JBM5.tst // MASA 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, EXT out, JBM Prof 5 ../IVAS_cod -masa 2 testv/ltv48_MASA2TC.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MASA2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-48_EXT_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_MASA2TC.wav_sw_48-48_EXT_JBM5.tst // MASA 1TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -masa 1 testv/ltv48_MASA1TC.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_MASA1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-16_BINAURAL_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 16 netsimoutput testv/ltv48_MASA1TC.wav_sw_48-16_BINAURAL_JBM5.tst // OMASA 2TC 1ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, JBM Prof 5 ../IVAS_cod -ism_masa 1 2 testv/ltv48_OMASA_1ISM_2TC_ISM1.csv testv/ltv48_OMASA_1ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_1ism.bin 48 testv/ltv48_OMASA_1ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 48 netsimoutput testv/ltv48_OMASA_1ISM_2TC.wav_BINAURAL_ROOM_IR_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_IR 48 netsimoutput testv/ltv48_OMASA_1ISM_2TC.wav_BINAURAL_ROOM_IR_sw_48-48_JBM5.tst // OMASA 2TC 2ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 48kHz out, 7.1 out, JBM Prof 5 ../IVAS_cod -ism_masa 2 2 testv/ltv48_OMASA_2ISM_2TC_ISM1.csv NULL testv/ltv48_OMASA_2ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_2ism.bin 48 testv/ltv48_OMASA_2ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1 48 netsimoutput testv/ltv48_OMASA_2ISM_2TC.wav_7_1_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 7_1 48 netsimoutput testv/ltv48_OMASA_2ISM_2TC.wav_7_1_sw_48-48_JBM5.tst // OMASA 2TC 3ISM at br sw techs 13.2 to 512 kbps start 160 kbps, 48kHz in, 48kHz out, MONO out, JBM Prof 5 ../IVAS_cod -ism_masa 3 2 testv/ltv48_OMASA_3ISM_2TC_ISM1.csv testv/ltv48_OMASA_3ISM_2TC_ISM2.csv testv/ltv48_OMASA_3ISM_2TC_ISM3.csv testv/ltv48_OMASA_3ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_160k_omasatechs_3ism.bin 48 testv/ltv48_OMASA_3ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP MONO 48 netsimoutput testv/ltv48_OMASA_3ISM_2TC.wav_MONO_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP MONO 48 netsimoutput testv/ltv48_OMASA_3ISM_2TC.wav_MONO_sw_48-48_JBM5.tst // OMASA 1TC 3ISM at br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 32kHz out, STEREO out, JBM Prof 5 ../IVAS_cod -ism_masa 3 1 testv/ltv48_OMASA_3ISM_1TC_ISM1.csv testv/ltv48_OMASA_3ISM_1TC_ISM2.csv testv/ltv48_OMASA_3ISM_1TC_ISM3.csv testv/ltv48_OMASA_3ISM_1TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_3ism.bin 48 testv/ltv48_OMASA_3ISM_1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/ltv48_OMASA_3ISM_1TC.wav_STEREO_sw_48-32_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP STEREO 32 netsimoutput testv/ltv48_OMASA_3ISM_1TC.wav_STEREO_sw_48-32_JBM5.tst // OMASA 2TC 3ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.2 out, JBM Prof 5 ../IVAS_cod -ism_masa 3 2 testv/ltv48_OMASA_3ISM_2TC_ISM1.csv testv/ltv48_OMASA_3ISM_2TC_ISM2.csv testv/ltv48_OMASA_3ISM_2TC_ISM3.csv testv/ltv48_OMASA_3ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_24k4_omasatechs_3ism.bin 32 testv/ltv32_OMASA_3ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP 5_1_2 48 netsimoutput testv/ltv32_OMASA_3ISM_2TC.wav_5_1_2_sw_32-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP 5_1_2 48 netsimoutput testv/ltv32_OMASA_3ISM_2TC.wav_5_1_2_sw_32-48_JBM5.tst // OMASA 1TC 4ISM at br sw techs 13.2 to 512 kbps start 32 kbps, 48kHz in, 48kHz out, BINAURAL out, JBM Prof 5 ../IVAS_cod -ism_masa 4 1 testv/ltv48_OMASA_4ISM_1TC_ISM1.csv testv/ltv48_OMASA_4ISM_1TC_ISM2.csv testv/ltv48_OMASA_4ISM_1TC_ISM3.csv testv/ltv48_OMASA_4ISM_1TC_ISM4.csv testv/ltv48_OMASA_4ISM_1TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_32k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_1TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_OMASA_4ISM_1TC.wav_BINAURAL_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_OMASA_4ISM_1TC.wav_BINAURAL_sw_48-48_JBM5.tst // OMASA 2TC 4ISM at br sw techs 13.2 to 512 kbps start 80 kbps, 48kHz in, 48kHz out, FOA out, JBM Prof 5 ../IVAS_cod -ism_masa 4 2 NULL testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_80k_omasatechs_4ism.bin 48 testv/ltv48_OMASA_4ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_FOA_sw_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_FOA_sw_48-48_JBM5.tst // OMASA 2TC 4ISM at 256 kbps, 48kHz in, 48kHz out, EXT out, JBM Prof 5 ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv NULL testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met 256000 48 testv/ltv48_OMASA_4ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_EXT_256000_48-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP EXT 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_EXT_256000_48-48_JBM5.tst // OMASA 1TC 4ISM 48 kbps 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out custom configuration ../IVAS_cod -ism_masa 4 1 testv/ltv48_OMASA_4ISM_1TC_ISM1.csv testv/ltv48_OMASA_4ISM_1TC_ISM2.csv testv/ltv48_OMASA_4ISM_1TC_ISM3.csv testv/ltv48_OMASA_4ISM_1TC_ISM4.csv testv/ltv48_OMASA_4ISM_1TC.met 48000 48 testv/ltv48_OMASA_4ISM_1TC.wav bit @@ -1993,7 +1993,7 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g // OSBA 2OA 2ISM bitrate switching, 32kHz in, 48kHz out, BINAURAL_ROOM_REVERB out, JBM Prof 5 ../IVAS_cod -ism_sba 2 2 testv/ltvISM1.csv testv/ltvISM2.csv ../scripts/switchPaths/sw_24k4_256k.bin 32 testv/ltv32_OSBA_2ISM_HOA2.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_REVERB 48 netsimoutput testv/ltv32_OSBA_2ISM_HOA2.wav_BINAURAL_brsw_32-48_JBM5.tst +../IVAS_dec -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL_ROOM_REVERB 48 netsimoutput testv/ltv32_OSBA_2ISM_HOA2.wav_BINAURAL_brsw_32-48_JBM5.tst // OMASA 2TC 4ISM at 80 kbps, 48kHz in, 48kHz out, BINAURAL out, default object editing, 1SEP-PARAM @@ -2003,12 +2003,12 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // OMASA 2TC 4ISM at 256 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism_masa 4 2 testv/ltv48_OMASA_4ISM_2TC_ISM1.csv testv/ltv48_OMASA_4ISM_2TC_ISM2.csv testv/ltv48_OMASA_4ISM_2TC_ISM3.csv testv/ltv48_OMASA_4ISM_2TC_ISM4.csv testv/ltv48_OMASA_4ISM_2TC.met 256000 48 testv/ltv48_OMASA_4ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_256000_48-48_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_OMASA_4ISM_2TC.wav_BINAURAL_256000_48-48_OE_JBM5.tst // OMASA 2TC 2ISM at 96 kbps, 48kHz in, 48kHz out, FOA out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism_masa 2 2 testv/ltv48_OMASA_2ISM_2TC_ISM1.csv testv/ltv48_OMASA_2ISM_2TC_ISM2.csv testv/ltv48_OMASA_2ISM_2TC.met 96000 48 testv/ltv48_OMASA_2ISM_2TC.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OMASA_2ISM_2TC.wav_FOA_96000_48-48_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OMASA_2ISM_2TC.wav_FOA_96000_48-48_OE_JBM5.tst // OMASA 2TC 2ISM br sw techs 13.2 to 512 kbps start 48 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_masa 2 2 testv/ltv48_OMASA_2ISM_2TC_ISM1.csv testv/ltv48_OMASA_2ISM_2TC_ISM2.csv testv/ltv48_OMASA_2ISM_2TC.met ../scripts/switchPaths/sw_13k2_512k_2fr_start_48k_omasatechs_2ism.bin 48 testv/ltv48_OMASA_2ISM_2TC.wav bit @@ -2021,7 +2021,7 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // OSBA 2OA 3ISM at 128 kbps, 48kHz in, 48kHz out, FOA out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism_sba 3 2 testv/ltv48_OSBA_3ISM_HOA2_ISM1.csv testv/ltv48_OSBA_3ISM_HOA2_ISM2.csv testv/ltv48_OSBA_3ISM_HOA2_ISM3.csv 128000 48 testv/ltv48_OSBA_3ISM_HOA2.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OSBA_3ISM_HOA2.wav_FOA_128000_48-48_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_OSBA_3ISM_HOA2.wav_FOA_128000_48-48_OE_JBM5.tst // OSBA 2OA 3ISM at bitrate switching 13.2 to 512 kbps, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_sba 3 2 testv/ltv48_OSBA_3ISM_HOA2_ISM1.csv testv/ltv48_OSBA_3ISM_HOA2_ISM2.csv testv/ltv48_OSBA_3ISM_HOA2_ISM3.csv ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/ltv48_OSBA_3ISM_HOA2.wav bit @@ -2039,12 +2039,12 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_5pct.g1 // 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, FOA out, object editing, JBM Prof 5, PARAM_ISM ../IVAS_cod -ism 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv 24400 48 testv/ltv48_3ISM.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_3ISM.wav_24400_48-48_FOA_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_3ISM.wav_24400_48-48_FOA_OE_JBM5.tst // 3 ISM with metadata at 384 kbps, 48 kHz in, 48 kHz out, FOA out, object editing, JBM Prof 5, DISC ../IVAS_cod -ism 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv 384000 48 testv/ltv48_3ISM.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit NULL -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_3ISM.wav_384000_48-48_FOA_OE_JBM5.tst +../IVAS_dec -obj_edit NULL -no_delay_cmp -Tracefile tracefile_dec -VOIP FOA 48 netsimoutput testv/ltv48_3ISM.wav_384000_48-48_FOA_OE_JBM5.tst // 4 ISM with metadata bitrate switching from 32 kbps to 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out, object editing ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_32-48k_10fr.bin 48 testv/ltv48_4ISM.wav bit @@ -2053,4 +2053,4 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit // 4 ISM with metadata bitrate switching from 48 kbps to 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out, object editing, JBM Prof 5 ../IVAS_cod -ism 4 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv ../scripts/switchPaths/sw_48-32k_10fr.bin 48 testv/ltv48_4ISM.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 -../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_4ISM.wav_sw_48-48_BINAURAL_OE_JBM5.tst +../IVAS_dec -obj_edit ../scripts/object_edit/combined_edit.txt -no_delay_cmp -Tracefile tracefile_dec -VOIP BINAURAL 48 netsimoutput testv/ltv48_4ISM.wav_sw_48-48_BINAURAL_OE_JBM5.tst -- GitLab From 91609ef947307e6e3f9b90466052927e9c3aad45 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 7 Oct 2025 11:18:43 +0200 Subject: [PATCH 147/147] add mono detector testfile --- scripts/testv/stv3OA48c_mono.wav | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 scripts/testv/stv3OA48c_mono.wav diff --git a/scripts/testv/stv3OA48c_mono.wav b/scripts/testv/stv3OA48c_mono.wav new file mode 100644 index 0000000000..32ae003301 --- /dev/null +++ b/scripts/testv/stv3OA48c_mono.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8acde6119ad9a2f2daab08912da7ff2b580447f94a7961b4ab9747eb84a134a +size 30720844 -- GitLab