From 5d8d12e3564942f55932b9278a69917d0aa8ef82 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 15 Apr 2025 11:13:25 +0200 Subject: [PATCH 01/61] 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 02/61] 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 03/61] 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 04/61] [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 05/61] 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 06/61] 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 07/61] 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 08/61] 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 09/61] 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 10/61] 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 11/61] 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 12/61] 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 13/61] 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 14/61] 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 15/61] 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 16/61] 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 17/61] 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 18/61] 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 19/61] 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 20/61] 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 21/61] 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 22/61] 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 23/61] 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 24/61] 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 25/61] 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 26/61] 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 27/61] 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 28/61] 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 29/61] 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 30/61] 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 31/61] 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 32/61] 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 33/61] 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 34/61] 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 35/61] 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 36/61] 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 37/61] 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 1571d77dcc2a9bca28a2deecdfbd9c1eea7f3989 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Tue, 12 Aug 2025 12:15:40 +0200 Subject: [PATCH 38/61] 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 39/61] 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 40/61] 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 41/61] 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 42/61] 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 43/61] 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 44/61] 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 45/61] 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 46/61] 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 47/61] 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 d7fd842515cda390c0b770c9421c27f3bea9e1c4 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 14 Aug 2025 11:35:21 +0200 Subject: [PATCH 48/61] [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 49/61] 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 50/61] 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 51/61] 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 52/61] 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 53/61] 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 54/61] 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 55/61] 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 56/61] 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 57/61] 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 58/61] [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 59/61] 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 60/61] 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 61/61] 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