diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..387d48cf9c37706d166fe0058858fd32df573095 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git/ +__pycache__/ +*.py[cod] +.ipynb_checkpoints/ +.gradio/ +.vscode/ +gradio/output/ +gradio/.gradio_tmp/ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..52c3c9fcd19375e1fd2fd97790feb94371b677fa --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..50da045fbe2ecee3e23cbb0e85e8b3ed739a335b --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +__pycache__/ +*.py[cod] +*.so +.ipynb_checkpoints/ + +.gradio/ +gradio/output/ +gradio/.gradio_tmp/ +.vscode/ +.DS_Store +*.egg-info/ +.gradio_tmp/ +gradio/.gradio/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d35bbffa1feb2fd3a56c17595a1ef580d255d524 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.11-slim + +ENV DEBIAN_FRONTEND=noninteractive \ + PIP_NO_CACHE_DIR=1 \ + PYTHONUNBUFFERED=1 \ + PORT=7860 \ + GRADIO_SERVER_NAME=0.0.0.0 \ + SATA_DEVICE=cpu \ + SATA_GEN_DEVICE=cpu + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + git \ + curl \ + ffmpeg \ + libglib2.0-0 \ + libgl1 \ + libgomp1 \ + libsm6 \ + libx11-6 \ + libxext6 \ + libxrender1 \ + libegl1 \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +COPY . /app + +RUN python -m pip install --upgrade pip setuptools wheel +RUN python -m pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121 +RUN python -m pip install torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.5.1+cu121.html +RUN python -m pip install torch_geometric==2.7.0 +RUN python -m pip install -r requirements-hf.txt +RUN python -m pip install https://github.com/openai/CLIP/archive/refs/heads/main.zip +RUN python -m pip install --no-build-isolation chumpy==0.70 && python scripts/patch_chumpy.py +RUN python -m pip install -e . +RUN mkdir -p /app/gradio/output /app/gradio/.gradio_tmp + +EXPOSE 7860 +CMD ["python", "app.py"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..3c4dfe081ce477528cd0ddd6da48bf092a02a3f7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,187 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000000000000000000000000000000000..e3a204c2a1d03835b142dd487d4a6488570cb3a0 --- /dev/null +++ b/NOTICE @@ -0,0 +1,31 @@ +SATA: Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation +Copyright 2026 Zongye Zhang and contributors + +The original SATA code in this repository is licensed under the Apache License, +Version 2.0. See the LICENSE file for the full license text. + +Third-party submodules +---------------------- + +This repository references the following external projects as Git submodules. +They are not relicensed by the top-level Apache License. Their use, +redistribution, and citation requirements are governed by the licenses and +notices in the corresponding upstream repositories: + +- src/fairmotion: https://github.com/zzysteve/fairmotion.git +- src/mdm: https://github.com/zzysteve/SATA-motion-diffusion-model.git +- src/momask-preenc: https://github.com/zzysteve/SATA-momask-codes.git + +Please review the license files in each submodule or upstream repository before +using or redistributing those components. + +Files or assets outside the submodules that carry their own copyright or +license notices remain governed by those notices and are not relicensed by this +file. + +External artifacts +------------------ + +Model checkpoints, datasets, demo assets, body models, and other downloaded +artifacts may have separate license terms. They are not covered by the top-level +Apache License unless explicitly stated by their respective providers. diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..02c9614165fa4b3a6eb4192c63d69335564c6719 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +--- +title: SATA Demo +sdk: docker +app_port: 7860 +suggested_hardware: cpu-basic +pinned: false +license: apache-2.0 +--- + +# SATA: Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation + +[![Project Page](https://img.shields.io/badge/Project-Page-blue)](https://zzysteve.github.io/project_pages/sata.html) +[![arXiv](https://img.shields.io/badge/arXiv-b31b1b)](https://arxiv.org/abs/2605.27055) +[![Code](https://img.shields.io/badge/Code-GitHub-black)](https://github.com/zzysteve/SATA) + +Official Hugging Face Space demo for **Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation**. + +SATA is a semantic-aware, topology-agnostic motion representation framework for heterogeneous character animation. It learns a unified latent motion manifold across diverse skeletal topologies and supports motion reconstruction, text-to-motion generation, and zero-shot cross-species retargeting. + +## Hugging Face Space + +This repository packages the Gradio demo for Hugging Face Spaces using the Docker SDK. The hosted Space is configured to run on CPU by default. + +This Space copy keeps deployment-specific runtime adjustments: + +- the app listens on the Hugging Face `PORT` environment variable, defaulting to `7860`; +- CPU is used by default through `SATA_DEVICE=cpu` and `SATA_GEN_DEVICE=cpu`; +- demo assets and checkpoints are included in the Space repository so the container can start without a separate artifact download step; +- MDM text-to-latent generation avoids SMPL-backed xyz conversion because the demo only saves latent `z` outputs. + +If the Space is moved to GPU hardware later, set `SATA_DEVICE=cuda:0` and `SATA_GEN_DEVICE=cuda:0` in the Space environment. + +Run command inside the container: + +```shell +python app.py +``` + +## Main Repository + +The source release is maintained at: + +```text +https://github.com/zzysteve/SATA +``` + +## Citation + +```bibtex +@inproceedings{zhang2026sata, + title = {Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation}, + author = {Zongye Zhang and Yuzhuo Cui and Qingjie Liu and Yunhong Wang}, + booktitle = {Proceedings of the International Conference on Machine Learning}, + year = {2026}, + note = {To appear. arXiv:2605.27055}, + url = {https://arxiv.org/abs/2605.27055}, +} +``` + +## Contact + +For questions about the project, please contact the authors or open an issue after the initial code release. + +## License + +The original SATA code in this repository is released under the Apache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE). + +The following bundled external components remain governed by their respective upstream licenses: + +```text +src/fairmotion https://github.com/zzysteve/fairmotion.git +src/mdm https://github.com/zzysteve/SATA-motion-diffusion-model.git +src/momask-preenc https://github.com/zzysteve/SATA-momask-codes.git +``` + +Please refer to the license files in each component or upstream repository before using or redistributing those components. Files or assets that carry their own copyright or license notices remain governed by those notices. Model checkpoints, datasets, demo assets, body models, and other downloaded artifacts may have separate terms and are not covered by the top-level Apache License unless explicitly stated by their providers. diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..69ab6e89aea3ed6cd1d8ff4f5082a1320fea5032 --- /dev/null +++ b/app.py @@ -0,0 +1,502 @@ +""" +SATA Demo + +Retarget: + Task 1: Human -> Human + Task 2: Animo -> Animo + Task 3: Human -> Animo + Task 4: Animo -> Human + +Generation: + Task 5: Text -> Motion +""" +import os +import sys +import threading +import time +import uuid + +# Path setup +RELEASE_DIR = os.path.dirname(os.path.abspath(__file__)) +GRADIO_DIR = os.path.join(RELEASE_DIR, 'gradio') +sys.path.insert(0, GRADIO_DIR) +sys.path.insert(0, os.path.join(RELEASE_DIR, 'src')) +sys.path.insert(0, os.path.join(RELEASE_DIR, 'src', 'fairmotion')) +sys.path.insert(0, os.path.join(RELEASE_DIR, 'src', 'Visualization')) + +# Gradio 6 reads DEFAULT_TEMP_DIR at import time, so set it first. +_gradio_tmp = os.path.join(GRADIO_DIR, ".gradio_tmp") +os.makedirs(_gradio_tmp, exist_ok=True) +os.environ["GRADIO_TEMP_DIR"] = _gradio_tmp + +import gradio as gr + +from config import ( + OUTPUT_DIR, MODEL_TYPE, MODEL_EPOCH, DEVICE, + TASK1_Z_OPTIONS, TASK1_SKEL_OPTIONS, + TASK2_Z_OPTIONS, TASK2_SKEL_OPTIONS, + TASK3_PAIRS, TASK4_PAIRS, + GEN_DEVICE, GEN_DEFAULT_MOTION_FRAMES, + GEN_MIN_MOTION_FRAMES, GEN_MAX_MOTION_FRAMES, + GEN_MODEL_OPTIONS, HUMAN_GEN_SKEL_OPTIONS, +) +from bvh_stick_viewer import get_bvh_viewer_html, iframe_html_for_motion + + +# ════════════════════════════════════════════════════════════ +# Model loading (lazy and thread-safe) +# ════════════════════════════════════════════════════════════ +_model_state = None +_model_lock = threading.Lock() + +def get_model_state(): + global _model_state + if _model_state is None: + with _model_lock: + if _model_state is None: + print("[model] Loading model...") + from sata.utils.model_loading import load_model_by_type + model, cfg, ms_dict = load_model_by_type(MODEL_TYPE, MODEL_EPOCH, DEVICE) + model = model.to(DEVICE) + model.eval() + _model_state = (model, cfg, ms_dict) + print("[model] Model loaded.") + return _model_state + + +# ════════════════════════════════════════════════════════════ +# Decode and render helpers +# ════════════════════════════════════════════════════════════ +VIEWER_H = 360 + + +def empty_viewer(title): + return iframe_html_for_motion(None, title=title, height=VIEWER_H) + + +def option_label(options, key): + return options[key].get('label', key) + + +def dropdown_choices(options): + return [option_label(options, key) for key in options.keys()] + + +def default_choice(options): + return option_label(options, list(options.keys())[0]) + + +def unique_output_name(base_name): + stamp = time.strftime('%y%m%d%H%M%S') + suffix = uuid.uuid4().hex[:8] + return f"{base_name}__{stamp}_{suffix}" + + +def resolve_option_key(options, selected): + if selected in options: + return selected + for key in options.keys(): + if option_label(options, key) == selected: + return key + raise KeyError(selected) + + +def run_retarget(z_path, skel_path, output_name, task_name): + """ + Decode to BVH and return the Three.js stick viewer. + """ + from decode_z_sliding import decode_z_skel_to_bvh + + task_out_dir = os.path.join(OUTPUT_DIR, task_name) + os.makedirs(task_out_dir, exist_ok=True) + + try: + bvh_path = decode_z_skel_to_bvh( + z_path=z_path, + skel_path=skel_path, + model_epoch=MODEL_EPOCH, + output_dir=task_out_dir, + output_name=output_name, + device=DEVICE, + model_type=MODEL_TYPE, + model_state=get_model_state(), + ) + return get_bvh_viewer_html( + bvh_path, title=output_name, height=VIEWER_H + ) + except Exception as e: + print(f"[error] retarget failed: {e}") + import traceback; traceback.print_exc() + return empty_viewer("Retarget failed") + + +# ════════════════════════════════════════════════════════════ +# Tab callbacks +# ════════════════════════════════════════════════════════════ + +# ── Task 1 ────────────────────────────────────────────────── +def t1_src_change(z_key): + z_key = resolve_option_key(TASK1_Z_OPTIONS, z_key) + info = TASK1_Z_OPTIONS[z_key] + return get_bvh_viewer_html( + info['src_bvh'], title=f"Source: {option_label(TASK1_Z_OPTIONS, z_key)}", height=VIEWER_H, + ) + +def t1_tgt_change(skel_key): + skel_key = resolve_option_key(TASK1_SKEL_OPTIONS, skel_key) + info = TASK1_SKEL_OPTIONS[skel_key] + return get_bvh_viewer_html( + info['tgt_bvh'], title=f"Target skeleton: {option_label(TASK1_SKEL_OPTIONS, skel_key)}", + height=VIEWER_H, max_frames=1, + ) + +def t1_run(z_key, skel_key): + z_key = resolve_option_key(TASK1_Z_OPTIONS, z_key) + skel_key = resolve_option_key(TASK1_SKEL_OPTIONS, skel_key) + z = TASK1_Z_OPTIONS[z_key] + skel = TASK1_SKEL_OPTIONS[skel_key] + name = unique_output_name(f"{z['name']}__{skel['name']}") + return run_retarget(z['z_path'], skel['skel_path'], name, 'task1') + +# ── Task 2 ────────────────────────────────────────────────── +def t2_src_change(z_key): + z_key = resolve_option_key(TASK2_Z_OPTIONS, z_key) + info = TASK2_Z_OPTIONS[z_key] + return get_bvh_viewer_html( + info['src_bvh'], title=f"Source: {option_label(TASK2_Z_OPTIONS, z_key)}", height=VIEWER_H, + ) + +def t2_tgt_change(skel_key): + skel_key = resolve_option_key(TASK2_SKEL_OPTIONS, skel_key) + info = TASK2_SKEL_OPTIONS[skel_key] + return get_bvh_viewer_html( + info['tgt_bvh'], title=f"Target skeleton: {option_label(TASK2_SKEL_OPTIONS, skel_key)}", + height=VIEWER_H, max_frames=1, + ) + +def t2_run(z_key, skel_key): + z_key = resolve_option_key(TASK2_Z_OPTIONS, z_key) + skel_key = resolve_option_key(TASK2_SKEL_OPTIONS, skel_key) + z = TASK2_Z_OPTIONS[z_key] + skel = TASK2_SKEL_OPTIONS[skel_key] + name = unique_output_name(f"{z['name']}__{skel['name']}") + return run_retarget(z['z_path'], skel['skel_path'], name, 'task2') + +# ── Task 3 ────────────────────────────────────────────────── +def t3_pair_change(pair_key): + pair_key = resolve_option_key(TASK3_PAIRS, pair_key) + pair = TASK3_PAIRS[pair_key] + label = option_label(TASK3_PAIRS, pair_key) + src = get_bvh_viewer_html( + pair['src_bvh'], title=f"Source: {label}", height=VIEWER_H, + ) + tgt = get_bvh_viewer_html( + pair['tgt_bvh'], title=f"Target skeleton: {label}", + height=VIEWER_H, max_frames=1, + ) + return src, tgt + +def t3_run(pair_key): + pair_key = resolve_option_key(TASK3_PAIRS, pair_key) + pair = TASK3_PAIRS[pair_key] + name = unique_output_name(pair['output_name']) + return run_retarget(pair['z_path'], pair['skel_path'], name, 'task3') + +# ── Task 4 ────────────────────────────────────────────────── +def t4_pair_change(pair_key): + pair_key = resolve_option_key(TASK4_PAIRS, pair_key) + pair = TASK4_PAIRS[pair_key] + label = option_label(TASK4_PAIRS, pair_key) + src = get_bvh_viewer_html( + pair['src_bvh'], title=f"Source: {label}", height=VIEWER_H, + ) + tgt = get_bvh_viewer_html( + pair['tgt_bvh'], title=f"Target skeleton: {label}", + height=VIEWER_H, max_frames=1, + ) + return src, tgt + +def t4_run(pair_key): + pair_key = resolve_option_key(TASK4_PAIRS, pair_key) + pair = TASK4_PAIRS[pair_key] + name = unique_output_name(pair['output_name']) + return run_retarget(pair['z_path'], pair['skel_path'], name, 'task4') + + +# ════════════════════════════════════════════════════════════ +# Task 5: generation callbacks +# ════════════════════════════════════════════════════════════ +def run_generation(text: str, skel_key: str, generation_label: str, + motion_frames: int, skel_options: dict) -> str: + """ + Generation pipeline: text -> latent/code -> BVH -> viewer. + """ + from gen_runner import generate_motion_from_text + + text = text.strip() + if not text: + return empty_viewer("Enter a text prompt") + + motion_frames = int(round(float(motion_frames))) + motion_frames = min(max(motion_frames, GEN_MIN_MOTION_FRAMES), GEN_MAX_MOTION_FRAMES) + + if not skel_key: + skel_key = list(skel_options.keys())[0] + else: + skel_key = resolve_option_key(skel_options, skel_key) + + skel_info = skel_options[skel_key] + skel_path = skel_info['skel_path'] + display_name = unique_output_name(skel_info['name']) + generation_type = GEN_MODEL_OPTIONS[generation_label] + gen_out_dir = os.path.join(OUTPUT_DIR, 'generation', generation_type) + os.makedirs(gen_out_dir, exist_ok=True) + + try: + bvh_path = generate_motion_from_text( + text=text, + skel_npz_path=skel_path, + generation_type=generation_type, + output_dir=gen_out_dir, + device_str=GEN_DEVICE, + skel_name=skel_info['name'], + motion_frames=motion_frames, + ) + if not bvh_path: + return empty_viewer("Generation failed") + return get_bvh_viewer_html( + bvh_path, + title=f"{display_name} - {generation_label} - {motion_frames} frames - {text}", + height=VIEWER_H, + ) + except Exception as e: + print(f"[error] generation failed: {e}") + import traceback; traceback.print_exc() + return empty_viewer("Generation failed") + + +def t5_run(text, skel_key, generation_label, motion_frames): + return run_generation(text, skel_key, generation_label, motion_frames, HUMAN_GEN_SKEL_OPTIONS) + + +def t5_tgt_change(skel_key): + info = HUMAN_GEN_SKEL_OPTIONS[skel_key] + return get_bvh_viewer_html( + info['tgt_bvh'], title=f"Target skeleton: {skel_key}", + height=VIEWER_H, max_frames=1, + ) + + +# ════════════════════════════════════════════════════════════ +# Page-load previews +# ════════════════════════════════════════════════════════════ +def on_load(): + try: + return ( + t1_src_change(list(TASK1_Z_OPTIONS.keys())[0]), + t1_tgt_change(list(TASK1_SKEL_OPTIONS.keys())[0]), + empty_viewer("Source motion"), + empty_viewer("Target skeleton"), + empty_viewer("Source human motion"), + empty_viewer("Target animal skeleton"), + empty_viewer("Source animal motion"), + empty_viewer("Target human skeleton"), + t5_tgt_change('mousey'), + ) + except Exception as e: + print(f"[on_load] Preview preload failed, possibly because a BVH file is missing: {e}") + return (None,) * 9 + + +# ════════════════════════════════════════════════════════════ +# Gradio UI +# ════════════════════════════════════════════════════════════ +DEFAULT_TEXT_PROMPT = "A person walks forward, bends down to pick something up off the ground." + + +with gr.Blocks(title="SATA Demo") as app: + + gr.Markdown( + """ + # SATA: Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation + Interactive visualization for motion retargeting and text-to-motion generation. + """ + ) + + gr.Markdown("## Motion Retargeting") + + with gr.Tabs() as retarget_tabs: + + # ╔══════════════════════════════════════════════════╗ + # ║ Task 1: Human -> Human ║ + # ╚══════════════════════════════════════════════════╝ + with gr.TabItem("Task 1 - Human -> Human") as t1_tab: + gr.Markdown("**Free selection**: choose any source motion and target skeleton.") + with gr.Row(): + t1_z_dd = gr.Dropdown(dropdown_choices(TASK1_Z_OPTIONS), + value=default_choice(TASK1_Z_OPTIONS), + label="Source motion", scale=2) + t1_sk_dd = gr.Dropdown(dropdown_choices(TASK1_SKEL_OPTIONS), + value=default_choice(TASK1_SKEL_OPTIONS), + label="Target skeleton", scale=2) + t1_btn = gr.Button("Run Model", variant="primary", scale=1) + with gr.Row(): + t1_v_src = gr.HTML(value=empty_viewer("Source motion")) + t1_v_tgt = gr.HTML(value=empty_viewer("Target skeleton")) + t1_v_out = gr.HTML(value=empty_viewer("Retarget result")) + + t1_z_dd.change(t1_src_change, t1_z_dd, t1_v_src) + t1_sk_dd.change(t1_tgt_change, t1_sk_dd, t1_v_tgt) + t1_btn.click(t1_run, [t1_z_dd, t1_sk_dd], t1_v_out) + + # ╔══════════════════════════════════════════════════╗ + # ║ Task 2: Animo -> Animo ║ + # ╚══════════════════════════════════════════════════╝ + with gr.TabItem("Task 2 - Animo -> Animo") as t2_tab: + gr.Markdown("**Zero-shot retargeting**: choose any animal source motion and target skeleton.") + with gr.Row(): + t2_z_dd = gr.Dropdown(dropdown_choices(TASK2_Z_OPTIONS), + value=default_choice(TASK2_Z_OPTIONS), + label="Source motion", scale=2) + t2_sk_dd = gr.Dropdown(dropdown_choices(TASK2_SKEL_OPTIONS), + value=default_choice(TASK2_SKEL_OPTIONS), + label="Target skeleton", scale=2) + t2_btn = gr.Button("Run Model", variant="primary", scale=1) + with gr.Row(): + t2_v_src = gr.HTML(value=empty_viewer("Source motion")) + t2_v_tgt = gr.HTML(value=empty_viewer("Target skeleton")) + t2_v_out = gr.HTML(value=empty_viewer("Retarget result")) + + t2_z_dd.change(t2_src_change, t2_z_dd, t2_v_src) + t2_sk_dd.change(t2_tgt_change, t2_sk_dd, t2_v_tgt) + t2_btn.click(t2_run, [t2_z_dd, t2_sk_dd], t2_v_out) + + # ╔══════════════════════════════════════════════════╗ + # ║ Task 3: Human -> Animo ║ + # ╚══════════════════════════════════════════════════╝ + with gr.TabItem("Task 3 - Human -> Animo") as t3_tab: + gr.Markdown("**Zero-shot retargeting**: selected human-to-animal samples.") + with gr.Row(): + t3_dd = gr.Dropdown(dropdown_choices(TASK3_PAIRS), + value=default_choice(TASK3_PAIRS), + label="Sample pair", scale=3) + t3_btn = gr.Button("Run Model", variant="primary", scale=1) + with gr.Row(): + t3_v_src = gr.HTML(value=empty_viewer("Source human motion")) + t3_v_tgt = gr.HTML(value=empty_viewer("Target animal skeleton")) + t3_v_out = gr.HTML(value=empty_viewer("Retarget result")) + + t3_dd.change(t3_pair_change, t3_dd, [t3_v_src, t3_v_tgt]) + t3_btn.click(t3_run, t3_dd, t3_v_out) + + # ╔══════════════════════════════════════════════════╗ + # ║ Task 4: Animo -> Human ║ + # ╚══════════════════════════════════════════════════╝ + with gr.TabItem("Task 4 - Animo -> Human") as t4_tab: + gr.Markdown("**Zero-shot retargeting**: selected animal-to-human samples.") + with gr.Row(): + t4_dd = gr.Dropdown(dropdown_choices(TASK4_PAIRS), + value=default_choice(TASK4_PAIRS), + label="Sample pair", scale=3) + t4_btn = gr.Button("Run Model", variant="primary", scale=1) + with gr.Row(): + t4_v_src = gr.HTML(value=empty_viewer("Source animal motion")) + t4_v_tgt = gr.HTML(value=empty_viewer("Target human skeleton")) + t4_v_out = gr.HTML(value=empty_viewer("Retarget result")) + + t4_dd.change(t4_pair_change, t4_dd, [t4_v_src, t4_v_tgt]) + t4_btn.click(t4_run, t4_dd, t4_v_out) + + # Refresh source/target previews whenever a tab is selected. + t1_tab.select( + lambda z_key, skel_key: (t1_src_change(z_key), t1_tgt_change(skel_key)), + [t1_z_dd, t1_sk_dd], + [t1_v_src, t1_v_tgt], + ) + t2_tab.select( + lambda z_key, skel_key: (t2_src_change(z_key), t2_tgt_change(skel_key)), + [t2_z_dd, t2_sk_dd], + [t2_v_src, t2_v_tgt], + ) + t3_tab.select(t3_pair_change, t3_dd, [t3_v_src, t3_v_tgt]) + t4_tab.select(t4_pair_change, t4_dd, [t4_v_src, t4_v_tgt]) + + # ════════════════════════════════════════════════════════ + # Generation + # ════════════════════════════════════════════════════════ + gr.Markdown("---") + gr.Markdown("## Text-to-motion Generation") + gr.Markdown( + "Enter a text prompt, choose a target skeleton and generation method, then click **Generate**." + ) + + with gr.Tabs(): + + # ╔══════════════════════════════════════════════════╗ + # ║ Task 5: Text-to-motion generation ║ + # ╚══════════════════════════════════════════════════╝ + with gr.TabItem("Task 5 - Text-to-motion Generation"): + gr.Markdown("Generate a motion from text and decode it onto the selected character skeleton.") + gr.Markdown("Generation models MDM and MoMask are large; each run can take about 2 minutes.") + with gr.Row(): + t5_text = gr.Textbox( + label="Text prompt (English)", + value=DEFAULT_TEXT_PROMPT, + lines=2, + ) + with gr.Row(): + t5_sk_dd = gr.Dropdown( + dropdown_choices(HUMAN_GEN_SKEL_OPTIONS), + value="mousey", + label="Target skeleton", + scale=2, + ) + t5_model_dd = gr.Dropdown( + list(GEN_MODEL_OPTIONS.keys()), + value="RVQ", + label="Method", + scale=1, + ) + t5_motion_frames = gr.Slider( + minimum=GEN_MIN_MOTION_FRAMES, + maximum=GEN_MAX_MOTION_FRAMES, + value=GEN_DEFAULT_MOTION_FRAMES, + step=1, + label="Motion length", + scale=2, + ) + t5_btn = gr.Button("Generate", variant="primary", scale=1) + with gr.Row(): + t5_v_tgt = gr.HTML(value=empty_viewer("Selected target skeleton")) + t5_v_out = gr.HTML(value=empty_viewer("Generation result")) + + t5_sk_dd.change(t5_tgt_change, t5_sk_dd, t5_v_tgt) + t5_btn.click(t5_run, [t5_text, t5_sk_dd, t5_model_dd, t5_motion_frames], t5_v_out) + + # Preload default interactive previews. + app.load( + fn=on_load, + outputs=[t1_v_src, t1_v_tgt, + t2_v_src, t2_v_tgt, + t3_v_src, t3_v_tgt, + t4_v_src, t4_v_tgt, + t5_v_tgt], + ) + + +def _env_flag(name: str, default: bool = False) -> bool: + value = os.environ.get(name) + if value is None: + return default + return value.strip().lower() in {"1", "true", "yes", "on"} + + +if __name__ == "__main__": + app.launch( + server_name=os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0"), + server_port=int(os.environ.get("PORT", "7860")), + share=_env_flag("GRADIO_SHARE", False), + debug=_env_flag("GRADIO_DEBUG", False), + show_error=True, + theme=gr.themes.Soft(primary_hue="blue"), + ) diff --git a/config/animo_train.yml b/config/animo_train.yml new file mode 100644 index 0000000000000000000000000000000000000000..7a86aae02a199270ebe84832740eebe2faf18e06 --- /dev/null +++ b/config/animo_train.yml @@ -0,0 +1,94 @@ +train_data: + dir: zooV2_train_wtextV2/motion/processed + mask: [] + +test_data: + dir: zooV2_test_wtextV2/motion/processed + sample_num: 50 # Use only the first 50 samples for quick tests + +representation: + skel: [lo, go, tf] # S + pose: [q, p, r, pv, qv, c] # D_t + out: [r, q, c] # \hat{D_t} + +model: + z_dim: 128 + Encoder: + type: GPSEncTemporal + hidden_dim: 256 # Fixed hidden dimension for all GPS layers + num_layers: 3 # Number of GPS layers + heads: 4 # Number of attention heads (for spatial GPS) + attn_type: multihead + attn_kwargs: + dropout: 0.1 + # Temporal Transformer parameters (NEW!) + temporal_type: transformer # 'conv' or 'transformer' + temporal_num_heads: 4 # Number of attention heads for temporal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 # FFN hidden layer multiplier + use_temporal_pos_encoding: True # Use positional encoding + pos_encoding_type: sinusoidal # 'sinusoidal' (extrapolates) or 'learnable' (fixed length) + max_seq_len: 512 # Only needed for learnable encoding + sample_posterior: True + Decoder: + type: GPSDecTemporal + hidden_dim: 256 # Fixed hidden dimension for all GPS layers + num_layers: 3 # Number of GPS layers + heads: 4 # Number of attention heads (for spatial GPS) + attn_type: multihead + attn_kwargs: + dropout: 0.1 + # Temporal Transformer parameters (NEW!) + temporal_type: transformer # 'conv' or 'transformer' + temporal_num_heads: 4 # Number of attention heads for temporal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 # FFN hidden layer multiplier + use_temporal_pos_encoding: True # Use positional encoding + pos_encoding_type: sinusoidal # 'sinusoidal' (extrapolates) or 'learnable' (fixed length) + max_seq_len: 512 # Only needed for learnable encoding + # load: + # - dir: blahblah + # epoch: + # prefix: encoder + # freeze: True + +train: + consq_n: 64 + min_motion_lens: 20 + batch_size: 12 # 16 if GPU memory allows + grad_max_norm: 0.5 + learning_rate: 0.0003 + + lr_schedule: + type: exponential + gamma: 0.99 + min: 0.01 + + epoch_num: 400 + save_per: 5 + + # load trainer to continue training + # load: + # dir: prev_trainer + # epoch: None + + # misc + copy_orig_contact: False + + loss: + q: 5 + p: 0.01 + r: 10 + pv: 1 + c: 1 + cv: 6 + pen: 0.1 + slide: 6 + jerk: 0.2 + + metric: [qR, ra_xz, pa, slide, jerk, pen] + + vae_kl: + kl_weight: 0.000001 + nll_loss_type: None + diff --git a/config/human_train.yml b/config/human_train.yml new file mode 100644 index 0000000000000000000000000000000000000000..d457d28fb59e5da4fa85193f2bebeddc0bdaf5c2 --- /dev/null +++ b/config/human_train.yml @@ -0,0 +1,96 @@ +train_data: + dir: train_faceZ_mirror_wtextV3/motion/processed + mask: [] + +test_data: + dir: test_recon_faceZ_mirror_wtextV3/motion/processed + sample_num: 50 # Use only the first 50 samples for quick tests + +representation: + skel: [lo, go, tf] # S + pose: [q, p, r, pv, qv, c] # D_t + out: [r, q, c] # \hat{D_t} + +model: + z_dim: 128 + Encoder: + type: GPSEncTemporal + hidden_dim: 256 # Fixed hidden dimension for all GPS layers + num_layers: 3 # Number of GPS layers + heads: 4 # Number of attention heads (for spatial GPS) + attn_type: multihead + attn_kwargs: + dropout: 0.1 + # Temporal Transformer parameters (NEW!) + temporal_type: transformer # 'conv' or 'transformer' + temporal_num_heads: 4 # Number of attention heads for temporal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 # FFN hidden layer multiplier + use_temporal_pos_encoding: True # Use positional encoding + pos_encoding_type: sinusoidal # 'sinusoidal' (extrapolates) or 'learnable' (fixed length) + max_seq_len: 512 # Only needed for learnable encoding + consq_n: 64 # Number of consecutive frames (must match train.consq_n) + sample_posterior: True + Decoder: + type: GPSDecTemporal + hidden_dim: 256 # Fixed hidden dimension for all GPS layers + num_layers: 3 # Number of GPS layers + heads: 4 # Number of attention heads (for spatial GPS) + attn_type: multihead + attn_kwargs: + dropout: 0.1 + # Temporal Transformer parameters (NEW!) + temporal_type: transformer # 'conv' or 'transformer' + temporal_num_heads: 4 # Number of attention heads for temporal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 # FFN hidden layer multiplier + use_temporal_pos_encoding: True # Use positional encoding + pos_encoding_type: sinusoidal # 'sinusoidal' (extrapolates) or 'learnable' (fixed length) + max_seq_len: 512 # Only needed for learnable encoding + consq_n: 64 # Number of consecutive frames (must match train.consq_n) + # load: + # - dir: blahblah + # epoch: + # prefix: encoder + # freeze: True + +train: + consq_n: 64 + min_motion_lens: 20 + batch_size: 16 # 16 if GPU memory allows + grad_max_norm: 0.5 + learning_rate: 0.0003 + + lr_schedule: + type: exponential + gamma: 0.99 + min: 0.01 + + epoch_num: 400 + save_per: 5 + + # load trainer to continue training + # load: + # dir: prev_trainer + # epoch: None + + # misc + copy_orig_contact: False + + loss: + q: 5 + p: 0.01 + r: 10 + pv: 1 + c: 1 + cv: 6 + pen: 0.1 + slide: 6 + jerk: 0.2 + + metric: [qR, ra_xz, pa, slide, jerk, pen] + + vae_kl: + kl_weight: 0.000001 + nll_loss_type: None + diff --git a/config/multi_dataset_train.yml b/config/multi_dataset_train.yml new file mode 100644 index 0000000000000000000000000000000000000000..c2006a71aa3543dd5b10dbef055923d516b79f13 --- /dev/null +++ b/config/multi_dataset_train.yml @@ -0,0 +1,96 @@ +train_data: + dir: merge_train_faceZ_mirror_wtextV3_zooV2_train_wtextV2/motion/processed + mask: [] + +test_data: + dir: test_recon_faceZ_mirror_wtextV3/motion/processed + sample_num: 50 # Use only the first 50 samples for quick tests + +representation: + skel: [lo, go, tf] # S + pose: [q, p, r, pv, qv, c] # D_t + out: [r, q, c] # \hat{D_t} + +model: + z_dim: 128 + Encoder: + type: GPSEncTemporal + hidden_dim: 256 # Fixed hidden dimension for all GPS layers + num_layers: 3 # Number of GPS layers + heads: 4 # Number of attention heads (for spatial GPS) + attn_type: multihead + attn_kwargs: + dropout: 0.1 + # Temporal Transformer parameters (NEW!) + temporal_type: transformer # 'conv' or 'transformer' + temporal_num_heads: 4 # Number of attention heads for temporal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 # FFN hidden layer multiplier + use_temporal_pos_encoding: True # Use positional encoding + pos_encoding_type: sinusoidal # 'sinusoidal' (extrapolates) or 'learnable' (fixed length) + max_seq_len: 512 # Only needed for learnable encoding + consq_n: 64 # Number of consecutive frames (must match train.consq_n) + sample_posterior: True + Decoder: + type: GPSDecTemporal + hidden_dim: 256 # Fixed hidden dimension for all GPS layers + num_layers: 3 # Number of GPS layers + heads: 4 # Number of attention heads (for spatial GPS) + attn_type: multihead + attn_kwargs: + dropout: 0.1 + # Temporal Transformer parameters (NEW!) + temporal_type: transformer # 'conv' or 'transformer' + temporal_num_heads: 4 # Number of attention heads for temporal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 # FFN hidden layer multiplier + use_temporal_pos_encoding: True # Use positional encoding + pos_encoding_type: sinusoidal # 'sinusoidal' (extrapolates) or 'learnable' (fixed length) + max_seq_len: 512 # Only needed for learnable encoding + consq_n: 64 # Number of consecutive frames (must match train.consq_n) + # load: + # - dir: blahblah + # epoch: + # prefix: encoder + # freeze: True + +train: + consq_n: 64 + min_motion_lens: 20 + batch_size: 12 # 16 if GPU memory allows + grad_max_norm: 0.5 + learning_rate: 0.0003 + + lr_schedule: + type: exponential + gamma: 0.99 + min: 0.01 + + epoch_num: 400 + save_per: 5 + + # load trainer to continue training + # load: + # dir: prev_trainer + # epoch: None + + # misc + copy_orig_contact: False + + loss: + q: 5 + p: 0.01 + r: 10 + pv: 1 + c: 1 + cv: 6 + pen: 0.1 + slide: 6 + jerk: 0.2 + + metric: [qR, ra_xz, pa, slide, jerk, pen] + + vae_kl: + kl_weight: 0.000001 + nll_loss_type: None + diff --git a/config/sample.yml b/config/sample.yml new file mode 100644 index 0000000000000000000000000000000000000000..f4614db0ccd9b854c1df013dcf99ad6426377599 --- /dev/null +++ b/config/sample.yml @@ -0,0 +1,62 @@ +train_data: + dir: sample/motion/processed + mask: [src, tgt] + +representation: + skel: [lo, go] # S + pose: [q, p, r, pv, qv, pprev, c] # D_t + out: [r, q, c] # \hat{D_t} + +model: + z_dim: 32 + Encoder: + type: GATEnc + hid_lyrs: [16, 16, 16] + heads_num: 16 + Decoder: + type: GATDec + hid_lyrs: [16, 16, 16] + heads_num: 16 + tgt_all_lyr: True + # load: + # - dir: blahblah + # epoch: + # prefix: encoder + # freeze: True + +train: + consq_n: 8 + batch_size: 256 # 512 if GPU memory allows + grad_max_norm: 0.5 + learning_rate: 0.01 + + lr_schedule: + type: exponential + gamma: 0.99 + min: 0.01 + + epoch_num: 300 + save_per: 30 + + # load trainer to continue training + # load: + # dir: prev_trainer + # epoch: None + + # misc + copy_orig_contact: False + + loss: + q: 5 + p: 0.01 + r: 10 + pv: 1 + c: 1 + cv: 6 + z: 1 + pen: 0.1 + slide: 6 + jerk: 0.2 + + metric: [qR, ra_xz, pa, slide, jerk, pen] + diff --git a/data/gradio_animo/bvh/arctic_wolf_female_fightflee.bvh b/data/gradio_animo/bvh/arctic_wolf_female_fightflee.bvh new file mode 100644 index 0000000000000000000000000000000000000000..d926fdf117c2b4d79a609bc68209bbc183b02f94 --- /dev/null +++ b/data/gradio_animo/bvh/arctic_wolf_female_fightflee.bvh @@ -0,0 +1,366 @@ +HIERARCHY +ROOT joint_4134471248 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_2408093594 + { + OFFSET 0.000000 0.150500 -0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_660434073 + { + OFFSET 0.000000 -0.150500 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1959899458 + { + OFFSET 0.000000 -12.069600 0.196600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1701103144 + { + OFFSET 0.000000 -9.877200 0.256800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1262349173 + { + OFFSET 0.000000 -10.656400 0.606600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_4198127424 + { + OFFSET 0.000000 -18.429399 1.875100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2368680418 + { + OFFSET 0.000000 -9.650100 3.621000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2649333993 + { + OFFSET 0.000000 -7.410000 7.603700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3773783050 + { + OFFSET 0.000000 -7.686400 -3.473600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000010 -6.867410 -5.398550 + } + } + JOINT joint_923334082 + { + OFFSET 3.525900 -13.679400 0.646200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -4.422900 -0.000000 + } + } + JOINT joint_1372280939 + { + OFFSET -3.525900 -13.679400 0.646200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -4.422900 -0.000000 + } + } + } + } + } + JOINT joint_1310227095 + { + OFFSET 4.292600 -12.421700 9.811800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3196842249 + { + OFFSET 4.042600 -2.567000 -20.517200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1090794499 + { + OFFSET -1.073100 3.953800 -16.748400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1020696807 + { + OFFSET -1.204600 -0.686400 -18.801399 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_439772274 + { + OFFSET 0.043300 -2.493700 -8.263900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.017875 -1.935225 -1.840350 + } + } + } + JOINT joint_3798611036 + { + OFFSET -0.602300 -0.343200 -9.400700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.361400 -0.205900 -5.640400 + } + } + } + } + } + JOINT joint_1882654722 + { + OFFSET -4.292600 -12.421600 9.811900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2661003854 + { + OFFSET -4.042600 -2.567000 -20.517200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2012637490 + { + OFFSET 1.073100 3.953800 -16.748301 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2360520260 + { + OFFSET 1.204600 -0.686400 -18.801500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1947178383 + { + OFFSET -0.043500 -2.493700 -8.263900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.018000 -1.935225 -1.840350 + } + } + } + JOINT joint_583282287 + { + OFFSET 0.602300 -0.343200 -9.400700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.361400 -0.205900 -5.640400 + } + } + } + } + } + } + } + } + } + JOINT joint_805181503 + { + OFFSET 0.000000 17.324400 -0.119200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3692188165 + { + OFFSET 0.000000 11.098700 -7.891100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 7.128300 -5.303200 + } + } + } + JOINT joint_732805150 + { + OFFSET 7.908900 4.188100 -2.265000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2187609084 + { + OFFSET 0.180500 0.803200 -24.443501 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1402347354 + { + OFFSET -0.627100 9.630100 -12.941100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1880709979 + { + OFFSET 0.804000 -0.591900 -13.461700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.087650 -1.969925 -1.637025 + } + } + } + JOINT joint_601622723 + { + OFFSET -0.313500 4.815000 -6.470500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.188100 2.889000 -3.882300 + } + } + } + JOINT joint_2910034484 + { + OFFSET 0.090300 0.401600 -12.221800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.054200 0.241000 -7.333100 + } + } + } + JOINT joint_2586737833 + { + OFFSET -7.908900 4.188100 -2.265000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1890967949 + { + OFFSET -0.180500 0.803200 -24.443600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1028348506 + { + OFFSET 0.627000 9.630100 -12.941000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_204929020 + { + OFFSET -0.804000 -0.591900 -13.461700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.087675 -1.970000 -1.637025 + } + } + } + JOINT joint_3322194383 + { + OFFSET 0.313500 4.815000 -6.470500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.188100 2.889000 -3.882300 + } + } + } + JOINT joint_3397516 + { + OFFSET -0.090300 0.401600 -12.221800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.054200 0.241000 -7.333100 + } + } + } + JOINT joint_2311776966 + { + OFFSET 0.000000 19.171200 -9.996300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 2.245500 -1.711700 + } + } + } +} +MOTION +Frames: 107 +Frame Time: 0.050000 +0.000000 50.168301 -0.000000 -105.756786 4.821459 0.667566 0.000001 0.000000 0.000000 -1.741123 -4.477995 -0.691830 -6.535108 3.644513 -1.631743 17.585939 0.375364 -4.235820 22.795527 -0.001827 -0.661640 35.660019 -2.268975 -3.452535 -25.133720 -4.256983 -0.700329 -20.846150 -1.734724 14.625957 -10.365995 2.740159 0.697751 -9.652169 0.339492 -2.013571 -9.420539 -1.656346 9.858733 -1.705870 -0.106637 -0.196993 5.860938 -22.707674 -0.276382 -19.941111 -4.815389 1.164398 9.364185 17.269515 18.714022 -6.994436 8.687050 4.748163 0.895551 0.971731 21.657657 -6.139682 -0.066427 0.840209 -13.313244 8.359683 12.768241 0.858359 4.665162 -0.126697 8.578303 -2.772814 -16.215567 -4.220121 -14.085683 0.064905 0.544517 -0.669107 -16.096674 24.296785 -7.803719 4.556204 -13.426334 5.594530 0.462648 -13.394207 -12.671178 -20.008048 44.033055 2.298269 -1.691349 -35.635770 -13.005023 10.306457 22.740109 21.592625 -2.641858 0.861302 -6.173064 8.419977 -0.000006 0.000003 0.000004 30.834814 18.245359 -22.961734 0.375190 0.713975 0.668059 -0.001187 6.450101 -0.996839 -6.445611 -34.039231 -7.420575 0.021401 0.311516 -0.418909 0.000001 0.000005 0.000002 0.002966 -0.004242 -0.012546 +-0.000000 50.522301 0.000000 -105.756786 4.821459 0.667566 0.000001 0.000000 0.000000 -0.904276 -4.785706 2.701232 -6.737011 2.169405 -3.202782 15.422621 0.436535 -7.274237 20.224864 -0.000270 0.641986 34.185202 -3.629116 -6.518177 -24.967284 -6.165654 1.394866 -13.585613 0.371965 17.188940 -12.195501 0.976151 0.256144 -10.077698 0.379283 -2.105313 -9.834224 -1.728045 9.815038 3.099142 -0.138914 0.464130 -4.674241 -18.795397 -7.565865 -9.663436 -4.939982 0.721734 10.492804 20.629642 16.508557 -12.029155 4.641546 6.213623 0.860180 0.920020 20.687950 -0.112600 0.014465 0.013424 -20.919623 11.406277 13.863414 7.082239 4.314787 0.119158 7.897426 -3.750671 -16.400967 -4.265010 -15.289036 0.520702 0.544536 -0.679067 -16.359153 24.296785 -7.803719 4.556204 -13.375000 6.778270 2.062221 -13.448854 -14.565280 -16.929225 42.463947 2.326693 -1.524123 -35.173563 -11.410625 6.855666 22.704626 21.468346 -2.628836 0.605037 -4.891540 6.642922 -0.000004 0.000001 0.000004 31.517514 17.714833 -23.242062 -2.199736 0.950111 0.714375 1.887528 6.198608 -1.033661 -6.653910 -33.808545 -7.379459 0.015006 0.221850 -0.298329 0.000004 0.000004 0.000005 0.002966 -0.004242 -0.012546 +-0.000000 51.206001 0.000000 -105.756786 4.821459 0.667566 0.000001 0.000000 0.000000 1.023554 -4.838369 5.284326 -6.923270 0.204459 -3.444580 11.983797 -0.241235 -9.073103 17.514232 -0.003266 0.291005 33.667017 -4.350587 -8.341511 -23.676443 -7.176382 2.786099 -8.297566 2.436533 17.993522 -13.609757 0.016390 0.010034 -10.454751 0.403940 -2.197164 -10.206601 -1.792296 9.772127 6.039623 -0.076336 0.873129 -14.688705 -13.157617 -13.236862 5.437585 -4.373479 0.051388 11.055823 23.612729 13.474000 -18.629761 0.870372 7.871242 0.802099 0.828286 18.859180 3.097493 0.292510 -0.467830 -22.933473 14.963363 14.591073 10.517129 4.123761 0.275963 8.553378 -4.849902 -16.370618 -5.689481 -16.631162 0.622309 0.550778 -0.685555 -16.481154 24.296785 -7.803719 4.556204 -13.321294 7.837268 3.537239 -12.904142 -16.599731 -13.344066 39.391862 2.259886 -1.265636 -33.617212 -9.582286 3.163648 22.630873 21.240558 -2.601987 0.360144 -3.408339 4.609250 -0.000003 -0.000001 0.000002 33.057693 16.574669 -23.829301 -8.016453 1.488486 0.899394 6.360335 5.505389 -1.138559 -7.188948 -33.279785 -7.237843 0.002350 0.036210 -0.048784 0.000006 0.000004 0.000007 0.002966 -0.004242 -0.012546 +0.769551 52.542751 -0.108803 -105.756217 5.374027 -0.783902 0.000000 0.000000 0.000000 4.706602 -4.952561 5.639202 -3.825742 -1.916759 -1.449039 9.081170 -1.949186 -7.159726 14.521901 -0.604853 -1.471147 25.621821 -3.259833 -7.645143 -14.695476 -2.825190 2.178114 -9.791724 3.178608 13.885155 -11.707121 -0.001883 -0.000232 -10.782832 0.427280 -2.282216 -10.530862 -1.826705 9.730428 -0.178785 -0.336853 -0.450081 0.946447 -8.791326 -10.435051 -10.612702 -5.266732 0.815338 18.914683 22.851246 11.206068 -20.329195 -1.357308 10.695812 0.784492 0.808491 18.500192 -6.202685 1.426549 0.365597 -11.232476 19.293361 12.365301 7.950343 4.475533 0.176865 9.182978 -6.139594 -15.608768 -5.742749 -17.403499 0.551509 0.533086 -0.659836 -15.940076 24.296774 -7.803718 4.556204 -13.267078 8.565164 4.565870 -10.027580 -17.608755 -9.203226 33.826502 2.009990 -0.935414 -31.619956 -7.760883 0.498297 23.106542 19.679788 -1.347497 0.148480 -1.799827 2.423831 -0.020919 -0.001640 -0.000206 27.622101 14.211658 -15.931866 5.085040 -0.177525 0.128078 -4.419983 2.284557 0.411385 -3.067997 -24.923137 -6.330582 -0.005196 -0.080625 0.108212 -0.034858 0.002744 0.000350 0.002968 -0.004241 -0.012546 +2.298706 54.166401 -0.299288 -105.713004 6.471272 -3.715834 0.000003 -0.000001 0.000001 9.300262 -5.471260 4.698323 2.138900 -3.012526 1.680635 7.470396 -3.615862 -3.156605 11.476296 -1.785073 -2.779017 9.622050 -0.555600 -5.852333 0.527105 1.335489 0.424071 -13.394558 3.616212 9.383754 -6.789249 -0.002027 0.000200 -11.068961 0.449356 -2.353471 -10.817133 -1.875665 9.689707 -11.025390 -0.832052 -2.957175 20.321689 -3.269152 -6.088176 -29.237621 -5.534825 1.631657 20.392107 17.629353 11.848751 -16.303872 -0.316984 14.621113 0.747009 0.752060 17.344884 -23.849995 3.443483 2.908966 7.214343 21.932597 7.294987 4.298647 4.532818 0.033251 6.426832 -6.759474 -14.362565 -2.320881 -17.012650 0.732396 0.491814 -0.596754 -14.567799 24.296780 -7.803718 4.556203 -13.251607 8.885023 5.011736 -5.304407 -17.020846 -5.472584 26.814622 1.589572 -0.640613 -30.034087 -6.480795 -0.392516 24.399324 17.041799 1.031181 0.013596 -0.583543 0.803029 -0.084775 0.007373 -0.000381 19.923280 7.612554 -3.287499 20.147705 -1.586518 0.084524 -14.402480 -0.004399 1.907157 3.400325 -15.198005 -5.960000 0.004021 -0.274159 0.365968 -0.097613 0.007669 0.000983 0.002966 -0.004241 -0.012546 +3.816708 55.377999 -0.422920 -105.617580 7.512602 -6.738875 0.000002 -0.000000 -0.000000 13.611778 -6.206894 3.164753 6.231265 -2.144830 4.581683 6.184894 -4.269716 0.928790 9.674844 -2.935913 -3.420785 -3.032623 2.203824 -4.280156 12.448857 3.764903 -1.868745 -15.471804 3.635053 7.167455 -2.515853 0.007342 0.005110 -11.319242 0.491292 -2.424863 -11.056904 -1.905814 9.629320 -19.457899 -1.181719 -5.296225 29.244505 2.185905 -3.415371 -33.722393 -5.407265 1.827202 16.288459 12.753291 12.065550 -12.119461 1.867042 17.960530 0.663356 0.643317 15.125579 -36.532690 4.794640 5.585805 17.702891 21.704778 3.209265 6.748025 4.418103 0.120825 -1.356890 -6.900543 -12.802268 2.626990 -15.147454 0.776581 0.420523 -0.487821 -12.108944 24.296776 -7.803720 4.556204 -13.217576 7.933732 3.669826 -0.668432 -17.966299 1.439178 31.891935 2.378882 -0.451776 -31.633589 -1.118664 0.111494 30.741538 10.584814 3.905054 -0.005757 -0.607666 0.855846 -0.135232 0.024450 -0.000179 12.054784 2.104073 6.020545 36.114685 -2.773486 0.527309 -24.662487 0.125686 3.357878 10.089402 -11.023508 -7.339561 0.024205 -0.282024 0.339283 -0.172475 -0.007493 0.001034 0.002966 -0.004241 -0.012546 +4.730178 55.411598 -0.338294 -105.537161 7.370154 -9.005318 0.000001 0.000001 -0.000000 15.728146 -5.989253 2.037633 5.495732 0.841861 5.814280 4.751603 -3.400653 3.602091 9.917451 -3.696205 -3.131289 -5.957146 3.464875 -4.071165 15.546504 2.334288 -0.496392 -20.746976 3.576476 8.374915 4.126151 -0.001457 -0.000564 -11.528452 0.510783 -2.496463 -11.277196 -1.925314 9.569504 -22.101493 -2.146452 -6.568702 28.194664 2.019138 -2.414731 -26.874443 -5.230621 1.519008 12.570543 12.536499 11.586275 -11.533042 1.965359 19.852881 0.624253 0.593143 14.064586 -33.523568 5.861771 4.657729 15.515190 18.050004 -1.931886 11.787369 0.118523 0.450253 -17.476467 -2.577774 -7.498959 18.712864 -14.028162 2.317349 0.208139 -0.212646 -5.547150 24.296785 -7.803718 4.556203 -13.210658 5.853531 0.764452 9.283158 -15.967124 6.896334 26.242016 1.997664 -0.250431 -31.245215 -0.381975 -0.794652 22.533655 9.204898 7.500211 -0.075396 0.066109 -0.053124 -0.156148 0.022808 -0.000378 8.933154 4.802271 9.210064 36.594531 -2.818990 0.537406 -25.955185 0.629619 4.150715 12.624606 -11.939603 -9.372222 0.001406 -0.701630 0.902607 -0.224771 -0.003390 0.001550 0.002961 -0.004242 -0.012545 +5.004562 54.361649 -0.009702 -105.513934 2.332735 -11.444815 0.000001 -0.000000 0.000000 14.486617 -0.909101 1.198153 3.947622 4.238035 5.485075 3.807567 -0.367402 4.953323 10.596080 -4.406024 -1.675402 -5.277346 4.945903 -3.029334 16.392234 -3.686961 4.144245 -30.756383 1.468528 5.941430 28.206174 -0.002188 -0.000113 -11.709838 0.525771 -2.547291 -11.454921 -1.944528 9.511043 -22.918021 -3.647663 -7.550359 25.532207 -2.282587 -1.911326 -18.027303 -5.151501 1.118226 10.442729 15.086096 11.092146 -13.049400 0.910568 21.378708 0.622501 0.584302 13.840707 -29.944022 5.690198 3.165909 17.977608 12.773208 -3.735237 3.925341 4.094995 0.004076 -10.344186 -7.453789 -4.637175 20.576779 -13.486123 3.142995 0.106621 -0.103558 -2.763051 24.296779 -7.803719 4.556204 -13.386965 3.189822 -2.901279 16.359394 -9.287395 10.632737 16.103072 1.067350 -0.186293 -35.131481 -4.221433 -1.623724 21.354883 16.659443 7.960046 -0.108686 0.646376 -0.832336 -0.187527 0.020343 -0.000681 9.822921 12.491564 11.571768 29.542634 -2.313190 0.294268 -22.116507 1.610359 3.902545 5.649929 -11.514985 -14.263320 -0.004673 -0.829016 1.073543 -0.256149 -0.000925 0.001862 0.002968 -0.004242 -0.012545 +4.873546 53.030998 0.398701 -105.641928 -1.862696 -12.543546 0.000001 0.000000 -0.000000 12.997826 3.241673 0.541666 4.279329 7.178751 4.917554 3.703259 2.223111 5.455465 10.682838 -5.109782 -0.265247 -4.356361 6.796528 -1.180572 18.673551 -12.028465 10.122915 -42.725128 -0.037849 -1.625158 41.737479 -0.002757 0.000133 -11.862625 0.553639 -2.598310 -11.605070 -1.958959 9.453473 -23.381753 -4.815100 -8.342198 28.422937 -6.789083 -1.772508 -23.247237 -5.294968 1.368861 14.166834 17.589450 10.297005 -13.949797 -0.363243 22.654504 0.644153 0.617072 14.567060 -25.361213 5.329154 1.417566 8.076960 7.535394 3.980004 7.719026 3.931871 0.155523 -5.337974 -6.878771 -8.348901 -2.332300 -10.890774 -3.197122 0.260203 -0.277972 -7.166687 24.296776 -7.803721 4.556205 -13.686949 0.747906 -6.230851 15.340794 -5.640636 9.754194 22.099062 1.410437 -0.374865 -46.039290 -7.625452 -1.279044 33.678356 20.726633 5.533052 -0.049801 -0.493921 0.698256 -0.220552 0.038789 -0.000303 11.971092 15.846000 14.828821 27.206056 -2.106284 0.253376 -21.734166 2.081121 2.302993 -4.877717 -10.378484 -18.697941 0.062443 0.098726 -0.208793 -0.287526 0.001534 0.002174 0.002968 -0.004243 -0.012545 +4.320073 51.657650 0.742856 -105.610709 0.613335 -10.460304 0.000002 0.000000 0.000000 13.241670 0.540986 -0.044884 5.026267 8.590902 4.986023 3.710627 1.787808 4.715374 9.890679 -5.761459 -0.165394 -5.555723 7.957877 -0.657683 24.122643 -12.149789 9.850062 -40.612662 -0.548825 -9.344383 13.598013 -0.002971 -0.001641 -11.995390 0.559719 -2.649480 -11.741414 -1.970944 9.396335 -23.500847 -4.782863 -8.707599 31.461747 -7.934081 -2.149424 -27.887007 -5.459388 1.592639 15.846732 19.339557 10.157071 -13.907151 -1.894227 23.446135 0.668365 0.655634 15.415671 -24.694844 5.908050 1.043493 10.031175 6.942691 5.138231 2.222942 3.999914 -0.062402 1.445176 -7.626895 -7.646194 -6.240466 -11.036457 -4.377950 0.272181 -0.285977 -7.342565 24.296776 -7.803721 4.556204 -13.902331 -0.559569 -8.017075 14.684342 -8.015284 4.483138 24.570400 1.498918 -0.506504 -42.797574 -9.027878 0.750447 23.201338 16.572630 9.881538 0.025710 -1.566341 2.140510 -0.240647 0.026693 -0.000837 15.247577 11.522402 14.748454 28.117329 -2.172957 0.279826 -27.183571 3.548993 0.658005 -5.223607 -10.111095 -19.378598 0.201298 1.585058 -2.195280 -0.320550 -0.016908 0.001810 0.002967 -0.004242 -0.012545 +3.613389 50.662701 0.893160 -106.798725 5.428199 -7.143882 0.000001 -0.000001 0.000000 16.383722 -4.485697 -0.607885 5.321237 9.365936 5.519696 2.084965 0.179992 3.429391 8.413585 -6.332724 -0.533515 -4.975232 8.184430 -1.807055 31.210442 -9.383856 7.832040 -36.344853 -1.213854 -9.315348 -3.670688 -0.002899 -0.002825 -12.100203 0.564616 -2.700910 -11.857062 -1.979368 9.318909 -23.356864 -4.397444 -8.901458 33.540235 -7.308398 -3.136314 -29.301875 -5.553373 1.661504 15.721785 20.611140 10.318175 -13.509252 -3.409762 23.703686 0.697458 0.685103 15.976868 -25.501526 7.378048 1.355792 14.027240 6.863638 5.254156 0.645564 4.012430 -0.115870 2.684585 -7.821905 -7.584003 -7.519564 -11.244978 -4.687788 0.279214 -0.290290 -7.434764 24.296766 -7.803719 4.556203 -13.896899 -0.552861 -7.986821 15.772132 -14.273580 -0.042843 29.836432 1.798748 -0.722150 -47.912556 -10.363029 1.147888 21.010459 18.568654 11.925700 0.111289 -2.330884 3.175208 -0.262389 0.035507 -0.000698 21.961696 4.626045 13.377255 25.154614 -1.952499 0.204162 -34.554306 5.838853 1.592398 0.588444 -10.059416 -20.641894 0.352043 2.931561 -4.035441 -0.351927 -0.014447 0.002112 0.002968 -0.004241 -0.012547 +2.883118 50.198849 0.807777 -107.366410 8.622717 -4.379610 0.000000 0.000000 0.000000 18.749591 -8.013274 -0.615980 5.885121 10.433088 5.819582 0.628621 -0.847329 2.208385 7.296676 -6.744604 -0.610705 0.196836 8.082502 -2.908912 26.894499 -7.890169 6.772665 -33.219397 -1.309535 -7.079568 -1.459526 -0.003590 -0.003017 -12.204019 0.590540 -2.727837 -11.962364 -1.985954 9.262807 -23.024494 -4.078759 -9.036750 35.609905 -7.578213 -2.811990 -33.764697 -5.675306 1.862282 17.166193 20.891272 10.279138 -12.471354 -3.926883 23.295690 0.720917 0.709290 16.433487 -26.111628 9.288697 1.828532 15.097593 4.971509 4.839471 1.609474 4.012427 -0.082680 1.652558 -7.676796 -7.757061 -7.463542 -11.278209 -4.778982 0.281936 -0.291348 -7.453744 24.296774 -7.803721 4.556205 -13.718260 0.536573 -6.531391 16.011422 -20.709173 -0.745522 32.226345 2.051192 -0.732747 -51.616340 -8.665104 -0.658013 22.127912 19.985731 12.362977 0.000237 -1.318607 1.841298 -0.284010 0.040137 0.020306 24.392108 0.120556 10.824017 23.651073 -1.838897 0.170885 -36.457944 5.236106 3.380389 2.264288 -8.984533 -20.961028 0.299211 2.360424 -3.265058 -0.376058 -0.009048 0.002464 0.002964 -0.004241 -0.012545 +2.430636 50.082901 0.620551 -107.831582 9.632759 -3.064034 -0.000001 0.000000 0.000001 20.763456 -9.260389 -0.725535 6.565131 11.188630 5.999503 -0.587183 -1.158162 1.847583 6.469994 -6.993315 -0.465596 5.623277 7.897035 -3.502162 19.972831 -7.844109 6.871042 -31.018756 -1.290825 -5.654957 0.401887 -0.004270 -0.003210 -12.287860 0.594562 -2.768936 -12.046942 -1.989071 9.207412 -22.598446 -3.916364 -9.190445 36.401494 -7.994325 -2.099977 -37.490765 -5.752017 2.016807 18.188711 20.842674 10.323571 -11.054817 -4.038369 22.723239 0.723014 0.721459 16.737792 -26.497902 11.044834 2.227815 15.321200 2.863413 4.206121 1.903026 4.026952 -0.066941 1.347948 -7.528071 -7.821254 -7.470545 -11.162776 -4.791545 0.283427 -0.291474 -7.451801 24.296777 -7.803719 4.556204 -13.488102 2.170937 -4.327595 15.722583 -24.538686 0.248922 33.276660 2.292785 -0.642923 -52.317708 -5.728032 -2.871174 21.867769 20.377630 12.700127 -0.140292 0.410078 -0.474610 -0.290931 0.039818 0.013251 24.090906 -0.993266 8.164315 24.890073 -1.931512 0.200807 -36.082009 3.227331 4.457086 1.219095 -7.568130 -20.337474 0.154138 0.996530 -1.421613 -0.387340 -0.018682 0.002228 0.002968 -0.004242 -0.012547 +2.444032 50.281200 0.370585 -108.097782 9.898677 -3.271368 -0.000001 0.000000 -0.000000 22.057220 -9.527018 -0.750361 7.359660 11.644386 6.129847 -1.170800 -1.232777 2.188477 5.863789 -7.009346 -0.649938 6.448013 7.917012 -3.563378 20.489970 -8.895849 7.866562 -35.048544 -0.791483 -5.077627 -0.691943 -0.004785 -0.003617 -12.360881 0.605110 -2.789158 -12.121167 -1.990416 9.131393 -22.069294 -3.981733 -9.285447 35.064703 -7.947540 -0.899645 -38.060291 -5.711172 2.037890 17.622727 20.776509 10.591000 -9.486689 -3.993298 22.151008 0.720580 0.723925 16.821979 -26.831687 11.913657 2.431059 17.023415 1.784343 4.099661 -2.262648 4.017111 -0.232043 3.274027 -7.307533 -7.621265 -7.238740 -10.985537 -4.733846 0.287788 -0.293780 -7.498663 24.296779 -7.803720 4.556204 -13.277839 4.186291 -1.575935 14.980259 -24.941743 -0.237165 34.383722 2.432476 -0.638142 -50.700679 -4.831557 -2.951454 19.961188 19.681850 13.109288 -0.173262 1.084564 -1.379753 -0.291207 0.043301 0.013362 23.016492 -0.720856 7.940836 25.890507 -2.022665 0.214295 -34.498495 1.963661 3.926168 -0.196470 -6.742705 -19.462126 0.091871 0.275909 -0.450801 -0.387340 -0.018682 0.002227 0.002966 -0.004241 -0.012545 +2.482887 50.430801 0.084647 -108.190561 9.847563 -3.920544 -0.000001 -0.000001 -0.000001 22.201134 -9.339605 -0.640798 8.268861 11.845368 6.204219 -0.932947 -1.186446 2.653508 5.302178 -6.858018 -0.929338 6.411383 7.851889 -3.454708 21.254673 -9.750227 8.641443 -38.459514 -0.436555 -4.586282 -2.079549 -0.005271 -0.004059 -12.433216 0.629655 -2.809363 -12.209218 -1.993884 9.075873 -21.515694 -4.220340 -9.292282 32.625340 -7.819516 0.165945 -36.717213 -5.622400 1.986975 16.117140 20.694327 10.986720 -7.847512 -4.004068 21.625186 0.725136 0.723704 16.779618 -27.154913 11.928037 2.460358 19.460260 1.662853 4.036399 -8.004244 3.984832 -0.459197 5.983415 -7.000342 -7.322670 -6.902434 -11.000798 -4.642549 0.277078 -0.293323 -7.525575 24.296781 -7.803720 4.556206 -13.187317 6.293166 1.291328 13.897879 -23.782912 -2.336050 35.797548 2.507564 -0.708263 -48.705745 -5.438426 -1.459946 17.719042 18.907886 13.445577 -0.163520 0.861076 -1.079938 -0.290380 0.032848 0.013025 21.716103 -0.489752 9.056808 27.220460 -2.121067 0.250698 -33.477956 1.484118 2.457885 -1.316604 -6.140452 -18.571254 0.099603 0.237487 -0.400469 -0.379819 -0.012259 0.002385 0.002964 -0.004241 -0.012545 +2.567787 50.415550 -0.209002 -108.117012 9.413963 -4.661100 -0.000000 0.000000 0.000000 21.577049 -8.769700 -0.698501 8.976163 11.826652 6.243715 -0.342005 -0.994597 3.187776 4.877279 -6.603125 -1.176695 5.711553 7.691622 -3.314678 22.144422 -10.096952 8.968343 -39.902281 -0.300999 -4.288396 -2.932071 -0.005789 -0.004459 -12.528046 0.623820 -2.829309 -12.297103 -1.976008 9.023866 -21.247225 -4.519236 -9.324491 31.312182 -7.687709 1.104056 -35.971035 -5.560787 1.949814 14.869557 20.560082 11.346511 -6.427972 -4.027768 21.186235 0.723895 0.722399 16.755220 -27.489737 11.667909 2.475307 20.062182 1.554327 3.955795 -9.788147 3.963445 -0.534030 6.820904 -6.665632 -7.209506 -6.530097 -11.087016 -4.544015 0.269190 -0.290670 -7.482279 24.296776 -7.803721 4.556204 -13.197625 8.158967 3.912849 12.952824 -21.978515 -4.311961 37.058672 2.559632 -0.783055 -47.638698 -6.377878 0.290347 16.391097 18.300544 13.315124 -0.135590 0.328683 -0.365312 -0.290379 0.032851 0.013024 20.731337 0.070668 10.294580 28.547308 -2.215453 0.291244 -34.115623 1.500128 1.130694 -1.360887 -6.031583 -17.954803 0.110877 0.526111 -0.787334 -0.379819 -0.012259 0.002385 0.002965 -0.004242 -0.012546 +2.712594 50.412498 -0.464288 -108.240774 8.981896 -5.320552 -0.000000 0.000000 0.000001 21.485206 -8.214818 -0.804264 9.288507 11.803994 6.209366 -0.090584 -0.776276 3.698288 4.724727 -6.172252 -1.276060 4.868838 7.364737 -3.161212 23.112494 -10.200832 9.101440 -40.425472 -0.248707 -4.105742 -2.735402 -0.006383 -0.004758 -12.600885 0.637937 -2.849497 -12.380608 -1.985667 8.958032 -21.255627 -4.933014 -9.435141 31.296526 -7.569755 1.963730 -36.486959 -5.538471 1.975482 14.202625 20.382858 11.633366 -5.213692 -4.019637 20.851747 0.726551 0.725195 16.807500 -27.789240 11.254732 2.425865 20.442612 1.399242 3.875190 -10.860346 3.959313 -0.578626 7.332668 -6.315423 -7.150669 -6.200984 -11.206810 -4.467125 0.273501 -0.288601 -7.410113 24.296779 -7.803720 4.556204 -13.251280 9.630672 6.014512 12.980869 -20.495866 -5.135240 37.375844 2.560922 -0.817257 -47.623337 -6.950352 1.187720 16.309753 17.849965 12.989017 -0.115646 0.009433 0.063578 -0.290930 0.039821 0.013251 20.455953 0.933438 10.992894 29.154315 -2.267767 0.304160 -35.302436 1.467593 0.463882 -0.717248 -6.199075 -17.523829 0.125434 0.663313 -0.972561 -0.379820 -0.012259 0.002384 0.002964 -0.004242 -0.012547 +2.754798 50.384998 -0.652387 -108.509843 8.705151 -5.745138 -0.000000 0.000000 -0.000000 21.730618 -7.793423 -0.639635 9.342093 11.715513 6.117103 0.033067 -0.656985 3.819256 4.743665 -6.276307 -1.221333 4.301243 7.525994 -3.126260 23.437826 -10.244131 9.159389 -40.471506 -0.240911 -4.019310 -2.437305 -0.006988 -0.005043 -12.694678 0.653125 -2.869417 -12.475582 -1.989971 8.912775 -21.251151 -4.830612 -9.408883 31.281772 -7.425144 2.602799 -36.787501 -5.488569 1.990101 13.451329 20.145517 11.925656 -4.135900 -4.013499 20.685939 0.726023 0.724639 16.797053 -28.130884 11.339071 2.572040 20.733522 1.250721 3.813090 -11.503444 3.945090 -0.607738 7.652400 -5.908451 -7.080469 -5.983654 -11.393139 -4.404319 0.270065 -0.285009 -7.324485 24.296776 -7.803718 4.556204 -13.301662 10.351020 7.026208 13.442688 -20.045207 -4.919564 37.261177 2.561135 -0.790339 -48.029766 -6.695834 0.810546 16.573297 17.650761 12.724522 -0.128700 0.213903 -0.211145 -0.290930 0.039819 0.013252 20.675619 1.852391 10.635893 29.283385 -2.280879 0.297610 -36.615321 1.065563 0.711656 0.139010 -6.329650 -17.155245 0.116232 0.414328 -0.638956 -0.379819 -0.012259 0.002384 0.002969 -0.004242 -0.012545 +2.752082 50.357498 -0.768466 -108.805050 8.670986 -5.809709 -0.000002 0.000001 0.000000 22.013897 -7.688186 -0.563762 9.355478 11.664951 6.031963 0.150265 -0.652604 3.778391 4.772838 -6.906785 -1.153830 3.762190 8.210189 -3.187527 23.704689 -10.281232 9.221825 -40.440811 -0.238526 -3.932552 -2.405010 -0.007571 -0.005359 -12.789522 0.647390 -2.889324 -12.570548 -1.994196 8.867504 -21.240472 -4.216779 -9.235617 31.309426 -7.282903 3.049115 -36.933869 -5.469093 1.990148 12.658412 19.865057 12.201364 -3.189713 -4.014678 20.692759 0.724783 0.723332 16.772650 -28.511924 11.910325 2.932777 20.953642 1.092438 3.769131 -11.777247 3.913900 -0.617291 7.817178 -5.488255 -7.047230 -5.854217 -11.618865 -4.344279 0.266624 -0.281420 -7.238860 24.296782 -7.803720 4.556204 -13.413949 9.890852 6.361362 13.920843 -19.920773 -5.221228 37.215708 2.578368 -0.782635 -48.507436 -6.539081 0.370851 16.711822 17.605926 12.666260 -0.137661 0.364165 -0.412958 -0.290930 0.039819 0.013249 21.149811 2.332104 9.984452 29.107153 -2.246372 0.283362 -37.586028 0.671284 1.179470 0.770206 -6.387946 -16.985160 0.084935 0.129543 -0.254633 -0.379819 -0.012259 0.002385 0.002969 -0.004241 -0.012545 +2.742370 50.348351 -0.857337 -109.065030 8.668282 -5.708199 -0.000003 0.000000 -0.000000 22.264627 -7.649889 -0.550806 9.325303 11.618297 6.007892 0.244612 -0.674038 3.682620 4.787026 -7.255124 -1.151783 3.266847 8.608203 -3.199686 23.922582 -10.347963 9.313072 -40.395197 -0.223009 -3.803504 -2.495115 -0.008142 -0.005689 -12.914738 0.664213 -2.887890 -12.696641 -2.003186 8.821138 -21.294022 -3.867885 -9.156219 31.413216 -7.146171 3.267239 -36.937078 -5.430680 1.994163 11.885729 19.475048 12.425305 -2.383711 -3.988834 20.920652 0.720348 0.718676 16.685515 -28.865134 12.213580 3.179873 21.041189 0.936163 3.765407 -11.670365 3.900120 -0.615338 7.804966 -5.066515 -7.024518 -5.763770 -11.893847 -4.323105 0.262560 -0.277373 -7.142771 24.084187 -7.802224 4.553008 -14.026313 7.312420 2.710231 14.160731 -19.570100 -6.348956 37.360910 2.578436 -0.794829 -48.745665 -6.724988 0.306842 16.534268 17.555638 12.749021 -0.134731 0.314075 -0.345690 -0.290931 0.039820 0.013252 21.445202 2.405186 9.748152 29.116792 -2.263333 0.290076 -38.057467 0.621347 1.341233 0.869884 -6.410598 -17.024265 0.082051 0.087829 -0.198556 -0.379819 -0.012259 0.002385 0.002966 -0.004241 -0.012546 +2.708009 50.339199 -0.934622 -109.184160 8.638752 -5.612041 -0.000000 0.000000 0.000000 22.392602 -7.610076 -0.534000 9.281956 11.566464 5.997384 0.302659 -0.702111 3.554823 4.823965 -6.713794 -1.271787 2.799627 8.120240 -3.066664 24.114773 -10.435318 9.416464 -40.382406 -0.221065 -3.656128 -2.290462 0.000003 -0.000007 -13.049334 0.670782 -2.893968 -12.840314 -2.019120 8.794178 -21.584902 -4.351294 -9.366080 31.743706 -6.962425 3.444714 -36.762732 -5.385640 1.977433 11.190455 18.862708 12.572392 -1.778751 -3.737393 21.218126 0.713177 0.709470 16.473786 -29.145759 11.699387 3.075973 21.051702 0.772603 3.739089 -11.327263 3.879897 -0.595292 7.694573 -4.608734 -7.008004 -5.696014 -12.181519 -4.284873 0.260179 -0.273590 -7.045070 22.674546 -7.809073 4.547455 -15.258636 3.768045 -2.217257 14.223878 -19.192295 -7.648201 37.525463 2.588153 -0.792151 -48.823164 -6.918647 0.228407 16.173980 17.505744 12.920086 -0.130003 0.257179 -0.275092 -0.292039 0.037377 0.013998 21.553222 2.262383 9.847036 29.195050 -2.261298 0.293225 -38.319298 0.784754 1.237889 0.764025 -6.384545 -17.124381 0.093049 0.210609 -0.357709 -0.389875 -0.014210 -0.003000 0.002964 -0.004241 -0.012547 +2.608954 50.345299 -0.992485 -109.165099 8.615823 -5.562433 0.000000 0.000000 0.000000 22.435406 -7.556268 -0.424297 9.207968 11.453377 6.014883 0.330604 -0.758540 3.397344 4.825844 -6.631852 -1.364277 2.449651 8.058833 -3.051136 24.293850 -10.470948 9.469498 -40.493328 -0.201739 -3.454771 -1.891774 0.000002 -0.000008 -13.206518 0.678726 -2.892115 -12.995948 -2.043128 8.757184 -21.932648 -4.364564 -9.462363 32.071202 -6.690425 3.614847 -36.394627 -5.321343 1.965221 10.641660 17.924488 12.589605 -1.330808 -3.145582 21.539025 0.694404 0.690057 16.107791 -29.464350 11.603846 3.147260 21.144875 0.614915 3.704728 -10.995759 3.866358 -0.585619 7.592321 -4.148663 -6.995654 -5.670712 -12.432547 -4.258491 0.253990 -0.268984 -6.940465 19.610136 -7.794148 4.546203 -17.132271 0.175308 -7.085923 14.228258 -18.864055 -9.025624 37.521970 2.587928 -0.792026 -48.704133 -7.132495 0.154224 15.721340 17.518752 13.157697 -0.126181 0.194574 -0.191000 -0.292040 0.037378 0.013999 21.521860 1.956145 10.094510 29.257882 -2.265900 0.295081 -38.465585 1.030847 1.180289 0.570309 -6.284793 -17.376566 0.103569 0.354482 -0.551208 -0.389876 -0.014210 -0.003000 0.002966 -0.004242 -0.012546 +2.448926 50.357498 -1.052128 -109.110821 8.589540 -5.518086 -0.000002 0.000000 0.000001 22.456840 -7.516465 -0.331189 9.113866 11.261718 6.073099 0.346380 -0.849126 3.269652 4.824548 -6.683499 -1.457599 2.190447 8.105937 -3.105564 24.458237 -10.419758 9.429798 -40.673823 -0.172626 -3.172264 -1.765872 0.000002 -0.000008 -13.398635 0.688427 -2.889823 -13.172349 -2.070247 8.740363 -22.306800 -4.254194 -9.531594 32.284073 -6.318061 3.751719 -35.790875 -5.229207 1.930337 10.148042 16.763480 12.525547 -0.955248 -2.309670 21.878844 0.669724 0.664906 15.630245 -29.782401 11.634620 3.272485 21.373500 0.513699 3.689392 -10.839240 3.847689 -0.574983 7.575950 -3.678881 -6.983122 -5.672003 -12.635571 -4.237810 0.247793 -0.264385 -6.835862 15.583078 -7.786599 4.547054 -19.199516 -2.439395 -10.668365 14.262555 -18.556101 -10.484839 37.434621 2.582286 -0.788959 -48.492588 -7.347243 0.076626 15.185529 17.571727 13.434596 -0.122272 0.131979 -0.106904 -0.292039 0.037376 0.013997 21.471996 1.628797 10.279023 29.320708 -2.270504 0.296943 -38.577888 1.235695 1.290438 0.321721 -6.123549 -17.704208 0.111325 0.456632 -0.688639 -0.389876 -0.014210 -0.003000 0.002961 -0.004243 -0.012544 +2.226843 50.366650 -1.079966 -109.038936 8.561601 -5.500822 -0.000000 0.000000 0.000000 22.460528 -7.483648 -0.247296 9.015354 10.981999 6.151556 0.363068 -0.959275 3.167637 4.803249 -7.093825 -1.523850 1.987525 8.462209 -3.283358 24.684854 -10.267041 9.308439 -40.921063 -0.145745 -2.825743 -1.786850 0.000002 -0.000007 -13.618702 0.699530 -2.887159 -13.390258 -2.103711 8.732427 -22.689824 -3.788287 -9.492433 32.357076 -5.840041 3.853524 -34.901214 -5.118067 1.887453 9.692731 15.377586 12.373823 -0.670450 -1.202842 22.230465 0.659907 0.640468 15.053536 -30.153813 11.993466 3.561094 21.744329 0.489439 3.622876 -10.846366 3.837278 -0.574573 7.641430 -3.202885 -6.948865 -5.697885 -12.780312 -4.215536 0.241587 -0.259801 -6.731256 10.770802 -7.781988 4.542880 -20.934352 -2.986243 -11.412350 14.326846 -18.322445 -12.031188 37.270455 2.571677 -0.783208 -48.185727 -7.562472 0.010830 14.557350 17.656033 13.771549 -0.117452 0.056866 -0.005985 -0.292039 0.037379 0.013999 21.381287 1.197999 10.479076 29.446368 -2.279701 0.300679 -38.677706 1.449179 1.437964 0.032393 -5.875222 -18.080703 0.118669 0.550427 -0.814863 -0.389876 -0.014209 -0.003000 0.002966 -0.004242 -0.012547 +1.956237 50.382000 -1.121426 -108.965685 8.547615 -5.469751 -0.000001 -0.000001 -0.000000 22.450063 -7.450770 -0.165241 8.910863 10.631124 6.232403 0.380648 -1.088381 3.101782 4.769490 -7.169662 -1.625717 1.821085 8.465170 -3.446625 24.927880 -10.038062 9.114204 -41.161186 -0.114475 -2.444649 -1.709912 0.000002 -0.000007 -13.859726 0.711678 -2.884190 -13.642776 -2.142451 8.723071 -23.113094 -3.650651 -9.559581 32.304524 -5.312934 3.920550 -33.753785 -5.000087 1.828051 9.218444 13.843138 12.178149 -0.442216 0.078668 22.603603 0.626652 0.607887 14.422609 -30.490252 12.039392 3.703116 22.196628 0.497200 3.567482 -10.888473 3.827214 -0.574062 7.720501 -2.728539 -6.914501 -5.749107 -12.870227 -4.184946 0.235372 -0.255230 -6.626648 5.688220 -7.771701 4.540130 -22.691797 -2.736891 -11.052730 14.451542 -18.131259 -13.622351 37.043398 2.556970 -0.775309 -47.814642 -7.757739 -0.056402 13.869454 17.742361 14.106621 -0.113617 -0.001547 0.072515 -0.292039 0.037380 0.014001 21.297254 0.718228 10.676714 29.572014 -2.288890 0.304436 -38.778099 1.662387 1.585905 -0.259869 -5.574848 -18.435127 0.126908 0.652538 -0.952324 -0.389876 -0.014210 -0.003000 0.002964 -0.004242 -0.012546 +1.648257 50.366650 -1.133463 -108.892426 8.533662 -5.459659 0.000001 -0.000000 -0.000000 22.386653 -7.417819 -0.090022 8.799470 10.219671 6.322360 0.416578 -1.234901 3.082967 4.724549 -7.259342 -1.695935 1.887198 8.446415 -3.674935 25.082154 -9.744751 8.823655 -41.468112 -0.087289 -2.022885 -1.751879 0.000003 -0.000008 -14.132712 0.714809 -2.828316 -13.912589 -2.183897 8.754858 -23.531926 -3.479753 -9.615715 32.090368 -4.762396 3.959758 -32.233168 -4.851171 1.762858 8.669679 12.170687 11.956706 -0.265625 1.542507 22.992898 0.611295 0.578831 13.751767 -30.819345 12.108096 3.857401 22.691720 0.521115 3.485272 -10.888211 3.848180 -0.574845 7.783368 -2.268772 -6.887381 -5.820119 -12.895735 -4.165810 0.236085 -0.251459 -6.521567 0.691042 -7.741343 4.526802 -24.544333 -2.244350 -10.361512 14.603923 -17.987818 -15.258764 36.861742 2.545178 -0.769028 -47.455435 -7.941953 -0.104303 13.097982 17.854352 14.457855 -0.110264 -0.051611 0.139803 -0.292039 0.037378 0.013997 21.216529 0.218501 10.834396 29.851274 -2.309284 0.312860 -38.980678 1.839987 1.725121 -0.552729 -5.211740 -18.700456 0.134157 0.740046 -1.070162 -0.389876 -0.014211 -0.002999 0.002964 -0.004243 -0.012545 +1.297851 50.223202 -1.158943 -108.785314 8.502464 -5.454540 0.000001 -0.000001 0.000000 21.963522 -7.370502 -0.061281 8.719528 9.727351 6.422231 0.731813 -1.363085 3.126472 4.676781 -6.757109 -1.826624 2.930887 7.708327 -3.968957 24.991607 -9.389493 8.460793 -42.425219 -0.034050 -1.432654 -1.674938 0.000002 -0.000008 -14.427684 0.697639 -2.737250 -14.179164 -2.246294 8.828501 -23.981213 -3.884471 -9.855946 31.747704 -4.190384 3.991912 -30.371381 -4.695002 1.672183 8.017180 10.425584 11.732922 -0.141083 3.120840 23.407701 0.595601 0.549952 13.080920 -31.117352 11.631661 3.753860 23.200788 0.545164 3.403619 -10.790269 3.847198 -0.575160 7.800377 -1.836559 -6.874199 -5.909533 -12.867787 -4.164762 0.251908 -0.250180 -6.436446 -3.892615 -7.731176 4.521858 -26.277607 -1.672846 -9.566071 14.651650 -17.904076 -16.980000 37.190117 2.566473 -0.780407 -47.460315 -8.101290 -0.147455 12.233397 17.967649 14.804203 -0.106841 -0.101668 0.207092 -0.292039 0.037380 0.013995 20.975290 -0.290214 10.923105 30.737942 -2.373756 0.340262 -39.655583 1.985501 1.845468 -0.858433 -4.815642 -18.860079 0.141579 0.827542 -1.188013 -0.389875 -0.014210 -0.003000 0.002968 -0.004241 -0.012546 +0.907328 49.899750 -1.167286 -108.688110 8.479199 -5.482863 -0.000000 0.000000 0.000000 21.018557 -7.326042 -0.109318 8.712815 9.133627 6.501665 1.461554 -1.506373 3.242858 4.626929 -5.928756 -1.968850 5.166853 6.486257 -4.319063 24.581497 -8.960243 8.006584 -44.114062 -0.001821 -0.685431 -0.821597 0.000002 -0.000008 -14.740098 0.680728 -2.611089 -14.495914 -2.327570 8.920786 -24.487524 -4.589141 -10.227210 31.232568 -3.659482 4.027129 -28.017764 -4.529202 1.559878 7.193232 8.638975 11.508831 -0.054202 4.806316 23.821693 0.557274 0.517224 12.439747 -31.384170 10.855095 3.498886 23.194745 0.508980 3.311746 -9.618471 3.859207 -0.520272 7.366623 -1.429297 -6.901707 -6.062476 -12.738513 -4.135706 0.235333 -0.246650 -6.392071 -7.509252 -7.720748 4.518035 -27.631486 -1.146033 -8.836151 14.593692 -17.864370 -18.778746 38.311518 2.638696 -0.820178 -48.048938 -8.209346 -0.218822 11.238796 18.057088 15.164114 -0.103379 -0.151728 0.274386 -0.292039 0.037379 0.013999 20.563430 -0.787644 10.930321 32.532459 -2.502887 0.398758 -41.019310 2.096699 1.971888 -1.188915 -4.392932 -18.886580 0.149192 0.915018 -1.305879 -0.389876 -0.014211 -0.003001 0.002962 -0.004242 -0.012546 +0.510786 49.429798 -1.181906 -108.638824 8.474520 -5.490154 0.000000 0.000000 -0.000000 19.763369 -7.300800 -0.230977 8.733568 8.493106 6.557073 2.484909 -1.627514 3.424811 4.535034 -5.542281 -2.048529 7.880111 5.643724 -4.741834 24.113904 -8.496304 7.536380 -46.062101 0.003211 0.074745 1.004009 0.000003 -0.000007 -15.066455 0.663703 -2.470867 -14.812543 -2.409406 9.040596 -25.091518 -4.839081 -10.482321 30.638393 -3.188829 4.083441 -25.162083 -4.342346 1.425617 6.259412 6.920780 11.314060 -0.136324 6.520837 24.250001 0.536847 0.491984 11.881199 -31.602847 10.494181 3.412486 22.309108 0.378988 3.231931 -7.015793 3.884184 -0.415547 6.518196 -1.129720 -6.996941 -6.416611 -12.520641 -4.115157 0.235956 -0.247106 -6.402532 -10.021691 -7.702254 4.504285 -28.488887 -0.777319 -8.316834 14.518568 -17.837591 -20.653437 39.970357 2.755375 -0.873329 -49.009619 -8.346639 -0.288498 10.128213 18.158275 15.526878 -0.099852 -0.201777 0.341682 -0.292038 0.037379 0.013996 20.073146 -1.279103 10.912910 34.955955 -2.674216 0.484113 -42.804958 2.188113 2.104965 -1.609160 -3.944498 -18.861110 0.158119 1.014974 -1.440599 -0.389876 -0.014210 -0.003000 0.002964 -0.004241 -0.012545 +0.226774 48.819351 -1.074194 -108.704022 7.908034 -5.393408 0.000001 -0.000000 0.000000 18.439516 -6.789810 -0.833040 8.560026 7.675502 6.206404 3.557398 -1.458556 3.711258 4.684658 -4.700685 -2.009114 11.486264 4.506379 -4.367564 22.405144 -8.197089 6.732640 -47.467666 -0.051754 0.704520 0.192606 0.093570 0.040429 -15.414132 0.636148 -2.288540 -15.138239 -2.500538 9.173538 -25.358184 -5.758676 -10.441978 29.953933 -2.844598 4.867171 -23.421365 -4.223903 1.336269 7.499832 6.281056 11.037915 -1.347970 7.765449 23.753780 0.532055 0.480838 11.608524 -31.561788 9.507105 3.428699 23.351539 0.486788 3.457191 -8.738518 3.964935 -0.484153 8.525066 -1.656450 -7.082669 -7.464556 -11.623830 -4.103983 0.247790 -0.255758 -6.601283 -11.574388 -7.685862 4.498997 -28.921492 -0.564100 -8.015583 13.860316 -16.606883 -23.041822 42.997238 2.944268 -1.031699 -49.144252 -9.113564 0.672546 7.848901 18.230254 15.018040 -0.064076 -0.668721 0.969961 -0.271121 0.039027 0.014191 19.147327 -0.853235 9.768288 38.693821 -2.930907 0.629752 -44.178838 2.206437 2.057725 -3.275198 -3.935711 -17.879053 0.162854 1.067026 -1.510774 -0.358498 -0.016675 -0.003304 0.002968 -0.004241 -0.012545 +0.109316 48.111301 -0.815059 -108.864260 6.682901 -5.173791 -0.000002 -0.000001 -0.000000 17.238452 -5.689910 -1.979045 7.999162 6.679244 5.275269 4.449904 -0.926916 4.162558 5.156942 -3.573678 -1.740059 15.801967 3.431941 -2.972670 19.180357 -8.188963 5.644404 -47.928595 -0.100899 1.046470 -1.605361 0.311293 0.132416 -15.783510 0.587312 -2.106239 -15.482240 -2.609635 9.326072 -25.315304 -7.218385 -9.952780 29.032352 -2.703591 6.598941 -22.461068 -4.151871 1.280002 10.950514 6.751015 10.653290 -3.762220 8.561500 22.007167 0.519864 0.477040 11.574419 -31.534799 7.974698 3.793507 24.320551 0.622586 4.243814 -10.341562 4.123473 -0.552754 11.130227 -3.262621 -7.703978 -9.130415 -9.886713 -4.100571 0.277165 -0.294916 -7.569065 -12.927544 -7.685610 4.500134 -29.301628 -0.374464 -7.754401 12.649526 -13.772681 -25.760868 47.167488 3.155408 -1.275307 -47.853141 -10.638274 2.938536 4.281014 18.434176 13.393632 0.050847 -1.665624 2.283348 -0.207266 0.030029 0.014322 17.802214 0.887367 7.230923 43.454177 -3.243012 0.838904 -44.703267 2.198651 1.862651 -6.355255 -4.706853 -15.768843 0.145244 1.104621 -1.557892 -0.285284 -0.022427 -0.004008 0.002969 -0.004242 -0.012546 +0.147770 47.320850 -0.459736 -109.079513 4.974431 -4.921060 -0.000001 0.000000 -0.000000 16.182350 -4.126266 -3.532235 6.933015 5.626388 3.734654 5.225513 -0.090111 4.948810 5.983804 -2.329454 -1.120007 19.921846 2.699993 -0.823465 15.113073 -8.333599 4.367584 -47.193931 -0.106226 1.007191 -4.026876 0.668310 0.258610 -16.162465 0.558652 -1.924063 -15.839780 -2.721993 9.487803 -25.135876 -8.950639 -9.158613 27.553401 -2.849117 9.020148 -21.008844 -4.070998 1.205184 15.310234 7.591690 10.150395 -6.774763 9.284357 19.343393 0.522182 0.479076 11.616249 -31.521142 6.152648 4.409671 24.866419 0.665473 5.211972 -10.985043 4.338738 -0.575497 13.564987 -5.601477 -8.504483 -11.159442 -7.560208 -4.093961 0.318460 -0.353433 -8.994549 -14.058105 -7.679743 4.496438 -29.616101 -0.217152 -7.532323 11.264027 -9.829127 -28.222371 51.709907 3.352928 -1.561870 -45.358989 -12.570280 6.101684 -0.000181 19.020160 10.975392 0.246900 -3.069559 4.157624 -0.142857 0.014066 0.014251 16.400688 3.815166 3.804058 48.582050 -3.558379 1.092306 -44.586801 2.465958 1.788669 -10.242248 -6.431930 -13.069134 0.139734 1.302944 -1.786113 -0.189229 -0.005430 -0.004140 0.002961 -0.004242 -0.012545 +0.235103 46.463299 -0.102988 -109.314772 3.183147 -4.694570 -0.000001 0.000000 -0.000000 15.235402 -2.449488 -5.204385 5.441223 4.661128 1.847513 5.945963 0.823626 6.055967 7.029999 -1.169544 -0.177858 23.039463 2.330631 1.441557 11.174150 -8.455032 3.115585 -45.487603 -0.068283 0.671977 -6.449898 1.097614 0.404221 -16.542008 0.507814 -1.742170 -16.224656 -2.839992 9.647495 -24.910169 -10.606909 -8.310009 25.572379 -3.299766 11.457308 -18.532313 -3.946598 1.076929 19.049880 8.121232 9.674066 -9.502771 10.192468 16.548779 0.521796 0.478742 11.609282 -31.510389 4.410768 5.061241 24.996372 0.527616 6.143914 -10.581396 4.566443 -0.561954 15.353713 -8.037176 -9.295509 -13.131528 -5.143653 -4.067770 0.363408 -0.417231 -10.510659 -15.020484 -7.651587 4.491999 -29.883669 -0.075662 -7.320513 10.109058 -5.671714 -30.220097 55.997274 3.511368 -1.869602 -42.575052 -14.439334 9.425522 -4.195360 19.907314 8.498249 0.495017 -4.579651 6.226686 -0.078451 -0.001901 0.014200 15.265216 7.170958 0.411738 53.494416 -3.837970 1.360547 -44.435245 3.077021 1.863094 -14.029945 -8.690532 -10.556384 0.167314 1.679963 -2.281583 -0.094272 -0.002374 -0.004732 0.002969 -0.004242 -0.012545 +0.373837 45.556850 0.163622 -109.502587 1.650997 -4.616657 -0.000000 0.000000 -0.000000 14.388661 -0.926144 -6.759865 3.515797 3.950574 -0.247852 6.621886 1.663235 7.480014 8.282834 -0.360270 1.286015 24.784393 2.200217 3.126507 8.274751 -8.442126 2.125878 -43.316109 -0.005452 0.133810 -8.251981 1.565136 0.555704 -16.962734 0.477958 -1.560189 -16.595407 -2.956797 9.831582 -24.737305 -11.791382 -7.663188 23.077501 -4.140080 13.080851 -14.340544 -3.789823 0.860199 20.383806 8.080757 9.541178 -11.014237 11.244747 14.417143 0.519283 0.476534 11.563962 -31.547484 3.154091 5.568650 24.553607 0.016836 6.924329 -8.650158 4.773595 -0.482113 15.776493 -9.937111 -10.226673 -14.619220 -3.110524 -4.014709 0.424307 -0.483726 -11.972923 -15.781406 -7.663931 4.489950 -30.100452 0.052218 -7.168929 9.486531 -2.027177 -31.798358 59.768854 3.651917 -2.150287 -40.813347 -15.878720 12.015133 -7.562339 20.655609 6.683157 0.766422 -5.809024 7.904463 -0.022619 0.002722 0.007764 14.536588 10.151631 -1.976987 57.873344 -4.066945 1.619048 -45.021290 3.880950 2.049621 -16.970429 -10.814196 -8.967921 0.211645 2.173721 -2.947420 -0.027207 0.002874 -0.005056 0.002964 -0.004242 -0.012546 +0.486356 44.638199 0.282904 -109.600000 0.623803 -4.698602 -0.000001 0.000000 -0.000000 13.598058 0.161567 -7.994242 1.376649 3.567291 -2.305242 7.192906 2.265651 8.996864 9.677338 -0.000024 3.286670 25.556816 2.107388 3.813149 6.936502 -8.289072 1.564705 -41.598889 0.022083 -0.437447 -9.062292 2.063326 0.704323 -17.383357 0.446766 -1.378433 -16.979641 -3.077127 10.000214 -24.672645 -12.322754 -7.377956 20.201161 -5.222226 13.330155 -8.345549 -3.633030 0.550332 18.465784 7.662647 9.842061 -10.914645 12.250140 13.529648 0.519863 0.477044 11.574419 -31.585582 2.606999 5.800429 23.585647 -0.924098 7.574184 -5.232902 4.921014 -0.345620 14.635487 -10.881728 -11.505000 -15.367236 -1.714441 -3.942163 0.461601 -0.540949 -13.282769 -16.417022 -7.649340 4.492500 -30.276271 0.171512 -6.997373 9.487145 0.524228 -33.250730 63.210867 3.789418 -2.375810 -41.178199 -16.639393 13.171151 -9.793889 20.723240 5.997999 0.891618 -6.295223 8.590768 -0.001546 0.005053 -0.013000 14.114834 12.057205 -2.779275 61.781001 -4.242627 1.872003 -46.842618 4.391574 2.271475 -18.778565 -12.021050 -8.594956 0.243789 2.525887 -3.422436 -0.001977 0.011411 -0.004963 0.002963 -0.004242 -0.012546 +0.510038 43.707351 0.100417 -109.537002 0.814424 -6.489978 0.000001 0.000000 0.000000 12.788986 0.461473 -7.198182 -0.762925 3.639002 -3.951509 7.676373 2.412790 10.398926 11.231477 -0.000777 5.485606 25.450084 2.004430 3.680245 7.083448 -8.094785 1.375716 -40.462090 0.030080 -0.997871 -8.213064 2.940632 0.864339 -17.804359 0.393415 -1.238951 -17.383023 -3.209133 10.159973 -24.531084 -12.300806 -7.323652 16.273729 -6.544287 12.460164 -0.479491 -3.470554 0.159039 13.427328 7.072882 10.491705 -9.041171 12.950283 13.614942 0.525274 0.481794 11.672033 -31.629455 2.623473 5.805553 22.002302 -2.158265 8.039725 -0.931734 5.029306 -0.178484 12.412856 -11.030237 -13.070024 -15.291335 -0.859935 -3.846598 0.493117 -0.594839 -14.508919 -16.892409 -7.646611 4.482238 -30.410730 0.285915 -6.830525 10.027065 1.558288 -32.949550 66.470413 3.939083 -2.576479 -43.441449 -16.826053 12.966295 -11.246263 20.012799 6.233867 0.837213 -6.095251 8.324728 0.008913 0.005872 -0.012897 14.234028 12.897361 1.065723 70.441254 -4.620635 2.437732 -55.461937 4.745537 3.041251 -19.973597 -12.782535 -9.824797 0.281919 2.900557 -3.928785 0.007382 -0.003348 -0.005518 0.002966 -0.004242 -0.012546 +0.427695 42.806999 -0.634797 -109.321763 1.688096 -9.453629 -0.000001 0.000000 0.000001 11.772523 0.324136 -5.056636 -2.697110 4.026986 -5.043219 8.399157 2.239111 11.644583 12.936891 0.013193 7.268260 25.399597 1.895473 3.519030 7.168256 -7.941443 1.217650 -39.703135 0.023522 -1.486242 -6.883949 3.935735 1.033419 -18.224685 0.367048 -1.113791 -17.783630 -3.355961 10.304906 -24.541916 -12.311249 -7.336416 14.175878 -7.317797 11.947708 2.496192 -3.305139 -0.001024 10.051073 6.632332 10.895497 -6.107604 13.057459 13.468211 0.528748 0.484852 11.734787 -31.638818 2.643454 5.804366 20.926337 -3.072434 8.478603 0.181925 5.215309 -0.138840 11.856448 -11.250503 -14.408716 -14.645025 0.006475 -3.734220 0.540220 -0.656272 -15.796765 -17.262252 -7.635656 4.486081 -30.522682 0.414173 -6.676089 10.115420 1.864057 -31.345654 69.836020 4.092127 -2.809092 -46.229445 -17.122951 12.506712 -12.068373 19.660323 6.438841 0.797908 -5.857704 7.980830 -0.001391 0.005746 -0.033969 15.316622 13.609100 7.985269 79.659608 -4.908434 3.105270 -66.598724 3.886816 4.158693 -21.086843 -12.604542 -11.364539 0.344402 3.322411 -4.504155 -0.003078 -0.002527 -0.005415 0.002966 -0.004242 -0.012546 +0.243327 41.937248 -2.478208 -108.736294 2.347546 -11.570487 -0.000002 0.000000 -0.000000 9.941144 0.132865 -3.817041 -4.134482 4.672400 -5.288077 9.838937 1.857997 12.679164 15.071142 0.000512 8.311676 25.529860 1.748300 3.340455 7.084812 -7.832788 1.118416 -40.027972 0.043664 -1.586107 -6.660640 3.994563 1.019851 -18.665669 0.354260 -1.016588 -18.191502 -3.462487 10.427538 -24.424758 -12.192994 -7.257700 14.693345 -7.598725 11.386005 -2.583756 -2.663371 0.208453 9.306542 6.926279 11.074417 0.679963 12.705335 12.415063 0.537996 0.493034 11.902116 -31.405497 2.582889 5.741320 19.930555 -3.221355 9.161093 -4.206335 5.554704 -0.311073 14.079772 -11.585043 -15.347419 -12.726836 0.964516 -3.615831 0.567782 -0.714874 -17.124489 -17.518084 -7.634114 4.479431 -30.595471 0.518474 -6.494487 8.341836 1.446009 -30.809135 73.611435 4.175329 -3.097154 -50.191367 -17.724569 11.665188 -10.887785 20.425921 6.501298 0.733480 -5.542191 7.542675 -0.001158 0.006779 -0.065426 15.112674 13.841487 14.749163 82.310261 -4.934864 3.330519 -71.737488 3.854924 4.658623 -21.256260 -12.884576 -12.468100 0.372027 3.438669 -4.665695 -0.003077 -0.002527 -0.005414 0.002964 -0.004242 -0.012546 +-0.045109 41.128501 -4.941418 -106.981789 2.664831 -13.183812 0.000000 0.000000 -0.000001 6.263513 -0.071845 -3.202811 -5.112605 5.679126 -4.829445 12.214147 1.244114 13.593920 17.886998 -0.003168 8.685039 25.849921 1.581124 3.115730 6.768967 -7.747381 1.057279 -41.668145 0.066448 -1.190341 -7.678739 2.728285 0.697080 -19.078655 0.340340 -0.954631 -18.599252 -3.569602 10.472475 -22.999879 -11.239496 -6.457809 24.999890 -8.917544 7.754879 -26.941936 -1.797727 1.354164 15.915684 9.486881 11.013012 18.443409 15.687503 8.037598 0.578965 0.544059 13.026174 -30.061361 2.308516 5.352364 19.337492 -1.963881 10.448483 -15.287337 5.867175 -0.784410 18.705774 -11.585796 -15.961260 -9.403447 1.948106 -3.524105 0.592261 -0.772180 -18.417358 -17.697873 -7.609484 4.470781 -30.642948 0.663295 -6.301746 4.365131 0.442024 -30.974232 77.521377 4.230694 -3.431789 -54.629890 -18.348972 10.595223 -8.295924 21.018114 6.279942 0.665986 -5.197446 7.065359 -0.000768 0.008500 -0.117862 12.068192 13.344938 20.956132 80.780094 -4.787484 3.302915 -72.552223 8.981135 4.433640 -17.195106 -19.485576 -13.289245 0.352220 3.376207 -4.577510 -0.003077 -0.002528 -0.005414 0.002963 -0.004242 -0.012546 +-0.408477 40.386798 -7.452634 -104.685601 2.832025 -14.678587 0.000000 0.000000 0.000000 1.711791 -0.378829 -2.406508 -5.738977 6.899254 -4.277113 15.078245 0.505231 14.145742 21.166236 0.001083 8.724431 26.240908 1.381194 2.836042 6.304236 -7.617117 0.998423 -44.078567 0.019574 -0.226267 -9.105881 0.959733 0.249245 -19.446166 0.325339 -0.910527 -18.952651 -3.624039 10.436312 -19.608572 -9.151591 -4.846899 33.422978 -15.933755 3.631485 -46.765250 -1.337713 2.116692 19.331748 13.713864 12.370865 38.778674 19.166917 0.268179 0.704408 0.695112 16.170196 -27.415679 1.789841 4.623360 15.849651 0.071864 12.232157 -25.328250 6.254240 -1.281274 21.628353 -11.228561 -16.761200 -4.772471 2.947630 -3.480719 0.636406 -0.830169 -19.526533 -17.803487 -7.582659 4.448843 -30.679997 0.811605 -6.073321 -0.151718 -1.040908 -31.308371 80.934668 4.213535 -3.767466 -58.927291 -18.893730 9.317664 -5.190555 20.678419 5.881487 0.603667 -4.864490 6.605716 -0.000612 0.009191 -0.138834 8.096668 12.161439 26.653194 76.863348 -4.400735 3.237598 -70.590337 13.922260 3.726266 -11.061986 -26.370166 -12.067864 0.331602 3.233427 -4.382874 -0.003076 -0.002528 -0.005414 0.002964 -0.004242 -0.012546 +-0.826320 39.718497 -9.770056 -103.330109 3.101595 -15.915976 -0.000001 0.000000 -0.000001 -1.740402 -0.734606 -1.149449 -6.249490 7.981322 -4.227566 17.733127 0.044735 13.926871 24.185663 -0.000762 9.021479 26.534296 1.146920 2.525563 5.873726 -7.402008 0.909880 -46.137315 -0.140966 1.012280 -9.880219 -0.003727 0.000813 -19.778693 0.309513 -0.866716 -19.278551 -3.673046 10.345629 -15.536373 -6.514715 -3.218373 36.465008 -23.214970 2.420764 -55.657325 -1.052761 2.401590 18.713076 16.523255 14.149514 47.826158 20.162536 -3.770824 0.796818 0.825353 18.812023 -24.009121 1.132525 3.775361 9.656594 2.155640 14.427034 -31.638514 6.580906 -1.724182 22.171675 -10.708086 -17.823093 0.628563 3.911409 -3.532167 0.656801 -0.878207 -20.574583 -17.859859 -7.552018 4.433454 -30.695036 0.974254 -5.822738 -3.292981 -2.657452 -31.849190 83.821632 4.172262 -4.068101 -62.926738 -19.355879 7.890458 -2.340506 19.833848 5.546678 0.551277 -4.572246 6.203297 -0.000245 0.010797 -0.187768 5.902785 10.874472 31.357005 75.315000 -4.192861 3.239724 -71.014127 14.543851 3.571798 -6.761693 -27.812365 -10.467947 0.322488 3.169257 -4.295456 -0.003077 -0.002527 -0.005413 0.002969 -0.004242 -0.012546 +-1.325460 39.208751 -11.708138 -105.040127 4.099490 -16.416608 0.000000 0.000000 0.000001 -1.736413 -1.340520 1.152393 -6.824892 8.290831 -4.202221 20.461958 0.156848 12.096772 26.690717 -0.000234 9.009491 26.726538 0.917831 2.161333 5.512074 -7.110169 0.801574 -47.754953 -0.371330 2.268039 -9.624381 0.014468 -0.007903 -20.055000 0.302833 -0.845800 -19.567857 -3.676021 10.230368 -11.626800 -3.720370 -2.040087 32.471859 -24.387534 3.893891 -54.143701 -1.659764 2.374944 17.129268 14.852949 13.795602 36.462271 15.535805 1.854201 0.755653 0.765433 17.603028 -20.342094 0.491324 2.981054 2.324992 4.623095 16.624696 -35.199505 6.932717 -2.026285 20.870633 -10.021490 -19.053972 6.479600 3.999304 -3.605146 0.675311 -0.924467 -21.569730 -17.888433 -7.520750 4.422502 -30.705069 1.197233 -5.516935 -2.367442 -4.360470 -32.846639 86.207153 4.096366 -4.343058 -66.567647 -19.776299 6.290389 -0.491295 18.852518 5.597502 0.509194 -4.336260 5.879085 0.000920 0.009823 -0.228682 7.292540 9.571228 33.368489 76.700709 -4.140875 3.416651 -74.887384 15.109896 3.911174 -6.478145 -27.317101 -10.815665 0.332433 3.227828 -4.369212 -0.001536 -0.001261 -0.002704 0.002969 -0.004241 -0.012546 +-1.814897 38.815101 -13.560499 -108.436256 5.438114 -16.119879 -0.000000 -0.000001 0.000001 0.395715 -2.116887 3.918970 -7.558816 7.537333 -3.499606 23.339340 0.473176 8.942378 28.909120 0.001972 7.992206 26.885589 0.684901 1.794457 5.150920 -6.788240 0.665250 -49.253093 -0.678319 3.548508 -9.067764 0.033119 -0.032466 -20.289126 0.309451 -0.839079 -19.807646 -3.676594 10.097285 -8.420376 -1.334889 -1.343329 25.418215 -22.025560 5.425268 -50.298399 -2.433120 2.308062 16.783805 10.156392 12.170872 18.324096 5.021515 8.767464 0.636265 0.609569 14.397911 -16.736206 -0.019353 2.314361 -5.904370 7.363951 18.710144 -37.042892 7.208461 -2.226847 18.712631 -9.219184 -20.316727 12.566127 3.193972 -3.564710 0.704416 -0.974161 -22.528911 -17.890609 -7.487894 4.404143 -30.714911 1.433274 -5.170795 0.320643 -6.107805 -34.431656 87.959197 3.983388 -4.586569 -69.629974 -20.072305 4.606307 0.893323 18.448846 5.845999 0.477284 -4.153684 5.628671 0.002137 0.009074 -0.276584 9.749177 8.297506 32.705868 78.724631 -4.077391 3.653522 -79.773637 15.505619 4.443975 -6.037267 -26.555324 -11.286832 0.347230 3.319502 -4.488115 0.000005 0.000006 0.000006 0.002968 -0.004243 -0.012546 +-2.264562 38.604499 -15.833030 -110.899941 5.831894 -14.646587 -0.000001 -0.000000 -0.000001 2.365153 -2.586429 6.225029 -8.173207 5.373489 -2.164576 25.291779 0.880965 4.471811 30.312120 0.000915 5.925321 26.899033 0.455470 1.398488 4.890045 -6.413948 0.509677 -50.175789 -1.009096 4.811240 -8.312315 0.084588 -0.040535 -20.470970 0.312064 -0.806617 -20.001321 -3.668184 9.979964 -6.747128 -0.145348 -1.082905 19.615624 -18.964368 5.865819 -49.290928 -2.809908 2.280660 18.165829 6.145120 10.976033 5.048820 -4.317256 12.430159 0.547393 0.501114 12.059392 -13.633979 -0.119552 1.833113 -12.409040 11.425572 19.885058 -42.312227 7.862873 -2.406678 18.599396 -8.433279 -21.032440 27.242576 -7.257307 -2.008373 0.715150 -1.005224 -23.199722 -17.629484 -7.252564 4.413880 -30.706042 1.782592 -4.610899 0.074987 -7.493878 -37.385569 88.026884 3.771934 -4.775160 -70.806111 -20.051237 3.048293 2.890213 19.992592 5.688948 0.458031 -4.036081 5.467489 0.002531 0.010798 -0.329016 10.278634 6.865726 30.505487 80.024925 -3.949916 3.878173 -83.146666 15.826305 4.791879 -6.097708 -25.391845 -11.650487 0.357454 3.389849 -4.584038 0.000005 0.000006 0.000005 0.002966 -0.004243 -0.012546 +-2.565178 38.570899 -18.821718 -111.268679 4.855906 -12.031365 -0.000000 -0.000001 -0.000001 3.391269 -2.307511 7.341608 -8.161981 2.794123 -0.740976 25.673108 1.433132 -0.415064 30.390194 -0.003094 3.554039 26.385463 0.247335 0.829701 4.666549 -6.200120 0.534714 -50.361851 -1.336527 6.287397 -7.570865 0.111404 -0.062658 -20.611027 0.300019 -0.788376 -20.143022 -3.671657 9.886968 -6.841099 0.036483 -1.093441 18.944179 -17.697153 6.216655 -55.676427 -3.207294 2.487674 22.497769 6.139280 10.939064 3.494529 -6.487709 12.855498 0.551646 0.507245 12.199090 -10.851495 0.044720 1.454200 -22.111274 13.126535 21.754567 -40.991172 8.049665 -2.402120 15.688083 -8.355018 -22.202162 40.023415 -10.878542 -0.346196 0.743803 -1.061250 -24.288746 -17.033842 -6.779284 4.458640 -30.692141 2.255803 -3.838398 -5.597989 -7.650679 -41.835310 86.684957 3.459517 -4.917280 -69.344438 -19.567657 1.793836 7.214414 23.854197 3.985759 0.443066 -3.943193 5.340294 0.002820 0.012057 -0.367461 6.750379 5.824514 26.740809 81.753860 -3.702961 4.236240 -85.962001 16.207289 5.013192 -1.739921 -26.046587 -10.050833 0.375801 3.513944 -4.753355 0.000003 0.000007 0.000005 0.002971 -0.004241 -0.012545 +-2.466664 38.787600 -22.091938 -111.043438 2.998797 -7.852682 -0.000000 0.000000 -0.000000 5.716423 -1.115877 6.399658 -7.141758 1.321941 0.399869 24.341366 2.204018 -4.816803 28.780000 -0.008302 1.796287 25.371729 0.223373 -0.093288 4.414324 -6.914502 1.313115 -49.785293 -1.680319 8.304670 -7.042775 0.119167 -0.079048 -20.705742 0.280324 -0.763416 -20.244960 -3.678706 9.859446 -8.777983 0.067475 -1.355755 21.067681 -19.456844 6.136639 -62.091965 -3.805087 2.688832 27.310538 9.007708 12.648579 3.355876 -3.447471 13.278381 0.668792 0.646428 15.144455 -7.159109 -0.000591 0.974252 -16.174889 16.220746 11.296853 -60.014454 7.087954 -2.768097 21.700448 -7.524881 -23.256935 65.559622 -11.112517 0.023998 0.765032 -1.108766 -25.227915 -16.172632 -6.109061 4.562007 -30.650291 2.787778 -2.898572 -14.459620 -4.839750 -46.947539 85.002926 3.188017 -5.015204 -64.910352 -18.697544 0.735750 15.752089 28.614992 -1.087370 0.426688 -3.839942 5.199003 0.003144 0.013433 -0.409401 1.615323 5.913407 21.526545 82.832531 -3.450473 4.548578 -86.285802 16.643722 4.992415 2.899484 -27.242338 -8.084834 0.392944 3.627652 -4.908620 0.000005 0.000006 0.000005 0.002964 -0.004242 -0.012545 +-2.055304 39.132498 -25.414055 -110.618657 0.904333 -3.078153 -0.000001 0.000000 -0.000000 8.324825 0.282180 3.801089 -6.037425 0.603994 1.118245 22.515601 2.811893 -8.160965 27.149664 -0.000187 0.695022 24.102604 0.543212 -1.125555 4.161839 -7.957301 2.308779 -48.823893 -1.901819 10.224279 -6.794478 0.113772 -0.070369 -20.751476 0.259934 -0.710738 -20.296144 -3.691140 9.884136 -11.588528 0.112012 -1.732360 22.435614 -22.141821 4.962162 -65.253080 -4.397330 2.789514 30.692107 12.063384 15.175749 2.902812 -0.164266 13.925219 0.802689 0.833809 18.983663 -3.393591 0.006645 0.473849 1.593392 21.483084 1.984269 -78.628940 4.437846 -2.775468 25.538271 -5.805766 -26.104845 80.778686 -11.955230 7.227160 0.787799 -1.160009 -26.222831 -15.228384 -5.362547 4.709677 -30.616550 3.337107 -1.936294 -23.131513 -0.338725 -50.813641 83.747647 3.421481 -4.695376 -58.956122 -14.536634 -0.601784 22.358087 29.104994 -6.474409 0.397841 -3.653995 4.944792 0.003624 0.015501 -0.472320 -4.080093 7.293089 16.216272 82.900697 -3.155418 4.811627 -84.236006 17.106386 4.668684 6.575571 -28.599021 -6.379377 0.406561 3.716519 -5.030044 0.000010 0.000006 0.000005 0.002964 -0.004242 -0.012546 +-1.243322 39.529250 -28.755045 -110.024091 -1.034787 1.459209 -0.000002 0.000000 0.000000 9.852648 1.477985 -0.568356 -5.857849 0.057004 1.340771 21.153936 3.143437 -9.643772 26.810430 -0.004676 0.273263 22.643391 2.158089 -1.727270 3.864653 -8.912200 3.102361 -47.731204 -1.824933 10.970456 -6.584637 0.113526 -0.070778 -20.758550 0.253028 -0.658246 -20.288894 -3.732478 9.989524 -14.610492 0.172351 -2.133682 19.791040 -23.829732 1.738404 -62.855921 -4.656067 2.747841 31.620144 13.108464 18.266721 3.972888 0.168050 14.265649 0.907679 1.000726 22.253611 0.135114 0.060773 -0.027462 16.817159 23.104477 -5.796376 -79.847780 1.961318 -2.522486 24.603323 -3.771961 -28.040722 75.383688 -12.142464 14.980960 0.785413 -1.174998 -26.621834 -14.339775 -4.618393 4.887863 -30.593486 3.812975 -1.084295 -28.086984 3.047205 -52.703323 83.682717 4.222880 -4.010672 -55.607627 -8.471094 -3.808399 21.533841 25.685228 -7.241930 0.334378 -3.223770 4.357843 0.003943 0.016869 -0.514263 -10.139921 10.081986 12.034613 81.779939 -2.839891 4.979802 -79.827604 17.382880 3.998022 9.393762 -30.321192 -4.928140 0.413602 3.761976 -5.092184 0.000008 0.000006 0.000004 0.002963 -0.004242 -0.012545 +-0.120984 39.877200 -32.062571 -109.406677 -2.523774 5.021521 -0.000003 0.000000 -0.000000 10.637988 2.424240 -5.886942 -6.208360 -0.440106 1.841758 20.171539 2.976948 -9.318884 27.184715 -0.002971 -0.866033 21.011445 5.245941 -1.303258 3.531718 -9.914699 3.805584 -46.609940 -1.559833 10.668810 -6.095006 0.116247 -0.077896 -20.737794 0.231814 -0.605875 -20.242118 -3.795206 10.174460 -17.156190 0.198178 -2.464132 14.736615 -24.946800 -1.760803 -57.384012 -4.761803 2.590720 31.284996 13.520821 21.514427 5.710466 0.097664 14.404756 0.994083 1.160832 25.314303 2.922522 0.090055 -0.428691 22.335879 19.178633 -7.931873 -69.113208 1.643756 -2.330305 21.572262 -2.248201 -27.717548 52.927167 -14.528512 12.375940 0.775518 -1.147885 -26.077047 -13.615595 -3.964433 5.124830 -30.563965 4.194127 -0.406565 -24.555198 0.710815 -54.212813 87.129206 4.967127 -3.737559 -59.949645 -2.992231 -10.847591 11.891261 20.291676 -0.986769 0.268836 -2.743167 3.704002 0.004266 0.018250 -0.556206 -16.313058 13.547381 9.616031 79.699019 -2.532087 5.078007 -74.003903 17.350212 3.086424 11.943716 -32.382209 -3.444311 0.414240 3.766103 -5.097832 0.000006 0.000005 0.000006 0.002973 -0.004242 -0.012547 +1.375091 40.057249 -35.304217 -109.035965 -3.107575 6.346301 0.000000 0.000000 -0.000000 10.772047 2.958685 -9.945137 -6.833773 -0.472212 1.979945 19.787083 2.732813 -8.297607 27.751642 0.004997 -1.821006 19.203723 5.036622 -0.165501 3.093847 -8.238849 2.764903 -45.175220 -1.471391 12.184682 -4.538693 0.114090 -0.081025 -20.553129 0.153252 -0.403651 -20.048011 -3.862959 10.474203 -18.351713 0.107689 -2.584116 7.853687 -25.975875 -4.361268 -50.280552 -4.805538 2.314011 29.521088 13.737456 24.671074 8.560710 0.793424 14.239796 1.083534 1.323677 28.195449 4.289020 0.089383 -0.608778 18.895955 13.971250 -7.422250 -48.659269 2.527043 -1.835688 14.334075 -2.190424 -26.888229 31.429793 -17.603152 3.535563 0.775355 -1.138448 -25.846187 -13.257979 -3.528735 5.399573 -30.545658 4.372560 -0.087274 -20.533400 -5.165749 -52.532108 87.907398 5.034507 -3.763551 -63.779270 1.146109 -19.313821 4.196097 14.882867 4.223813 0.190574 -2.106115 2.839982 0.004757 0.020314 -0.619126 -22.713960 16.699941 9.930218 76.420491 -2.268347 5.032667 -67.163677 16.717207 2.051388 14.836286 -34.760409 -1.537901 0.405607 3.710318 -5.021570 0.000003 0.000008 0.000005 0.002966 -0.004243 -0.012546 +3.215258 40.054197 -38.413672 -109.197710 -2.732290 5.189423 -0.000002 0.000000 0.000001 10.593232 3.110200 -11.425067 -7.595945 0.149588 1.152204 19.919326 2.864628 -7.537671 28.276288 -0.001299 -1.516198 17.703253 5.442067 0.858997 2.704988 -7.932230 2.675791 -43.559602 -1.270222 13.707990 -1.058631 0.108962 -0.087801 -20.221403 0.026005 -0.061431 -19.702359 -3.936801 10.847464 -18.208013 -0.104474 -2.515652 -0.232584 -26.845545 -5.970299 -42.848135 -4.733742 1.921792 26.721210 13.382396 27.469492 12.810975 1.624730 13.698142 1.144850 1.456012 30.532872 4.743730 0.127225 -0.694978 10.555842 15.624242 -4.041297 -24.053293 3.892420 -1.131483 3.672559 -4.099216 -26.146418 22.086191 -23.874776 1.987164 0.765456 -1.115078 -25.385312 -13.188154 -3.269338 5.709868 -30.556157 4.400465 -0.037462 -17.852899 -10.466515 -47.510219 86.505254 4.919445 -3.719142 -63.752229 4.828644 -26.693706 -0.409933 9.338394 6.608981 0.067763 -0.885049 1.190976 0.005138 0.021914 -0.668060 -29.424872 18.517242 12.645287 71.580915 -1.970710 4.915644 -58.846376 15.480981 0.844691 18.119301 -37.274572 0.956139 0.388864 3.600781 -4.871914 0.000006 0.000008 0.000008 0.002964 -0.004242 -0.012547 +5.498910 39.932097 -41.336165 -110.269046 -1.293237 1.389901 -0.000001 0.000000 -0.000000 10.824523 2.837857 -10.878310 -8.395640 1.520509 -0.034154 20.083413 2.926446 -5.928011 28.563259 0.003067 -0.757960 16.571678 6.281951 1.893793 2.398371 -8.993313 3.513553 -41.442606 -0.823630 14.987269 1.875738 0.093074 -0.071522 -19.776722 -0.147519 0.411173 -19.239193 -3.985432 11.278163 -17.156561 -0.564957 -2.332033 -9.438264 -27.373149 -6.573748 -34.290560 -4.548548 1.293859 23.231442 12.738598 29.113702 17.662562 2.165035 13.014571 1.168459 1.519522 31.688068 5.062349 0.186112 -0.772124 3.588980 16.596930 -2.987899 -15.472667 4.985126 -0.875436 0.195755 -5.580159 -24.098941 17.165663 -30.128756 3.786398 0.718777 -1.006793 -23.206369 -13.168922 -3.045583 6.021797 -30.556147 4.400466 -0.037462 -15.001675 -13.551012 -40.655232 84.293930 4.742565 -3.663033 -62.815699 8.493212 -30.464171 -0.415379 4.039437 6.534035 -0.032014 0.562456 -0.755188 0.005515 0.023521 -0.716990 -34.008221 17.886830 16.757007 66.397898 -1.842468 4.608212 -51.318184 13.842023 0.019145 20.526913 -39.412040 3.207057 0.366587 3.451902 -4.668686 0.000000 0.000007 0.000005 0.002965 -0.004242 -0.012546 +7.984457 39.773397 -44.063487 -111.538733 0.848176 -3.605619 -0.000000 0.000000 0.000000 11.408136 2.283747 -9.306677 -9.093353 3.320307 -1.171595 19.963553 2.905275 -3.800168 28.563194 -0.007732 0.072714 15.748988 7.213447 3.014616 2.179887 -10.536934 4.681439 -39.246725 -0.261153 16.014040 2.396839 0.087365 -0.063172 -19.302382 -0.330769 0.955235 -18.743928 -4.045472 11.732495 -15.762947 -1.211758 -2.091879 -15.859860 -29.220354 -18.438826 -30.066379 -5.908195 0.992838 20.293145 12.503533 41.639065 23.155789 2.588532 12.203502 1.367676 2.218736 43.561387 4.493815 0.241456 -0.673210 4.238625 18.072649 15.941845 -23.135321 4.861817 -1.139943 4.813899 -1.267960 -40.878539 11.925582 -28.599438 1.494888 0.957015 -1.868969 -39.990579 -13.147799 -2.849902 6.293828 -30.549130 4.400461 -0.038000 -14.633340 -14.972719 -34.479833 86.220490 4.761865 -3.807289 -66.950990 11.083952 -32.816576 3.268641 4.628127 5.670820 -0.012620 0.215944 -0.289923 0.006013 0.025581 -0.779904 -33.516495 12.264396 23.964891 63.342329 -1.328606 4.817928 -48.344825 15.052410 -5.959045 23.235348 -40.461552 4.584004 0.495725 4.269737 -5.787646 0.000006 0.000005 0.000005 0.002963 -0.004242 -0.012546 +10.491161 39.632997 -46.576450 -112.432120 3.417637 -9.011102 0.000000 0.000000 0.000000 12.177412 1.544435 -7.252670 -9.650281 5.516770 -2.378891 19.399349 2.971704 -1.562594 28.167821 0.002807 1.153885 15.369995 8.222371 4.203503 2.048340 -12.509020 6.171691 -37.181653 0.352701 16.910274 2.386310 0.055806 -0.056610 -18.825966 -0.519759 1.546289 -18.248182 -4.101418 12.229383 -13.667591 -0.979241 -1.867096 -12.785089 -33.821437 -15.993763 -40.263881 -5.892758 1.524251 25.987176 11.813380 36.283180 32.588804 6.078548 8.692559 1.291953 1.896802 38.252189 4.337791 0.264092 -0.653729 3.176920 16.929611 15.314923 -27.614754 4.988800 -1.303851 7.401224 -1.632708 -37.639761 6.187002 -24.795977 -1.349551 0.934744 -1.705134 -36.844754 -13.152237 -2.715975 6.481845 -30.549132 4.400462 -0.038000 -14.686652 -14.565073 -30.253958 86.861436 5.005452 -3.679526 -68.849983 10.346962 -32.912961 4.780105 11.674575 4.614391 0.031748 -0.439027 0.590498 0.006422 0.027297 -0.832332 -29.042627 11.288132 24.187852 76.372582 -4.188743 3.323427 -59.789902 7.622535 -2.726800 18.458545 -33.196521 3.132006 0.501631 4.304781 -5.835744 0.000006 0.000005 0.000003 0.002962 -0.004243 -0.012545 +12.846543 39.578096 -48.922855 -112.583140 5.817928 -13.971439 -0.000001 0.000000 -0.000000 12.825384 0.855753 -5.522491 -10.068368 7.811703 -3.855810 18.456708 3.220004 0.377377 27.443780 -0.003185 2.537195 15.384033 9.272514 5.378623 2.007471 -14.499089 7.698582 -35.375993 0.953026 17.981702 2.375793 0.026356 -0.024922 -18.416879 -0.727165 2.138243 -17.818065 -4.146280 12.721932 -11.305993 -0.517750 -1.646106 -6.443980 -38.899062 -11.350093 -53.574421 -5.486097 2.324996 32.429155 10.335470 31.005775 38.302850 8.046011 5.699962 1.189147 1.563698 32.437083 4.209362 0.307188 -0.640675 1.464710 15.165200 16.190917 -30.919427 5.025675 -1.425605 9.589150 -1.833052 -35.353352 1.805294 -20.750244 -3.031075 0.910312 -1.587332 -34.614658 -13.148245 -2.658474 6.561893 -30.549140 4.400462 -0.038001 -15.505913 -14.111916 -25.958405 86.568625 5.213759 -3.497140 -69.885765 9.052473 -31.052570 7.578531 18.463433 3.617955 0.071002 -0.922470 1.241400 0.006779 0.028788 -0.877777 -19.869907 10.323843 20.715311 82.443628 -3.770288 4.195611 -73.370835 10.626509 -1.438947 25.038642 -32.321001 3.554684 0.491581 4.244990 -5.753693 0.000003 0.000005 0.000005 0.002963 -0.004241 -0.012547 +14.934930 39.733698 -51.014438 -111.517270 8.034453 -19.323105 -0.000002 0.000001 -0.000002 13.226531 0.060360 -3.272407 -10.440231 9.995706 -5.627530 16.870603 3.564359 1.869500 26.371397 0.001997 4.136800 16.006157 10.344794 6.476780 2.130207 -16.249643 9.185927 -33.400324 1.728331 19.290321 2.333818 0.012119 -0.020789 -18.119706 -0.882680 2.719435 -17.498260 -4.238055 13.185955 -8.771557 -0.071357 -1.384528 2.134833 -43.343388 -4.595748 -68.026733 -5.209257 3.066511 37.320196 7.324538 29.849442 45.045123 9.031590 2.881981 1.107566 1.385255 29.390367 4.077519 0.339879 -0.625743 -0.223411 13.008347 18.136847 -33.762915 5.047712 -1.542535 11.777883 -1.922942 -33.792872 0.877963 -17.168591 -3.034527 0.893863 -1.509938 -33.100229 -13.312402 -3.310407 6.009821 -31.566577 4.507720 0.221725 -16.981263 -14.407110 -21.050392 86.891987 5.345537 -3.429367 -71.325899 7.951025 -29.200168 12.591750 18.944200 2.038127 0.122567 -1.474099 1.985431 0.007192 0.030504 -0.930203 -17.895273 7.869525 21.938754 76.454970 -1.991898 5.179512 -78.101696 17.898487 -2.405002 40.037781 -36.045185 7.857599 0.512830 4.370748 -5.926305 0.000007 0.000005 0.000005 0.002965 -0.004242 -0.012547 +16.809932 40.029798 -52.910762 -109.808186 9.789271 -24.591964 -0.000001 0.000001 0.000001 13.542435 -0.644601 -1.081376 -10.839797 11.914683 -7.562549 14.937287 3.920244 3.011726 25.136913 -0.011483 5.783010 17.043430 11.462234 7.536498 2.335295 -17.861286 10.620175 -31.605874 2.547875 20.722201 2.291848 -0.002122 -0.016666 -17.953000 -1.056173 3.257301 -17.296919 -4.341270 13.641646 -6.196106 0.297325 -1.109404 12.368154 -46.686194 4.005173 -81.679090 -5.148379 3.601368 40.564586 4.291148 25.876867 53.561853 10.489487 -1.828579 0.958467 1.076359 23.646945 3.931811 0.372689 -0.608759 -1.704748 10.627324 20.617503 -36.236091 5.093602 -1.640084 13.985738 -1.905589 -32.671289 2.736724 -14.143665 -2.156699 0.866315 -1.444678 -31.999442 -13.737758 -4.404790 5.065349 -33.167563 4.646081 0.656124 -19.048081 -15.131531 -16.428195 86.078367 5.416384 -3.296064 -71.366071 6.935484 -27.655063 16.996098 19.111748 0.610294 0.132039 -1.567703 2.111843 0.007604 0.032217 -0.982630 -5.104117 7.207352 19.844733 82.205432 -3.712778 4.212340 -89.253442 14.039835 -1.048375 34.883703 -29.943898 2.656019 0.541640 4.537636 -6.155632 0.000004 0.000005 0.000005 0.002964 -0.004242 -0.012547 +18.196808 40.307497 -54.607536 -108.365602 10.098211 -26.675003 -0.000003 0.000000 -0.000001 13.604486 -0.847261 -1.606604 -11.313488 13.172882 -9.644717 13.134985 4.439099 3.402375 23.751776 0.001809 7.336806 18.548456 12.646999 8.529085 2.400351 -19.246908 11.970967 -29.893301 3.464233 22.173245 2.207916 0.002011 -0.002411 -17.999246 -1.216799 3.731971 -17.285407 -4.489860 14.104130 -3.670562 0.542345 -0.822357 23.549542 -48.993709 14.031068 -94.045335 -5.308659 3.810950 44.052452 3.816704 20.599912 59.900964 11.497094 -7.209695 0.774439 0.791411 18.157235 3.817978 0.388664 -0.615578 -3.761903 7.672316 23.799496 -36.387853 5.037046 -1.690967 15.564141 -1.764750 -32.196922 4.458198 -11.321665 -1.389217 0.859153 -1.418884 -31.501505 -14.414074 -4.986964 4.536544 -33.644406 4.618726 0.841601 -22.589962 -14.707101 -15.007139 84.200857 5.447641 -3.095092 -70.026052 6.076759 -26.432983 20.822092 19.860797 -0.649991 0.106647 -1.311805 1.766365 0.008022 0.033932 -1.035065 7.843660 5.111110 15.736671 82.822424 -4.811232 3.466567 -87.702783 12.179919 -3.272074 20.351932 -23.486497 -3.397152 0.646848 5.115690 -6.952295 0.000005 0.000006 0.000005 0.002966 -0.004243 -0.012545 +19.024860 40.609598 -56.198562 -106.882245 9.937691 -26.575884 0.000000 0.000000 -0.000000 13.383075 -1.317825 -3.349431 -11.989653 14.067465 -11.911625 11.701666 4.873661 3.048874 22.250521 0.003030 8.647781 20.796037 13.911075 9.341790 1.629369 -20.491935 13.396089 -27.783172 4.621378 23.311829 2.123982 0.006123 0.011849 -18.248138 -1.370789 4.138969 -17.456297 -4.685059 14.524083 -1.234772 0.678051 -0.525541 33.914134 -50.020826 23.785786 -104.691399 -5.465295 3.768312 48.496525 5.531929 20.130812 64.927075 10.381129 -11.613693 0.767409 0.777666 17.859100 3.721029 0.379287 -0.600363 -6.065607 4.234243 27.287011 -34.549501 4.918264 -1.696297 16.987687 -1.621528 -32.231202 5.237547 -8.800253 -0.836632 0.868499 -1.423313 -31.470532 -15.248200 -5.314990 4.198556 -33.643126 4.534696 0.904310 -26.904844 -14.124423 -15.996600 81.592463 5.464975 -2.847777 -67.760620 5.396904 -25.488821 23.908288 21.226417 -1.801521 0.063850 -0.839150 1.129148 0.008443 0.035649 -1.087491 12.895372 0.406313 12.317395 79.058900 -4.518151 3.342902 -79.612604 16.654241 -8.077023 9.387576 -21.432286 -6.046165 0.838028 6.064790 -8.269023 0.000005 0.000005 0.000005 0.002969 -0.004240 -0.012548 +19.240925 40.966699 -57.639473 -105.126514 9.817885 -25.333905 -0.000001 0.000000 -0.000001 12.897126 -2.299158 -5.339687 -12.854474 14.592479 -14.266477 10.582257 5.007520 2.358148 20.752801 -0.001505 9.629422 23.913138 15.306860 9.898926 0.058863 -21.363011 14.694410 -25.583284 5.843865 23.953986 1.987580 0.014231 0.004381 -18.903142 -1.525336 4.426545 -18.037270 -4.945440 14.824982 1.024108 0.617237 -0.214986 42.551495 -50.054082 32.161237 -113.136043 -5.461835 3.494038 53.488658 9.986281 23.278810 68.127920 8.314516 -16.419110 0.910790 0.990792 22.006927 3.613902 0.338734 -0.579842 -8.167591 0.465208 30.507416 -30.861914 4.786636 -1.618131 18.081518 -1.601839 -32.718336 5.000500 -6.662706 -0.418232 0.876763 -1.447491 -31.915287 -16.285763 -5.633983 3.862156 -33.642173 4.475875 0.948204 -31.259522 -13.949990 -18.469571 78.353953 5.400881 -2.585790 -64.788685 4.916673 -24.789729 25.983038 23.001298 -2.771914 0.012596 -0.174201 0.234342 0.009030 0.038048 -1.160894 8.309987 -3.409594 10.130110 77.199589 -3.407910 4.029127 -71.754704 26.428113 -12.606284 7.595836 -27.443731 -4.976767 0.918363 6.432539 -8.782408 0.000004 0.000006 0.000008 0.002966 -0.004244 -0.012545 +19.142622 41.348199 -58.979713 -103.368953 9.839428 -23.908873 0.000001 0.000000 -0.000000 12.229781 -3.414714 -7.827955 -13.695750 14.762663 -16.087776 9.420621 4.841417 2.738994 19.356280 -0.001536 10.883858 27.222794 16.773000 10.360801 -1.933042 -21.928678 15.611366 -23.538430 6.588790 23.071827 1.830215 0.010121 -0.009841 -19.909606 -1.668182 4.611810 -18.975759 -5.281434 14.993047 3.035829 0.460744 0.103503 47.904727 -50.902647 37.255636 -119.789128 -5.277806 3.152300 58.761239 16.582251 25.926214 68.510651 6.280399 -19.959056 1.066099 1.276557 27.355425 3.566805 0.218626 -0.579486 -10.058038 -3.197516 32.073784 -25.784072 4.574654 -1.531977 18.506957 -1.706267 -33.579742 4.125716 -5.032489 -0.091818 0.886975 -1.490612 -32.765440 -17.452819 -5.942831 3.524104 -33.627524 4.439699 0.974288 -35.150101 -14.009760 -21.242451 74.841858 5.322821 -2.296674 -61.614776 4.565377 -24.204542 27.487700 24.837087 -3.634969 -0.031356 0.549929 -0.738373 0.009460 0.039764 -1.213323 2.745557 -6.043662 8.136587 76.441442 -3.250778 4.096865 -64.666271 28.256375 -15.435010 1.875795 -27.341256 -6.132765 0.962582 6.628381 -9.056582 0.000003 0.000006 0.000004 0.002964 -0.004241 -0.012547 +18.881550 41.723596 -60.181137 -101.980164 10.034300 -23.161421 -0.000000 0.000000 -0.000001 11.840908 -4.383742 -10.321960 -14.434839 14.436254 -17.087456 7.993344 4.560744 3.876668 18.003348 -0.001200 12.202681 30.605660 18.308442 10.723103 -4.049749 -22.425301 16.414884 -21.607199 6.886527 21.271268 1.634360 0.012548 0.007510 -21.212233 -1.837760 4.729331 -20.218910 -5.689735 15.056057 4.459017 0.238301 0.328717 49.567658 -52.712706 38.371767 -123.284938 -4.896954 2.879210 65.376307 24.423812 24.595406 63.306902 5.624610 -20.793845 1.168016 1.519782 31.769935 3.507281 0.089040 -0.540775 -11.603632 -6.936099 32.553571 -19.564030 4.448153 -1.314497 17.602724 -2.005223 -34.826848 3.157306 -3.398715 0.105285 0.908977 -1.566597 -34.170297 -18.751955 -6.257477 3.194972 -33.605846 4.402968 0.987241 -37.839450 -14.515796 -23.259038 71.432878 5.224833 -2.035404 -58.663627 4.320137 -23.739550 28.485380 26.402756 -4.320707 -0.061985 1.245451 -1.671494 0.009879 0.041480 -1.265753 -1.786965 -8.104922 6.755923 75.646123 -3.437490 3.876607 -59.085872 26.829979 -17.187131 -4.212698 -24.403793 -7.413704 1.019216 6.872876 -9.399664 0.000004 0.000006 0.000003 0.002969 -0.004240 -0.012547 +18.786575 42.050096 -61.218948 -101.265908 10.352500 -23.727513 -0.000001 0.000001 -0.000003 12.014848 -4.914237 -12.301138 -14.993412 13.601654 -17.321887 6.348116 4.330974 5.145300 16.758454 0.001017 13.302854 33.651602 19.798929 11.111251 -5.434843 -23.078054 17.327860 -19.935712 7.000191 19.560698 1.403536 0.021692 0.012648 -22.640180 -2.020402 4.838639 -21.591690 -6.133492 15.082528 5.155245 0.015287 0.461331 47.270220 -54.126808 34.922043 -123.999149 -4.471286 2.720087 74.777758 30.663562 17.579502 53.687565 6.011772 -19.369440 1.200687 1.618266 33.563269 3.446702 -0.139467 -0.504011 -14.069285 -11.190928 32.804979 -10.791822 4.278574 -0.950402 14.325104 -2.407348 -36.394979 2.782252 -1.275366 0.168141 0.925332 -1.659899 -36.009126 -20.131606 -6.556711 2.867088 -33.562855 4.351221 1.001361 -39.053559 -15.459219 -23.679547 68.705760 5.141027 -1.853840 -56.386504 4.110035 -23.351796 29.311084 27.350685 -4.864958 -0.077483 1.765798 -2.369183 0.010358 0.043421 -1.325172 -4.689217 -9.538783 6.674821 75.167459 -3.519090 3.750120 -56.673493 26.078346 -18.079154 -5.817771 -22.609432 -7.295946 1.061701 7.051956 -9.651529 0.000006 0.000006 0.000004 0.002973 -0.004240 -0.012544 +18.821226 42.343149 -62.091160 -101.077274 10.786463 -25.512692 -0.000000 0.000000 -0.000001 12.593157 -5.055225 -13.600201 -15.267039 12.417328 -16.853962 4.718362 4.178606 6.334781 15.679260 -0.001187 14.085205 35.426870 21.075748 11.893188 -4.393573 -23.694805 18.130303 -19.521266 6.818398 18.549153 1.127087 0.014532 0.007710 -24.095445 -2.235772 4.989236 -22.982324 -6.591158 15.142713 5.251298 -0.101670 0.485539 41.243893 -54.606675 26.970815 -123.227223 -4.209587 2.680155 85.489471 32.908015 8.028698 44.323338 6.162636 -17.315101 1.199168 1.605401 33.207307 3.324139 -0.171659 -0.469177 -16.819518 -16.153263 32.747092 -1.175907 4.523291 -0.384853 9.607588 -2.967774 -38.101239 3.005871 1.370456 0.092082 0.941123 -1.759297 -37.873705 -21.581280 -6.816153 2.567823 -33.516223 4.305932 1.023114 -38.969969 -16.932475 -22.651074 66.678280 5.050400 -1.704546 -54.768409 3.921955 -23.070740 29.915660 27.771306 -5.235091 -0.080168 2.137597 -2.867452 0.010837 0.045310 -1.382666 -6.061608 -10.500573 8.023752 74.978539 -3.517746 3.750231 -56.809960 26.016729 -18.288836 -3.753852 -22.087109 -6.328718 1.083687 7.140013 -9.775783 0.000007 0.000006 0.000004 0.002970 -0.004241 -0.012545 +18.756262 42.660497 -62.899147 -100.851536 11.262241 -27.482890 -0.000000 -0.000001 -0.000001 13.073403 -5.160979 -14.446043 -15.334524 11.311749 -16.213459 3.429865 4.028034 7.201091 14.742164 -0.006811 14.550723 37.192900 22.319482 12.641334 -3.428909 -24.115958 18.826044 -19.415395 6.633017 17.845260 0.822824 0.014490 0.007787 -25.439836 -2.489009 5.224242 -24.276211 -7.078015 15.282645 5.240844 -0.108700 0.484955 34.121440 -54.238077 17.508370 -122.143507 -4.203489 2.712696 94.219584 32.156178 0.009982 37.216738 5.931347 -15.373181 1.174458 1.536053 31.971961 3.292351 -0.101985 -0.473554 -17.081920 -19.402062 33.498626 1.720601 4.824862 -0.200252 7.987203 -3.567855 -39.323221 3.319052 4.179176 -0.017872 0.950039 -1.823296 -39.096175 -23.062496 -7.060282 2.277696 -33.451879 4.239904 1.033593 -38.633887 -18.701866 -21.509341 64.689548 4.970655 -1.575770 -53.217440 3.779087 -22.858177 30.277342 28.191059 -5.499092 -0.084230 2.526444 -3.388752 0.011352 0.047363 -1.445582 -7.196659 -11.578592 9.599533 74.554971 -3.495428 3.741054 -56.634830 25.955095 -18.503747 -1.966993 -21.661816 -5.505513 1.108915 7.243659 -9.921922 0.000003 0.000005 0.000005 0.002971 -0.004244 -0.012544 +18.582889 42.984048 -63.655274 -100.565749 11.754844 -29.624362 0.000000 0.000000 -0.000002 13.370928 -5.202579 -14.475691 -15.185448 10.480938 -15.319116 2.731152 3.856308 7.558613 14.091383 -0.005046 14.410814 38.918706 23.486805 13.377212 -2.597011 -24.192523 19.274265 -19.765196 6.456765 17.587846 0.455606 0.014440 0.007879 -26.537824 -2.814030 5.617834 -25.294562 -7.585259 15.607577 5.131994 0.021909 0.421566 27.102157 -52.924745 7.702505 -121.231108 -4.501895 2.845509 98.514377 29.552335 -4.566341 33.744270 5.609727 -13.419623 1.123531 1.414231 29.822705 3.275301 -0.133078 -0.467358 -17.433353 -21.673909 34.324879 3.052805 4.901492 -0.133040 6.840415 -4.250671 -40.002441 3.857534 6.963510 -0.218114 0.953877 -1.857654 -39.756365 -24.546382 -7.276794 2.022523 -33.345097 4.153644 1.065500 -38.041212 -20.746631 -20.246692 62.711932 4.882850 -1.445088 -51.705747 3.687678 -22.725054 30.384116 28.640647 -5.654709 -0.084713 2.923671 -3.921412 0.011872 0.049423 -1.508501 -8.152630 -12.921569 11.268227 73.987608 -3.460612 3.693356 -56.284021 25.879185 -18.744866 -0.361402 -21.098389 -4.737712 1.138938 7.365516 -10.093957 0.000006 0.000006 0.000005 0.002964 -0.004242 -0.012542 +18.323620 43.301397 -64.395603 -100.218882 12.236376 -31.871898 -0.000000 -0.000001 0.000004 13.555884 -5.201499 -13.767112 -15.035072 9.850033 -14.204324 2.434741 3.638298 7.416558 13.672016 -0.000983 13.693398 40.577422 24.595385 14.102427 -1.836407 -24.057802 19.581570 -20.236736 6.337920 17.584052 0.039431 0.014381 0.007984 -27.432028 -3.190397 6.120203 -26.081554 -8.129972 16.115717 4.972709 0.231240 0.363200 20.201660 -50.677920 -2.415786 -120.255961 -4.967636 3.041952 100.296014 25.835911 -7.361598 32.169155 5.905303 -11.112973 1.044775 1.239764 26.633139 3.286277 -0.199106 -0.460623 -17.927962 -23.375894 34.971453 3.903464 4.895132 -0.088148 5.753234 -5.005417 -40.101654 4.588560 9.581784 -0.484914 0.963457 -1.868455 -39.814682 -26.011136 -7.473660 1.806734 -33.237541 4.031069 1.107267 -37.270924 -22.960766 -18.865570 60.735853 4.770900 -1.315098 -50.203647 3.623978 -22.633253 30.352279 29.136613 -5.765163 -0.081286 3.337609 -4.476705 0.012276 0.051017 -1.557432 -8.981150 -14.435485 12.972882 73.342845 -3.453496 3.646179 -55.830341 25.786294 -19.002618 1.130346 -20.454936 -3.998804 1.175460 7.511619 -10.300540 0.000000 0.000005 0.000001 0.002964 -0.004243 -0.012549 +18.005169 43.621896 -65.097988 -99.801405 12.721959 -34.217980 0.000000 -0.000000 0.000000 13.714123 -5.172347 -12.386213 -14.913208 9.301003 -12.689593 2.323536 3.342328 6.815781 13.389065 -0.003774 12.396980 42.123249 25.624320 14.828886 -1.085805 -23.805577 19.789592 -20.638217 6.242692 17.560813 -0.660018 0.014284 0.008159 -28.285969 -3.591851 6.636318 -26.776479 -8.777853 16.821576 4.782773 0.517827 0.270496 13.430988 -47.688367 -13.082049 -118.923557 -5.517326 3.293099 100.392918 21.481316 -8.668608 31.607375 6.842967 -8.364934 0.927384 1.023332 22.578212 3.266106 -0.268362 -0.449304 -18.259434 -24.402146 35.408120 4.347357 4.821444 -0.084275 4.730198 -5.871211 -39.733753 5.341137 11.927825 -0.807040 0.960602 -1.846267 -39.395570 -27.411334 -7.623933 1.614205 -33.076714 3.877418 1.160953 -36.302714 -25.295688 -17.363015 58.773790 4.668263 -1.206762 -48.741925 3.577095 -22.582080 30.153467 29.660069 -5.793317 -0.073556 3.764039 -5.049118 0.012710 0.052731 -1.609861 -9.648608 -16.040694 14.754210 72.607037 -3.438196 3.586192 -55.259420 25.675930 -19.255864 2.452161 -19.816486 -3.344321 1.212532 7.657594 -10.507290 0.000006 0.000006 0.000005 0.002968 -0.004241 -0.012545 +17.625433 43.936197 -65.582371 -99.339420 13.174235 -36.598337 -0.000000 0.000000 0.000000 13.856214 -5.107866 -10.622568 -14.787381 8.767033 -10.845683 2.286273 2.981554 5.885235 13.142060 -0.000902 10.735893 43.555946 26.584776 15.587388 -0.325387 -23.479572 19.933063 -20.956463 6.141264 17.449700 -1.646269 0.014139 0.008404 -29.120167 -4.020239 7.182501 -27.388709 -9.485135 17.644336 4.612170 0.806507 0.195114 7.555092 -43.606942 -23.372384 -117.278118 -5.995397 3.524060 99.838124 17.105239 -9.073864 31.055189 7.643674 -5.118968 0.783007 0.802200 18.279068 3.273416 -0.310061 -0.445079 -18.189252 -24.806861 35.731794 4.406768 4.726867 -0.085532 3.848363 -6.828764 -39.030219 5.859546 13.915899 -1.132203 0.948541 -1.801105 -38.641905 -28.742618 -7.740045 1.467710 -32.893774 3.679603 1.247185 -35.006192 -27.651338 -15.619903 57.154713 4.593286 -1.117336 -47.575207 3.547843 -22.657291 29.664381 30.065909 -5.675403 -0.062635 4.156936 -5.576946 0.013322 0.055130 -1.683261 -9.888072 -17.552115 16.681457 71.716726 -3.436260 3.505998 -54.531813 25.541354 -19.460794 3.388478 -19.320084 -2.901276 1.252251 7.811532 -10.725704 0.000007 0.000005 0.000008 0.002968 -0.004240 -0.012545 +17.213295 44.256696 -65.792828 -98.823576 13.581636 -38.994491 -0.000000 -0.000001 0.000003 13.982747 -5.034561 -8.524683 -14.633996 8.246213 -8.634081 2.302764 2.571814 4.597638 12.940388 -0.003771 8.728904 44.824782 27.464797 16.412842 0.412693 -23.102452 19.963872 -21.149221 6.027497 17.182348 -2.702446 0.013983 0.008664 -29.851784 -4.507535 7.796199 -27.891632 -10.220737 18.530661 4.592740 0.801674 0.182669 1.632774 -36.245474 -33.643513 -112.071670 -6.002642 3.638150 97.763322 12.628493 -9.039903 29.966145 7.314707 -1.205091 0.599546 0.570533 13.550684 3.295063 -0.403938 -0.436248 -17.697749 -24.389111 35.767366 4.107158 4.488279 -0.110315 3.125538 -7.877533 -37.801939 6.028447 15.503737 -1.331934 0.931878 -1.728527 -37.357328 -29.951987 -7.808082 1.395490 -32.681025 3.416261 1.342702 -33.290934 -29.888779 -13.570480 55.988927 4.518389 -1.040442 -46.779506 3.557470 -22.880257 28.815941 30.283682 -5.329089 -0.049124 4.524648 -6.071398 0.013668 0.056494 -1.725209 -9.635243 -18.837820 18.791209 70.672329 -3.426064 3.412571 -53.670726 25.323020 -19.596349 3.866741 -19.072159 -2.695124 1.293646 7.969369 -10.950071 0.000007 0.000006 0.000006 0.002964 -0.004240 -0.012547 +16.773029 44.577199 -65.875851 -98.289803 13.967731 -41.377429 -0.000000 0.000000 -0.000001 14.076765 -4.964567 -6.303694 -14.417024 7.731656 -6.234111 2.340989 2.109872 3.102184 12.709423 0.007928 6.552092 45.949789 28.283438 17.303505 1.127015 -22.670544 19.900837 -21.231955 5.889686 16.749862 -3.583757 0.013848 0.008877 -30.466073 -5.043615 8.497139 -28.282797 -10.952053 19.445132 4.830779 0.346654 0.259271 -3.978938 -25.785894 -42.383995 -101.709542 -5.521634 3.545382 93.344487 8.879096 -8.692496 28.496141 5.811245 2.154501 0.414707 0.368513 9.118472 3.316538 -0.476982 -0.429938 -17.026776 -23.551588 35.304372 3.717644 4.207458 -0.155124 2.511439 -9.004287 -35.987199 5.964530 16.877631 -1.492079 0.918325 -1.634086 -35.491848 -31.035387 -7.836230 1.365420 -32.431556 3.103781 1.474857 -31.317961 -32.019856 -11.314735 55.005790 4.450448 -0.997113 -46.132800 3.563592 -23.149027 27.816552 30.429043 -4.911535 -0.033245 4.875526 -6.543697 0.014201 0.058545 -1.788125 -9.116625 -19.943548 21.023142 69.557970 -3.404263 3.304775 -52.732899 25.102659 -19.704374 4.103846 -19.001112 -2.610803 1.333513 8.118965 -11.163110 0.000008 0.000006 0.000006 0.002966 -0.004242 -0.012544 +16.637029 44.897596 -65.715000 -97.876107 13.746859 -44.201541 0.000001 -0.000000 0.000000 13.843784 -4.314789 -4.573119 -14.017396 6.975953 -3.562093 2.169602 1.715297 2.163056 12.408400 -0.003164 4.332168 46.878605 29.039354 18.328761 1.746912 -22.030902 19.504153 -21.317208 5.543089 15.750914 -5.255486 0.013583 0.009278 -30.873799 -5.659370 9.361608 -28.533628 -11.598612 20.291499 5.118164 -0.153680 0.371544 -8.935659 -14.512669 -48.427431 -86.453552 -4.930591 3.374498 85.124029 6.361523 -7.518279 27.384428 4.026234 3.481843 0.262214 0.214795 5.468869 3.432659 -0.398920 -0.461890 -16.334999 -22.633526 34.021544 3.427709 3.917071 -0.173883 1.566286 -9.957164 -33.383301 6.231259 18.161987 -1.622499 0.881928 -1.489475 -32.771712 -31.949829 -6.917631 1.325537 -30.778678 1.996054 1.744685 -28.881094 -32.824492 -8.359353 54.361906 4.359264 -1.018873 -45.809701 3.059136 -22.629529 26.886765 30.046883 -4.477341 -0.031898 4.902670 -6.580256 0.014758 0.060711 -1.854532 -8.832369 -19.787282 23.723165 68.608810 -3.374380 3.239126 -52.057096 24.589457 -19.326014 4.287138 -19.470725 -2.690505 1.333515 8.118962 -11.163112 0.000008 0.000005 0.000006 0.002968 -0.004239 -0.012547 +16.819229 45.218099 -65.367687 -97.667487 12.884071 -47.499157 -0.000002 0.000002 -0.000006 13.106452 -3.035861 -3.454195 -13.341279 5.964743 -0.907875 2.046654 1.433116 2.028129 11.861904 -0.001428 2.265293 47.638105 29.741374 19.471648 2.274511 -21.311209 18.802572 -21.445293 4.891510 13.954385 -7.976477 0.013127 0.009912 -31.074674 -6.346924 10.390055 -28.663774 -12.162429 21.069153 5.335617 -0.379058 0.420029 -13.139321 -3.895414 -52.080297 -68.878155 -4.352391 3.171031 74.026280 4.253040 -6.136072 26.847275 2.965653 3.248882 0.111688 0.086167 2.224443 3.636140 -0.212402 -0.533432 -15.852355 -21.804605 32.023104 3.359987 3.556913 -0.170948 0.174707 -10.765598 -30.169577 7.094526 19.536492 -1.825302 0.830009 -1.312231 -29.338882 -32.712685 -5.072998 1.244697 -27.792441 0.133818 2.165315 -26.214843 -31.894175 -5.168077 53.947368 4.203825 -1.115510 -45.752565 1.863666 -20.846798 26.134214 29.125541 -4.105254 -0.052143 4.449443 -5.970231 0.015200 0.062419 -1.906961 -9.100174 -18.206289 26.756662 67.821162 -3.335935 3.190294 -51.645115 23.775122 -18.315924 4.497601 -20.578276 -2.898314 1.284039 7.932958 -10.898274 0.000005 0.000006 0.000008 0.002969 -0.004241 -0.012549 +16.907831 45.538499 -64.949879 -97.707021 11.744293 -50.554743 -0.000000 0.000001 -0.000002 11.949615 -1.549671 -2.749959 -12.306524 4.893903 1.440270 2.106024 1.251212 2.300008 11.046785 -0.002432 0.505750 48.247850 30.396146 20.717718 2.738693 -20.786301 18.074876 -21.539837 4.058217 11.613649 -10.903842 0.012605 0.010570 -30.963214 -7.115833 11.669476 -28.644134 -12.556666 21.706440 5.444409 -0.032508 0.381698 -17.078317 5.285281 -53.455626 -49.923521 -3.664631 2.954821 60.908724 2.624908 -4.929039 26.462424 2.537666 2.085058 -0.001139 -0.004912 -0.217534 3.960318 0.100997 -0.638181 -15.466349 -21.092287 29.312830 3.421555 3.171902 -0.166978 -1.244395 -11.689695 -26.503270 8.083082 21.036464 -2.062223 0.765164 -1.116939 -25.398940 -33.221891 -3.191196 1.130182 -24.869693 -1.709520 2.576138 -23.693866 -29.601312 -3.113566 53.264535 3.958079 -1.253776 -45.514128 -0.010226 -17.824647 25.250293 28.238549 -3.702798 -0.076654 3.619811 -4.855456 0.015707 0.064355 -1.966381 -9.655250 -15.986781 29.093716 67.039801 -3.322164 3.123416 -51.411617 22.693671 -16.616068 4.415517 -21.702419 -3.183952 1.200636 7.610980 -10.441227 0.000004 0.000005 0.000004 0.002966 -0.004240 -0.012547 +16.650182 45.858999 -64.597096 -97.746813 10.889274 -53.134876 -0.000000 0.000001 0.000005 10.720778 -0.397477 -2.056856 -11.077537 3.967568 3.305999 2.452252 1.090698 2.362500 10.050045 0.000151 -0.893222 48.971359 31.073256 21.880496 2.822398 -20.071592 17.157398 -22.167075 3.322255 9.802082 -13.110687 0.012186 0.011045 -30.476675 -7.954089 13.230621 -28.450410 -12.800744 22.242196 5.473038 0.964174 0.236218 -20.458590 11.735160 -53.124596 -32.577076 -2.824892 2.699157 48.066141 1.363922 -4.175626 25.310827 2.310600 0.902098 -0.092988 -0.066675 -1.960704 4.351196 0.500527 -0.786567 -15.162731 -20.894068 26.982858 3.754562 2.814907 -0.139200 -2.450535 -12.806788 -23.296589 8.606421 22.924277 -2.242026 0.688230 -0.944375 -21.906899 -33.444410 -2.167570 1.020747 -23.386700 -2.785822 2.663042 -21.306083 -27.090224 -2.576309 52.233134 3.666727 -1.396452 -44.892422 -2.243293 -14.120138 24.070070 27.813944 -3.254132 -0.084597 2.601679 -3.489639 0.016330 0.066752 -2.039788 -10.031352 -14.098024 30.377151 66.193787 -3.355994 3.015511 -51.247762 21.478544 -14.425435 3.992318 -22.349155 -3.479574 1.103944 7.223337 -9.893257 0.000005 0.000005 -0.000001 0.002966 -0.004240 -0.012542 +15.928550 46.179399 -64.560169 -97.469778 10.902010 -55.365901 -0.000001 0.000001 -0.000003 9.679966 -0.107529 -1.064507 -9.648861 3.404272 4.264156 3.219419 0.871490 1.540197 8.878082 -0.000772 -1.691818 49.921727 31.759471 22.741276 2.414725 -19.057736 16.234131 -23.166236 3.097748 9.599446 -13.610795 0.012090 0.011154 -29.351608 -8.814476 15.248968 -27.864291 -12.854953 22.816647 5.747260 1.584023 0.171198 -21.473499 12.351171 -51.608880 -24.849636 -2.136237 2.481192 39.934491 0.679611 -3.718815 22.077102 2.174268 0.146378 -0.129212 -0.091276 -2.674259 4.776196 1.091418 -0.978019 -15.235487 -22.723685 27.697363 4.669338 2.819334 -0.059136 -3.485973 -13.992163 -22.642968 9.668710 25.600569 -2.984675 0.674341 -0.902419 -20.973847 -33.321216 -2.586227 0.204529 -23.665256 -2.982181 2.519809 -18.719343 -25.472549 -3.652849 50.730417 3.326209 -1.514422 -43.697272 -4.702784 -9.922406 22.597428 28.232711 -2.759271 -0.063411 1.420647 -1.906272 0.016780 0.068460 -2.092222 -10.028694 -13.513720 30.283681 65.313805 -3.454287 2.854799 -51.089147 20.125270 -11.743970 3.520573 -22.131330 -3.536280 0.997782 6.777768 -9.266337 0.000003 0.000006 0.000003 0.002968 -0.004243 -0.012547 +14.915016 46.499898 -64.983555 -97.050980 11.174379 -57.575998 0.000000 0.000000 -0.000001 8.406981 -0.096548 0.451249 -7.810628 3.066159 4.177002 4.254209 0.671388 -0.188396 7.517001 0.001935 -1.926657 50.647027 32.287400 23.549825 2.049886 -17.780017 15.314550 -23.897708 3.213539 10.279148 -13.600297 0.012089 0.011148 -27.755399 -9.585620 17.554454 -26.992070 -12.754025 23.419260 6.729852 0.989434 0.368455 -21.061851 9.390611 -50.167876 -25.916565 -2.360844 2.390755 36.875145 0.970650 -2.823110 17.908564 2.445292 -0.423939 -0.093155 -0.066811 -1.963341 5.218219 1.979069 -1.213351 -14.323266 -26.276422 32.883201 5.018274 3.272793 0.010290 -4.636212 -14.850015 -25.381251 12.897524 28.537526 -4.946545 0.726086 -1.021742 -23.464149 -33.057905 -3.579053 -1.321553 -24.350612 -3.021186 2.494953 -15.894576 -24.571874 -5.216370 48.319111 2.925610 -1.614531 -41.548462 -7.121928 -5.501064 21.124348 29.340987 -2.303233 -0.007088 0.198908 -0.266888 0.017232 0.070170 -2.144644 -10.265618 -13.833960 29.332656 64.712997 -3.575349 2.694272 -50.701677 18.671452 -8.918356 3.181879 -21.224787 -3.161583 0.893925 6.318815 -8.623687 0.000004 0.000005 0.000002 0.002964 -0.004245 -0.012552 +13.659930 46.814199 -65.917858 -96.774012 11.373888 -59.529189 0.000000 -0.000000 0.000000 6.926556 -0.090626 2.651602 -5.602918 2.320212 3.138488 5.239769 0.269146 -2.816875 6.152154 -0.002468 -1.896978 51.030300 32.670966 24.352155 1.727918 -16.045512 14.149217 -23.942164 3.504983 11.108926 -13.547843 0.012100 0.011140 -25.702550 -10.133290 20.078899 -25.814181 -12.466192 24.047226 8.155349 0.517193 0.616966 -21.394021 6.359225 -48.240554 -25.770244 -2.571138 2.179411 32.128267 1.493351 -1.442521 14.196971 3.477619 -1.012560 -0.032684 -0.022419 -0.707653 5.607699 3.209699 -1.489282 -8.025715 -25.254561 38.919175 -1.482109 3.056910 -0.102783 -2.621429 -15.055036 -25.776225 22.734884 28.491848 -10.018627 0.746581 -1.075907 -24.592342 -32.705592 -4.600061 -2.824297 -25.232678 -3.051675 2.446934 -12.832739 -24.094812 -6.929501 44.474003 2.455368 -1.627156 -38.043200 -9.302792 -1.054891 19.788887 31.064314 -1.925525 0.088655 -1.070697 1.441323 0.017867 0.072553 -2.218049 -10.754092 -14.430444 27.357228 64.283047 -3.708645 2.535176 -50.047605 17.230809 -5.755796 2.880987 -19.828484 -2.494379 0.791497 5.840322 -7.956798 0.000005 0.000007 0.000002 0.002962 -0.004242 -0.012542 +12.420422 47.122499 -66.967755 -96.692120 11.516420 -61.381500 0.000001 -0.000001 -0.000001 5.500348 0.008936 4.689953 -3.490184 0.879076 2.288246 6.185485 -0.434711 -5.841746 4.745246 -0.009002 -1.902260 51.116641 32.889364 25.175938 1.507335 -13.999029 12.769804 -23.260211 3.898211 11.729466 -13.495380 0.012116 0.011130 -23.419541 -10.414039 22.658920 -24.424825 -12.039326 24.671036 9.681258 0.406090 0.841196 -22.679089 4.726453 -45.689529 -22.452516 -2.594006 1.869608 25.235267 1.890228 -0.025576 11.845980 4.924845 -1.390566 0.024584 0.022002 0.513109 5.942436 4.002810 -1.707456 4.393221 -14.561955 44.329003 -22.009474 2.418344 -0.686147 6.654833 -15.370830 -23.554390 29.204705 26.849824 -12.913640 0.742018 -1.078426 -24.708200 -32.323395 -5.120782 -3.565894 -26.054227 -3.192236 2.224557 -9.559567 -23.621595 -8.400993 40.044206 1.927787 -1.652053 -33.904622 -11.217064 3.309367 18.543001 32.817512 -1.602366 0.230881 -2.407444 3.248467 0.018381 0.074490 -2.277469 -11.266439 -14.550594 24.782960 63.790401 -3.824532 2.399570 -49.381341 15.622040 -1.977080 2.646633 -18.351690 -1.889154 0.677209 5.270358 -7.166332 0.000003 0.000005 0.000006 0.002961 -0.004242 -0.012547 +11.226657 47.455148 -68.123059 -96.730382 11.678430 -63.244886 0.000001 0.000000 -0.000000 4.338503 0.277137 6.536664 -1.768836 -0.881379 1.830822 7.009033 -1.326906 -9.319845 3.373681 -0.005661 -1.789293 50.851484 32.949204 26.032946 1.449064 -12.024522 11.549283 -22.059269 4.468679 12.394407 -13.369478 0.012137 0.011101 -21.009485 -10.369144 25.123094 -22.826452 -11.464553 25.273116 11.077542 0.525934 1.009260 -24.692853 3.954030 -42.678633 -16.477943 -2.465690 1.472515 17.273292 2.084503 1.326111 11.558319 6.835834 -1.654232 0.074299 0.063631 1.629200 6.491988 4.537753 -1.972379 14.623251 -1.991862 42.176954 -38.833905 1.675322 -1.301586 15.499138 -15.925908 -20.977918 31.831932 24.217127 -11.723838 0.735865 -1.046458 -23.977572 -32.034060 -4.930909 -3.297048 -26.843269 -3.848202 1.385729 -5.971302 -23.262411 -9.330331 34.974684 1.344461 -1.677660 -29.021920 -12.808864 7.429723 17.282476 34.610390 -1.336317 0.423804 -3.792766 5.134637 0.018837 0.076193 -2.329901 -11.736754 -14.136214 21.599977 63.087677 -3.924355 2.264892 -48.512320 13.761472 2.508313 2.487220 -16.812757 -1.297332 0.541806 4.534154 -6.151060 0.000004 0.000007 0.000002 0.002969 -0.004243 -0.012546 +10.095137 47.812196 -69.313267 -96.860658 11.943336 -65.103256 -0.000000 0.000000 0.000002 3.535448 0.809890 7.250343 -0.398316 -2.587811 2.631123 7.732327 -2.290326 -12.141179 2.064983 -0.003128 -2.449462 50.338912 32.887469 26.887660 1.533815 -10.433239 10.694469 -20.769244 5.202078 13.310668 -13.187625 0.012172 0.011065 -18.632399 -10.060618 27.385224 -21.111442 -10.776205 25.824290 12.157607 0.709931 1.104282 -26.811045 2.998339 -39.507563 -9.197014 -2.336964 0.983322 9.499514 2.118474 2.550695 11.334414 9.034833 -1.812899 0.116240 0.101837 2.633653 7.211152 5.219885 -2.327231 23.662114 8.305378 33.857227 -51.172450 1.139037 -1.825350 22.879052 -16.193958 -20.476107 36.093645 19.939055 -7.536972 0.746860 -1.079255 -24.672784 -31.784725 -4.532507 -2.697489 -27.774434 -4.814385 0.068121 -2.151345 -23.008691 -9.862490 29.491489 0.736601 -1.716551 -23.582220 -14.043379 11.351824 15.949786 36.358979 -1.121965 0.666692 -5.191514 7.057438 0.019481 0.078583 -2.403303 -12.007483 -13.291442 17.917573 62.167814 -4.001120 2.099430 -47.336766 11.682243 7.496022 2.353354 -15.183460 -0.673338 0.393493 3.626237 -4.906896 0.000004 0.000003 0.000003 0.002963 -0.004238 -0.012547 +9.038576 48.193696 -70.461567 -97.289892 12.315456 -66.558707 0.000001 0.000000 0.000000 3.275339 1.805814 6.336549 0.565667 -3.677601 4.480853 8.472307 -2.981061 -13.696147 0.940742 0.000644 -4.067579 49.688441 32.689013 27.749769 1.700357 -9.517967 10.448531 -19.816566 6.125919 14.717870 -12.897351 0.012227 0.011003 -16.436553 -9.505480 29.252342 -19.333012 -9.982752 26.291723 12.699440 0.719643 1.135697 -28.524821 1.194989 -36.290704 -1.391960 -2.326062 0.425511 3.375998 2.104955 3.453873 9.470587 11.471813 -1.716917 0.166401 0.131938 3.385375 7.791007 6.003760 -2.676931 30.849479 15.002754 19.453910 -59.398295 0.901087 -2.094240 28.802346 -16.401708 -20.175347 38.023960 12.945460 2.264800 0.755113 -1.099784 -25.088358 -31.279215 -4.016036 -1.977100 -28.716799 -5.665495 -1.187185 1.637398 -23.051724 -10.668828 23.987762 0.252921 -1.670897 -18.329018 -13.548207 15.097960 15.593748 37.072928 -1.461437 0.771048 -5.718681 7.787886 0.020031 0.080628 -2.466217 -11.913312 -11.450953 13.687890 61.158370 -4.042197 1.975878 -45.879728 9.624722 12.895102 2.000511 -13.928881 -0.081268 0.241785 2.532806 -3.418396 0.000004 0.000008 0.000005 0.002968 -0.004242 -0.012543 +8.045985 48.556898 -71.498158 -98.031713 12.557950 -67.797530 -0.000001 -0.000001 0.000001 3.335871 3.193417 4.883907 1.094930 -4.148093 6.297194 9.177624 -3.250759 -14.661251 0.185195 -0.008845 -5.824867 49.155114 32.365768 28.571533 1.878729 -9.008757 10.583083 -19.329334 7.136130 16.484642 -12.439199 0.012312 0.010902 -14.470536 -8.797174 30.653401 -17.513679 -9.074408 26.565266 13.678155 -0.090153 1.301910 -29.131481 -1.345670 -33.016622 2.374833 -2.617655 0.108438 1.110187 2.162798 3.786078 6.388209 13.803903 -1.349922 0.173948 0.143062 3.677681 8.234714 7.131583 -3.098119 30.771271 17.338313 8.219171 -57.696147 0.927830 -2.052833 30.075973 -16.870748 -22.814893 35.937188 7.305559 9.826010 0.805036 -1.226376 -27.592058 -30.313349 -3.599196 -1.336483 -29.520309 -5.997200 -1.865312 4.604153 -23.272866 -11.921262 20.136059 0.018451 -1.562034 -14.825786 -11.984507 18.604790 20.945112 37.578153 -5.076824 0.733316 -5.532176 7.529071 0.020585 0.082668 -2.529134 -11.597097 -8.710932 9.271070 60.261736 -4.069480 1.871131 -44.332773 7.704053 18.518470 1.441023 -13.013313 0.542435 0.106443 1.310963 -1.765257 0.000005 0.000007 0.000003 0.002966 -0.004241 -0.012546 +7.044266 49.682996 -72.431065 -99.284667 12.615521 -68.944307 -0.000001 0.000000 0.000002 5.718246 5.152009 3.241989 1.099339 -4.326994 7.932419 7.532359 -3.192305 -15.331938 0.031148 -0.001567 -7.581559 48.707165 31.903305 29.418679 2.089246 -8.525634 10.709084 -18.789097 8.169188 18.089527 -11.680303 0.012457 0.010740 -12.820721 -7.962265 31.327978 -15.669688 -7.997493 26.373996 15.463843 -1.540817 1.690434 -27.432986 -4.663860 -29.406555 -1.261955 -3.040210 0.271675 3.042004 2.366165 3.380657 3.177116 18.114568 -0.749898 0.161710 0.128876 3.309504 8.606793 9.214969 -3.775264 25.989814 17.218007 6.631480 -56.566943 1.610549 -2.045987 30.659622 -17.977202 -30.892991 27.435873 8.234219 3.522934 0.911435 -1.598068 -34.807884 -28.614372 -3.894080 -0.687894 -30.135936 -5.256914 -1.287426 8.342059 -22.550206 -12.473962 13.090357 -0.556638 -1.525364 -8.799494 -10.954821 21.982716 30.884149 38.003305 -11.856790 0.870252 -6.189318 8.443018 0.021141 0.084717 -2.592052 -10.191762 -5.098550 4.821309 56.406867 -3.929995 1.579394 -40.398711 5.645601 24.132799 0.865685 -12.019045 1.386675 -0.043573 -0.795228 1.067534 0.000004 0.000007 0.000004 0.002965 -0.004242 -0.012545 +5.962116 50.510099 -73.329808 -100.883542 12.704493 -70.135212 -0.000000 0.000000 -0.000000 7.484969 7.073587 2.404802 1.182137 -4.486835 8.786594 6.287698 -3.060612 -16.715126 0.065737 0.000400 -8.623982 48.299937 31.322719 30.281386 2.323561 -8.004789 10.763924 -18.094627 9.178397 19.394789 -10.793798 0.014369 0.008106 -11.490591 -7.158564 31.498262 -13.974732 -6.959373 25.966973 16.778145 -2.803310 1.985983 -26.442265 -6.901866 -25.580472 -1.379987 -3.317138 0.252103 2.937252 2.583634 3.034676 0.134540 23.042474 0.059145 0.144564 0.112210 2.968013 8.971674 11.403114 -4.494918 17.235144 16.314845 8.359858 -54.639021 2.611996 -2.068425 31.813333 -19.270932 -36.125820 21.358494 9.802559 -1.255343 0.956040 -1.862677 -39.826697 -26.462419 -4.907152 0.276495 -30.666550 -3.776200 0.138213 12.245033 -21.277394 -12.533298 5.387325 -1.438602 -1.843230 -0.901841 -10.514790 25.457697 39.427381 38.377530 -19.051533 1.271040 -7.845805 10.780277 0.021801 0.086845 -2.657428 -8.515039 -1.385351 0.566583 53.812964 -3.830284 1.402586 -37.277952 4.005383 29.467375 0.159311 -10.980356 2.472943 -0.088292 -2.796167 3.750668 0.000007 0.000005 0.000004 0.002964 -0.004241 -0.012546 +4.741104 51.059499 -74.070683 -102.769339 12.935276 -71.542725 -0.000000 0.000000 0.000001 8.588454 8.943021 2.305771 1.383591 -4.683553 9.011464 5.581894 -2.889063 -18.483037 0.140789 0.005027 -8.984189 47.975316 30.641044 31.159363 2.594745 -7.451326 10.715590 -17.170806 10.106953 20.214341 -9.898492 0.014495 0.007877 -10.650006 -6.538807 31.206921 -12.744586 -6.167971 25.415439 17.773834 -3.974478 2.219742 -25.977729 -8.051976 -21.762850 0.767394 -3.383592 0.138203 1.543357 2.737538 2.706974 -2.214291 26.479187 0.667014 0.119170 0.096069 2.559990 9.270012 12.657442 -4.967400 4.772845 13.208962 13.070354 -48.091716 3.652048 -1.997057 33.393968 -19.369060 -33.227034 13.634284 10.384997 -6.735390 0.940339 -1.747918 -37.640030 -23.953583 -6.258440 1.824305 -31.103106 -1.852341 2.087316 11.921798 -19.322084 -13.859691 6.631405 -1.353068 -1.856430 1.060764 -10.368426 26.000193 45.037232 37.723721 -25.557155 1.266278 -7.827578 10.754384 0.022363 0.088886 -2.720344 -6.507958 2.418499 -3.145498 52.443598 -3.772398 1.312850 -34.919777 2.823134 34.072315 -0.856299 -9.906475 3.810644 -0.055140 -4.457896 5.981855 0.000007 0.000004 0.000004 0.002965 -0.004242 -0.012546 +3.482918 51.511198 -74.586743 -104.794275 13.310384 -73.244811 0.000002 0.000000 0.000000 9.490412 10.803226 2.541824 1.628288 -4.928031 8.780346 5.023150 -2.631915 -20.065250 0.242172 -0.003228 -8.942799 47.689469 29.881285 32.056720 2.893476 -6.889343 10.573999 -16.082142 10.890867 20.552142 -9.157170 -0.230417 -0.054448 -10.227098 -6.151668 30.659204 -12.280555 -5.658885 24.379473 18.631007 -5.067591 2.461325 -25.456402 -8.843512 -18.095065 3.140006 -3.291565 0.051811 -0.021326 2.826135 2.314810 -3.856475 29.489110 0.802222 0.087973 0.076589 2.061279 8.908416 12.327498 -4.753150 -6.877528 9.636529 17.149320 -38.744358 4.401257 -1.881267 34.228528 -18.030309 -26.000914 6.547626 8.006964 -11.368260 0.859882 -1.404928 -31.115657 -21.296869 -7.419041 3.980052 -31.421351 0.040168 4.019212 6.755484 -16.261485 -16.282606 17.696778 -0.231510 -1.613780 -4.180757 -11.164100 23.136049 50.290402 35.995818 -31.967364 0.780342 -5.739706 7.822752 0.022927 0.090930 -2.783259 -4.294148 6.339172 -6.265629 51.613252 -3.742857 1.254135 -32.863188 2.018124 37.952092 -2.087375 -9.000808 5.312408 0.018098 -5.783461 7.768789 0.000003 0.000005 0.000005 0.002966 -0.004244 -0.012547 +2.271033 51.843797 -74.594639 -106.873011 13.833235 -75.502896 0.000000 0.000000 0.000000 9.968416 12.694524 2.635810 1.957797 -5.354335 8.097845 4.771540 -2.165002 -20.449872 0.347580 -0.008082 -8.624047 47.461163 29.080801 32.997234 3.208597 -6.330058 10.280621 -14.815093 11.370462 20.189554 -8.783014 -1.316215 -0.321122 -10.138323 -5.865443 29.748735 -12.146953 -5.203617 22.853316 19.300455 -5.914067 2.657419 -24.895117 -9.533811 -14.768837 5.659535 -2.943559 -0.036975 -1.732546 2.842373 1.851815 -4.138004 31.734158 -0.229485 0.075087 0.054562 1.466800 6.742584 10.040877 -3.436220 -15.263932 8.604331 19.927073 -26.142198 4.650301 -1.601746 32.701339 -15.857642 -18.424558 -0.397820 -3.788824 -16.202222 0.725677 -1.025090 -23.546834 -18.075188 -8.129937 8.303381 -31.674484 2.258197 6.321069 -1.471609 -11.353984 -17.926022 35.733771 1.931768 -1.191344 -13.273016 -4.622580 18.963824 47.030952 28.070737 -30.235995 0.420943 -3.743662 5.073096 0.023491 0.092971 -2.846176 -2.184647 10.753328 -8.458165 51.651728 -3.745025 1.256266 -31.394382 1.530382 41.020044 -3.652488 -8.505548 6.517326 0.076133 -6.510821 8.753468 0.000003 0.000005 0.000004 0.002968 -0.004241 -0.012544 +1.119332 52.078798 -73.733609 -108.865515 14.481136 -78.377260 0.000000 0.000000 -0.000001 9.928911 14.735666 1.413760 2.378988 -5.812061 7.491055 5.077435 -1.246762 -18.727426 0.496616 -0.004247 -8.166116 47.281362 28.272984 33.941086 3.475643 -5.927381 9.966239 -13.777228 11.445464 19.384488 -8.732060 -2.704608 -0.678140 -10.092777 -5.551709 28.518739 -12.018702 -4.707038 21.073759 19.971297 -6.581156 2.869631 -24.118335 -10.476187 -11.806786 7.432337 -2.660342 -0.105922 -3.029662 2.857901 1.356603 -2.564761 33.382427 -1.686791 0.047571 0.032096 0.866248 3.998501 7.009786 -1.963432 -16.935483 8.629447 21.705057 -21.392756 4.238347 -1.426638 33.144294 -12.489249 -12.174773 -3.273713 -3.093794 -21.728811 0.559233 -0.692078 -16.525229 -14.187548 -8.390123 14.284344 -32.028048 4.797869 9.037705 -8.682267 -5.428700 -16.969300 50.020970 3.540592 -1.265360 -17.890781 2.381242 17.736118 43.201724 18.795597 -27.974801 0.361307 -3.346678 4.531104 0.024058 0.095012 -2.909091 -0.388995 16.480422 -9.845840 52.432031 -3.788704 1.299784 -30.541298 1.190135 43.976118 -5.799770 -9.107493 7.920209 0.112853 -6.904272 9.287630 -0.004086 0.018633 -0.566235 0.002963 -0.004242 -0.012546 +-0.126758 52.130746 -72.047932 -110.678996 15.109633 -81.950525 -0.000000 -0.000001 -0.000000 8.703563 16.957183 -0.942972 2.957236 -5.488949 7.342586 6.458777 0.388638 -15.098535 0.835538 -0.004066 -7.502892 47.278577 27.533392 34.830676 3.585703 -5.801437 9.674575 -13.745951 10.846157 18.282780 -8.812534 -3.905917 -0.986781 -10.096833 -5.221504 27.039049 -11.946222 -4.233577 19.190833 20.634642 -7.225779 3.109338 -23.242105 -12.730911 -9.260253 8.619665 -2.665637 -0.190307 -3.956072 2.932333 0.869412 0.013673 34.982351 -3.378341 0.020716 0.010432 0.279636 1.839815 4.106778 -0.947554 -11.694567 9.041966 21.725934 -25.234779 3.894678 -1.498445 34.997085 -8.978222 -8.150120 -4.956201 -3.860706 -24.317336 0.405389 -0.460199 -11.376821 -10.188127 -7.993458 19.938374 -32.343338 6.846462 11.280789 -13.446989 0.452783 -12.932183 55.127048 3.937200 -1.448787 -16.274175 3.783122 22.168443 42.779701 14.548584 -31.040529 0.725318 -5.467096 7.444509 0.024629 0.097056 -2.972008 0.283586 23.423953 -9.889894 54.700565 -3.903758 1.435799 -30.985003 1.128732 46.256383 -7.559915 -10.992640 10.342076 0.054915 -6.262893 8.417439 -0.017747 0.088645 -2.684423 0.002965 -0.004244 -0.012547 +-1.507045 52.048299 -70.158589 -112.359854 15.679340 -85.623482 0.000002 -0.000001 -0.000000 6.555215 19.275790 -3.324790 3.707083 -4.641863 7.491228 8.125730 2.287998 -11.109707 1.218414 0.014295 -6.651831 47.296983 26.856050 35.715419 3.590482 -5.680767 9.198871 -14.226802 9.753550 16.744537 -8.963148 -4.456983 -1.159706 -10.173487 -4.900308 25.441018 -11.924960 -3.784276 17.324811 21.271470 -7.880497 3.371487 -22.312764 -15.565614 -6.867877 9.538713 -2.994536 -0.290813 -4.586287 3.636429 0.266562 2.565972 36.042223 -5.166858 -0.011297 -0.013727 -0.383722 0.467788 2.001604 -0.366714 -5.653724 8.108673 21.079453 -29.547410 3.448822 -1.589831 33.657496 -4.921664 -5.828007 -4.815100 -7.577787 -23.972212 0.265220 -0.281507 -7.151209 -6.991821 -7.037659 23.432390 -32.440742 7.804495 12.328366 -19.174103 6.758440 -6.221746 55.752532 3.977214 -1.468248 -12.319048 2.687892 21.298566 44.139052 15.868516 -38.829843 0.897664 -6.291800 8.591756 0.025333 0.099548 -3.048907 -1.071100 30.366714 -8.506127 61.258840 -4.203682 1.853451 -34.894468 1.686067 46.575955 -4.829523 -13.380259 15.656573 -0.087576 -2.527530 3.390470 -0.031593 0.180122 -5.431810 0.002966 -0.004242 -0.012545 +-2.877842 51.947599 -68.381962 -113.071868 15.852820 -89.000797 0.000000 0.000000 -0.000000 3.856316 20.735262 -5.170523 4.354591 -3.413951 7.514436 9.487919 3.922122 -7.439011 1.522866 0.000165 -5.535871 47.260232 26.206770 36.498882 3.556514 -5.531736 8.469195 -14.925517 8.181916 14.464952 -9.224745 -4.209016 -1.141568 -10.336229 -4.605067 23.783831 -11.994612 -3.388819 15.578830 21.680603 -7.636534 3.434213 -18.867411 -18.832294 -4.507810 4.872128 -3.347892 -0.121038 -2.368440 5.042955 -0.537767 5.388739 33.631644 -6.659295 -0.039297 -0.035170 -0.980817 -0.574140 0.718785 -0.028391 -0.913863 5.782912 20.635378 -30.517692 2.826313 -1.547864 28.095509 -0.057179 -3.609878 -2.851231 -12.440042 -22.537323 0.110213 -0.106062 -2.723205 -6.034378 -2.809284 21.851186 -31.287313 6.594158 10.844567 -24.704259 12.429199 2.953142 53.724101 3.890137 -1.351259 -11.807486 0.023636 3.950558 40.582736 12.658420 -34.063900 0.087507 -1.007548 1.361749 0.026001 0.101926 -3.122308 -4.089032 34.828811 -5.989599 70.767815 -4.636864 2.458186 -41.568882 3.039566 43.380644 4.223166 -14.535182 24.142350 0.399168 3.655148 -4.946271 -0.040995 0.271570 -8.161710 0.002966 -0.004242 -0.012547 +-4.311808 51.804197 -66.326160 -111.331038 15.207667 -92.372993 -0.000000 0.000000 0.000001 0.480212 19.903166 -6.919731 4.828018 -2.026644 6.285819 10.656438 4.952838 -3.564417 1.589878 0.002954 -3.476758 46.838124 25.564346 37.136596 3.571222 -5.462114 7.631422 -15.314303 6.347056 11.416284 -9.627988 -3.664148 -1.056736 -10.567727 -4.338018 22.108085 -12.136485 -3.057040 13.955133 21.213414 -6.268077 3.070777 -0.142458 -20.959224 1.215776 -27.916659 -2.576695 1.455569 13.079814 5.471437 0.599528 10.819998 23.267243 -7.172706 0.076008 0.057179 1.537014 -1.504267 0.012382 0.189360 3.110958 4.051150 20.504033 -31.408544 2.327763 -1.483729 24.758051 2.879810 -0.735753 -2.795210 -15.924129 -21.105552 -0.043325 0.037327 1.157605 -6.271152 4.475581 17.347611 -28.934738 4.151779 7.902455 -26.790108 14.500485 9.659253 51.139086 3.719669 -1.225273 -16.682513 0.617435 -9.055290 42.137165 1.764731 -21.637575 -0.069134 3.779642 -5.064536 0.026484 0.103626 -3.174738 -7.304952 35.933154 -3.930306 79.092046 -4.986239 3.003254 -47.845078 4.325422 35.649225 17.318454 -12.367123 36.670210 1.364030 8.227304 -11.317540 -0.041369 0.276383 -8.305039 0.002971 -0.004244 -0.012547 +-5.756803 51.706499 -64.099758 -103.994265 12.706145 -95.863996 -0.000001 -0.000000 -0.000000 -3.338190 13.201146 -7.854467 5.290127 0.008728 1.811914 11.251306 4.285796 -0.282603 1.247001 0.004117 0.500136 44.239012 24.698154 36.849496 4.077596 -6.428156 7.636727 -13.635749 4.515340 7.601013 -10.256226 -2.920969 -0.928541 -10.142678 -3.886583 20.743036 -11.541763 -2.668095 12.851545 18.889990 -5.772148 2.392282 8.964427 -17.883148 1.829067 -41.668824 -1.539035 1.944763 19.542608 5.164173 9.961814 15.395884 12.794703 -5.250037 0.488907 0.435478 10.653560 -2.359084 -0.039911 0.312220 6.931914 3.871760 20.350202 -32.102853 1.908592 -1.388113 22.317213 4.689778 2.291762 -3.505228 -18.072444 -19.587996 -0.191444 0.157693 4.661312 -6.599911 11.627279 12.693605 -25.780866 1.730506 4.944594 -26.895305 10.534669 9.572060 52.123409 3.748916 -1.299650 -22.140632 2.188209 -12.420697 43.453289 -4.409460 -14.246571 -0.017560 5.101339 -6.842389 0.027259 0.106343 -3.258625 -10.033940 29.842810 -4.518792 81.788428 -5.205588 3.100397 -49.594530 4.849639 19.641764 32.267372 -1.433030 53.006308 1.581739 8.998459 -12.423804 -0.037483 0.232176 -6.987318 0.002965 -0.004244 -0.012547 +-7.027456 52.005598 -62.198005 -94.707537 9.269874 -98.988053 -0.000000 0.000000 -0.000000 -5.584295 4.153716 -9.556656 5.742876 1.994033 -2.059742 10.508419 2.598274 2.476065 0.890167 -0.001121 3.863712 41.445020 23.501347 35.548538 4.718319 -7.124039 7.518817 -11.359036 2.721374 4.168689 -10.927725 -2.161697 -0.752653 -9.752540 -3.526949 19.680607 -10.987000 -2.405322 12.211579 16.080498 -5.155589 1.651061 7.666396 -14.226815 -1.074904 -37.045161 -0.594286 1.732179 17.693422 6.195423 13.984537 15.392822 8.030589 -3.421471 0.648555 0.623953 14.737684 -3.025474 -0.020764 0.421526 10.028772 4.628604 20.226063 -31.796102 1.449322 -1.299006 19.639776 5.922747 5.201886 -4.001541 -19.043851 -17.922536 -0.322710 0.259030 7.816393 -6.634686 15.201125 10.324773 -22.356448 0.540940 3.453139 -26.138086 3.966740 6.915446 53.371319 3.830950 -1.360659 -28.619200 4.093213 -14.105350 44.616323 -7.302483 -9.753017 0.027322 5.812166 -7.801765 0.027833 0.108379 -3.321544 -12.674535 20.050776 -6.563768 77.690991 -5.353671 2.633766 -44.069926 6.094742 1.153537 42.735501 15.193781 65.164820 1.702194 9.401397 -13.006430 -0.032296 0.185734 -5.599693 0.002964 -0.004243 -0.012546 +-7.883753 52.435900 -61.209358 -86.776257 6.047451 -101.462277 -0.000000 0.000000 0.000000 -6.513158 -4.006006 -10.267751 6.034108 3.431812 -3.981906 9.361962 0.720726 3.906420 0.725147 0.000031 5.493355 38.867536 21.882093 33.207091 5.317871 -7.304723 7.125034 -9.236080 1.165679 1.649146 -11.512077 -1.559787 -0.583218 -9.580983 -3.285495 18.778027 -10.675535 -2.288647 11.969017 12.983170 -4.372998 0.934057 6.248511 -10.371137 -3.675608 -30.766189 -0.363264 1.463910 14.968923 6.589952 13.804276 12.719353 6.843571 -2.844506 0.650100 0.619943 14.620260 -3.505369 -0.011934 0.474865 12.585254 5.493663 20.118912 -31.420611 1.127620 -1.241706 17.296033 6.387557 7.633136 -3.924348 -18.282198 -15.920437 -0.424693 0.331611 10.227421 -10.623740 11.826050 7.989485 -18.050811 2.959134 4.406592 -24.393100 -3.125089 4.270503 53.387449 3.845141 -1.352476 -35.210437 6.233125 -15.241437 45.602638 -7.510610 -7.549362 0.074045 6.405495 -8.604834 0.028424 0.110416 -3.384459 -15.776825 10.586758 -8.454101 67.101686 -4.763646 2.025032 -32.345738 10.826612 -3.111912 50.624457 14.279520 65.032449 1.913804 10.074263 -13.986901 -0.026002 0.139544 -4.215556 0.002964 -0.004242 -0.012546 +-8.253383 52.884497 -60.994247 -82.903417 3.986769 -103.522035 -0.000000 0.000000 -0.000001 -6.420370 -8.527945 -8.209377 6.014236 3.897527 -5.723022 8.233583 -0.421939 3.735742 0.630124 0.000809 6.392208 36.365852 19.930532 30.229296 5.887330 -7.077998 6.514739 -7.262813 -0.119923 -0.155933 -11.910462 -1.122306 -0.445086 -9.534132 -3.104053 17.888867 -10.478375 -2.239843 11.938331 9.711702 -3.528353 0.269847 10.278350 -6.372546 -5.635286 -32.285378 -0.805825 1.482787 15.401200 4.880895 14.526559 9.480336 7.698919 -3.338803 0.652848 0.626780 14.782732 -3.449463 -0.011033 0.470727 14.098622 6.285723 20.087538 -31.435322 1.051258 -1.237875 16.148183 6.208367 9.291741 -3.609138 -16.333385 -13.575666 -0.499562 0.372634 11.722264 -19.279808 5.029542 3.409450 -13.261505 7.742590 6.361724 -21.570313 -7.573213 3.785929 50.475861 3.727976 -1.154921 -40.249050 8.556636 -16.151510 47.087883 -6.672163 -6.088184 0.148847 7.189473 -9.669722 0.029204 0.113131 -3.468346 -18.031022 4.507573 -9.172257 58.751312 -4.153538 1.645530 -22.990766 14.078155 -6.804774 54.011582 8.289353 62.448037 1.984824 10.291037 -14.304897 -0.019038 0.096075 -2.908320 0.002971 -0.004240 -0.012545 +-8.504419 53.342299 -60.970958 -83.522619 3.335782 -105.105182 -0.000000 0.000000 0.000000 -5.577033 -8.199432 -6.077418 5.527006 3.151272 -6.024674 7.159214 -0.515410 3.418542 0.570345 0.000348 6.384542 33.814117 17.566927 26.706688 6.356609 -6.399494 5.660167 -5.456186 -0.986247 -1.191654 -12.177577 -0.791989 -0.328269 -9.486726 -2.891634 16.772176 -10.240696 -2.196542 12.020961 6.570582 -2.701776 -0.225108 12.818056 -2.204896 -7.635650 -31.109197 -0.984382 1.359336 14.464328 2.659574 16.040514 5.857106 8.941161 -3.794027 0.679448 0.662288 15.531352 -2.716981 -0.004295 0.380991 14.526688 6.901256 20.198517 -31.612250 0.779357 -1.227877 15.725295 6.207134 9.519280 -2.919566 -13.569760 -10.846841 -0.501033 0.379601 11.918067 -28.929175 -1.903939 -0.924065 -9.125685 12.440599 8.488943 -19.084728 -7.219285 5.549749 45.765998 3.466245 -0.888773 -39.980416 9.022595 -16.694643 45.585594 -6.040684 -5.630952 0.198108 7.635613 -10.277924 0.029896 0.115505 -3.541751 -19.422592 3.462459 -8.294656 53.833511 -3.874206 1.379735 -13.194130 11.763119 -8.758295 46.980838 1.425957 53.458152 1.615925 9.114421 -12.591141 -0.011573 0.055316 -1.677976 0.002969 -0.004242 -0.012544 +-8.862812 53.787897 -61.036438 -85.086262 3.016806 -106.234950 0.000000 0.000000 -0.000001 -4.768864 -6.644418 -4.900307 4.948558 2.157819 -5.308391 6.106286 -0.380531 3.327551 0.538632 0.000824 5.800603 31.070528 14.949760 22.913424 6.810219 -5.444414 4.665384 -3.805440 -1.500828 -1.701996 -12.354686 -0.533993 -0.224447 -9.068787 -2.482204 15.182785 -9.529488 -2.024511 11.861865 4.282433 -1.867138 -0.467945 12.882941 1.741296 -9.360696 -27.870670 -0.523275 1.175690 13.026594 -0.061928 17.598052 2.192844 10.344754 -4.054936 0.707018 0.699602 16.307837 -1.779403 -0.000436 0.242083 14.569588 7.314304 20.362036 -31.849336 0.914297 -1.235596 15.577106 5.934163 8.625579 -2.112014 -10.445553 -8.001108 -0.460912 0.354694 11.030143 -34.114624 -5.331728 -3.152355 -5.912022 14.780645 9.601175 -17.954082 -5.520517 7.387497 41.944359 3.197295 -0.722814 -36.325039 7.812930 -16.711831 40.822784 -5.989957 -6.269557 0.191095 7.574686 -10.194760 0.030516 0.117652 -3.608164 -19.000082 3.382513 -7.383449 49.296459 -3.668357 1.098956 -6.313828 7.173772 -7.361998 34.230091 -3.179934 40.273920 0.913782 6.402813 -8.740940 -0.004040 0.018410 -0.559482 0.002969 -0.004243 -0.012546 +-9.230682 54.218248 -61.193683 -86.961848 2.821620 -107.085478 0.000000 0.000000 0.000002 -3.998540 -4.632329 -4.264098 4.279663 1.186926 -3.921569 5.107917 -0.155736 3.267056 0.476058 -0.006315 4.855103 28.002118 12.100347 18.980785 7.190958 -4.286656 3.594087 -2.403292 -1.602209 -1.706539 -12.441515 -0.342899 -0.143833 -6.161266 -1.334243 11.977968 -6.198342 -1.098397 9.831890 4.523229 -1.046321 -0.248186 11.082066 3.045219 -10.098521 -25.274029 0.043293 1.084579 11.989675 -2.329215 16.049063 -1.758325 11.286045 -3.959658 0.629073 0.601560 14.278609 -1.006720 0.002118 0.136230 14.740916 7.423289 20.507295 -31.741382 0.820794 -1.239173 15.389317 5.973793 6.305281 -1.554643 -7.162974 -5.190712 -0.363313 0.291314 8.856335 -34.077426 -4.841006 -2.565657 -3.305753 11.951114 8.470491 -16.911209 -3.496714 8.836581 37.780569 2.914947 -0.553517 -32.172760 6.856491 -16.470186 35.904732 -6.038028 -6.903649 0.201088 7.661236 -10.312904 0.031212 0.120025 -3.681563 -15.681010 2.623835 -7.371850 43.611632 -3.343425 0.796640 -6.247715 4.559179 -0.442980 20.918291 -3.750687 25.241413 0.251086 2.596490 -3.504702 0.001143 -0.005038 0.153559 0.002967 -0.004243 -0.012545 +-9.553734 54.648600 -61.422950 -88.392386 2.512223 -107.894485 0.000000 0.000000 0.000002 -3.249349 -3.064875 -3.499685 3.573914 0.490101 -2.565594 4.149923 -0.017933 3.089079 0.377255 0.002346 3.872683 24.608877 9.216847 15.049244 7.541448 -3.103388 2.567196 -1.238016 -1.412237 -1.436796 -12.458699 -0.194922 -0.086288 3.222771 0.349371 6.239883 3.480512 0.185014 3.052850 4.694345 -0.432588 -0.015362 10.519401 2.382764 -9.927601 -22.218765 0.082082 0.973851 10.436576 -2.610135 13.320923 -5.824895 10.678017 -3.583929 0.516209 0.478157 11.677508 -0.580532 0.002920 0.077838 14.505956 6.940498 20.647833 -29.916887 0.670498 -1.153711 14.522992 6.083513 2.996559 -1.462573 -4.056211 -2.505831 -0.231317 0.193316 5.724954 -33.988178 -3.834620 -1.355946 -1.316468 6.168364 6.335151 -16.013704 -2.025691 9.883952 33.778783 2.641390 -0.421785 -28.064434 6.069082 -16.096331 30.985947 -6.024776 -7.548926 0.215706 7.785135 -10.482150 0.031908 0.122397 -3.754965 -11.153982 1.044456 -7.638628 34.885078 -2.716524 0.460505 -4.620424 0.878136 7.108831 6.821015 2.692136 14.062543 -0.071823 -1.590994 2.134918 0.004330 -0.018801 0.572994 0.002961 -0.004242 -0.012546 +-9.757636 55.045298 -61.969329 -89.264399 2.015241 -108.599811 -0.000000 0.000000 -0.000000 -2.478607 -2.130203 -1.599325 2.729968 0.224730 -2.191568 3.274959 0.025235 2.350929 0.261611 0.003073 3.119612 20.852041 6.429037 11.259176 7.874035 -2.075779 1.754423 -0.401262 -0.955670 -0.941210 -12.451590 -0.097992 -0.044785 11.298915 0.491037 2.440873 11.309460 -0.450668 -2.307492 4.945164 -0.095135 0.237505 9.605484 1.496564 -9.638239 -19.205823 0.046425 0.841288 8.928897 -2.386046 11.433162 -6.290094 9.929834 -4.051971 0.450448 0.403122 9.996701 -0.337991 0.003176 0.044594 13.333191 5.605691 20.850201 -25.895481 0.489749 -1.018624 12.772830 6.232143 -1.266744 -1.811656 -1.558324 -0.015351 -0.050667 0.052253 1.549767 -33.909751 -2.739172 -0.043304 -0.653876 0.259432 4.254015 -15.315528 -1.517805 10.456909 30.146300 2.366563 -0.296440 -24.244361 5.393202 -15.469288 26.130422 -5.698638 -8.454317 0.220863 7.828041 -10.540796 0.032609 0.124768 -3.828371 -6.837630 -0.821332 -7.069033 25.119668 -1.968278 0.182044 -2.492844 -1.959072 9.616289 -2.485663 8.835924 12.819103 -0.080552 -3.590518 4.816391 0.006234 -0.026817 0.817662 0.002969 -0.004241 -0.012545 +-9.858718 55.435999 -62.689785 -89.998111 1.516103 -109.233013 -0.000000 0.000000 0.000001 -1.628678 -1.272639 1.027829 1.695887 0.099672 -2.354839 2.471455 0.063079 1.222260 0.167416 -0.004784 2.466093 16.827100 3.905485 7.648358 8.188334 -1.200082 1.085625 0.229432 -0.392082 -0.367979 -12.430581 -0.029573 0.004966 9.467089 0.226608 1.353096 9.464572 -0.326954 -1.931244 5.197946 0.114088 0.470251 8.037699 0.777446 -9.319191 -15.137295 0.031318 0.669235 6.962027 -2.187189 9.933351 -6.623415 8.842027 -4.576945 0.404735 0.347647 8.699364 -0.157816 0.003280 0.019907 11.854055 3.982145 20.949869 -21.186964 0.309220 -0.831644 10.776340 6.409310 -5.943804 -2.470091 0.149699 2.253132 0.123555 -0.121289 -3.154333 -33.877473 -2.020989 0.805635 -0.721501 -2.826937 3.139933 -14.621634 -1.345477 10.825324 26.508118 2.083829 -0.188612 -20.537857 4.774702 -14.837749 21.441293 -5.022261 -9.355367 0.222032 7.837732 -10.554043 0.033519 0.127814 -3.922745 -4.727608 -1.573922 -4.922609 20.737224 -1.632359 0.088889 -4.268348 -3.365885 8.485778 -1.125356 10.076810 12.058183 -0.083200 -3.436738 4.609985 0.007504 -0.032081 0.978451 0.002973 -0.004240 -0.012543 +-9.918413 55.802199 -63.366314 -90.457711 0.973808 -109.763288 -0.000000 0.000000 0.000000 -0.849714 -0.540144 3.280938 0.804439 0.044345 -2.220903 1.645524 0.020159 0.043024 0.094063 -0.007619 1.843869 12.688573 1.852681 4.433343 8.493077 -0.525652 0.629827 0.606224 0.189098 0.176560 -12.399109 -0.001064 -0.003267 7.027998 0.088541 0.715715 7.028733 -0.175431 -1.437684 5.364423 0.239241 0.637258 6.122020 0.278216 -8.890715 -10.263001 0.006732 0.452731 4.626151 -2.001047 8.672550 -6.858806 7.351986 -5.161624 0.359898 0.301342 7.615407 -0.029259 -0.017520 0.004925 10.042149 2.246380 20.788925 -15.800893 0.134985 -0.623983 8.469537 6.529325 -10.599951 -3.279071 0.658068 4.111827 0.287845 -0.314526 -7.986775 -33.858118 -1.797712 1.083145 -0.927090 -2.974679 3.014230 -13.667145 -1.249379 10.814629 22.597671 1.793581 -0.117700 -17.478938 4.253890 -14.212003 17.556716 -4.146907 -9.890936 0.215705 7.785144 -10.482163 0.034325 0.130521 -4.006634 -2.134903 -2.747892 -2.386967 15.172428 -1.212553 0.008785 -5.140791 -4.480707 7.067571 0.058016 10.967724 11.629691 -0.086547 -3.163790 4.243744 0.008006 -0.034140 1.041364 0.002966 -0.004243 -0.012546 +-9.967905 56.131800 -63.761627 -90.576354 0.443775 -110.190124 -0.000000 0.000000 -0.000001 -0.228917 -0.056773 4.437762 0.202083 0.036177 -1.557531 0.769712 -0.038430 -0.679725 0.041124 0.009701 1.198661 8.762241 0.367946 1.616319 8.804211 -0.107909 0.381816 0.650049 0.664805 0.604439 -12.346655 0.017308 0.006863 4.482383 0.020886 0.290993 4.479201 -0.070938 -0.917937 5.504318 0.315084 0.742593 3.991452 -0.106344 -8.236476 -5.012375 -0.042707 0.201019 2.104661 -1.821778 7.486248 -7.017384 5.615021 -5.761599 0.310184 0.257062 6.580720 0.057488 -0.024453 -0.006045 8.004549 0.486207 20.228508 -9.949027 -0.023557 -0.398363 5.868883 6.578742 -14.635422 -4.011709 0.229848 5.529705 0.430574 -0.500129 -12.312184 -33.851786 -1.663693 1.234719 -1.151186 -3.041759 2.913899 -12.565705 -0.924367 10.195806 18.682284 1.481420 -0.044638 -15.280463 3.625195 -13.425795 14.591663 -3.314574 -9.934946 0.182609 7.499908 -10.092742 0.035137 0.133227 -4.090520 0.567746 -3.882151 0.316366 9.163522 -0.724975 -0.034615 -5.249702 -5.217782 5.825829 0.926094 11.435242 10.976194 -0.088169 -2.882458 3.866396 0.008397 -0.035741 1.090297 0.002963 -0.004241 -0.012547 +-10.159856 56.229498 -63.776378 -90.253712 0.138630 -110.262113 0.000000 0.000000 0.000001 -0.061080 -0.003003 3.908008 0.036878 0.067428 -0.613758 0.284381 -0.070292 -0.390438 0.013900 -0.001307 0.518254 7.230627 -0.013333 0.307781 8.796677 -0.008139 0.176573 -1.049332 0.415798 0.392290 -12.317933 0.014098 0.010518 1.972882 0.002315 0.076141 1.984898 -0.011010 -0.401351 5.542394 0.335684 0.770722 3.851060 -0.667256 -6.673732 -3.270840 -0.152310 0.127705 1.147425 -1.568505 5.551854 -7.162441 3.742817 -6.221668 0.224729 0.180884 4.716266 0.077808 -0.025750 -0.006284 7.157388 -0.690616 18.132605 -6.330412 -0.087603 -0.246705 3.899384 6.402941 -16.051481 -4.483230 -0.921189 6.296257 0.483516 -0.573015 -13.953094 -33.845043 -1.626573 1.289786 -1.309139 -3.044205 2.855000 -11.960460 -0.043274 7.616637 16.720183 1.324323 -0.020541 -14.171227 2.561102 -10.649935 11.823041 -3.236565 -10.235955 0.053236 6.107923 -8.204957 0.036080 0.136609 -4.195568 2.173171 -4.948966 2.675624 5.417090 -0.430873 -0.043899 -3.649018 -4.959471 4.336758 -0.906231 11.202012 10.918788 -0.083605 -2.188312 2.935473 0.008821 -0.037053 1.130173 0.002965 -0.004242 -0.012546 +-10.327851 56.241697 -63.772125 -90.000951 0.000652 -110.252333 -0.000000 0.000000 -0.000000 0.002135 -0.004682 3.402512 0.006572 0.087297 -0.006407 -0.001831 -0.087556 -0.007905 0.007467 -0.003319 -0.008353 6.864528 -0.002417 0.002685 8.635795 0.002671 0.001987 -2.535856 -0.000943 0.002891 -12.310215 0.014262 0.008059 -0.000367 -0.000032 0.000947 0.001738 -0.002677 -0.002639 5.549592 0.338547 0.768488 4.401034 -1.310810 -0.703074 -2.688496 -0.473033 0.108638 0.344612 -0.767527 -0.593167 -7.235325 2.229744 -6.501294 -0.064627 -0.047651 -1.335952 0.035766 -0.027044 0.002000 7.379201 -0.543260 0.392191 -3.587746 0.142815 -0.117945 -0.187152 4.501654 -0.273134 -4.706751 -2.028920 6.517400 -0.059427 0.053529 1.546903 -33.838957 -1.621430 1.300462 -1.386173 -3.033491 2.833768 -11.746375 2.166498 1.610625 15.711603 1.228673 -0.021213 -13.616888 0.404990 -4.431929 9.893045 -3.276811 -10.479071 -0.073769 2.810372 -3.770122 0.036548 0.138413 -4.251677 3.330679 -6.056470 5.661814 2.833162 -0.232210 -0.028610 -2.089688 -4.318609 1.572519 -3.216558 10.969119 11.420813 -0.038022 -0.731868 0.982196 0.009021 -0.037449 1.142084 0.002966 -0.004240 -0.012547 diff --git a/data/gradio_animo/bvh/arctic_wolf_female_fighttaunt.bvh b/data/gradio_animo/bvh/arctic_wolf_female_fighttaunt.bvh new file mode 100644 index 0000000000000000000000000000000000000000..605dd0e46eec65335de470e482a07a925946681c --- /dev/null +++ b/data/gradio_animo/bvh/arctic_wolf_female_fighttaunt.bvh @@ -0,0 +1,398 @@ +HIERARCHY +ROOT joint_333447933 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_238868616 + { + OFFSET 0.000000 0.150500 -0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1786579214 + { + OFFSET 0.000000 -0.150500 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_221348618 + { + OFFSET 0.000000 -12.069600 0.196600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1829143771 + { + OFFSET 0.000000 -9.877200 0.256800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2363811933 + { + OFFSET 0.000000 -10.656400 0.606600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_931814724 + { + OFFSET 0.000000 -18.429399 1.875100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2742329179 + { + OFFSET 0.000000 -9.650100 3.621000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2699430713 + { + OFFSET 0.000000 -7.410000 7.603700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3475423618 + { + OFFSET 0.000000 -7.686400 -3.473600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000010 -6.867410 -5.398550 + } + } + JOINT joint_2910508539 + { + OFFSET 3.525900 -13.679400 0.646200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -4.422900 -0.000000 + } + } + JOINT joint_2211154460 + { + OFFSET -3.525900 -13.679400 0.646200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -4.422900 -0.000000 + } + } + } + } + } + JOINT joint_2721156974 + { + OFFSET 4.292600 -12.421700 9.811800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3215942960 + { + OFFSET 4.042600 -2.567000 -20.517200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_696373350 + { + OFFSET -1.073100 3.953800 -16.748400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_866158840 + { + OFFSET -1.204600 -0.686400 -18.801399 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2203460590 + { + OFFSET 0.043300 -2.493700 -8.263900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.017875 -1.935225 -1.840350 + } + } + } + JOINT joint_2327085570 + { + OFFSET -0.602300 -0.343200 -9.400700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.361400 -0.205900 -5.640400 + } + } + } + } + } + JOINT joint_3513023437 + { + OFFSET -4.292600 -12.421600 9.811900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_118151199 + { + OFFSET -4.042600 -2.567000 -20.517200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3052875204 + { + OFFSET 1.073100 3.953800 -16.748301 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_384542437 + { + OFFSET 1.204600 -0.686400 -18.801500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2722732646 + { + OFFSET -0.043500 -2.493700 -8.263900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.018000 -1.935225 -1.840350 + } + } + } + JOINT joint_1214026690 + { + OFFSET 0.602300 -0.343200 -9.400700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.361400 -0.205900 -5.640400 + } + } + } + } + } + } + } + } + } + JOINT joint_1819773357 + { + OFFSET 0.000000 17.324400 -0.119200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_4168662315 + { + OFFSET 0.000000 11.098700 -7.891100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 7.128300 -5.303200 + } + } + } + JOINT joint_729847525 + { + OFFSET 7.908900 4.188100 -2.265000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_739504782 + { + OFFSET 0.180500 0.803200 -24.443501 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1506226743 + { + OFFSET -0.627100 9.630100 -12.941100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_329652332 + { + OFFSET 0.804000 -0.591900 -13.461700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.087650 -1.969925 -1.637025 + } + } + } + JOINT joint_3652444799 + { + OFFSET -0.313500 4.815000 -6.470500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.188100 2.889000 -3.882300 + } + } + } + JOINT joint_1068081707 + { + OFFSET 0.090300 0.401600 -12.221800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.054200 0.241000 -7.333100 + } + } + } + JOINT joint_1560523545 + { + OFFSET -7.908900 4.188100 -2.265000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2711614598 + { + OFFSET -0.180500 0.803200 -24.443600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3383861901 + { + OFFSET 0.627000 9.630100 -12.941000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3571040107 + { + OFFSET -0.804000 -0.591900 -13.461700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.087675 -1.970000 -1.637025 + } + } + } + JOINT joint_3523000695 + { + OFFSET 0.313500 4.815000 -6.470500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.188100 2.889000 -3.882300 + } + } + } + JOINT joint_765958531 + { + OFFSET -0.090300 0.401600 -12.221800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.054200 0.241000 -7.333100 + } + } + } + JOINT joint_905219036 + { + OFFSET 0.000000 19.171200 -9.996300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 2.245500 -1.711700 + } + } + } +} +MOTION +Frames: 139 +Frame Time: 0.050000 +0.612537 50.465599 0.299064 -104.415966 4.423250 0.707926 0.000001 0.000000 -0.000000 -2.017849 -3.689734 -4.837863 -6.551503 5.134020 -0.862719 17.686778 0.078135 -0.936552 24.397875 -0.000332 -1.572768 37.858921 -0.824615 -0.731808 -24.747380 -3.567240 -2.347304 -27.432632 -2.050114 8.598936 -7.592278 3.417033 0.898554 -2.049861 0.138158 -3.829262 -2.054406 -0.114780 3.192864 -5.686379 -0.053694 -0.746489 5.677722 -21.118463 -1.448558 -14.840694 -4.774838 0.926685 4.204028 13.786167 20.013818 -5.850678 8.632476 3.739788 0.878075 0.947830 21.224396 -11.203038 -0.165336 1.519756 -6.734565 10.106828 8.983234 0.651224 4.486417 -0.121438 5.891852 -1.583833 -16.434342 -4.492866 -17.535904 -0.607397 0.540821 -0.666840 -16.063831 23.662422 -7.841845 4.461750 -14.980457 3.751384 -2.025867 -14.296155 -8.178919 -25.369047 43.008274 2.185440 -1.691120 -34.467740 -13.883070 12.531971 22.794307 20.672051 -2.596550 1.052566 -7.013825 9.597860 -0.000007 0.000000 0.000003 33.047331 18.281907 -28.569057 3.501286 0.297523 0.461987 -12.970235 7.352063 -0.128565 26.707534 -39.297231 7.972303 0.023143 0.335358 -0.451009 0.000006 0.000005 0.000002 0.002959 -0.004242 -0.012545 +1.196957 50.908150 0.487597 -103.304038 3.835204 0.756164 0.000001 -0.000000 -0.000000 -1.643866 -3.104825 -6.288394 -6.799906 5.422179 -0.938333 16.595270 0.077530 0.151016 24.250770 -0.006645 -1.431136 37.979879 -0.588300 -0.244019 -24.738645 -3.270902 -2.374949 -27.400243 -2.076810 8.709588 -7.739588 2.408653 0.666846 -1.850957 0.124933 -3.777260 -1.855371 -0.103677 3.193242 -5.696767 -0.053558 -0.747925 6.655435 -21.292979 -0.873753 -15.956573 -4.769526 0.984854 4.752600 13.773235 19.944345 -6.114287 8.878261 3.800936 0.879534 0.949628 21.255755 -11.203037 -0.165336 1.519756 -6.186264 9.997770 9.206041 -0.336117 4.497475 -0.160083 6.354842 -1.585257 -16.382565 -4.693157 -17.460781 -0.667633 0.538307 -0.664259 -16.015028 22.629669 -7.903129 4.308152 -15.589107 3.135788 -2.898608 -14.638525 -6.918034 -24.875279 41.198138 2.079056 -1.601908 -33.222052 -13.829037 12.577449 22.703587 19.775103 -2.509804 1.068639 -7.080943 9.692341 -0.000003 0.000003 0.000002 23.827091 19.810706 -19.655722 21.000152 -1.344563 0.330428 -31.426519 7.284193 1.322066 37.771356 -35.408265 10.558341 0.065293 0.866814 -1.166368 0.000004 0.000005 0.000004 0.002964 -0.004243 -0.012547 +1.950425 51.179798 1.160834 -103.181382 3.004104 1.212746 0.000002 0.000000 0.000000 -0.558272 -2.289723 -8.246855 -6.997088 6.122426 -1.314661 15.682147 0.372374 1.075483 24.103950 -0.002727 -1.044525 37.886508 -0.100938 0.812702 -24.723611 -3.676542 -2.295248 -26.730055 -2.014025 8.924365 -7.009774 1.470724 0.422880 -1.672976 0.113242 -3.746155 -1.670302 -0.093351 3.193561 -5.714085 -0.053331 -0.750312 8.951403 -22.036102 0.641713 -17.395775 -4.686843 1.041559 5.394290 13.652870 19.878565 -5.591608 9.906272 3.776433 0.880994 0.951425 21.287125 -11.203038 -0.165338 1.519756 -4.163472 9.305385 9.891203 -3.220139 4.596684 -0.291045 7.644382 -1.677979 -16.223063 -5.443686 -17.101150 -0.911613 0.530391 -0.656176 -15.861656 21.498002 -7.968753 4.139759 -15.909522 2.462248 -3.859589 -13.817710 -5.164795 -24.653983 40.747802 2.102633 -1.529378 -32.888985 -13.798818 12.541324 21.923889 18.703855 -2.225875 1.075003 -7.107377 9.729575 -0.000001 0.000004 0.000002 10.685466 20.685175 -12.135996 37.697067 -2.774669 0.655899 -42.491358 3.894827 2.275162 40.932003 -27.870193 8.798692 0.120259 1.460116 -1.966510 0.000005 0.000012 0.000004 0.002964 -0.004242 -0.012545 +2.874612 51.317101 2.331325 -103.500600 1.892985 1.981586 0.000002 0.000000 -0.000000 0.993055 -1.243693 -10.738938 -7.283458 7.117880 -1.793327 14.551045 0.936984 1.933950 23.715825 0.004681 -0.503384 37.191794 0.692033 2.487879 -24.663344 -5.326641 -2.036500 -24.657085 -1.681264 8.931954 -4.559869 0.506004 0.146317 -1.470563 0.100058 -3.704564 -1.474758 -0.082440 3.193860 -5.892781 -0.002350 -0.781071 13.510409 -23.327077 3.241844 -19.579102 -4.366528 1.133625 6.086692 13.300364 19.848023 -2.359875 12.012592 3.211540 0.882451 0.953221 21.318488 -11.196111 -0.165153 1.518828 -1.991336 7.786659 11.187291 -4.288422 4.883116 -0.352600 7.842712 -1.999913 -16.164156 -6.767144 -16.474768 -1.304217 0.526064 -0.651772 -15.778002 20.608067 -8.050538 3.952305 -16.004033 1.944374 -4.608687 -12.356308 -2.941444 -24.655162 41.274178 2.267225 -1.429150 -32.935250 -13.546312 12.467149 20.256573 17.317787 -1.763870 1.076477 -7.113476 9.738166 -0.000007 0.000002 0.000003 -4.279920 21.209000 -6.883062 48.280365 -3.533726 1.090820 -41.253931 2.431135 2.097222 40.416037 -21.979587 8.590691 0.167216 1.907159 -2.570665 0.000005 0.000003 0.000003 0.002960 -0.004242 -0.012546 +3.463831 51.381199 3.533255 -103.884922 1.005742 2.669550 0.000001 0.000000 0.000002 2.494552 -0.485695 -12.839842 -7.693898 7.605317 -2.112841 13.431699 1.365501 2.493861 23.243605 -0.013058 -0.184947 35.771898 1.287541 3.751397 -24.505411 -6.584162 -1.819818 -21.595743 -1.149398 8.676030 -3.009869 -0.003043 0.001607 -1.372843 0.093751 -3.683745 -1.376987 -0.076984 3.193996 -5.906643 -0.002162 -0.782970 15.844663 -23.985488 4.565865 -17.800023 -4.056829 1.039483 5.008288 13.048081 20.003068 -0.988333 13.600497 2.892561 0.880991 0.951425 21.287125 -11.189188 -0.164971 1.517898 -0.700717 6.464797 12.475402 -2.482037 5.082797 -0.298036 6.690636 -2.249739 -16.295784 -8.264889 -15.926090 -1.732076 0.529310 -0.655072 -15.840742 20.184874 -8.126766 3.789408 -16.024294 1.702382 -4.950483 -10.789397 -1.350751 -24.849541 41.829711 2.411750 -1.347946 -32.904147 -13.383304 12.446964 18.479294 16.424524 -1.372353 1.077952 -7.119577 9.746758 -0.000003 0.000001 0.000004 -14.847807 21.189670 -4.451767 50.753071 -3.662478 1.231488 -38.282134 2.713664 1.693026 42.951419 -18.866284 9.197889 0.182827 2.046358 -2.759036 0.000003 0.000007 0.000003 0.002957 -0.004241 -0.012545 +3.346972 51.231651 4.622705 -104.379687 0.479366 3.235364 -0.000001 0.000000 0.000001 3.539616 -0.014951 -14.217462 -8.251280 7.430073 -2.174655 12.738468 1.516541 2.697067 22.806504 0.004041 -0.239288 33.242267 1.551301 4.266002 -24.169933 -7.016486 -1.693572 -17.176319 -0.451924 8.194552 -4.993700 0.495826 0.178991 -1.453116 0.098918 -3.694102 -1.460792 -0.081662 3.193880 -6.218921 0.071351 -0.866347 25.259912 -23.060453 8.518061 -31.868376 -4.418542 1.707188 11.629762 13.070190 18.855264 10.932043 15.189121 -0.071177 0.870761 0.938858 21.067563 -11.175329 -0.164600 1.516040 -0.266954 5.387768 13.484734 1.756443 5.012781 -0.129645 4.471938 -2.232443 -16.618686 -9.852812 -15.340941 -2.160581 0.539564 -0.665551 -16.039428 20.457456 -8.233432 3.671755 -15.669576 1.702566 -4.931577 -9.265909 -0.891105 -25.364992 42.560539 2.506473 -1.357547 -32.921328 -13.564032 12.489308 16.755808 16.689469 -1.096198 1.073532 -7.101275 9.720978 -0.000004 0.000002 0.000004 -18.289924 21.126490 -5.121445 45.926345 -3.243899 1.090031 -37.822441 3.208167 1.648466 47.880634 -17.598504 8.870590 0.171364 1.944561 -2.621268 0.000007 0.000005 0.000003 0.002965 -0.004242 -0.012545 +2.859395 50.923401 5.733724 -104.879485 0.003652 3.825072 0.000001 0.000000 0.000001 4.185922 0.498755 -15.482853 -8.778192 7.117470 -2.092179 12.334939 1.603218 2.912197 22.355399 0.012148 -0.390954 30.069072 1.737666 4.647510 -23.706433 -7.456847 -1.573304 -11.942802 0.274792 7.422141 -8.116234 1.444303 0.512377 -1.638080 0.110952 -3.746221 -1.642370 -0.091792 3.193605 -6.260847 0.075900 -0.868976 34.481013 -21.037183 12.914216 -52.815125 -3.543426 2.409932 21.811178 11.397521 17.186148 31.875637 15.179799 -5.032300 0.838512 0.883931 19.968060 -11.057562 -0.161501 1.500239 1.390906 4.487599 14.218983 3.917398 4.787261 -0.030748 3.236779 -2.047331 -16.824100 -11.492171 -14.586175 -2.562950 0.544410 -0.670527 -16.133548 21.119520 -8.342236 3.526120 -14.829241 1.714584 -4.879562 -7.859845 -0.865867 -26.119001 43.628056 2.602320 -1.392517 -33.027658 -13.889782 12.579048 14.906123 17.565664 -0.814981 1.066199 -7.070774 9.678024 -0.000003 0.000001 0.000003 -19.216015 20.930573 -5.950993 40.044815 -2.726322 0.947808 -37.691789 3.365919 1.693842 51.180383 -16.793692 7.905518 0.161513 1.855202 -2.500388 0.000006 0.000001 0.000005 0.002959 -0.004242 -0.012545 +2.122522 50.483898 6.793400 -104.959016 -0.355817 4.349653 0.000001 0.000000 0.000000 4.265775 0.966695 -16.631467 -9.102601 6.608413 -1.868322 12.068031 1.551398 3.310537 21.697777 -0.000764 -0.571853 26.792268 1.871996 4.879099 -23.172022 -7.661828 -1.522879 -6.708967 0.806974 6.272261 -8.858014 2.376270 0.763961 -1.861424 0.125682 -3.798221 -1.872833 -0.104651 3.193212 -6.072677 0.043178 -0.828916 31.334426 -20.692948 12.899754 -57.273419 -1.526303 2.470448 24.176987 9.801439 14.926242 38.581179 13.794441 -5.019611 0.740875 0.750923 17.368907 -10.503349 -0.147344 1.425796 3.113136 4.018473 14.497892 5.112790 4.484866 0.016762 2.480127 -1.779359 -16.966024 -13.025203 -13.940148 -2.898615 0.546024 -0.672186 -16.164917 22.118086 -8.455733 3.374281 -13.509983 1.743639 -4.819140 -6.948359 -1.237427 -26.995949 44.708775 2.651870 -1.437591 -33.113449 -14.278253 12.700923 13.029556 18.813877 -0.484942 1.057427 -7.034162 9.626481 -0.000003 0.000002 0.000002 -18.761936 20.744758 -6.643016 38.737012 -2.598914 0.927499 -39.078987 3.343880 1.856299 49.523190 -16.210347 6.394318 0.164472 1.882220 -2.536930 0.000004 0.000005 0.000004 0.002958 -0.004241 -0.012546 +1.359980 50.032200 7.807377 -104.666816 -0.588392 4.771900 0.000001 0.000000 -0.000000 3.948011 1.350266 -17.475752 -9.364193 5.986816 -1.546856 11.862629 1.414389 3.655736 20.984315 0.001874 -0.838389 24.010116 1.956030 5.019331 -22.645411 -7.639702 -1.544531 -2.195923 1.085403 5.168992 -7.770270 3.403637 0.953887 -2.077768 0.140122 -3.836190 -2.082340 -0.116339 3.192809 -6.019426 0.037639 -0.831721 20.412356 -21.163414 9.737419 -50.127143 -1.276114 2.250077 21.994751 10.618374 9.481820 29.295832 14.830070 -1.397624 0.565484 0.525949 12.667469 -9.083098 -0.114369 1.234435 3.826427 3.950128 14.631826 5.644652 4.188948 0.050314 2.076886 -1.505552 -17.055189 -14.108522 -13.505102 -3.134575 0.546560 -0.672741 -16.175376 23.265413 -8.571352 3.235035 -11.924326 1.768766 -4.745078 -6.409722 -1.789311 -27.803411 45.600254 2.703093 -1.493438 -33.165723 -14.616761 12.831242 11.257233 20.057112 -0.073503 1.048688 -6.997542 9.574948 -0.000000 0.000003 0.000004 -17.933942 20.454974 -7.280490 40.140953 -2.742010 0.956220 -39.827933 3.213216 1.911174 41.474903 -15.147772 4.073576 0.168827 1.921706 -2.590344 -0.000000 0.000006 0.000003 0.002963 -0.004241 -0.012547 +0.790039 49.647701 8.713086 -104.277468 -0.667398 4.982541 -0.000000 0.000000 0.000000 3.640539 1.537678 -17.808674 -9.560112 5.280733 -1.134793 11.657067 1.234719 3.824066 20.323143 -0.002322 -1.202367 22.568263 2.013002 5.060453 -22.309648 -7.368285 -1.627388 0.484662 1.132665 4.356919 -6.681780 4.094993 1.061650 -2.185945 0.147398 -3.860398 -2.194081 -0.122572 3.192574 -5.720746 -0.028535 -0.750900 8.580601 -20.922736 5.458123 -38.458742 -2.372992 1.820967 19.031504 12.502416 4.698751 15.134844 15.920055 1.433498 0.398113 0.339144 8.467507 -7.839427 -0.089396 1.066256 4.522465 4.406069 14.553631 5.988128 4.018677 0.076161 1.871095 -1.364608 -17.103378 -15.119379 -13.514797 -3.429513 0.546559 -0.672741 -16.175377 24.440836 -8.684011 3.107969 -10.149695 1.788832 -4.666263 -5.917656 -2.355001 -28.341928 46.226384 2.733472 -1.531595 -33.315628 -14.824819 12.884048 9.758454 20.918425 0.388821 1.044335 -6.979230 9.549188 -0.000002 0.000002 0.000004 -17.159487 20.100738 -7.697469 41.366285 -2.827142 0.989202 -40.608348 3.214262 1.980670 34.926124 -14.277124 2.392987 0.172984 1.959104 -2.640946 0.000002 0.000006 0.000006 0.002960 -0.004241 -0.012547 +0.437380 49.391300 9.482500 -104.031227 -0.470455 4.890762 -0.000001 0.000000 0.000001 3.926493 1.260055 -17.557380 -9.512000 4.557562 -0.675316 11.176435 0.979873 3.873875 19.354126 -0.001113 -1.635971 22.450817 1.948482 4.800978 -22.189355 -6.996856 -1.715453 1.345619 1.099617 3.996644 -6.480579 4.213329 1.078322 -2.203391 0.148576 -3.870845 -2.215031 -0.123740 3.192528 -5.324769 -0.088515 -0.657185 5.466422 -19.631919 3.294268 -35.497353 -3.816690 1.736737 19.657274 13.958796 3.417888 7.489323 12.956221 2.514446 0.364373 0.308142 7.757089 -7.752820 -0.087796 1.054523 7.301395 5.586860 14.159000 4.951232 4.005042 0.027591 2.353852 -1.508802 -17.080533 -15.781594 -14.059928 -3.764285 0.545484 -0.671632 -16.154464 25.508814 -8.776249 3.006594 -8.325556 1.815917 -4.578551 -5.267331 -3.016150 -28.495914 46.670679 2.754133 -1.563135 -33.603165 -14.913750 12.867589 8.529678 21.348550 0.860253 1.039980 -6.960911 9.523425 -0.000003 0.000002 0.000004 -16.863983 19.618645 -7.732674 42.983630 -2.932086 1.059600 -41.885007 3.335315 2.081117 33.091006 -14.069961 1.951103 0.178585 2.008968 -2.708424 0.000008 0.000004 0.000003 0.002966 -0.004242 -0.012546 +0.128416 49.257050 10.044844 -103.877756 0.321000 4.363023 0.000000 0.000000 -0.000000 4.942169 0.130103 -16.308564 -8.896141 3.936336 -0.211491 10.230448 0.601988 3.652792 17.860042 0.002722 -2.151502 23.133608 1.594459 3.818329 -22.215061 -6.681878 -1.719605 1.011432 1.197922 4.449901 -6.480582 4.213329 1.078322 -2.203388 0.148577 -3.860353 -2.215033 -0.123740 3.192528 -5.290705 -0.038141 -0.669611 7.936155 -17.683106 2.489192 -38.727902 -3.760776 1.921064 21.219255 13.783841 3.646512 5.717094 5.550603 2.799037 0.386174 0.328849 8.236626 -8.380604 -0.078973 1.136955 15.858182 8.635835 13.132188 -5.728674 4.048556 -0.386259 7.128534 -2.484682 -16.592783 -14.863294 -14.735508 -3.818417 0.528769 -0.654523 -15.830289 26.309163 -8.833147 2.936938 -6.579332 1.836501 -4.543666 -4.633681 -4.260452 -28.232233 46.865332 2.783723 -1.555965 -33.746893 -14.955099 12.846877 7.513658 21.674659 1.281676 1.039982 -6.960913 9.523425 -0.000004 0.000003 0.000003 -16.747233 18.381262 -7.569172 43.755431 -2.983589 1.106739 -42.554238 3.418369 2.124318 32.497243 -13.876138 1.772690 0.182579 2.044283 -2.756226 0.000001 0.000004 0.000005 0.002962 -0.004241 -0.012546 +-0.251883 49.208199 10.470598 -103.751206 1.206479 3.742274 0.000001 0.000000 0.000000 5.559856 -0.942219 -14.545559 -8.570007 3.360768 0.247485 9.733728 0.179174 3.174547 17.016347 -0.001241 -2.597584 24.194760 1.246063 2.877346 -22.308732 -6.285591 -1.722328 0.151401 1.274499 5.037081 -6.480581 4.213329 1.078321 -2.203386 0.148576 -3.849862 -2.215028 -0.123740 3.192528 -5.291677 -0.001247 -0.685107 9.444885 -15.893429 1.348915 -41.048171 -3.781538 2.076685 22.319774 13.727937 3.781916 5.440413 0.511189 2.964000 0.384291 0.340071 8.549774 -9.097425 -0.100751 1.234990 22.700836 11.474453 11.929275 -13.743792 4.162305 -0.700937 10.375155 -4.528359 -16.263237 -14.659042 -14.416827 -4.070185 0.534352 -0.660216 -15.938349 26.767053 -8.847198 2.900684 -5.010381 1.835564 -4.528808 -4.046417 -5.693663 -27.893748 46.683493 2.770218 -1.525871 -33.613729 -14.959742 12.851570 6.657638 22.082710 1.663364 1.041911 -6.969053 9.534871 -0.000003 0.000000 0.000004 -16.665460 16.909535 -7.420967 44.073383 -2.995364 1.118348 -42.877752 3.487331 2.158851 32.052226 -13.525188 1.632281 0.183299 2.050518 -2.764664 0.000003 0.000007 0.000005 0.002964 -0.004243 -0.012547 +-0.696693 49.266201 10.926288 -103.674163 1.967898 3.061711 -0.000000 0.000000 0.000000 5.181343 -1.599876 -12.601158 -9.140520 2.575059 0.811449 10.167672 -0.362804 2.755547 17.454006 -0.001888 -2.979356 26.319187 1.198997 2.532202 -22.375614 -5.386654 -1.841007 -0.763734 1.286291 5.427287 -6.418908 3.481350 0.889585 -2.063816 0.139205 -3.829228 -2.068376 -0.115560 3.192834 -5.292446 0.038669 -0.676062 8.367133 -13.941007 -0.756577 -39.117488 -3.799121 2.053367 21.407571 13.864784 3.825597 4.937810 -0.916831 3.077947 0.392852 0.337547 8.445573 -10.214282 -0.168440 1.419109 37.933895 15.183354 7.887263 -45.853110 4.395834 -1.721088 33.677853 -11.725836 -11.705364 4.170474 -11.495108 1.917132 0.531472 -0.657276 -15.882579 26.854164 -8.818502 2.948302 -3.445498 1.828101 -4.534532 -3.174780 -7.081544 -27.430345 45.917283 2.738821 -1.490352 -33.050577 -14.935385 12.882325 5.763443 22.493090 2.065967 1.048203 -6.995510 9.572088 -0.000003 0.000002 0.000002 -16.420694 15.430911 -7.200096 44.132296 -2.997507 1.114830 -43.028921 3.531206 2.172114 31.565760 -13.099452 1.464824 0.183057 2.048440 -2.761852 0.000005 0.000007 0.000004 0.002961 -0.004242 -0.012546 +-1.105180 49.385200 11.729539 -103.610445 2.629053 2.261733 -0.000001 0.000000 -0.000001 4.632943 -2.124591 -10.807591 -9.943520 1.591965 1.463949 10.755421 -0.955456 2.590952 18.270209 -0.000671 -3.384827 28.825453 1.216623 2.427288 -22.278818 -4.077993 -2.009218 -0.451947 1.397133 5.758348 -6.319006 2.238319 0.569669 -1.812565 0.122485 -3.787836 -1.823940 -0.101923 3.193298 -5.284017 0.090628 -0.681537 6.695424 -11.617798 -3.126993 -35.422672 -3.759773 1.955921 19.661011 14.048546 3.950090 4.022756 -2.491057 3.166426 0.381921 0.328532 8.244725 -10.793947 -0.140536 1.470067 45.038515 16.025912 3.866044 -72.320290 3.930017 -2.427692 60.572972 -16.714632 -3.765834 31.030244 -6.455796 5.023407 0.557070 -0.693639 -16.643528 26.827537 -8.653732 3.178141 -1.594142 1.892190 -4.471540 -1.551881 -8.365480 -26.729879 44.460767 2.635165 -1.430116 -31.618724 -15.032465 13.044089 4.051366 22.973761 2.643618 1.061313 -7.050437 9.649392 -0.000002 0.000002 0.000004 -15.639146 14.039688 -6.829012 44.036064 -3.014317 1.113170 -43.138357 3.605188 2.192659 30.679779 -12.823900 1.231551 0.180931 2.029744 -2.736544 0.000007 0.000006 0.000003 0.002957 -0.004242 -0.012546 +-1.510636 49.550049 12.732754 -103.545246 3.219021 1.394605 0.000000 0.000000 0.000000 4.013770 -2.594605 -9.123689 -10.811987 0.500573 2.148043 11.383192 -1.604253 2.541879 19.237110 -0.005193 -3.833405 31.386092 1.271861 2.440212 -22.072571 -2.753683 -2.177890 0.663388 1.590441 6.016105 -6.183245 0.779448 0.200273 -1.526401 0.103732 -3.714957 -1.530629 -0.085557 3.193778 -5.275086 0.159938 -0.689175 4.376321 -9.102010 -5.450916 -30.113949 -3.679602 1.780907 17.151865 14.251049 4.163219 2.934920 -4.054404 3.167496 0.365457 0.315309 7.949733 -12.014317 -0.193274 1.647007 46.415391 14.997146 0.374913 -91.129384 3.281733 -2.670437 75.420028 -16.339017 1.421561 47.906315 -4.920347 3.985683 0.540868 -0.676722 -16.326319 26.659769 -8.337118 3.612547 0.400333 2.138550 -4.169470 0.456378 -9.512280 -25.890141 42.668925 2.567212 -1.318283 -30.744690 -14.860309 12.977688 2.745771 22.907572 3.372134 1.076966 -7.115506 9.741028 -0.000002 0.000001 0.000004 -14.543253 12.722453 -6.368045 43.770523 -2.985391 1.091687 -43.173714 3.675268 2.210630 29.569472 -12.619414 0.983958 0.178814 2.011047 -2.711236 0.000007 0.000006 0.000004 0.002966 -0.004242 -0.012546 +-1.945786 49.708698 14.242292 -103.512568 3.765278 0.563783 0.000001 0.000000 -0.000000 3.685628 -3.068235 -7.599180 -11.300108 -0.522908 2.765942 11.995093 -2.204969 2.615504 19.987551 -0.002846 -4.225647 33.962306 1.454142 2.633940 -21.956272 -1.673975 -2.371163 1.142951 1.606008 5.904699 -6.118911 0.001771 0.002389 -1.372841 0.093803 -3.683747 -1.376986 -0.076985 3.193998 -5.377827 0.202843 -0.708186 4.132132 -6.795149 -7.365680 -27.814976 -3.748964 1.686644 16.008894 14.425381 4.263443 1.319389 -5.476072 3.067332 0.356283 0.307796 7.780260 -13.165615 -0.240636 1.812642 46.237543 14.476631 -3.982116 -107.703428 3.026358 -2.626333 78.184117 -15.709979 3.338620 57.313981 -4.765509 3.613913 0.533296 -0.659036 -15.917438 26.571248 -8.073075 3.979185 2.675743 2.414416 -3.837533 3.402100 -10.630301 -24.933093 40.200945 2.427900 -1.182689 -29.001143 -14.816021 13.039589 0.415713 22.941797 4.353683 1.097663 -7.200882 9.861362 -0.000003 0.000002 0.000005 -12.752408 11.432068 -5.854592 43.678057 -2.996099 1.081821 -43.434998 3.792481 2.257205 27.857973 -12.539052 0.608300 0.176712 1.992346 -2.685930 0.000008 0.000007 0.000006 0.002957 -0.004242 -0.012547 +-2.458701 49.842998 16.676612 -103.513992 4.300357 -0.268477 -0.000000 0.000000 -0.000000 3.710046 -3.565891 -6.194085 -11.194802 -1.448630 3.320578 12.600419 -2.776192 2.823046 20.405525 0.005159 -4.525028 36.561155 1.746335 3.049084 -21.947755 -0.751150 -2.599210 0.768309 1.441429 5.422585 -6.119241 0.322776 0.115556 -1.439156 0.098080 -3.694127 -1.443335 -0.080687 3.193906 -5.449650 0.202876 -0.724771 6.320815 -4.992361 -9.174052 -29.140491 -3.937150 1.727366 16.688574 14.560814 4.161069 -1.403532 -6.778333 2.765944 0.358530 0.309056 7.806045 -13.590567 -0.223909 1.858103 40.534484 13.945786 -7.856309 -116.082291 2.962804 -2.511758 72.623225 -16.540577 4.111432 65.345220 -4.793464 4.364364 0.529694 -0.655363 -15.847723 28.014174 -7.951277 4.153029 5.793372 2.669717 -3.507767 7.950095 -11.769754 -23.781392 36.525066 2.253135 -0.970450 -26.438923 -14.797739 13.115528 -2.282262 23.018686 5.532162 1.127554 -7.322763 10.033350 -0.000003 0.000001 0.000003 -9.617828 10.067974 -5.234252 43.539897 -3.006185 1.055287 -43.853134 3.983904 2.329751 25.021997 -12.615737 -0.012522 0.172519 1.954949 -2.635323 0.000005 0.000006 0.000003 0.002958 -0.004241 -0.012546 +-3.015897 49.977299 19.523562 -103.557047 4.808133 -1.104346 0.000001 0.000000 0.000000 3.838244 -4.059220 -4.879998 -10.810932 -2.315483 3.843007 13.320245 -3.334500 3.119664 20.773016 -0.006285 -4.758901 39.196741 2.113764 3.586270 -22.018027 0.056658 -2.836188 -0.125175 1.172478 4.716142 -6.149542 0.908271 0.343110 -1.554325 0.105541 -3.725401 -1.558567 -0.087115 3.193735 -5.541024 0.180640 -0.755340 9.213362 -3.540096 -11.053075 -31.504654 -4.177676 1.805654 17.869804 14.678457 4.006863 -4.602594 -8.005256 2.308855 0.364038 0.312823 7.887611 -14.531409 -0.257997 1.990621 34.311879 13.997813 -11.027977 -117.263707 3.016266 -2.500884 64.100737 -17.137441 4.443042 68.364641 -5.093640 6.589429 0.501832 -0.603093 -14.666908 30.635239 -7.870288 4.244245 9.225926 2.947069 -3.145015 13.307212 -12.796442 -22.463608 31.963031 2.008132 -0.747505 -23.284105 -14.787180 13.192255 -4.409603 23.260288 6.521425 1.161895 -7.460800 10.228412 -0.000003 0.000002 0.000005 -5.737909 8.699216 -4.491644 42.877594 -2.980295 1.001026 -43.955107 4.210614 2.399391 21.677413 -12.716666 -0.777179 0.165611 1.892610 -2.550985 -0.000000 0.000005 0.000002 0.002956 -0.004242 -0.012546 +-3.511770 50.053600 22.285018 -103.683482 5.224238 -1.789166 -0.000001 -0.000001 -0.000000 4.169191 -4.419739 -3.923013 -10.078372 -2.992961 4.274203 14.372645 -3.805373 3.573157 21.148819 -0.003127 -4.832697 41.606651 2.833225 4.266705 -22.311621 0.541693 -3.124145 -2.779423 0.661817 3.286557 -6.215652 1.335207 0.496406 -1.648541 0.111702 -3.749701 -1.652839 -0.092378 3.193588 -5.660542 0.141001 -0.762574 12.680718 -2.988115 -12.817929 -36.643555 -4.478593 1.975844 20.328080 14.718876 3.719007 -7.624426 -8.979201 1.800332 0.377885 0.323052 8.112139 -16.035392 -0.315976 2.257041 24.451802 14.834758 -13.787440 -114.780969 2.947139 -2.658886 59.412552 -16.505229 4.436101 67.415182 -6.166644 9.579182 0.446458 -0.515226 -12.682975 32.505774 -7.840023 4.275953 11.776847 3.101751 -2.928178 18.694260 -13.554781 -21.182321 26.981672 1.724079 -0.531574 -19.887925 -14.771114 13.272008 -5.621952 23.634053 7.132709 1.195161 -7.592628 10.415001 -0.000004 0.000002 0.000004 -1.707001 7.552317 -3.734575 41.648909 -2.923070 0.929308 -43.602856 4.415373 2.428878 18.399477 -12.794125 -1.560368 0.156773 1.811554 -2.441360 0.000005 0.000007 0.000004 0.002961 -0.004242 -0.012546 +-3.911971 49.965099 24.841914 -104.325872 5.523744 -2.224923 0.000001 0.000000 0.000001 5.559229 -4.584836 -3.485895 -8.762756 -3.381409 4.649262 16.133172 -4.167229 4.286087 21.614172 0.000377 -4.699441 43.847253 4.649666 5.182034 -23.174502 0.399786 -3.636502 -10.656193 -0.078790 -1.307146 -7.132710 1.193139 0.429977 -1.609898 0.105187 -3.735617 -1.615448 -0.091386 3.198732 -5.800243 0.097016 -0.787874 15.134075 -3.649671 -14.238127 -44.229525 -4.817729 2.252727 23.304785 14.588850 3.474903 -9.639515 -9.452899 1.383279 0.391927 0.338554 8.470123 -14.802325 -0.348823 2.019349 -4.028199 19.111024 -8.051240 -83.924242 1.642012 -2.558433 49.465658 -12.885806 4.725133 55.600413 -8.301010 9.737919 0.255996 -0.269044 -6.934857 32.186433 -7.889377 4.112614 13.010746 3.167855 -2.930470 24.017799 -13.991247 -20.191317 22.896181 1.503743 -0.359177 -17.164349 -14.841153 13.308421 -5.737531 24.274051 7.303780 1.218378 -7.683537 10.543836 -0.000003 0.000002 0.000007 2.557798 6.770342 -3.033035 40.704420 -2.886908 0.858677 -43.397938 4.645476 2.482608 15.294210 -12.925476 -2.250371 0.149187 1.740652 -2.345352 0.000003 0.000005 0.000002 0.002971 -0.004242 -0.012546 +-4.190232 49.537800 27.206272 -106.105506 5.698942 -2.278215 -0.000000 0.000000 -0.000000 9.307239 -4.514267 -3.539501 -6.622060 -3.375398 5.053347 18.694669 -4.332839 5.184594 21.975945 0.005613 -4.365429 45.601117 7.972258 6.253719 -24.754180 -3.266743 -3.738701 -28.655387 3.152823 -11.235829 -9.892430 0.470753 0.147195 -1.473792 0.096338 -3.704384 -1.479268 -0.083776 3.198941 -6.050334 0.079699 -0.819091 15.136207 -5.510211 -14.912264 -52.073580 -5.127763 2.519911 24.721303 14.293084 3.648563 -10.129675 -9.117225 1.167318 0.411905 0.354341 8.815295 -18.158172 0.887739 2.524482 -35.005252 19.426909 2.836832 -29.331740 1.059849 -0.370767 23.558196 -9.450611 4.183793 38.326107 -9.982122 6.170713 0.008178 -0.010437 -0.276012 29.217734 -8.173610 3.368546 13.382209 3.228579 -3.089564 29.587826 -14.141742 -19.715387 21.070513 1.467533 -0.249324 -15.981805 -15.107552 13.267733 -4.552719 25.326353 6.957128 1.228280 -7.722027 10.598428 -0.000002 0.000002 0.000003 7.587843 6.369143 -2.429185 41.023521 -2.940909 0.846670 -44.022389 4.923278 2.594316 12.157578 -13.155432 -3.227260 0.147201 1.721941 -2.320059 0.000004 0.000005 0.000004 0.002962 -0.004241 -0.012545 +-4.359588 48.958000 28.440498 -107.653388 5.878092 -2.167737 -0.000002 0.000001 0.000000 12.412096 -4.497321 -3.547999 -5.074455 -3.333858 5.377238 20.484778 -4.337246 5.547256 21.810740 -0.000139 -4.124574 46.283589 9.867965 6.739376 -25.600803 -7.842076 -3.004420 -44.700635 9.814954 -16.144890 -11.633594 0.000482 0.003978 -1.372581 0.089809 -3.673072 -1.371015 -0.077725 3.199094 -6.245007 0.061700 -0.842860 16.402456 -7.180938 -15.034560 -59.918504 -5.446227 2.729817 26.347198 13.988881 3.766140 -9.881462 -8.880871 1.069346 0.430585 0.369280 9.139539 -20.911389 1.729722 2.994128 -43.553651 19.225613 4.999168 -22.081310 1.612661 0.261270 20.733036 -7.602091 4.285751 33.160403 -10.717830 4.919028 -0.039857 0.035278 0.985497 25.073172 -8.527504 2.407667 13.472173 3.145565 -3.350744 32.813472 -14.251205 -19.667740 21.747442 1.556285 -0.206221 -16.423543 -15.361946 13.209960 -4.095838 26.023169 6.875511 1.226709 -7.715949 10.589804 -0.000002 0.000002 0.000004 10.611960 6.154884 -2.074430 42.630053 -3.059195 0.902346 -45.374798 5.154883 2.727717 10.313913 -13.299545 -3.764497 0.152295 1.769758 -2.384697 0.000004 0.000006 0.000003 0.002966 -0.004241 -0.012545 +-4.396414 47.395351 27.325353 -108.373088 6.123798 -1.795308 0.000001 0.000000 -0.000000 12.752270 -4.680059 -3.560581 -4.939468 -3.801383 6.111274 18.794496 -3.992559 4.168743 18.206927 0.003355 -3.755111 43.459060 8.441783 6.147711 -19.469918 -5.095327 -2.960645 -50.453216 10.830976 -17.858625 -9.141332 0.929355 0.613739 -1.561039 0.102002 -3.725216 -1.566561 -0.088655 3.198809 -6.220969 0.054407 -0.838702 21.385317 -7.124402 -15.111523 -60.414330 -5.441342 2.764613 25.774444 13.911755 3.941593 -8.392611 -8.889407 1.184506 0.432188 0.370571 9.167434 -20.299718 1.526212 2.799221 -39.576240 19.341957 5.073632 -23.443417 1.546508 0.410453 22.035040 -7.491015 4.302154 38.454536 -11.059686 6.302065 -0.027751 0.025536 0.713332 20.664308 -8.838821 1.594875 12.530115 2.785038 -3.840350 30.116320 -14.407854 -20.875464 31.725012 2.272258 -0.499270 -23.086536 -15.910007 12.954577 -4.539480 26.749717 7.309500 1.172009 -7.501074 10.285389 -0.000001 0.000001 0.000002 8.416353 6.320915 -2.148305 50.563810 -3.537720 1.300975 -51.022329 5.390628 3.133688 10.989100 -13.410824 -3.604850 0.191145 2.118838 -2.857015 0.000006 0.000005 0.000004 0.002958 -0.004242 -0.012546 +-4.368469 45.082001 24.805299 -108.843134 6.314541 -1.118363 -0.000001 0.000001 0.000000 12.081949 -4.933514 -3.716997 -5.399282 -4.135908 6.897760 14.221892 -3.590862 2.216381 12.644821 -0.010422 -3.306026 36.694462 5.639002 4.952389 -7.792447 1.682761 -5.627162 -50.871577 7.114871 -19.040365 -1.938845 2.386011 1.434207 -1.916995 0.125414 -3.797950 -1.915743 -0.108168 3.198209 -6.085202 0.073263 -0.822913 25.893199 -5.769610 -15.270500 -52.087384 -5.037291 2.536376 21.537066 13.980709 4.420487 -5.483122 -8.634500 1.554750 0.412507 0.354820 8.825750 -20.727144 1.517090 2.707416 -32.073999 17.734815 6.200568 -15.852693 1.622376 0.926208 19.377221 -7.480110 4.086278 46.564353 -10.789382 7.913414 -0.037727 0.027963 0.782980 17.022891 -8.977881 1.205040 10.515132 2.301539 -4.499398 24.634652 -14.789501 -23.027132 46.466633 3.188848 -1.187927 -33.324188 -16.633034 12.464052 -4.291395 28.103958 7.578688 1.064174 -7.062335 9.666144 -0.000002 0.000001 0.000006 3.661564 6.871764 -2.671435 62.063484 -4.102820 2.006990 -59.392629 5.568729 3.756057 13.282227 -13.497941 -2.990318 0.255894 2.650126 -3.577429 0.000003 0.000005 0.000003 0.002961 -0.004242 -0.012546 +-4.335214 43.498050 21.634999 -109.030067 6.236529 -0.153550 0.000001 0.000000 -0.000000 11.794237 -5.132887 -4.007843 -6.388826 -3.816886 7.086740 10.033171 -3.342123 1.076470 8.927983 0.000698 -3.144781 26.578521 2.804436 3.519757 1.575371 7.470428 -10.527472 -46.244594 2.233196 -16.432404 18.239021 3.836665 1.296745 -2.161258 0.141753 -3.853340 -2.167159 -0.122216 3.197704 -5.941833 0.094666 -0.785123 25.749425 -4.460280 -15.113185 -42.369040 -4.573620 2.225871 16.828763 14.019868 4.935119 -1.249118 -8.184776 2.152450 0.387676 0.335220 8.396901 -24.294040 2.024483 3.173682 -28.366520 14.720018 7.368451 3.057280 1.308227 1.702536 9.534199 -6.896265 3.272309 54.651202 -10.107622 9.145119 -0.046100 0.047175 1.315039 14.371172 -8.872437 1.134571 8.166231 1.810030 -5.141763 18.547206 -15.443610 -25.452824 57.383498 3.679735 -1.883134 -41.407172 -17.050791 12.046889 -2.633115 29.592967 7.110786 0.957043 -6.604121 9.022591 -0.000003 0.000001 0.000003 -1.584857 7.608181 -3.914655 69.905945 -4.376405 2.579974 -65.283911 5.502595 4.205900 17.084264 -13.157636 -1.964277 0.309146 3.050108 -4.121169 0.000003 0.000006 0.000004 0.002958 -0.004241 -0.012545 +-4.355451 43.452202 18.391475 -108.692955 5.306971 1.169957 -0.000001 0.000000 -0.000000 10.586284 -4.569620 -5.002616 -6.998679 -2.497337 7.444680 9.563323 -2.622800 0.835107 9.042737 0.001763 -3.141267 14.870885 1.108565 2.077087 3.992516 9.632845 -12.600020 -38.254250 -0.435699 -13.507197 22.960591 4.338947 0.612192 -2.203130 0.144574 -3.874215 -2.209061 -0.124557 3.197614 -5.736117 0.115345 -0.738966 20.326290 -5.603981 -14.684124 -37.787657 -4.243561 2.127459 14.800385 13.966143 5.143494 3.114685 -7.960241 2.720926 0.378555 0.328096 8.240001 -22.342223 0.428241 2.873589 -19.016047 15.848841 5.700109 -10.180577 0.615042 0.378142 13.869555 -7.220217 2.427254 59.140434 -9.764958 9.531743 -0.006193 0.008281 0.232102 12.398877 -8.689967 1.054380 6.334855 1.432490 -5.606306 11.828058 -15.276442 -28.003110 61.466681 3.729031 -2.247865 -44.577166 -16.914422 11.932736 0.586443 30.453651 5.634581 0.908845 -6.389887 8.722772 -0.000002 0.000002 0.000003 -6.737454 8.869886 -5.782028 71.412810 -4.397884 2.713120 -65.912562 5.230990 4.188892 21.422502 -12.165171 -0.841725 0.323858 3.155714 -4.264947 0.000007 0.000005 0.000004 0.002964 -0.004242 -0.012545 +-4.399215 44.514351 14.823135 -107.308861 2.907056 2.831148 -0.000002 0.000000 0.000000 5.725006 -2.304199 -6.517378 -6.817060 0.707634 8.160668 12.311384 -0.741070 1.310103 12.697816 -0.003237 -2.666735 2.310534 0.263610 0.615902 3.943217 7.942837 -11.574602 -29.889103 -2.182095 -12.652261 11.522170 4.318464 0.519333 -2.203133 0.144575 -3.860229 -2.209062 -0.124557 3.197614 -5.636000 0.053766 -0.728401 8.457821 -9.773194 -15.052382 -30.812179 -3.898944 1.840998 11.886530 13.945796 5.388179 7.551486 -7.838135 3.371701 0.362088 0.315334 7.957582 -22.107142 -0.599147 2.930468 13.914727 11.483097 1.268537 -50.249191 0.847244 -1.936661 24.981113 -6.462925 -1.764485 54.916380 -9.928193 7.517999 0.154456 -0.161051 -4.257515 12.196660 -8.524015 1.276449 5.920424 1.437460 -5.486568 3.730076 -13.063685 -30.412849 59.762899 3.506716 -2.255258 -43.258970 -16.282242 12.176581 4.822221 30.337664 3.455410 0.918852 -6.434795 8.785561 -0.000003 0.000004 0.000004 -12.637192 11.542156 -7.640816 68.223593 -4.262986 2.512672 -62.406627 4.868845 3.799295 26.046808 -10.729068 0.151677 0.308865 3.048034 -4.118348 0.000006 0.000005 0.000003 0.002961 -0.004241 -0.012546 +-4.315421 45.606899 11.839343 -105.865495 0.980064 3.626554 0.000001 0.000000 -0.000001 2.332493 -0.266051 -7.260994 -6.076056 2.591077 8.719263 14.464705 0.515462 1.785676 15.749795 0.002716 -2.293126 -8.071869 -0.411000 -0.615253 3.973935 7.287960 -11.209846 -23.609366 -3.333179 -11.981690 -6.477792 4.213250 1.057033 -2.203131 0.144577 -3.860227 -2.209060 -0.124554 3.197616 -5.647358 -0.027213 -0.730329 -1.847191 -12.387074 -16.195358 -27.170211 -3.693604 1.646788 10.689292 13.901201 5.425566 11.249208 -7.424570 3.939578 0.355768 0.310473 7.849494 -23.012780 -0.627476 3.069287 33.462094 7.113122 4.578936 -65.830758 1.019054 -2.234883 25.676036 -5.121640 -6.321845 47.158059 -9.635955 4.758006 0.289478 -0.305847 -7.811593 13.581537 -8.073947 2.436384 6.015207 2.138507 -4.258004 -2.308866 -10.695339 -31.037457 56.377535 3.248474 -2.126842 -40.622237 -15.618754 12.476197 7.821078 29.540405 1.881517 0.948232 -6.565375 8.968317 -0.000003 0.000002 0.000005 -17.599595 13.749159 -8.114807 63.886536 -4.055167 2.227446 -58.133137 4.539313 3.367066 29.821999 -9.676752 0.787801 0.286885 2.886447 -3.898536 0.000008 0.000005 0.000003 0.002956 -0.004242 -0.012546 +-4.037178 46.537750 10.162609 -104.718136 0.253262 3.163708 0.000000 0.000000 -0.000000 1.812120 0.436685 -6.883022 -4.755942 2.225477 7.593714 15.675003 0.536037 1.976694 17.050705 -0.001485 -1.882189 -14.564125 -1.093237 -1.088708 4.683087 8.117178 -11.838848 -16.502178 -4.088307 -9.994376 -9.283545 4.172533 1.222020 -2.203131 0.144578 -3.860230 -2.209059 -0.124555 3.197615 -5.827674 -0.014039 -0.752915 -6.761883 -12.299278 -15.928482 -32.084331 -3.752300 1.874103 13.996178 13.865988 4.927436 13.523680 -6.694496 4.320079 0.373886 0.324464 8.159809 -23.470275 -0.642188 3.134785 42.088800 8.476076 7.387925 -69.654874 1.769322 -2.385892 26.261733 -4.773188 -8.290543 34.372129 -7.467017 1.078264 0.341981 -0.376509 -9.509363 15.806923 -7.391730 4.247727 6.320493 3.305939 -2.287860 -5.036918 -9.366404 -29.961518 52.658293 3.022245 -1.943157 -37.784118 -15.145273 12.726029 8.266401 28.228773 1.569344 0.981803 -6.712164 9.174050 -0.000003 0.000002 0.000003 -20.507675 14.511684 -7.361738 59.311731 -3.835687 1.969606 -54.121285 4.274417 2.997292 32.022251 -9.369967 1.105976 0.262310 2.699894 -3.645017 0.000007 0.000006 0.000003 0.002960 -0.004242 -0.012545 +-3.608972 47.358700 9.146546 -103.602147 -0.150944 2.348214 0.000000 0.000000 0.000000 1.425746 0.774266 -5.908418 -3.329320 1.944651 4.999551 17.040040 0.537926 2.371245 18.218205 -0.003607 -0.569112 -18.719891 -1.555058 -1.165998 5.820538 8.699495 -12.457318 -7.469548 -4.862714 -8.076563 -10.279998 4.163709 1.301022 -2.203133 0.144576 -3.860229 -2.209061 -0.124555 3.197614 -6.060708 0.026001 -0.800199 -10.510679 -11.926059 -15.229947 -38.453584 -3.900298 2.131648 17.992761 13.834900 4.370425 15.202589 -5.920812 4.561838 0.393952 0.340143 8.504988 -23.791045 -0.666284 3.163739 46.651656 9.810175 8.311268 -66.902905 2.415641 -2.367668 24.375716 -4.801059 -9.566674 19.068495 -4.022739 -1.772678 0.382498 -0.426372 -10.661709 17.690034 -6.809188 5.753754 6.878651 4.295709 -0.616512 -6.555895 -8.317668 -28.474488 49.282634 2.812483 -1.769405 -35.270479 -14.808098 12.905498 7.848990 26.780089 1.639193 1.013046 -6.846615 9.362770 -0.000005 0.000001 0.000003 -22.441011 14.947712 -6.301293 54.993533 -3.612507 1.711548 -50.571613 4.039864 2.694349 33.438971 -9.498565 1.334136 0.238548 2.513233 -3.391615 0.000004 0.000005 0.000004 0.002959 -0.004243 -0.012546 +-2.904275 47.428902 8.586790 -102.655702 -0.315819 0.844987 -0.000000 0.000000 -0.000000 0.395426 1.012050 -4.614777 -2.011866 2.202531 2.628808 18.188581 0.754756 3.212761 18.556584 0.000727 1.104469 -19.703067 -1.690673 -1.302628 6.789936 9.541607 -13.177525 -1.866550 -4.843924 -6.536577 -10.293292 3.959662 1.324974 -2.171725 0.142458 -3.860308 -2.177632 -0.122800 3.197683 -6.166069 0.047027 -0.827730 -12.717775 -11.565472 -14.983221 -42.950639 -4.019607 2.317755 20.249411 13.756231 4.122021 16.984770 -5.607577 4.782992 0.406464 0.350023 8.721156 -23.891675 -0.668735 3.185065 47.974747 10.797694 7.594292 -65.856454 2.505379 -2.329651 23.385796 -4.841870 -9.958530 9.297639 -2.639718 -2.597874 0.385615 -0.436313 -10.913557 17.792507 -6.679740 6.105840 8.150130 4.502216 -0.329754 -7.907586 -7.226414 -26.446037 49.769205 2.856426 -1.784298 -35.644232 -14.844918 12.869841 8.153373 25.647249 1.400440 1.008756 -6.828287 9.337034 -0.000001 0.000002 0.000003 -24.745364 15.433226 -4.262297 53.604536 -3.541196 1.627610 -49.309930 3.888467 2.587383 34.953759 -10.306155 1.696776 0.233389 2.471741 -3.335319 0.000005 0.000005 0.000004 0.002963 -0.004242 -0.012546 +-2.121666 46.907001 8.330078 -101.811989 -0.272686 -1.301311 0.000001 0.000000 0.000000 -1.380598 1.055075 -2.748664 -0.556292 2.892038 0.032135 19.120870 1.121847 4.583214 18.174305 -0.003152 3.262456 -19.235904 -1.747786 -1.461174 7.478234 11.494056 -14.707346 -0.227039 -4.502426 -5.725361 -9.977382 3.078103 1.063005 -2.000738 0.130970 -3.818749 -2.006532 -0.113242 3.198033 -6.209718 0.046368 -0.844177 -13.201028 -11.233701 -15.319459 -46.618293 -4.133702 2.462814 21.538740 13.661482 4.047786 18.607216 -5.592700 4.984290 0.416535 0.358026 8.895485 -23.897199 -0.667645 3.180462 49.115493 11.450743 6.507825 -66.344762 2.328352 -2.332030 23.254560 -4.702300 -10.086644 0.021852 -1.805357 -3.170911 0.387579 -0.436174 -10.899446 15.479646 -6.749831 6.008534 10.680661 4.306543 -0.988608 -9.154721 -6.332081 -23.914238 52.864773 3.044315 -1.942118 -37.962056 -15.127749 12.694095 8.264040 24.679153 1.275532 0.980856 -6.708090 9.168333 -0.000003 0.000002 0.000005 -27.809154 15.746844 -1.392173 55.182938 -3.628214 1.716378 -50.422834 3.839047 2.664492 38.317509 -11.699109 2.505611 0.243249 2.550572 -3.442284 0.000001 0.000007 0.000004 0.002952 -0.004241 -0.012547 +-1.382421 46.418751 8.277353 -101.184520 -0.100589 -3.939758 -0.000000 0.000000 0.000000 -2.612829 0.890331 -0.734538 0.755188 3.958560 -3.019682 19.414957 1.636976 6.585923 17.463976 0.004203 6.037424 -17.505686 -1.822564 -1.507245 7.273800 13.191035 -16.052414 -4.254581 -4.750352 -7.007753 -9.313041 2.217410 0.752167 -1.826260 0.119402 -3.773665 -1.831941 -0.103487 3.198366 -6.242616 0.037735 -0.836824 -13.047772 -11.132526 -15.975158 -49.365518 -4.231265 2.560572 22.134099 13.531101 4.080618 19.982794 -5.379220 5.062047 0.423162 0.363324 9.010539 -23.875052 -0.665019 3.172385 50.341992 11.514674 5.281690 -67.815288 2.317615 -2.363745 23.789601 -4.646711 -10.100907 -6.192120 -1.008288 -3.501054 0.382687 -0.434716 -10.885828 10.665082 -6.892302 5.805733 12.765011 3.929877 -1.891375 -9.704985 -5.751369 -20.912046 55.677967 3.209327 -2.094086 -40.107559 -15.414586 12.511988 7.938189 23.662648 1.328557 0.954718 -6.593926 9.008309 -0.000004 0.000001 0.000003 -30.524597 15.646816 1.797805 57.405793 -3.742729 1.842910 -52.609840 3.807469 2.859220 43.542244 -13.396979 3.860188 0.255089 2.643906 -3.568982 0.000005 0.000008 0.000003 0.002965 -0.004242 -0.012546 +-0.794471 46.760601 8.147143 -100.831284 0.102574 -6.978941 0.000000 0.000000 0.000000 -2.175003 0.869102 0.360422 1.558249 5.272938 -6.071289 18.496926 2.282279 9.452309 16.822055 -0.003552 9.282265 -14.804772 -2.004106 -1.284731 6.660868 13.365578 -16.283688 -8.521949 -5.331819 -9.238720 -8.149745 2.621022 0.791607 -1.896056 0.124024 -3.797995 -1.901778 -0.107387 3.198236 -6.252873 0.027038 -0.840397 -14.083002 -11.565677 -16.474691 -49.303552 -4.483150 2.570332 21.352147 13.706110 4.134511 21.119112 -4.352011 4.840666 0.422965 0.363163 9.007056 -23.878814 -0.662097 3.181559 50.770101 10.733903 4.687501 -69.668379 2.036823 -2.395021 24.597716 -4.297146 -10.212371 -6.858934 -0.090061 -3.347923 0.377794 -0.433258 -10.872222 4.598539 -7.063093 5.543683 11.284265 3.472444 -2.589004 -9.267227 -5.279034 -17.311531 54.952928 3.145857 -2.066447 -39.445184 -15.898807 12.613381 7.763105 22.816577 1.191525 0.962157 -6.626550 9.054020 -0.000003 0.000002 0.000002 -30.320832 15.685926 7.385146 62.664740 -4.096298 2.071972 -54.495252 3.889724 3.007109 44.027416 -16.857224 6.273440 0.263920 2.712334 -3.661913 -0.000001 0.000007 0.000005 0.002964 -0.004242 -0.012546 +-0.471749 47.902000 7.113576 -100.682891 0.444857 -10.291704 0.000001 0.000000 -0.000000 -0.757724 0.949998 0.307518 1.890799 6.723525 -8.359178 16.928826 2.949992 12.644368 16.635524 0.003408 12.527492 -10.917916 -2.309739 -0.604714 5.610793 12.071301 -15.378517 -13.425849 -5.750981 -12.238551 -6.759265 3.935061 1.029011 -2.150786 0.141053 -3.849868 -2.156680 -0.121629 3.197726 -6.352615 0.006403 -0.861880 -18.998388 -12.266902 -16.660387 -43.904920 -4.873929 2.402109 18.092296 14.295822 4.306471 22.941473 -2.231430 4.310398 0.410696 0.353381 8.794374 -23.869599 -0.659326 3.182106 47.909569 9.134540 5.222359 -69.946394 1.096377 -2.353066 24.505260 -3.382170 -10.621286 -4.593522 1.753037 -2.872625 0.379758 -0.433118 -10.858111 -2.085921 -7.237404 5.238821 2.818910 2.915987 -3.329940 -9.087898 -5.274718 -13.428182 50.803614 2.787012 -1.946557 -35.954389 -16.646786 13.077849 8.937968 22.608205 0.416873 0.998308 -6.783478 9.274119 -0.000006 0.000002 0.000003 -22.722197 16.707803 18.482647 65.476526 -4.385934 2.132986 -55.465929 3.066321 3.187541 37.180472 -23.087290 7.560037 0.259900 2.681232 -3.619670 0.000003 0.000004 0.000004 0.002968 -0.004242 -0.012546 +-0.474736 47.987400 4.424406 -101.033925 1.080493 -12.619215 -0.000000 0.000000 0.000000 -0.311631 0.641761 -0.079950 1.326414 8.179467 -7.621333 17.330817 2.928056 14.123862 18.179840 0.000185 12.943984 -7.137427 -2.123533 -0.061298 3.963785 8.809960 -12.693595 -20.137653 -4.756922 -14.202104 -7.360281 3.121885 0.793339 -1.993765 0.130529 -3.818763 -1.992569 -0.112460 3.198061 -6.368324 0.012282 -0.875425 -12.240067 -16.791716 -11.274433 -55.834931 -4.089049 2.606844 21.257314 15.431526 5.181564 35.152741 3.585294 3.684423 0.481445 0.433860 10.641259 -23.895794 -0.674158 3.174939 42.593235 8.184284 6.628532 -73.370691 1.213202 -2.402759 26.042113 -3.238442 -10.438021 0.339696 3.605929 -2.591097 0.393476 -0.433929 -10.808135 -8.536984 -7.391408 4.930796 -8.758002 2.362984 -4.082354 -11.793746 -6.645524 -11.296110 51.543725 2.741337 -2.067197 -36.436010 -16.730798 13.154238 12.544999 22.010466 -0.996389 0.987447 -6.736617 9.208359 -0.000003 0.000001 0.000001 -8.060371 17.121914 27.394614 57.476732 -4.042014 1.617276 -51.383735 3.013627 2.930773 22.748918 -25.034480 1.983185 0.211155 2.289105 -3.087677 0.000003 0.000007 0.000002 0.002964 -0.004242 -0.012546 +-0.928238 46.095249 -0.388104 -102.922298 2.252160 -13.664375 -0.000000 0.000000 0.000000 -0.743883 -0.301700 -0.229550 -1.668737 9.159823 -4.526013 19.363602 1.663805 13.694138 22.394637 0.009366 9.950842 -3.283803 -1.467883 0.403782 2.340078 3.800122 -8.541750 -26.795644 -2.674402 -12.865464 -9.443061 0.546957 0.139575 -1.480768 0.096800 -3.704371 -1.482756 -0.083971 3.198935 -6.424032 0.049143 -0.876954 15.348790 -22.092742 4.546053 -77.673074 -3.152087 2.917028 26.754057 19.613203 7.821064 56.835731 14.168786 -4.328139 0.700831 0.692364 16.141600 -23.867634 -0.679892 3.181507 33.008460 7.244533 10.272822 -72.447645 1.455821 -2.393578 25.877813 -3.377841 -10.126138 7.808949 5.543547 -2.876716 0.379473 -0.431521 -10.816193 -13.725735 -7.498633 4.682725 -20.324248 1.878452 -4.703123 -17.791967 -9.522614 -11.669005 59.696559 2.967795 -2.717430 -43.199102 -16.908355 12.752055 20.285458 19.677527 -3.673076 0.894389 -6.324544 8.631447 -0.000003 0.000000 0.000004 9.152838 17.406719 31.911744 45.609603 -3.320529 0.992252 -42.033490 4.412256 2.044774 4.954263 -21.253110 -3.994633 0.154531 1.790542 -2.412802 0.000006 0.000007 0.000003 0.002967 -0.004241 -0.012544 +-0.947564 43.079899 -6.958825 -106.046664 3.422128 -13.538641 0.000001 0.000000 0.000001 -1.834611 -1.755544 2.806639 -4.689771 9.131092 -4.583439 21.597913 1.042197 10.204610 26.451779 -0.003522 8.658240 0.373371 -0.617930 0.728628 1.508477 0.034695 -5.424019 -30.850222 -1.294050 -9.816256 -9.677272 0.013037 -0.005305 -1.372579 0.089818 -3.680068 -1.371019 -0.077726 3.199093 -6.432363 0.050563 -0.867582 24.938708 -21.272836 10.993386 -74.276874 -1.852860 2.849024 25.640707 17.500611 7.965098 50.483961 14.637310 -7.071682 0.655629 0.636354 14.995746 -23.663168 -0.679363 3.137955 19.727768 7.426685 12.497767 -64.349111 1.854463 -2.330284 23.884433 -3.987022 -9.609309 16.561104 4.543531 -3.468505 0.390337 -0.436720 -10.899449 -17.172568 -7.524311 4.480660 -28.820433 1.526325 -5.101040 -26.109416 -11.897413 -13.804426 68.680415 2.893236 -3.715093 -52.079839 -16.973996 12.122208 32.292762 15.250889 -7.172569 0.769057 -5.735474 7.810847 -0.000007 0.000001 0.000006 10.335336 16.929288 33.782911 54.899495 -3.764970 1.560661 -50.029838 7.253440 2.309420 0.393977 -23.413171 -5.620670 0.201311 2.206059 -2.975149 0.000005 0.000005 0.000004 0.002959 -0.004242 -0.012545 +-0.674005 39.982200 -14.799598 -110.302024 4.366967 -12.139387 -0.000001 0.000000 -0.000000 -2.101896 -3.436105 6.916478 -7.517201 6.648530 -3.804317 24.189061 1.140099 3.674935 30.272602 0.011142 5.992174 3.519406 0.264731 0.806837 1.075522 -2.124840 -3.510095 -33.572314 -0.540693 -6.413362 -8.820953 0.053764 -0.035590 -1.372581 0.089818 -3.680068 -1.371020 -0.077726 3.199094 -6.451283 0.049124 -0.884165 21.779184 -16.513022 12.416303 -60.047510 -2.726741 2.558659 21.701424 11.043239 5.281439 25.112278 4.532458 -2.576444 0.418111 0.362877 9.015876 -23.246766 -0.692753 3.064178 0.661145 9.375397 14.055795 -48.493104 1.815989 -2.078911 18.488317 -4.671848 -9.334546 29.214468 -2.389121 -2.784012 0.390912 -0.439943 -10.983459 -17.788750 -7.385658 4.392534 -30.714748 1.482040 -5.050550 -35.557451 -12.637035 -17.308610 70.049308 2.318356 -4.419799 -53.895400 -15.751823 12.469892 45.920523 9.499756 -10.604831 0.707596 -5.430027 7.387134 -0.000005 0.000002 0.000006 4.601679 16.500977 34.246886 69.667923 -4.306024 2.601448 -67.878990 8.608611 3.843762 6.797832 -28.015217 -5.468865 0.284671 2.869872 -3.876001 0.000005 0.000006 0.000001 0.002965 -0.004241 -0.012546 +-0.432035 38.337200 -22.803369 -112.836906 3.878258 -9.122256 -0.000003 0.000000 -0.000000 -1.951974 -3.932610 9.225608 -9.040307 3.031539 -2.334791 25.527351 1.889342 -2.967091 32.635708 -0.000265 3.040763 5.995406 1.068583 0.663156 0.781994 -3.372762 -2.458734 -36.053396 -0.185546 -4.726724 -7.768754 0.106197 -0.060105 -1.372580 0.089818 -3.680069 -1.371018 -0.077726 3.199094 -6.430505 0.048803 -0.881333 14.226158 -12.497929 12.631492 -52.198105 -5.251509 2.507752 19.367727 8.776207 3.224229 11.135776 -5.263929 -0.636846 0.276738 0.229971 5.903329 -23.522054 -0.654102 3.114978 -20.126266 10.934161 15.394044 -28.273536 1.450383 -1.250361 9.918153 -5.037635 -9.511140 47.384210 -14.748907 2.229277 0.386807 -0.439148 -10.983793 -17.162070 -6.855505 4.407421 -30.677854 1.852961 -4.335613 -43.840740 -10.682217 -20.655178 58.624512 1.519873 -4.173295 -44.121315 -13.025404 13.883229 57.073125 4.722521 -12.413296 0.793605 -5.854246 7.975929 -0.000005 -0.000001 -0.000001 -3.857072 16.382706 31.567457 76.474493 -4.306220 3.274218 -77.863685 9.145876 4.714361 17.869495 -32.012321 -1.982635 0.334411 3.230244 -4.366469 0.000006 0.000004 0.000005 0.002964 -0.004242 -0.012546 +-0.428326 38.535549 -31.047535 -112.861712 1.124375 -2.659959 -0.000000 0.000000 0.000000 1.282162 -1.893060 9.111184 -7.434172 5.219922 -0.975851 24.819030 4.909370 -7.857872 29.634923 0.009318 3.960153 7.428945 1.761452 -0.802289 0.656808 -7.981203 -0.029430 -37.009695 -0.210148 -9.135388 -6.964047 0.122727 -0.071697 -1.367362 0.088751 -3.680824 -1.372418 -0.077205 3.200714 -8.484196 0.073289 -1.156560 12.792217 -20.558117 10.902816 -63.539006 -7.573843 3.004129 27.539244 13.318706 4.373852 13.484278 -3.113609 0.772565 0.460259 0.408148 10.048273 -21.825437 -0.560065 2.912580 1.731834 12.584976 9.152245 -59.481506 1.198270 -2.105907 20.032481 -6.509235 -10.951216 58.613526 -13.853003 3.200892 0.449368 -0.516418 -12.703341 -15.980849 -5.936987 4.537839 -30.629525 2.610312 -3.052757 -49.592245 -4.506959 -23.606777 43.591887 1.430090 -2.794745 -28.333132 -8.680706 14.892744 68.748694 1.551598 -13.106875 0.954764 -6.594114 9.008574 -0.000006 0.000002 0.000003 -15.222874 17.362895 24.525989 74.723339 -3.972606 3.376140 -75.495878 9.209320 4.342245 33.058964 -32.787849 5.561936 0.339556 3.266301 -4.415600 0.000007 0.000006 0.000004 0.002968 -0.004242 -0.012546 +-0.511846 39.112400 -39.565069 -112.249252 -2.327182 5.671222 -0.000001 0.000001 0.000001 5.140911 0.962591 5.728493 -5.663522 7.894997 -0.142238 23.744990 7.462350 -11.978703 26.576207 -0.001448 5.248503 8.230023 2.500558 -2.340857 0.868121 -12.162956 2.192325 -36.653864 -0.390972 -13.217471 -6.429450 0.122988 -0.072937 -1.362137 0.087684 -3.681580 -1.373814 -0.076685 3.202331 -12.713839 0.153577 -1.722485 8.597810 -30.756939 7.025785 -68.641474 -7.794834 3.250381 33.681370 16.519822 6.138215 18.444695 0.549592 2.870800 0.628174 0.602105 14.280411 -18.082593 -0.381015 2.443367 27.753490 11.478839 4.992626 -84.978864 1.708176 -2.532293 27.470724 -8.891047 -12.346363 59.599268 -10.139407 3.616087 0.507199 -0.616093 -14.971321 -14.694707 -4.917317 4.752920 -30.579485 3.440775 -1.646953 -54.487588 4.500242 -26.334082 47.635908 3.116173 -1.408932 -23.823104 -5.222326 14.290890 71.890999 -0.495475 -12.723381 1.032294 -6.928425 9.477740 -0.000005 0.000002 0.000003 -25.804701 20.986286 16.982901 68.731858 -3.542078 3.156943 -65.680765 9.013743 3.184739 43.926020 -30.747224 11.642445 0.320617 3.132615 -4.233492 0.000004 0.000006 0.000001 0.002966 -0.004243 -0.012546 +-0.470250 39.731949 -47.504351 -111.266166 -5.115306 12.902626 0.000001 -0.000000 -0.000000 5.984388 3.337553 -3.380378 -6.447128 4.087075 0.722694 21.544517 6.125952 -11.294659 27.434645 0.005648 2.427190 8.645976 3.342748 -2.708978 0.769220 -10.134657 1.516717 -36.537309 -0.242075 -7.819584 -5.709011 0.122061 -0.074477 -1.362137 0.087684 -3.681580 -1.373815 -0.076685 3.202332 -16.773836 0.070271 -2.218090 -7.583693 -27.219749 0.886775 -53.874852 -6.679577 2.758789 30.929558 16.481121 5.157488 28.935276 0.878177 3.945894 0.579830 0.542334 12.999506 -14.235490 -0.233845 1.936483 31.781307 10.149195 -4.916521 -74.697025 1.801968 -2.389268 24.013285 -6.946179 -11.416402 31.250254 -5.337714 1.461957 0.452118 -0.527725 -12.983901 -13.681024 -4.013710 5.090678 -30.556558 4.094704 -0.539415 -50.570188 10.045098 -30.258662 67.215535 4.396769 -2.314429 -41.812850 -7.107454 12.609608 62.498688 2.519183 -13.327332 0.859230 -6.163504 8.406650 -0.000003 0.000001 0.000002 -33.359103 25.908189 12.057180 56.635972 -2.750054 2.678959 -50.971545 8.167334 1.542075 51.241460 -28.101658 15.114594 0.275819 2.803224 -3.785404 0.000003 0.000006 0.000001 0.002963 -0.004243 -0.012546 +-0.127532 40.046299 -54.244963 -110.662730 -6.359096 16.373107 0.000001 -0.000002 0.000001 6.018174 4.703549 -11.075002 -7.431405 0.732981 1.174858 19.993376 3.918731 -8.046151 28.284909 -0.002529 -0.383007 8.770422 3.891142 -2.643414 0.732613 -7.891272 0.915865 -36.182494 -0.033161 -0.847683 -3.022929 0.118437 -0.080116 -1.362141 0.087683 -3.681580 -1.373818 -0.076686 3.202333 -19.461220 -0.365816 -2.531996 -26.135051 -22.077543 -2.065399 -28.578573 -5.065771 1.583868 21.034853 15.808051 4.891021 38.384291 2.588975 3.996969 0.473815 0.434627 10.707511 -12.487502 -0.157489 1.700367 27.593019 9.617960 -14.165887 -59.986122 2.704809 -2.141819 17.596107 -5.617488 -10.391230 12.117895 -1.343758 -1.047450 0.390879 -0.438622 -10.940642 -13.200567 -3.423742 5.495356 -30.544455 4.401582 -0.036199 -39.427886 9.541751 -35.326590 82.575538 4.379791 -3.772790 -61.069105 -11.127056 10.692479 50.828480 8.180927 -12.875464 0.643057 -5.095724 6.924713 -0.000003 0.000002 0.000003 -37.669532 28.999901 9.833066 42.156774 -1.851762 2.111794 -35.744897 6.768244 0.221150 55.896171 -26.012145 17.404796 0.221884 2.378033 -3.208232 0.000006 0.000004 0.000002 0.002959 -0.004243 -0.012545 +1.571600 39.866199 -59.952956 -112.387091 -5.075815 12.164074 -0.000001 0.000001 -0.000002 6.071654 4.179540 -12.030055 -8.224016 1.632468 -0.453110 19.775937 2.809718 -3.360777 28.781540 0.000979 0.945638 8.487437 4.188807 -1.875500 0.923269 -7.492482 1.127086 -34.238859 0.192989 2.604169 1.479762 0.102283 -0.070461 -1.362138 0.087683 -3.681580 -1.373815 -0.076685 3.202333 -18.839768 -0.141799 -2.490664 -25.644972 -22.041553 1.587673 -27.206550 -2.439794 1.314611 19.130166 12.424332 4.922642 45.176012 5.306308 1.522647 0.414850 0.359225 8.943863 -12.518187 -0.168819 1.705837 18.366876 11.232878 -13.308085 -55.146809 3.721317 -2.081433 16.535306 -5.670124 -9.784236 16.682421 -9.069152 0.077140 0.367043 -0.411600 -10.333268 -13.174402 -3.054936 6.010200 -30.544460 4.401583 -0.036197 -33.120334 7.981969 -32.322561 81.091712 3.864858 -4.070976 -61.953383 -13.843417 10.727582 45.533360 7.510188 -10.292221 0.630316 -5.027912 6.831075 -0.000000 0.000002 0.000004 -38.279438 27.140818 11.300732 20.242543 -0.387910 1.560174 -14.229989 4.118232 -1.059309 57.524682 -24.934615 19.773823 0.151596 1.763194 -2.375823 0.000004 0.000007 0.000000 0.002957 -0.004242 -0.012547 +4.329334 39.588501 -65.400005 -114.957254 -2.086252 4.458567 0.000001 0.000001 -0.000000 6.714937 2.603396 -10.240822 -8.802784 2.978429 -2.020968 19.227113 1.257738 2.166369 29.152525 -0.002226 2.332079 7.556470 4.573788 -0.890652 1.289594 -7.457888 1.517996 -30.798039 0.668363 5.094901 1.339633 0.067772 -0.065675 -1.362137 0.087683 -3.681580 -1.373814 -0.076685 3.202333 -16.373165 0.276682 -2.203001 -14.907533 -21.493206 8.501644 -41.973969 -0.996177 1.955969 25.016387 9.388536 4.274384 58.240880 8.401535 -3.203977 0.368111 0.309483 7.781344 -12.577439 -0.203560 1.703801 8.673422 13.258972 -11.394466 -50.229055 3.895190 -1.996817 16.431933 -5.046981 -9.330175 21.914799 -9.822955 0.845590 0.351652 -0.392040 -9.879286 -13.146070 -2.734205 6.456543 -30.551475 4.401587 -0.035659 -33.571468 5.676563 -24.986289 75.901864 3.366166 -4.028563 -58.480832 -13.842016 11.230510 46.404847 9.705330 -8.190407 0.669677 -5.235395 7.117750 -0.000007 0.000003 0.000004 -31.349177 24.238833 11.544905 -19.943902 2.301307 2.117184 22.277005 -1.901280 -1.223498 58.271613 -22.677176 22.816403 0.066515 0.880840 -1.185111 0.000004 0.000007 0.000004 0.002961 -0.004242 -0.012546 +7.084430 39.588451 -70.021625 -115.283697 1.159297 -2.466503 -0.000003 0.000000 0.000000 7.406671 0.512720 -5.975397 -9.113714 2.501605 -2.062082 17.830369 -0.336933 4.503508 28.368777 -0.004120 1.380569 5.049743 4.995688 0.123093 1.918921 -7.911330 2.171181 -25.539480 1.453169 6.383776 -2.766830 0.015838 -0.021552 -1.362138 0.087684 -3.681580 -1.373815 -0.076685 3.202333 -13.538339 0.219922 -1.842372 -6.039065 -17.443890 12.151656 -51.292201 -1.094669 2.285753 28.129479 7.478285 4.051998 60.264957 8.996824 -5.247909 0.330449 0.274617 6.964716 -12.712766 -0.189337 1.698156 0.397243 16.979589 -9.739047 -44.231986 3.947139 -1.820325 15.917668 -4.694073 -9.091880 26.820612 -9.639256 1.930762 0.346475 -0.381074 -9.606603 -12.635241 -2.984621 6.274193 -31.035566 4.439625 0.099643 -36.585478 2.491817 -19.164775 68.970468 2.892222 -3.793787 -52.989232 -12.817630 11.955635 49.181463 12.367924 -6.131740 0.733377 -5.559579 7.566707 -0.000005 0.000001 0.000004 -34.895055 19.654796 16.305366 3.181738 -0.029435 0.428229 -7.241756 -0.585631 0.133950 71.532669 -22.248164 24.235897 0.054415 0.737092 -0.991494 0.000003 0.000006 0.000003 0.002960 -0.004242 -0.012546 +9.506563 40.046299 -73.543293 -112.937021 4.188280 -9.664225 -0.000002 0.000000 0.000001 8.358755 -1.781159 0.177044 -9.161206 1.656132 -1.652502 15.145218 -1.626419 5.348380 26.088267 0.001407 -0.077718 0.673728 5.328467 1.004106 2.851253 -8.913155 3.170006 -18.523297 2.367857 6.570238 -7.055155 0.003276 0.002881 -1.362140 0.087683 -3.681581 -1.373816 -0.076686 3.202332 -10.290979 0.159947 -1.400222 -1.042114 -12.817104 12.430004 -49.611827 -2.125694 2.331970 24.045062 6.292929 3.866214 41.443122 8.580382 -3.162382 0.283131 0.233563 5.994641 -12.880956 -0.064961 1.682684 -4.586076 20.611160 -8.560176 -41.196929 3.750198 -1.621448 16.891267 -4.218594 -8.805765 30.583874 -10.652547 3.379275 0.343639 -0.372085 -9.375755 -9.379185 -4.879508 4.645509 -33.647651 4.646549 0.821782 -40.407931 -1.399839 -13.901227 62.837896 2.483862 -3.576228 -48.562103 -11.979703 12.441651 52.235064 8.630630 -4.001831 0.788569 -5.830029 7.942255 -0.000003 0.000001 0.000004 -34.879887 16.186322 20.507520 47.551623 -3.455878 1.036643 -56.397256 1.143691 3.550392 74.498334 -24.954761 20.093951 0.152927 1.775673 -2.392697 0.000007 0.000006 0.000006 0.002956 -0.004242 -0.012546 +11.205524 40.504051 -75.159641 -110.537232 5.904708 -14.552379 -0.000001 0.000000 0.000000 9.559180 -3.056292 5.090812 -9.339618 1.037666 -1.079268 12.191572 -2.302294 5.284480 23.860342 0.003513 -1.218105 -4.724443 5.498800 1.496823 4.044361 -10.238555 4.270283 -10.584124 2.839392 5.415470 -10.280081 0.003733 0.001994 -1.362139 0.087683 -3.681581 -1.373816 -0.076684 3.202333 -7.030743 0.220039 -0.957809 -0.966267 -9.455584 11.356863 -41.600201 -3.238490 2.184310 16.961563 5.404179 3.644723 24.095386 7.275710 -1.016200 0.245116 0.194075 5.016853 -12.936849 0.103947 1.671730 -5.610479 23.278921 -8.277730 -39.472147 3.614569 -1.380799 18.293893 -4.090527 -8.688651 31.609505 -12.242735 4.806073 0.339641 -0.368846 -9.306029 -2.725169 -7.425507 2.522835 -36.259775 4.838840 1.547966 -42.500913 -4.134055 -10.663631 59.111208 2.241682 -3.440200 -45.978967 -11.654682 12.701529 53.270933 6.392193 -2.591861 0.822901 -5.993759 8.170076 -0.000007 0.000002 0.000003 -23.159857 18.658853 22.355721 58.313825 -3.881767 1.825046 -72.743279 2.700688 4.518455 65.469912 -29.379158 15.634034 0.207895 2.261804 -3.050677 0.000005 0.000008 0.000004 0.002969 -0.004241 -0.012545 +11.725264 40.406398 -74.882908 -110.596388 6.974731 -13.568518 -0.000000 0.000000 0.000001 8.656278 -4.409028 6.906143 -9.078572 3.065580 -0.275327 10.702430 -1.484002 3.760379 20.589236 0.001296 -0.967260 -10.315526 5.337270 1.038497 5.803795 -12.653751 5.660847 -0.194350 0.829258 1.051846 -10.986759 0.004304 0.000962 -1.417976 0.091276 -3.681494 -1.415719 -0.079030 3.202276 -3.496667 0.198873 -0.468509 -2.039680 -9.704716 8.990197 -36.883551 -3.640329 2.047149 18.932541 3.828289 3.005521 16.689542 5.901300 -0.800224 0.204286 0.153821 4.004170 -12.913464 0.016531 1.669194 0.613818 22.930783 -10.553713 -44.307888 3.861325 -1.612909 25.253085 -7.080295 -8.224384 53.731568 -11.784394 10.298489 0.384047 -0.419046 -10.451080 7.756814 -9.142411 1.456744 -34.403867 5.488955 1.244838 -42.719512 -3.642795 -11.754683 60.586742 2.276973 -3.556982 -47.145501 -11.826847 12.627354 53.335136 5.898948 -2.290227 0.805650 -5.911911 8.056144 -0.000003 0.000003 0.000004 -15.708233 19.304003 21.247242 55.971520 -3.455043 1.913489 -71.954137 6.064050 4.046438 48.546705 -32.409983 8.571980 0.208393 2.265955 -3.056304 0.000001 0.000009 0.000002 0.002956 -0.004243 -0.012545 +10.768591 40.092048 -72.947437 -112.069917 8.462089 -8.549537 -0.000001 0.000000 -0.000000 4.949139 -7.205818 7.296569 -8.009823 9.415993 0.488269 11.749854 0.639579 1.085520 15.423377 0.003763 0.698222 -15.941812 4.715991 -0.895194 7.700008 -11.955003 3.929325 12.165321 -5.762608 -4.677546 -10.878574 0.004901 -0.000128 -1.564553 0.100766 -3.723213 -1.569357 -0.087625 3.202053 -0.079504 0.020000 0.025417 0.232551 -15.660565 6.573402 -32.663525 -3.735944 1.719289 26.540713 2.360589 2.647213 6.563870 5.681827 -1.045095 0.151291 0.125179 3.314381 -13.431706 -0.198882 1.807778 14.872154 17.084980 -14.593990 -56.066199 2.295061 -2.113877 33.623539 -11.708165 -8.306517 74.222381 -9.329031 11.657976 0.469467 -0.552981 -13.556769 21.930488 -9.972704 1.301098 -24.934695 6.894967 0.195022 -41.038877 -2.636828 -16.851378 66.120845 2.509294 -3.891242 -51.817443 -12.146940 12.141105 52.333782 7.409211 -3.031547 0.742449 -5.604681 7.629268 -0.000004 0.000001 0.000004 -8.137668 18.061456 16.017410 59.639495 -3.625503 2.149133 -75.635639 6.509597 4.355737 43.781332 -31.480247 5.895620 0.224164 2.396721 -3.233567 0.000005 0.000007 0.000004 0.002963 -0.004241 -0.012546 +9.802373 41.181598 -70.521885 -113.067059 9.318057 -5.546184 -0.000001 0.000000 -0.000000 3.508430 -8.872708 7.520451 -6.926283 10.724298 -0.185139 14.089934 1.007680 -1.654193 14.379418 0.000454 1.631711 -19.352738 4.296133 -2.548871 7.838330 -3.213061 -3.194347 14.892840 -5.855511 -4.373173 -10.049930 0.005488 -0.001287 -1.753003 0.113099 -3.764832 -1.757915 -0.098172 3.201747 0.231604 -0.016153 0.062839 -0.397711 -16.769855 6.313968 -26.478478 -3.616105 1.402311 25.928440 2.244502 2.867364 1.599999 6.347973 -0.984475 0.163824 0.131282 3.460615 -14.599558 -0.253269 1.979349 21.697732 17.224169 -16.584559 -56.262058 0.716832 -2.012287 30.699942 -12.951433 -11.062261 73.770134 -7.457942 10.996661 0.541338 -0.674743 -16.277802 31.378144 -10.078309 1.391180 -10.325156 5.758237 -1.046473 -36.747181 -2.984386 -19.710541 67.696553 2.635030 -3.915114 -53.952957 -12.306142 11.719525 49.491990 8.774391 -3.447883 0.730911 -5.547276 7.549647 -0.000001 0.000001 0.000006 -0.896780 15.727234 12.324075 58.296545 -3.517834 2.095116 -73.900829 7.330344 4.574828 37.704718 -30.100917 3.342748 0.247659 2.585517 -3.489714 0.000006 0.000008 0.000004 0.002959 -0.004242 -0.012546 +9.070292 45.017898 -67.561649 -113.799166 9.902764 -3.766110 -0.000001 -0.000000 -0.000000 3.471599 -9.791807 7.589347 -5.159637 8.662045 -1.300736 17.012138 0.529216 -4.553483 16.669700 -0.000443 1.757964 -21.070553 4.211852 -4.242693 7.979641 9.880030 -13.060662 5.313610 -2.864372 -2.997105 1.808798 1.215171 -0.461786 -1.986811 0.128566 -3.806302 -1.991870 -0.111262 3.201318 -1.792470 0.073308 -0.219743 -9.754656 -15.609875 6.131074 -9.104683 -3.172762 0.597431 17.560880 2.601808 3.736837 -1.943024 7.470056 -0.739257 0.209660 0.163662 4.262919 -17.588532 -0.175304 2.321835 13.649591 24.198462 -16.214768 -38.543488 1.527389 -1.339606 19.980511 -14.051978 -17.811995 61.867085 -0.024607 6.167093 0.684867 -0.923361 -21.456519 35.560360 -9.753356 1.858090 5.360702 1.729556 -4.024394 -28.063841 -4.376802 -20.709606 59.820203 2.481084 -3.238189 -49.183331 -11.996861 11.759467 44.403087 9.520140 -3.131973 0.835077 -6.051035 8.249856 -0.000003 0.000001 0.000005 6.939295 12.231176 8.355786 46.275180 -2.743528 1.514361 -60.323429 9.086098 4.741568 29.523325 -28.686187 1.793074 0.300577 2.987651 -4.036181 0.000003 0.000007 0.000005 0.002964 -0.004242 -0.012546 +8.105316 49.098301 -64.890415 -114.441408 10.202772 -2.422698 0.000000 0.000000 -0.000000 3.141014 -10.286935 7.374287 -2.611880 5.400207 -2.204291 21.375188 0.087846 -7.786783 20.646437 -0.002863 1.346870 -22.071855 4.260464 -6.043521 9.595300 21.210100 -22.793891 -6.504666 -4.268918 -6.846089 19.355307 3.245882 -1.189717 -2.164772 0.140466 -3.847851 -2.169954 -0.121216 3.200957 -4.711724 0.198806 -0.656736 -18.766305 -14.976010 7.898027 0.671548 -2.768047 0.153490 12.260142 2.615506 4.302509 -3.869868 9.244902 -0.574695 0.225612 0.180759 4.696030 -20.217030 4.012719 1.984161 -17.501649 25.274343 -5.073736 10.490963 3.573945 0.639868 -5.081368 -12.890653 -25.689881 48.731230 7.990240 -0.715358 0.749882 -1.074813 -24.588541 35.676184 -8.975665 2.966028 9.151660 -0.908075 -6.230216 -19.033583 -6.390579 -21.263969 48.172280 2.059221 -2.414788 -41.828384 -11.447768 11.971547 39.999036 10.378019 -2.754700 0.966903 -6.647290 9.083082 0.000000 0.000001 0.000004 14.712455 8.707272 4.812214 30.758592 -1.639608 0.942995 -44.615297 10.579580 4.593869 22.603182 -27.315761 1.106509 0.310246 3.058073 -4.132013 0.000004 0.000003 0.000004 0.002966 -0.004243 -0.012546 +6.508798 50.993599 -63.456424 -114.862797 10.084455 -2.012771 -0.000002 0.000000 -0.000000 3.912555 -9.662925 6.013818 0.859737 1.989394 -2.370880 24.049506 -0.615707 -9.677385 22.775726 -0.001598 -0.123168 -22.575626 4.130527 -8.161111 10.476302 25.104115 -27.232005 -12.267414 -6.995927 -14.047196 22.643001 4.278619 -1.050722 -2.206650 0.143294 -3.868730 -2.211857 -0.123566 3.200871 -7.020535 -0.228558 -0.917844 -11.376944 -12.964306 13.722025 -21.835967 -3.079141 1.283630 21.496473 2.935431 3.511636 -0.533016 10.556855 -0.817790 0.200499 0.163716 4.284546 -22.322475 5.395217 2.173504 -22.346663 23.580151 -4.385639 5.213600 4.945274 0.704190 -3.214359 -12.976520 -27.075875 43.681169 8.597565 -2.583999 0.786150 -1.183547 -26.843513 32.172540 -7.999092 4.293845 9.531212 -2.772830 -8.182500 -14.317131 -8.384065 -21.629265 41.867795 1.747450 -2.022904 -37.773370 -11.224108 12.090240 38.050566 10.192899 -2.884232 1.028437 -6.912118 9.454816 -0.000007 0.000001 0.000004 17.591177 7.640511 3.548491 27.226332 -1.449365 0.778938 -42.165907 10.574020 4.239488 26.548540 -24.956710 2.944468 0.253991 2.635293 -3.557286 0.000004 0.000004 0.000004 0.002964 -0.004242 -0.012547 +3.093565 51.643700 -62.579768 -114.769856 10.288009 -4.281694 0.000002 0.000000 0.000000 8.954775 -7.964601 4.999677 6.790539 -1.558804 -0.829865 20.631923 -2.922137 -9.724192 19.766372 -0.002588 -4.832969 -22.429542 3.606521 -11.109274 8.646528 22.663749 -24.907900 -16.692771 -7.300632 -17.797513 12.096397 4.267843 -0.259236 -2.206645 0.143294 -3.861736 -2.211853 -0.123564 3.200865 -9.655021 -2.721463 -1.111025 10.031697 -5.720128 21.273727 -58.427485 -4.374676 2.628921 34.746625 6.582705 3.321842 15.034026 5.803586 -0.144881 0.300773 0.250853 6.406677 -21.509854 0.163393 2.727089 -9.884236 25.908574 -4.636365 -34.619025 5.533189 -1.281875 17.105767 -13.552729 -24.373856 30.977578 -0.975784 -1.015240 0.802606 -1.222901 -27.595936 23.667238 -8.151601 3.885209 9.592581 -4.061638 -9.655078 -12.501405 -11.840275 -20.397692 41.417653 1.753908 -1.955539 -37.043943 -11.906075 12.127593 37.983499 4.956547 -3.967080 1.039991 -6.960963 9.523498 -0.000007 0.000002 0.000002 11.397566 11.949548 6.724062 46.242471 -3.249446 1.102594 -57.256758 3.482750 2.492574 49.928958 -15.250885 4.777140 0.094897 1.197303 -1.611704 0.000004 0.000001 0.000003 0.002959 -0.004243 -0.012546 +-0.487683 52.034302 -61.757789 -114.363769 10.642818 -7.845983 -0.000002 0.000000 0.000000 12.046468 -6.765651 3.333091 8.164402 -1.073741 -0.654595 16.607036 -3.056752 -8.188672 20.325500 -0.005427 -6.821241 -22.042975 3.077488 -13.784936 6.858774 18.699624 -21.188927 -18.240060 -6.707829 -17.764525 -0.672266 4.178117 0.606577 -2.206645 0.143292 -3.861741 -2.211854 -0.123563 3.200868 -11.967791 -5.636511 -1.445221 25.755975 -0.300636 25.790687 -72.213975 -3.601285 2.872110 35.049398 10.662788 6.405132 32.863713 1.028693 4.206894 0.506240 0.460662 11.226123 -21.828826 -0.445129 2.874117 -4.069641 17.617575 2.657087 -46.503117 5.793902 -2.191349 21.650154 -13.503063 -23.990145 20.508169 1.495433 -4.394146 0.795553 -1.213438 -27.455048 15.123521 -9.538409 1.865621 8.602598 -3.123921 -9.110997 -10.928882 -15.644889 -17.921586 40.891620 1.608985 -2.040086 -35.738768 -13.321020 12.420400 42.781297 4.637965 -5.889303 1.046278 -6.987421 9.560706 -0.000006 0.000002 0.000003 7.563828 18.029044 14.800518 40.546016 -2.956533 0.764462 -53.303293 -1.887757 -1.444058 58.565238 -12.285616 3.132411 -0.067046 -1.366913 1.834568 0.000003 0.000004 0.000003 0.002958 -0.004242 -0.012545 +-3.840683 52.150299 -61.175223 -113.989287 10.881485 -11.756416 -0.000001 0.000000 -0.000000 13.727643 -5.939201 3.059225 5.147389 3.971998 -3.051936 13.443070 -0.269162 -6.698105 22.254349 -0.002394 -3.710435 -21.645840 2.926097 -15.237093 6.505183 15.374279 -18.612745 -13.535511 -7.304319 -15.427705 -9.947615 4.141154 1.326047 -2.206649 0.143296 -3.861740 -2.211859 -0.123560 3.200871 -13.236172 -7.713172 -1.717629 37.231861 0.138395 28.475031 -72.985326 -2.196847 2.838765 30.894903 13.196734 10.060119 44.417486 -1.580079 9.395626 0.669510 0.651005 15.278562 -21.751563 -0.794428 2.908116 -1.077988 4.719558 10.475770 -36.511911 4.850781 -2.031487 14.865544 -15.806610 -25.722450 12.278173 11.632746 -6.825201 0.824761 -1.280597 -28.702875 13.048749 -10.534135 0.660301 5.523598 1.024609 -5.783150 -11.394484 -18.879962 -15.098042 41.885915 1.318803 -2.410560 -35.732730 -15.199660 12.843953 57.747821 6.529765 -10.009331 1.031325 -6.924331 9.471987 -0.000006 0.000002 0.000004 10.225502 24.118234 19.737371 5.425116 -0.024147 0.330645 -26.497174 2.817163 -5.997447 52.939696 -12.977245 5.949548 -0.090290 -2.711060 3.636632 0.000005 0.000004 0.000004 0.002959 -0.004243 -0.012545 +-7.317887 50.828800 -61.981185 -113.853343 10.623204 -14.688071 -0.000003 -0.000000 0.000000 13.348014 -5.531740 3.610888 5.317001 11.398952 -4.677253 12.029456 2.669936 -4.350893 18.582608 0.015650 0.057315 -18.921251 3.096157 -13.915051 7.161014 12.493645 -16.821731 -5.473367 -8.732624 -13.211584 -9.462605 3.908812 1.414185 -2.091496 0.135560 -3.816555 -2.194394 -0.122585 3.214892 -13.252121 -7.720072 -1.719968 40.906326 -7.061225 27.646109 -65.007713 -1.602848 2.667788 27.268335 12.900802 11.046418 36.364655 1.123322 5.613094 0.680119 0.666456 15.609578 -21.729583 -1.195177 2.955658 0.191878 -9.960495 9.953989 -22.531080 2.730640 -1.529813 7.911357 -14.395475 -26.901441 7.095091 14.694342 -6.216273 0.811174 -1.250454 -28.153405 15.497200 -8.822819 3.057223 5.517990 1.672428 -4.944991 -17.451358 -16.334512 -10.722914 61.833297 3.169264 -2.726539 -48.883768 -12.749966 11.517457 62.730371 -5.999665 -3.857461 0.873869 -6.230922 8.500715 -0.000003 0.000001 0.000004 7.853282 24.083824 23.536910 5.716242 -0.284332 0.132884 -21.066270 0.252888 -5.467012 30.932982 -25.439943 0.367260 -0.090201 -2.884580 3.869335 0.000004 0.000003 0.000003 0.002961 -0.004242 -0.012546 +-10.656600 48.396400 -63.619418 -113.618494 10.347820 -17.644313 -0.000001 -0.000001 0.000000 10.138022 -5.570196 2.290754 7.517133 16.589315 -5.243450 10.491595 4.356539 -0.061958 13.906100 -0.000317 2.434523 -14.161170 2.957409 -11.317315 7.985604 10.611034 -15.685963 0.151593 -9.498197 -11.555024 -8.434141 3.511106 1.299672 -1.725058 0.111588 -3.673954 -2.142019 -0.119616 3.270961 -13.358949 -7.724240 -1.746856 42.474019 -13.717141 23.058818 -54.057576 -2.013281 2.398357 22.678118 13.643365 11.221013 23.483028 6.593719 1.835066 0.670415 0.661478 15.550191 -21.877887 -1.311150 2.998067 0.031323 -20.688117 6.139643 -9.098853 1.017656 -0.729607 1.255269 -12.804500 -27.655841 3.201000 14.575316 -5.245371 0.799079 -1.210460 -27.337911 19.680019 -6.406164 6.462337 5.640125 0.023847 -7.311059 -20.093629 -12.558268 -4.529971 76.656272 4.575729 -3.048189 -59.257183 -9.983683 10.122460 59.187317 -10.459233 2.743696 0.740786 -5.596473 7.617885 0.000001 0.000002 0.000005 -0.118462 21.402846 28.648579 22.918609 -1.857116 0.085558 -36.181266 -1.051998 -5.049674 29.529609 -26.500266 -2.465433 -0.086861 -3.321518 4.455461 0.000003 0.000006 0.000004 0.002963 -0.004241 -0.012546 +-13.902905 45.393249 -65.775752 -113.639663 9.120785 -18.334065 -0.000001 0.000000 0.000000 5.473051 -4.545693 1.047331 10.337777 16.303085 -3.012888 10.060156 4.255393 2.649976 9.785535 -0.013096 0.998414 -8.244638 2.513402 -7.982102 8.922912 10.662326 -16.033826 2.726495 -9.810227 -10.756740 -7.142013 2.995404 1.107796 -1.128174 0.074502 -3.444103 -1.949987 -0.108512 3.348285 -13.419343 -7.708946 -1.763897 43.271581 -14.648859 16.807974 -46.594469 -3.062750 2.194868 19.458891 14.942721 10.987386 9.224371 6.311936 2.797920 0.672535 0.653712 15.328891 -21.638476 -1.455088 2.978157 6.503829 -22.111674 4.760158 -13.201950 -0.322084 -0.931601 3.367970 -11.442071 -27.623505 1.735766 11.530393 -4.827631 0.808357 -1.226272 -27.604772 22.870268 -5.999268 7.070385 5.964120 -1.655305 -9.695196 -21.585898 -7.685334 0.192733 81.639649 4.826066 -3.346635 -65.810860 -10.081875 9.088899 51.893423 -9.420784 3.863639 0.677991 -5.278507 7.177379 0.000000 0.000002 0.000004 -6.463579 19.084128 30.492622 40.738242 -3.283971 0.538730 -55.321350 -1.793951 -4.715394 37.106016 -23.539836 -2.490025 -0.082041 -3.618354 4.853861 0.000008 0.000003 0.000005 0.002964 -0.004241 -0.012545 +-16.807419 42.579399 -67.913715 -114.004909 6.971289 -16.555614 -0.000002 0.000000 -0.000000 1.579150 -2.466020 0.449351 12.484125 12.021334 1.036392 10.742989 2.799879 2.619268 6.250470 0.003287 -2.918042 -2.679853 2.027524 -4.783116 10.049754 12.365017 -17.590973 4.070082 -9.179442 -9.489067 -5.950387 2.474723 0.900958 -0.440371 0.034514 -3.213935 -1.632300 -0.089643 3.439769 -13.347919 -7.718483 -1.742637 44.179549 -11.124100 10.463885 -42.778044 -3.755373 2.076929 17.749992 15.757159 10.836764 -1.709964 1.840735 3.864096 0.665162 0.646272 15.185328 -21.312691 -1.381927 2.899173 16.968316 -17.398859 5.606422 -26.604982 -0.885270 -1.530265 10.017685 -10.516623 -27.490507 2.137779 8.433314 -5.117537 0.817470 -1.261403 -28.340313 23.520384 -7.809893 4.554675 6.677084 -1.261286 -9.180100 -24.231658 -1.786093 2.805999 80.596887 4.235210 -3.688797 -70.396238 -11.756207 8.307326 48.015500 -7.332967 3.250755 0.656311 -5.165566 7.021211 0.000001 0.000002 0.000004 -10.345473 18.135052 29.267379 55.322690 -4.254474 1.234110 -70.968391 -2.239536 -4.403808 43.112309 -20.790928 -2.609023 -0.077817 -3.810654 5.112062 0.000009 0.000005 0.000005 0.002952 -0.004242 -0.012547 +-18.977904 40.558998 -69.798061 -114.305743 5.123420 -14.360241 -0.000001 -0.000001 0.000002 -0.146152 -0.678966 1.211170 14.270353 6.093446 4.493086 10.572043 0.460329 -0.022915 2.572862 -0.009452 -6.722422 0.862609 1.598436 -2.245391 11.089847 14.013344 -18.786006 5.263436 -7.141479 -7.053805 -5.180006 1.983774 0.701901 0.265982 -0.013246 -2.959331 -1.207093 -0.073965 3.531725 -13.274223 -7.713549 -1.721194 42.995751 -4.972220 4.479153 -36.720615 -3.768809 1.846914 14.895464 15.999313 11.034876 -8.390477 -1.724931 3.682522 0.654280 0.633261 14.928140 -21.914372 -0.754956 2.930308 34.410126 -5.657478 9.314182 -51.059756 0.471526 -2.081512 20.602899 -10.800726 -27.100709 18.307506 3.279989 -9.296122 0.825288 -1.286893 -28.802436 23.243274 -7.958236 4.329884 7.131292 -0.092255 -7.551693 -27.491241 1.961338 3.405731 76.327083 3.390543 -3.997802 -71.760804 -12.384780 7.842477 48.806850 -5.561952 3.216729 0.657504 -5.171833 7.029872 -0.000007 0.000001 0.000004 -12.315672 17.658617 26.942889 64.302888 -4.722377 1.760349 -81.623784 -2.270451 -4.225827 48.042977 -18.424199 -2.519602 -0.076319 -3.870454 5.192379 0.000005 0.000008 0.000004 0.002960 -0.004241 -0.012545 +-20.123169 39.948600 -71.339054 -114.460202 3.963552 -11.623319 -0.000002 0.000000 -0.000000 0.781156 0.430738 2.123872 15.515401 2.311999 6.371917 8.364203 -1.472410 -3.467823 -0.154327 0.003240 -8.859467 1.256219 1.552413 -0.654894 12.051666 15.708424 -20.248702 6.662131 -5.859855 -5.489964 -5.122346 1.503060 0.529836 1.048415 -0.052068 -2.731554 -0.693994 -0.041909 3.616182 -13.274214 -7.713547 -1.721193 42.834492 -0.090077 0.868334 -34.799907 -3.816327 1.767830 13.900237 16.078742 11.313453 -8.848965 -3.944197 3.356555 0.659404 0.638324 15.025732 -22.380588 -0.591837 2.989048 49.496395 8.498392 7.657817 -69.120933 1.418183 -2.331243 26.347337 -10.979081 -26.973199 40.472187 -4.880097 -8.004336 0.822319 -1.282072 -28.725780 22.647285 -8.038651 4.195544 7.550622 1.349286 -5.575428 -30.054239 3.115776 0.619333 73.406960 3.041052 -4.056878 -70.583858 -12.394951 7.942998 51.904804 -3.837263 3.233891 0.673651 -5.256027 7.146283 -0.000004 0.000001 0.000004 -12.956215 17.270757 23.656430 67.154782 -4.839424 1.951618 -85.301912 -2.164670 -4.183026 50.873217 -16.491357 -2.481393 -0.076149 -3.876723 5.200800 0.000006 0.000009 0.000005 0.002964 -0.004242 -0.012546 +-20.828032 40.134800 -72.808246 -114.394731 3.685725 -8.542799 -0.000003 0.000000 -0.000000 3.257717 0.727285 2.937112 16.175906 0.279602 7.271891 5.108477 -3.200000 -6.651821 -2.216197 0.000938 -10.130105 0.539032 1.686634 0.513728 12.758991 17.122000 -21.567065 7.291419 -5.136042 -4.707881 -5.513413 0.932948 0.320920 1.991674 -0.095598 -2.551976 -0.139044 -0.006684 3.647892 -13.295685 -7.723326 -1.725637 43.474133 3.392541 -2.234409 -35.848920 -3.938349 1.811210 14.121493 16.011957 12.199492 -7.826125 -5.839070 3.140746 0.695227 0.681610 15.908418 -22.389633 -0.591015 3.000693 57.073738 18.058951 0.281750 -72.582325 1.582173 -2.384794 27.388955 -10.998219 -26.969150 50.874273 -5.585808 -1.329592 0.819900 -1.278131 -28.663052 21.830853 -8.060946 4.132531 7.887470 2.794435 -3.571114 -31.943650 3.477233 -3.380944 69.984708 2.881035 -3.852758 -67.344090 -12.114017 8.406938 54.401372 -2.310725 3.039159 0.711334 -5.448939 7.413337 -0.000004 0.000002 0.000004 -13.152089 16.243032 19.684363 66.413786 -4.790089 1.910069 -84.907868 -2.067909 -4.229732 52.723569 -14.604704 -2.575675 -0.076477 -3.864179 5.183953 0.000005 0.000005 0.000003 0.002962 -0.004242 -0.012546 +-21.400673 40.546798 -74.250881 -114.202194 3.856111 -5.575590 -0.000004 0.000000 -0.000000 5.496491 0.585530 3.001632 16.224670 -0.650215 7.079048 2.635100 -4.247298 -8.862007 -3.351002 0.002998 -10.423785 -0.342906 1.874910 1.558552 13.012196 17.603820 -22.032169 7.289635 -4.896136 -4.474678 -6.032473 0.418778 0.140294 2.865794 -0.119074 -2.343957 0.415882 0.028963 3.714235 -13.317149 -7.733104 -1.730087 43.775889 4.604474 -4.296370 -37.737203 -4.010019 1.887320 14.685098 15.821489 13.381869 -6.513717 -6.731961 3.137124 0.725838 0.735973 17.099402 -22.319263 -0.574734 2.979416 54.783594 22.067351 -6.055135 -63.267433 3.448203 -2.307045 24.804541 -13.063182 -25.927337 42.773688 -0.592404 -0.862553 0.825293 -1.286891 -28.802455 20.971205 -8.073350 4.080338 8.095799 3.997968 -1.873944 -33.471210 3.694660 -7.293018 65.771662 2.707921 -3.584263 -63.416803 -11.727296 8.938558 56.473038 -1.022535 2.784670 0.759092 -5.686752 7.743185 -0.000005 0.000001 0.000004 -13.447669 14.921741 15.768411 64.423520 -4.715990 1.788040 -83.126769 -1.989135 -4.296561 54.232022 -12.842961 -2.745613 -0.077102 -3.839103 5.150271 0.000007 0.000008 0.000005 0.002963 -0.004242 -0.012546 +-21.889493 40.958801 -75.617084 -113.950824 4.247370 -3.260555 -0.000004 0.000000 0.000000 6.400566 0.112808 2.321835 15.633056 -0.515603 5.906434 1.905639 -4.318503 -10.075942 -3.036394 0.000948 -9.702850 -1.178137 2.118955 2.560522 12.671237 16.754410 -21.250749 6.973797 -5.226772 -4.824719 -6.497123 0.122880 0.047472 3.345357 -0.116691 -2.031698 0.960279 0.064740 3.825703 -13.327633 -7.732791 -1.732919 42.668440 3.027488 -4.374166 -38.708043 -3.960099 1.926146 14.841692 15.550994 14.566051 -4.712477 -6.211987 3.358475 0.779899 0.794580 18.179903 -22.059530 -0.504874 2.917409 46.268848 22.226785 -6.454568 -49.198419 5.208003 -2.006441 19.214450 -15.331180 -25.421153 32.465579 4.781699 -4.252652 0.826230 -1.288428 -28.826844 20.197092 -8.093202 4.020025 8.184754 4.598808 -1.021358 -34.608444 3.643253 -10.519411 61.489662 2.530177 -3.313911 -59.670089 -11.298989 9.398688 58.212676 0.018468 2.537447 0.805245 -5.909963 8.053436 -0.000001 0.000002 0.000004 -14.057572 13.572252 12.599905 62.091164 -4.599460 1.634305 -80.929117 -1.932502 -4.360496 55.565307 -11.359765 -2.938774 -0.077728 -3.814020 5.116585 0.000005 0.000006 0.000003 0.002956 -0.004242 -0.012546 +-22.224362 41.248699 -76.758076 -113.731787 4.682329 -1.938089 -0.000003 0.000000 0.000000 6.705883 -0.385843 1.949323 14.961154 0.072285 4.704628 1.785685 -4.044289 -10.827523 -2.424292 0.002049 -8.796856 -1.946606 2.339194 3.366950 12.217893 15.511729 -20.107976 6.722767 -5.670800 -5.280461 -6.822317 0.041115 0.014833 3.405437 -0.097855 -1.524468 1.504553 0.102418 4.139663 -13.317154 -7.733111 -1.730093 41.277665 0.871094 -3.803181 -38.758952 -3.867195 1.927545 14.655907 15.323719 15.458916 -3.040550 -5.473653 3.560569 0.804025 0.831922 18.940798 -21.906798 -0.466726 2.886622 39.749868 20.796976 -3.990941 -38.370833 5.111937 -1.672429 13.944023 -15.698839 -25.915077 21.795192 1.748602 -3.721910 0.821783 -1.281196 -28.711834 19.637456 -8.141869 3.926776 8.119289 4.670985 -0.903281 -35.426734 3.356229 -12.618149 57.964388 2.384746 -3.090050 -56.713440 -10.955166 9.746446 59.562051 0.699544 2.371150 0.842090 -6.083852 8.295587 -0.000004 0.000002 0.000005 -14.916163 12.471108 10.646397 60.032765 -4.491073 1.504141 -78.992613 -1.907189 -4.414373 56.771415 -10.347257 -3.072697 -0.078036 -3.801482 5.099745 0.000011 0.000004 0.000005 0.002956 -0.004241 -0.012545 +-22.211913 41.331150 -77.217121 -113.666004 4.869163 -1.810673 -0.000002 0.000000 0.000000 6.706014 -0.609338 1.547213 14.638198 0.938747 3.760623 1.981574 -3.463245 -10.540917 -2.026187 -0.000045 -7.833725 -2.412694 2.448148 3.633824 11.829491 14.460796 -19.195806 6.511903 -6.098445 -5.708727 -7.098603 0.008433 0.008925 3.266603 -0.042708 -0.723755 2.098304 0.180477 4.844657 -13.306661 -7.733427 -1.727257 40.871313 -1.138820 -3.011167 -38.773742 -3.804557 1.930663 14.612975 15.234493 15.657050 -2.295324 -4.782736 3.659159 0.801767 0.837205 19.098450 -21.743912 -0.462020 2.866051 34.446391 18.723273 -1.627481 -28.901509 4.958848 -1.344171 9.380786 -15.881721 -26.433007 12.746678 -2.405007 -3.832574 0.813127 -1.267192 -28.488807 19.521977 -8.161860 3.893290 7.732054 4.597096 -0.991040 -35.731413 3.240210 -12.980972 56.682762 2.323898 -3.028011 -55.614042 -10.838674 9.878203 60.012375 0.752944 2.396829 0.855275 -6.145191 8.381103 -0.000005 0.000002 0.000004 -15.452879 12.204074 10.367432 59.118723 -4.464572 1.435621 -78.114951 -1.925386 -4.453815 57.335887 -10.215384 -3.052586 -0.078184 -3.795211 5.091324 0.000005 0.000004 0.000001 0.002960 -0.004241 -0.012545 +-22.151423 41.285400 -77.437778 -113.657127 4.819882 -2.035268 -0.000000 0.000000 -0.000000 6.656997 -0.604948 1.021936 14.584213 1.989316 2.916388 2.246222 -2.701398 -9.759206 -1.867564 0.008087 -6.797463 -2.723446 2.533555 3.809568 11.497637 13.448417 -18.359153 6.431539 -6.723603 -6.302888 -7.304948 0.000914 0.000806 3.099030 0.010673 0.077075 2.614362 0.259256 5.640076 -13.310158 -7.733319 -1.728201 41.416578 -3.305338 -1.983954 -39.849486 -3.776855 1.959377 15.161792 15.212750 15.363800 -1.884600 -4.068147 3.722313 0.802323 0.829995 18.905947 -21.752211 -0.493708 2.871258 33.815537 16.442456 -1.125278 -27.944013 4.990942 -1.326452 8.893991 -15.958679 -26.497521 12.489136 -1.601357 -4.043468 0.812310 -1.265880 -28.467897 19.588955 -8.157341 3.902791 7.147387 4.480298 -1.150614 -35.931046 3.252808 -12.770629 56.317815 2.294001 -3.006057 -55.267151 -10.824113 9.912919 60.225241 0.682124 2.446590 0.858809 -6.161540 8.403906 -0.000004 0.000001 0.000004 -15.912527 12.278261 10.634060 58.997380 -4.462804 1.433664 -77.936863 -1.938530 -4.464021 57.689677 -10.293234 -3.000153 -0.078333 -3.788939 5.082904 0.000009 0.000006 0.000004 0.002957 -0.004242 -0.012546 +-22.064415 41.202949 -77.591122 -113.693520 4.698800 -2.479877 -0.000001 0.000000 0.000000 6.523087 -0.527120 0.536617 14.623989 2.930131 2.002035 2.515063 -1.926834 -8.844969 -1.803219 -0.005074 -5.683878 -3.033969 2.610703 3.966101 11.220503 12.550405 -17.667737 6.294904 -7.288545 -6.862665 -7.409861 -0.006579 -0.007322 2.990489 0.031076 0.538749 2.893659 0.312578 6.107315 -13.306331 -7.726484 -1.728068 41.918086 -5.296739 -0.677308 -40.703922 -3.741601 2.006469 15.656835 15.237186 14.780852 -1.503535 -3.258969 3.757135 0.789849 0.808176 18.448557 -21.760497 -0.525395 2.876461 33.423436 14.267201 -0.719911 -27.289960 5.061518 -1.310471 8.549895 -16.041659 -26.533457 12.184930 -0.794272 -4.216853 0.811090 -1.263918 -28.436536 19.729949 -8.147794 3.922790 6.431294 4.305544 -1.385627 -36.082746 3.248274 -12.282844 56.215054 2.289641 -3.017331 -55.146884 -10.834888 9.954242 60.358635 0.550734 2.539571 0.860128 -6.167671 8.412457 -0.000006 0.000001 0.000004 -16.406690 12.448661 11.199510 59.058331 -4.466549 1.438482 -77.916913 -1.980534 -4.445532 58.013432 -10.467849 -2.910384 -0.078330 -3.788941 5.082905 0.000002 0.000007 0.000003 0.002964 -0.004241 -0.012545 +-21.967782 41.108398 -77.718891 -113.733026 4.536132 -3.036263 -0.000002 0.000000 0.000000 6.326420 -0.390622 0.183016 14.717289 3.486224 1.080263 2.764533 -1.293203 -8.010393 -1.814141 0.003006 -4.648966 -3.315730 2.674474 4.082351 11.028018 11.951162 -17.184442 6.127787 -7.603592 -7.195767 -7.423854 -0.002455 0.006925 2.973007 0.030899 0.622698 2.937729 0.327878 6.204993 -13.287868 -7.706205 -1.725788 42.147449 -6.696684 0.679229 -41.021004 -3.709931 2.027440 15.943968 15.283059 14.067656 -1.168430 -2.436841 3.784226 0.769920 0.778466 17.844773 -21.768791 -0.557084 2.881658 33.377435 12.639617 -0.386812 -27.327058 5.118185 -1.326024 8.536064 -16.098918 -26.514913 11.901149 -0.004086 -4.399902 0.810682 -1.263265 -28.426102 19.899119 -8.136272 3.946751 5.678275 4.088973 -1.681995 -36.213819 3.248908 -11.648776 56.245230 2.288698 -3.032598 -55.149261 -10.845474 9.964501 60.449107 0.388311 2.633240 0.858808 -6.161539 8.403907 -0.000004 0.000002 0.000004 -16.937611 12.668601 11.909709 59.230691 -4.484710 1.427143 -77.988999 -2.016260 -4.444574 58.312600 -10.686495 -2.803033 -0.078229 -3.793120 5.088517 0.000004 0.000006 0.000003 0.002959 -0.004242 -0.012546 +-21.865685 40.995449 -77.812283 -113.776773 4.328477 -3.609925 -0.000000 0.000000 -0.000000 6.084944 -0.195606 -0.073235 14.832520 3.823666 0.277484 2.990007 -0.769812 -7.284342 -1.860454 0.007359 -3.778636 -3.569708 2.691812 4.159372 10.913469 11.536759 -16.842047 6.137723 -7.775123 -7.349288 -7.402868 0.002610 -0.002259 2.973044 0.027402 0.633190 2.938866 0.317448 6.204986 -13.277875 -7.716919 -1.721734 42.213390 -7.659965 2.016099 -41.067451 -3.669915 2.017198 16.130467 15.359392 13.264626 -0.885349 -1.699191 3.804811 0.744934 0.743890 17.146867 -21.786086 -0.557957 2.883864 33.458297 11.429151 -0.094805 -27.623059 5.166498 -1.344889 8.630640 -16.158435 -26.513063 11.675577 0.693439 -4.548135 0.811500 -1.264573 -28.446988 20.075341 -8.124200 3.971675 5.013703 3.823555 -2.054822 -36.330981 3.282531 -10.937230 56.356037 2.277255 -3.033456 -55.205711 -10.897319 9.962402 60.521701 0.211140 2.727279 0.857483 -6.155409 8.395355 -0.000000 0.000002 0.000004 -17.458876 12.948219 12.691876 59.473648 -4.502313 1.450057 -78.122153 -2.046396 -4.420370 58.598365 -10.933672 -2.686501 -0.078227 -3.793120 5.088517 0.000001 0.000006 0.000003 0.002964 -0.004242 -0.012545 +-21.762286 40.888599 -77.917805 -113.823955 4.100323 -4.155539 -0.000001 0.000000 0.000000 5.844346 0.043639 -0.245361 14.937941 4.038454 -0.347046 3.210397 -0.350443 -6.694314 -1.922096 -0.010008 -3.124035 -3.804218 2.729956 4.228241 10.904184 11.214681 -16.581881 6.554901 -7.878948 -7.340853 -7.297958 0.000919 0.000796 2.972928 0.037892 0.622698 2.939999 0.307019 6.204979 -13.266906 -7.706831 -1.720121 42.224479 -8.308625 3.259213 -41.043967 -3.627442 2.006971 16.281215 15.432541 12.446532 -0.631266 -1.109374 3.821399 0.718815 0.708875 16.435018 -21.816301 -0.573375 2.889554 33.489752 10.520598 0.174830 -27.919067 5.214907 -1.363508 8.743654 -16.182564 -26.496041 11.536063 1.281271 -4.667371 0.811769 -1.265010 -28.453955 20.237457 -8.113028 3.994561 4.485564 3.506910 -2.471944 -36.456750 3.366141 -10.265566 56.466733 2.274163 -3.045507 -55.264596 -10.935382 9.959175 60.587774 0.032542 2.821573 0.856156 -6.149276 8.386801 -0.000002 0.000001 0.000004 -17.960040 13.247452 13.423505 59.737613 -4.520914 1.474490 -78.277219 -2.075475 -4.409445 58.867834 -11.190836 -2.571862 -0.078229 -3.793120 5.088518 0.000006 0.000007 0.000006 0.002957 -0.004242 -0.012546 +-21.660185 40.781799 -78.011234 -113.865725 3.829897 -4.533837 -0.000003 0.000000 -0.000000 5.618327 0.306055 -0.308406 15.005561 4.135566 -0.630271 3.414658 -0.102648 -6.386503 -1.957916 -0.005109 -2.855052 -3.955628 2.735961 4.251447 10.971590 11.031784 -16.444680 7.289055 -7.899155 -7.180524 -7.119590 -0.000758 0.003863 2.972928 0.037893 0.633188 2.938489 0.320924 6.204990 -13.256906 -7.717540 -1.716074 42.188816 -8.535316 4.280966 -41.035866 -3.605723 2.018576 16.420507 15.524216 11.730368 -0.420688 -0.794884 3.828219 0.697133 0.679147 15.817268 -21.815601 -0.583768 2.890841 33.388093 10.051868 0.405593 -28.068863 5.249813 -1.375008 8.806897 -16.216506 -26.483565 11.552332 1.651436 -4.743979 0.811771 -1.265011 -28.453955 20.339646 -8.105952 4.008976 4.247648 3.148308 -2.946111 -36.598057 3.538480 -9.726545 56.451254 2.277677 -3.055227 -55.219651 -10.948440 9.981601 60.691875 -0.122873 2.916104 0.855716 -6.147231 8.383949 -0.000003 0.000003 0.000004 -18.423090 13.605633 14.003440 59.959815 -4.528246 1.472285 -78.411916 -2.106428 -4.406339 59.114477 -11.406497 -2.481563 -0.078133 -3.797302 5.094132 0.000000 0.000004 0.000003 0.002964 -0.004242 -0.012546 +-21.554829 40.699402 -78.134998 -113.904142 3.531268 -4.744714 -0.000005 0.000000 -0.000000 5.434679 0.618116 -0.322520 15.030663 4.169223 -0.670947 3.605031 0.028682 -6.303832 -1.958885 -0.003213 -2.874203 -4.008544 2.739435 4.243750 10.990823 10.934842 -16.328643 7.598559 -7.842977 -7.044182 -6.892271 0.004299 -0.005334 2.973008 0.030897 0.629687 2.938491 0.320922 6.204984 -13.267894 -7.727635 -1.717699 42.137985 -8.499078 5.124948 -41.082900 -3.606929 2.031048 16.562345 15.605165 11.103770 -0.236359 -0.677733 3.819974 0.679500 0.654017 15.283164 -21.816308 -0.573381 2.889548 33.145507 9.859477 0.630584 -28.066386 5.260875 -1.368871 8.798425 -16.216122 -26.490693 11.688553 1.875149 -4.803339 0.811767 -1.265010 -28.453957 20.385470 -8.102769 4.015434 4.322619 2.680313 -3.586295 -36.766580 3.800699 -9.322738 56.323599 2.277037 -3.036412 -55.080243 -10.959938 10.014050 60.817131 -0.244528 3.010929 0.857042 -6.153365 8.392503 -0.000001 0.000002 0.000004 -18.817976 13.998226 14.416140 60.159978 -4.554020 1.471473 -78.503812 -2.140101 -4.390816 59.352391 -11.598260 -2.392161 -0.077829 -3.809844 5.110975 0.000006 0.000009 0.000003 0.002964 -0.004242 -0.012546 +-21.499884 40.598701 -78.303997 -113.949785 3.240297 -4.888923 -0.000000 0.000000 -0.000000 5.369608 0.929403 -0.127390 15.024606 4.235704 -0.671718 3.711343 0.068211 -6.569457 -1.942320 -0.000810 -3.086838 -4.017970 2.724410 4.215940 10.926174 10.716472 -16.088862 7.512168 -7.649855 -6.894597 -6.822321 -0.000770 0.003850 3.151479 0.018422 0.349828 3.117336 0.325868 5.931191 -13.256746 -7.714079 -1.716490 42.350093 -8.499006 6.005885 -41.521732 -3.611577 2.043498 16.810144 15.630851 10.766643 -0.024780 -0.498408 3.822043 0.655896 0.637866 15.026000 -21.822520 -0.584119 2.891721 32.916209 9.629565 1.114693 -28.439895 5.279563 -1.390709 8.938383 -16.219761 -26.464145 11.939801 2.185390 -4.874426 0.812180 -1.265664 -28.464410 20.405732 -8.089184 4.035400 4.726238 1.899725 -4.622658 -36.975293 4.050585 -9.014130 56.130295 2.249458 -3.034522 -54.865622 -10.965695 10.058545 61.041538 -0.328429 3.085528 0.858364 -6.159496 8.401055 -0.000002 0.000002 0.000004 -19.285146 14.340259 14.757799 60.371701 -4.563541 1.484081 -78.626505 -2.171159 -4.367260 59.660816 -11.722433 -2.305331 -0.077983 -3.803570 5.102549 0.000005 0.000006 0.000002 0.002963 -0.004242 -0.012546 +-21.451201 40.449100 -78.528988 -113.995633 2.956416 -5.068287 -0.000002 0.000000 0.000000 5.372445 1.259735 0.395329 14.976754 4.343549 -0.439520 3.803766 -0.010685 -7.192602 -1.890777 0.000204 -3.637030 -3.947415 2.671784 4.148279 10.812106 10.476662 -15.785419 7.190150 -7.344170 -6.709650 -6.983193 0.000908 0.000785 3.924038 -0.054846 -0.846040 3.894006 0.321125 4.737671 -13.267234 -7.713766 -1.719322 42.844055 -8.370791 6.880896 -42.463247 -3.626854 2.070108 17.260629 15.634695 10.575603 0.204933 -0.450875 3.830747 0.654515 0.634065 14.935114 -21.842584 -0.595548 2.895643 32.591431 9.517361 1.759253 -28.960443 5.273526 -1.421270 9.171221 -16.201052 -26.408166 12.355489 2.424868 -4.953417 0.813396 -1.267637 -28.495779 20.404874 -8.077068 4.052397 5.288727 1.018589 -5.818225 -37.320979 4.268876 -8.732403 55.754448 2.238240 -3.020424 -54.571657 -10.711264 10.065210 61.423025 -0.496688 3.385472 0.859684 -6.165627 8.409606 0.000001 0.000002 0.000004 -19.937382 14.632854 15.142617 60.528343 -4.553286 1.505420 -78.628974 -1.947141 -4.406708 60.157016 -11.957448 -2.025243 -0.077829 -3.809842 5.110970 0.000003 0.000007 0.000003 0.002959 -0.004242 -0.012546 +-21.414597 40.269100 -78.755276 -114.041678 2.679649 -5.233904 -0.000003 0.000000 -0.000000 5.410071 1.593868 1.119985 14.872122 4.464606 0.041685 3.883513 -0.178754 -8.020684 -1.779934 -0.004819 -4.475345 -3.758232 2.627564 4.015434 10.674776 10.266290 -15.466125 6.727434 -7.021858 -6.504644 -7.182542 0.002608 -0.002269 4.690781 -0.168616 -2.040666 4.671163 0.289719 3.544391 -13.267234 -7.713764 -1.719323 43.498747 -8.027273 7.675599 -43.766234 -3.672576 2.118054 17.857327 15.643044 10.424890 0.409081 -0.604097 3.832503 0.663347 0.635497 14.909929 -21.833129 -0.581173 2.892607 32.168720 9.593666 2.363093 -29.408437 5.252346 -1.442990 9.351704 -16.165156 -26.390031 12.915023 2.497494 -5.011659 0.813806 -1.268287 -28.506230 20.404881 -8.077070 4.052398 5.921325 0.221282 -6.896321 -37.647973 4.469732 -8.444073 55.833993 2.221788 -3.032161 -54.471053 -10.940827 10.126381 61.620608 -0.420864 3.226091 0.861016 -6.171759 8.418161 -0.000002 0.000003 0.000004 -20.481772 14.938488 15.495058 61.036356 -4.603306 1.519999 -79.038031 -2.225443 -4.345483 60.478018 -11.961240 -2.123199 -0.077678 -3.816112 5.119394 0.000000 0.000006 0.000003 0.002956 -0.004242 -0.012546 +-21.358496 40.095100 -78.991741 -114.080052 2.493542 -5.351094 0.000000 0.000000 0.000000 5.473729 1.844758 1.810036 14.738223 4.599695 0.567009 3.955879 -0.380906 -8.818628 -1.647440 -0.002203 -5.342921 -3.411930 2.541150 3.835507 10.566378 10.022176 -15.147201 6.401823 -6.735346 -6.321495 -7.402868 -0.002472 0.006923 4.864590 -0.199719 -2.312891 4.850662 0.275883 3.263730 -13.267231 -7.713763 -1.719323 44.162732 -7.630621 8.346438 -45.130909 -3.742672 2.172389 18.476732 15.645991 10.314373 0.611368 -0.821772 3.834913 0.653783 0.633342 14.921169 -21.822762 -0.580656 2.891284 31.746673 9.724385 2.902481 -29.822716 5.231151 -1.444785 9.534072 -16.125588 -26.358088 13.483473 2.510538 -5.042687 0.814213 -1.268946 -28.516690 20.404877 -8.077068 4.052396 6.500815 -0.348803 -7.658736 -38.040428 4.634939 -8.256374 55.780120 2.221519 -3.042881 -54.337857 -10.938728 10.160294 61.930704 -0.454852 3.291416 0.862342 -6.177892 8.426714 -0.000004 0.000001 0.000003 -21.079759 15.162453 15.792221 61.384229 -4.628072 1.536147 -79.256239 -2.260310 -4.329051 60.892852 -12.070542 -2.026357 -0.077831 -3.809843 5.110973 0.000005 0.000006 0.000003 0.002959 -0.004242 -0.012546 +-21.300286 39.918049 -79.191166 -114.052941 2.445330 -5.362730 -0.000002 0.000000 -0.000000 5.555145 1.920280 2.183928 14.550692 4.726221 0.974760 3.898514 -0.517371 -9.311731 -1.465458 0.000705 -5.968656 -2.792444 2.454758 3.560712 10.764788 9.994308 -15.231307 7.679302 -6.943144 -6.236218 -7.686146 0.002589 -0.002264 4.864588 -0.199720 -2.312890 4.850660 0.275885 3.260232 -13.267233 -7.713766 -1.719320 44.704613 -7.316579 8.740425 -46.382227 -3.778413 2.213911 19.026801 15.643084 10.245654 0.813676 -1.039437 3.838079 0.655794 0.635331 14.959512 -21.833128 -0.581173 2.892608 31.511962 9.897364 3.211698 -30.319065 5.211031 -1.476032 9.756518 -16.078870 -26.322427 13.985429 2.480311 -5.070837 0.814620 -1.269598 -28.527147 20.426304 -8.079625 4.049696 6.924608 -0.241356 -7.542230 -38.535321 4.755628 -8.338341 56.034197 2.226158 -3.064590 -54.423391 -10.998243 10.178914 62.579918 -0.267344 3.254003 0.857920 -6.157453 8.398205 -0.000003 0.000002 0.000004 -21.604780 15.285951 15.917400 61.648027 -4.648451 1.546462 -79.411017 -2.289503 -4.315218 61.259559 -12.183322 -1.938870 -0.077521 -3.822382 5.127813 0.000004 0.000005 0.000004 0.002959 -0.004242 -0.012546 +-21.238406 39.716701 -79.310444 -113.677154 2.365274 -5.109204 -0.000005 0.000000 0.000000 5.465727 1.878011 2.166527 14.194847 4.802535 1.251103 3.633590 -0.532370 -9.405382 -1.142599 0.003525 -6.293767 -0.834897 2.248711 2.982681 11.180135 10.315228 -15.897762 9.748044 -8.067420 -6.726670 -7.976413 0.000918 0.000811 4.864596 -0.199718 -2.312897 4.850670 0.275886 3.270725 -13.281216 -7.713353 -1.723095 45.270788 -6.961467 8.521571 -47.861484 -3.858335 2.276087 19.678990 15.645126 10.182723 0.966356 -1.480297 3.862168 0.659633 0.639127 15.032719 -21.829670 -0.581000 2.892167 31.720426 10.299973 2.902404 -30.983981 5.181521 -1.502420 10.078717 -16.027121 -26.273944 14.372059 2.145763 -5.008973 0.815842 -1.271566 -28.558512 20.448897 -8.098339 4.024360 7.108510 0.625814 -6.430172 -39.861899 4.683919 -9.753333 58.221058 2.261216 -3.240691 -55.793285 -11.527089 10.151387 66.254619 2.222480 1.808476 0.835967 -6.055222 8.255691 -0.000005 0.000002 0.000004 -22.284896 15.496642 15.775186 62.045007 -4.675556 1.566396 -79.704531 -2.301300 -4.297174 61.500554 -12.269357 -1.877336 -0.077514 -3.822381 5.127813 0.000000 0.000010 0.000007 0.002959 -0.004242 -0.012546 +-21.324299 39.493900 -79.310406 -112.234452 2.186906 -4.005096 -0.000000 0.000000 -0.000000 4.626196 1.551868 1.776832 13.493088 4.796329 1.439749 3.087280 -0.512438 -9.395683 -0.574127 -0.001534 -6.483876 3.677789 1.933790 2.155930 11.568973 11.085378 -17.181406 10.842600 -10.140861 -8.099098 -7.956113 0.465447 0.165118 4.008059 -0.174235 -2.501016 3.998704 0.227262 3.263971 -13.295192 -7.712932 -1.726873 45.759360 -6.238162 7.229205 -49.479149 -3.980509 2.336466 20.385968 15.689777 10.095006 0.968551 -2.580533 3.893704 0.663108 0.642568 15.098949 -21.810318 -0.559180 2.886945 32.224374 11.357612 1.642029 -31.169175 5.102700 -1.498322 10.209443 -15.929232 -26.265452 14.748066 1.132009 -4.767124 0.816246 -1.272219 -28.568959 21.369321 -8.094155 4.033451 6.864329 1.175567 -5.676124 -43.209499 3.575795 -15.114430 63.627292 2.312076 -3.750599 -58.892310 -13.148916 10.221990 78.586677 9.610529 -6.129506 0.776734 -5.772792 7.862695 -0.000004 0.000001 0.000004 -23.446263 15.795259 14.634880 62.615170 -4.685887 1.617707 -80.224897 -2.282999 -4.293328 61.483453 -12.079812 -1.961358 -0.077521 -3.822381 5.127812 0.000002 0.000006 0.000002 0.002965 -0.004242 -0.012546 +-21.459466 39.271099 -79.309521 -110.423937 2.113487 -2.501250 0.000001 0.000000 0.000000 3.513516 1.066704 1.184556 12.657590 4.408015 1.507386 2.425320 -0.638290 -9.456606 0.054434 0.000229 -6.637342 8.926705 1.547465 1.239544 11.945444 12.339310 -18.905922 10.813546 -12.204285 -9.702892 -7.903033 1.281835 0.439869 2.538783 -0.125111 -2.824898 2.536100 0.143364 3.246533 -13.300838 -7.717500 -1.733260 45.835174 -5.011292 5.475085 -50.627074 -4.110176 2.372991 20.872661 15.746552 10.031938 1.002698 -3.814961 3.905733 0.663220 0.643543 15.136348 -21.784011 -0.545566 2.870777 33.053640 13.055594 0.072902 -31.848797 5.022137 -1.502485 10.568786 -15.826795 -26.239882 15.204747 0.020818 -4.477361 0.821333 -1.275864 -28.592165 23.330726 -8.083044 4.092905 6.633717 1.474808 -5.278584 -46.593204 1.757038 -20.389565 65.725586 2.218784 -4.043481 -58.704190 -14.204233 10.715599 88.022055 13.697508 -15.298493 0.751078 -5.647324 7.688448 -0.000007 0.000000 0.000003 -24.746079 16.069091 13.016665 63.158253 -4.704647 1.660034 -80.772458 -2.241023 -4.282642 61.396652 -11.760292 -2.097052 -0.077245 -3.833734 5.143060 0.000006 0.000007 0.000005 0.002961 -0.004242 -0.012546 +-21.604271 39.036098 -79.275982 -108.524176 2.197634 -0.767500 0.000001 0.000000 0.000000 2.039234 0.452377 0.408775 11.905745 2.608243 1.290732 2.285045 -1.236077 -9.807874 1.026376 0.000111 -6.831723 14.870574 1.014664 0.122264 11.862808 14.234460 -20.849776 6.570982 -13.134857 -12.070825 -7.829642 2.298644 0.746115 0.778577 -0.032231 -3.215548 0.765790 0.042964 3.235426 -13.300841 -7.717498 -1.733260 45.052409 -2.319134 3.561443 -51.936071 -4.211757 2.419411 21.440145 15.788550 9.969649 1.072142 -4.670709 3.917994 0.666139 0.646444 15.192117 -21.817939 -0.505562 2.869616 35.164803 16.387776 -1.970159 -37.056862 5.039632 -1.669043 13.007846 -15.648944 -25.971174 15.905902 -0.890760 -4.229945 0.825391 -1.282430 -28.696710 25.822267 -8.011988 4.235532 6.833938 1.221435 -5.886573 -48.929898 -0.042047 -22.010488 61.809091 2.081825 -3.808862 -53.496917 -13.474340 11.569021 81.549229 14.454328 -14.702427 0.791463 -5.843967 7.961638 -0.000004 0.000001 0.000004 -25.939013 16.339718 11.130769 63.764586 -4.734275 1.703912 -81.357299 -2.197375 -4.262859 61.220697 -11.418371 -2.247739 -0.077243 -3.833733 5.143060 0.000005 0.000006 0.000003 0.002958 -0.004243 -0.012546 +-21.774443 38.776699 -79.177578 -106.782517 2.463249 1.274595 -0.000001 0.000000 -0.000000 -0.012132 -0.190501 -0.814675 11.540568 -0.336277 0.988420 3.478714 -2.218010 -10.337326 2.527277 -0.001199 -7.187681 20.706456 0.397285 -0.965360 11.216592 16.964999 -23.272940 -3.365431 -13.323192 -17.077246 -7.648780 3.290866 1.007328 -0.855301 0.064653 -3.568344 -0.857895 -0.048371 3.207370 -13.300841 -7.717500 -1.733261 43.883076 1.335260 1.810201 -55.771802 -4.392572 2.538847 23.119161 15.756061 9.826835 1.247770 -5.114143 3.954115 0.673780 0.654072 15.338523 -21.940449 -0.490869 2.882604 38.122385 20.791571 -5.178506 -47.256366 5.179331 -1.985336 17.630490 -15.347534 -25.487273 17.132369 -1.723644 -3.980982 0.830776 -1.291196 -28.836095 28.116946 -7.871181 4.489739 7.271171 0.970444 -6.503591 -50.690931 -1.371663 -22.851321 56.469478 1.904904 -3.457896 -47.594938 -12.276410 12.308695 71.638801 14.098852 -11.386935 0.844182 -6.093581 8.309153 -0.000004 0.000001 0.000003 -26.726718 16.627167 8.877824 64.568189 -4.755914 1.775009 -82.187379 -2.136549 -4.255050 60.901273 -11.037410 -2.425272 -0.077238 -3.833733 5.143060 0.000005 0.000006 0.000005 0.002963 -0.004242 -0.012546 +-22.112334 38.474498 -78.774929 -105.483867 2.893013 3.823920 -0.000000 0.000000 -0.000001 -2.536362 -0.794207 -3.247416 11.310622 -3.470249 0.895980 6.556140 -3.292787 -10.670317 4.778199 0.003189 -7.696013 25.290319 -0.174809 -1.780919 9.295496 17.854829 -23.559968 -17.851248 -11.582939 -26.211818 -7.007651 4.053460 1.110776 -2.003523 0.138810 -3.821610 -2.006722 -0.112575 3.191769 -13.286859 -7.717915 -1.729482 42.691492 4.550320 0.494316 -62.405356 -4.640391 2.720833 25.992384 15.666816 9.609948 1.250829 -4.946112 3.944038 0.685944 0.666286 15.572063 -22.132732 -0.510654 2.940664 40.574422 24.713241 -9.626031 -59.338959 5.396114 -2.328021 22.846730 -14.964884 -25.025752 18.628914 -2.559095 -3.697001 0.829436 -1.289002 -28.801247 29.376166 -7.597059 4.902353 7.831088 1.569672 -5.643414 -51.812704 -1.986731 -24.020972 52.015796 1.787352 -3.148247 -43.090239 -11.168042 12.756770 62.840661 13.116787 -8.404679 0.885394 -6.283648 8.574327 -0.000004 0.000001 0.000004 -26.326508 16.778616 6.012164 66.203163 -4.798852 1.880195 -83.924484 -2.026673 -4.222890 60.058755 -10.463366 -2.722054 -0.076776 -3.852542 5.168323 0.000003 0.000005 0.000004 0.002964 -0.004242 -0.012546 +-22.787161 37.799999 -77.463039 -106.554304 3.413253 8.362864 -0.000002 0.000000 0.000001 -4.504316 -0.841326 -9.879209 6.645169 -6.743887 1.264519 14.086535 -4.170754 -10.582032 10.271229 0.001035 -8.888008 25.522912 1.149497 -2.431673 6.205324 14.743960 -19.716248 -32.156458 -5.408581 -33.461894 -5.065407 4.288654 0.922494 -2.202424 0.152166 -3.866566 -2.212744 -0.124061 3.191344 -9.796872 -5.783008 -0.925248 38.338994 3.150666 -0.344038 -71.797349 -4.931429 2.934079 30.427112 15.361080 9.228993 0.870564 -2.661730 6.782935 0.695168 0.675614 15.749832 -22.292070 -0.560163 2.970052 40.818863 27.358038 -12.132782 -67.781473 5.751095 -2.540207 26.306757 -14.852204 -24.741576 17.709640 -2.427770 -3.748506 0.825388 -1.282434 -28.696710 28.739567 -6.729059 6.083966 8.371841 2.895482 -3.724722 -50.414598 -0.950791 -27.652487 53.541749 1.723235 -3.328829 -48.095616 -11.822086 11.906510 64.148460 14.200991 -8.799053 0.867113 -6.199883 8.457396 -0.000008 -0.000001 0.000002 -21.150635 16.767194 1.026934 70.947544 -4.938545 2.242044 -89.127084 -1.865952 -4.108030 57.650247 -9.622114 -3.244554 -0.076289 -3.871351 5.193584 0.000010 0.000004 0.000003 0.002957 -0.004241 -0.012547 +-23.652104 36.786800 -73.722072 -109.534545 3.826989 11.716864 -0.000000 0.000000 -0.000001 -4.025628 0.313853 -18.044851 -4.511043 -10.102404 1.600776 17.616529 -4.266105 -9.193445 17.725811 0.011014 -10.961323 22.181312 4.871616 -3.251350 4.937857 12.872840 -17.373476 -38.176023 -1.377433 -33.486782 0.648013 4.336915 0.527184 -2.198932 0.151934 -3.866580 -2.212740 -0.124058 3.191337 -1.774794 -1.037110 -0.047245 29.854752 -3.349506 -3.469667 -63.927262 -4.321737 2.736443 27.755404 15.168301 9.320741 -2.450903 1.023527 13.855812 0.673784 0.654074 15.338523 -22.178605 -0.513903 2.939527 38.850648 28.384722 -6.737051 -51.513858 5.778047 -2.095245 19.058081 -15.834034 -25.386399 9.853622 -0.363041 -4.292261 0.828893 -1.288131 -28.787318 24.985736 -4.481724 9.029092 8.737407 4.637097 -1.135412 -43.602688 -2.892844 -30.840916 60.280819 1.638591 -3.931376 -64.938755 -14.431018 8.673993 69.672407 17.126657 -10.078368 0.797867 -5.874674 8.004342 -0.000005 0.000002 0.000004 -9.969219 14.723581 -2.915843 77.976639 -5.109949 2.801415 -97.519027 -1.722155 -3.936141 51.493019 -9.096911 -4.054283 -0.075639 -3.896432 5.227274 0.000007 0.000004 0.000004 0.002959 -0.004242 -0.012547 +-24.531888 37.415500 -66.753681 -109.578261 4.634472 6.120374 -0.000000 -0.000001 0.000002 -3.306061 1.412912 -18.517131 -10.671500 -9.741892 1.509155 11.558262 -2.951049 -7.692319 18.611074 -0.001194 -10.932355 19.802308 5.720688 -2.749592 6.199936 15.144467 -18.817835 -32.390469 -3.569391 -24.272136 17.595116 4.172715 -0.717636 -2.209398 0.152638 -3.866546 -2.212741 -0.124062 3.191332 -0.403748 -0.066596 -0.075313 34.375114 -2.408951 -2.202798 -37.337289 -2.159559 1.738598 18.284535 7.825817 8.973743 10.918723 11.378792 11.352923 0.489075 0.440868 10.794146 -16.858230 -0.358629 2.285807 32.471399 23.405479 4.502076 -28.072685 6.177127 -1.303369 21.325152 -12.140233 -23.111091 13.136873 -6.626681 -1.666515 0.763220 -1.112475 -25.315925 20.384324 -2.357152 11.839031 8.862634 6.321583 1.475636 -32.126145 -11.022605 -26.555579 70.299327 1.948675 -4.540159 -80.877643 -16.668422 5.431713 64.136713 20.807651 -9.291321 0.696292 -5.372529 7.307507 0.000000 0.000002 0.000006 0.219289 10.831931 2.468210 79.124292 -5.048246 2.946994 -99.716179 -1.558430 -3.861759 40.682704 -8.663821 -5.382349 -0.075641 -3.896433 5.227274 0.000007 0.000005 0.000002 0.002961 -0.004240 -0.012546 +-26.387393 40.253849 -57.271682 -106.437529 6.204745 -2.916948 -0.000001 0.000000 -0.000000 -4.085630 0.651319 -13.300894 -11.980111 -5.964898 1.410078 6.769695 -1.121174 -8.280033 18.882322 -0.004092 -9.177756 19.281621 4.460520 -1.388931 5.904517 10.644332 -14.549562 -25.510943 -3.932358 -14.855879 18.052094 4.089347 -0.745232 -2.212887 0.152877 -3.866548 -2.212741 -0.124059 3.191335 -0.245819 -0.036254 -0.048504 44.861082 -5.108872 0.680655 -51.520389 -1.409104 2.244169 26.210167 3.427790 4.244985 39.987351 11.817269 3.582068 0.242327 0.201685 5.248538 -14.828710 -0.445989 2.086436 40.446234 18.218258 10.231566 -27.567984 5.881167 -1.062999 26.375338 -10.177212 -21.602301 36.309023 -12.062202 5.884326 0.717269 -1.007249 -23.201135 17.410775 -2.397251 11.826210 7.788755 7.347152 3.569086 -15.085264 -18.734296 -17.632447 70.948790 2.525424 -4.134573 -79.653652 -18.013171 5.488570 45.901150 25.819525 -5.535085 0.720597 -5.495617 7.478027 -0.000003 0.000003 0.000004 9.344905 6.694598 11.120096 67.361634 -4.588916 2.170395 -88.036224 -1.559457 -4.165748 26.885375 -5.584155 -6.979610 -0.077086 -3.840001 5.151479 0.000005 0.000005 0.000004 0.002963 -0.004242 -0.012546 +-29.381287 43.916099 -50.453353 -102.189292 7.603726 -9.095156 -0.000001 0.000000 -0.000000 -5.996200 -1.476399 -5.013514 -10.696518 -2.699289 1.330083 7.242668 0.755379 -11.987670 21.961154 0.002458 -7.190623 19.778035 2.623578 0.055224 6.413785 5.352075 -10.972967 -14.823382 -6.299686 -12.996947 -12.801404 4.056066 1.532248 -2.202423 0.152169 -3.866568 -2.212740 -0.124061 3.191337 0.001348 0.001977 -0.003389 37.190430 -15.736206 1.684737 -79.585131 -2.084417 2.940576 37.349663 12.449292 -1.252895 57.752290 9.350014 6.261881 0.315010 0.261325 6.669685 -22.739231 -0.732547 3.076374 66.346627 20.353698 12.124707 -47.925590 2.048324 -1.707081 15.233969 -17.129469 -22.594162 60.236203 -8.823369 0.953800 0.777619 -1.155669 -26.205961 16.574509 -4.566947 9.063726 4.866914 7.456977 4.847869 -8.080147 -22.570962 -13.276321 62.681965 3.105096 -2.889150 -56.276803 -16.592612 9.932349 24.444834 30.100401 -1.921688 0.859145 -6.163092 8.406074 -0.000003 0.000004 0.000005 14.430351 2.408352 15.948194 49.383472 -3.679753 1.098449 -70.770199 -2.300588 -4.815308 18.431301 -0.415618 -6.789156 -0.080799 -3.679062 4.935363 0.000004 0.000005 0.000003 0.002956 -0.004242 -0.012546 +-29.799569 46.916199 -47.241549 -102.973667 7.804159 -10.869247 0.000001 0.000000 0.000000 -0.786398 -2.117145 -4.580572 -7.520520 -1.139817 1.341578 7.104426 0.511740 -10.059037 22.841871 0.001325 -6.262409 20.922316 2.888097 0.290789 5.449688 0.588831 -7.779221 -16.056616 -7.434684 -16.285569 -12.787518 4.063695 1.519254 -2.198932 0.151931 -3.866584 -2.212742 -0.124061 3.191338 -1.667631 -0.033901 -0.221891 14.196541 -20.856310 -2.315646 -61.073033 -2.326600 2.622121 30.643890 12.767710 1.577883 55.065473 12.495494 5.707867 0.363369 0.309749 7.819175 -21.783623 -0.581534 2.913188 50.585781 18.360571 18.039644 -50.449738 0.901625 -1.847736 17.803545 -13.980146 -22.281763 53.323321 -5.976776 -2.433130 0.760410 -1.111208 -25.313334 16.457741 -5.680851 7.527483 5.523525 7.165190 4.265041 -12.409573 -21.067110 -16.131847 67.159264 3.480709 -3.012842 -56.455834 -16.165057 10.229979 50.829522 28.014841 -15.132734 0.823255 -5.995416 8.172382 -0.000002 0.000003 0.000006 20.614427 3.477462 16.800105 33.995495 -2.653986 0.417834 -56.247831 -3.258037 -4.906213 13.822291 0.279929 -6.605748 -0.088217 -3.202446 4.295698 0.000005 0.000006 0.000004 0.002961 -0.004242 -0.012545 +-29.421378 49.543899 -44.987830 -104.572109 7.598523 -11.807343 0.000000 0.000000 -0.000000 4.457329 -2.308552 -6.031265 -2.962765 0.344849 1.317860 6.533962 -0.139634 -6.736432 22.814202 0.002053 -5.949244 22.080049 3.170764 0.380368 4.115645 -3.678792 -4.900714 -19.790552 -7.265845 -19.475785 -12.780373 4.061001 1.525116 -2.209397 0.152639 -3.866559 -2.212739 -0.124060 3.191337 -5.145998 -0.189243 -0.648317 1.857559 -22.488927 -6.946389 -46.386761 -3.797843 2.271122 26.435684 13.910396 2.683544 24.857155 10.556473 11.617582 0.380496 0.335215 8.445639 -20.457899 -0.561184 2.721472 28.666724 12.970977 23.041506 -42.739362 2.476335 -1.644497 17.227913 -11.240033 -20.698901 37.515619 -1.487051 -4.163221 0.707168 -0.990718 -22.891382 16.393432 -6.574079 6.285771 6.960027 6.498172 2.960338 -22.618112 -16.040564 -21.526075 62.626442 3.875864 -2.245076 -45.653732 -9.635823 11.762213 53.518438 17.933099 -12.179416 0.901140 -6.355140 8.674193 -0.000006 0.000001 0.000004 26.675205 5.920031 15.788296 19.595149 -1.561077 0.048681 -42.515874 -3.876043 -4.282173 9.810308 -0.831631 -6.258061 -0.089201 -2.466530 3.308774 0.000005 0.000006 0.000005 0.002966 -0.004242 -0.012544 +-29.170214 50.508350 -42.723303 -106.127382 7.385923 -12.481028 -0.000000 0.000000 0.000001 7.820070 -2.318730 -7.477065 -0.810404 0.974695 1.208042 6.988331 -0.755958 -3.751552 22.997147 -0.000659 -6.042227 21.321436 3.473963 0.322677 2.917286 -5.290673 -3.765298 -22.807658 -6.200548 -20.652828 -12.787260 4.057938 1.531970 -2.212888 0.152876 -3.866541 -2.212743 -0.124060 3.191338 -9.849001 -0.133379 -1.272428 6.992122 -22.184646 -6.626450 -48.868945 -5.179655 2.405940 28.885940 14.416145 1.871872 2.263369 5.530897 14.562832 0.387058 0.332869 8.355137 -18.498509 -0.487776 2.432695 17.557212 9.935816 22.809012 -38.103728 4.141401 -1.593722 18.540243 -7.280844 -19.046334 15.937592 -1.091458 -2.086764 0.649404 -0.873107 -20.479852 16.454871 -7.199242 5.412003 8.778298 5.561475 1.177369 -24.660443 -14.161985 -21.276025 51.012467 3.494451 -1.389405 -34.900636 -7.493613 12.517315 44.065557 14.465554 -7.458101 1.023550 -6.891373 9.425657 -0.000003 0.000001 0.000003 31.480299 7.919203 14.134412 12.807913 -1.008993 -0.020258 -34.445202 -3.645027 -2.987172 6.724214 -2.510300 -5.745851 -0.078167 -1.757875 2.358753 -0.000001 0.000005 0.000003 0.002960 -0.004242 -0.012546 +-29.136975 50.398499 -39.972555 -107.791621 7.099401 -12.993449 -0.000001 0.000000 0.000000 11.607014 -2.419043 -9.534222 -1.436071 0.073976 1.454048 6.835223 -1.982930 0.005535 24.313623 0.001426 -6.521027 14.932678 3.874062 0.146066 2.317868 -1.869180 -6.006656 -22.772613 -5.813962 -20.182512 -12.780389 4.065382 1.519470 -2.202427 0.152165 -3.866571 -2.212747 -0.124062 3.191340 -14.585453 0.155211 -1.940505 18.025488 -19.649181 -6.611806 -58.357811 -5.689694 2.802603 32.781761 13.843766 1.391642 -1.518321 3.806499 14.826841 0.381006 0.333815 8.405570 -16.759170 -0.453646 2.173345 17.123727 12.460160 18.875913 -41.134472 3.984963 -1.730187 21.719704 -1.795585 -18.308582 -4.088452 -4.514991 -1.376670 0.586046 -0.757291 -18.054333 16.645449 -7.617896 4.829260 10.450785 4.544241 -0.640355 -21.486720 -15.813655 -14.673793 39.261078 1.825109 -1.662939 -31.527363 -9.563881 12.978813 43.262990 15.416546 -6.276123 1.069540 -7.084671 9.697596 -0.000012 0.000000 0.000007 34.894270 9.384963 12.705301 14.625587 -1.140497 0.023649 -32.937342 -2.584127 -1.363482 8.418725 -3.512261 -5.316516 -0.056224 -1.070394 1.436905 0.000001 0.000005 0.000004 0.002957 -0.004242 -0.012546 +-29.235341 49.617199 -37.625704 -108.921531 6.882133 -13.204280 -0.000001 0.000000 0.000000 13.674993 -2.493537 -11.542762 -3.119809 -1.617817 1.967838 7.585758 -3.588149 3.317017 25.895940 0.001563 -7.415794 8.541812 4.096841 -0.072279 2.302999 3.220424 -9.120565 -23.009162 -5.099660 -18.517989 -12.773257 4.062693 1.525334 -2.202422 0.152169 -3.866566 -2.212742 -0.124061 3.191342 -17.131976 0.309505 -2.296283 23.623125 -15.872993 -9.236703 -63.027080 -5.918431 2.939070 34.446994 13.487300 1.217156 -3.990006 1.466919 14.907798 0.391618 0.334641 8.384810 -15.922579 -0.413881 2.048902 22.003318 17.185211 13.787118 -49.239412 3.722386 -1.959999 25.965074 1.694011 -17.933844 -5.779137 -9.065618 -1.332884 0.532655 -0.659264 -15.914600 17.035461 -7.788192 4.589640 11.362502 3.667546 -2.097142 -18.571660 -17.545656 -8.721600 34.498858 1.016372 -2.023165 -32.944395 -10.452824 12.614039 42.563671 16.056358 -4.715984 1.067092 -7.074505 9.683276 -0.000000 0.000001 0.000003 35.432459 9.888434 11.924734 23.630923 -1.834223 0.157014 -37.733335 -0.902398 0.362742 15.814935 -3.071734 -5.258593 -0.013399 -0.214290 0.287890 -0.000001 0.000006 0.000004 0.002966 -0.004241 -0.012545 +-29.452300 48.249901 -36.175627 -109.102443 6.855321 -13.209259 -0.000001 0.000000 0.000001 11.357703 -1.925569 -12.179071 -3.831498 -3.051475 2.021098 10.497645 -4.665666 4.653661 27.164950 0.011075 -8.197159 7.794141 3.986758 -0.217772 2.073221 5.626848 -10.287626 -26.592697 -3.516709 -17.199571 -12.541809 4.065951 1.515299 -2.209400 0.152642 -3.866557 -2.212738 -0.124060 3.191341 -17.569727 0.354283 -2.352311 24.823997 -13.346646 -11.489532 -63.822340 -5.799993 2.942287 34.358880 13.317124 1.321264 -5.222638 -0.308354 14.885837 0.389636 0.334386 8.385936 -15.828798 -0.425891 2.052212 24.696957 19.761962 10.998467 -50.773099 3.655844 -1.986818 26.441380 2.257523 -17.952259 -7.382056 -10.793250 -1.751813 0.525609 -0.641348 -15.493022 17.632256 -7.805626 4.547344 11.204614 2.973107 -3.087877 -19.486482 -18.148720 -8.393013 41.556099 1.531245 -2.231689 -37.807256 -10.872603 12.273893 40.576137 16.775354 -4.449630 1.015416 -6.856766 9.377030 -0.000007 0.000001 0.000004 32.275098 10.421412 11.868397 35.309400 -2.721152 0.485228 -47.648161 1.188796 2.111536 22.295432 -7.306544 -4.142294 0.056099 0.757481 -1.018953 0.000002 0.000005 0.000003 0.002961 -0.004242 -0.012545 +-29.737551 46.272251 -35.119634 -109.037570 6.904198 -13.100250 0.000001 0.000000 -0.000000 6.610366 -0.885021 -12.211923 -4.933724 -4.553758 1.860948 14.843898 -5.538591 4.916718 28.798151 0.001620 -9.040232 8.949101 3.706975 -0.351567 1.838619 7.448691 -11.070787 -30.764908 -2.039372 -16.051285 -11.385015 4.092838 1.439370 -2.209401 0.152642 -3.866550 -2.212740 -0.124058 3.191346 -17.548808 0.349170 -2.343964 23.946065 -11.002088 -13.533425 -60.944102 -5.476182 2.850135 32.674177 13.235548 1.591760 -5.980412 -1.729309 14.822568 0.373454 0.327424 8.262028 -15.880108 -0.438737 2.052443 25.099343 21.176314 9.683357 -47.855188 3.553349 -1.887945 24.803251 2.149107 -18.135698 -8.555545 -11.643783 -2.152786 0.535822 -0.655631 -15.794569 18.496439 -7.801615 4.553873 9.570398 2.455316 -3.795284 -21.812507 -18.769711 -9.684665 50.916757 2.092310 -2.660630 -44.116999 -11.609452 11.858194 39.836613 17.983815 -4.754035 0.933939 -6.502099 8.879727 -0.000008 0.000001 0.000003 25.793569 12.104513 12.230949 48.596098 -3.574264 1.097923 -61.968738 0.982170 3.807818 31.041927 -14.919876 -1.803498 0.139478 1.648395 -2.220666 0.000004 0.000005 0.000004 0.002964 -0.004243 -0.012545 +-30.025574 45.252899 -34.266496 -108.859771 6.941554 -12.990911 0.000001 0.000000 -0.000001 4.064861 -0.367991 -12.069676 -6.454997 -5.866487 1.798383 16.825572 -6.222797 4.810690 30.329594 -0.001280 -9.828243 10.187334 3.437379 -0.430112 1.804672 9.318451 -11.936039 -33.883666 -1.042578 -14.721513 -9.639387 4.138535 1.308223 -2.209400 0.152640 -3.866547 -2.212740 -0.124060 3.191344 -17.526295 0.371782 -2.339049 22.580243 -8.762258 -15.225772 -56.349327 -5.078143 2.704192 30.263278 13.195318 1.920958 -6.604347 -2.868522 14.719527 0.375536 0.321575 8.094831 -15.931414 -0.451573 2.052668 24.369289 21.979970 9.201195 -42.981726 3.432428 -1.729222 22.332781 1.983765 -18.382331 -9.438217 -12.216353 -2.466004 0.555990 -0.680299 -16.291318 19.504280 -7.822093 4.554014 7.077322 2.084939 -4.306258 -22.632422 -19.262020 -10.436037 55.703301 2.375664 -2.889395 -47.334527 -12.019711 11.603017 38.975548 18.931938 -4.935917 0.890337 -6.306126 8.605722 -0.000001 0.000003 0.000005 19.336591 12.963567 12.238322 57.390883 -4.029071 1.619887 -72.290635 1.704826 4.775799 39.862824 -20.458124 1.577242 0.192976 2.134683 -2.878472 0.000005 0.000004 0.000003 0.002959 -0.004242 -0.012546 +-30.321557 45.570301 -33.653627 -108.613931 6.992451 -12.865449 0.000000 0.000000 -0.000000 4.703312 -0.585047 -11.732869 -8.087735 -6.629038 1.885249 15.654650 -6.496331 4.412646 31.243226 0.001103 -10.287573 11.453326 3.201366 -0.431859 2.067556 11.263243 -13.020324 -34.892191 -0.690732 -13.236301 -7.475962 4.169979 1.135419 -2.209403 0.152642 -3.866558 -2.212743 -0.124058 3.191330 -17.503871 0.376170 -2.338879 21.494704 -7.077766 -16.228717 -51.203321 -4.755879 2.527209 27.689101 13.203694 2.218179 -7.222722 -3.600937 14.658825 0.371710 0.313377 7.886032 -15.948358 -0.460161 2.072955 23.066655 22.011804 9.597431 -37.237337 3.319359 -1.537354 19.559704 1.797887 -18.641986 -10.113362 -12.443952 -2.667587 0.559062 -0.702516 -16.852386 20.569896 -7.812334 4.543871 3.965065 1.918751 -4.532218 -21.730771 -19.521546 -10.460580 54.872668 2.384183 -2.797245 -46.644326 -12.041914 11.625157 38.033032 19.392655 -4.875636 0.902049 -6.359222 8.679905 -0.000000 0.000001 0.000004 15.105159 11.850815 11.748634 57.587655 -3.916196 1.708737 -75.632367 5.609882 4.876272 45.340926 -22.513030 4.735220 0.199024 2.186602 -2.948792 0.000005 0.000009 0.000004 0.002960 -0.004242 -0.012545 +-30.614884 46.028099 -33.236997 -108.365029 7.057482 -12.754611 0.000001 0.000000 -0.000000 5.863671 -0.942111 -11.182430 -9.538441 -6.961060 1.967124 13.896880 -6.386302 3.678533 31.673702 0.000640 -10.407811 12.628963 3.068205 -0.215598 2.218880 11.926758 -13.133223 -34.737511 -0.564082 -10.382656 -5.221509 4.214664 0.980494 -2.209402 0.152640 -3.866556 -2.212744 -0.124060 3.191338 -17.507342 0.379884 -2.356096 21.064963 -6.060208 -16.660360 -46.586433 -4.551798 2.351868 25.470754 13.278468 2.454688 -7.924814 -4.011599 14.586451 0.355242 0.304210 7.699120 -15.967118 -0.470546 2.079465 21.906603 21.460898 10.462034 -31.828036 3.234890 -1.337325 17.025753 1.632566 -18.878370 -10.732829 -12.430523 -2.830405 0.572446 -0.725890 -17.356622 21.600243 -7.804680 4.553976 0.714454 2.052954 -4.348815 -20.822970 -19.803691 -10.451647 53.196629 2.321904 -2.667711 -45.437098 -11.963668 11.687222 37.396971 19.738892 -4.799799 0.921121 -6.444962 8.799779 -0.000001 0.000001 0.000003 15.209227 10.824830 11.234151 53.376425 -3.654822 1.495369 -72.698737 6.746569 4.603351 40.334963 -21.840052 3.200620 0.181070 2.030829 -2.737863 0.000004 0.000005 0.000004 0.002964 -0.004242 -0.012545 +-30.902222 46.525551 -33.019113 -108.036698 7.123129 -12.643411 -0.000000 0.000000 -0.000000 7.162419 -1.328372 -10.495617 -10.820760 -6.866679 2.020517 11.884391 -5.930884 2.682781 31.758921 -0.001955 -10.226219 13.609096 3.135943 0.406687 1.861453 9.846448 -11.011282 -34.081952 -0.289369 -4.546560 -3.187842 4.256632 0.835524 -2.209400 0.152641 -3.866551 -2.212741 -0.124060 3.191343 -17.528733 0.388221 -2.344143 20.952297 -5.639238 -16.614979 -42.210793 -4.425987 2.178240 23.422528 13.378335 2.644922 -8.602351 -4.114593 14.565266 0.345867 0.296187 7.515216 -16.006664 -0.481691 2.088652 20.647444 20.298508 11.735772 -26.402113 3.193596 -1.141194 14.525030 1.478461 -19.108099 -11.198348 -12.186438 -2.906531 0.590894 -0.749960 -17.832444 22.482751 -7.808120 4.556554 -2.264891 2.715752 -3.445632 -20.094363 -20.091153 -10.432095 51.045609 2.224542 -2.529420 -43.955207 -11.844449 11.771724 37.053460 19.980373 -4.736331 0.942682 -6.540860 8.933986 -0.000003 0.000001 0.000004 16.270028 9.879507 10.683002 47.673540 -3.321124 1.192893 -67.291517 6.562103 4.139769 31.450282 -19.652833 0.163173 0.156912 1.812640 -2.442678 0.000005 0.000007 0.000004 0.002961 -0.004242 -0.012545 +-31.165703 46.955898 -32.909200 -107.635135 7.130230 -12.520507 -0.000002 0.000000 -0.000000 8.245647 -1.658723 -9.771289 -11.909054 -6.466859 2.038170 9.939274 -5.255771 1.562843 31.646386 0.002253 -9.837875 14.537919 3.313075 1.232193 1.440672 6.596045 -8.021472 -32.989212 0.182788 2.107544 -1.574669 4.276256 0.698427 -2.209398 0.152641 -3.866555 -2.212738 -0.124061 3.191339 -17.547411 0.393854 -2.352835 21.064863 -5.684091 -16.256369 -38.088971 -4.323859 1.978751 21.480640 13.478059 2.843501 -9.245272 -4.000645 14.567625 0.335651 0.287573 7.317358 -16.026165 -0.478213 2.093444 19.297921 18.668427 13.211746 -20.925113 3.170061 -0.941536 11.988692 1.318144 -19.335698 -11.554746 -11.783031 -2.922448 0.607763 -0.772651 -18.280370 23.166931 -7.811008 4.555084 -4.658783 3.505460 -2.360730 -19.661995 -20.351733 -10.444577 49.000079 2.127689 -2.422770 -42.530287 -11.705057 11.858070 36.864650 20.165211 -4.724742 0.963541 -6.632629 9.062538 -0.000002 0.000003 0.000007 17.006886 9.041545 10.166924 42.378066 -2.970041 0.954384 -62.188311 6.366355 3.721684 23.572828 -17.380935 -2.090316 0.136463 1.619285 -2.181335 0.000005 0.000005 0.000003 0.002957 -0.004243 -0.012545 +-31.361775 47.175598 -32.884374 -107.096383 7.032548 -12.433842 -0.000000 -0.000000 0.000001 8.651636 -1.813760 -9.173353 -12.616441 -5.728119 2.007396 8.440719 -4.379800 0.397364 31.338343 -0.000132 -9.247378 14.980726 3.667387 2.284923 1.204210 3.189296 -5.100438 -31.228146 0.866083 7.370318 -0.794033 4.297601 0.651957 -2.206396 0.150567 -3.865202 -2.217376 -0.124094 3.191925 -17.567042 0.388126 -2.363086 21.512943 -6.338413 -15.556223 -34.665340 -4.249988 1.809754 19.865851 13.538395 3.010077 -9.847594 -3.636748 14.599191 0.331426 0.281941 7.161886 -16.048065 -0.478100 2.089206 18.022425 16.545051 14.786186 -15.790911 3.195866 -0.726751 9.571147 1.201511 -19.573158 -11.805241 -11.214562 -2.868306 0.614629 -0.789080 -18.649900 23.480644 -7.809047 4.552081 -5.827713 4.027826 -1.628342 -19.822691 -20.497619 -10.543456 47.665407 2.052563 -2.344608 -41.585869 -11.591834 11.922225 36.857313 20.305601 -4.747619 0.975973 -6.686869 9.138576 -0.000001 0.000001 0.000003 16.813216 8.486623 9.813630 39.814932 -2.792017 0.850342 -59.130292 6.303340 3.477647 19.118143 -16.021809 -3.063762 0.127242 1.529330 -2.059952 0.000004 0.000005 0.000004 0.002960 -0.004242 -0.012545 +-31.515702 47.108501 -32.965460 -106.366117 6.777293 -12.385877 -0.000003 0.000000 0.000001 8.188767 -1.756694 -8.618199 -12.877937 -4.786934 2.033137 7.565902 -3.374135 -0.833021 30.747803 -0.000424 -8.631965 14.503035 4.228805 3.583733 1.205554 0.320275 -2.824285 -28.920825 1.614152 10.221414 -0.674932 4.300779 0.643913 -2.203392 0.148494 -3.863850 -2.222014 -0.124129 3.192513 -17.575130 0.379540 -2.360659 22.613974 -7.557987 -14.514393 -32.584468 -4.197345 1.697414 18.905394 13.540744 3.065882 -10.447354 -3.118789 14.659521 0.326198 0.276179 7.005817 -15.938982 -0.480663 2.067203 18.097257 14.426456 16.107709 -13.724539 3.224687 -0.637446 8.568016 1.119070 -19.660170 -11.363420 -9.757064 -2.661282 0.614445 -0.794915 -18.804477 23.068342 -7.795329 4.557185 -5.431515 4.218798 -1.446974 -20.742013 -20.563790 -10.739648 47.365357 2.035545 -2.324164 -41.326204 -11.524891 11.951021 37.053258 20.425399 -4.847734 0.979069 -6.700336 9.157459 -0.000002 0.000001 0.000004 15.417772 8.212666 9.663255 40.765540 -2.854249 0.882417 -58.436517 6.414702 3.439575 17.583270 -15.680634 -3.167406 0.132493 1.580803 -2.129609 0.000005 0.000006 0.000004 0.002959 -0.004242 -0.012545 +-31.647992 46.641498 -33.191465 -105.321094 6.223021 -12.420471 -0.000000 0.000000 0.000000 6.648895 -1.355306 -7.876017 -12.431994 -3.785206 2.361981 7.517956 -2.277776 -2.201755 29.429332 0.001329 -8.267950 12.505265 5.066669 5.291570 1.441825 -2.526388 -0.790403 -25.518890 2.385266 10.819553 -0.674932 4.300780 0.643911 -2.203394 0.148495 -3.863851 -2.222015 -0.124129 3.192514 -17.585910 0.373048 -2.361150 25.193043 -9.280356 -13.037855 -33.171475 -4.193002 1.712252 19.302633 13.330873 2.785476 -11.109765 -2.591700 14.689527 0.310700 0.264692 6.744311 -15.240131 -0.445827 2.000684 21.858081 13.337847 16.775255 -20.062706 3.231534 -0.862598 11.425037 1.090347 -19.414018 -9.019264 -5.786423 -2.285602 0.596305 -0.774562 -18.435014 21.056494 -7.790096 4.588148 -2.928626 4.407293 -1.496449 -22.734018 -20.498028 -11.045365 48.333931 2.082063 -2.380902 -41.921452 -11.506147 11.936053 37.546095 20.562142 -5.051774 0.967838 -6.651413 9.088867 -0.000005 0.000002 0.000004 12.696349 8.209807 9.676137 44.470173 -3.094457 1.054726 -59.042540 6.670978 3.510851 16.098383 -15.648127 -3.155440 0.149448 1.742993 -2.348778 0.000004 0.000006 0.000004 0.002965 -0.004241 -0.012546 +-31.777680 45.966999 -33.441732 -104.217410 5.483794 -12.365407 0.000001 0.000000 -0.000000 4.596516 -0.758930 -7.237230 -11.487378 -2.798469 2.768802 7.942606 -1.321320 -3.309585 27.595519 -0.001114 -7.967174 9.863271 5.874587 6.919995 1.835507 -5.144402 0.970763 -21.796915 2.937442 10.133355 -0.674937 4.300780 0.643911 -2.203393 0.148494 -3.863852 -2.222013 -0.124129 3.192513 -17.576735 0.351830 -2.357215 28.490499 -10.934447 -11.604964 -35.076803 -4.198536 1.790748 20.396068 12.950396 2.324339 -11.798125 -2.150424 14.682196 0.290164 0.249636 6.399114 -14.072760 -0.384378 1.856922 26.299792 12.783040 17.199034 -28.485423 3.240855 -1.156491 15.195806 1.016298 -19.100462 -6.298834 -1.243348 -2.268829 0.591359 -0.753606 -17.931501 18.469759 -7.771044 4.627299 0.291627 4.607709 -1.610714 -25.155979 -20.269237 -11.440865 49.918510 2.149209 -2.490074 -42.924964 -11.510405 11.904560 38.164664 20.728202 -5.315318 0.951100 -6.578006 8.986009 -0.000002 0.000002 0.000003 9.693405 8.395902 9.638384 49.064969 -3.373179 1.285227 -60.142617 6.970234 3.612560 14.400914 -15.660618 -3.172745 0.171624 1.946676 -2.624241 0.000005 0.000006 0.000004 0.002963 -0.004242 -0.012546 +-31.914532 45.216251 -33.625231 -103.297402 4.576596 -12.026844 -0.000000 0.000000 0.000000 2.413366 0.020307 -7.102649 -10.039011 -2.059600 3.060283 8.642609 -0.712681 -3.677911 25.265866 -0.001630 -7.502800 7.344947 6.361306 7.840342 2.282041 -6.864912 2.029811 -18.417027 3.086178 8.729732 -0.674934 4.300779 0.643911 -2.203391 0.148494 -3.863850 -2.222011 -0.124130 3.192513 -17.566347 0.351400 -2.355855 31.857149 -11.949747 -10.942497 -37.359061 -4.211316 1.882795 21.721654 12.342127 1.784792 -12.500188 -1.947580 14.594376 0.283462 0.232009 5.937413 -12.409615 -0.318307 1.647826 29.970585 12.759395 17.043490 -35.520317 3.292036 -1.406338 18.268022 0.715972 -18.898147 -4.893185 1.557239 -2.592458 0.582360 -0.736151 -17.550774 16.254980 -7.753696 4.657192 3.024643 4.786789 -1.717336 -27.510072 -19.785988 -12.008556 51.732919 2.254668 -2.600638 -44.102783 -11.538268 11.844699 38.772524 20.946763 -5.590922 0.933118 -6.498454 8.874625 -0.000007 0.000001 0.000002 7.268840 8.793621 9.332086 53.489089 -3.623649 1.528187 -61.572698 7.244671 3.749339 12.779779 -15.649476 -3.264081 0.194301 2.146098 -2.894193 0.000004 0.000005 0.000004 0.002964 -0.004241 -0.012545 +-32.144219 44.428901 -33.744970 -102.675987 3.405792 -11.154738 -0.000000 0.000000 0.000000 0.258411 1.116637 -7.568206 -7.825764 -1.518437 3.134796 9.443166 -0.291360 -3.291423 22.051985 -0.003015 -6.425750 5.292984 6.195209 7.313094 2.706513 -7.442570 2.290521 -15.317474 2.998153 7.198501 -1.467618 4.301748 0.684990 -2.203391 0.148494 -3.863851 -2.222013 -0.124129 3.192513 -17.555954 0.350976 -2.354499 35.482841 -12.469065 -11.457131 -40.122338 -4.243536 1.997205 23.368870 11.329305 1.159102 -13.263964 -1.985505 14.372568 0.250931 0.204790 5.281384 -9.970528 -0.232671 1.333227 36.782881 13.166094 14.460106 -49.443715 3.398854 -1.857415 24.333887 0.358084 -15.772679 0.348913 1.252531 -1.623740 0.488674 -0.583881 -14.236354 14.954175 -7.739461 4.667625 4.600658 4.770598 -1.939523 -29.677332 -18.910906 -12.881183 52.992901 2.202717 -2.771839 -45.025834 -11.747545 11.885029 39.787295 21.470543 -6.059335 0.915288 -6.418866 8.763286 -0.000003 0.000001 0.000005 5.797725 9.421524 8.428946 57.627685 -3.841023 1.773446 -63.563625 7.460762 3.920954 11.418177 -15.465179 -3.367556 0.215931 2.328806 -3.141753 0.000005 0.000006 0.000004 0.002959 -0.004242 -0.012545 +-32.585519 43.455299 -33.866049 -102.349934 1.717943 -9.421025 -0.000001 0.000000 -0.000000 -2.126364 2.824114 -8.519846 -4.135395 -1.282308 2.953982 10.276027 0.139852 -2.041992 17.362578 0.009047 -4.284626 3.378412 4.978333 4.329019 3.156734 -6.127560 1.189836 -11.990150 2.669105 5.512938 -4.473517 4.291150 0.842667 -2.203394 0.148494 -3.863851 -2.222015 -0.124129 3.192513 -17.545975 0.343617 -2.352279 39.975277 -12.658359 -13.916741 -44.747916 -4.308777 2.186123 26.010726 9.629755 0.278898 -13.867392 -2.609210 13.870347 0.197945 0.162112 4.238019 -5.959699 -0.083924 0.795542 47.987760 10.306595 9.096814 -76.741627 2.601325 -2.469798 35.738878 0.370456 -5.572323 22.105137 -0.847246 1.747979 0.179063 -0.177597 -4.632470 14.362599 -7.737050 4.676750 5.288136 4.396599 -2.547323 -31.973456 -17.448117 -14.311207 55.024799 2.393136 -2.802411 -46.187003 -11.426621 11.772746 40.328896 21.907631 -6.458920 0.894926 -6.326988 8.634860 -0.000001 0.000001 0.000001 5.348621 10.333666 6.481214 62.235661 -4.080079 2.048732 -66.791796 7.639203 4.214624 10.226063 -14.954136 -3.467081 0.241194 2.534237 -3.420376 0.000004 0.000007 0.000005 0.002967 -0.004242 -0.012546 +-32.943158 42.506099 -33.793897 -102.154648 0.238427 -7.584850 0.000000 0.000000 0.000000 -4.243201 4.397507 -9.529117 -0.824427 -1.897257 2.486607 11.030841 0.388953 -0.456548 13.402324 0.002148 -1.852140 1.944533 3.473428 0.668174 3.531672 -3.411376 -0.839748 -9.636362 2.438691 4.541670 -7.485693 4.237397 1.060448 -2.203394 0.148495 -3.863850 -2.222015 -0.124129 3.192513 -17.536796 0.322403 -2.348341 42.895687 -11.748473 -18.005072 -48.206992 -4.387521 2.319226 27.972320 8.156594 -0.411555 -13.864852 -4.020844 13.224933 0.169399 0.124630 3.262973 -2.785263 -0.019121 0.369866 54.258035 4.802084 6.764315 -96.917447 2.228285 -2.626881 42.892794 -0.864677 4.189985 47.074997 -2.310742 2.416611 -0.087770 0.071366 2.050238 14.118415 -7.739041 4.687029 5.556205 3.997942 -3.135008 -33.872935 -15.956253 -15.769286 56.941864 2.482859 -2.930105 -47.475557 -11.377297 11.701554 41.021692 22.545476 -6.927015 0.874774 -6.235067 8.506496 0.000000 0.000002 0.000003 5.801682 11.196145 4.423764 66.074759 -4.254802 2.301040 -69.869119 7.757387 4.502016 8.961357 -14.508209 -3.686771 0.262074 2.698078 -3.642813 0.000005 0.000006 0.000004 0.002963 -0.004242 -0.012546 +-32.909665 41.846901 -33.219393 -102.108572 -0.179626 -6.353780 0.000000 0.000000 -0.000000 -5.650023 4.829767 -9.773417 0.010122 -3.234739 1.013823 12.153602 0.300505 0.596804 12.580313 -0.000633 1.244364 1.853883 2.240717 -2.226398 3.456290 -0.617930 -2.809946 -10.420995 2.369991 4.586967 -8.150787 3.829714 1.151653 -2.140584 0.144259 -3.850023 -2.152179 -0.120234 3.192662 -17.539061 0.343331 -2.351379 41.884338 -9.095717 -23.405539 -47.776121 -4.372993 2.320702 27.786730 7.835856 -0.523705 -13.002061 -6.451498 12.594881 0.143381 0.114031 3.012583 -2.243574 -0.004265 0.304971 48.571017 2.163932 8.138792 -99.518706 2.243912 -2.591591 43.057900 -2.692527 6.054155 58.832100 -3.908166 -1.651040 -0.084863 0.073065 2.093405 14.206510 -7.776619 4.636192 5.392969 3.904476 -3.243720 -34.595940 -15.109244 -16.901418 59.656408 2.617162 -3.080378 -49.542610 -11.542376 11.517033 40.773534 22.942675 -6.949447 0.844270 -6.094029 8.309774 -0.000002 0.000003 0.000002 7.127730 11.585805 3.268466 68.156515 -4.339129 2.430906 -71.749468 7.936328 4.687840 9.113939 -15.093069 -3.744527 0.273444 2.785148 -3.761104 0.000005 0.000006 0.000004 0.002962 -0.004242 -0.012546 +-32.745774 41.602798 -32.201143 -102.116378 0.225381 -5.577324 0.000001 0.000000 -0.000000 -6.689286 4.069092 -7.549197 -0.071743 -3.820795 -3.031326 13.751221 0.645086 -0.383532 13.440329 -0.003211 7.377407 2.712754 0.923937 -5.065147 2.439525 1.383800 -4.166685 -14.188705 2.020464 4.750796 -7.379323 2.051763 0.672015 -1.791631 0.121010 -3.773890 -1.796013 -0.100365 3.193351 -17.445174 0.346432 -2.339987 39.084941 -6.437513 -29.080787 -47.004319 -3.988279 2.303461 27.276408 7.661753 -0.308598 -11.725096 -9.244137 11.829264 0.135952 0.115424 3.062090 -3.983177 -0.028014 0.540576 35.825212 1.066374 10.785202 -92.126992 1.922677 -2.563887 40.817192 -3.998921 2.626834 58.235341 -4.445194 -8.557749 0.038297 -0.039821 -1.035939 14.910029 -7.985010 4.326898 4.224519 4.046402 -2.946504 -34.147130 -15.065831 -17.910242 62.130545 2.828755 -3.137653 -51.580701 -11.527108 11.219288 39.550133 23.194845 -6.539418 0.823781 -5.997902 8.175846 -0.000011 0.000003 0.000004 8.517901 11.451525 2.773777 70.728821 -4.451989 2.584441 -74.265043 8.641675 4.926397 17.230026 -18.198950 -1.423518 0.287216 2.888774 -3.901965 0.000005 0.000007 0.000004 0.002964 -0.004242 -0.012546 +-32.364537 42.146000 -30.662330 -102.399640 0.976007 -5.420044 0.000000 0.000000 -0.000000 -6.925501 2.685106 -4.862593 -0.157467 -3.176626 -7.437564 15.497457 1.395224 -0.875916 14.980539 -0.007978 14.416974 4.232410 -0.586573 -8.057471 0.614885 2.589861 -4.897639 -18.739296 1.425123 4.570456 -6.387990 0.317520 0.108028 -1.439156 0.097997 -3.697623 -1.443335 -0.080687 3.193904 -17.122809 0.340323 -2.298630 34.356454 -3.868399 -34.649402 -44.684599 -3.063348 2.249332 25.923314 7.290561 0.187884 -10.217592 -12.101880 10.894613 0.154842 0.121425 3.197414 -7.164568 -0.091896 0.965900 19.665638 0.787360 13.269137 -76.440942 1.386641 -2.401025 36.238319 -5.272508 -3.214101 48.743622 -1.903875 -14.125142 0.226490 -0.236667 -6.109235 16.102385 -8.360727 3.813997 2.228739 4.566761 -2.080668 -31.601635 -15.300867 -18.067467 63.036681 3.082293 -2.993714 -52.516556 -11.196497 10.909808 36.909353 22.903352 -5.451119 0.826384 -6.010177 8.192943 -0.000004 0.000002 0.000004 10.008078 11.342931 3.009618 70.683977 -4.441078 2.588516 -74.690701 9.838746 4.935522 30.444714 -22.118381 3.582970 0.285265 2.874269 -3.882240 0.000005 0.000007 0.000005 0.002960 -0.004242 -0.012546 +-31.605736 43.214199 -28.751510 -103.109113 1.722194 -6.186295 0.000002 0.000000 -0.000000 -5.940075 1.435711 -3.697240 -0.175880 -2.040421 -9.675055 16.695515 1.918137 1.143989 16.592515 0.000282 19.366271 6.048200 -2.022737 -10.729886 -1.377691 3.077590 -5.129017 -21.659423 0.919779 4.031012 -5.815026 0.654298 0.155159 -1.498488 0.101839 -3.711508 -1.509682 -0.084388 3.193808 -16.591898 0.340160 -2.231739 30.311157 -2.418521 -39.554291 -43.934328 -2.060965 2.203181 25.158664 6.964139 0.701868 -8.051112 -10.231608 10.084078 0.166245 0.130875 3.438270 -10.281421 -0.348537 1.360671 4.038868 1.384185 15.291280 -57.451241 1.488139 -2.377972 30.128913 -7.074891 -8.985296 36.840780 2.394369 -15.215660 0.409025 -0.475898 -11.813132 17.417169 -8.820645 3.178828 0.043816 5.757024 -0.277326 -27.155237 -15.318784 -16.770877 62.960506 3.339377 -2.752658 -52.693478 -10.712996 10.634548 33.143665 21.812733 -3.837243 0.843831 -6.091986 8.306926 -0.000001 0.000000 0.000005 11.781686 11.096344 3.828238 70.238305 -4.444861 2.544690 -76.765159 10.657432 5.110060 44.348941 -21.354690 7.447383 0.277819 2.818313 -3.806178 0.000005 0.000005 0.000004 0.002961 -0.004242 -0.012546 +-30.338647 44.639450 -26.457719 -104.229262 2.688081 -8.203093 0.000001 0.000000 -0.000000 -3.422657 0.059647 -2.092085 -0.321879 -0.595164 -11.190320 16.465116 2.381243 3.739504 18.003928 -0.004062 23.134712 8.284728 -3.072013 -12.523800 -3.492044 2.394793 -4.655128 -22.947532 0.612819 3.498498 -5.536637 2.828421 0.662520 -1.938194 0.130723 -3.805043 -1.939175 -0.108352 3.193089 -15.768983 0.288059 -2.120657 28.788463 -4.177763 -43.017375 -48.001254 -1.453715 2.270820 26.440675 7.049564 1.040822 -4.266599 2.641624 8.190167 0.184798 0.149298 3.909746 -12.550417 -0.665638 1.652827 -5.128679 3.247476 16.133085 -42.597577 2.420826 -2.400967 25.014659 -9.463962 -13.002953 27.495509 6.431624 -11.944410 0.546353 -0.679772 -16.329522 18.966401 -9.389613 2.374537 -2.617188 7.635049 2.495358 -20.965910 -15.011727 -13.648056 62.137093 3.573534 -2.464312 -52.145150 -10.071525 10.450738 28.364566 19.669392 -1.921879 0.870318 -6.214630 8.477977 0.000000 0.000001 0.000004 12.833712 8.785415 4.586345 74.822564 -4.733951 2.786162 -85.307447 5.728100 5.946771 60.399688 -9.396801 0.742172 0.293621 2.936433 -3.966776 0.000004 0.000005 0.000004 0.002968 -0.004242 -0.012546 +-28.730345 45.710701 -23.967702 -105.344909 3.556176 -10.195027 -0.000000 0.000000 0.000001 -0.734069 -1.026887 -0.155331 -0.869995 0.604375 -12.657847 15.403885 2.728814 5.528164 19.293795 -0.002732 25.822074 10.887116 -3.638555 -13.205804 -5.503142 1.378358 -4.055822 -23.501385 0.421440 3.141476 -5.437734 4.226458 0.999510 -2.203397 0.148494 -3.863850 -2.215033 -0.123740 3.192527 -14.466971 0.241804 -1.948213 26.659095 -3.920946 -45.244171 -46.985050 -0.645361 2.189935 25.345873 7.489734 1.535289 -1.588589 9.376170 5.665862 0.207038 0.170454 4.443988 -13.579097 -0.728969 1.774364 -5.881403 4.667581 15.159520 -36.180631 2.852132 -2.259509 22.222579 -10.573307 -15.271473 23.660364 13.338552 -9.744179 0.603851 -0.783524 -18.569188 20.394859 -9.712640 1.939071 -5.186616 8.654121 4.119974 -14.997352 -13.842357 -10.253185 62.210271 3.812486 -2.258150 -52.094082 -9.393948 10.290848 23.418966 16.955355 -0.227343 0.885485 -6.284095 8.574953 -0.000001 0.000000 0.000004 13.280003 5.984465 5.314854 76.442275 -4.799667 2.881908 -88.575751 1.349552 6.221372 69.890730 -1.793988 -7.831007 0.295595 2.950934 -3.986500 0.000005 0.000006 0.000005 0.002957 -0.004242 -0.012546 +-26.564396 46.018951 -21.212119 -106.552930 3.602316 -12.297104 -0.000001 0.000000 0.000000 1.932913 -0.946686 0.782451 -2.492154 0.548202 -12.484478 13.452780 2.152752 7.483375 20.370151 0.003843 24.430542 15.490079 -3.276049 -11.674039 -7.635646 0.521364 -3.577105 -23.849647 0.304288 3.160068 -5.960426 4.231450 1.033973 -2.203396 0.148494 -3.863851 -2.215030 -0.123740 3.192528 -12.174777 0.039134 -1.665941 31.758077 -8.078642 -44.530027 -60.809734 -0.791446 2.577317 30.252080 10.209839 1.959777 12.017815 9.784680 10.367633 0.317438 0.265321 6.740443 -13.424234 -0.630469 1.742802 -0.460439 5.124964 14.072183 -35.011111 2.958900 -2.061449 21.647055 -9.784869 -15.312550 12.572948 15.918219 -6.326096 0.591594 -0.763266 -18.147711 21.662953 -9.540350 2.150646 -7.511450 8.242355 3.759538 -9.582744 -10.820633 -6.242813 64.098789 4.103286 -2.221387 -53.040479 -8.571468 10.140940 18.037639 13.307915 1.115858 0.880125 -6.259581 8.540720 -0.000003 0.000002 0.000004 13.137423 5.502246 2.654573 74.849580 -4.751639 2.766497 -87.700134 0.556544 6.162213 66.561510 0.844186 -8.652637 0.284433 2.868053 -3.873788 0.000005 0.000007 0.000003 0.002962 -0.004241 -0.012546 +-23.980540 46.034199 -18.288995 -107.849914 3.042890 -14.798695 -0.000000 -0.000001 0.000000 4.784941 -0.010620 0.668175 -4.873033 -0.407396 -10.347683 11.213250 0.816152 9.924999 21.063509 -0.001954 19.560188 21.579038 -2.203785 -8.532099 -10.026324 -0.088946 -3.226938 -24.106914 0.194359 3.484174 -6.482651 4.211023 1.070426 -2.203395 0.148495 -3.863851 -2.215032 -0.123740 3.192529 -8.958704 -0.354764 -1.233326 36.245532 -14.692002 -39.754905 -74.905442 -1.788937 2.872520 34.784151 15.462676 2.414298 30.943916 15.235579 15.549551 0.492145 0.443933 10.845447 -13.346307 -0.477081 1.727588 7.031307 5.240616 14.710783 -35.306096 3.223878 -1.870426 21.837442 -8.087332 -15.173377 5.638617 13.817801 -3.701974 0.574687 -0.728049 -17.369626 22.916130 -9.220492 2.588888 -9.854461 7.418694 2.803840 -4.509168 -6.249132 -1.611666 65.744655 4.340294 -2.211253 -53.354964 -7.386756 10.151515 12.214980 8.671857 1.926963 0.874772 -6.235065 8.506497 -0.000003 0.000002 0.000004 12.962290 6.766572 -3.539071 71.819117 -4.653177 2.549450 -87.009773 0.261105 6.064394 58.287215 3.677282 -7.506182 0.266386 2.731250 -3.687873 0.000005 0.000007 0.000004 0.002959 -0.004241 -0.012546 +-21.234726 46.037250 -15.330080 -108.813069 2.289527 -16.712093 -0.000000 0.000000 -0.000000 7.111500 1.058043 0.500421 -7.405787 -1.208355 -7.601276 9.446686 -0.317283 11.024474 21.373801 0.005283 13.735625 26.837899 -0.802761 -4.538883 -12.417235 -0.253014 -3.093042 -23.687761 0.093746 3.879719 -5.399081 4.222395 0.998297 -2.203396 0.148495 -3.863851 -2.215032 -0.123740 3.192528 -5.534375 -0.795278 -0.734369 32.418940 -22.586325 -30.784083 -71.953312 -1.795982 2.819437 32.118435 20.110896 3.416647 43.885783 23.810545 10.951869 0.615244 0.587823 13.969238 -13.323798 -0.358373 1.737856 13.469255 5.486778 16.765849 -34.436818 3.552047 -1.649089 21.326471 -6.511459 -15.102300 1.576117 10.601492 -2.260259 0.561193 -0.697208 -16.668214 23.875482 -8.902769 3.019350 -11.866104 6.223558 1.322842 -0.492744 -1.051717 2.330697 65.565646 4.408643 -2.125181 -51.785783 -5.787417 10.428818 6.424216 3.537012 1.957105 0.885500 -6.284095 8.574951 -0.000003 0.000002 0.000004 13.940786 9.317265 -9.863673 65.806020 -4.442462 2.120682 -83.150553 -1.222101 5.727826 45.615458 5.469043 -6.265935 0.234456 2.480297 -3.347190 0.000005 0.000005 0.000005 0.002961 -0.004243 -0.012546 +-18.637595 46.290600 -12.473011 -109.245725 1.763607 -17.242103 -0.000002 0.000000 -0.000000 8.566656 1.624447 1.390803 -9.542209 -1.054247 -6.080838 8.562346 -0.603135 9.786521 21.879744 0.001049 9.603093 29.283269 0.518489 -0.823650 -14.605699 -0.308473 -3.037339 -22.247837 0.044146 4.021270 -4.315791 4.251397 0.920303 -2.203397 0.148494 -3.863851 -2.215032 -0.123740 3.192528 -2.516812 -1.158570 -0.258738 26.102791 -29.699846 -21.603992 -62.001445 -1.687449 2.600797 27.134910 22.491729 4.553044 53.429410 26.615783 0.851827 0.643924 0.629966 14.894570 -13.290257 -0.286176 1.766878 17.508695 6.537769 19.185080 -33.005685 3.980818 -1.439481 20.316422 -6.022596 -15.106628 -1.826330 7.546507 -1.568095 0.554348 -0.683653 -16.365229 24.366043 -8.736974 3.236045 -13.335421 4.903957 -0.456283 2.549190 3.527217 4.502454 63.363849 4.337156 -1.962127 -48.506758 -4.006495 10.865988 1.225573 -1.285008 1.361965 0.913475 -6.410697 8.751862 -0.000003 0.000002 0.000005 16.558533 12.538450 -12.917148 57.943487 -4.096985 1.601288 -76.774208 -1.575211 5.191300 32.505168 2.902983 -4.836258 0.195748 2.158558 -2.911069 0.000004 0.000009 0.000001 0.002959 -0.004242 -0.012545 +-16.806982 47.288551 -9.824066 -107.159333 0.897432 -14.801956 -0.000001 0.000000 -0.000001 6.843728 1.543551 4.177349 -10.764320 1.079296 -7.189285 9.527700 0.794434 4.187082 23.332696 -0.000051 7.916267 28.466048 1.907954 3.196955 -16.760808 -0.873403 -2.897459 -21.011333 -0.006736 3.767978 -5.623797 4.235669 0.984402 -2.203398 0.148495 -3.863850 -2.215031 -0.123740 3.192529 0.272694 -1.557477 0.245480 14.458933 -29.956972 -4.049844 -40.732681 -2.928636 1.880954 18.381000 19.703770 5.620578 42.877449 15.760602 -5.263378 0.539187 0.496511 12.000703 -13.082414 -0.250732 1.746241 16.946084 7.202642 23.235650 -33.015576 4.411166 -1.361126 19.734916 -6.825971 -15.097145 -3.545841 7.763895 -2.515064 0.558846 -0.689388 -16.481312 24.415900 -8.803590 3.164149 -13.971406 2.780909 -3.379531 -0.805408 3.839740 3.793781 69.130287 4.623854 -2.318313 -52.980033 -3.281450 10.500305 13.108045 7.617041 0.939668 0.861004 -6.171713 8.418096 -0.000002 0.000001 0.000004 18.123460 14.487128 -14.723536 47.110897 -3.470047 1.009334 -62.961725 1.112854 4.095016 18.734895 -8.312636 -4.203818 0.150551 1.753387 -2.362831 0.000006 0.000006 0.000003 0.002968 -0.004241 -0.012545 +-15.480482 48.610001 -7.339749 -103.159322 0.049952 -10.458663 0.000002 0.000000 0.000001 3.055344 1.139213 7.226035 -11.248810 3.409596 -9.109090 11.653609 3.080147 -3.610576 25.195740 0.009517 6.827917 26.961460 3.373625 7.503929 -18.953769 -1.515762 -2.806549 -20.586076 -0.096703 3.384324 -8.032865 4.204583 1.116928 -2.203395 0.148495 -3.863851 -2.215032 -0.123740 3.192531 3.544108 -3.173344 1.059585 -11.043392 -32.002775 8.663872 -7.077900 -5.218640 0.103730 4.311360 13.330694 7.988710 27.554402 10.254521 -7.685537 0.441889 0.379662 9.350719 -12.741630 -0.239145 1.711503 14.036333 7.194312 28.248943 -33.926148 4.797267 -1.336198 19.532835 -7.923422 -15.061073 -3.809290 10.449539 -4.637749 0.549300 -0.695484 -16.717496 24.412380 -8.934687 2.973341 -14.270503 0.207826 -6.938582 -7.584107 1.315729 0.830904 72.524629 4.740130 -2.566224 -53.744146 -5.147679 10.597733 26.397292 15.775156 -1.649210 0.821182 -5.985628 8.158756 -0.000004 0.000002 0.000004 16.969423 14.049927 -18.519631 38.675631 -2.892829 0.652123 -48.306574 3.452154 2.846369 9.237578 -13.584850 -4.534555 0.121113 1.468480 -1.977914 0.000004 0.000006 0.000007 0.002966 -0.004242 -0.012546 +-13.923708 49.354752 -5.171365 -100.171692 0.411490 -5.843618 -0.000000 0.000000 0.000000 0.100790 0.228328 8.056792 -11.213466 4.045075 -9.631749 13.509398 4.620529 -9.516047 26.434487 -0.000101 5.738404 25.855820 4.229372 10.041822 -20.774654 -1.574590 -2.904949 -19.839770 -0.118153 2.615572 -9.764562 4.157663 1.285191 -2.203396 0.148494 -3.863851 -2.215032 -0.123740 3.192528 3.973442 -7.035946 1.552092 -21.724135 -27.442449 10.421271 8.577902 -6.013131 -0.585987 -3.606428 6.349044 11.149144 17.611618 17.597766 -5.798206 0.494578 0.443855 10.827729 -12.358958 -0.233493 1.672027 12.518215 9.214428 30.761919 -35.520242 5.122933 -1.371229 19.788870 -9.129298 -14.981340 -4.132600 11.478343 -6.931169 0.572614 -0.713629 -17.007067 24.400933 -9.130992 2.690024 -14.369467 -1.392871 -9.160512 -14.051211 -4.492399 -4.092051 73.329610 4.733603 -2.649293 -51.353325 -7.737666 11.169947 36.578811 19.328293 -7.726090 0.799671 -5.883308 8.016354 -0.000002 0.000002 0.000004 16.908429 12.830167 -22.312984 31.911121 -2.379343 0.442461 -35.924456 5.105702 1.764154 2.076769 -16.764914 -5.217527 0.099456 1.245826 -1.677417 0.000005 0.000008 0.000002 0.002966 -0.004242 -0.012546 +-11.699042 49.122799 -3.391738 -99.787658 2.064412 -1.864727 -0.000001 0.000000 -0.000000 -0.823157 -1.560043 5.817634 -11.020227 3.871925 -8.171947 14.072596 4.098864 -10.633683 26.531802 0.001141 4.206098 26.605750 3.696245 8.976652 -22.092163 -1.511946 -2.974354 -19.017693 -0.129049 2.284887 -9.473302 3.682060 1.264295 -2.119650 0.142853 -3.843079 -2.124245 -0.118676 3.192721 3.732247 -3.661004 1.175728 -15.965862 -27.773691 7.928958 -1.351351 -5.931633 -0.140752 1.694042 7.772615 13.420182 11.209064 19.827133 -2.824018 0.607339 0.575251 13.693254 -12.065693 -0.244542 1.646260 15.538808 13.718181 27.812473 -38.956797 5.386239 -1.516699 21.062618 -10.274998 -14.823527 -3.738389 9.737699 -8.719707 0.576887 -0.726825 -17.319138 24.393210 -9.439733 2.272754 -14.292789 -1.533470 -9.362210 -20.289410 -10.565381 -12.865177 72.626535 4.678121 -2.623208 -51.803491 -8.691145 11.038222 43.094970 18.773938 -11.880165 0.804808 -5.907870 8.050525 -0.000004 -0.000001 0.000004 19.416915 11.722402 -25.028504 27.604201 -2.006129 0.369105 -28.488179 6.204853 1.068671 -2.589756 -20.405035 -6.465285 0.087262 1.114679 -1.500540 0.000005 0.000008 0.000005 0.002964 -0.004242 -0.012545 +-9.082553 48.371948 -2.202424 -100.480691 4.687123 1.929109 0.000000 0.000000 -0.000001 -1.601530 -4.238415 1.900615 -10.560626 3.771759 -5.330411 14.272120 2.371120 -9.018696 25.858640 -0.002445 2.249736 29.960277 1.344135 3.698739 -22.970893 -2.398633 -2.669623 -19.896210 -0.366315 4.355044 -7.502898 2.287445 0.817785 -1.843708 0.122644 -3.783846 -1.844498 -0.103136 3.194265 -1.810586 -1.304628 -0.031229 0.555807 -27.005619 3.606486 -13.698978 -5.762623 0.724236 6.032551 12.010573 16.241045 1.774746 17.886868 1.709572 0.754856 0.763347 17.580095 -11.882242 -0.240112 1.641238 21.643319 16.645828 18.717170 -43.967519 5.422820 -1.712167 23.171950 -11.237037 -14.684693 1.872806 8.247529 -9.978444 0.588287 -0.745238 -17.735357 24.414370 -9.873193 1.653416 -13.936199 -0.877475 -8.400838 -25.804781 -14.959691 -27.140150 60.228645 3.393710 -2.380046 -46.583231 -13.135487 11.471999 45.220647 20.230746 -13.471378 0.901997 -6.359004 8.679599 -0.000005 0.000001 0.000004 22.246513 10.146880 -27.042711 24.750121 -1.674631 0.381708 -23.357597 7.086270 0.541721 -5.723848 -24.143034 -7.737210 0.081667 1.053027 -1.417347 0.000005 0.000005 0.000005 0.002966 -0.004242 -0.012547 +-6.553809 47.792099 -1.396963 -101.447905 6.104067 4.034224 -0.000001 0.000000 0.000001 -2.439302 -5.677180 -0.755093 -9.742660 3.280825 -2.735295 14.813152 0.992024 -7.600513 25.106362 0.007125 0.116791 32.925895 -0.607400 -0.526586 -23.655250 -3.127559 -2.412456 -21.166693 -0.745686 6.526179 -6.253777 1.406121 0.519002 -1.665729 0.110931 -3.749235 -1.669905 -0.093391 3.194564 -5.649360 -0.223177 -0.696466 11.146280 -25.084412 0.244147 -20.907914 -5.525832 1.230722 7.824630 14.238211 18.438373 -4.185334 14.157663 3.881530 0.842498 0.902010 20.396991 -11.703081 -0.214187 1.614710 24.934324 17.370675 10.968131 -46.421061 5.333906 -1.817546 24.334244 -11.646167 -14.646771 6.159843 6.768219 -10.339996 0.600962 -0.759086 -17.989801 24.420797 -10.118019 1.309442 -13.567676 0.300209 -6.771018 -26.078891 -15.630080 -34.496478 50.695772 2.331458 -2.358552 -39.898108 -14.728734 12.488031 38.574374 19.953581 -10.056026 0.971894 -6.669105 9.113672 -0.000002 0.000001 0.000001 24.479191 10.392272 -27.926182 22.449272 -1.392301 0.430840 -19.218790 7.770780 0.086160 -7.791488 -27.623776 -8.750785 0.077199 1.003053 -1.349986 0.000006 0.000005 0.000003 0.002964 -0.004243 -0.012547 +-4.241420 47.724998 -0.949330 -102.733944 5.631910 3.575188 -0.000000 0.000000 -0.000000 -3.397250 -5.236551 -1.456776 -7.931693 2.259037 -0.851528 16.646992 0.215048 -6.638488 24.630638 0.003058 -2.072097 34.530162 -1.179184 -1.673133 -24.190230 -2.929075 -2.415774 -23.168568 -1.173601 7.502697 -6.326580 2.329548 0.699666 -1.843709 0.122644 -3.783846 -1.847990 -0.103331 3.194258 -5.880630 -0.057097 -0.771833 14.400375 -22.217010 0.029485 -28.262072 -5.304137 1.591796 10.745252 13.925731 18.831512 -4.795361 10.887463 3.761787 0.878855 0.946044 21.170700 -11.445624 -0.176642 1.569264 20.606708 16.755049 7.218650 -42.871931 5.008564 -1.751156 24.057524 -7.975479 -14.545880 3.151009 1.027284 -5.590814 0.545589 -0.682050 -16.426382 24.396036 -9.359391 2.374796 -13.298223 2.822545 -3.342055 -21.910249 -13.925536 -32.326913 48.220447 2.288954 -2.137112 -37.774969 -14.042670 12.616174 27.761930 25.306787 -5.448007 0.996361 -6.775076 9.262322 -0.000007 0.000001 0.000003 26.419148 13.380692 -27.529772 19.801754 -1.056495 0.498851 -15.574074 8.060317 -0.288588 -8.457163 -30.638879 -9.156147 0.072609 0.950989 -1.279814 0.000005 0.000005 0.000004 0.002959 -0.004241 -0.012544 +-2.218170 47.877602 -0.667695 -104.133287 4.968608 2.525874 -0.000000 0.000000 -0.000001 -4.264006 -4.521938 -2.131396 -6.142270 1.505226 0.537219 19.032822 -0.513746 -5.038521 24.322193 -0.000610 -3.852404 35.676464 -1.415846 -2.065266 -24.543729 -2.590271 -2.478672 -25.534589 -1.611324 7.939206 -6.453039 3.776801 0.990449 -2.126364 0.141493 -3.846146 -2.130831 -0.119114 3.193709 -5.908919 0.004006 -0.791614 14.457669 -19.920149 -0.371147 -31.971368 -5.165511 1.751708 12.172938 13.696076 18.965558 -4.973534 8.440424 3.601223 0.891487 0.961628 21.442551 -11.189971 -0.141120 1.509895 13.549955 15.913487 4.380580 -36.614938 4.572766 -1.565002 22.964218 -2.278786 -14.569075 0.974176 -7.567066 -0.714344 0.491180 -0.586088 -14.281612 24.328213 -8.165075 4.050118 -13.242596 5.569142 0.454114 -19.181923 -11.529283 -29.820684 49.443656 2.451504 -2.118471 -38.748256 -13.930698 12.442526 24.391727 25.224138 -3.631810 0.989745 -6.746550 9.222290 -0.000009 0.000000 0.000003 28.439899 16.375728 -27.007456 16.386302 -0.669346 0.555134 -12.010334 7.994000 -0.602200 -8.403315 -33.037631 -9.167766 0.065213 0.865589 -1.164751 0.000004 0.000006 0.000003 0.002959 -0.004241 -0.012545 +-1.039117 48.155300 -0.470617 -105.069560 4.751007 1.863437 0.000001 0.000000 0.000000 -4.075196 -4.130113 -3.126193 -5.774605 1.721647 0.878878 19.878184 -0.890144 -3.280421 24.357404 0.001193 -4.257129 36.263209 -1.426066 -2.058216 -24.637904 -2.499851 -2.511023 -26.495267 -1.764701 7.979674 -6.468104 4.032850 1.040969 -2.168231 0.144310 -3.853035 -2.179716 -0.121842 3.193607 -5.880623 0.020082 -0.790856 12.962377 -19.004042 -0.968904 -30.537205 -5.119186 1.692234 11.455826 13.705372 19.079804 -5.131930 7.485461 3.554073 0.891810 0.962034 21.449508 -11.112837 -0.127376 1.508666 7.923329 15.685539 4.333719 -28.290788 4.374059 -1.258538 19.616865 -0.772922 -14.913532 -0.170693 -14.226884 0.628268 0.488026 -0.583061 -14.222345 24.300922 -7.805805 4.553996 -13.269872 6.273923 1.434302 -17.614796 -10.017247 -28.278871 50.477367 2.549291 -2.137282 -39.619985 -14.077291 12.320079 23.989896 23.599360 -3.273704 0.982680 -6.715985 9.179411 -0.000002 0.000001 0.000005 30.190627 17.707299 -26.860810 12.863228 -0.360041 0.556384 -9.218587 7.657743 -0.731562 -8.084040 -34.186142 -9.022264 0.055214 0.746837 -1.004806 0.000004 0.000008 0.000003 0.002961 -0.004242 -0.012546 +-0.346338 48.542900 -0.319486 -105.599012 4.728557 1.459520 0.000000 0.000000 -0.000000 -3.361462 -3.994732 -3.940749 -6.036154 2.352975 0.829810 19.667286 -0.977724 -1.954404 24.609616 -0.002366 -4.009040 36.621857 -1.350771 -1.891534 -24.665914 -2.659369 -2.498067 -26.748232 -1.774761 7.921808 -6.401214 3.178012 0.872218 -2.007718 0.133532 -3.832439 -2.012107 -0.112489 3.193949 -5.880895 0.008787 -0.790464 11.265437 -18.892502 -1.471606 -27.358252 -5.072635 1.551103 9.963725 13.771037 19.262131 -5.263664 7.225737 3.558078 0.890840 0.960830 21.428609 -10.990884 -0.115942 1.473358 1.720027 15.061455 5.889461 -16.681714 4.254602 -0.824176 14.236209 -1.103689 -15.493290 -3.610327 -19.430486 -0.321512 0.510288 -0.619267 -15.029145 24.300919 -7.805803 4.553994 -13.271946 5.974020 1.032264 -16.412578 -9.247380 -27.303214 50.106241 2.559790 -2.104133 -39.416380 -14.162529 12.302560 23.695014 22.589479 -3.063680 0.986913 -6.734326 9.205142 -0.000004 0.000001 0.000006 31.619787 18.036079 -26.938903 9.102437 -0.038142 0.549177 -6.456393 7.276234 -0.807513 -7.823808 -34.678487 -8.808585 0.044554 0.615560 -0.828056 0.000004 0.000002 0.000005 0.002957 -0.004242 -0.012546 +-0.027134 49.043400 -0.233084 -105.785564 4.752283 1.104201 -0.000003 0.000000 0.000001 -2.592158 -3.990674 -4.215104 -6.405789 3.059394 0.611810 19.114399 -0.846763 -1.283328 24.862166 0.000260 -3.508314 36.824681 -1.208804 -1.587344 -24.680162 -2.987628 -2.467792 -26.780920 -1.768185 7.797239 -6.375867 2.883328 0.811977 -1.951886 0.129797 -3.811586 -1.956239 -0.109371 3.194058 -5.870770 -0.002655 -0.788648 9.422065 -19.284760 -1.813735 -23.716593 -4.996259 1.381354 8.258084 13.808585 19.481428 -5.298163 7.325594 3.560092 0.889064 0.958631 21.390264 -11.026717 -0.136404 1.491382 -1.047252 13.967779 6.665020 -11.148324 4.257631 -0.606714 11.603869 -1.244071 -15.781983 -3.768778 -19.071509 -0.386632 0.518767 -0.635057 -15.385477 24.300924 -7.805804 4.553993 -13.302238 5.422615 0.279369 -15.450640 -9.007452 -26.594414 48.600648 2.465092 -2.009647 -38.368772 -14.113258 12.349604 23.493497 21.994407 -2.934890 1.002044 -6.799519 9.296639 -0.000002 0.000003 0.000005 32.699822 17.768160 -27.075832 5.102077 0.315146 0.587048 -3.471342 6.867676 -0.893475 -7.715320 -34.720100 -8.561432 0.033338 0.471734 -0.634502 0.000004 0.000004 0.000004 0.002960 -0.004241 -0.012546 +0.051215 49.531700 -0.190934 -105.803802 4.793903 0.811939 0.000002 0.000000 0.000000 -2.017776 -4.058228 -4.109544 -6.645888 3.697034 0.336314 18.611929 -0.608539 -1.099616 24.939205 -0.000164 -2.949792 36.943073 -1.051385 -1.252593 -24.696328 -3.365193 -2.427251 -26.719476 -1.726648 7.663054 -6.403238 3.308508 0.896403 -2.028655 0.134914 -3.825396 -2.040044 -0.114048 3.193895 -5.756708 -0.015506 -0.772572 7.204302 -19.846626 -2.219737 -19.713472 -4.889328 1.184857 6.457177 13.806620 19.723518 -5.275432 7.578386 3.582770 0.885666 0.954429 21.317073 -11.076397 -0.157237 1.511258 -3.891262 12.655129 7.381969 -5.412112 4.298826 -0.376995 8.853976 -1.371498 -16.091086 -3.911179 -18.601432 -0.424466 0.533883 -0.652726 -15.741276 24.300930 -7.805804 4.553995 -13.340291 4.838248 -0.552931 -14.685113 -9.088995 -26.112392 46.695793 2.366850 -1.892340 -37.016771 -14.022613 12.418173 23.350134 21.708827 -2.864161 1.019191 -6.872830 9.399607 -0.000002 0.000000 0.000004 33.482183 17.230032 -27.196807 1.477673 0.630145 0.653166 -0.761234 6.511048 -0.987254 -7.737559 -34.511016 -8.339774 0.024452 0.352901 -0.474636 0.000005 0.000008 -0.000002 0.002959 -0.004242 -0.012546 +-0.028982 49.894901 -0.187269 -105.772747 4.836260 0.634469 -0.000000 0.000000 -0.000000 -1.721078 -4.128603 -3.791844 -6.675597 4.162400 0.077770 18.358119 -0.358954 -1.238337 24.813090 -0.001832 -2.506088 36.979648 -0.919874 -0.994917 -24.710987 -3.713122 -2.387060 -26.597112 -1.691322 7.574436 -6.458543 3.893290 1.011214 -2.143810 0.142643 -3.856594 -2.144802 -0.119894 3.193681 -5.726424 -0.048037 -0.765326 5.787492 -20.409555 -2.450603 -16.864590 -4.827798 1.039208 5.110574 13.811257 19.900790 -5.237364 7.844719 3.585810 0.883722 0.952032 21.275257 -11.157139 -0.167598 1.512479 -6.079876 11.460252 7.843481 -0.803081 4.382456 -0.189748 6.617027 -1.486387 -16.347091 -4.005292 -18.190098 -0.456503 0.536244 -0.662530 -15.982590 24.300922 -7.805803 4.553994 -13.384378 4.348519 -1.189101 -14.153939 -9.330823 -25.863685 45.046980 2.272828 -1.815316 -35.839220 -13.911276 12.489855 23.256357 21.672255 -2.829585 1.034542 -6.937973 9.491165 0.000000 0.000002 0.000005 33.923739 16.694620 -27.255614 -0.818873 0.833777 0.690489 0.914121 6.303640 -1.020467 -7.751179 -34.234555 -8.183055 0.018705 0.273661 -0.368067 0.000004 0.000006 0.000003 0.002959 -0.004242 -0.012545 +-0.121962 50.062801 -0.178842 -105.741316 4.850575 0.561878 -0.000000 0.000000 0.000001 -1.676000 -4.181944 -3.527019 -6.598490 4.407431 -0.056860 18.326777 -0.200781 -1.426147 24.645286 0.003416 -2.280939 36.986619 -0.861261 -0.874583 -24.720109 -3.932699 -2.357940 -26.499590 -1.681532 7.560095 -6.496028 4.217249 1.077105 -2.203125 0.146648 -3.859940 -2.214639 -0.123790 3.193533 -5.717956 -0.050789 -0.750612 5.100971 -20.758489 -2.551819 -15.424023 -4.792425 0.968095 4.439429 13.808652 19.988660 -5.214475 8.001491 3.590815 0.881777 0.949635 21.233443 -11.201694 -0.146655 1.526269 -6.581282 10.851445 7.965288 0.454809 4.438502 -0.134119 5.988797 -1.532612 -16.420165 -4.057403 -17.960326 -0.475009 0.529593 -0.663136 -16.049601 24.300915 -7.805805 4.553994 -13.397805 4.139012 -1.487378 -13.908021 -9.509283 -25.782966 44.209137 2.223586 -1.775346 -35.240549 -13.852703 12.524748 23.219239 21.719983 -2.815948 1.041289 -6.966465 9.531232 -0.000003 0.000001 0.000006 34.086370 16.407497 -27.268040 -1.742629 0.911774 0.708872 1.582467 6.225603 -1.033214 -7.786463 -34.055460 -8.129418 0.016332 0.240295 -0.323199 0.000004 0.000008 0.000001 0.002961 -0.004242 -0.012546 +-0.167451 50.065849 -0.183724 -105.741316 4.850574 0.561864 0.000001 0.000001 -0.000000 -1.775313 -4.186158 -3.388754 -6.514255 4.452510 -0.075037 18.415622 -0.147375 -1.555157 24.550644 -0.000097 -2.248560 36.985669 -0.858844 -0.875202 -24.723951 -4.026416 -2.342291 -26.457974 -1.676013 7.608233 -6.482001 4.217513 1.076074 -2.203125 0.146648 -3.856443 -2.214640 -0.123790 3.193531 -5.718831 -0.050794 -0.744628 5.051259 -20.868687 -2.537755 -15.241937 -4.797050 0.956571 4.348423 13.810969 19.997459 -5.218713 8.035803 3.599565 0.882263 0.950234 21.243895 -11.201090 -0.160525 1.527980 -6.648622 10.700094 7.989781 0.644846 4.446713 -0.118860 5.896805 -1.541790 -16.432193 -4.068798 -17.919054 -0.480853 0.543908 -0.667922 -16.065987 24.300915 -7.805805 4.553995 -13.392337 4.138468 -1.489439 -13.896511 -9.580024 -25.812533 44.119156 2.217833 -1.768530 -35.172794 -13.841948 12.524944 23.210541 21.781673 -2.833792 1.042742 -6.972574 9.539824 -0.000004 0.000002 0.000004 34.057464 16.362465 -27.247587 -1.658872 0.906240 0.706717 1.507333 6.240125 -1.023387 -7.794624 -34.009032 -8.133987 0.016331 0.240298 -0.323203 0.000004 0.000008 0.000006 0.002959 -0.004241 -0.012545 +-0.200909 50.068901 -0.187314 -105.741316 4.850573 0.561864 0.000001 0.000001 -0.000000 -1.825652 -4.194223 -3.295883 -6.451085 4.469627 -0.090896 18.469102 -0.111725 -1.641217 24.497856 -0.007415 -2.237063 36.984706 -0.856424 -0.875823 -24.725968 -4.075717 -2.331974 -26.436754 -1.676335 7.615106 -6.482004 4.217513 1.076074 -2.203128 0.146648 -3.866936 -2.214640 -0.123790 3.193532 -5.718056 -0.059497 -0.751540 5.032813 -20.934461 -2.525159 -15.157910 -4.803334 0.943123 4.314191 13.804827 20.001035 -5.220343 8.056361 3.607945 0.881776 0.949634 21.233440 -11.202008 -0.161410 1.521103 -6.676476 10.629389 7.998790 0.731115 4.433434 -0.122425 5.858650 -1.541675 -16.435694 -4.084027 -17.905526 -0.487875 0.543370 -0.667366 -16.055526 24.300910 -7.805804 4.553995 -13.386871 4.137928 -1.491498 -13.875153 -9.625262 -25.818578 44.049884 2.221437 -1.773524 -35.120054 -13.833803 12.534656 23.213171 21.816514 -2.834842 1.044200 -6.978678 9.548406 -0.000003 0.000000 0.000003 34.040219 16.335720 -27.243750 -1.575106 0.900704 0.704563 1.460263 6.254134 -1.018616 -7.810718 -33.982535 -8.142985 0.016333 0.240292 -0.323201 0.000003 0.000008 0.000000 0.002959 -0.004241 -0.012545 diff --git a/data/gradio_animo/bvh/dromedary_camel_male_runtostandturnl.bvh b/data/gradio_animo/bvh/dromedary_camel_male_runtostandturnl.bvh new file mode 100644 index 0000000000000000000000000000000000000000..483447a3d8bf4f263a329df78c8fb36b8ef63503 --- /dev/null +++ b/data/gradio_animo/bvh/dromedary_camel_male_runtostandturnl.bvh @@ -0,0 +1,295 @@ +HIERARCHY +ROOT joint_3652173982 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_1065643261 + { + OFFSET 0.000000 0.251600 -0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3369486670 + { + OFFSET 0.000000 -5.031500 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_602128083 + { + OFFSET 0.000000 -24.972099 -1.180000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1164186991 + { + OFFSET 0.000000 -24.868000 -2.565500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1661228954 + { + OFFSET 0.000000 -27.949499 -2.633300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1393197377 + { + OFFSET 0.000000 -31.537001 -8.536100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_283295117 + { + OFFSET 0.000000 -24.062300 -4.144600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_172969524 + { + OFFSET 0.000000 -24.337700 1.956700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_722122187 + { + OFFSET 0.000000 -16.444000 18.478701 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_482564213 + { + OFFSET 0.000000 -8.510100 27.868700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2290643481 + { + OFFSET 0.000000 -2.095100 -3.463800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -35.555618 -5.086917 + } + } + JOINT joint_1816776104 + { + OFFSET 9.829900 -16.800600 4.601600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.083200 -0.549100 0.000000 + } + } + JOINT joint_1637253561 + { + OFFSET -9.829900 -16.800200 4.601700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.083200 -0.549100 0.000000 + } + } + } + } + } + } + } + JOINT joint_3717329289 + { + OFFSET 12.345500 -19.388300 14.345600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2924335438 + { + OFFSET 3.528800 -10.724200 -30.398500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1256690376 + { + OFFSET -1.609000 22.300100 -28.436800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_452321840 + { + OFFSET -0.340000 -4.427100 -50.441299 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3029316820 + { + OFFSET 0.395800 2.286300 -45.104900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 2.136950 -7.658850 -9.307650 + } + } + } + JOINT joint_1830591162 + { + OFFSET -0.170000 -2.213500 -25.220600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.102000 -1.328100 -15.132400 + } + } + } + } + } + JOINT joint_1864294951 + { + OFFSET -12.345500 -19.388300 14.345200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2523110081 + { + OFFSET -3.528700 -10.724200 -30.398001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_111892690 + { + OFFSET 1.608900 22.300100 -28.437000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2213059258 + { + OFFSET 0.340000 -4.427100 -50.441200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_875639747 + { + OFFSET -0.395800 2.286200 -45.104801 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -2.136950 -7.658800 -9.307700 + } + } + } + JOINT joint_2864695845 + { + OFFSET 0.170000 -2.213500 -25.220600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.102000 -1.328100 -15.132400 + } + } + } + } + } + } + } + } + } + JOINT joint_3654464912 + { + OFFSET 0.000000 25.554300 1.350900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_4041021681 + { + OFFSET 0.000000 11.525400 -8.677300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 10.466900 -9.681700 + } + } + } + JOINT joint_3736563935 + { + OFFSET 16.096201 19.807301 -3.324200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_765483633 + { + OFFSET 3.251300 -5.096100 -60.039398 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_887334106 + { + OFFSET -6.215900 21.873400 -41.419201 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2694044589 + { + OFFSET 4.433700 -6.536300 -40.040798 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 2.670650 -9.349200 -13.122650 + } + } + } + JOINT joint_131332004 + { + OFFSET -3.107900 10.936700 -20.709600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.864800 6.562000 -12.425800 + } + } + } + JOINT joint_3630937574 + { + OFFSET 1.625600 -2.548000 -30.019699 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.975400 -1.528800 -18.011801 + } + } + } + JOINT joint_1060371951 + { + OFFSET -16.096201 19.807301 -3.324700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2091398058 + { + OFFSET -3.251300 -5.096100 -60.039001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3955709968 + { + OFFSET 6.215900 21.873400 -41.419201 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3894818105 + { + OFFSET -4.433600 -6.536300 -40.040798 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -2.670650 -9.349200 -13.122600 + } + } + } + JOINT joint_105297424 + { + OFFSET 3.107900 10.936700 -20.709600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.864800 6.562000 -12.425800 + } + } + } + JOINT joint_4010156290 + { + OFFSET -1.625600 -2.548000 -30.019501 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.975400 -1.528800 -18.011700 + } + } + } + JOINT joint_4044042034 + { + OFFSET -0.124900 32.522900 -16.225901 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 5.394500 -1.864600 + } + } + } +} +MOTION +Frames: 26 +Frame Time: 0.050000 +4.996357 143.046799 43.242477 -95.241299 10.205813 10.572636 0.000000 -0.000001 0.005543 -3.131104 0.018228 -0.236865 -2.212023 0.027582 6.383848 0.137973 -0.947171 18.907190 3.301258 0.001812 17.450462 -1.584496 -1.442347 14.978867 8.230672 -3.640175 1.192987 9.175678 -0.935375 4.673979 -5.075739 -0.384090 6.669859 -24.643687 4.847425 4.919033 -5.997080 0.000003 0.000000 -4.120415 -8.348802 0.508513 -3.850572 8.259474 -1.796394 8.364322 -9.633745 7.093896 -31.779884 13.829268 3.512720 -1.672002 8.735820 -18.893277 42.210904 -3.674898 3.505656 -17.098660 -11.562365 -5.112657 -0.001677 -0.021229 -0.241915 -4.483377 -7.547251 -7.431535 -42.862284 18.238267 12.982348 -7.696743 -10.395194 -20.315332 36.056870 3.405517 -2.632448 -0.418934 -8.534516 11.768816 -0.001089 0.014173 0.161549 -0.005413 0.000000 -0.000008 3.432831 -0.000001 0.000000 18.089598 2.097976 2.961525 33.674172 10.732201 -2.365506 -16.081223 -2.664409 -0.749122 39.346726 9.364605 8.358458 -0.111759 0.403531 -0.762294 0.000013 0.000000 0.000006 0.139869 9.604948 19.649407 38.302822 -12.005197 3.162693 -18.724556 -0.384549 0.709852 6.802784 -18.381147 1.658254 -0.403621 -1.573365 2.953599 0.000003 -0.000003 -0.000002 -0.005954 0.000002 -0.000007 +15.727739 147.499603 81.666749 -91.150872 9.129551 19.225220 -0.000000 0.000000 0.005543 -7.159961 0.024093 -0.204634 -1.660540 1.084409 5.938094 6.130371 3.149694 18.767763 4.408660 1.839616 17.335148 -1.461229 0.104071 20.868178 4.310179 -4.616886 0.808245 0.799978 1.852729 2.215887 -10.145267 -1.455990 2.999416 -20.599806 4.502557 4.015110 -5.997082 0.000004 0.000002 -3.804714 -7.808800 0.843122 -3.698557 7.769682 -1.320964 15.957065 -8.738422 7.843138 -35.189368 9.056585 3.019777 5.245831 5.982888 -12.853618 31.388224 -3.094055 2.047581 -18.854868 -10.289164 -11.431598 -0.000775 -0.009918 -0.113011 -6.434761 -9.536389 -9.008834 -50.800413 21.737435 18.532794 -6.273183 -17.694049 -14.617090 27.907304 2.845402 -1.634545 -3.909456 -10.619646 8.870724 -0.000519 0.006837 0.077936 -1.767927 0.267685 -0.070660 -3.890227 0.327706 -0.105389 -17.123090 -0.010610 1.257143 62.901699 17.323370 -8.880664 -37.903653 -8.534913 -4.411148 58.617232 12.880548 8.646474 -0.121382 0.439286 -0.829662 0.000011 0.000003 0.000005 9.216770 11.635843 23.794242 29.053567 -9.391847 1.674225 -7.436767 -1.461415 0.014718 21.303370 -24.490668 7.580116 -0.214268 -0.793191 1.495144 0.000005 0.000000 -0.000001 -0.005961 -0.000002 -0.000007 +29.968049 154.686905 116.658220 -90.814419 7.394562 27.041924 -0.000000 0.000000 0.005542 -9.615582 -0.025024 0.504657 2.099102 2.399239 5.762258 13.003541 7.885038 18.066813 3.017257 2.993549 17.327384 -2.220693 1.398946 27.697741 1.108444 -4.373736 -0.386874 -4.395847 2.332681 -0.562033 -11.265954 -2.559349 -1.922198 -20.737462 6.387705 5.802623 -5.997082 0.000003 0.000000 -3.369749 -7.061741 1.294629 -3.465323 7.077245 -0.644604 14.337376 -6.809241 5.175385 -31.081520 2.912046 0.002406 14.481427 3.293913 -4.303876 12.540940 -1.379985 0.357786 9.198797 -7.155911 -13.200596 -0.000085 -0.001051 -0.011979 -7.014523 -6.532844 -5.365616 -54.581768 18.833544 17.557745 7.543215 -16.051190 -6.564766 0.735956 0.075628 0.001541 24.728615 -14.439490 11.453246 0.000053 -0.000501 -0.005675 4.270948 0.126760 -0.554817 -2.356936 0.297461 -0.633499 -37.909176 -0.839332 2.682959 54.389468 15.784866 -6.655175 -31.075222 -4.257495 -2.627845 56.882571 5.755332 13.714480 -0.356134 1.369470 -2.573491 0.000017 0.000002 0.000004 2.295405 12.806874 25.332044 44.262122 -13.529029 4.333266 -17.409337 4.981560 1.008376 21.755764 -25.903499 9.094176 0.054339 0.188978 -0.358249 0.000005 -0.000004 -0.000003 -0.005961 0.000000 -0.000009 +47.510709 158.080642 148.884097 -93.243118 4.219588 34.873613 0.000000 -0.000000 0.005544 -6.146088 -0.045459 0.763827 0.890533 4.054208 5.714678 11.521327 9.042172 17.206575 6.428301 4.569525 17.869699 -1.792492 2.415041 29.311003 1.369233 3.357040 -1.798605 -2.311297 -5.341383 -0.949261 -11.053579 -2.333201 -4.768999 -23.867909 6.579982 6.737709 -5.997082 0.000004 0.000001 -2.838499 -6.092693 1.862610 -3.149919 6.150509 0.263396 10.988007 -3.127357 2.011293 -34.228842 -3.910567 -4.328964 -8.240378 4.804378 1.637247 47.690108 -3.784484 4.403790 51.188712 -4.545411 -12.143775 -0.002378 -0.029785 -0.339458 -5.782365 -3.100944 -1.199563 -33.317021 10.230403 9.237856 -7.709731 -9.995461 -19.898226 17.262039 1.884503 -0.671661 16.724521 -9.395953 14.657907 -0.000159 0.002251 0.025682 10.333596 -0.157791 -0.922327 0.746873 0.062664 -0.999493 -39.586584 -0.677021 6.924497 31.659244 10.155756 -2.050874 -13.503279 3.463889 -0.126553 36.040628 -11.400370 13.564849 -0.472641 1.881524 -3.526707 0.000008 0.000004 0.000006 -10.486321 11.713830 23.401549 59.991019 -16.835705 8.094959 -34.061141 11.453343 4.215146 29.095101 -23.736288 11.612769 0.302814 1.001794 -1.909061 0.000000 -0.000004 -0.000003 -0.005959 0.000001 -0.000008 +67.803996 155.339996 179.594928 -98.532038 -1.437394 43.110269 0.000000 0.000000 0.005544 -2.194442 -0.021792 0.289679 1.515136 3.595337 5.771370 10.197925 7.913385 17.121498 9.163980 4.316405 18.084095 3.318277 3.693920 28.084713 2.443489 10.236532 -2.239183 -0.237368 -10.039557 -1.281558 -10.750278 -2.767639 -4.963881 -22.276928 5.516663 5.403373 -5.997082 0.000005 0.000001 -2.259629 -4.991140 2.488598 -2.725038 5.081002 1.334073 10.125195 -0.918658 0.568731 -43.742209 -3.016339 -8.076782 -7.129415 4.471643 3.349015 61.695808 -3.558751 6.749170 48.970239 -6.433298 -8.080201 -0.004729 -0.057285 -0.653002 -1.505619 -1.875200 0.341690 -19.754097 2.425012 8.368765 -12.928729 -4.278177 -34.827082 29.017816 2.918621 -1.757070 10.169683 -3.006729 22.384038 -0.000610 0.008060 0.091873 7.012162 -0.101685 -0.620665 -0.867765 0.039810 -0.808395 -23.651959 5.427790 10.380609 5.381271 1.796910 0.054916 0.482630 6.967137 0.790791 22.517489 -20.638649 9.674234 -0.294702 1.114208 -2.096575 0.000009 0.000002 0.000006 -21.187320 5.102017 21.581489 59.793675 -16.801178 8.042572 -34.855482 11.628781 4.432524 19.282156 -16.366803 5.223667 0.301279 0.996984 -1.899839 0.000007 -0.000002 0.000001 -0.005956 -0.000001 -0.000011 +87.652408 150.609496 204.088337 -103.010872 -8.597777 49.436845 -0.000000 -0.000001 0.005544 2.207259 0.009580 -0.209828 2.927141 2.457278 5.859531 8.388310 5.678594 17.172565 10.789115 3.101359 17.670762 11.094422 5.035812 26.381779 2.705402 10.116369 -1.605788 -0.264323 -5.989859 -4.453813 -10.300695 -4.950454 -3.158163 -17.844859 4.458409 3.775407 -5.997080 0.000003 0.000000 -1.650727 -3.768511 3.154212 -2.174844 3.845973 2.592349 13.826908 -0.154201 5.435165 -47.482062 1.051732 -10.754543 -25.927858 9.325818 0.216167 73.307068 -2.673783 8.764443 57.887534 -4.897251 -2.072218 -0.007665 -0.089352 -1.018805 5.077765 -1.824323 0.223678 -18.142261 -0.652067 9.715841 -2.362329 -5.820211 -45.227270 19.349495 2.085716 -0.828031 18.931613 3.550329 29.579429 -0.000205 0.002862 0.032645 2.452926 -0.029969 -0.221366 -3.142859 0.057235 -0.501607 -15.834824 4.896899 10.922918 16.351493 5.424520 -0.354380 -9.786057 1.433571 0.290990 22.410728 -18.826822 7.205978 -0.216597 0.802370 -1.512345 0.000011 0.000001 0.000005 -19.167488 1.317348 24.090128 55.090987 -15.924393 6.829902 -30.279678 10.135648 3.385883 8.670140 -11.770577 1.958344 0.243289 0.814085 -1.549444 0.000003 -0.000001 -0.000003 -0.005957 0.000001 -0.000007 +108.308842 146.690795 224.824620 -105.246439 -14.847647 55.350061 0.000000 0.000000 0.005542 5.802130 0.032760 -0.515296 3.974356 0.996663 6.045669 6.649118 3.048600 16.749729 11.773821 1.621936 16.539243 18.273468 6.039808 24.355192 2.961870 9.720466 -0.999303 -0.103405 -1.759593 -7.816076 -9.463463 -7.404521 -0.826751 -13.099119 3.412798 2.427500 -5.997084 0.000002 0.000002 -1.053102 -2.494825 3.833889 -1.505997 2.523189 3.982323 17.110281 1.240191 11.975307 -46.501702 7.779531 -7.904463 -35.417369 10.721411 -6.283582 50.478735 -3.808945 4.820926 64.103668 -4.465566 -8.259416 -0.002737 -0.034067 -0.388232 11.947465 -1.835002 0.096503 -20.298822 2.285390 10.822148 3.763176 -7.052095 -44.201020 19.127679 2.061318 -0.797206 26.982857 8.294373 32.864426 -0.000183 0.002556 0.029164 0.000179 -0.002483 -0.000166 -4.304861 0.229269 -0.182713 -5.609919 2.478344 7.282747 43.062340 13.233319 -4.085152 -30.275579 -6.875970 -2.886051 12.846935 -14.261279 1.509125 -0.095925 0.345084 -0.652098 0.000011 0.000002 0.000004 -18.144643 -1.157345 25.412716 48.545875 -14.536932 5.267469 -24.266894 7.969996 2.184059 2.761081 -8.936050 0.612944 0.163801 0.556794 -1.057976 0.000005 -0.000004 -0.000003 -0.005961 -0.000002 -0.000006 +131.153265 146.303252 241.464238 -104.081760 -17.195268 62.296112 -0.000001 0.000000 0.005544 7.205226 0.101529 -1.592626 4.162862 -0.059787 5.832012 5.115081 0.994618 16.277570 10.876222 0.308323 15.155126 22.312819 6.341089 22.151275 2.910028 9.096418 -0.554582 0.035277 1.066360 -9.842311 -7.691803 -8.616013 1.153175 -8.709726 2.764344 1.655746 -5.997082 0.000004 0.000002 -0.480115 -1.153554 4.513147 -0.707115 1.113414 5.510050 2.759446 3.083924 11.664848 -28.719539 8.640337 -8.343377 -30.971649 2.219615 0.063881 31.287018 -3.088938 2.056887 25.925710 -3.185462 -15.875808 -0.000800 -0.010221 -0.116493 15.934567 -1.887127 0.027737 -24.203093 5.566307 11.541122 8.299549 -10.036131 -34.156913 9.997755 1.111908 -0.289049 50.405620 7.703072 23.201346 -0.000065 0.001028 0.011744 0.000181 -0.002487 -0.000158 2.049801 0.876535 0.069925 6.289012 1.702530 0.976437 48.987898 14.636575 -5.368022 -37.269843 -9.982200 -4.705694 19.042142 -5.891285 0.737469 0.042338 -0.147532 0.279635 0.000012 0.000003 0.000002 -18.204656 -0.517659 27.749139 37.891817 -11.895193 3.087825 -16.272563 4.954944 0.951742 8.319256 -12.885607 1.999919 0.074645 0.258469 -0.490200 0.000007 -0.000003 -0.000002 -0.005955 -0.000000 -0.000008 +154.011680 147.606397 254.671086 -102.176466 -17.433623 69.460639 0.000000 0.000000 0.005544 6.650070 0.162967 -2.718625 4.729413 -1.234450 5.414750 4.751863 -0.689368 14.828072 8.605076 -1.039273 13.076347 22.870899 5.771878 19.750890 2.402334 8.549807 -0.352765 0.107786 2.023949 -9.984346 -4.767287 -7.953900 2.233042 -3.611655 3.106216 1.497529 -5.997078 0.000003 0.000000 0.063768 0.161898 5.178884 0.216828 -0.317299 7.140637 -1.441687 3.291713 10.677439 -21.917969 12.804916 -5.710192 -16.934856 -5.820591 -1.347737 6.294484 -0.698700 0.090318 16.593699 -4.608174 -14.126506 -0.000041 -0.000438 -0.005012 16.106275 -1.830605 -0.007281 -27.134615 7.177611 11.469156 -14.058433 -2.670708 -27.093252 43.450399 3.684355 -3.710520 56.702594 4.453821 14.289126 -0.001786 0.022732 0.259093 0.000181 -0.002488 -0.000161 13.642277 1.766294 0.216691 17.268051 -0.409749 -6.090128 44.175056 13.507781 -4.315065 -35.078311 -9.722857 -4.347761 25.195957 0.416973 -0.457815 0.063009 -0.218647 0.414592 0.000011 0.000002 0.000002 -17.657186 0.143867 28.097658 26.737974 -8.696759 1.368843 -8.991435 2.019531 0.179863 15.317575 -15.681879 4.036575 -0.000540 -0.001866 0.003538 0.000010 -0.000004 -0.000009 -0.005954 0.000001 -0.000006 +175.710152 149.632902 264.342626 -100.796356 -16.593272 75.955860 -0.000001 -0.000000 0.005540 4.664416 0.175690 -2.925280 6.062022 -2.628172 5.224985 5.220408 -2.197692 12.112248 5.766833 -2.300806 10.494484 19.886712 4.338785 17.613674 1.489942 8.032899 -0.325434 0.454313 2.126276 -9.272373 -1.755390 -6.773402 2.931532 2.220185 4.426526 1.598069 -5.997083 0.000004 0.000001 0.564752 1.449263 5.780512 1.253506 -1.743226 8.848792 0.204938 1.857115 8.543384 -28.186392 18.914817 -1.206823 -12.266874 -11.926443 -1.069544 21.363724 -2.281372 0.995078 15.136777 -1.873053 -13.784055 -0.000299 -0.003802 -0.043334 14.536734 -1.619287 -0.067015 -35.587444 6.646799 10.337401 -17.044119 -2.471897 -23.747872 49.199274 3.782415 -4.656133 18.201543 2.832160 23.268246 -0.002639 0.033125 0.377544 0.000179 -0.002489 -0.000158 22.004426 2.361141 0.273309 19.212352 -2.187621 -0.190880 42.929247 13.200164 -4.058008 -33.558259 -10.035812 -4.248620 26.940253 2.077534 -0.495328 0.128454 -0.439743 0.834966 0.000010 0.000002 0.000006 -8.835851 0.059271 23.254885 33.702532 -10.740199 2.370078 -19.332407 4.243387 1.221054 10.639305 -10.490216 1.081470 -0.063179 -0.225523 0.426478 0.000001 -0.000003 -0.000002 -0.005956 -0.000001 -0.000004 +195.815698 151.946301 271.685826 -100.029671 -15.237380 81.550817 0.000001 0.000000 0.005546 2.425932 0.178487 -3.019979 7.815485 -3.337459 5.156434 5.647103 -3.000279 9.942303 2.961291 -3.007113 8.529995 14.883809 2.632904 15.407633 0.682673 7.093521 -0.312898 0.763826 2.051330 -8.012429 0.042881 -5.625120 3.329903 7.122828 5.648327 1.512749 -5.997076 0.000004 0.000003 1.001505 2.686394 6.373311 2.391131 -3.120612 10.607579 1.793969 0.439162 5.744897 -20.784556 17.053608 1.326903 -11.498656 -10.528427 -2.247759 25.323188 -2.625960 1.360712 0.057623 1.427555 -13.716333 -0.000372 -0.004719 -0.053784 13.197270 -1.465341 -0.099290 -41.135441 4.960264 8.289294 -7.538406 -4.964977 -21.527525 30.413102 3.024971 -1.918952 5.541376 3.357176 28.202114 -0.000708 0.009282 0.105806 0.000184 -0.002485 -0.000159 21.361895 2.324024 0.207897 17.591745 -3.249684 4.480747 43.236571 13.276622 -4.120806 -30.012828 -11.594147 -4.109392 26.320890 5.058311 1.481407 0.378437 -1.234466 2.356170 0.000009 0.000002 0.000004 2.763457 -1.444313 18.301074 30.618103 -9.852934 1.896243 -24.666311 4.988818 1.781519 10.099243 -6.661781 0.003498 -0.122432 -0.443129 0.836932 0.000003 -0.000006 -0.000002 -0.005959 0.000002 -0.000008 +214.498133 154.235242 276.786535 -99.875494 -13.747478 86.020035 0.000000 -0.000000 0.005541 0.096592 0.193680 -3.306670 8.876833 -3.509589 5.195612 7.085761 -3.017993 9.189123 2.548737 -3.040605 7.562704 8.609606 1.074487 13.218398 0.351238 5.553108 -0.162608 0.600670 2.139244 -6.599897 0.225395 -4.662961 3.083682 9.037769 5.522473 1.263638 -5.997080 0.006829 0.001521 1.394983 3.842433 6.906985 3.596647 -4.402867 12.386657 0.104374 -0.897542 0.454341 -15.131597 12.828626 4.366971 -8.820787 -7.118578 -2.830936 25.390012 -2.629909 1.369978 -7.096264 2.994050 -12.355073 -0.000464 -0.005943 -0.067719 11.975563 -1.330175 -0.121085 -40.872575 3.455610 5.864881 -14.424694 -3.467151 -15.635327 34.135708 3.250048 -2.413383 1.395050 2.059319 27.346132 -0.000998 0.012951 0.147613 0.000181 -0.002487 -0.000160 12.011467 1.761397 -0.031002 -1.754226 -7.327864 0.667948 54.139360 15.734575 -6.593280 -35.818690 -14.237566 -5.514465 28.371994 4.936731 2.774726 0.581324 -1.830361 3.508177 0.000011 0.000003 0.000005 12.043512 -4.490714 14.388280 23.114016 -7.581190 0.947838 -21.368291 4.224816 1.330261 13.325284 -5.137987 0.206346 -0.106671 -0.384628 0.726680 0.000004 -0.000003 -0.000003 -0.005959 0.000001 -0.000008 +232.378062 157.317700 280.317663 -100.246776 -11.033927 88.150184 -0.000001 -0.000001 0.005543 -1.451826 0.129428 -2.183225 7.352271 -3.861918 6.254682 7.062846 -3.137162 8.392442 4.245041 -2.721689 6.897444 2.188031 -0.316449 11.122086 0.110515 3.675446 0.103144 0.245139 2.287549 -5.145238 0.056388 -3.694463 2.486498 8.893027 4.294921 0.977117 -5.976096 0.027312 0.006081 1.747734 4.916366 7.394178 4.838480 -5.587417 14.145779 1.956684 -1.495151 -4.078744 -16.068976 7.999442 7.596215 0.423945 -4.882616 -3.978528 16.893610 -1.832396 0.629439 -9.981825 3.351818 -11.202566 -0.000178 -0.002273 -0.025914 10.783189 -1.213536 -0.136208 -38.840652 1.294327 3.336751 -6.610000 -3.352008 -10.522360 11.017239 1.234681 -0.290070 10.674018 2.010089 24.886127 -0.000036 0.000723 0.008260 0.000178 -0.002488 -0.000161 0.435915 1.100529 -0.327586 -18.336087 -9.971636 -1.140948 50.474226 14.965366 -5.711556 -34.481759 -13.896637 -5.321522 34.656844 4.426867 2.883545 0.557940 -1.763652 3.378692 0.000009 0.000002 0.000004 11.984525 -6.431846 12.438765 19.639028 -6.483688 0.611117 -19.346366 4.156887 1.216507 19.195917 -6.229690 0.870328 -0.070343 -0.251484 0.475497 0.000004 -0.000002 -0.000000 -0.005956 -0.000001 -0.000007 +248.320415 159.365597 282.395452 -99.951870 -10.242379 90.247820 -0.000000 0.000001 0.005543 -0.338335 0.070438 -1.211331 4.446314 -3.738788 6.438874 5.912014 -3.023495 7.982549 6.148346 -2.303064 6.718014 -3.085306 -1.379918 9.128571 -0.296031 1.859185 0.367803 -0.042207 2.346991 -3.710658 0.062482 -2.671380 1.689147 6.854867 2.764529 0.718094 -5.955115 0.047796 0.010632 2.023123 5.891217 7.829899 6.079533 -6.618188 15.841190 3.962928 -2.515139 -6.643073 -20.665784 4.941984 7.031116 -1.232782 -1.636009 -2.134973 28.910715 -2.908217 1.774232 -1.461786 2.198388 -10.968405 -0.000678 -0.008695 -0.099073 9.800917 -1.106557 -0.132366 -31.694199 -1.733558 1.136083 -4.528066 -1.130331 -13.380119 9.914388 1.089061 -0.232038 4.392604 2.126626 27.400323 -0.000016 0.000415 0.004776 0.000177 -0.002489 -0.000162 -8.024918 0.696822 -0.504085 -21.464857 -10.242515 3.186479 28.054008 9.093624 -1.538977 -21.210280 -9.845041 -2.864298 36.751134 1.021812 3.988751 0.351706 -1.152899 2.199268 0.000008 0.000003 0.000007 3.685900 -6.733708 10.065250 29.644986 -9.566989 1.756680 -18.550180 5.988156 1.473378 3.723814 -3.390719 -1.244296 0.094625 0.326280 -0.619069 0.000003 -0.000004 -0.000001 -0.005961 -0.000001 -0.000010 +262.295269 159.399196 283.697973 -98.598495 -14.153043 92.102715 -0.000001 -0.000001 0.005544 4.287948 -0.011160 0.165962 3.159959 -3.238969 5.669839 4.354504 -2.713118 7.391760 7.533093 -2.032194 6.404509 -5.998687 -1.778037 7.387151 -0.679433 0.656910 0.524304 -0.168960 2.165542 -2.608564 0.191980 -1.886168 1.108381 4.061052 1.465931 0.449129 -5.955121 0.068277 0.015200 2.198400 6.485881 8.097749 6.890527 -7.238746 16.928831 2.019167 -5.596554 -7.547245 -18.322830 7.334424 1.663325 -7.824943 0.688713 4.214864 43.992537 -3.715393 3.789071 14.947317 0.741812 -8.845143 -0.001873 -0.023673 -0.269780 9.070842 -1.024845 -0.142770 -31.974690 -4.080594 -0.974683 1.848332 0.956162 -12.939459 18.498865 1.997291 -0.750416 -5.147695 0.906799 27.614010 -0.000181 0.002557 0.029163 0.000181 -0.002487 -0.000160 -11.308018 0.630188 -0.537844 -12.921291 -6.193022 13.118871 -2.240273 -0.744906 -0.072509 -2.252787 -3.304261 -0.841587 30.098888 -5.644764 4.885353 0.101029 -0.347812 0.660037 0.000008 -0.000001 0.000009 -3.937884 -7.115977 11.307252 44.579841 -13.606379 4.399991 -18.262642 8.669287 1.306468 -11.733708 0.695777 -6.888154 0.396186 1.288267 -2.459737 0.000005 -0.000005 0.000002 -0.005959 -0.000001 -0.000007 +275.714856 158.266902 283.954442 -96.268807 -18.094063 94.324331 -0.000001 0.000000 0.005543 8.624877 -0.062365 1.047280 2.266685 -2.515643 4.585321 2.595924 -2.252664 6.607227 8.978781 -1.663814 5.954751 -7.038422 -1.755837 5.832150 -1.032339 -0.165879 0.641164 -0.254814 1.755107 -1.532843 0.322762 -1.165359 0.565313 1.411066 0.440582 0.137534 -5.934141 0.075110 0.016695 2.353104 7.017216 8.334885 7.662319 -7.777091 17.942547 -0.526077 -6.520897 -7.714707 -19.058506 7.401913 -0.090378 -13.352327 1.612649 4.040605 53.456728 -3.789364 5.318386 29.867084 2.873894 -7.531797 -0.003177 -0.039258 -0.447455 7.899961 -0.923779 -0.126094 -28.983330 -5.534501 -1.473222 7.444362 1.230959 -13.269813 19.205868 2.067571 -0.808142 -7.046283 1.255978 27.263496 -0.000254 0.003473 0.039614 0.000185 -0.002487 -0.000161 -12.296479 0.655142 -0.570511 -9.121801 -5.499356 16.527678 -2.939651 -0.976717 -0.101102 0.962348 -1.581632 -0.382829 23.265793 -8.482045 3.657890 0.063483 -0.220262 0.417669 0.000008 0.000001 0.000006 -5.585923 -5.014622 9.501525 45.154709 -13.745283 4.521772 -16.377041 8.420441 0.893319 -8.283390 0.041001 -8.323936 0.431300 1.393656 -2.662892 0.000003 -0.000001 0.000000 -0.005955 0.000001 -0.000008 +288.549177 155.706294 283.520757 -92.839094 -21.057173 97.405093 0.000000 0.000000 0.005544 10.561706 -0.053100 0.934056 2.254847 -1.646886 3.495535 1.756955 -1.558951 5.818917 9.960093 -1.137902 5.329872 -6.812371 -1.632955 4.550519 -1.262271 -0.616503 0.737171 -0.455421 1.121552 -0.407315 0.279382 -0.378198 -0.180101 -0.425248 -0.302922 -0.130774 -5.913164 0.095598 0.021230 2.538790 7.737316 8.657287 8.758006 -8.474280 19.353080 -3.435750 -4.931569 -6.732476 -14.604274 5.305465 -0.652809 -12.671392 2.222708 2.065995 47.638954 -3.789182 4.360091 25.214363 4.646325 -7.760727 -0.002333 -0.029174 -0.332489 6.186288 -0.760826 -0.095508 -20.765166 -7.149408 -0.447089 8.441008 1.034992 -14.075741 17.630710 1.910741 -0.684244 -6.253895 2.272458 26.590453 -0.000181 0.002556 0.029163 0.000186 -0.002489 -0.000161 -12.669157 0.699159 -0.605365 -10.150510 -9.232426 15.787375 19.792708 6.532749 -0.624598 -10.667934 -4.758970 -0.802677 17.657258 -8.107100 1.637177 0.143494 -0.489704 0.930130 0.000009 0.000001 0.000006 -2.750953 0.199685 2.684712 40.869833 -12.678249 3.647727 -17.910024 7.615984 1.324981 -1.171935 -0.965900 -4.248131 0.283873 0.942500 -1.795364 0.000001 -0.000003 -0.000002 -0.005959 0.000001 -0.000007 +300.596480 155.511042 282.290746 -90.242205 -20.647235 99.917994 -0.000001 0.000001 0.005543 11.707995 -0.048694 0.823842 2.888952 -0.994368 2.903249 0.705666 -1.019490 4.928237 8.642497 -0.835382 4.408616 -5.197437 -1.335105 3.745619 -1.261914 -0.444722 0.715898 -0.759180 0.723729 -0.094042 0.002666 -0.116975 -0.506585 -0.870494 -0.553270 -0.227947 -5.871211 0.136579 0.030276 2.682843 8.319876 8.902941 9.686760 -9.018937 20.543604 -5.494894 -2.738254 -4.884095 -10.808014 3.303052 -0.733927 -7.875382 2.691748 -2.338197 31.479393 -3.091437 2.069840 21.064714 5.594545 -4.687231 -0.000795 -0.010222 -0.116492 4.478029 -0.578897 -0.067648 -13.252296 -7.653606 0.859073 6.815153 1.140857 -14.506869 18.681822 2.012324 -0.769351 -4.737400 3.058655 25.647188 -0.000183 0.002556 0.029163 0.000177 -0.002488 -0.000161 -13.031257 0.748208 -0.645031 -6.666651 -8.225399 15.117696 25.180842 8.221374 -1.179339 -16.827405 -5.727970 -1.390843 15.949206 -6.325940 0.679675 0.099113 -0.341360 0.647772 0.000011 0.000001 0.000006 0.034389 3.966442 -3.682514 34.680546 -11.015178 2.530122 -18.459813 5.950186 1.385201 3.681142 -0.834917 -0.245241 0.100850 0.347271 -0.658989 0.000003 -0.000003 -0.000003 -0.005957 0.000000 -0.000007 +312.084395 158.917002 280.581304 -89.441437 -15.692989 101.478709 0.000002 0.000000 0.005543 11.497226 -0.045868 0.769363 2.377985 -0.474808 2.655488 -0.900869 -0.613634 4.090982 5.918136 -0.576233 3.455629 -3.175384 -1.007448 2.987337 -1.248928 -0.154771 0.680088 -1.005682 0.447725 -0.077587 -0.219614 -0.111879 -0.450063 -1.420495 -0.685713 -0.286359 -5.829274 0.177566 0.039292 2.801286 8.785532 9.109161 10.465614 -9.430375 21.528824 -4.895442 -1.536423 -3.319092 -9.548196 2.157602 -0.500006 -2.519896 2.139158 -4.394290 18.403257 -1.994523 0.731608 4.826508 1.839819 -2.511753 -0.000179 -0.002274 -0.025914 3.032323 -0.375757 -0.069939 -6.874251 -7.212669 1.855819 2.470771 1.576758 -15.240206 21.496759 2.284772 -0.995217 4.697910 4.395825 24.005389 -0.000181 0.002556 0.029163 0.000184 -0.002487 -0.000160 -13.680441 0.771284 -0.670163 -4.926749 -5.704329 14.582494 19.336250 6.386936 -0.584938 -12.419085 -4.353812 -0.873702 10.774618 -4.943337 0.145116 0.078157 -0.270331 0.512766 0.000005 0.000003 0.000006 1.604527 3.886424 -6.816058 21.801491 -7.169607 0.812855 -11.743397 3.566184 0.631588 3.496636 -0.763362 0.435695 0.043091 0.150228 -0.284727 0.000005 -0.000002 -0.000004 -0.005959 0.000000 -0.000007 +318.685653 161.187693 279.610204 -89.441722 -10.370064 102.592653 -0.000000 -0.000000 0.005544 7.921412 -0.020744 0.410966 2.019068 -0.257420 2.445164 -0.168215 -0.338287 3.513101 3.818646 -0.358530 2.789225 -2.012236 -0.826540 2.157663 -1.227077 -0.008727 0.619769 -1.125990 0.435261 -0.247651 -0.344360 -0.152812 -0.473120 -1.764153 -0.794730 -0.334854 -5.829283 0.187807 0.041575 2.842657 8.970740 9.186686 10.777282 -9.589391 21.923047 -2.805593 -1.037875 -2.089024 -6.802054 1.566956 -0.412751 -1.340486 1.653761 -5.475150 13.165910 -1.449265 0.396562 -5.528091 -0.539225 -2.190057 -0.000036 -0.000440 -0.005011 2.347993 -0.237048 -0.084973 -3.441214 -6.366674 2.172233 -3.061586 2.042717 -13.938751 29.715436 2.955239 -1.880004 9.999281 3.227875 20.621111 -0.000730 0.009587 0.109289 0.000184 -0.002487 -0.000160 -13.972995 0.783174 -0.687506 -4.912652 -3.117628 13.887600 11.404243 3.801447 -0.083730 -7.322570 -2.681067 -0.422975 8.116162 -4.092706 -0.037361 0.049367 -0.171786 0.325651 0.000011 0.000001 0.000007 2.441021 2.838650 -8.159666 12.949081 -4.311337 0.153167 -6.469251 2.341003 0.289964 0.826431 -1.156095 0.235178 0.048718 0.169625 -0.321527 0.000003 -0.000003 -0.000003 -0.005958 0.000000 -0.000007 +325.087722 161.858988 278.397557 -89.432732 -6.828565 103.521448 0.000001 0.000000 0.005543 4.265804 0.000095 0.007678 2.608228 -0.125228 2.261225 1.153263 -0.128140 3.121997 2.051805 -0.204278 2.256959 -1.014781 -0.693278 1.244055 -1.189709 0.066167 0.562147 -1.223522 0.428971 -0.345733 -0.455495 -0.163842 -0.473676 -2.094298 -0.901541 -0.383307 -5.809418 0.205890 0.051003 2.880843 9.106006 9.242036 11.012829 -9.707914 22.211006 -1.736267 -0.649515 -1.299373 -3.910467 1.128914 -0.380964 -2.337781 1.386694 -6.500444 11.565885 -1.279360 0.309094 -6.767745 -0.424940 -1.623806 -0.000003 0.000000 -0.000001 1.811546 -0.108097 -0.096746 -5.301005 -4.447614 1.303809 -18.226512 2.594070 -9.054007 58.198428 3.694158 -6.131450 17.558748 -1.445474 16.910843 -0.007504 0.049328 0.562361 -0.005411 0.000001 -0.000009 -14.192969 0.789534 -0.690274 -4.666299 -1.691168 13.139495 7.786474 2.599638 0.024858 -4.922688 -1.863615 -0.259013 5.575676 -3.376504 -0.144852 0.035543 -0.120850 0.229445 0.000009 0.000002 0.000011 3.603390 2.207379 -9.131576 7.723874 -2.578769 -0.026061 -3.308577 1.796485 0.187363 -1.844280 -1.661652 -0.024413 0.059309 0.202666 -0.384667 0.000004 -0.000003 0.000003 -0.005956 0.000000 -0.000008 +329.594467 161.984049 277.457250 -89.452890 -4.271884 104.278482 0.000000 0.000000 0.005542 2.300348 0.022441 -0.351820 2.250374 -0.006974 1.979182 1.337318 -0.031318 2.874148 1.228981 -0.097169 1.922329 0.811706 -0.470280 0.398675 -1.147960 0.090063 0.495751 -1.266055 0.329529 -0.285626 -0.514988 -0.172222 -0.242426 -2.772933 -0.910893 -0.394961 -5.791949 0.226387 0.055501 2.915888 9.238118 9.299412 11.242721 -9.820024 22.515788 -0.834147 -0.310567 -0.622471 -1.675184 0.781561 -0.290525 -2.565595 0.982772 -7.705511 8.778600 -0.975514 0.187483 -6.383818 -0.398434 -0.803003 -0.000003 0.000001 -0.000001 1.125154 0.061978 -0.099266 -6.294641 -3.282038 0.754135 -17.703470 -0.426841 -3.209168 50.275005 3.790012 -4.810508 9.399412 -4.800160 10.830177 -0.006227 0.034356 0.391653 -0.005411 0.000001 -0.000008 -14.420230 0.797120 -0.692172 -4.645620 -0.732022 12.409352 5.453387 1.820996 0.054512 -3.287220 -1.245630 -0.153275 3.747752 -2.959415 -0.144036 0.024835 -0.083650 0.158917 0.000011 0.000002 0.000008 4.459653 1.762680 -9.927220 3.950942 -1.318967 -0.056803 -1.223624 1.186571 0.123005 -3.595272 -1.887534 -0.190975 0.048494 0.165497 -0.314124 0.000003 -0.000002 -0.000001 -0.005956 0.000000 -0.000008 +332.022812 161.956598 276.968205 -89.536127 -2.338710 104.837182 0.000000 0.000000 0.005542 1.475072 0.036635 -0.515578 1.278471 0.077479 1.583893 0.566090 -0.012918 2.728164 0.541449 -0.042734 1.681245 3.717891 -0.128349 -0.270952 -1.105130 -0.021412 0.417917 -1.252589 0.131639 0.025643 -0.504538 -0.096032 0.117502 -3.884622 -0.821421 -0.372339 -5.760494 0.246899 0.059938 2.922355 9.327806 9.340335 11.393737 -9.882750 22.695516 -0.151608 -0.059345 -0.112852 0.635333 0.563370 -0.263492 -2.172414 0.507825 -8.597656 5.493117 -0.613327 0.081251 -5.151500 -0.468786 -0.101149 -0.000003 0.000000 0.000000 0.538821 0.195487 -0.098955 -5.757667 -2.458678 0.465186 -12.216627 -1.819925 1.247701 33.172774 3.226509 -2.260552 -0.053342 -3.735138 3.754905 -0.004362 0.011432 0.130367 -0.005406 0.000001 -0.000009 -14.556455 0.813325 -0.705384 -4.991762 -0.060772 11.811468 3.632286 1.212480 0.055594 -2.075549 -0.729437 -0.072256 2.807922 -2.762858 -0.110636 0.012328 -0.039962 0.076136 0.000007 0.000002 0.000011 4.659465 1.451051 -10.510906 1.307564 -0.436017 -0.028879 0.028595 0.550003 0.061961 -4.372000 -1.837495 -0.265640 0.030275 0.102441 -0.194521 0.000005 -0.000003 -0.000009 -0.005956 0.000000 -0.000008 +332.848526 161.868097 276.840550 -89.645110 -1.270844 105.187093 0.000000 0.000000 0.005543 1.013476 0.043484 -0.567656 0.672574 0.103980 1.283300 0.037982 -0.024786 2.592184 0.134935 -0.018868 1.523919 5.587470 0.074556 -0.875306 -1.061881 -0.205855 0.377424 -1.231293 0.029237 0.322524 -0.487520 0.040913 0.243654 -4.604844 -0.776035 -0.359106 -5.739535 0.267403 0.064409 2.929115 9.325699 9.346228 11.404547 -9.891821 22.711363 -0.002207 -0.001352 0.003439 2.029618 0.545473 -0.324266 -1.853272 0.336824 -8.552952 4.320421 -0.478259 0.050578 -4.888843 -0.543035 0.082968 -0.000003 0.000000 -0.000001 0.306183 0.201173 -0.095392 -5.754576 -1.930540 0.269983 -4.439693 -1.007980 3.297163 14.378095 1.572988 -0.493219 -2.334579 -0.139111 0.552819 -0.003599 0.001649 0.018885 -0.005406 0.000001 -0.000009 -14.563503 0.808562 -0.700244 -5.436003 0.256052 11.459494 2.700331 0.901085 0.048664 -1.529498 -0.508345 -0.042156 2.557708 -2.650035 -0.101480 0.008168 -0.025397 0.048541 0.000010 0.000002 0.000009 4.508355 1.254834 -10.855079 0.050524 -0.016829 -0.001318 0.482883 0.177234 0.030448 -4.511590 -1.716679 -0.301445 0.014496 0.047432 -0.090268 0.000004 -0.000003 0.000001 -0.005960 0.000000 -0.000008 +333.845383 161.755197 276.610051 -89.772129 -0.555057 105.419424 0.000000 0.000000 0.005543 0.523763 0.037057 -0.620353 0.284339 0.101581 1.126380 -0.084259 -0.031331 2.455025 0.015834 -0.012956 1.410376 6.400502 0.152799 -1.403750 -1.047089 -0.332392 0.350859 -1.210114 -0.000684 0.480791 -0.498424 0.137029 0.240248 -4.912712 -0.787304 -0.378015 -5.739555 0.287884 0.068977 2.929114 9.325699 9.346231 11.404546 -9.891819 22.711364 -0.002207 -0.001352 0.003438 2.868025 0.548744 -0.386420 -1.473084 0.235396 -8.283236 3.589176 -0.386404 0.033804 -4.990539 -0.635802 0.102877 -0.000003 0.000001 -0.000001 0.166724 0.194504 -0.083756 -4.582441 -1.838542 0.295075 -1.666277 -0.451296 3.930875 6.658741 0.735173 -0.105229 -0.579281 0.907664 -0.112791 -0.003503 0.000425 0.004950 -0.005410 0.000001 -0.000009 -14.563507 0.808562 -0.700244 -5.618946 0.396899 11.230120 2.259258 0.753749 0.043623 -1.267282 -0.430396 -0.045119 2.207290 -2.539606 -0.110300 0.007700 -0.023779 0.045476 0.000008 0.000002 0.000007 4.678476 1.039561 -11.065322 -0.994404 0.331040 0.028588 0.816726 -0.132081 -0.009587 -4.725588 -1.663814 -0.339195 0.003421 0.008585 -0.016684 0.000004 -0.000001 -0.000000 -0.005958 0.000000 -0.000008 +334.246078 161.672800 276.507542 -89.865798 -0.138266 105.544759 0.000000 0.000000 0.005543 0.166971 0.032562 -0.662570 0.060588 0.095517 1.042198 -0.062789 -0.042479 2.359061 -0.005007 -0.019098 1.350875 6.621377 0.169884 -1.737304 -1.046762 -0.387459 0.333005 -1.220573 -0.003540 0.518518 -0.477655 0.189542 0.212374 -4.996788 -0.807129 -0.390792 -5.718598 0.308391 0.073433 2.929114 9.325698 9.346231 11.404549 -9.891821 22.711362 -0.002203 -0.001353 0.003438 3.219206 0.544523 -0.411026 -1.323748 0.208237 -8.129877 3.285564 -0.359129 0.024412 -5.032306 -0.668869 0.116392 -0.000003 0.000001 -0.000001 0.042729 0.088046 -0.031405 -3.351624 -1.709803 0.321079 -2.115241 -0.382140 4.063301 5.558538 0.620321 -0.084323 0.011825 0.972344 -0.155965 -0.003503 0.000426 0.004951 -0.005405 0.000001 -0.000009 -14.563505 0.808562 -0.700244 -5.832687 0.439543 11.104750 2.083487 0.695050 0.041296 -1.168452 -0.397433 -0.028167 2.071999 -2.485618 -0.116239 0.007708 -0.023776 0.045473 0.000010 0.000002 0.000006 4.652434 0.921039 -11.173978 -1.468844 0.488769 0.044251 0.922746 -0.293946 -0.026616 -4.766434 -1.610474 -0.350854 -0.003020 -0.014078 0.026231 0.000004 -0.000003 -0.000005 -0.005959 0.000000 -0.000008 diff --git a/data/gradio_animo/conversion_summary.json b/data/gradio_animo/conversion_summary.json new file mode 100644 index 0000000000000000000000000000000000000000..f8a7e3fbb2c49a2d602368a22525a7294f7e90f5 --- /dev/null +++ b/data/gradio_animo/conversion_summary.json @@ -0,0 +1,28 @@ +{ + "success_count": 3, + "failed_count": 0, + "total": 3, + "results": [ + { + "filename": "arctic_wolf_female_fightflee", + "num_frames": 107, + "num_joints": 54, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_animo/bvh/arctic_wolf_female_fightflee.bvh", + "success": true + }, + { + "filename": "arctic_wolf_female_fighttaunt", + "num_frames": 139, + "num_joints": 54, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_animo/bvh/arctic_wolf_female_fighttaunt.bvh", + "success": true + }, + { + "filename": "dromedary_camel_male_runtostandturnl", + "num_frames": 26, + "num_joints": 56, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_animo/bvh/dromedary_camel_male_runtostandturnl.bvh", + "success": true + } + ] +} \ No newline at end of file diff --git a/data/gradio_animo/joint_text_features/arctic_wolf_female_fightflee.npz b/data/gradio_animo/joint_text_features/arctic_wolf_female_fightflee.npz new file mode 100644 index 0000000000000000000000000000000000000000..4be55a0cd834fd6fb65aa9387484571194652d27 --- /dev/null +++ b/data/gradio_animo/joint_text_features/arctic_wolf_female_fightflee.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feab8254e314979f988f2c2cc89e7f903b315cfc477fae775fac833d3b371e99 +size 131672 diff --git a/data/gradio_animo/joint_text_features/arctic_wolf_female_fighttaunt.npz b/data/gradio_animo/joint_text_features/arctic_wolf_female_fighttaunt.npz new file mode 100644 index 0000000000000000000000000000000000000000..4be55a0cd834fd6fb65aa9387484571194652d27 --- /dev/null +++ b/data/gradio_animo/joint_text_features/arctic_wolf_female_fighttaunt.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feab8254e314979f988f2c2cc89e7f903b315cfc477fae775fac833d3b371e99 +size 131672 diff --git a/data/gradio_animo/joint_text_features/dromedary_camel_male_runtostandturnl.npz b/data/gradio_animo/joint_text_features/dromedary_camel_male_runtostandturnl.npz new file mode 100644 index 0000000000000000000000000000000000000000..28710432e8e8983673e5729ffbf9f8c92596ea39 --- /dev/null +++ b/data/gradio_animo/joint_text_features/dromedary_camel_male_runtostandturnl.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1efcdd0f8c9990323a8d01c641178466c2f6e456378e6e8b3fe8784b962b3efb +size 131731 diff --git a/data/gradio_animo/processed/arctic_wolf_female_fightflee.npz b/data/gradio_animo/processed/arctic_wolf_female_fightflee.npz new file mode 100644 index 0000000000000000000000000000000000000000..6ce7e6fe504a9db2b7882b5ae8af26f409b8781f --- /dev/null +++ b/data/gradio_animo/processed/arctic_wolf_female_fightflee.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fc747fc0532d54a54c3e7cf4cf43bd9277c18b06e7543a2329fc6342e37146b +size 433869 diff --git a/data/gradio_animo/processed/arctic_wolf_female_fighttaunt.npz b/data/gradio_animo/processed/arctic_wolf_female_fighttaunt.npz new file mode 100644 index 0000000000000000000000000000000000000000..d1ecf0999408b97d7141fd4187de5e1e58bc20d5 --- /dev/null +++ b/data/gradio_animo/processed/arctic_wolf_female_fighttaunt.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8673d7a84a8c0f14ede339f94e6d81d2a885f1e31ef2bbc71353969987a9bafb +size 557904 diff --git a/data/gradio_animo/processed/dromedary_camel_male_runtostandturnl.npz b/data/gradio_animo/processed/dromedary_camel_male_runtostandturnl.npz new file mode 100644 index 0000000000000000000000000000000000000000..77ab9525b7c64df97f34d6508ab7b8c169ffe7d6 --- /dev/null +++ b/data/gradio_animo/processed/dromedary_camel_male_runtostandturnl.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e529a030fe1492b79c88a4c053ec819d0ca28fb8b07ce6319005085908a26b0 +size 111870 diff --git a/data/gradio_human/bvh/000327.bvh b/data/gradio_human/bvh/000327.bvh new file mode 100644 index 0000000000000000000000000000000000000000..2733d895f7281e0a9361855c63da6e91435ab89f --- /dev/null +++ b/data/gradio_human/bvh/000327.bvh @@ -0,0 +1,285 @@ +HIERARCHY +ROOT joint_1076281987 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_785313506 + { + OFFSET 6.839228 1.020027 -9.261335 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2637396045 + { + OFFSET 3.722109 0.079899 -38.206455 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1339827937 + { + OFFSET -1.409479 4.342973 -40.116772 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2046115793 + { + OFFSET 2.787144 -12.092801 -5.627600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_2064434935 + { + OFFSET -6.660022 0.841643 -9.128584 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_4182473860 + { + OFFSET -4.089339 0.620133 -38.974159 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3929929428 + { + OFFSET 1.628754 4.200468 -40.081627 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2571577402 + { + OFFSET -2.595261 -12.530275 -4.854441 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_2630692199 + { + OFFSET -0.287504 2.378362 11.087161 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_143925206 + { + OFFSET 0.694164 -0.462369 14.774159 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_422786746 + { + OFFSET 0.123851 -2.417059 5.668056 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2835393530 + { + OFFSET -0.404407 3.417651 21.665386 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2426940655 + { + OFFSET 0.623294 -5.498597 7.240618 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + JOINT joint_3403381658 + { + OFFSET 7.776275 3.083250 12.128577 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2742345338 + { + OFFSET 9.128868 0.877415 3.094648 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3345505161 + { + OFFSET 26.458769 2.698128 -1.550295 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_959262863 + { + OFFSET 25.411228 0.169694 0.927727 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 8.867861 0.380842 -1.149812 + } + } + } + } + } + JOINT joint_3990975805 + { + OFFSET -8.085654 3.567182 11.768765 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_454301663 + { + OFFSET -9.613117 0.830805 3.269114 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_717834970 + { + OFFSET -25.575371 2.160430 -1.469916 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3550804577 + { + OFFSET -25.868061 0.649312 0.706867 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.461860 0.112497 -1.100773 + } + } + } + } + } + } + } + } +} +MOTION +Frames: 151 +Frame Time: 0.050000 +0.544534 93.036987 -0.506799 -93.579106 2.132206 0.317515 1.719428 -5.221015 9.289783 13.369186 2.293039 1.510734 -19.001661 -7.778168 8.025496 0.000000 0.000000 -0.000000 -12.955044 0.989529 -5.537051 20.401263 -0.143678 1.409080 -8.198348 -1.316646 -11.892544 0.000000 0.000000 -0.000000 9.306482 -3.828807 -2.957953 -2.148055 8.600925 -0.920359 3.023090 5.240488 -0.639662 -5.738093 1.807258 -27.282200 -7.132918 -8.081977 -4.719162 -4.827525 23.691717 5.295089 -1.336538 59.178512 5.556818 -5.062294 -10.112902 -36.974680 -9.371464 -12.450633 -2.194107 -8.800629 6.510150 5.886618 -15.921718 -16.869383 16.497019 -33.356372 15.306166 116.139418 19.290074 18.606146 9.348860 +1.062526 92.991005 -0.996287 -93.646592 1.898929 0.454913 1.698651 -4.385000 8.892093 13.032046 2.285833 1.927703 -18.985592 -7.826163 7.705312 0.000000 0.000000 0.000000 -13.419674 1.748999 -5.473708 20.649875 -0.152109 0.513778 -8.088315 -1.587536 -11.011306 0.000000 0.000000 -0.000000 10.641217 -3.439542 -2.348214 -1.923417 6.996603 -1.145665 3.109994 4.604187 -0.480260 -4.486997 1.179409 -23.709440 -3.420872 -6.867478 -4.782230 -4.373669 24.167221 5.055672 0.521486 59.760471 3.106505 -5.149100 -9.509914 -38.216408 -9.487600 -12.235144 -2.323509 -7.992787 2.221983 5.440899 -9.379873 -20.521133 19.575998 -31.245918 16.869461 121.909094 20.763817 19.467983 9.210626 +1.621927 92.891525 -1.664500 -93.553451 1.688199 0.724280 1.286143 -3.711188 8.426357 12.903175 2.410323 2.407279 -19.183956 -7.892379 7.203364 -0.000000 0.000000 -0.000000 -14.120517 2.561846 -5.325654 20.888910 -0.306118 -0.529373 -7.713715 -2.067380 -10.138860 -0.000000 0.000000 -0.000000 12.059655 -3.298123 -1.797697 -1.463294 5.493605 -1.178885 3.012031 4.007607 -0.208091 -3.831832 1.102971 -20.858764 1.659088 -5.586752 -4.782763 -3.604528 24.726480 4.090055 2.953814 60.388290 -0.044362 -5.777620 -9.028373 -39.354525 -9.925592 -11.010545 -2.732209 -6.839795 -2.631571 5.786337 -3.419271 -23.136422 21.956266 -27.896777 18.855094 124.726445 20.602781 15.970799 10.895703 +2.208053 92.782944 -2.431542 -93.234454 1.293386 1.200199 -0.122442 -2.770540 7.724235 13.961057 2.290700 2.344395 -19.515274 -8.605801 7.350990 0.000000 0.000000 -0.000000 -15.324638 3.629202 -5.416837 21.679969 -0.355347 -1.022730 -7.484931 -2.589503 -9.737420 0.000000 0.000000 -0.000000 14.307355 -3.081408 -1.048680 -1.655867 4.196384 -0.821892 3.118798 3.146007 0.195052 -3.277219 1.002508 -18.513115 6.313153 -4.761711 -4.747566 -3.023264 25.424498 3.377752 5.797511 60.826147 -3.924120 -5.800706 -8.677133 -40.635552 -9.868336 -10.976280 -2.666236 -5.036479 -7.105219 6.312653 1.890161 -25.229149 23.045382 -23.766983 20.925402 123.464720 20.625529 15.075539 11.630339 +2.827998 92.624886 -3.392936 -93.145561 0.896624 2.040908 -2.015116 -2.022078 6.545421 16.155339 2.496079 2.445904 -20.009618 -9.275031 7.567470 -0.000000 0.000000 -0.000000 -16.432493 4.670739 -5.387814 22.635359 -0.465990 -1.754874 -7.399324 -2.772179 -9.617771 -0.000000 0.000000 0.000000 16.689726 -3.339834 -0.181174 -0.411999 2.931527 -0.605342 3.218282 2.547311 0.698121 -3.168608 1.105952 -16.366035 9.917162 -4.364230 -5.122790 -2.681625 26.509722 1.823794 10.298013 60.606154 -9.507505 -6.674383 -8.003660 -42.280189 -10.872452 -12.657049 -2.633426 -3.271851 -12.097677 7.592147 5.573571 -25.472040 23.083202 -19.613494 22.591928 118.982472 22.899014 16.223462 10.916713 +3.452931 92.269859 -4.668663 -92.718119 0.339367 3.265886 -5.575293 -1.137241 5.310277 20.338356 2.691581 2.376943 -21.014071 -9.698227 7.822362 -0.000000 0.000000 0.000000 -18.939309 5.951601 -5.448069 25.393687 -0.319852 -2.144197 -7.671889 -2.955873 -9.578431 0.000000 0.000000 0.000000 20.078853 -3.957519 0.593355 0.159763 1.935668 -0.221355 3.477231 2.053281 1.196582 -3.434319 1.200520 -15.143880 12.798984 -4.014410 -5.599492 -2.245296 27.338502 0.544989 13.303895 60.106149 -14.037991 -5.956358 -8.181441 -44.022736 -11.394366 -11.781086 -3.313557 -1.281351 -15.789280 9.261111 6.538992 -25.438307 22.750515 -14.857757 23.757507 110.219390 25.151338 15.995983 10.810489 +4.008051 91.665985 -6.093863 -92.578956 -0.379758 4.388423 -9.407533 -0.229738 4.436198 25.525290 3.113756 2.153249 -22.219986 -10.284767 7.762589 -0.000000 0.000000 0.000000 -22.040293 7.341470 -4.688397 29.508293 -0.390107 -2.826626 -8.677833 -2.521537 -9.845547 0.000000 0.000000 -0.000000 25.254396 -4.634786 1.171647 0.142244 1.541675 0.709910 3.599579 1.255920 1.940931 -4.022995 1.339823 -14.877245 14.855830 -3.983335 -6.379190 -2.705305 27.251312 -0.447764 17.222255 60.307685 -18.764563 -5.019039 -8.690344 -46.359141 -12.668663 -11.485969 -3.947502 0.050286 -17.879686 11.248872 6.034198 -25.164429 21.783194 -10.629362 23.424037 100.008716 26.663527 14.110780 11.173590 +4.446635 90.455879 -7.528169 -91.794908 -0.615346 6.033098 -14.548681 0.037414 3.526641 31.705250 3.842658 1.761155 -23.661380 -11.113649 7.531785 0.000000 0.000000 -0.000000 -26.246368 8.502266 -4.251517 34.388714 -0.453284 -3.412640 -9.658169 -2.146217 -10.221396 0.000000 0.000000 -0.000000 30.354706 -6.278557 1.797246 0.150678 1.152347 1.629448 3.491772 0.942414 2.575820 -3.451911 1.890567 -16.697684 14.371562 -4.849187 -6.005733 -2.063508 27.932736 -2.053587 19.195146 59.473040 -21.156372 -4.272788 -9.261021 -51.051230 -14.141690 -12.544038 -4.072767 1.828785 -18.546151 14.385415 3.613428 -23.784794 19.569892 -8.031276 21.777322 90.423428 29.036382 14.078833 10.069569 +4.675032 88.825760 -9.085035 -90.530454 -1.348198 6.969870 -20.079828 0.489168 3.301418 37.668015 4.999182 1.952687 -25.723091 -11.566996 6.750356 -0.000000 0.000000 -0.000000 -31.936393 9.964196 -3.424214 40.299871 -0.108079 -4.123397 -10.666509 -2.434783 -9.815909 0.000000 0.000000 0.000000 36.056277 -7.257947 2.669501 0.097098 1.431361 2.615766 3.177594 0.695180 3.415786 -3.755224 1.837940 -17.748729 12.755591 -5.937579 -6.946396 -1.900153 28.471287 -3.675771 20.301276 58.257333 -22.028211 -4.048665 -10.214261 -56.429087 -15.002740 -10.824735 -4.279154 3.397292 -18.532942 17.367285 0.601771 -21.955884 17.736637 -6.799661 19.849771 82.134187 31.096201 14.169252 9.356184 +4.770764 86.846428 -10.564797 -89.443910 -1.850912 8.212968 -25.912412 0.953243 2.777952 44.122712 5.866153 2.168385 -27.223009 -11.770561 6.091200 -0.000000 0.000000 -0.000000 -37.151163 11.231507 -2.204875 45.736602 -0.121348 -4.967229 -11.396636 -2.108100 -9.754127 0.000000 0.000000 -0.000000 43.072855 -8.713696 3.361888 -0.814772 1.936274 3.511902 3.049632 0.554589 4.189153 -4.405682 2.438667 -19.635964 10.432730 -7.406164 -7.131546 -2.115061 28.451269 -4.827605 21.155077 57.637719 -22.748577 -3.467528 -11.531107 -60.953869 -16.793255 -11.489262 -5.428123 3.943148 -16.959043 19.888063 -2.336207 -20.358748 15.997177 -6.248717 18.539621 75.611282 33.441862 15.600265 8.324055 +4.771564 84.468513 -11.904448 -87.798055 -2.534040 9.373468 -32.243653 1.969699 2.311895 50.290149 6.384171 2.617114 -28.313342 -12.484896 5.621858 0.000000 0.000000 -0.000000 -43.435870 12.522751 -0.470086 51.584539 -0.044039 -5.936274 -12.071871 -2.291445 -9.849823 0.000000 0.000000 -0.000000 49.571185 -10.083369 4.180103 -1.716033 2.597399 4.145936 3.233927 0.475454 4.692766 -4.547917 3.475510 -21.964414 6.662726 -8.852737 -6.937439 -2.055196 28.458712 -6.559106 21.672433 56.869190 -22.911583 -4.036448 -11.705757 -65.207893 -17.094631 -13.864207 -5.718828 4.189537 -14.720812 22.657825 -5.003860 -18.167569 14.076557 -7.001572 16.231753 71.009210 35.360909 17.374504 6.981557 +4.621041 81.586578 -13.093741 -85.411096 -3.366460 9.818843 -39.465105 2.619286 1.098492 56.643813 8.403402 3.360562 -29.636780 -13.307069 5.319419 -0.000000 0.000000 0.000000 -51.260676 12.969473 2.443711 58.697080 0.111432 -5.397888 -12.722621 0.122519 -12.172865 -0.000000 0.000000 0.000000 54.471236 -10.640763 4.821423 -1.632777 3.350987 4.802958 3.138237 0.531367 4.852785 -5.067572 4.361872 -24.097638 3.998442 -10.154942 -6.858999 -2.400508 28.123242 -7.691332 22.030671 56.153471 -22.911877 -4.394493 -11.955865 -68.037977 -17.862948 -14.728966 -5.725124 4.905791 -12.542705 25.053578 -7.735174 -15.097267 13.072401 -7.719586 15.380290 67.446228 36.484967 17.072567 6.255200 +4.465844 78.670547 -13.906959 -83.893064 -4.799349 10.224926 -45.383730 3.647012 0.858123 62.776120 10.015450 3.846281 -30.976372 -13.853250 5.203972 -0.000000 0.000000 -0.000000 -58.006298 13.633169 5.555203 64.545271 0.683774 -5.733606 -12.651511 -1.540867 -11.349415 0.000000 0.000000 -0.000000 60.218867 -10.943137 5.294432 -1.905429 4.196552 4.954504 3.176711 0.369243 4.972662 -5.042043 5.473016 -26.138349 0.681362 -11.266267 -6.498527 -3.035923 28.273821 -8.881121 22.041647 55.452563 -22.199232 -4.912567 -12.028599 -70.182934 -17.807915 -15.678125 -5.577298 4.362002 -9.664943 27.232163 -9.605736 -12.908830 11.906123 -8.838197 14.114777 64.444094 37.814277 17.603666 5.190700 +4.330932 75.367141 -14.564269 -82.198957 -5.550460 11.155575 -51.938857 4.680039 0.155293 69.464723 11.303642 4.056611 -32.846152 -14.971617 5.138543 0.000000 0.000000 -0.000000 -64.708449 13.848691 8.686765 70.591299 0.425087 -5.671603 -13.223404 -1.400863 -12.833596 0.000000 0.000000 -0.000000 64.838442 -12.450743 5.780216 -2.251184 4.885382 5.242644 2.785370 0.690207 4.808914 -4.824493 6.757246 -28.177280 -1.061414 -11.564651 -5.402382 -3.064348 28.620806 -9.403466 20.744799 54.596711 -20.786974 -4.282048 -11.748136 -71.542835 -17.722118 -15.347465 -5.482333 5.030376 -6.660032 28.852638 -11.627944 -10.641673 11.349868 -10.015908 12.909101 61.955586 38.708916 18.694409 4.250808 +4.331077 71.993408 -14.830249 -81.107108 -6.775517 11.710564 -57.435265 5.889328 -0.696352 75.846799 12.937494 4.305747 -34.356056 -15.767861 5.504790 0.000000 0.000000 0.000000 -70.704566 14.110648 11.917412 76.774920 0.375633 -5.641801 -14.189981 -1.600687 -13.297518 0.000000 0.000000 -0.000000 71.444772 -13.137340 6.863473 -4.513478 5.527153 5.072604 0.922790 0.922063 4.485930 -2.565984 8.180491 -30.160998 -2.870627 -12.993882 -4.137180 -3.271937 28.292684 -9.000817 20.074177 55.199936 -18.680850 -2.653288 -12.277790 -72.544191 -18.170612 -15.103665 -4.584350 5.365230 -4.087743 30.147574 -12.995589 -9.757515 10.319936 -10.004974 12.088282 60.136894 39.458241 18.778765 3.624728 +4.355618 68.489745 -14.912255 -80.550723 -7.275334 12.006355 -62.455712 6.034850 -2.021168 82.779808 15.116916 3.709475 -36.364060 -16.481774 5.582943 -0.000000 0.000000 0.000000 -76.351443 13.836955 14.804747 82.872787 -0.367171 -5.398244 -14.606540 -1.615017 -13.801337 -0.000000 0.000000 0.000000 73.591144 -13.678343 7.384208 -4.806505 5.405433 5.623474 2.491956 0.567035 4.629432 -0.141261 8.580670 -32.340293 -6.973955 -13.749700 -4.236889 -1.939496 29.674216 -11.191854 19.200164 54.440839 -17.985592 -3.582135 -11.953210 -73.014645 -17.303776 -15.273415 -4.707368 6.691524 -2.557322 31.637385 -15.157129 -6.073265 8.747842 -9.928898 11.755031 58.535244 41.022057 20.849061 2.069139 +4.437916 65.026946 -15.027440 -80.173575 -7.657279 12.178432 -67.248106 6.431891 -4.243474 89.825028 17.980102 2.861172 -38.377884 -17.575920 5.940022 -0.000000 0.000000 -0.000000 -81.556368 13.463551 17.946417 88.884139 -1.656893 -4.603471 -15.788817 -1.196887 -14.491780 0.000000 0.000000 -0.000000 74.754506 -13.856009 7.876995 -4.810939 4.939412 5.875383 3.594019 0.325006 4.700586 2.100532 8.608391 -33.626048 -9.837883 -14.547247 -4.319613 -0.413853 30.134069 -12.986793 19.201140 54.173295 -17.794255 -4.427930 -12.022279 -73.730474 -18.045848 -16.151647 -4.809176 7.763428 -1.422698 32.591646 -16.409979 -3.843160 7.619818 -9.776151 12.095664 57.187996 40.524594 21.113935 2.303500 +4.678255 61.673995 -15.094723 -80.562916 -8.372325 13.075480 -71.334383 8.105168 -4.701408 96.705428 18.876967 1.751451 -39.622750 -19.537496 6.384986 0.000000 0.000000 0.000000 -85.602092 13.764451 19.661029 94.459296 -1.363797 -3.425264 -17.223972 0.697870 -15.852035 -0.000000 0.000000 0.000000 74.138844 -14.653346 8.578597 -4.373593 4.139780 5.905808 6.039095 -0.133389 4.364472 3.381336 8.702126 -35.686413 -11.589582 -14.427973 -4.163252 1.335310 30.983906 -15.488804 18.625057 53.537629 -17.563009 -5.140400 -12.018004 -73.556104 -17.261085 -16.436662 -3.898961 8.691350 -0.909128 33.030087 -16.938375 -1.770495 5.803589 -9.734989 12.279872 57.240903 41.211992 20.676611 2.233164 +4.872753 58.676723 -15.059414 -81.465181 -8.933738 13.433152 -74.509224 9.226194 -5.620218 103.105942 20.031449 1.050891 -41.003336 -20.414564 6.659254 0.000000 0.000000 -0.000000 -88.448443 13.619125 21.163034 99.766733 -0.938290 -2.204451 -19.056843 1.129425 -15.887904 -0.000000 0.000000 0.000000 73.936998 -14.785803 8.837412 -3.956053 3.163933 6.028516 7.185075 -0.269003 4.495985 5.225702 8.494826 -35.706077 -12.801144 -14.503761 -4.558997 2.551269 30.956463 -16.649315 18.409479 53.742284 -17.802721 -5.305391 -12.125551 -73.049641 -18.073719 -16.425999 -4.161981 9.826092 -0.899983 32.669354 -16.974690 -1.004334 4.719502 -8.884625 13.597898 57.532838 41.573765 21.841870 1.493934 +5.000789 56.188155 -14.878702 -82.833983 -8.807712 13.619434 -76.180452 9.828086 -6.334933 108.039294 20.376770 -0.314829 -42.126808 -21.737452 7.244917 0.000000 0.000000 0.000000 -90.187172 13.700023 22.260868 104.214282 -1.540534 -1.237592 -20.580204 1.716297 -15.646142 0.000000 0.000000 0.000000 74.493836 -15.018286 9.209519 -4.238517 2.478909 5.903519 7.326371 -0.207369 4.806164 5.800778 8.583915 -34.978758 -13.395216 -14.190557 -4.679984 2.633100 30.548776 -16.509969 18.584024 54.626124 -17.649442 -5.143956 -12.405799 -72.672224 -18.528424 -18.101039 -3.797513 10.774364 -1.626837 32.586343 -16.533452 -1.010632 4.027027 -7.759204 14.597460 58.305472 42.436138 23.652143 0.630798 +5.236202 54.316577 -14.642459 -84.314999 -9.191296 13.449214 -76.705087 10.447370 -6.400662 111.636561 20.518107 -0.477503 -43.070735 -22.289813 7.579762 -0.000000 0.000000 -0.000000 -91.201264 13.607403 22.829581 107.277710 -1.065712 -1.014225 -21.305406 1.937464 -15.682257 -0.000000 0.000000 0.000000 75.032062 -14.818506 9.171597 -4.315188 2.061317 5.539804 6.557108 -0.110016 4.804236 6.016199 8.888438 -34.295125 -13.284954 -13.562384 -4.299934 2.878314 30.132893 -16.344613 17.715479 55.244566 -16.671030 -4.383085 -12.302686 -72.310342 -18.678587 -18.082031 -3.832435 11.443743 -2.313169 32.321854 -15.879646 -2.535746 3.885446 -7.876813 16.156459 60.389587 44.065860 25.412814 -0.106965 +5.144823 53.638904 -14.360903 -85.945419 -9.103649 12.805369 -75.614373 9.858351 -6.973093 113.346134 20.728422 -0.712467 -43.619687 -22.108676 7.400410 0.000000 0.000000 0.000000 -90.179777 13.052341 22.728044 108.172162 -1.424499 -0.996896 -21.239613 2.634578 -16.530407 0.000000 0.000000 0.000000 75.830068 -14.450968 8.647813 -4.053961 2.221663 5.498823 5.711530 0.061699 4.485078 2.906057 9.993261 -32.772340 -10.627171 -13.208483 -3.495531 1.125518 29.633476 -14.350899 17.168128 55.795027 -16.582310 -3.404799 -12.903722 -72.025185 -19.635590 -17.233815 -3.700917 11.000157 -2.466860 31.915410 -15.376298 -4.995991 5.248228 -9.032042 16.640171 61.819906 41.619819 24.726741 0.901907 +5.119553 53.976275 -14.250410 -87.025363 -8.915380 12.453589 -73.957849 9.921598 -6.789137 112.873857 20.119881 -0.184793 -43.666674 -22.584508 7.463506 0.000000 0.000000 -0.000000 -88.500770 12.878625 22.228480 107.586321 -1.559558 -1.052772 -20.921681 3.265875 -16.993405 0.000000 0.000000 0.000000 75.969043 -14.549444 8.379683 -4.110333 2.541499 5.182207 5.293012 0.317400 4.106366 -0.072644 10.853434 -31.472383 -8.990701 -12.515463 -3.031919 -0.291091 29.062558 -12.830427 16.915441 56.514662 -17.402512 -2.875330 -13.253559 -71.878747 -20.100679 -17.875514 -3.497011 10.292036 -2.643400 31.169475 -14.631046 -7.206934 6.776068 -10.357608 17.489769 63.746232 42.235046 27.616954 0.524489 +5.070089 55.542487 -14.248757 -88.107070 -8.616027 11.824720 -71.073128 10.026126 -6.612342 110.241316 19.228474 0.552209 -43.133635 -22.100451 7.939844 -0.000000 0.000000 0.000000 -84.873627 12.433653 20.906233 105.445838 -1.413234 -1.822607 -21.153723 2.657916 -17.091150 -0.000000 0.000000 0.000000 75.433805 -14.266630 8.235136 -3.285958 2.598654 4.658924 4.671501 0.687862 3.950634 -2.754838 11.014797 -29.193404 -7.759742 -11.920232 -3.386013 -1.179525 28.599644 -12.310431 17.186672 57.500804 -18.742819 -3.544138 -13.573650 -72.091001 -19.788851 -18.037648 -3.706097 9.119154 -3.720870 30.277632 -13.956804 -8.724068 7.812024 -12.183796 18.747636 68.088463 42.557749 29.162970 0.324695 +5.044169 57.864932 -14.281112 -89.107642 -7.646046 10.909245 -67.480521 9.193733 -5.794506 106.155575 17.236485 1.832696 -42.676095 -21.528079 7.733320 -0.000000 0.000000 -0.000000 -80.293640 11.805502 18.700656 101.504744 -1.449767 -2.794076 -20.313099 3.110602 -17.117995 0.000000 0.000000 0.000000 73.382256 -13.833527 7.812097 -0.793419 2.491069 4.441490 3.487891 0.647284 4.107393 -3.454713 10.766612 -28.571677 -8.108738 -10.977049 -3.499553 -0.844131 28.306158 -13.579965 17.156467 58.146240 -19.524883 -4.974424 -13.201209 -72.345828 -18.718602 -17.910331 -3.606873 7.966787 -4.550698 30.055018 -13.680651 -9.898617 8.076172 -14.943668 19.080961 73.632457 41.890745 27.416945 1.725260 +5.126798 61.000903 -14.180154 -90.601396 -7.530702 9.568635 -61.838329 8.376826 -5.679975 100.361790 16.785677 3.949481 -42.122933 -19.641673 7.227007 -0.000000 0.000000 -0.000000 -74.620479 11.863903 16.739752 97.002838 -0.902602 -4.179695 -20.751990 1.780855 -15.290725 -0.000000 0.000000 0.000000 72.258120 -12.321712 7.375767 0.251761 2.461976 3.789146 1.671083 0.487371 4.402370 -1.176019 9.359825 -27.442593 -9.845995 -10.643450 -4.535573 0.881746 28.111541 -15.418390 15.886476 58.473563 -18.669728 -6.623897 -12.570576 -71.747886 -18.893542 -15.488808 -4.008190 7.321611 -6.421193 29.812137 -13.643751 -11.095628 8.415542 -16.993820 20.042075 79.368659 42.495508 27.524629 2.299188 +4.997336 64.293555 -14.202723 -92.211077 -6.058146 9.083916 -56.336643 6.686959 -3.353607 94.651266 13.062369 4.376744 -41.330713 -18.761525 7.172444 0.000000 0.000000 -0.000000 -68.351380 11.581288 12.892825 91.881728 -0.436390 -4.611913 -20.620696 2.102494 -14.818157 0.000000 0.000000 -0.000000 69.826496 -12.311582 6.841728 1.718877 2.559497 3.227042 1.072903 0.406490 4.526664 -0.942636 9.000953 -26.492618 -10.106770 -10.424553 -4.377977 0.788929 27.825182 -15.806202 14.017527 59.004619 -16.233298 -6.527006 -13.091603 -71.621673 -18.226300 -16.466392 -3.207034 6.664976 -6.949160 30.112342 -14.436193 -13.158112 9.419033 -18.768530 20.718705 84.688804 42.941316 27.076142 1.892059 +4.887510 67.759551 -14.124972 -93.780985 -4.984934 8.574045 -50.618284 5.442512 -2.172241 89.049740 10.829718 4.398094 -40.363799 -18.409254 7.127402 -0.000000 0.000000 0.000000 -62.044431 11.687393 9.415078 86.051629 -0.189044 -4.376625 -19.782313 2.399437 -14.554300 0.000000 0.000000 -0.000000 66.441948 -11.770943 5.811295 2.741975 2.539846 2.901338 1.196422 0.303669 4.543600 -3.329804 8.805465 -25.536253 -8.105407 -9.094744 -4.214947 0.131247 27.720215 -14.927023 13.185343 59.428843 -15.089132 -6.275699 -13.460480 -69.891565 -18.857753 -15.829203 -3.646351 5.292543 -8.104481 29.734086 -14.160551 -14.574733 11.643720 -20.165983 22.308471 88.945381 42.752044 24.812267 4.029786 +4.733731 71.206733 -13.905300 -95.973703 -4.060247 7.492354 -43.927254 3.858727 -1.113040 83.007744 9.188463 4.248024 -39.361099 -17.492773 6.918691 -0.000000 0.000000 -0.000000 -55.176532 11.000050 6.037638 80.297357 0.421989 -4.281057 -18.955083 2.494143 -14.152031 -0.000000 0.000000 -0.000000 62.987455 -10.949070 4.856399 4.471454 2.836760 2.614685 0.685029 0.400060 4.683546 -4.716229 8.718459 -24.454482 -7.656705 -8.660694 -4.633800 -0.362175 27.664410 -14.417479 11.015684 59.655238 -12.224056 -5.983248 -13.696659 -68.188464 -17.910427 -13.859449 -3.055489 4.144288 -8.504311 29.538945 -14.553589 -16.081975 13.524421 -21.434064 23.176586 92.530577 44.116772 23.678382 4.089640 +4.545768 74.499580 -13.610865 -97.680886 -2.995642 6.971649 -37.985245 2.609126 0.359366 77.080415 6.964630 4.249730 -38.286549 -16.865260 6.914908 -0.000000 0.000000 0.000000 -48.916117 10.453813 2.785490 74.543010 0.735875 -3.802980 -18.614386 2.559009 -13.671313 0.000000 0.000000 0.000000 58.609871 -10.503940 4.174076 5.457324 3.213481 2.352778 0.954703 0.451071 4.569557 -7.054137 8.240504 -23.363909 -7.247976 -7.514866 -4.787093 -1.262441 27.915803 -12.830164 9.668194 59.377777 -10.491792 -4.912556 -13.677981 -65.551353 -17.884793 -14.223344 -3.061633 2.767771 -8.849887 28.915114 -14.495267 -16.232208 15.938905 -22.220942 23.467553 94.613002 44.234528 24.950901 3.429415 +4.359765 77.620361 -13.154074 -99.147372 -2.185520 6.463413 -32.226709 1.741763 0.968884 71.047045 5.727613 4.126947 -36.956610 -16.295030 7.277009 0.000000 0.000000 -0.000000 -42.930592 9.811570 0.584847 68.612500 0.590552 -3.421137 -18.023303 2.621925 -13.238952 -0.000000 0.000000 -0.000000 53.885493 -9.751354 3.530824 6.517845 3.464196 2.153348 0.707799 0.706317 4.488973 -8.585320 7.445743 -22.948713 -7.344127 -6.716973 -4.939057 -1.773604 28.247852 -11.690506 9.064172 59.077314 -9.203716 -4.880940 -13.476646 -62.872925 -16.934457 -13.583122 -2.883547 1.622688 -9.159087 28.270975 -14.773758 -15.429822 17.993742 -23.140930 23.006487 96.151644 43.620136 24.391265 4.057864 +4.019999 80.492920 -12.674283 -99.891919 -1.400995 6.595397 -27.457513 0.569338 1.333545 64.992901 5.020243 3.382940 -35.451993 -15.454158 7.223110 0.000000 0.000000 -0.000000 -37.935727 9.004263 -1.104445 62.893159 0.243204 -3.109036 -16.940350 2.332741 -13.247497 -0.000000 0.000000 0.000000 48.970977 -8.994617 3.127056 6.417605 3.715477 2.041588 0.855532 0.787804 4.227212 -9.949509 5.821567 -23.137525 -7.174067 -6.142882 -5.574230 -2.360698 28.243249 -10.502190 9.363802 58.756689 -8.883333 -4.610782 -13.047640 -59.446426 -16.534121 -14.455449 -3.475045 -0.451328 -9.017568 26.987164 -15.453862 -14.673691 20.082932 -23.884779 22.791233 96.368104 42.523601 24.391664 5.598344 +3.659102 83.000213 -12.146002 -100.036781 -0.635967 7.477328 -23.784349 -0.414424 1.839274 59.394052 3.998704 2.359386 -34.097610 -14.223212 7.028400 -0.000000 0.000000 0.000000 -33.755579 8.331946 -2.479009 57.495127 -0.425772 -3.404187 -16.014132 1.973162 -13.147465 0.000000 0.000000 0.000000 43.453209 -8.388937 2.489034 6.080321 3.648342 1.672953 1.157090 0.875162 3.660763 -11.141225 3.904427 -23.409321 -6.926694 -5.618278 -5.962076 -3.038298 28.169406 -8.849736 10.050373 58.535314 -8.770266 -4.153528 -13.244975 -56.095430 -15.750995 -13.728075 -3.761560 -2.856147 -8.686490 25.346032 -16.110237 -13.650594 22.969100 -23.738374 22.151798 94.634144 41.201447 23.931828 7.005607 +3.330220 85.121162 -11.430518 -99.941098 -0.307117 8.442838 -20.523709 -0.922522 1.689407 54.061652 3.607035 1.394881 -32.440871 -13.606265 7.384189 0.000000 0.000000 0.000000 -30.106483 7.880349 -3.641109 52.396501 -0.808562 -3.162837 -14.805297 1.881278 -13.758926 0.000000 0.000000 -0.000000 38.013147 -7.701567 1.849006 5.450066 3.815918 1.117102 1.444982 1.196485 3.270159 -11.315099 2.703254 -24.302892 -7.373019 -5.659453 -6.340990 -3.004161 27.646552 -7.938234 10.463898 58.310927 -8.458930 -3.178619 -13.235297 -52.507360 -14.869225 -13.308056 -3.492545 -4.431693 -7.212569 24.407373 -17.782947 -12.487559 24.732754 -24.416541 21.167236 91.416186 39.185012 22.644935 6.120798 +3.010501 87.041412 -10.526683 -100.173492 0.017514 8.851017 -16.686177 -1.693870 2.287288 48.515243 3.142479 0.464735 -31.185161 -13.090220 7.559719 0.000000 0.000000 -0.000000 -26.221058 6.956053 -4.476176 47.398887 -0.830054 -2.999558 -13.518283 1.729146 -14.062715 0.000000 0.000000 -0.000000 32.886379 -7.109902 1.224434 5.583528 4.571928 0.890073 1.453538 1.499243 2.978595 -11.826464 1.958549 -25.245304 -8.362141 -5.855857 -6.443347 -3.057774 27.278271 -7.586762 10.715921 58.214591 -7.659466 -3.058315 -13.260705 -49.110466 -14.125105 -13.334865 -3.675729 -6.165668 -5.358353 24.213098 -20.024085 -10.681057 25.966457 -24.335237 20.000829 86.611828 37.410253 22.321029 5.907038 +2.741053 88.576401 -9.555434 -99.708662 0.199636 9.371045 -13.989892 -2.043191 2.474633 43.535746 2.720635 -0.541187 -29.653770 -12.669305 8.008508 -0.000000 0.000000 0.000000 -23.503968 6.455694 -5.420414 43.065329 -0.841190 -2.701225 -12.526136 1.210488 -14.450624 -0.000000 0.000000 0.000000 28.062475 -6.547955 0.800233 4.706358 5.546282 0.928614 1.573046 1.871343 2.789650 -12.517947 1.572563 -26.494917 -8.992859 -6.351819 -6.608293 -3.379647 26.895462 -6.297130 11.019998 58.209351 -7.163393 -2.397565 -13.237419 -45.684023 -13.386728 -13.721019 -4.271102 -7.754565 -2.889123 23.525439 -22.582729 -8.819652 26.850347 -23.541140 18.738314 80.622119 34.604447 21.942853 6.490157 +2.444914 89.924255 -8.510742 -99.329046 0.446752 9.787873 -11.124812 -2.558758 2.923764 38.457010 2.265180 -1.863312 -27.938555 -12.016901 8.516646 -0.000000 0.000000 0.000000 -20.455746 5.835073 -6.214556 38.194925 -1.031775 -2.253387 -11.646681 1.155308 -14.871950 -0.000000 0.000000 0.000000 24.018307 -6.371864 0.435450 3.449040 6.881409 1.361212 1.675185 2.421543 2.542255 -12.955963 1.265557 -27.884834 -9.771371 -6.970162 -5.878768 -3.466111 26.511371 -5.066607 11.148469 57.883290 -6.354654 -2.202046 -12.916413 -43.538129 -12.979319 -14.259828 -4.253028 -9.169888 0.068283 23.064364 -24.886244 -6.789381 27.190897 -22.987123 16.885315 74.201283 33.467164 21.002254 5.851661 +2.134978 91.014244 -7.333119 -98.804032 0.728304 10.090809 -8.578666 -3.001661 2.985393 33.686986 1.902965 -2.589172 -26.626138 -11.319739 9.030235 0.000000 0.000000 -0.000000 -17.755517 5.242330 -7.132558 33.611530 -1.189019 -1.831106 -10.583997 0.515722 -15.121132 -0.000000 0.000000 -0.000000 19.922577 -6.148152 0.264438 2.666583 8.199828 1.731346 1.442450 2.872074 2.633467 -12.655851 0.773073 -29.538509 -10.374047 -7.551428 -5.368935 -3.891074 26.376676 -3.705359 11.589231 57.343518 -5.592095 -1.964032 -12.591106 -41.434713 -12.621018 -14.062940 -4.786089 -9.819915 3.045565 23.033471 -27.336114 -3.841127 26.989402 -22.276631 14.945262 67.059536 32.875558 21.286973 5.340358 +1.841752 91.918022 -6.103737 -98.124666 1.054011 10.445155 -6.378769 -3.517851 3.419987 29.161642 1.354994 -3.235197 -24.930492 -10.311453 9.113977 0.000000 0.000000 -0.000000 -15.325770 4.493633 -8.099093 29.209121 -1.122057 -1.282229 -9.550095 0.174934 -15.496690 -0.000000 0.000000 -0.000000 16.399501 -6.066815 0.095108 1.237942 9.534182 2.425277 1.494456 3.275397 2.592466 -12.402498 0.253807 -31.168156 -10.576911 -7.943623 -4.383735 -3.955350 26.020964 -2.273832 11.475657 56.945029 -4.485568 -1.815649 -12.110429 -40.387376 -11.776985 -13.668057 -5.259044 -10.506165 6.186755 22.830375 -29.783880 -1.570662 27.188680 -21.550854 12.742231 59.326905 32.481486 20.807326 4.831064 +1.537137 92.571907 -4.863634 -97.718022 1.287761 10.833546 -4.098528 -4.107485 3.704114 24.905731 1.067681 -4.407505 -23.307016 -9.672529 9.841654 -0.000000 0.000000 0.000000 -12.847512 3.689169 -8.766390 25.344178 -1.085374 -0.891503 -8.872723 -0.378922 -16.011928 -0.000000 0.000000 -0.000000 13.910109 -5.988892 -0.247425 -0.412396 10.886045 3.221587 1.717612 3.631198 2.631310 -12.662406 0.006509 -32.539665 -10.598307 -8.833657 -3.313877 -4.590350 24.969786 -0.660453 12.166942 57.061622 -4.088169 -1.148147 -11.850797 -39.211573 -12.023979 -14.514470 -5.522116 -11.958101 9.783337 22.706789 -31.513702 0.010941 26.898051 -20.768266 10.942991 51.434673 31.455700 19.093147 4.692659 +1.275858 93.036491 -3.812885 -97.031077 1.640094 11.289286 -2.567955 -4.587997 3.352289 21.381009 0.826243 -5.581364 -21.873059 -9.516397 10.928592 -0.000000 0.000000 -0.000000 -11.257359 2.832786 -8.931597 22.235855 -1.203710 -0.469866 -8.300695 -0.558487 -16.973385 -0.000000 0.000000 -0.000000 11.449840 -6.091788 -0.602794 -1.692607 12.098386 4.057379 1.941843 4.199450 2.634830 -12.226352 -0.771455 -33.822786 -12.004423 -10.201569 -2.460594 -5.171951 24.545695 0.996551 13.206181 56.239478 -4.046828 0.393489 -12.822459 -38.303557 -11.441448 -12.181992 -5.917369 -13.549964 13.058722 22.675064 -32.940959 2.135284 26.714977 -19.765373 9.806980 43.074041 31.364497 15.037724 4.600295 +1.003449 93.328087 -2.850451 -96.237758 1.774879 11.672217 -1.736625 -5.006023 3.041677 19.053054 0.918289 -6.237079 -20.768359 -9.556736 11.615020 -0.000000 0.000000 -0.000000 -10.154546 2.494119 -9.218630 19.807391 -1.536790 0.101242 -7.953646 -0.326281 -18.093564 0.000000 0.000000 0.000000 9.853018 -6.031583 -0.681953 -3.091647 13.319296 5.055719 2.032473 4.829469 2.675334 -12.831151 -1.148943 -35.144771 -12.945039 -11.578299 -1.544469 -5.848594 24.132843 1.659284 15.106540 54.860626 -4.804353 0.688715 -11.830476 -37.391860 -11.707937 -13.353359 -6.695041 -14.005649 15.985046 22.744301 -34.398802 5.516668 25.783068 -19.782472 8.363319 35.408342 30.124559 10.339450 4.826883 +0.717928 93.590126 -1.936766 -95.718160 2.139436 12.332709 -1.133684 -5.946237 3.159964 17.464577 1.136063 -6.755918 -20.091254 -9.123728 11.657900 -0.000000 0.000000 0.000000 -8.899068 1.948301 -9.695514 17.704393 -2.012410 0.150743 -7.777366 -0.504512 -18.665304 -0.000000 0.000000 -0.000000 8.885892 -6.264568 -0.677977 -4.122054 14.299619 5.853237 1.527126 5.318765 2.691304 -13.121435 -1.231060 -36.618794 -14.293430 -12.421153 -0.902516 -5.695157 24.299419 1.755121 15.190824 53.742738 -4.281397 0.759061 -11.642265 -36.426635 -11.972959 -13.324277 -7.236764 -14.824742 18.704010 22.892999 -35.309456 7.668453 24.571419 -19.253905 7.686021 29.343673 29.079920 7.200938 5.012962 +0.533440 93.775383 -1.135015 -95.127093 2.274851 13.199415 -1.150790 -6.311737 2.922697 16.707059 1.011605 -7.230674 -19.405770 -8.779505 11.597566 -0.000000 0.000000 -0.000000 -8.108127 1.576406 -9.941399 16.215361 -2.175219 0.252510 -7.616309 -0.385067 -19.385252 0.000000 0.000000 0.000000 8.194708 -6.371811 -0.845759 -5.227742 15.063941 6.430111 1.262697 5.739322 2.614754 -14.099093 -0.804896 -37.375008 -14.492567 -12.653759 -0.222890 -5.960905 24.505104 2.443416 14.505765 53.225965 -3.507502 0.646333 -12.107968 -35.297001 -11.981967 -12.311232 -7.988086 -14.574565 20.205607 22.527864 -37.011720 9.411655 24.179254 -19.673742 7.184701 25.910575 28.354206 5.374493 5.218393 +0.408487 93.883057 -0.342347 -94.739920 2.444265 13.817417 -0.953806 -6.755217 2.957928 16.125648 0.865412 -7.581044 -19.300919 -8.500791 11.251407 -0.000000 0.000000 0.000000 -7.593956 1.186618 -10.458609 15.591341 -2.158068 0.273623 -7.685968 -0.329040 -19.369744 0.000000 0.000000 0.000000 7.436664 -6.294539 -0.877912 -6.034167 15.462105 6.688769 1.104284 5.878727 2.516830 -14.530565 -0.377667 -37.372749 -14.808721 -12.860557 0.322737 -6.093832 24.659471 3.176900 13.549708 53.369497 -2.623388 0.197674 -12.495280 -34.327346 -12.510663 -11.045618 -8.156343 -15.170258 21.216678 22.261927 -37.385500 9.339950 23.994960 -20.149911 7.236617 24.676023 26.902392 4.521748 5.536849 +0.400315 93.969292 0.372212 -94.484022 2.630267 14.631622 -0.673620 -7.114522 2.997010 15.548028 0.720569 -8.250828 -19.370165 -8.013491 11.130555 0.000000 0.000000 -0.000000 -6.744527 0.858513 -10.342655 14.519704 -2.395061 -0.235415 -7.588409 -0.357809 -19.851921 0.000000 0.000000 -0.000000 6.761317 -6.240986 -1.020073 -6.798034 15.533585 6.812614 1.109219 5.862239 2.376772 -14.697667 -0.194449 -37.104319 -14.890646 -12.613054 0.925107 -6.112728 24.297636 3.730348 12.821235 54.175200 -1.960793 -0.023299 -12.411988 -33.304442 -12.535603 -11.224463 -7.820797 -15.643991 21.677002 21.797409 -37.059226 8.576313 23.755419 -20.240595 7.245849 25.599749 26.709274 5.193788 5.534728 +0.463919 93.971184 1.045972 -94.375685 2.644000 15.104140 -0.239203 -7.209539 3.231211 15.151183 0.503501 -8.215931 -19.454361 -7.508870 10.619121 -0.000000 0.000000 -0.000000 -6.248073 0.828484 -10.673317 14.512887 -2.443506 -0.341599 -8.174073 -0.348375 -19.791662 -0.000000 0.000000 -0.000000 5.848885 -5.983499 -0.821793 -6.711634 15.390774 6.626606 1.184624 5.833845 2.377505 -14.524567 -0.134350 -36.763413 -15.485090 -12.307291 0.760114 -6.269009 23.999562 3.963268 12.475005 54.950756 -1.494879 -0.036138 -12.458219 -32.669559 -12.093738 -11.676208 -7.112626 -15.863566 21.226015 21.538801 -36.867505 8.086401 23.643056 -21.085735 7.256802 28.292285 26.973483 6.887139 4.989971 +0.620309 93.878456 1.669160 -94.385748 2.535273 15.708151 0.745486 -7.189704 3.229967 13.961639 0.488261 -8.361318 -19.134800 -7.041401 10.481369 -0.000000 0.000000 -0.000000 -5.647872 1.044230 -10.676205 14.374020 -2.641876 -1.130850 -8.477822 -0.301862 -19.590595 0.000000 0.000000 -0.000000 5.356714 -5.581117 -0.622030 -6.750971 14.987767 6.470898 1.161486 5.614540 2.315352 -14.339556 -0.248148 -35.848535 -15.857282 -11.324929 0.528678 -6.020571 23.882597 4.228333 12.254216 55.342075 -1.311301 0.167104 -12.083836 -32.722940 -12.097233 -11.949856 -7.355648 -15.439868 20.637075 20.624219 -36.277850 7.272474 23.788219 -21.792631 7.520278 32.512256 26.149646 9.987166 4.681630 +0.797191 93.815224 2.181300 -94.473734 2.414659 16.254125 1.329086 -7.071307 3.196751 13.642224 0.374197 -8.445541 -19.179338 -6.814912 9.992276 0.000000 0.000000 0.000000 -5.286999 1.168956 -10.610083 14.734168 -2.612342 -1.582077 -8.903323 -0.140576 -19.699651 0.000000 0.000000 -0.000000 4.944062 -5.287936 -0.436833 -6.616774 14.551786 6.221569 1.106958 5.389556 2.383840 -14.018691 -0.221118 -35.003052 -16.140398 -10.589300 0.250077 -5.738219 23.626148 4.289464 11.769635 55.705142 -0.594904 0.635285 -11.801563 -33.399113 -12.301511 -12.004320 -6.931483 -15.215192 19.941987 19.856233 -35.410115 5.819109 23.833868 -22.691067 8.139587 38.153809 25.491587 12.331164 4.187085 +1.036738 93.735123 2.515621 -94.571318 2.152447 17.279538 1.637170 -6.734782 2.859308 13.554835 0.232486 -8.573729 -19.253779 -6.630848 9.604861 -0.000000 0.000000 -0.000000 -4.963198 1.649099 -10.919057 15.153997 -2.729369 -2.396055 -9.504972 -0.004146 -19.421696 0.000000 0.000000 -0.000000 4.456666 -5.162197 -0.103093 -6.216255 14.108985 5.622785 1.282580 5.449634 2.202782 -13.970480 0.008067 -33.833687 -15.741970 -9.948079 -0.310406 -5.732448 23.450377 4.231287 11.334092 55.889788 -0.281122 0.014717 -11.427971 -33.591516 -11.753630 -12.724916 -6.508359 -15.494589 18.382605 19.354908 -34.074655 4.109897 24.364491 -23.306139 8.679784 44.892526 25.241262 13.620880 4.418704 +1.247459 93.630394 2.823757 -94.625090 1.874643 18.355561 2.057809 -6.552335 2.912727 13.147590 0.341085 -8.610142 -19.523876 -6.056506 8.662252 -0.000000 0.000000 -0.000000 -4.595817 2.116921 -10.956704 15.495080 -2.889930 -3.361500 -9.951185 0.240659 -19.181153 -0.000000 0.000000 0.000000 3.599138 -4.717072 0.110047 -5.299812 13.387550 4.844432 1.150297 5.144846 2.303805 -12.591316 0.312996 -32.842303 -16.064539 -9.269890 -0.967106 -5.922458 23.192705 3.871853 10.175240 56.496512 0.721191 -0.202028 -11.178479 -33.245895 -11.082508 -12.216921 -5.888446 -15.854074 17.066957 19.257545 -32.608723 0.837125 24.770045 -23.803275 9.952692 53.169255 24.738992 12.825627 5.385418 +1.438407 93.485397 3.073048 -94.861089 1.553260 19.351643 2.650573 -6.299766 3.012331 12.866737 0.242168 -8.727084 -19.651086 -5.731045 7.707031 -0.000000 0.000000 0.000000 -4.047140 2.557689 -11.260576 15.692781 -2.923469 -4.264826 -10.125375 0.263654 -18.679710 -0.000000 0.000000 0.000000 3.053304 -4.388220 0.360270 -4.362489 12.572236 4.083433 1.266011 4.831919 2.212123 -11.865921 0.744685 -31.490132 -15.595749 -8.235347 -1.317254 -5.776016 22.835434 3.632990 9.270515 56.985323 1.319978 0.014381 -10.850588 -33.675313 -11.413985 -11.740762 -5.623738 -15.909151 15.350499 19.152342 -30.608522 -2.374144 26.093281 -24.389396 11.110297 61.695576 24.469747 13.101993 5.959280 +1.564830 93.336525 3.150019 -95.115106 1.331815 20.337875 2.913962 -6.176222 2.853611 12.833593 0.269030 -8.874563 -19.837497 -5.752465 6.868454 0.000000 0.000000 0.000000 -3.798783 2.836698 -11.217395 16.074984 -2.995033 -5.137433 -10.408563 0.822808 -18.639172 -0.000000 0.000000 0.000000 2.581938 -4.093615 0.695831 -3.328780 11.628139 3.439369 1.362476 4.613807 2.421017 -11.236899 1.397646 -29.616667 -13.970900 -7.391610 -1.949722 -6.037048 22.209074 3.477000 8.907626 57.766365 0.998123 0.474937 -10.304504 -33.547363 -11.384236 -12.813533 -5.344670 -15.413891 13.601351 18.782318 -28.121475 -5.872771 27.221423 -25.078395 12.552653 70.773020 23.855284 14.259924 6.405127 +1.655343 93.297371 3.075656 -95.606460 1.001013 20.895258 3.347388 -5.678448 2.789747 13.099097 -0.170926 -8.911439 -19.853713 -6.015568 6.453047 0.000000 0.000000 0.000000 -3.459431 3.118210 -10.916159 16.641513 -3.028742 -6.206457 -10.479780 0.824436 -18.212185 -0.000000 0.000000 0.000000 3.207928 -3.938813 0.873898 -3.004830 10.914115 2.975288 1.278520 4.481516 2.650116 -10.143961 1.584989 -27.306107 -12.372826 -6.925077 -2.224570 -5.422220 21.912061 3.022072 7.982098 58.401263 1.792252 0.327019 -10.312361 -35.195415 -11.377156 -12.923569 -4.504688 -14.593694 11.330832 18.742498 -24.994171 -10.039602 28.734950 -25.384722 13.954554 79.630146 24.202562 14.730097 6.688639 +1.757620 93.224586 2.869437 -96.003190 0.587463 21.170624 3.688958 -5.182119 2.311228 13.300895 -0.207321 -8.414590 -20.089040 -6.287127 6.081064 0.000000 0.000000 -0.000000 -3.475339 3.653448 -10.849577 17.533500 -3.090828 -6.850077 -10.789257 0.934477 -17.767358 -0.000000 0.000000 -0.000000 3.746504 -3.653363 1.457772 -1.780034 10.143910 2.590011 0.641996 4.173968 2.989484 -8.046579 1.771933 -25.671923 -11.791088 -6.309838 -1.979207 -5.143790 22.164085 2.351544 7.516115 58.705304 2.045112 -0.179780 -9.806305 -36.019879 -11.138606 -13.505803 -4.002306 -13.065979 9.267191 19.007329 -21.333452 -13.323670 29.571575 -25.431944 15.097200 88.350226 23.806807 15.359979 6.651167 +1.761832 93.138397 2.360777 -95.922462 0.294865 21.722951 3.065991 -4.748719 1.814168 13.811342 -0.092050 -8.319517 -20.215008 -6.629237 5.627438 -0.000000 0.000000 0.000000 -4.277458 4.273717 -10.739364 18.675242 -3.206836 -7.739125 -10.993293 1.020135 -17.278745 -0.000000 0.000000 -0.000000 4.623691 -3.256789 1.952615 -1.273099 9.404303 2.368756 0.770472 4.086039 3.255812 -7.321110 1.645604 -23.313499 -9.315796 -5.820815 -2.194114 -4.637729 21.895583 1.856176 7.671181 59.496767 1.007243 -0.383691 -9.940123 -36.894180 -11.623511 -13.588708 -3.793141 -11.480916 6.629483 18.633014 -17.258082 -16.464122 30.932793 -23.881166 16.728511 95.292129 23.101941 15.534300 7.677310 +1.661439 93.067566 1.629972 -95.522409 0.274535 22.362144 1.454785 -4.357395 1.790770 14.985651 -0.304853 -8.332426 -20.500171 -6.614205 4.865206 0.000000 0.000000 -0.000000 -5.732972 4.657811 -10.567097 19.957865 -3.207218 -8.568880 -11.134630 1.154906 -16.966877 0.000000 0.000000 -0.000000 5.798681 -3.036456 2.043310 -0.939494 8.585863 2.158155 0.936175 3.774251 3.372543 -6.050518 1.379960 -21.339458 -7.609915 -4.865120 -1.305544 -3.939622 22.333736 1.605488 7.700072 59.913508 -0.017889 -0.978135 -9.736806 -38.243340 -11.926655 -14.584738 -3.412346 -10.124225 4.210882 18.544827 -12.318813 -19.707284 33.075688 -21.577690 18.547186 99.799798 23.335830 15.416251 8.923892 +1.491722 93.029160 0.623698 -95.307877 -0.020113 22.591719 0.030118 -3.637126 1.250379 16.206952 -0.398659 -8.127258 -20.500092 -7.118870 4.967902 -0.000000 0.000000 -0.000000 -7.632516 5.375378 -10.329826 22.073432 -3.240823 -8.955544 -11.578536 1.152729 -16.685655 0.000000 0.000000 0.000000 8.222298 -2.643262 2.483107 -0.347008 7.963308 2.293546 1.153061 3.454570 3.627109 -6.436670 1.600023 -18.654585 -4.821004 -4.165545 -0.862240 -4.249703 22.708796 1.396398 9.182263 60.206756 -2.099673 -0.972810 -9.663106 -39.394839 -12.776876 -15.089326 -3.144032 -8.954793 0.758439 18.469531 -7.280894 -21.505991 34.542002 -18.494511 20.091500 102.423773 24.016860 16.938414 8.628329 +1.267139 92.886299 -0.698065 -94.838958 -0.238349 22.905728 -2.244139 -2.882919 0.601390 18.069630 -0.374343 -8.034458 -20.673727 -7.683760 5.056400 0.000000 0.000000 -0.000000 -10.601251 6.260426 -9.881256 25.277362 -3.438055 -9.135828 -12.133079 1.631532 -16.760474 0.000000 0.000000 0.000000 11.707588 -2.406729 2.695531 -0.412087 7.399306 2.450132 1.501586 3.098889 3.818526 -6.603105 1.806379 -16.314016 -2.304744 -3.362266 -0.208619 -4.080085 23.395042 0.737537 10.933776 60.280742 -4.213810 -1.748119 -9.566259 -41.467917 -13.327282 -15.238207 -2.815780 -7.146353 -2.052932 19.162176 -2.822931 -22.862357 35.446043 -15.797517 21.786931 103.231712 25.710543 16.436730 7.590232 +0.964618 92.458488 -2.368803 -94.165464 -0.419907 23.599184 -6.145540 -1.994747 0.232928 21.982238 -0.643790 -7.782682 -21.278202 -7.729523 4.940238 0.000000 0.000000 -0.000000 -14.520484 7.475978 -9.831665 29.519958 -3.600954 -9.511294 -12.910246 1.697561 -16.183805 0.000000 0.000000 -0.000000 16.551902 -2.285915 2.857637 -0.770998 6.888276 2.600590 1.602557 2.838158 4.092680 -7.423082 2.048770 -14.056365 1.147156 -2.583144 -0.453781 -4.142728 23.725144 0.284344 13.374828 60.121277 -7.244213 -0.737178 -10.013819 -43.426087 -14.967000 -14.420786 -3.549123 -5.612888 -5.283721 19.539021 0.148498 -23.321631 35.398256 -12.110350 22.190656 101.213791 24.394540 16.215313 9.502296 +0.579342 91.637443 -4.188361 -93.193710 -0.488170 24.539078 -11.058955 -1.304264 -0.669062 26.940332 -0.382900 -7.455651 -21.830636 -8.257662 4.931175 0.000000 0.000000 0.000000 -18.974351 8.911311 -9.728993 34.180376 -3.976318 -9.738759 -13.878494 1.870407 -15.689832 0.000000 0.000000 0.000000 21.984971 -2.574784 3.429875 -1.459657 6.462508 2.825272 1.821733 2.711315 4.196412 -7.365321 2.604214 -12.557565 3.893381 -2.000932 -0.882748 -4.132327 24.248800 -0.888032 15.933039 59.342018 -10.424099 -0.236580 -9.865837 -45.356749 -15.488545 -15.569847 -3.738962 -4.172952 -7.954602 20.285612 2.229301 -23.612971 34.382617 -9.101734 22.277103 97.610136 26.151556 17.981027 8.703688 +0.074160 90.268532 -5.934994 -91.889528 -0.171199 25.529646 -17.246380 -1.281862 -1.043701 33.087181 0.406318 -6.304952 -23.282913 -8.213993 3.719894 -0.000000 0.000000 0.000000 -24.078638 10.503495 -9.624209 39.245084 -4.790758 -10.263277 -15.376923 1.968648 -14.957998 -0.000000 0.000000 0.000000 27.554148 -3.147242 3.857961 -2.038335 6.013212 3.087154 1.658226 2.449144 4.323286 -7.206826 3.522692 -11.774686 6.689549 -1.849576 -0.891188 -3.213120 24.932397 -2.840746 16.500954 58.421665 -11.847992 0.021624 -9.987750 -48.049793 -15.337558 -14.600268 -4.431224 -1.970516 -10.031184 21.889251 1.775029 -23.332562 32.235115 -6.453035 22.113162 93.094616 28.194447 17.258981 8.488381 +-0.498051 88.601662 -7.517707 -91.518102 0.042765 26.008425 -22.805616 -1.444645 -1.749186 40.012823 1.186353 -5.772042 -24.507085 -8.599653 3.368428 -0.000000 0.000000 0.000000 -28.393388 12.024207 -9.403112 44.572398 -5.991588 -10.665260 -16.656760 1.987403 -14.079809 -0.000000 0.000000 -0.000000 34.434183 -4.062811 4.605451 -2.461721 5.878325 3.437661 1.292637 2.308201 4.611577 -6.798556 4.801100 -11.390175 8.640609 -2.299302 -0.927141 -2.280491 25.218360 -5.120042 17.059325 57.778547 -13.393492 0.122126 -10.489740 -50.550760 -16.914884 -16.133994 -4.738836 -0.363897 -11.166542 23.706034 0.445686 -23.659500 29.950388 -4.350598 21.381804 87.159405 29.470651 17.024849 8.808990 +-1.200131 86.084221 -8.973151 -90.427600 0.326293 25.499560 -29.731283 -1.615706 -1.886638 48.049305 1.925024 -4.738361 -26.038706 -9.157285 2.865518 0.000000 0.000000 -0.000000 -34.652713 13.875548 -9.109879 51.354798 -6.921912 -10.003165 -18.073833 2.432634 -12.934778 0.000000 0.000000 -0.000000 40.673688 -4.199311 5.165171 -3.140634 6.151389 3.952701 1.769667 2.045552 4.858576 -7.081198 5.612249 -10.887103 8.295960 -2.396803 -0.855989 -2.645199 24.969522 -5.725622 16.890512 57.161636 -13.750633 1.159161 -11.440007 -54.205901 -18.581622 -15.995676 -4.900581 0.120707 -11.126483 25.133043 -1.003377 -23.989716 29.408174 -2.437568 20.496247 80.508737 31.398950 17.399276 7.519913 +-1.770502 83.050812 -10.359635 -89.060390 0.879422 25.005360 -37.161857 -1.800380 -3.382080 56.089682 3.685769 -3.458264 -27.700418 -10.108390 2.835927 -0.000000 0.000000 -0.000000 -41.463558 16.010762 -7.813265 58.363154 -8.833367 -9.484371 -19.611343 2.904689 -12.050870 0.000000 0.000000 -0.000000 46.477555 -4.465828 5.411278 -3.596875 6.331994 4.310258 1.780755 1.900536 5.038265 -6.871126 6.729507 -10.866450 7.060620 -2.439970 -0.196709 -2.506403 25.357880 -6.357094 16.614757 55.926000 -13.381084 0.878229 -11.984091 -58.639886 -20.092170 -15.517317 -5.703188 1.387626 -11.127201 27.134050 -3.413772 -22.838062 29.044415 -1.041286 19.506341 74.187938 34.055545 17.424196 6.817777 +-2.259518 79.456794 -11.385612 -86.994553 1.272875 24.876785 -45.057959 -1.298349 -4.833258 63.937557 5.030742 -2.817340 -29.591036 -10.824436 2.735366 0.000000 0.000000 0.000000 -49.089972 18.580722 -5.814176 65.581341 -10.770238 -8.836079 -21.624621 2.979237 -11.203060 -0.000000 0.000000 -0.000000 51.789644 -4.859315 6.067749 -5.256756 6.794188 4.342703 1.727389 1.987103 5.021462 -4.595605 7.937924 -11.639982 4.598589 -3.015723 0.286705 -1.560586 25.728850 -7.719842 15.963609 54.464728 -12.335521 0.881787 -12.689347 -62.268122 -21.597523 -16.349724 -5.838844 2.803448 -10.955221 29.168516 -5.756008 -21.652219 28.289675 0.592452 18.364003 68.402709 36.221633 18.848901 5.191716 +-2.548299 75.688247 -12.271447 -86.363710 0.747678 24.622491 -50.983573 -0.521307 -6.570255 71.698450 7.058914 -2.235522 -31.853819 -11.615256 2.823905 0.000000 0.000000 -0.000000 -55.400148 21.234478 -3.139431 73.229656 -12.439464 -7.712080 -23.703070 3.173078 -10.334114 0.000000 0.000000 -0.000000 57.508973 -5.509946 6.936904 -4.653197 7.461943 4.423210 1.334805 2.194039 4.922802 -3.915590 9.469510 -12.754862 2.537333 -3.492692 0.436115 -1.224727 25.731386 -9.656985 15.750850 54.001288 -12.152445 0.185443 -13.910173 -64.773758 -21.725508 -15.717988 -5.666967 3.377059 -9.811480 31.494018 -8.462976 -19.693872 26.628520 1.308910 17.018236 63.371247 38.489559 19.358961 3.943142 +-2.789816 71.373435 -12.761849 -86.015081 0.225728 24.168637 -56.902803 -0.266532 -7.121037 79.850248 8.219382 -2.291049 -34.454707 -12.796634 2.575064 0.000000 0.000000 -0.000000 -61.974808 22.954611 -0.484560 81.410017 -13.012640 -6.200633 -25.577123 3.802309 -10.117208 0.000000 0.000000 0.000000 61.752237 -5.680975 7.529486 -3.666755 7.730623 5.028708 1.049672 2.160072 5.079249 -3.183437 10.263093 -14.022280 1.321669 -3.261114 -0.144638 -0.974753 26.169251 -10.904188 16.025111 53.365844 -12.944253 0.152869 -14.327877 -66.288110 -22.119418 -16.625326 -5.323856 3.904657 -9.104194 33.093982 -10.547567 -17.496438 25.789178 2.093244 15.637130 57.955575 39.984152 19.481554 3.240235 +-2.750647 66.806564 -13.062348 -84.929349 -0.234098 24.601022 -63.576436 1.274279 -8.808875 88.009488 10.124241 -2.568587 -36.817260 -14.468622 2.876678 -0.000000 0.000000 0.000000 -69.511308 25.279542 3.567468 89.573002 -14.173393 -4.636627 -27.576749 3.695494 -10.182019 0.000000 0.000000 -0.000000 65.379804 -6.544835 8.242385 -4.899518 7.550653 5.104913 0.850217 2.482127 5.138562 -0.766156 11.461784 -15.977656 -0.162738 -3.522207 -0.043845 -0.196145 26.699575 -11.742757 16.002467 52.860268 -12.412475 0.373048 -14.520493 -67.516831 -22.420214 -17.136855 -5.313677 5.525539 -8.789745 35.037039 -12.280756 -15.317823 24.723070 2.788754 13.899849 53.047815 41.469454 20.403215 2.294301 +-2.594298 62.441753 -13.181099 -84.793851 -0.643784 24.581883 -69.196689 2.052691 -10.401133 96.123532 11.800706 -3.652191 -38.582349 -15.673106 3.279150 0.000000 0.000000 0.000000 -75.992750 26.314344 7.299935 96.963180 -14.489126 -3.015685 -29.144185 4.425270 -10.176329 -0.000000 0.000000 -0.000000 68.344714 -7.164477 9.120551 -5.487831 7.350896 5.594796 1.182346 2.315947 5.664326 2.755590 12.481860 -18.840016 -3.651383 -4.175621 0.231549 1.389504 27.930750 -14.163937 15.570443 52.033633 -11.316335 -0.594051 -14.254103 -69.076691 -21.980805 -17.811582 -5.095487 7.609788 -8.479929 37.573021 -14.948695 -11.773589 22.058205 3.377617 13.086987 49.947689 43.611856 21.060157 1.657132 +-2.549329 58.461116 -13.269202 -85.029266 -0.800134 23.998767 -74.060617 2.371211 -11.777255 103.842596 12.838665 -5.133146 -40.260348 -16.941495 3.930341 0.000000 0.000000 0.000000 -81.739250 26.431624 10.257552 103.565874 -14.578891 -1.069089 -29.989359 5.569828 -10.737065 0.000000 0.000000 -0.000000 69.700516 -7.289218 9.809481 -5.097094 7.109914 6.337025 2.676652 1.940283 6.166234 5.410127 12.959011 -20.987524 -6.852926 -5.238173 0.272925 3.196454 28.707019 -16.949942 15.552083 50.975782 -11.578953 -1.849285 -14.514278 -70.667182 -23.200032 -20.248948 -4.711205 8.590906 -7.756595 39.375762 -17.079781 -8.764942 20.481018 4.310243 11.741120 46.676701 42.875771 22.426557 0.611278 +-2.578658 55.386550 -13.377813 -85.449568 -1.333160 23.548742 -77.437970 3.283633 -12.385118 109.960802 13.394671 -6.020228 -42.048022 -18.192733 4.370428 -0.000000 0.000000 -0.000000 -85.845194 26.741625 12.602430 108.893274 -14.533315 0.226613 -31.429070 5.639389 -10.659418 -0.000000 0.000000 0.000000 71.021431 -7.262496 10.577115 -4.319423 6.943621 6.329464 4.290754 1.613505 6.169121 5.847905 12.870069 -22.018445 -8.543012 -5.597872 -0.134967 3.886974 29.109804 -18.866511 15.237667 50.640835 -12.592723 -3.129206 -15.017141 -71.809257 -23.010166 -21.034402 -3.223464 8.577494 -6.951934 40.353147 -18.270940 -7.026322 20.193205 5.423722 12.310246 44.251184 43.538428 23.693968 -0.621099 +-2.674498 53.024806 -13.480196 -86.060111 -1.681968 23.049193 -79.889388 3.982730 -13.244196 114.820317 13.868495 -6.764531 -42.910780 -19.268432 5.038308 -0.000000 0.000000 -0.000000 -88.667967 26.697731 14.168901 112.734878 -14.402636 1.576323 -32.287704 6.123085 -10.827263 -0.000000 0.000000 0.000000 72.361786 -7.158689 10.906041 -3.249535 6.883119 6.147705 5.574616 1.472782 6.114820 4.181814 12.752772 -21.743721 -8.916521 -5.807685 -0.268870 3.062911 28.652636 -19.190917 15.870638 50.842171 -14.361765 -3.735015 -15.515895 -73.204085 -24.521599 -21.945066 -3.361430 7.840129 -5.959238 40.512894 -18.783011 -6.246975 20.724563 6.363069 13.256695 43.395265 45.456704 24.436205 -1.205544 +-2.795192 51.342208 -13.424963 -86.746731 -1.361654 22.809758 -81.698004 4.296352 -14.066640 118.225418 13.589262 -7.058931 -43.496688 -19.717340 5.539288 -0.000000 0.000000 0.000000 -90.143465 26.364450 14.973559 115.183437 -14.754166 1.957320 -32.926053 6.868903 -10.975834 0.000000 0.000000 -0.000000 72.645350 -7.067010 10.885336 -2.351706 6.562721 6.348903 5.410495 1.431021 6.477289 5.196639 12.372804 -21.762099 -9.305455 -6.066293 -0.406219 3.538063 28.648598 -20.293193 16.302595 50.214196 -15.039090 -4.476889 -15.843409 -74.546485 -25.578990 -22.768276 -3.333555 8.657509 -6.073260 41.191935 -19.066537 -5.060174 20.728009 7.638340 12.349021 42.985936 44.392243 25.290756 -3.494492 +-2.880547 50.374396 -13.312890 -87.502028 -1.284744 22.513849 -82.177479 4.093391 -14.662234 120.117671 13.531209 -7.420904 -44.295702 -19.569327 5.255592 0.000000 0.000000 -0.000000 -90.593610 26.035902 15.160378 116.890251 -14.822581 2.081181 -33.257245 7.413264 -10.837613 -0.000000 0.000000 -0.000000 72.565853 -6.831080 10.280510 -1.292514 6.439653 6.559155 4.876360 1.679967 6.758092 5.107697 11.991096 -21.232299 -8.812645 -6.054193 -0.709154 3.397123 28.267671 -20.114502 16.280538 50.471944 -15.777279 -4.921231 -16.567879 -75.698760 -26.259775 -22.475586 -4.101930 8.723462 -6.184035 41.062239 -18.670060 -6.272549 21.108264 7.909501 14.152788 43.085194 45.460211 24.754946 -1.602628 +-3.069992 50.665542 -13.303560 -87.823053 -0.601302 22.299084 -81.832709 3.411967 -15.076916 119.745897 13.267702 -7.463224 -44.259437 -19.466567 5.030324 -0.000000 0.000000 -0.000000 -89.340075 25.817103 14.096396 116.234728 -15.297716 2.031966 -33.324530 7.496892 -10.884086 0.000000 0.000000 -0.000000 72.233293 -6.907715 9.460567 -1.344888 6.573384 6.723528 4.384232 2.111812 6.677440 2.355370 12.455772 -19.578127 -6.460821 -5.522070 -0.374869 1.961502 27.314378 -17.662624 16.225822 51.867767 -16.653712 -4.087696 -17.713343 -76.697347 -28.018376 -22.610002 -4.279933 8.342222 -6.119900 40.106801 -18.431825 -9.294214 23.321061 7.355934 15.285475 44.108742 44.310976 25.716657 -1.459037 +-3.265053 52.043139 -13.316243 -88.075114 0.104833 22.140025 -80.126462 2.980772 -14.651162 117.445270 12.366037 -6.614374 -43.907325 -19.342903 4.716049 0.000000 0.000000 0.000000 -86.575629 25.407039 12.105945 114.072882 -15.508385 1.658137 -32.982223 7.059530 -10.840719 -0.000000 0.000000 -0.000000 71.793455 -7.031011 8.776753 -1.596578 6.928134 6.558156 3.728891 2.517225 6.478772 -1.275749 12.967032 -17.697781 -3.938181 -4.820802 -0.005507 -0.080131 26.259035 -14.894228 16.046214 53.682382 -17.065804 -2.790231 -18.911952 -76.896551 -29.267803 -20.800685 -4.320181 7.202061 -5.755834 38.821283 -17.211429 -13.216724 25.201699 6.165659 17.769320 47.307784 43.045798 24.694617 0.583827 +-3.171849 54.745334 -13.243551 -89.033931 -0.363420 21.825170 -75.426325 2.764535 -13.573667 112.716244 11.745349 -4.906304 -43.147388 -18.898441 4.773725 0.000000 0.000000 -0.000000 -81.417895 25.397254 9.567561 109.673153 -14.927470 0.626110 -32.363949 6.502118 -10.626197 0.000000 0.000000 0.000000 73.144334 -6.814252 8.424101 -1.710537 7.561909 5.339518 1.838185 3.246563 5.788077 -6.008023 12.931974 -14.856132 -0.678112 -4.133491 0.124805 -2.876770 24.535614 -11.745822 16.936291 55.863554 -17.518606 -1.141314 -18.998022 -76.203952 -30.218010 -20.802452 -5.145751 5.136953 -5.931031 37.010993 -14.381650 -17.488718 27.777795 3.319432 20.113427 52.807576 45.154703 25.959916 0.028012 +-3.011989 58.035655 -13.150704 -90.424345 -0.891110 21.696546 -69.682383 2.207088 -11.544650 107.005499 10.496702 -3.879318 -42.330692 -18.512119 5.206816 0.000000 0.000000 0.000000 -74.963359 25.495600 6.381232 104.529442 -14.198693 -0.361234 -31.735692 5.936031 -10.308196 -0.000000 0.000000 -0.000000 72.225378 -6.689738 8.505463 -1.161743 7.975239 4.180777 1.893022 3.132003 5.183947 -7.715973 12.927203 -13.365369 -0.806704 -3.560681 0.496161 -3.302652 24.589454 -11.608288 15.297477 56.320997 -16.177516 -0.801212 -18.185718 -75.307096 -29.138710 -20.942697 -5.229852 4.186910 -6.548890 36.282116 -13.847366 -18.694748 28.862081 1.924483 20.955118 58.735637 46.512773 28.617394 -1.127981 +-2.989919 61.763370 -13.131526 -91.456267 -0.775842 21.605256 -64.128663 1.322113 -9.690882 100.942404 8.798295 -3.025094 -41.788495 -17.915883 4.576512 -0.000000 0.000000 0.000000 -68.404351 24.663517 2.994515 98.594061 -13.816417 -1.545563 -30.856238 5.816313 -10.371465 0.000000 0.000000 0.000000 68.065730 -6.419401 8.180986 0.143872 8.019611 3.743660 3.077625 2.602140 5.209712 -7.825205 12.888967 -13.169272 -2.194913 -3.431972 0.622795 -2.655252 24.850169 -12.973751 13.678594 56.541231 -14.836474 -1.540695 -17.546923 -73.501893 -27.188526 -19.636369 -4.841140 3.386255 -6.669949 36.122363 -13.897335 -18.997893 28.296409 0.053371 22.682336 65.359177 44.575178 26.134897 2.154285 +-2.719831 65.670203 -12.898109 -93.487541 -1.351019 21.056535 -56.662938 0.370545 -7.845655 94.448852 7.767356 -2.259241 -41.318169 -16.765185 4.212111 -0.000000 0.000000 -0.000000 -60.833394 23.559481 -0.129443 92.512892 -12.808079 -2.914854 -29.946730 5.393560 -10.212949 -0.000000 0.000000 0.000000 65.744960 -6.051305 7.685176 1.517736 8.414107 3.253899 2.379131 2.725258 5.057444 -9.360649 12.056784 -12.086798 -1.994886 -2.924168 0.703752 -3.517331 24.448719 -12.032716 13.191790 57.364401 -13.656677 -1.051418 -17.397307 -70.738194 -27.409930 -18.730280 -5.029474 1.930504 -6.863696 35.166358 -12.355094 -20.312959 29.730881 -1.714513 23.798102 70.693435 44.197713 26.291580 2.605215 +-2.497229 69.474105 -12.634369 -94.646167 -1.198008 21.092449 -50.687117 -0.410480 -5.944410 87.824084 6.037996 -1.893829 -39.925818 -16.159947 4.171070 -0.000000 0.000000 0.000000 -54.415950 21.981584 -3.197039 86.067141 -11.872408 -3.968021 -28.810237 5.520484 -10.705113 -0.000000 0.000000 -0.000000 60.970192 -5.779372 7.226333 1.779986 8.293162 3.131121 3.376194 2.373342 5.282759 -9.342203 11.448403 -12.131378 -3.335689 -2.818127 1.156034 -2.671793 25.054430 -12.852560 11.476040 57.299795 -11.479565 -1.920469 -16.352411 -67.898966 -25.187151 -19.406884 -4.377043 1.192637 -6.971976 35.101470 -12.358765 -20.207748 30.025919 -3.589505 23.988805 75.451383 43.578826 26.820825 3.214311 +-2.171700 73.072593 -12.143733 -96.027564 -1.330878 20.670529 -44.317761 -1.089402 -4.552675 81.195101 4.956690 -1.387528 -38.685300 -15.279881 4.112112 0.000000 0.000000 0.000000 -48.062976 20.160146 -5.481279 79.693552 -10.725883 -4.748634 -27.607606 5.166625 -11.158544 -0.000000 0.000000 -0.000000 57.395364 -5.260110 6.689331 2.394819 8.615243 2.963077 2.005011 2.373666 5.338456 -9.717110 10.334272 -11.828647 -4.250380 -2.695149 1.472161 -3.541666 24.755560 -11.276383 11.305514 57.840453 -9.485300 -1.233850 -15.788190 -64.682238 -25.047980 -19.450875 -4.308222 0.063533 -6.946084 34.341056 -11.327102 -20.987960 31.778783 -5.665668 24.653498 79.197584 43.348198 26.008649 2.084666 +-1.762111 76.235038 -11.411603 -97.567303 -1.466649 20.750368 -37.963439 -1.391556 -3.332576 74.721737 3.476478 -1.664709 -37.431828 -14.405087 4.480182 -0.000000 0.000000 -0.000000 -41.999061 18.365041 -7.548121 74.023360 -9.423296 -5.931646 -26.111343 4.697763 -11.450917 0.000000 0.000000 0.000000 54.258016 -4.848606 6.002952 3.032522 8.782978 2.813114 0.050605 2.520900 5.229930 -11.195074 8.908382 -11.658819 -4.504950 -2.586358 1.004385 -4.508028 24.713949 -9.173476 10.047390 57.642343 -6.577072 0.243056 -15.114479 -61.369765 -23.149654 -18.164826 -3.659783 -1.534533 -6.804107 33.540703 -10.694781 -21.477167 34.151941 -7.387637 24.579642 81.011308 44.990575 26.511602 0.809214 +-1.409460 79.166908 -10.588551 -98.513691 -1.318777 20.466152 -32.528792 -1.937983 -2.338497 68.621145 2.480825 -1.788279 -35.709211 -13.467879 4.935340 0.000000 0.000000 0.000000 -36.931361 16.083479 -8.765155 68.358416 -8.278318 -6.521695 -24.547567 4.675759 -12.075046 -0.000000 0.000000 0.000000 48.956857 -4.453659 5.537375 3.712606 9.183066 2.786874 0.127980 2.607378 5.531450 -11.024557 7.854232 -13.066146 -7.186074 -3.468176 1.359346 -3.995418 24.795935 -9.923433 9.065509 57.171044 -4.567479 -1.038708 -14.007901 -58.146098 -21.575992 -18.858399 -3.896989 -2.499335 -6.105751 34.273025 -12.634575 -20.334337 34.274969 -9.736047 23.409068 82.427816 42.856472 26.085867 2.447389 +-1.088961 81.860008 -9.639457 -99.210971 -1.155311 20.641622 -27.683976 -2.201184 -1.794432 62.773368 1.596573 -2.485333 -34.098507 -12.843683 5.517377 -0.000000 0.000000 0.000000 -32.123624 14.113098 -9.566756 62.716663 -7.484341 -6.881648 -22.963869 4.259279 -13.051756 0.000000 0.000000 0.000000 44.263588 -4.404483 5.146346 3.339027 9.516404 3.169021 0.209190 2.849550 5.689566 -11.740814 6.786939 -14.441523 -7.993749 -3.607115 0.356578 -4.205372 24.806932 -9.154359 9.003033 56.921355 -3.764127 -1.042877 -14.205559 -54.511379 -20.421520 -18.079820 -3.537047 -4.118961 -4.555820 33.650097 -14.351516 -19.580652 35.594667 -11.745329 22.758777 81.624062 39.779833 24.800827 3.296966 +-0.763345 84.217605 -8.731353 -99.244608 -0.718688 21.213112 -23.929850 -2.275508 -1.744777 57.405375 0.755213 -2.946823 -32.519515 -12.134738 5.947969 0.000000 0.000000 -0.000000 -28.442067 12.283357 -9.977962 57.372730 -7.102625 -7.444470 -21.265197 4.092629 -14.203360 0.000000 0.000000 -0.000000 39.278531 -4.386680 4.781564 2.531552 9.817652 3.396076 0.314218 3.066042 5.789644 -12.121770 5.639262 -16.148241 -8.941189 -3.919830 -0.137708 -4.900558 24.565459 -7.998946 9.502450 56.961259 -3.599122 -1.466136 -14.257597 -50.542398 -18.923028 -17.865237 -3.342482 -5.754140 -3.154398 33.052298 -16.615146 -17.706506 36.665406 -13.012710 21.414170 79.271800 38.145360 24.321776 4.596111 +-0.476722 86.226013 -7.595542 -99.384395 -0.729189 21.907056 -19.946174 -2.400764 -1.094262 51.941096 -0.113406 -3.981562 -31.093732 -11.327304 6.090905 0.000000 0.000000 -0.000000 -24.557472 11.050095 -10.769813 52.344786 -6.455735 -7.838202 -20.024441 3.859046 -14.718591 0.000000 0.000000 0.000000 34.435134 -3.965686 4.339878 2.414075 10.400368 3.631419 0.261729 3.282114 5.998689 -12.389178 4.397791 -17.666741 -9.820923 -4.707249 -1.079977 -5.425528 24.268086 -7.274540 10.132722 56.679023 -3.855461 -2.205198 -13.697948 -47.502478 -18.131902 -16.873659 -3.767790 -7.659889 -1.181855 32.445414 -19.177859 -15.576199 36.948274 -14.509969 19.324470 75.756970 35.656249 23.543221 4.064963 +-0.172826 87.925926 -6.427801 -99.072181 -0.714278 22.665865 -16.624162 -2.493134 -1.075999 46.649654 -0.254610 -5.325084 -29.461375 -11.102493 6.712102 -0.000000 0.000000 -0.000000 -21.444479 10.166855 -11.315473 47.835338 -6.103300 -7.455248 -18.623863 3.487054 -15.889131 -0.000000 0.000000 0.000000 29.493090 -3.611832 4.115457 1.943727 11.096886 3.934494 0.533799 3.673829 5.868648 -12.484145 3.428534 -19.751299 -10.726499 -5.622110 -1.900049 -5.775444 24.019249 -6.429740 11.127798 55.999094 -4.435276 -2.497231 -13.549617 -45.116176 -17.947227 -17.543830 -3.843295 -9.190991 1.186987 31.956797 -22.264770 -12.882321 37.064794 -15.993985 16.714914 70.936379 31.965739 23.346490 3.294140 +0.115758 89.424370 -5.195081 -98.777380 -0.596651 23.582595 -13.411701 -2.759078 -0.503166 41.323864 -0.865021 -6.761449 -28.155952 -10.264144 6.892235 0.000000 0.000000 0.000000 -18.372943 9.206387 -12.246597 43.108568 -5.547516 -7.386172 -17.458656 3.049202 -16.742818 0.000000 0.000000 -0.000000 25.497635 -3.435549 3.703176 1.134135 12.082092 4.432377 0.395186 3.914660 5.721204 -12.471510 2.937130 -22.334455 -11.468232 -6.694308 -1.964622 -6.038949 24.080684 -5.341496 11.578079 54.844342 -4.226869 -2.307786 -13.092248 -43.841247 -17.384447 -17.791244 -4.444531 -10.813133 3.949832 31.490992 -25.347239 -10.024729 36.690596 -17.074278 13.632057 65.110128 29.057660 22.644602 3.709145 +0.348992 90.728546 -3.980935 -98.114286 -0.388682 24.396354 -10.764627 -3.218115 -0.174272 36.002364 -0.856524 -8.105685 -26.512970 -9.866096 7.064993 -0.000000 0.000000 -0.000000 -15.718240 8.194552 -13.104937 38.342500 -4.887656 -7.109932 -15.852825 2.781465 -17.573433 -0.000000 0.000000 -0.000000 21.573061 -3.252983 3.413289 0.124681 13.357862 4.935742 0.431677 4.351510 5.764232 -12.479050 2.584734 -24.994504 -12.290202 -8.228357 -2.319108 -6.451235 23.489275 -4.232667 11.806904 54.359176 -3.923169 -2.480723 -12.934804 -43.163630 -15.995357 -18.315341 -4.490906 -12.548173 7.317717 31.125702 -28.408283 -7.267487 35.271287 -17.679448 11.643814 58.961646 29.503234 22.462916 2.936312 +0.509705 91.788956 -2.871712 -97.090952 -0.120227 25.557238 -8.653482 -3.659781 0.371840 30.429676 -0.973477 -9.847920 -24.284888 -9.032581 7.197455 0.000000 0.000000 0.000000 -13.516294 7.187036 -13.813508 33.504042 -4.292101 -6.967181 -14.641679 2.320405 -18.758937 0.000000 0.000000 -0.000000 18.464536 -2.993681 3.025060 -1.697497 14.660625 5.644707 0.745404 4.994031 5.792647 -12.880354 2.159566 -27.471057 -12.515508 -9.847596 -3.502085 -7.032008 22.898688 -3.015175 13.283585 53.355801 -5.274252 -2.107364 -12.643174 -41.577991 -15.659284 -19.604801 -5.095737 -13.935527 10.283352 30.110446 -30.888851 -4.008598 34.251321 -18.458546 9.649420 52.816902 27.538301 21.887259 2.921863 +0.669789 92.680984 -1.812433 -95.671990 0.294602 26.720634 -7.029528 -3.941907 0.792973 24.774695 -1.000086 -11.041243 -22.158018 -7.901046 7.094355 -0.000000 0.000000 -0.000000 -11.930399 6.369119 -14.556139 28.797532 -3.735576 -6.918829 -13.301588 1.840637 -19.647175 0.000000 0.000000 -0.000000 15.531049 -2.795714 2.910650 -3.373344 16.153453 6.533214 0.671185 5.647954 5.672691 -12.283523 2.000985 -30.503311 -14.375206 -11.743449 -4.162276 -7.360607 22.921664 -2.361704 13.918437 51.779543 -5.794980 -2.159565 -11.981508 -40.122496 -14.816867 -19.850335 -5.616510 -14.729561 13.799683 29.399771 -33.236670 -0.859095 31.847002 -20.357611 7.764642 47.475376 25.081863 21.014193 2.878086 +0.854425 93.343636 -0.838130 -94.730178 0.808153 28.233121 -5.391544 -4.412999 0.871364 19.788493 -1.125194 -12.055833 -20.085714 -6.599354 6.781887 0.000000 0.000000 -0.000000 -10.327824 5.341984 -15.153697 24.805140 -3.322585 -7.489578 -12.387708 1.152678 -20.349126 0.000000 0.000000 -0.000000 13.672798 -2.707384 2.700384 -4.633258 17.352989 7.087136 0.115612 6.161351 5.526863 -11.435089 1.594067 -32.507531 -16.580653 -12.619957 -4.356395 -7.917933 23.024038 -1.550072 14.695565 50.774139 -6.190980 -2.428270 -11.894187 -38.736399 -13.975905 -18.229667 -6.237066 -15.701307 16.622519 28.574012 -35.147807 2.308133 30.133205 -21.206058 6.136782 42.248231 23.900288 19.785811 3.104712 +1.005981 93.748108 0.084112 -94.078586 1.349494 30.195873 -4.340791 -5.163174 0.945252 16.202039 -1.047849 -13.732499 -18.703133 -5.919694 6.512792 0.000000 0.000000 -0.000000 -8.886516 4.299075 -15.976999 21.711567 -3.061385 -7.457823 -11.628337 1.370132 -21.554634 0.000000 0.000000 -0.000000 12.570294 -2.754867 2.289427 -6.500750 18.404446 7.598389 0.283331 6.621679 4.977062 -11.788070 1.849182 -34.523769 -16.092691 -13.693189 -3.809295 -8.155310 23.082101 -0.593625 14.807146 49.852744 -6.391563 -2.240011 -12.127777 -37.576156 -14.279480 -17.552860 -6.950864 -16.605365 19.372765 28.058689 -36.705907 5.577768 28.599853 -21.310373 4.800837 36.419751 22.711015 18.258324 3.652065 +1.080761 94.014404 0.918211 -93.823500 1.762801 31.304666 -3.344417 -6.194756 0.964612 13.674696 -0.412591 -14.856868 -17.902365 -5.618367 6.267579 -0.000000 0.000000 -0.000000 -7.796028 3.335259 -16.205488 19.855165 -3.013972 -7.242074 -11.559764 1.556140 -22.705408 -0.000000 0.000000 -0.000000 11.835375 -2.752986 1.855322 -7.792123 19.461395 8.263779 0.287153 7.071566 4.704116 -11.868210 1.568062 -36.803715 -15.624450 -14.783237 -3.024390 -8.776910 23.351272 0.479649 14.666231 48.591577 -6.119697 -2.529287 -11.661328 -37.069256 -13.238820 -17.935325 -7.042815 -17.360437 21.528919 27.801886 -37.992642 8.365412 27.563705 -21.717753 3.638151 31.135501 23.348159 18.032489 3.171460 +1.090608 94.203690 1.681843 -93.593386 2.338196 31.718825 -2.807873 -7.106815 1.198314 12.120632 -0.249656 -15.333088 -17.640637 -5.325042 6.051388 -0.000000 0.000000 0.000000 -7.211104 2.282061 -16.216952 18.580575 -2.826304 -7.056038 -11.428973 1.707743 -23.377355 0.000000 0.000000 -0.000000 10.857301 -2.493821 1.461068 -8.834249 20.101488 8.840270 -0.098973 7.407352 4.666649 -11.465177 0.716230 -38.310007 -15.136809 -15.468182 -2.529395 -8.558035 23.571848 1.040396 14.206431 47.496910 -5.181620 -2.473364 -11.652644 -36.694455 -13.247405 -17.928452 -7.458132 -17.585980 23.064294 27.761049 -39.409981 9.263105 27.201598 -23.165198 3.313783 26.945652 22.799408 18.329982 3.438314 +1.098632 94.304771 2.417951 -93.692429 2.615277 32.033442 -2.026156 -7.863981 1.164779 11.074885 0.074737 -15.511756 -17.160952 -5.013982 6.187104 0.000000 0.000000 -0.000000 -6.247583 1.498519 -15.925479 17.407832 -2.899563 -7.199185 -10.970321 1.610778 -23.866092 0.000000 0.000000 0.000000 9.843115 -2.075525 1.225488 -9.367393 20.445995 9.056679 -0.242673 7.656749 4.441393 -11.248134 -0.136043 -38.766013 -14.575652 -15.660084 -2.185930 -8.559786 23.310439 1.949174 13.675745 47.086089 -4.748716 -2.452781 -11.697492 -35.638033 -13.201966 -17.227005 -7.617320 -17.429220 23.414255 27.101351 -39.732333 8.998622 27.643333 -23.379171 3.697083 24.529829 22.201937 18.075128 3.187140 +1.115237 94.319878 3.134432 -94.249678 2.643720 31.731403 -0.660297 -8.400620 1.239540 10.364321 0.048799 -15.691254 -17.501352 -4.974495 6.567128 -0.000000 0.000000 -0.000000 -4.936626 0.788605 -15.619150 16.711520 -2.893070 -6.992023 -11.364632 1.488843 -23.997861 0.000000 0.000000 -0.000000 8.907891 -1.714522 1.160184 -9.576292 20.429482 9.295428 -0.082080 7.789478 4.547700 -10.551182 -1.225799 -39.179910 -14.925848 -15.133465 -2.371226 -8.631905 22.789800 3.439678 13.296291 46.608261 -5.034309 -1.373927 -10.910867 -34.729958 -13.712278 -17.175113 -7.530061 -17.340321 23.704795 26.221545 -39.400116 8.121282 28.224359 -22.735807 3.803499 22.725940 22.400413 18.407474 3.116223 +1.149899 94.206474 3.627843 -94.642629 2.584128 30.784918 0.047040 -8.631503 1.337011 10.878866 0.099639 -15.130201 -17.775124 -5.223059 6.813731 -0.000000 0.000000 0.000000 -4.439862 0.478232 -15.363066 16.952450 -2.730081 -6.312831 -11.344515 2.047553 -23.853074 -0.000000 0.000000 0.000000 8.024229 -1.628924 1.318750 -9.078525 20.667001 9.417825 -0.496220 7.972368 4.590208 -11.310596 -0.653377 -38.768455 -12.103165 -15.628709 -2.446109 -8.553522 23.143157 2.376350 12.940752 47.072332 -3.257901 -3.572218 -12.421722 -34.102628 -12.831329 -16.906692 -7.848472 -17.296284 23.274237 27.289267 -39.094897 8.214159 27.386888 -22.438364 3.929418 22.055916 21.615027 16.703381 3.292857 +1.213591 94.113258 3.994098 -95.073051 2.497793 29.667015 0.832084 -8.765105 1.274936 11.278874 0.195730 -14.654681 -18.323702 -5.521345 7.436946 -0.000000 0.000000 -0.000000 -4.130739 0.420447 -15.101366 17.589792 -2.723999 -5.780443 -11.577369 1.906471 -23.612307 -0.000000 0.000000 0.000000 7.290121 -1.497396 1.502238 -8.785177 20.453842 9.527031 -0.359827 8.151918 4.668894 -11.952862 -0.977941 -38.217570 -11.192353 -15.088576 -3.132719 -8.704157 23.002443 3.177879 12.640192 46.865842 -2.961525 -3.400507 -12.187017 -33.885992 -12.947115 -16.944547 -8.023222 -16.790992 22.649957 26.648357 -38.848247 7.594586 27.899011 -22.962431 3.893404 22.737877 20.835890 17.935846 3.432944 +1.361919 94.001518 4.109445 -95.266400 2.320893 28.185234 1.488164 -8.493638 2.191651 11.453067 0.150915 -14.288172 -18.432172 -5.945224 7.668404 0.000000 0.000000 -0.000000 -4.318602 0.656777 -14.694830 18.389540 -2.507963 -5.198118 -11.657941 1.905973 -23.385265 -0.000000 0.000000 -0.000000 6.721279 -1.388429 1.387951 -8.822969 20.132880 9.684866 -0.228260 8.144374 4.983846 -12.210196 -0.935425 -37.833888 -10.440694 -14.921121 -3.804656 -8.723721 22.499948 3.904675 12.079415 47.014487 -2.197196 -3.198129 -11.261197 -34.242578 -12.868261 -16.853338 -7.623956 -16.639828 22.220737 26.308076 -38.128591 6.751923 27.411229 -22.911367 3.629785 26.113031 20.875192 17.874502 3.832492 +1.488981 93.938355 4.129351 -95.292393 2.262905 27.011832 1.863441 -8.314470 2.292578 11.518206 0.346208 -13.455532 -18.517347 -5.874956 7.860240 0.000000 0.000000 0.000000 -4.462412 0.834818 -14.152721 18.722996 -2.421619 -4.972406 -11.559566 1.982999 -22.940873 0.000000 0.000000 0.000000 6.149334 -1.407824 1.218633 -8.849542 19.670424 9.416236 0.255684 8.206220 5.086672 -13.209725 -0.658080 -37.139556 -9.851544 -14.529702 -4.532382 -9.228651 21.969216 4.978958 11.945644 47.316387 -1.914848 -2.925053 -10.831355 -34.213708 -13.047619 -16.682674 -6.984680 -16.967548 21.316436 25.299438 -36.739773 5.489099 27.609065 -22.870960 4.011128 31.276562 19.585320 17.826254 4.087029 +1.756149 93.830231 4.208668 -95.672602 2.117766 25.521294 3.008971 -8.206110 3.285576 11.098414 0.562958 -12.733704 -18.500032 -6.034118 7.634722 -0.000000 0.000000 -0.000000 -4.103466 1.121479 -14.090609 18.916965 -2.325349 -4.596252 -11.647396 1.706943 -22.065598 -0.000000 0.000000 -0.000000 5.576086 -1.493491 1.463601 -7.902983 19.168083 9.009481 0.096962 8.113579 4.893804 -13.110519 -0.553446 -37.074956 -9.318062 -14.280634 -4.951723 -9.079510 21.848453 4.670691 10.601900 47.992281 -0.214141 -3.991244 -10.338435 -34.129746 -12.083964 -17.122165 -6.635857 -16.783489 20.807839 24.590617 -35.294585 4.021907 26.247169 -23.401118 3.972905 39.184846 18.710715 17.943518 4.844387 +2.018514 93.720589 4.058019 -95.793076 2.240576 24.333544 3.286370 -8.049761 4.197922 11.207709 0.390257 -12.062545 -18.678982 -5.922354 7.046275 0.000000 0.000000 -0.000000 -4.178026 1.202391 -13.877588 19.024190 -2.099027 -4.528822 -11.453918 1.645011 -21.073315 0.000000 0.000000 0.000000 4.946476 -1.775873 1.452448 -7.156577 18.559129 8.289835 -0.116320 8.026752 4.826497 -12.388989 -0.625951 -36.703482 -9.808430 -14.079465 -5.274221 -8.690178 22.015667 4.367374 8.767237 48.422560 1.649447 -4.769653 -10.052314 -34.241513 -10.911162 -16.724107 -5.942856 -16.004233 20.236546 23.448532 -33.913185 1.896531 24.752210 -24.407061 4.761479 49.182834 17.080760 17.537792 5.362632 +2.342853 93.599182 3.736709 -95.898850 1.973439 22.804179 3.894960 -7.428382 4.397581 10.982851 0.723063 -10.967324 -18.663919 -6.276115 7.185032 -0.000000 0.000000 -0.000000 -4.559426 1.982146 -13.478369 19.714760 -2.017092 -4.311840 -11.449513 0.992891 -20.246965 0.000000 0.000000 -0.000000 4.819405 -1.505124 1.565373 -6.706939 17.789296 7.542250 0.012786 7.731307 4.812506 -12.441446 -0.543323 -35.781488 -10.423309 -13.902145 -6.028072 -9.073560 22.011040 4.743720 7.765691 49.006381 2.399732 -4.852386 -9.601591 -34.217300 -11.185322 -16.933107 -5.355228 -15.370992 19.099393 21.729999 -31.818293 -0.280350 23.760542 -25.455091 5.629601 60.568331 14.854109 18.392382 5.947109 +2.623816 93.449623 3.306987 -95.815971 2.185374 21.202567 3.908204 -7.098294 4.405687 11.084507 0.898879 -9.303135 -18.712603 -6.416560 7.016388 0.000000 0.000000 0.000000 -5.207072 2.152738 -12.293272 19.966937 -2.003596 -4.428516 -10.824259 0.694264 -19.724963 -0.000000 0.000000 0.000000 3.832243 -1.484230 1.488987 -5.352432 16.684352 6.650010 -0.193195 7.429754 4.897740 -12.273568 -0.303106 -34.928293 -11.476286 -13.780310 -6.695925 -8.825332 22.165833 4.217190 6.575656 49.971646 3.243881 -5.508064 -9.445188 -34.154410 -10.564466 -16.463022 -4.503387 -14.409825 17.624238 20.513275 -29.790840 -2.887588 22.840281 -26.910859 6.810663 72.572855 12.924631 17.750168 7.277853 +3.003285 93.384773 2.886014 -96.240996 2.006300 19.589962 4.670600 -6.593949 5.614165 10.970841 1.055633 -8.546704 -18.659536 -6.697271 6.334275 0.000000 0.000000 0.000000 -5.088933 2.645356 -12.284391 20.049697 -1.659951 -4.080859 -10.509388 0.387959 -18.187208 0.000000 0.000000 0.000000 3.720169 -1.417103 1.513877 -4.721988 15.680099 5.676368 0.024435 7.068466 4.672422 -12.416125 -0.162507 -33.702614 -11.918804 -13.192705 -7.171351 -8.803356 22.286379 4.125379 4.912318 50.564404 4.449969 -5.202373 -8.905758 -34.224944 -10.438155 -16.407682 -3.970272 -13.366927 15.994976 19.239740 -27.057479 -7.115065 22.858618 -28.522862 8.210633 84.690877 11.770360 17.663627 7.564779 +3.406285 93.319016 2.383818 -96.554636 2.017714 17.685451 5.129258 -6.063028 5.891261 11.073227 1.412553 -6.604515 -18.713032 -6.978006 5.992584 -0.000000 0.000000 -0.000000 -5.204096 3.110154 -11.437260 19.989927 -1.646005 -4.284035 -9.904382 -0.246726 -16.777044 0.000000 0.000000 -0.000000 3.155064 -1.219445 1.743670 -3.671059 14.320211 4.642108 -0.091308 6.829606 4.473963 -11.765887 -0.654310 -32.151270 -12.956518 -12.573141 -7.943515 -8.447007 22.201623 3.868802 3.848177 51.686102 4.916654 -5.193641 -8.712971 -34.188407 -9.001426 -16.183756 -3.089878 -12.389150 13.607360 17.989755 -22.854405 -12.437640 23.661837 -30.218287 9.698200 96.115905 11.038189 17.672821 8.662166 +3.875483 93.177574 1.722475 -97.174328 2.086785 15.808573 5.637985 -5.574674 6.665873 11.384653 1.623512 -5.131744 -18.899533 -7.077091 5.242112 0.000000 0.000000 -0.000000 -5.121080 3.425032 -10.801145 19.895989 -1.412778 -4.675611 -9.268991 -0.861208 -15.046380 0.000000 0.000000 -0.000000 3.317042 -0.911384 1.787843 -2.685982 12.760420 3.569496 -0.318348 6.207981 4.453900 -11.289017 -0.952802 -29.921816 -13.788250 -11.980384 -8.619391 -8.321126 21.974537 3.679893 3.529137 53.369786 4.741542 -4.037766 -8.701052 -34.434343 -9.687981 -15.343041 -2.814280 -11.022589 11.139832 16.596523 -17.966714 -18.439990 24.698944 -30.857597 11.267044 106.410304 9.550311 16.205651 9.201249 +4.379901 93.081650 0.807664 -97.842699 2.096420 14.073457 6.181667 -4.913509 6.529819 11.366817 2.015325 -3.376673 -19.086441 -7.404450 5.161560 0.000000 0.000000 0.000000 -5.205763 3.790420 -9.802784 19.871671 -1.182752 -4.979841 -8.273856 -1.674677 -13.978492 -0.000000 0.000000 0.000000 3.682588 -0.500645 1.843528 -1.405431 11.032452 2.309005 -0.079816 5.600962 3.961403 -11.979987 -1.110881 -27.199574 -14.369384 -11.512995 -8.765738 -7.462525 22.325588 2.929103 3.789598 54.682825 3.653769 -3.683781 -8.242390 -35.430032 -9.206903 -14.817891 -2.293283 -10.028425 7.707347 15.381174 -11.175441 -23.957946 26.559752 -30.425310 12.375239 115.290294 7.796780 14.177314 10.173758 +5.057822 92.949867 -0.458602 -98.249486 2.182956 12.662652 5.937598 -4.278243 7.185751 11.778274 2.277330 -2.328932 -19.355896 -7.779633 4.468878 0.000000 0.000000 0.000000 -5.931886 4.431274 -9.336172 20.232701 -1.045264 -5.422043 -7.696545 -2.359225 -12.279946 0.000000 0.000000 0.000000 4.754649 -0.133013 1.662082 -0.621828 9.380476 1.121005 -0.184784 4.848083 3.471429 -12.055199 -1.197672 -24.324076 -14.497293 -11.055785 -8.574945 -7.109635 22.214235 2.311423 4.568140 56.591677 1.850183 -2.703277 -7.782430 -35.434549 -9.833523 -14.550036 -2.217241 -8.621411 4.151643 13.421712 -2.727403 -30.694273 28.601065 -28.393444 15.212931 121.524445 8.083668 14.057372 10.640946 +5.744669 92.858116 -1.902697 -98.119401 2.576972 11.476771 5.108539 -3.989983 7.671871 11.837490 2.727449 -1.997276 -19.253341 -8.066686 4.264151 -0.000000 0.000000 0.000000 -7.017256 4.938519 -9.153269 19.889523 -1.145271 -5.592190 -6.562026 -3.127679 -11.094633 0.000000 0.000000 -0.000000 6.122293 0.319586 1.391173 -0.795644 7.439890 0.181220 0.446921 3.828232 2.875109 -14.160063 -0.792539 -21.091104 -13.341247 -10.464482 -8.089085 -6.556148 22.842248 2.133693 7.143137 57.701536 -1.895330 -1.340864 -7.538988 -36.470416 -10.046928 -15.720081 -1.716076 -6.791709 -0.763074 11.009146 6.359764 -35.015888 30.137907 -24.336587 17.489833 124.852792 5.430252 13.215348 11.398406 +6.394952 92.881866 -3.382108 -97.311099 3.311056 10.296624 4.071649 -4.092238 6.802581 10.841562 3.670256 -0.229243 -19.095308 -8.527954 4.457000 -0.000000 0.000000 0.000000 -8.597137 5.259398 -7.799330 19.472687 -2.194292 -8.108454 -5.988250 -4.680916 -8.851822 0.000000 0.000000 0.000000 6.371364 0.963003 1.716779 0.940532 4.505101 -0.605712 -0.476151 3.401373 2.076623 -15.285106 -3.015649 -15.456116 -13.982270 -6.348324 -10.119618 -4.979875 24.219260 2.186660 11.077533 57.617773 -7.768830 0.170215 -8.641908 -36.439910 -13.906622 -11.823890 -5.254480 -5.172860 -7.301522 6.825506 16.656852 -37.649327 31.891464 -20.702620 22.207873 123.344015 1.943056 9.669111 13.971573 +6.922090 93.079758 -4.504333 -96.647399 4.086965 9.017794 3.959525 -4.249078 6.652402 8.962958 4.254360 -0.028403 -18.055676 -8.960425 5.740728 -0.000000 0.000000 0.000000 -9.400011 4.995339 -7.135466 19.583432 -2.884141 -7.306957 -8.487998 -5.060726 -8.826768 -0.000000 0.000000 -0.000000 6.958805 1.266392 1.299854 1.161740 2.662640 -0.954663 -0.154968 2.141781 1.632606 -15.390510 -2.406644 -12.783425 -13.977074 -6.398469 -10.537492 -4.133721 24.723977 2.383153 13.136486 58.113830 -10.512981 1.825426 -8.633510 -37.857522 -15.149801 -14.420608 -4.194478 -2.735883 -12.552633 4.178223 23.410033 -41.200183 30.083323 -14.750554 28.004719 119.437213 8.827354 13.611995 9.908421 +7.309389 93.263252 -5.801845 -95.653650 4.882005 8.965595 2.257857 -4.367855 5.903743 8.503173 3.907732 0.421803 -17.556135 -8.834190 6.062616 0.000000 0.000000 0.000000 -10.547494 4.020610 -6.414437 21.563907 -3.303073 -7.849378 -10.308471 -3.956198 -9.375640 -0.000000 0.000000 0.000000 7.404590 1.051335 0.782105 1.189614 0.972054 -1.654493 0.350917 1.504567 0.649334 -15.015581 -2.266427 -11.630494 -13.493498 -5.926862 -10.142604 -2.875821 25.244958 2.830405 14.748029 58.223455 -14.563448 1.334643 -8.595263 -37.259940 -15.292519 -11.761897 -5.051669 -1.872570 -16.147395 1.362996 28.685977 -45.929530 28.628934 -8.012258 28.921310 106.841944 7.045009 8.536394 13.833374 +7.694718 93.426720 -6.824112 -94.824578 5.210836 8.646649 1.297113 -4.053073 5.136829 7.648865 3.580489 0.385738 -16.378217 -9.196786 7.011050 -0.000000 0.000000 0.000000 -10.843055 3.270067 -6.260327 24.103365 -3.692230 -8.442705 -11.283667 -2.569014 -10.501397 -0.000000 0.000000 -0.000000 8.022989 0.896321 0.230459 0.924477 -0.230942 -2.243763 0.748232 0.938690 -0.102076 -14.165984 -1.867009 -10.318049 -12.943372 -5.946087 -9.768759 -1.850633 25.703039 3.214447 15.465435 58.091035 -16.436738 1.683750 -8.688280 -37.142617 -16.209326 -11.160302 -4.671893 -1.325962 -19.552495 -1.290654 31.659235 -49.885948 26.625420 -2.213974 29.262139 94.397821 8.374621 7.570012 12.764923 +7.933236 93.384338 -7.449006 -94.171642 5.355861 7.484506 0.765872 -3.797381 4.830908 6.969794 3.554027 0.660393 -15.919035 -9.789495 7.839114 -0.000000 0.000000 0.000000 -10.287780 2.301845 -6.090250 26.891611 -4.317561 -9.016856 -12.351009 -1.299139 -11.643226 0.000000 0.000000 -0.000000 7.770860 0.882639 -0.014305 1.434198 -1.202158 -2.200237 1.316217 0.407273 -0.297252 -13.523267 -1.655779 -9.300036 -12.059013 -5.634311 -8.935147 -1.651781 26.224325 4.236694 15.557153 58.380988 -17.639432 1.940780 -8.998873 -36.694240 -16.721867 -10.309733 -4.161898 -0.699872 -21.896632 -3.257216 32.629290 -52.692084 23.903952 -0.199307 29.731296 86.442248 11.526229 7.343481 12.192217 +8.022767 93.368904 -7.986923 -93.521337 5.241501 5.334830 0.385802 -3.340806 4.390743 6.375996 3.528643 1.966633 -15.139428 -10.314919 8.614487 0.000000 0.000000 -0.000000 -9.178758 1.361936 -6.065236 28.571501 -4.843217 -10.293762 -13.271275 0.291120 -12.887852 -0.000000 0.000000 0.000000 7.887981 0.675921 0.062552 1.205668 -1.550546 -1.922347 1.791160 0.286432 -0.243624 -12.640759 -1.402469 -8.733493 -10.857114 -5.919572 -8.153153 -1.448996 26.378136 5.438694 15.039270 58.910662 -17.646185 1.750832 -9.244296 -36.788069 -16.990960 -9.475615 -4.073178 -0.419331 -22.837676 -5.137583 33.760571 -55.256309 21.681828 0.991193 30.207357 81.824335 13.337516 7.019773 12.299003 +7.925763 93.365341 -8.364792 -92.623009 5.057595 2.618909 -0.212153 -3.068246 4.283908 5.865341 3.780795 3.488009 -14.555668 -10.715709 9.563451 -0.000000 0.000000 0.000000 -7.478292 0.728469 -7.030131 27.715193 -5.897402 -11.291371 -13.601993 0.904626 -12.976048 -0.000000 0.000000 0.000000 7.193267 0.253074 0.578738 1.280218 -1.522619 -1.947320 2.015214 0.396850 -0.164575 -11.195659 -1.402677 -7.987494 -9.768371 -6.393926 -7.192305 -1.192767 26.523963 6.289302 14.086021 59.453801 -16.232918 0.872877 -9.345614 -37.114317 -16.927473 -8.172779 -3.482062 0.211133 -22.629813 -6.333229 34.233902 -57.609658 20.284771 1.828917 30.499019 80.622375 13.351727 5.626375 12.660637 +7.724368 93.273293 -8.865269 -91.635550 4.561172 -0.722396 -1.251490 -2.571829 4.488870 5.921551 3.828558 5.329957 -13.958996 -11.256613 10.454929 -0.000000 0.000000 0.000000 -5.896906 0.272528 -7.831879 25.643310 -6.509573 -12.261782 -12.531766 1.162109 -13.243999 0.000000 0.000000 -0.000000 6.605738 -0.179343 0.952744 0.910703 -0.986243 -1.676808 2.326263 0.669570 0.008264 -9.711396 -1.543891 -7.667382 -8.443895 -6.604555 -5.547314 -0.986083 26.240395 7.180902 13.157120 60.122179 -14.628652 0.369265 -9.404423 -37.231539 -16.997815 -8.173126 -3.002417 0.841864 -21.847448 -6.969622 35.952808 -59.021574 20.804097 3.009223 30.308077 80.633769 12.164491 5.354513 12.002274 +7.347611 93.092247 -9.145372 -90.789182 3.818791 -3.711466 -2.001784 -2.067043 4.939446 5.725141 3.911789 7.030556 -13.652974 -11.253764 10.913220 0.000000 0.000000 -0.000000 -4.299592 -0.117781 -8.911933 22.122298 -6.269646 -13.426990 -13.091451 0.597177 -13.314401 -0.000000 0.000000 -0.000000 5.841213 -0.184963 1.401710 0.338417 -0.618536 -1.880914 2.423145 0.787458 0.164598 -8.035465 -1.540403 -6.835428 -6.437317 -6.544304 -4.189067 -0.706787 26.177753 7.811519 12.215151 60.204056 -12.914290 0.564672 -8.818857 -36.252732 -16.164190 -7.865887 -3.202076 1.444593 -21.033744 -7.228909 36.758880 -59.409688 21.256761 5.041202 30.279443 80.165329 11.181462 4.694449 12.826445 +6.777689 92.842819 -9.552051 -90.388329 2.996309 -7.618968 -2.342831 -1.833183 6.152075 5.497695 4.261496 9.094887 -13.445091 -11.008005 11.471069 0.000000 0.000000 -0.000000 -2.980365 -0.318055 -9.313331 17.177095 -5.416861 -14.018574 -13.364134 1.140885 -12.630277 0.000000 0.000000 0.000000 5.704827 -0.160341 1.538421 -0.290758 0.132109 -1.350515 2.389376 0.956994 0.663294 -6.731335 -1.680360 -5.747985 -4.551807 -6.288270 -2.712354 -0.849470 25.784856 8.440054 11.408992 60.562493 -11.560594 0.588590 -8.725748 -34.637669 -14.854098 -8.048347 -3.023890 1.935959 -20.636215 -6.843861 37.838928 -59.401343 22.959640 6.952316 30.017833 78.835395 10.926534 4.784134 13.033616 +6.285659 92.559479 -9.794826 -90.436201 2.091346 -11.191179 -2.407639 -1.368481 6.975084 5.536159 4.654760 11.760777 -13.219046 -11.199788 12.171345 -0.000000 0.000000 -0.000000 -2.394144 0.032559 -9.499949 15.152870 -4.742724 -12.987775 -14.084558 1.406243 -11.717155 0.000000 0.000000 0.000000 5.121579 -0.337050 1.965571 -0.128371 0.666155 -1.298122 2.418334 1.232150 0.739944 -5.574866 -1.378901 -5.034334 -3.097532 -5.656901 -1.209902 -0.794334 26.086320 8.502349 10.565507 61.030803 -10.645719 -0.320879 -9.111611 -32.877151 -14.291792 -8.096181 -3.054501 2.373782 -20.616831 -5.878438 38.206727 -59.027983 24.533638 8.144369 29.291801 76.636974 10.714718 4.371083 13.244521 +5.717351 92.459770 -10.155086 -90.955357 1.586554 -14.321631 -2.103101 -1.133464 7.695077 5.742548 4.682255 13.245770 -12.616803 -11.059657 13.394972 0.000000 0.000000 -0.000000 -2.032311 0.234199 -8.869027 14.577690 -4.168321 -11.354004 -14.580166 1.569244 -10.608502 0.000000 0.000000 -0.000000 5.628042 -0.786756 1.706841 -0.593085 1.075587 -0.977071 2.571090 1.515615 1.005968 -4.959423 -0.928026 -3.812672 -1.676552 -5.105333 0.020347 -1.624827 26.163607 9.345029 10.320461 61.773731 -10.455581 -0.999891 -9.501125 -30.876265 -14.104255 -8.210473 -2.681600 1.856542 -20.746193 -5.737230 38.662538 -58.968737 26.318788 9.105343 27.956737 72.921369 10.177643 3.968209 12.280888 +5.133438 92.501427 -10.355910 -91.548278 1.458618 -16.482180 -1.558511 -1.298099 8.041694 6.118483 4.848862 14.501895 -12.530822 -10.918235 13.879553 -0.000000 0.000000 -0.000000 -1.479738 0.308197 -8.201293 14.424743 -4.086427 -9.860036 -14.583958 1.533935 -9.920175 0.000000 0.000000 0.000000 5.413902 -1.461722 1.524847 -0.503616 0.953839 -0.961571 2.461056 1.682666 0.743640 -4.096576 -0.594650 -3.116641 0.278428 -3.702901 1.166653 -1.224663 26.490318 8.945171 10.442994 62.542506 -11.177501 -1.333504 -10.253703 -28.722014 -13.907865 -7.021107 -2.265300 2.177236 -21.360961 -5.210513 37.587098 -58.527949 26.888928 9.871217 26.116613 67.662779 9.111615 2.955019 11.569244 +4.601324 92.493416 -10.514698 -92.140821 1.123624 -18.024559 -1.512016 -1.278975 8.054395 7.387994 5.014954 15.342707 -12.342398 -10.719239 14.220559 0.000000 0.000000 0.000000 -0.974903 0.585878 -7.514274 14.343546 -4.032329 -8.852303 -15.097469 1.862455 -9.351523 0.000000 0.000000 -0.000000 5.128160 -1.886336 1.254811 -0.430198 0.797182 -1.084191 2.598961 1.711235 0.530100 -2.768029 0.447719 -1.854426 0.775419 -2.889096 1.995941 -1.260659 26.458882 8.915573 11.829726 63.169385 -12.986464 -1.010608 -10.546331 -27.654035 -13.792146 -6.294339 -2.423880 1.536118 -22.112310 -5.288141 36.448633 -58.059386 26.478163 10.472383 24.542358 62.461966 9.732994 2.615331 10.915674 +4.033594 92.494255 -10.729355 -92.535596 0.588819 -19.622325 -2.291068 -1.275395 7.707506 9.446548 5.333530 16.029384 -12.276142 -10.648734 14.620155 -0.000000 0.000000 -0.000000 -0.643685 1.017197 -7.397595 14.018827 -4.031775 -7.907171 -15.331394 1.908639 -8.769709 0.000000 0.000000 -0.000000 5.208766 -1.999783 1.467953 -0.787366 0.705263 -1.114341 2.284708 1.745844 0.425566 -2.533457 0.857303 -1.101649 2.441321 -1.510671 2.669915 -1.051782 26.787843 8.877683 12.500953 62.977627 -13.661960 0.122678 -11.379047 -28.719724 -12.902493 -4.095821 -2.116801 1.969481 -23.154315 -4.946978 34.332142 -57.745974 25.184043 10.693705 23.583161 57.639044 10.751491 0.861106 10.442862 +3.596030 92.569229 -10.851679 -92.985504 -0.043464 -20.706789 -3.278706 -0.982170 7.153506 11.903330 5.625557 15.685790 -12.387068 -11.071416 14.943875 0.000000 0.000000 -0.000000 -0.320876 1.700478 -7.665820 13.772523 -4.057843 -7.110829 -15.567443 1.825992 -8.222344 0.000000 0.000000 0.000000 5.025034 -2.071435 1.637388 -0.888598 0.855759 -1.178235 2.362387 1.920653 0.333100 -2.445509 1.239033 -0.620636 3.110265 -1.050180 3.076403 -0.905120 26.519564 8.754297 14.019391 62.878678 -15.522479 0.426467 -11.287729 -29.955964 -14.089474 -3.476819 -1.612740 2.068819 -23.718752 -4.692121 32.907801 -57.813728 24.510420 10.736612 21.960556 52.160171 11.557878 -0.302673 9.437270 +3.293180 92.737244 -10.844068 -93.536789 -0.463650 -21.795091 -3.007589 -0.519990 5.986567 12.088668 5.975183 11.432703 -15.396659 -10.459069 12.711331 0.000000 0.000000 0.000000 -0.037615 2.109538 -7.560700 13.806091 -3.671558 -6.322392 -15.772835 1.226222 -8.203816 0.000000 0.000000 0.000000 5.113290 -1.998565 1.720327 -0.746165 0.859384 -1.106840 2.274253 1.928192 0.528607 -2.298892 1.509628 -0.296872 2.707538 -0.593378 2.756916 -1.103315 26.698738 8.808573 16.148037 62.540615 -17.663178 1.507080 -11.900850 -31.222797 -14.462026 -3.433277 -1.961577 2.037855 -23.930939 -4.206882 31.454948 -58.044271 23.727392 10.164389 20.243147 46.246964 10.873675 -1.889771 8.058594 +3.023401 92.839455 -10.748746 -93.999300 -0.707781 -22.565700 -2.700266 0.645321 3.175954 10.981239 4.350238 4.290615 -16.256459 -9.300375 10.406875 -0.000000 0.000000 -0.000000 0.227508 2.225582 -7.021634 13.930987 -3.220201 -5.834028 -15.960278 0.889113 -8.849164 -0.000000 0.000000 0.000000 5.492989 -2.034979 1.935375 -1.113921 0.987287 -0.936891 2.156387 1.905608 0.460888 -1.942732 1.776391 0.141042 2.460801 -0.465304 2.328201 -1.045837 26.372212 8.619913 19.034459 62.309293 -20.410005 2.600215 -12.197272 -32.143168 -15.310319 -3.373349 -2.356722 1.592061 -23.928550 -4.014441 30.312001 -58.434778 22.369812 9.359281 18.610081 40.943966 9.656638 -2.934456 7.019863 +2.720021 92.750923 -10.310409 -94.410549 -0.240389 -23.745759 -1.953069 0.542227 2.013760 10.146768 3.948394 0.656458 -14.881565 -7.207252 9.416746 -0.000000 0.000000 0.000000 1.016417 1.951096 -7.064530 14.019592 -3.072575 -4.919783 -16.083921 0.944681 -8.736191 -0.000000 0.000000 0.000000 5.121903 -2.324444 2.167365 -0.623874 0.715514 -0.796978 2.105684 1.794022 0.582521 -2.371237 1.685922 0.305979 2.386576 -0.008029 2.497201 -1.178087 26.481314 8.835012 20.782187 62.066412 -21.928601 4.053335 -12.896358 -32.886446 -15.987945 -2.475870 -2.228207 1.856335 -24.074499 -3.714814 28.099210 -58.208824 20.247953 8.615509 17.482694 37.075594 8.499304 -4.674955 6.201636 +2.658522 92.512566 -9.911972 -94.222214 0.199908 -24.643361 -2.091525 -0.033046 2.607753 10.605517 4.182493 1.169250 -13.696365 -8.201598 9.122730 -0.000000 0.000000 -0.000000 1.061959 1.842637 -7.112996 14.458620 -3.387714 -4.383200 -16.372678 1.174011 -8.231517 -0.000000 0.000000 0.000000 4.150863 -2.729195 1.840042 -0.179772 0.348557 -0.505114 2.097562 1.583086 0.653592 -2.192177 1.738611 0.308557 2.391769 0.462173 3.396540 -1.179616 27.032814 9.017046 21.463618 61.805712 -22.630673 4.449170 -12.890424 -33.028317 -15.996518 -2.488820 -2.575814 2.169090 -24.177347 -3.706092 25.948272 -57.351553 18.416249 7.739244 15.849374 33.685956 7.867484 -5.355828 5.920002 +2.538986 92.377167 -9.295606 -94.497767 0.821221 -25.199203 -1.116486 -0.257959 3.060992 10.496218 4.160700 1.224392 -14.089818 -8.501837 9.473871 0.000000 0.000000 -0.000000 1.823680 1.311072 -6.858779 14.617194 -3.002479 -3.934570 -16.522914 1.351462 -8.515223 0.000000 0.000000 -0.000000 3.738159 -2.937909 1.496140 0.279106 -0.021586 -0.547473 2.066721 1.330197 0.445356 -2.028901 1.473846 0.827801 1.818663 0.631404 4.518181 -1.329488 27.573820 8.999655 21.381776 61.793328 -22.568353 4.585357 -13.163337 -32.231106 -14.824400 -1.382458 -2.189246 1.959514 -24.704422 -3.813804 24.097254 -56.628020 16.476745 6.376296 15.067643 31.342550 7.234802 -6.456351 5.387865 +2.335872 92.368645 -8.653973 -94.895298 1.297278 -26.036274 0.190325 -0.290148 3.133236 10.107114 3.923847 1.411243 -14.203296 -8.423018 9.673051 0.000000 0.000000 0.000000 2.552154 0.930527 -6.473784 14.805372 -2.489260 -3.388734 -16.750703 1.424955 -8.576995 -0.000000 0.000000 0.000000 3.206984 -2.756541 1.552200 0.593798 -0.477671 -0.731350 2.121355 1.052884 0.284516 -1.314021 1.135406 1.351810 1.893763 0.924725 5.144034 -1.073335 27.496550 8.374148 21.829272 62.271129 -23.294198 4.716869 -12.786037 -29.235317 -13.707317 -1.623745 -2.693277 1.801277 -24.787929 -4.156710 23.066249 -56.572649 15.590629 5.719197 14.580224 29.111902 6.685760 -6.313840 5.475765 +2.202216 92.334618 -8.113146 -94.975846 1.511897 -27.137780 1.459649 -0.236241 3.863028 8.954172 3.968737 1.476071 -14.411251 -8.370402 10.013465 -0.000000 0.000000 -0.000000 2.551779 0.867370 -5.964340 15.480378 -2.184958 -2.919762 -16.827200 1.243598 -8.701042 -0.000000 0.000000 -0.000000 2.487968 -2.574857 1.163201 0.663651 -0.657114 -0.762526 2.076673 0.910545 0.214314 -0.524593 0.658057 2.092679 2.606801 1.020181 6.223187 -1.067214 27.437787 8.416433 21.145525 62.737173 -22.506911 4.784860 -12.879442 -26.626048 -12.584660 -0.071406 -2.316209 1.705062 -24.767423 -4.388322 23.041885 -56.641566 15.123458 5.843992 14.587100 28.877820 6.234635 -7.465545 5.411072 +2.110835 92.219139 -7.651991 -94.930514 1.619037 -27.892804 2.254673 -0.197972 4.153648 8.205223 3.997076 1.703578 -14.414633 -8.545163 10.260216 -0.000000 0.000000 0.000000 2.614763 0.826598 -5.712577 15.791309 -1.912292 -2.435699 -17.066030 1.176982 -8.864292 0.000000 0.000000 0.000000 1.955716 -2.501019 0.940299 0.349482 -0.800196 -1.045350 2.143539 0.920872 -0.059330 -0.437405 0.202146 2.609193 4.026986 1.389404 6.908004 -0.939567 27.588171 8.720656 19.794727 63.025951 -21.201654 4.074411 -12.572482 -24.766124 -12.028744 -0.808743 -2.218664 1.897990 -24.908457 -4.987926 23.720304 -56.515126 15.544877 6.412152 14.967312 29.952057 6.278893 -7.482810 5.682146 +2.043466 92.142837 -7.247809 -94.762867 1.783861 -28.676726 2.428960 -0.293596 4.498929 8.334385 4.073246 2.298095 -14.810628 -8.530777 10.153684 0.000000 0.000000 -0.000000 2.765184 0.781768 -5.624996 15.706602 -1.822499 -2.087003 -17.062421 1.170822 -8.697684 0.000000 0.000000 0.000000 1.103905 -2.680806 0.830335 0.732235 -0.995712 -1.183783 2.096890 0.971361 -0.189510 0.415345 0.262431 3.061916 3.791979 1.673494 7.744494 -0.950253 27.851519 9.208262 18.414378 63.152588 -20.006014 3.888640 -12.761781 -23.840062 -11.070171 0.259053 -1.804570 1.512754 -25.029135 -5.840888 23.684329 -56.634092 15.175248 6.807135 15.477044 31.465196 5.756155 -8.752024 5.910475 +1.974055 92.096230 -6.991125 -94.831288 2.046456 -29.619449 2.831410 -0.321329 4.627405 8.428952 4.083097 2.643473 -15.126413 -8.830817 10.484683 0.000000 0.000000 -0.000000 3.050378 0.772604 -5.347319 15.764423 -1.787551 -1.796821 -17.359032 0.851892 -8.485501 0.000000 0.000000 0.000000 0.824142 -2.812489 0.739715 0.963034 -1.112966 -1.170286 2.267350 0.907539 -0.290257 0.598255 0.394549 3.640921 3.750144 2.370441 8.211718 -0.884571 28.147310 9.360077 18.096269 63.127617 -19.415771 3.222306 -13.023968 -24.647385 -11.650887 0.166201 -1.567720 1.700720 -25.321241 -5.822051 24.496712 -56.640831 15.965789 6.201484 15.761598 32.942737 5.076863 -8.167521 5.803197 +1.897587 92.068054 -6.805575 -95.002008 2.349508 -30.526641 3.081421 -0.280172 4.636488 8.961018 4.049589 3.200353 -15.342667 -9.146074 10.812321 0.000000 0.000000 -0.000000 3.111604 0.647191 -5.142169 16.353541 -1.464733 -1.519808 -17.618117 0.825882 -8.139398 0.000000 0.000000 0.000000 0.925167 -2.877458 0.782896 1.291687 -1.260557 -1.072969 2.359508 0.803831 -0.265661 0.234208 0.614377 3.953625 3.577801 2.730553 8.432177 -1.047539 27.868692 9.736366 18.463889 63.452237 -19.750773 3.440981 -12.957118 -26.114358 -12.690934 -0.213295 -1.474501 1.388181 -25.110286 -6.170062 25.256112 -57.130332 17.059530 5.969950 15.942312 33.707399 4.784685 -7.854350 5.857257 +1.917314 92.087975 -6.662980 -95.152553 2.568992 -31.288929 3.391651 -0.144499 4.802745 9.100505 3.928617 3.342366 -15.600160 -9.172242 11.212390 0.000000 0.000000 0.000000 3.239306 0.688307 -5.027826 16.649644 -1.347255 -1.346167 -17.557483 0.744777 -7.909534 -0.000000 0.000000 -0.000000 1.134684 -2.963824 0.680951 1.357850 -1.285361 -1.052080 2.339323 0.718834 -0.112764 -0.026732 0.534852 4.481814 3.857957 3.120773 9.133186 -0.915173 27.688412 9.536350 18.925209 63.655836 -19.954210 3.622789 -12.953855 -27.541052 -13.679463 -0.150141 -1.181387 1.705036 -25.080342 -5.778826 25.846290 -57.447117 17.751029 5.621747 16.248378 34.579942 4.504525 -8.095458 5.695630 +1.925028 92.071945 -6.604273 -94.967795 2.511223 -31.502002 3.134043 -0.239979 4.689770 9.329900 4.194321 3.839418 -15.722998 -9.203761 11.106760 0.000000 0.000000 0.000000 2.990062 0.704682 -4.873398 16.796158 -1.326252 -1.423694 -17.773724 0.506388 -7.791863 0.000000 0.000000 0.000000 0.962388 -2.826458 0.639786 1.231096 -1.394273 -1.099852 2.380066 0.684958 -0.185502 0.323751 0.648162 4.801444 3.912105 2.975086 8.870993 -0.915908 27.475193 9.349666 19.869037 63.555739 -20.871378 3.809634 -12.883692 -28.450591 -13.487076 -0.697956 -1.452566 1.726178 -25.155892 -5.892856 26.135912 -57.687943 18.425633 5.445731 16.271492 34.609416 4.732064 -7.496849 5.558244 +1.938837 92.059448 -6.533873 -94.956329 2.612340 -31.624311 3.366653 -0.239600 4.848152 9.015689 4.132963 3.749831 -15.556010 -9.361011 11.113502 -0.000000 0.000000 0.000000 3.114490 0.634828 -4.839540 16.602533 -1.238158 -1.169910 -17.809056 0.739897 -7.659200 -0.000000 0.000000 -0.000000 0.763245 -2.861090 0.643884 1.524201 -1.433756 -1.075666 2.403843 0.805662 -0.218840 0.636524 0.677597 4.657020 3.522363 2.634469 8.753921 -0.785311 27.358206 8.932813 20.700441 63.250121 -21.956066 3.954702 -12.945883 -29.507142 -14.710003 -0.653007 -1.160028 1.671541 -25.363776 -5.640725 26.476703 -57.780722 18.689829 5.211007 16.574331 34.875745 4.575434 -7.677599 5.594304 +2.025406 92.049095 -6.485442 -94.990452 2.652014 -31.660192 3.646697 -0.164406 4.694314 8.681129 4.137879 3.875375 -15.664125 -9.542988 11.046440 0.000000 0.000000 -0.000000 3.240937 0.694491 -4.779027 16.497363 -1.290575 -1.267916 -17.831913 0.556441 -7.761017 -0.000000 0.000000 -0.000000 0.905664 -2.869054 0.489033 1.404832 -1.365325 -1.051824 2.482884 0.779322 -0.104660 0.307080 0.510640 4.694285 4.304632 2.807435 8.681207 -1.004905 27.370741 9.075743 20.964485 63.078807 -22.492004 3.874476 -13.043479 -30.672772 -14.538295 -1.115241 -1.764224 1.708013 -25.171126 -5.588060 26.720069 -57.828447 19.120440 5.016052 16.379546 34.782689 4.738544 -7.462840 5.709067 +2.146135 92.074402 -6.534628 -94.984332 2.639539 -31.426003 3.519487 -0.168454 4.817210 8.693962 4.135329 3.572231 -15.567002 -9.549634 10.938898 0.000000 0.000000 -0.000000 3.130775 0.692371 -4.724983 16.551130 -1.297110 -1.259862 -17.742315 1.101490 -7.811744 0.000000 0.000000 -0.000000 1.219745 -2.930871 0.352526 1.102915 -1.322279 -1.012606 2.448732 0.820261 -0.165551 0.209174 0.541483 4.504557 4.859903 3.082501 8.786977 -0.981667 27.297097 9.051431 21.029541 62.962404 -22.913287 3.939282 -13.123057 -31.503755 -15.025024 -0.982214 -1.400854 1.608194 -25.130720 -5.640539 26.671908 -57.782519 19.193789 4.846239 16.472188 34.528855 4.578259 -8.035714 5.366071 +2.239137 92.090286 -6.523432 -94.961539 2.552483 -31.237375 3.284662 -0.024939 4.774287 8.844363 4.032965 3.536588 -15.606844 -9.518059 10.845739 0.000000 0.000000 -0.000000 3.107739 0.834963 -4.937822 16.520591 -1.354445 -1.391033 -17.817455 0.558440 -7.852852 -0.000000 0.000000 0.000000 1.149605 -3.002638 0.414409 1.178320 -1.285550 -1.041616 2.555360 0.921579 -0.180624 0.503656 0.860521 4.704248 4.699120 3.022625 8.654623 -0.983999 27.329518 9.009958 21.414959 62.722891 -23.473340 3.815202 -13.345876 -32.364667 -15.468483 -1.128175 -1.653793 1.699997 -25.308257 -5.467838 26.258540 -57.570045 18.822986 4.214960 16.382114 34.420586 4.764226 -7.533484 5.487184 +2.375126 92.108147 -6.580868 -94.798327 2.574453 -31.122550 2.914878 -0.091975 4.592323 9.166818 4.126808 3.570458 -15.396534 -9.430485 10.907857 -0.000000 0.000000 0.000000 2.817390 0.756823 -4.937941 16.652506 -1.319140 -1.441343 -17.698577 0.856895 -7.774681 0.000000 0.000000 -0.000000 1.404983 -3.183613 0.546769 0.935200 -1.302458 -1.005180 2.554634 0.909811 -0.119514 0.567624 1.373144 4.941923 4.629989 3.038477 8.640546 -0.967777 27.090345 8.820804 21.836964 62.966989 -23.958590 3.454951 -13.503081 -32.770663 -15.857958 -1.638826 -1.669902 1.470258 -24.987735 -5.610865 26.012044 -57.649684 18.508487 4.099386 16.416316 34.057908 4.882620 -7.314568 5.380645 +2.547401 92.189774 -6.676949 -94.778144 2.539358 -30.925381 2.749837 -0.033527 4.528324 9.058480 4.055916 3.562486 -15.451711 -9.391712 10.843447 -0.000000 0.000000 -0.000000 2.608892 0.780977 -5.049982 16.792448 -1.268422 -1.417786 -17.783879 0.680256 -8.048458 -0.000000 0.000000 0.000000 1.894808 -3.184550 0.538368 0.478416 -1.330279 -0.955624 2.535806 0.804002 -0.184482 -0.373206 1.055116 4.980161 6.421497 4.271323 9.078298 -0.901715 27.605690 9.147410 20.491197 63.038722 -22.831540 2.469320 -13.846891 -33.209324 -16.084922 -0.663254 -1.547987 1.538244 -25.068321 -5.823520 25.564328 -57.265046 18.316757 3.718836 16.471617 33.683643 4.948671 -8.219976 5.431225 +2.666866 92.219635 -6.792585 -94.497538 2.402079 -30.644210 2.179916 -0.060756 4.168505 9.124967 4.106855 3.567275 -15.275150 -9.239566 10.996652 -0.000000 0.000000 0.000000 2.057311 0.766009 -5.200435 16.973119 -1.294762 -1.531819 -17.628766 0.615638 -8.211574 0.000000 0.000000 0.000000 1.799117 -3.347208 0.490168 0.426139 -1.191719 -0.892675 2.630070 0.968325 -0.271668 -0.695535 0.951004 5.150878 6.544430 4.166357 9.629084 -0.963110 27.785833 9.888880 20.022719 63.282870 -22.581072 0.584551 -14.087156 -34.825455 -18.187186 -1.051608 -0.990214 1.477784 -25.103302 -6.061896 25.665762 -57.145078 18.770152 3.518840 16.428306 33.089211 5.046341 -8.360636 5.077967 +2.776727 92.234337 -6.933704 -94.229402 2.126052 -30.418991 1.561555 -0.058705 4.007129 9.071019 4.185426 3.565523 -14.859727 -9.492392 10.899611 0.000000 0.000000 -0.000000 1.465115 0.842970 -5.515106 17.018366 -1.180461 -1.193742 -17.558228 0.965523 -8.302753 0.000000 0.000000 0.000000 1.628536 -3.283227 0.562944 0.341238 -1.019476 -0.675392 2.803281 1.067344 -0.278198 -1.098851 0.753385 4.907577 6.580656 3.975510 9.707483 -1.478844 27.743043 11.125849 20.099264 63.441971 -23.013167 -0.831241 -13.949454 -36.535252 -20.522753 -2.241598 -0.482251 0.987706 -25.311243 -6.964432 26.007964 -56.895903 19.095475 3.341025 16.269104 33.066711 5.255125 -7.907908 5.068359 +2.843071 92.266174 -6.998597 -94.256396 2.031842 -30.163299 1.555181 0.072693 3.956543 8.881854 4.115318 3.354218 -14.768662 -9.685009 10.802732 0.000000 0.000000 0.000000 1.452993 0.918759 -5.478444 16.965161 -1.177375 -1.343607 -17.531736 0.854027 -8.418169 0.000000 0.000000 -0.000000 1.772672 -3.152922 0.569623 0.175388 -1.013631 -0.597090 2.823763 1.078313 -0.295324 -1.166420 0.640196 4.768762 6.746002 4.068982 9.582490 -1.255109 27.583793 11.096756 20.432694 63.169420 -23.376377 -0.959106 -14.255322 -37.875120 -21.627882 -1.748759 -0.980212 0.906707 -25.323903 -7.180314 26.267589 -56.970104 19.150288 3.359382 16.521427 33.257789 5.317382 -8.090660 5.189749 diff --git a/data/gradio_human/bvh/000419.bvh b/data/gradio_human/bvh/000419.bvh new file mode 100644 index 0000000000000000000000000000000000000000..e2a7b1525d38948f1a9de9834d3764c59c7d6d7a --- /dev/null +++ b/data/gradio_human/bvh/000419.bvh @@ -0,0 +1,332 @@ +HIERARCHY +ROOT joint_746789592 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_525884739 + { + OFFSET 7.151354 0.539099 -9.916659 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2798395274 + { + OFFSET 3.817658 0.247780 -39.370831 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3793157994 + { + OFFSET -1.564557 4.698571 -41.699276 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3110609531 + { + OFFSET 3.130943 -12.552577 -5.802909 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_1470824957 + { + OFFSET -6.988356 0.394165 -9.754769 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_4141591986 + { + OFFSET -4.085845 0.912839 -40.314823 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3742711985 + { + OFFSET 1.732102 4.656766 -41.774475 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1804665173 + { + OFFSET -3.061061 -13.027197 -4.993694 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_2025715212 + { + OFFSET -0.267417 3.435895 12.175024 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3853956738 + { + OFFSET 0.801594 -0.293519 15.834958 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3980683494 + { + OFFSET 0.063732 -2.508181 6.211518 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3351942691 + { + OFFSET -0.218445 3.436443 23.570337 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_449754209 + { + OFFSET 0.778942 -6.027856 7.813327 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + JOINT joint_2818485489 + { + OFFSET 8.201824 3.389045 13.192323 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3828098404 + { + OFFSET 9.573748 1.006215 2.911103 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_303969286 + { + OFFSET 26.613758 2.827814 -1.436787 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2780419683 + { + OFFSET 25.866276 0.126288 0.956192 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.151162 0.419625 -1.074848 + } + } + } + } + } + JOINT joint_2429229491 + { + OFFSET -8.506347 3.948016 12.689465 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2552838042 + { + OFFSET -10.293508 0.822020 3.128057 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3791504949 + { + OFFSET -26.080002 2.486723 -1.410745 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_603089308 + { + OFFSET -26.349869 0.698388 0.684552 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.790852 0.058603 -1.069210 + } + } + } + } + } + } + } + } +} +MOTION +Frames: 198 +Frame Time: 0.050000 +-0.052592 96.827255 0.033433 -96.757393 -0.746004 -0.358383 9.576480 -3.504997 11.425879 -1.002802 1.361348 -8.682146 -11.221204 -3.906582 13.606734 0.000000 0.000000 0.000000 8.729705 2.497320 -13.546806 0.517887 1.823270 0.968049 -12.187382 -1.210470 -22.580017 -0.000000 0.000000 0.000000 2.800859 3.438393 2.080608 1.884628 0.009214 -6.048017 9.324709 -1.791757 1.288492 -6.853477 -5.024288 -4.416668 -15.115883 -6.299518 -1.395258 1.028385 -10.567036 -4.106325 -21.219364 2.309187 1.122070 5.311040 10.848686 -12.650282 13.503318 -34.197131 -5.948500 -0.175688 5.985129 3.721159 -23.474928 -2.455263 -1.547628 7.767256 -13.334501 2.228975 20.981692 27.773989 5.745176 +-0.110757 96.825760 0.044846 -96.929131 -0.656160 -0.600369 9.793250 -3.620429 11.499789 -0.941733 1.389604 -8.517594 -11.282713 -3.904335 13.595215 0.000000 0.000000 0.000000 8.902138 2.411360 -13.526310 0.504254 1.807653 1.031719 -12.197409 -1.210905 -22.423826 -0.000000 0.000000 -0.000000 2.833742 3.470715 2.150370 1.966387 -0.041339 -5.990365 9.321906 -1.797812 1.300495 -6.761866 -5.176350 -4.280599 -15.081755 -6.149584 -1.555484 1.065181 -10.737779 -4.052841 -21.071602 2.751828 1.106044 5.563105 10.777828 -12.567841 13.404464 -33.933294 -6.019686 -0.232444 5.942623 3.765270 -23.241152 -2.787119 -1.541580 7.887017 -13.216018 2.382055 20.641968 27.536803 5.910716 +-0.162886 96.822868 0.047310 -97.077995 -0.617427 -0.719979 9.952807 -3.694670 11.549655 -0.872744 1.414588 -8.449324 -11.338788 -3.874409 13.575819 -0.000000 0.000000 0.000000 9.041538 2.378325 -13.538259 0.535350 1.773333 1.082805 -12.245154 -1.191567 -22.329708 -0.000000 0.000000 0.000000 2.883577 3.504081 2.186492 2.014179 -0.069097 -5.973947 9.320373 -1.803761 1.284349 -6.653044 -5.209312 -4.179444 -15.151226 -6.076745 -1.661217 1.104367 -10.899425 -4.028546 -21.039556 3.038719 1.094766 5.663358 10.779336 -12.392286 13.419602 -33.892904 -5.996726 -0.221080 5.960535 3.759904 -23.138413 -2.922732 -1.569415 8.089782 -13.146768 2.504967 20.656981 27.598180 5.971206 +-0.197147 96.819099 0.041211 -97.194032 -0.628250 -0.674202 10.032988 -3.712211 11.578801 -0.801459 1.404093 -8.512694 -11.381056 -3.848748 13.549459 0.000000 0.000000 0.000000 9.120914 2.383258 -13.602160 0.646112 1.748480 1.103234 -12.322651 -1.146664 -22.308882 -0.000000 0.000000 -0.000000 2.935920 3.506659 2.173873 2.034187 -0.058603 -6.017401 9.320427 -1.808095 1.230352 -6.558586 -5.119726 -4.189525 -15.264254 -6.069619 -1.600342 1.142891 -10.881824 -4.042894 -21.142561 3.024783 1.131603 5.497289 10.756268 -12.346572 13.600644 -34.110788 -5.818450 -0.131412 6.016447 3.710094 -23.212787 -2.823512 -1.653989 8.241522 -13.122474 2.588835 20.859030 27.805698 5.950231 +-0.212783 96.817123 0.022006 -97.259139 -0.657402 -0.555976 9.995965 -3.694819 11.601735 -0.668467 1.350691 -8.623997 -11.432254 -3.835814 13.510905 -0.000000 0.000000 -0.000000 9.117330 2.398238 -13.665118 0.805947 1.747120 1.085817 -12.390128 -1.094241 -22.322732 -0.000000 0.000000 -0.000000 2.957933 3.462677 2.125401 2.044139 -0.025113 -6.084654 9.317547 -1.805962 1.161564 -6.509430 -4.970571 -4.266738 -15.336276 -6.048272 -1.382960 1.166999 -10.663062 -4.069975 -21.250901 2.805868 1.231405 5.277041 10.664763 -12.515049 13.940102 -34.434892 -5.572036 -0.023056 6.042876 3.656281 -23.388478 -2.596388 -1.738415 8.215341 -13.121245 2.611715 21.019241 27.966021 5.933940 +-0.206143 96.818779 -0.021264 -97.245690 -0.692153 -0.481611 9.787364 -3.652153 11.626437 -0.395564 1.271431 -8.656244 -11.521351 -3.823587 13.432060 -0.000000 0.000000 -0.000000 8.998710 2.435853 -13.661750 0.971197 1.761623 1.028648 -12.412988 -1.059111 -22.320952 0.000000 0.000000 -0.000000 2.941322 3.364217 2.053452 2.019682 0.014898 -6.129880 9.296485 -1.791261 1.103894 -6.528315 -4.791722 -4.309126 -15.309233 -5.933607 -1.046295 1.159930 -10.317239 -4.061356 -21.235575 2.603984 1.374695 5.106996 10.490280 -12.811112 14.250274 -34.696966 -5.388977 0.027208 6.000666 3.621813 -23.579234 -2.401089 -1.724129 7.832893 -13.093679 2.566290 20.919377 27.987539 5.989947 +-0.185914 96.822159 -0.081874 -97.194200 -0.725762 -0.528796 9.509881 -3.600945 11.653681 -0.046280 1.213401 -8.544102 -11.631943 -3.807004 13.317016 -0.000000 0.000000 -0.000000 8.828154 2.509182 -13.589846 1.097717 1.767141 0.972000 -12.401965 -1.058272 -22.268523 0.000000 0.000000 -0.000000 2.935638 3.247271 1.986207 1.935928 0.043581 -6.126181 9.251990 -1.770883 1.074240 -6.590925 -4.619047 -4.242817 -15.204061 -5.741184 -0.707815 1.135516 -10.043877 -3.994891 -21.097127 2.662742 1.491100 4.901689 10.282257 -12.987759 14.202062 -34.786814 -5.360611 -0.002542 5.931190 3.605419 -23.689499 -2.406250 -1.582177 7.173350 -12.993398 2.534715 20.511624 27.914113 6.103091 +-0.156079 96.825081 -0.152408 -97.167835 -0.749917 -0.725093 9.308069 -3.551867 11.675499 0.260171 1.211097 -8.281596 -11.725175 -3.809963 13.193719 -0.000000 0.000000 0.000000 8.683932 2.618388 -13.483477 1.170765 1.751239 0.964133 -12.379913 -1.105044 -22.153362 -0.000000 0.000000 0.000000 3.009325 3.148753 1.954155 1.784808 0.045152 -6.063827 9.187883 -1.761204 1.086617 -6.697207 -4.501817 -4.054986 -15.046980 -5.530638 -0.466926 1.125289 -10.000056 -3.881707 -20.902447 3.116166 1.505642 4.540974 10.106797 -12.859323 13.546648 -34.635626 -5.510322 -0.087997 5.881634 3.612676 -23.656311 -2.726899 -1.322109 6.414876 -12.807811 2.618620 19.829146 27.771261 6.212920 +-0.123171 96.826378 -0.223119 -97.211731 -0.757774 -0.950036 9.250288 -3.513844 11.684301 0.450974 1.238157 -8.012318 -11.781187 -3.855658 13.104096 -0.000000 0.000000 -0.000000 8.616148 2.721883 -13.408625 1.234432 1.729021 1.002563 -12.371516 -1.170318 -22.026528 -0.000000 0.000000 -0.000000 3.158637 3.089563 1.962609 1.643585 0.019926 -5.985436 9.132456 -1.773935 1.126746 -6.835551 -4.472202 -3.864505 -14.914095 -5.380217 -0.355830 1.155112 -10.120689 -3.795033 -20.765312 3.705978 1.431377 4.139902 10.015337 -12.563490 12.684640 -34.372690 -5.679683 -0.154844 5.859427 3.653286 -23.542943 -3.183599 -1.067442 5.860414 -12.622935 2.801757 19.168791 27.600728 6.260437 +-0.086614 96.826065 -0.294114 -97.340884 -0.748443 -1.043861 9.321007 -3.494136 11.667446 0.523886 1.256321 -7.895504 -11.803207 -3.952504 13.072032 0.000000 0.000000 0.000000 8.642034 2.781174 -13.410372 1.332293 1.715986 1.040319 -12.380345 -1.214768 -21.954139 -0.000000 0.000000 -0.000000 3.338534 3.086399 2.008382 1.614473 -0.034864 -5.938731 9.125335 -1.814462 1.181142 -6.989373 -4.567056 -3.811153 -14.910087 -5.341147 -0.419531 1.236914 -10.306495 -3.822889 -20.747405 4.128280 1.314492 3.980751 10.041640 -12.341378 12.137388 -34.155218 -5.742253 -0.180441 5.840445 3.756383 -23.414861 -3.559399 -0.960754 5.766871 -12.529636 3.002520 18.797177 27.431447 6.234662 +-0.043141 96.826195 -0.369273 -97.486690 -0.746628 -0.940823 9.380818 -3.483112 11.624384 0.574975 1.253234 -7.956160 -11.816979 -4.048997 13.059428 -0.000000 0.000000 -0.000000 8.697639 2.812054 -13.461970 1.459921 1.707740 1.009743 -12.386037 -1.220598 -21.961308 0.000000 0.000000 0.000000 3.472871 3.117102 2.056715 1.695526 -0.100556 -5.943373 9.170574 -1.863379 1.222644 -7.109309 -4.715890 -3.908122 -15.055694 -5.362439 -0.572841 1.331579 -10.444745 -3.953516 -20.790336 4.272886 1.219357 4.154197 10.105707 -12.345998 12.069387 -34.080162 -5.707402 -0.219762 5.800884 3.894508 -23.318355 -3.751735 -1.018144 5.965178 -12.515152 3.127604 18.669101 27.298757 6.205634 +0.015150 96.829727 -0.450654 -97.574872 -0.787965 -0.612140 9.327916 -3.462027 11.550424 0.638438 1.251388 -8.171957 -11.815515 -4.077401 13.019259 0.000000 0.000000 -0.000000 8.725542 2.859013 -13.535714 1.581543 1.685252 0.856620 -12.368558 -1.193885 -22.057327 0.000000 0.000000 0.000000 3.518266 3.159570 2.073508 1.827712 -0.153331 -6.005967 9.253120 -1.902981 1.219097 -7.121870 -4.812900 -4.080876 -15.350329 -5.381508 -0.670051 1.395332 -10.480263 -4.137949 -20.838148 4.154520 1.162955 4.573136 10.096035 -12.581138 12.388401 -34.161099 -5.617982 -0.324432 5.746753 4.005346 -23.263873 -3.768647 -1.202486 6.188251 -12.503170 3.139338 18.626647 27.240584 6.246250 +0.086452 96.836960 -0.532706 -97.602912 -0.870032 -0.208605 9.212568 -3.416257 11.463923 0.677915 1.276444 -8.410027 -11.780005 -4.036578 12.941568 0.000000 0.000000 -0.000000 8.718675 2.950239 -13.613669 1.668864 1.647250 0.647413 -12.332380 -1.171702 -22.179343 -0.000000 0.000000 -0.000000 3.539637 3.181923 2.056560 1.914359 -0.176952 -6.088149 9.321912 -1.930213 1.178573 -7.046134 -4.787427 -4.139307 -15.672091 -5.350664 -0.569397 1.415593 -10.447973 -4.296180 -20.861532 3.983760 1.124807 4.905062 9.981240 -12.829439 12.659385 -34.281304 -5.559061 -0.443846 5.711608 4.042235 -23.236460 -3.746269 -1.393295 6.217935 -12.414063 3.120064 18.515852 27.239453 6.348151 +0.168941 96.844620 -0.614677 -97.587982 -0.978475 0.132499 9.090975 -3.324322 11.386530 0.663725 1.314703 -8.592471 -11.699581 -3.970198 12.852096 0.000000 0.000000 -0.000000 8.668023 3.093986 -13.679724 1.734968 1.606714 0.456347 -12.296642 -1.177195 -22.279390 0.000000 0.000000 -0.000000 3.601637 3.156334 2.014382 1.909486 -0.156873 -6.154021 9.348858 -1.946779 1.125763 -6.927437 -4.626292 -3.922786 -15.946136 -5.232149 -0.112873 1.393579 -10.356308 -4.405831 -20.846029 3.860409 1.134767 4.962234 9.784752 -12.968932 12.671778 -34.371832 -5.554356 -0.459784 5.719858 4.004794 -23.221549 -3.734349 -1.546321 6.032266 -12.218046 3.156731 18.319978 27.281766 6.483865 +0.252604 96.848488 -0.699259 -97.600261 -1.076281 0.345870 9.025571 -3.202739 11.323372 0.631625 1.329602 -8.714916 -11.614990 -3.957535 12.799481 -0.000000 0.000000 0.000000 8.613688 3.248524 -13.742733 1.821030 1.583462 0.347784 -12.273583 -1.198234 -22.334542 0.000000 0.000000 -0.000000 3.730624 3.097897 1.983781 1.901648 -0.121914 -6.183916 9.345048 -1.965141 1.103504 -6.871739 -4.431683 -3.503093 -16.129297 -5.071466 0.535734 1.361565 -10.242703 -4.511225 -20.810965 3.789877 1.196796 4.836508 9.624964 -13.019873 12.546417 -34.443694 -5.564977 -0.321411 5.753978 3.959923 -23.212984 -3.697123 -1.701678 5.829592 -12.019836 3.273309 18.194418 27.333039 6.575767 +0.328739 96.845604 -0.796213 -97.633516 -1.140941 0.428550 8.950751 -3.072672 11.263617 0.674023 1.288244 -8.787159 -11.571333 -4.050078 12.802502 0.000000 0.000000 0.000000 8.527415 3.382900 -13.783443 1.949736 1.577191 0.327196 -12.254819 -1.207949 -22.353910 -0.000000 0.000000 0.000000 3.866645 3.032688 1.985677 1.948082 -0.096256 -6.177138 9.348920 -1.982206 1.138850 -6.936970 -4.307487 -3.081346 -16.148225 -4.924511 1.147984 1.331088 -10.141775 -4.652309 -20.748717 3.764825 1.306037 4.696811 9.593494 -13.055582 12.438837 -34.528371 -5.541147 -0.083978 5.786347 3.956653 -23.185186 -3.619590 -1.897982 5.788809 -11.932412 3.461430 18.218512 27.374975 6.551173 +0.391890 96.842010 -0.901463 -97.615243 -1.171708 0.487506 8.773902 -2.987267 11.196242 0.799684 1.237130 -8.830860 -11.568648 -4.153226 12.805254 -0.000000 0.000000 0.000000 8.385872 3.472368 -13.765976 2.054570 1.563804 0.301259 -12.213032 -1.201085 -22.391612 -0.000000 0.000000 0.000000 3.904082 2.976305 1.996095 2.007659 -0.080673 -6.157174 9.378727 -1.980652 1.188012 -7.035030 -4.304235 -2.817630 -15.977303 -4.826980 1.490663 1.308348 -10.111810 -4.773799 -20.693298 3.827166 1.362358 4.649967 9.648677 -13.093190 12.392018 -34.582550 -5.502799 0.088389 5.806096 3.980018 -23.120063 -3.612798 -2.085563 5.848362 -11.939192 3.646533 18.220920 27.391568 6.480021 +0.433350 96.847900 -0.996811 -97.428460 -1.184322 0.619146 8.422197 -2.979059 11.075860 0.911449 1.241746 -8.842034 -11.539982 -4.166921 12.775370 -0.000000 0.000000 -0.000000 8.136405 3.510060 -13.664388 2.048569 1.519348 0.185801 -12.129032 -1.196953 -22.504204 -0.000000 0.000000 0.000000 3.724695 2.971971 1.978279 1.959687 -0.075570 -6.159064 9.404281 -1.949229 1.184922 -7.025768 -4.398567 -2.905740 -15.521650 -4.817888 1.462434 1.275338 -10.190621 -4.761351 -20.600734 4.056510 1.220544 4.689615 9.714648 -13.090425 12.157143 -34.501559 -5.551986 0.026920 5.816828 3.950997 -22.923640 -3.877910 -2.095157 5.869436 -11.962914 3.780970 17.930501 27.349585 6.455758 +0.454487 96.865150 -1.063327 -97.098050 -1.191412 0.845345 7.980082 -3.031303 10.907030 0.918646 1.311972 -8.836045 -11.443643 -4.072829 12.708976 0.000000 0.000000 0.000000 7.815402 3.500778 -13.515857 1.945832 1.465124 -0.015827 -12.030025 -1.211829 -22.689028 0.000000 0.000000 0.000000 3.386486 3.021686 1.920056 1.768138 -0.071638 -6.195641 9.379958 -1.906306 1.110386 -6.871530 -4.502709 -3.209525 -14.877578 -4.864606 1.244657 1.221389 -10.329729 -4.604555 -20.450721 4.393044 0.885992 4.779191 9.736493 -13.030417 11.672035 -34.260441 -5.736573 -0.216204 5.818732 3.836195 -22.595669 -4.386604 -1.899288 5.793786 -11.914504 3.869712 17.354775 27.250558 6.525832 +0.452211 96.888573 -1.080066 -96.730728 -1.183823 1.159754 7.583019 -3.133747 10.714589 0.807965 1.417132 -8.853405 -11.295982 -3.906726 12.625406 -0.000000 0.000000 0.000000 7.513397 3.420109 -13.360199 1.820647 1.447778 -0.264939 -11.969604 -1.239702 -22.931270 0.000000 0.000000 -0.000000 2.980109 3.126072 1.832580 1.520416 -0.074774 -6.260754 9.263195 -1.884595 0.973225 -6.619299 -4.567641 -3.537630 -14.228686 -4.912463 0.955749 1.144462 -10.463047 -4.365633 -20.231307 4.716582 0.423668 4.984769 9.711504 -12.952855 11.134659 -33.870934 -6.039822 -0.523833 5.786301 3.667319 -22.145756 -4.982782 -1.587137 5.648047 -11.747595 3.932259 16.639124 27.086607 6.707825 +0.438743 96.904999 -1.061921 -96.496957 -1.158621 1.487880 7.347065 -3.245507 10.548051 0.705528 1.489638 -8.923138 -11.181212 -3.785536 12.551896 0.000000 0.000000 0.000000 7.333026 3.292500 -13.258394 1.792596 1.485382 -0.484872 -11.976800 -1.245290 -23.147577 -0.000000 0.000000 -0.000000 2.657842 3.256690 1.767451 1.379327 -0.098077 -6.330159 9.108751 -1.904005 0.841501 -6.426285 -4.593693 -3.731734 -13.803725 -4.916733 0.678919 1.058879 -10.533674 -4.206327 -19.992329 4.907979 0.016570 5.326277 9.689570 -12.939131 10.900372 -33.491233 -6.312889 -0.757144 5.700882 3.544591 -21.706529 -5.393726 -1.380155 5.551090 -11.547087 3.998116 16.105572 26.891490 6.908089 +0.425635 96.902885 -1.024531 -96.525744 -1.115524 1.761171 7.338903 -3.342252 10.474222 0.748933 1.479575 -9.047445 -11.184178 -3.787969 12.470458 0.000000 0.000000 -0.000000 7.359569 3.147655 -13.245545 1.933061 1.571086 -0.634858 -12.057514 -1.193999 -23.255068 -0.000000 0.000000 0.000000 2.523471 3.386929 1.768408 1.467025 -0.149648 -6.381447 8.999217 -1.969114 0.770085 -6.444059 -4.596283 -3.701820 -13.771651 -4.864198 0.395374 0.969746 -10.517619 -4.267769 -19.808754 4.901721 -0.156380 5.731245 9.700930 -13.042658 11.252924 -33.272319 -6.407630 -0.866849 5.535893 3.578943 -21.416460 -5.410170 -1.474418 5.565519 -11.414860 4.073866 16.001580 26.720374 7.029260 +0.421658 96.889183 -0.988380 -96.722644 -1.073345 1.943338 7.475277 -3.412145 10.485420 0.891097 1.425744 -9.166410 -11.265718 -3.860297 12.370494 -0.000000 0.000000 0.000000 7.528176 3.036887 -13.284660 2.133598 1.649075 -0.734371 -12.151643 -1.114970 -23.255511 0.000000 0.000000 0.000000 2.515689 3.499922 1.821414 1.692691 -0.208583 -6.404030 8.970323 -2.036828 0.754994 -6.642561 -4.598630 -3.558368 -13.932133 -4.807732 0.105456 0.889192 -10.462014 -4.459511 -19.726088 4.802366 -0.146537 5.982148 9.728771 -13.184198 11.899059 -33.218120 -6.328030 -0.920650 5.327252 3.721187 -21.288865 -5.195285 -1.747810 5.611032 -11.385190 4.130741 16.196029 26.613400 7.046018 +0.429990 96.875679 -0.957742 -96.979044 -1.049579 1.979667 7.732551 -3.443813 10.544867 0.971484 1.395161 -9.217364 -11.342147 -3.929540 12.295246 0.000000 0.000000 0.000000 7.782055 3.005394 -13.342399 2.255235 1.670875 -0.778878 -12.215183 -1.075133 -23.167667 0.000000 0.000000 -0.000000 2.569440 3.585803 1.905644 1.929652 -0.240937 -6.377759 9.008992 -2.063412 0.783027 -6.923258 -4.620303 -3.399013 -14.051649 -4.796345 -0.141655 0.829907 -10.401984 -4.618316 -19.764324 4.701712 -0.077551 5.869794 9.751960 -13.243653 12.413874 -33.299323 -6.172373 -0.935023 5.126095 3.875069 -21.284549 -4.966334 -2.003957 5.569854 -11.446121 4.129758 16.496077 26.595548 6.982898 +0.442831 96.870674 -0.927986 -97.178226 -1.042986 1.909033 8.025110 -3.448010 10.596702 0.903659 1.415676 -9.188984 -11.356139 -3.955426 12.264529 -0.000000 0.000000 0.000000 8.014673 3.032569 -13.393110 2.267050 1.647382 -0.785469 -12.249022 -1.108414 -23.050921 -0.000000 0.000000 0.000000 2.619990 3.654303 1.991117 2.038544 -0.231015 -6.312254 9.052983 -2.050841 0.827407 -7.113203 -4.667026 -3.286899 -14.005645 -4.822782 -0.340028 0.770480 -10.368650 -4.640222 -19.833522 4.662488 -0.099236 5.546596 9.777459 -13.157573 12.632281 -33.419125 -6.084875 -0.906738 4.974661 3.949864 -21.288456 -4.865292 -2.124270 5.452492 -11.527432 4.086233 16.729208 26.614036 6.924406 +0.454859 96.873756 -0.897553 -97.283912 -1.050615 1.783068 8.287657 -3.428542 10.612292 0.717181 1.471680 -9.104305 -11.319045 -3.940173 12.283703 -0.000000 0.000000 0.000000 8.170832 3.092200 -13.434074 2.208341 1.605100 -0.758483 -12.271929 -1.211953 -22.945841 0.000000 0.000000 0.000000 2.648734 3.715124 2.067825 1.969302 -0.185538 -6.213279 9.069091 -2.020930 0.884289 -7.076975 -4.731999 -3.263454 -13.837538 -4.852235 -0.533825 0.692204 -10.397773 -4.518257 -19.866058 4.733265 -0.309234 5.275370 9.836640 -12.861915 12.719720 -33.531155 -6.078537 -0.795278 4.909350 3.897442 -21.259133 -4.896411 -2.122619 5.345147 -11.579258 4.029707 16.862837 26.597503 6.934149 +0.465882 96.876266 -0.871996 -97.365112 -1.060294 1.701735 8.487883 -3.407762 10.610080 0.574347 1.514283 -9.040649 -11.305426 -3.919632 12.305405 -0.000000 0.000000 0.000000 8.291060 3.137485 -13.473286 2.166636 1.580328 -0.726247 -12.301108 -1.314469 -22.882116 -0.000000 0.000000 -0.000000 2.669849 3.774429 2.137918 1.847436 -0.146643 -6.113764 9.078066 -2.007864 0.941024 -6.892239 -4.787238 -3.314670 -13.722525 -4.844433 -0.783725 0.594400 -10.487553 -4.397478 -19.857139 4.899282 -0.626248 5.238026 9.930864 -12.430704 12.995085 -33.616039 -6.033760 -0.662345 4.906708 3.791505 -21.218730 -4.935940 -2.137130 5.327184 -11.589372 3.989885 16.971110 26.505097 7.001542 +0.479332 96.873917 -0.862591 -97.489365 -1.067119 1.745219 8.631149 -3.409282 10.589585 0.568934 1.532399 -9.061904 -11.355430 -3.916147 12.313929 -0.000000 0.000000 -0.000000 8.437905 3.141760 -13.520431 2.174326 1.587700 -0.713052 -12.332191 -1.357781 -22.884394 -0.000000 0.000000 0.000000 2.700463 3.830934 2.203456 1.796672 -0.148191 -6.057410 9.107951 -2.026127 0.969576 -6.665959 -4.820359 -3.433154 -13.765035 -4.776619 -1.087039 0.492235 -10.630682 -4.388891 -19.869197 5.159664 -0.957620 5.441564 10.034471 -11.934393 13.613282 -33.672074 -5.843697 -0.635379 4.945974 3.709151 -21.213202 -4.932365 -2.221119 5.415483 -11.550088 3.943442 17.120373 26.311365 7.102051 +0.494951 96.869614 -0.873784 -97.638314 -1.065961 1.877466 8.714276 -3.442745 10.592763 0.674959 1.537609 -9.133677 -11.449263 -3.902769 12.267317 0.000000 0.000000 0.000000 8.597100 3.113621 -13.567303 2.207812 1.609089 -0.737446 -12.348250 -1.339312 -22.917495 -0.000000 0.000000 0.000000 2.725665 3.877450 2.256608 1.834015 -0.177722 -6.055395 9.156435 -2.056321 0.955342 -6.508987 -4.861661 -3.547076 -13.877774 -4.668724 -1.348741 0.391344 -10.770519 -4.467524 -19.935898 5.438781 -1.203266 5.639656 10.088238 -11.521836 14.357821 -33.697328 -5.574947 -0.780457 4.981946 3.702684 -21.231622 -4.937152 -2.300707 5.524676 -11.474190 3.843937 17.252999 26.075085 7.237173 +0.509102 96.868774 -0.908324 -97.761943 -1.062269 2.012778 8.751463 -3.493829 10.610831 0.784119 1.557823 -9.192962 -11.524648 -3.873960 12.189682 0.000000 0.000000 0.000000 8.707263 3.092630 -13.616468 2.255046 1.613796 -0.802703 -12.351737 -1.302610 -22.915698 0.000000 0.000000 0.000000 2.723558 3.925548 2.291676 1.941380 -0.220382 -6.099450 9.177506 -2.076806 0.908118 -6.471525 -4.919774 -3.620884 -13.930153 -4.574370 -1.453184 0.331313 -10.839490 -4.557381 -19.997176 5.637354 -1.294947 5.646603 10.015516 -11.404585 14.656972 -33.701729 -5.502443 -1.083161 4.977378 3.781974 -21.192603 -5.023730 -2.281682 5.569887 -11.368619 3.695725 17.223131 25.865579 7.428770 +0.517224 96.871964 -0.957651 -97.823388 -1.057510 2.061827 8.753063 -3.538191 10.626347 0.836344 1.596966 -9.175725 -11.546644 -3.846073 12.110430 0.000000 0.000000 0.000000 8.712014 3.104458 -13.672606 2.328857 1.595778 -0.874614 -12.360406 -1.298793 -22.833628 0.000000 0.000000 0.000000 2.708098 3.975004 2.320863 2.032823 -0.251099 -6.135504 9.140015 -2.078784 0.870188 -6.494722 -4.997469 -3.636309 -13.888967 -4.503207 -1.474669 0.309499 -10.867400 -4.573980 -19.999038 5.754787 -1.312074 5.566502 9.874694 -11.531426 14.550014 -33.680201 -5.657645 -1.364450 4.928802 3.869744 -21.083850 -5.168740 -2.182849 5.571551 -11.261847 3.571096 17.093509 25.694192 7.644296 +0.516415 96.875336 -1.020195 -97.807818 -1.043973 1.984196 8.696297 -3.564807 10.634131 0.854147 1.635188 -9.061041 -11.508960 -3.845189 12.036957 -0.000000 0.000000 -0.000000 8.581367 3.143291 -13.732711 2.437105 1.565350 -0.918509 -12.376096 -1.340260 -22.667218 -0.000000 0.000000 -0.000000 2.695949 4.005960 2.346090 2.053915 -0.260430 -6.119693 9.055353 -2.066907 0.879788 -6.549380 -5.061605 -3.595687 -13.801097 -4.451259 -1.522609 0.339026 -10.907787 -4.498065 -19.909488 5.811736 -1.290903 5.616039 9.748694 -11.824074 14.319134 -33.586554 -5.888712 -1.428112 4.869095 3.902789 -20.943197 -5.297091 -2.109390 5.619682 -11.194667 3.588675 16.969114 25.551001 7.801293 +0.511100 96.875259 -1.089750 -97.767986 -1.015224 1.858828 8.597003 -3.587892 10.642200 0.901306 1.651069 -8.930962 -11.451432 -3.873222 11.975118 0.000000 0.000000 0.000000 8.414512 3.163310 -13.777350 2.526979 1.545352 -0.917549 -12.372259 -1.378561 -22.513184 0.000000 0.000000 0.000000 2.699615 3.999542 2.362982 2.027759 -0.260209 -6.067914 8.993681 -2.060004 0.926598 -6.629019 -5.082772 -3.524559 -13.749337 -4.407772 -1.609191 0.399229 -10.977309 -4.420544 -19.797448 5.831586 -1.227014 5.867872 9.702200 -12.110613 14.327583 -33.445985 -5.933663 -1.286027 4.849005 3.890974 -20.854376 -5.332770 -2.159223 5.772768 -11.193220 3.752495 16.939298 25.416016 7.840165 +0.503717 96.872444 -1.163782 -97.749251 -0.967625 1.758259 8.478339 -3.624102 10.662427 1.009201 1.635712 -8.872206 -11.403004 -3.916763 11.950213 -0.000000 0.000000 -0.000000 8.312478 3.124759 -13.773879 2.523066 1.546989 -0.853744 -12.314472 -1.360570 -22.483082 0.000000 0.000000 0.000000 2.722733 3.941181 2.362641 1.995999 -0.259080 -6.020111 9.012733 -2.072773 0.986876 -6.755491 -5.060473 -3.375365 -13.751062 -4.390858 -1.568800 0.455835 -11.015428 -4.438102 -19.736809 5.739665 -1.058618 6.220683 9.768007 -12.305078 14.638494 -33.349013 -5.684790 -1.031295 4.891488 3.874722 -20.867525 -5.216878 -2.368979 6.007387 -11.285778 4.012121 16.989117 25.311471 7.747753 +0.495110 96.871780 -1.239226 -97.757070 -0.918827 1.702881 8.365033 -3.669106 10.693295 1.143539 1.609759 -8.886485 -11.377477 -3.947360 11.967223 -0.000000 0.000000 0.000000 8.278305 3.058349 -13.724502 2.455064 1.552628 -0.756662 -12.228693 -1.299183 -22.569355 -0.000000 0.000000 0.000000 2.749624 3.866398 2.352267 1.991953 -0.260270 -6.005466 9.078698 -2.100335 1.033394 -6.902060 -5.047774 -3.101236 -13.737838 -4.415321 -1.271757 0.469885 -10.966463 -4.539951 -19.726298 5.521829 -0.824028 6.447154 9.876858 -12.419734 14.894684 -33.372575 -5.404056 -0.821768 4.945337 3.876871 -20.914146 -5.016343 -2.619008 6.178834 -11.421538 4.242759 16.971214 25.269201 7.652314 +0.484541 96.876938 -1.318732 -97.754187 -0.895615 1.679872 8.234312 -3.700536 10.718023 1.273110 1.593215 -8.921501 -11.378988 -3.946098 12.013578 -0.000000 0.000000 -0.000000 8.215586 3.032143 -13.643103 2.440227 1.534090 -0.668986 -12.180905 -1.245932 -22.709110 -0.000000 0.000000 0.000000 2.759710 3.819856 2.340710 2.011233 -0.263339 -6.022315 9.122079 -2.132749 1.054450 -7.008742 -5.083244 -2.664667 -13.629490 -4.491774 -0.687406 0.425494 -10.844798 -4.650768 -19.717799 5.264687 -0.636866 6.428204 9.937614 -12.435817 14.750603 -33.530292 -5.386928 -0.712142 4.952794 3.854817 -20.907012 -4.835452 -2.788901 6.156351 -11.523999 4.370180 16.750191 25.325811 7.677395 +0.474695 96.884933 -1.406573 -97.693385 -0.904754 1.667739 8.044280 -3.703452 10.713077 1.382713 1.592154 -8.909595 -11.383233 -3.927067 12.044747 0.000000 0.000000 -0.000000 8.017998 3.082167 -13.568068 2.574464 1.485087 -0.630876 -12.211504 -1.245270 -22.805555 0.000000 0.000000 0.000000 2.742989 3.813367 2.326879 2.012063 -0.267412 -6.038508 9.101962 -2.158177 1.057501 -7.047659 -5.127699 -2.210026 -13.443706 -4.583648 -0.084712 0.377719 -10.773504 -4.682044 -19.675237 5.160565 -0.581415 6.332217 9.897835 -12.366786 14.336619 -33.663780 -5.584567 -0.630022 4.920659 3.756200 -20.831910 -4.788598 -2.847799 6.029542 -11.538488 4.429809 16.417700 25.413057 7.792155 +0.471951 96.890640 -1.509541 -97.536917 -0.940571 1.688890 7.754670 -3.673096 10.651712 1.455367 1.600581 -8.835209 -11.354792 -3.910392 12.031621 -0.000000 0.000000 0.000000 7.629090 3.202327 -13.523232 2.878427 1.417146 -0.668888 -12.317444 -1.303734 -22.826486 0.000000 0.000000 -0.000000 2.693709 3.829305 2.289009 1.954558 -0.271943 -6.042787 9.034976 -2.173714 1.039354 -7.043639 -5.094235 -1.962671 -13.250804 -4.655126 0.252380 0.394200 -10.853323 -4.598823 -19.625008 5.364293 -0.660461 6.330614 9.749961 -12.227160 14.005200 -33.614406 -5.710871 -0.525863 4.904392 3.568351 -20.734214 -4.978541 -2.803404 5.975468 -11.455240 4.443877 16.153539 25.408134 7.874100 +0.477594 96.891083 -1.622183 -97.337142 -0.972777 1.752164 7.425378 -3.634096 10.555678 1.488275 1.602823 -8.760086 -11.286437 -3.910607 12.002786 -0.000000 0.000000 0.000000 7.183809 3.315807 -13.499024 3.195226 1.361574 -0.739131 -12.418212 -1.362947 -22.829723 0.000000 0.000000 -0.000000 2.637277 3.827083 2.221675 1.863439 -0.275233 -6.051131 8.995780 -2.189424 1.007997 -7.081441 -4.966877 -1.987317 -13.131760 -4.697523 0.310062 0.473393 -10.998677 -4.496478 -19.622937 5.700912 -0.727941 6.404017 9.601082 -12.114644 13.975231 -33.456081 -5.564880 -0.431516 4.944055 3.399609 -20.680615 -5.295195 -2.740377 6.075191 -11.371081 4.421521 16.049085 25.257176 7.844706 +0.488383 96.885078 -1.734139 -97.173757 -0.975907 1.830817 7.156061 -3.610172 10.465276 1.477355 1.589795 -8.731959 -11.198369 -3.932317 12.000745 0.000000 0.000000 0.000000 6.841766 3.360930 -13.485193 3.381254 1.341581 -0.788073 -12.453966 -1.374541 -22.850959 0.000000 0.000000 -0.000000 2.611702 3.783869 2.145885 1.799036 -0.277501 -6.074852 9.037581 -2.213581 0.980610 -7.218880 -4.805923 -2.241117 -13.141731 -4.720981 0.170862 0.557794 -11.064599 -4.490996 -19.684759 5.918745 -0.671047 6.388818 9.567278 -12.134026 14.149910 -33.382181 -5.237769 -0.437355 5.022231 3.389602 -20.689358 -5.565386 -2.725134 6.246750 -11.376786 4.345602 16.052501 24.991126 7.754056 +0.494978 96.876404 -1.833115 -97.096359 -0.955425 1.859824 7.001829 -3.607469 10.419309 1.458045 1.571498 -8.722425 -11.137938 -3.960233 12.027684 -0.000000 0.000000 -0.000000 6.649718 3.355265 -13.471274 3.455292 1.345198 -0.793489 -12.450537 -1.357889 -22.864008 0.000000 0.000000 -0.000000 2.631506 3.724158 2.105053 1.805304 -0.283550 -6.092882 9.123918 -2.238727 0.978097 -7.384932 -4.727625 -2.471098 -13.234646 -4.752249 0.012462 0.571186 -11.022536 -4.588727 -19.737109 5.946642 -0.563136 6.213423 9.649979 -12.233384 14.190033 -33.482673 -5.077417 -0.542123 5.063059 3.522845 -20.705387 -5.668442 -2.756374 6.294432 -11.443963 4.257460 16.011591 24.792673 7.744755 +0.490209 96.868736 -1.905448 -97.121529 -0.927594 1.785495 6.986535 -3.622119 10.436553 1.458027 1.565089 -8.674548 -11.133294 -3.981634 12.052589 -0.000000 0.000000 0.000000 6.588535 3.341459 -13.453835 3.502757 1.354707 -0.769350 -12.460564 -1.362609 -22.812916 0.000000 0.000000 0.000000 2.693827 3.678292 2.129663 1.898560 -0.300501 -6.071380 9.194055 -2.245215 1.012488 -7.450134 -4.804897 -2.493399 -13.360496 -4.806222 -0.127297 0.490261 -10.974301 -4.719241 -19.722255 5.913380 -0.553564 5.961910 9.781860 -12.281266 13.962599 -33.654390 -5.266931 -0.666063 5.018615 3.702389 -20.700914 -5.595141 -2.777119 6.125224 -11.473742 4.229471 15.912884 24.845793 7.876094 +0.478605 96.865044 -1.954404 -97.178068 -0.911060 1.661539 7.028299 -3.635964 10.476175 1.465293 1.575491 -8.587578 -11.143068 -3.995680 12.051646 0.000000 0.000000 -0.000000 6.551940 3.351529 -13.435814 3.592444 1.356526 -0.758428 -12.501273 -1.405607 -22.712005 -0.000000 0.000000 0.000000 2.760001 3.651400 2.178281 2.004788 -0.320112 -6.021969 9.222851 -2.226787 1.057788 -7.374389 -4.942737 -2.387442 -13.449324 -4.869537 -0.277356 0.397729 -11.028318 -4.787046 -19.681654 5.993660 -0.662531 5.800909 9.851140 -12.224890 13.717943 -33.703638 -5.533113 -0.715188 4.948994 3.812295 -20.703071 -5.509901 -2.729912 5.919448 -11.413732 4.274258 15.888372 25.076697 8.016899 +0.466930 96.868286 -1.977537 -97.217251 -0.915317 1.569375 7.085708 -3.632116 10.496372 1.433029 1.594822 -8.518623 -11.110807 -4.006295 12.041663 -0.000000 0.000000 -0.000000 6.525363 3.377989 -13.429428 3.671115 1.350315 -0.786587 -12.530327 -1.456185 -22.612265 0.000000 0.000000 -0.000000 2.812120 3.630869 2.198820 2.057870 -0.324970 -5.985020 9.220446 -2.190115 1.082464 -7.197682 -5.020582 -2.331424 -13.454141 -4.914763 -0.427307 0.389216 -11.159003 -4.763180 -19.707448 6.177928 -0.770572 5.768610 9.769193 -12.169153 13.748796 -33.581430 -5.528284 -0.663649 4.931639 3.832411 -20.759022 -5.512772 -2.603535 5.885736 -11.307009 4.363418 16.059007 25.290493 8.006300 +0.458690 96.875572 -1.984422 -97.237111 -0.931185 1.549455 7.148270 -3.609055 10.484905 1.346827 1.602061 -8.521140 -11.034092 -4.015809 12.066633 -0.000000 0.000000 0.000000 6.559408 3.387842 -13.439543 3.629849 1.343173 -0.837307 -12.494440 -1.458658 -22.557304 -0.000000 0.000000 -0.000000 2.864020 3.604586 2.181792 2.066376 -0.311828 -5.985599 9.218988 -2.163155 1.081541 -7.066626 -5.002418 -2.424275 -13.403967 -4.918942 -0.513769 0.468099 -11.191844 -4.737679 -19.813289 6.256168 -0.736512 5.718146 9.593720 -12.278755 13.971608 -33.505927 -5.279435 -0.600208 4.968395 3.861081 -20.845602 -5.548641 -2.506025 6.013975 -11.247939 4.456012 16.270361 25.316154 7.883566 +0.448525 96.882072 -1.977511 -97.268485 -0.948104 1.590462 7.232905 -3.579252 10.463210 1.237546 1.583300 -8.585965 -10.961225 -4.010578 12.126707 0.000000 0.000000 -0.000000 6.726219 3.355963 -13.473506 3.388153 1.340821 -0.897471 -12.373839 -1.386346 -22.529116 0.000000 0.000000 0.000000 2.949873 3.579332 2.166944 2.070340 -0.293881 -6.007313 9.227290 -2.164312 1.067000 -7.092429 -4.951277 -2.597242 -13.342594 -4.848695 -0.505269 0.561568 -11.006753 -4.795492 -19.900241 6.107452 -0.574525 5.533071 9.410721 -12.573587 14.064521 -33.666734 -5.125169 -0.613940 4.976774 3.963997 -20.871788 -5.518139 -2.572102 6.110262 -11.233616 4.580902 16.259791 25.137767 7.827583 +0.428850 96.883759 -1.965451 -97.326073 -0.956813 1.626054 7.331929 -3.569647 10.465933 1.165694 1.557165 -8.619410 -10.943036 -3.981673 12.152864 0.000000 0.000000 0.000000 6.969246 3.297064 -13.516200 3.062373 1.344882 -0.963235 -12.239124 -1.296288 -22.467827 -0.000000 0.000000 -0.000000 3.070665 3.569975 2.197714 2.107744 -0.297486 -6.005096 9.223507 -2.177944 1.055179 -7.207219 -4.973545 -2.672063 -13.310905 -4.720663 -0.487527 0.600116 -10.760367 -4.896091 -19.865157 5.968095 -0.482351 5.308975 9.265040 -12.814957 13.831099 -33.895087 -5.308172 -0.679889 4.884918 4.075570 -20.797705 -5.463863 -2.758998 6.006466 -11.132081 4.774977 16.009483 24.989807 7.935129 +0.395121 96.879471 -1.955447 -97.381724 -0.950373 1.617866 7.404629 -3.607977 10.504741 1.160823 1.555258 -8.543260 -10.984725 -3.936144 12.073028 -0.000000 0.000000 -0.000000 7.168614 3.228190 -13.542283 2.808153 1.359370 -1.034914 -12.167934 -1.254846 -22.352159 -0.000000 0.000000 0.000000 3.191281 3.583348 2.267334 2.179185 -0.336419 -5.968600 9.180181 -2.180098 1.041194 -7.284119 -5.107990 -2.576964 -13.310360 -4.565990 -0.524191 0.613407 -10.660598 -4.912933 -19.714489 6.201361 -0.569608 5.178141 9.092280 -12.827606 13.333571 -33.863705 -5.700340 -0.704984 4.694956 4.077622 -20.665283 -5.615657 -2.893484 5.735970 -10.801957 5.042537 15.689084 25.069297 8.120533 +0.356601 96.873940 -1.952043 -97.396291 -0.931574 1.575969 7.429815 -3.681823 10.546471 1.172208 1.591421 -8.399587 -11.020715 -3.906448 11.934715 -0.000000 0.000000 -0.000000 7.243653 3.164461 -13.531217 2.690162 1.380868 -1.101158 -12.156650 -1.258042 -22.233577 0.000000 0.000000 0.000000 3.271955 3.597374 2.311430 2.237427 -0.377624 -5.941921 9.119396 -2.162876 1.014361 -7.254921 -5.270182 -2.479680 -13.304799 -4.432401 -0.555066 0.701718 -10.686773 -4.789109 -19.591101 6.794264 -0.667868 5.053636 8.792341 -12.810341 12.802355 -33.572691 -5.913555 -0.650359 4.515723 3.983405 -20.558000 -6.093535 -2.836526 5.574180 -10.337169 5.322340 15.467789 25.255228 8.184808 +0.326050 96.868515 -1.960349 -97.352499 -0.912202 1.502558 7.401913 -3.746495 10.554942 1.158782 1.646023 -8.268214 -11.011095 -3.934452 11.848798 0.000000 0.000000 -0.000000 7.163132 3.131859 -13.478808 2.721708 1.397594 -1.130701 -12.179108 -1.266800 -22.159235 0.000000 0.000000 -0.000000 3.307638 3.603170 2.284542 2.251993 -0.381529 -5.960283 9.073641 -2.148126 0.981234 -7.181504 -5.357679 -2.564942 -13.234607 -4.389847 -0.461487 0.916994 -10.528149 -4.621314 -19.550024 7.414772 -0.502215 4.673675 8.330257 -13.165501 12.259922 -33.450787 -5.861455 -0.547263 4.345696 3.951887 -20.435692 -6.773472 -2.640245 5.762490 -9.944005 5.634909 15.290465 25.283978 8.098346 +0.306621 96.858917 -1.975859 -97.311893 -0.901272 1.413023 7.367277 -3.774506 10.558067 1.153048 1.675844 -8.166790 -11.010288 -3.984302 11.812219 0.000000 0.000000 0.000000 7.048578 3.135340 -13.436521 2.812220 1.397213 -1.155114 -12.201753 -1.241294 -22.065039 0.000000 0.000000 0.000000 3.360957 3.613314 2.257853 2.284464 -0.367116 -5.978688 9.023824 -2.160362 0.948040 -7.217099 -5.403454 -2.734979 -13.086275 -4.422220 -0.315044 1.134206 -9.973660 -4.620441 -19.398434 7.733045 -0.137393 4.130917 7.821399 -13.923554 11.655835 -33.697725 -5.994835 -0.477151 3.987363 4.113171 -20.137920 -7.209922 -2.604541 6.131217 -9.676619 6.129111 15.062522 25.072822 8.130593 +0.297182 96.834526 -1.994943 -97.340381 -0.906294 1.376411 7.350078 -3.767780 10.614912 1.227526 1.646705 -8.061413 -11.113981 -3.984607 11.682621 0.000000 0.000000 -0.000000 7.003309 3.177650 -13.482673 2.940219 1.372064 -1.276957 -12.258261 -1.191305 -21.833807 0.000000 0.000000 -0.000000 3.483051 3.684333 2.347109 2.517538 -0.436800 -5.942272 8.826612 -2.227920 0.891436 -7.496528 -5.492485 -2.706299 -12.803763 -4.520279 -0.317685 1.265604 -8.886460 -4.991105 -18.790471 7.634593 0.146350 4.080696 7.383551 -14.933791 11.314182 -33.960755 -6.748004 -0.365767 3.000762 4.485579 -19.512857 -6.924739 -3.069810 6.395356 -9.264084 7.164290 15.094511 24.974901 8.641335 +0.291152 96.795090 -2.013303 -97.413275 -0.930152 1.501698 7.322115 -3.761370 10.737016 1.363867 1.579214 -7.957899 -11.307512 -3.905679 11.342633 -0.000000 0.000000 0.000000 7.029038 3.230770 -13.621877 3.093113 1.334318 -1.564428 -12.371721 -1.139498 -21.496797 0.000000 0.000000 -0.000000 3.626384 3.855199 2.542156 3.017158 -0.667715 -5.891709 8.408742 -2.346099 0.765182 -7.948678 -5.633254 -2.377767 -12.378188 -4.656599 -0.506333 1.429627 -7.447119 -5.605915 -17.658043 7.374423 0.245039 5.095608 6.948117 -16.175490 11.422039 -33.717827 -7.942096 -0.067054 1.325516 4.868361 -18.682802 -6.155188 -3.951707 6.390307 -8.295264 8.854438 15.701002 25.588413 9.529704 +0.288666 96.743965 -2.028329 -97.428789 -0.986134 1.956841 7.197581 -3.775782 10.900415 1.470907 1.497685 -7.915634 -11.507708 -3.734748 10.689800 -0.000000 0.000000 -0.000000 7.050590 3.271300 -13.807615 3.256912 1.287544 -2.118790 -12.517375 -1.046765 -21.157252 0.000000 0.000000 -0.000000 3.667358 4.148497 2.724330 3.825036 -1.095160 -5.958919 7.719148 -2.513421 0.477058 -8.504743 -5.771734 -1.865812 -11.772161 -4.798274 -0.679193 1.921449 -5.570765 -6.199775 -15.988112 7.244902 0.541356 7.426190 5.927819 -18.649464 11.808770 -32.783179 -9.378411 0.543329 -1.030214 5.056050 -17.861232 -5.549564 -5.022621 5.946784 -6.271197 11.456061 17.024989 27.507882 10.524831 +0.291777 96.692802 -2.038056 -97.308276 -1.066076 2.638107 6.961991 -3.797989 11.011783 1.452850 1.441680 -7.942879 -11.618442 -3.547720 9.907297 0.000000 0.000000 -0.000000 6.986024 3.303456 -13.921385 3.387475 1.223426 -2.857524 -12.619588 -0.875466 -20.912816 0.000000 0.000000 0.000000 3.541933 4.476122 2.755753 4.773516 -1.570173 -6.203740 6.897487 -2.694484 0.072158 -9.071397 -5.861393 -1.575159 -11.091722 -4.860382 -0.489452 2.862895 -3.239629 -6.529861 -14.190887 7.602763 1.565096 9.702058 3.601304 -23.043503 11.666894 -31.882379 -10.783770 1.295595 -3.543321 5.046086 -17.215288 -5.848945 -6.021852 5.168083 -3.440816 14.875656 18.185481 30.041070 11.360865 +0.302392 96.644920 -2.037810 -96.972839 -1.144703 3.333169 6.553134 -3.799259 11.064173 1.333835 1.403059 -7.999105 -11.635802 -3.420696 9.153924 0.000000 0.000000 -0.000000 6.745343 3.345537 -13.829533 3.433527 1.120812 -3.658048 -12.622331 -0.575521 -20.803222 -0.000000 0.000000 0.000000 3.206040 4.717321 2.581606 5.670367 -1.898808 -6.600428 6.077123 -2.880654 -0.342808 -9.592318 -5.872687 -1.939304 -10.519075 -4.757913 0.362826 4.180552 -0.087233 -6.627015 -12.380730 9.056992 3.785080 10.067261 -0.787194 -30.063253 9.934505 -31.735733 -11.884549 1.961062 -5.841809 4.935429 -16.537571 -7.803342 -7.127037 4.179077 0.052733 19.506065 17.528476 31.835056 12.092880 +0.312744 96.594917 -2.016719 -96.600884 -1.207577 3.772258 6.140645 -3.779920 11.049055 1.273436 1.378368 -7.798947 -11.707701 -3.384107 8.440362 -0.000000 0.000000 0.000000 6.466651 3.426376 -13.645905 3.440749 1.008238 -4.435089 -12.606285 -0.296564 -20.544646 -0.000000 0.000000 0.000000 2.858107 4.830899 2.370664 6.390164 -2.069461 -6.883541 5.378488 -2.961751 -0.614564 -10.183649 -5.980815 -2.716838 -10.047943 -4.435501 1.347108 5.359195 3.393563 -6.462669 -10.684929 12.158094 5.701475 8.212137 -5.652532 -37.867361 7.613057 -32.471200 -12.324505 2.379129 -7.986443 4.538179 -15.538097 -11.060268 -8.240339 3.091636 3.648059 24.859906 15.309005 32.249916 12.667433 +0.310138 96.536728 -1.924315 -96.608710 -1.237878 3.754136 6.290282 -3.881521 10.777256 1.259955 1.601352 -6.875668 -11.886143 -3.633373 7.699851 -0.000000 0.000000 0.000000 6.642024 3.547798 -13.671271 3.364197 0.870466 -5.211592 -12.644704 -0.195819 -19.642062 0.000000 0.000000 0.000000 2.961562 4.805006 2.385491 6.637515 -2.156763 -6.818882 5.066671 -2.791927 -0.623490 -11.131605 -6.487492 -3.561849 -9.355726 -3.752600 1.774610 6.037537 6.342373 -5.982013 -8.701693 17.888165 5.575317 5.961413 -9.676107 -44.490767 5.772797 -33.416829 -11.667085 2.495517 -10.137609 3.569119 -14.093131 -15.454371 -9.115699 2.164806 6.765022 30.043659 13.378603 31.431633 12.349388 +0.292398 96.470543 -1.749161 -97.198101 -1.253525 3.491275 7.353950 -4.224033 10.123147 1.022894 2.320126 -5.364791 -12.083956 -4.163018 7.003732 -0.000000 0.000000 -0.000000 7.557450 3.685317 -14.087878 3.158261 0.680934 -6.074009 -12.678792 -0.149268 -18.036613 0.000000 0.000000 -0.000000 3.665780 4.756816 2.636425 6.627556 -2.348818 -6.498107 5.002464 -2.348014 -0.484616 -12.536055 -7.592618 -3.887662 -8.076232 -2.576327 1.234129 6.507128 8.186504 -5.210009 -5.966405 25.456528 2.745658 5.576575 -12.472556 -48.257453 4.874811 -33.850302 -10.229022 2.536203 -12.382340 2.112693 -12.565216 -20.506840 -9.415743 1.866663 9.436162 34.180833 13.494176 30.843483 11.283731 +0.149644 96.362122 -1.606266 -97.779638 -0.435675 3.436117 7.051815 -5.731582 11.663207 3.192363 2.151468 -0.252740 -13.729788 -2.279800 0.040478 0.000000 0.000000 0.000000 8.142799 2.569850 -14.086852 3.556254 1.150080 -8.794334 -14.538828 -2.842335 -15.478516 -0.000000 0.000000 0.000000 4.804110 3.280034 3.681320 6.186332 -1.571506 -6.207456 4.390373 -2.556595 -1.401245 -12.933859 -8.599470 -0.672189 -6.919992 -2.050480 -2.511010 7.651901 10.412302 -3.538179 -3.059798 32.006376 -2.773322 13.153566 -16.254293 -47.374369 -11.463155 -33.637736 -15.771733 2.721909 -15.400698 -0.141858 -5.227631 -26.687742 -5.603210 0.707450 15.255226 36.127760 11.433661 31.553653 11.747097 +0.111236 96.260513 -1.476453 -98.050503 -0.337142 3.595683 6.906850 -6.109801 12.587634 4.269626 2.030544 1.268472 -14.526513 -1.507141 -2.703678 0.000000 0.000000 0.000000 8.477816 2.484261 -14.447736 3.852956 1.157220 -10.415938 -14.928679 -3.166731 -13.581222 0.000000 0.000000 0.000000 5.168656 3.116482 3.830376 6.608914 -1.795222 -6.526023 3.661870 -2.303422 -1.615658 -13.750769 -9.529118 0.967538 -5.465700 -1.293715 -4.137282 8.286067 13.100267 -4.136148 0.349997 37.254446 -5.358647 19.948673 -17.303965 -45.974587 -11.819257 -30.906911 -15.675878 3.598869 -18.076663 -0.655722 -3.110902 -31.887510 -4.449058 2.586870 18.827406 38.604928 12.363679 34.806958 12.443188 +0.086983 96.170830 -1.335271 -98.347809 -0.347908 3.669054 6.981636 -6.292441 13.368705 5.013301 1.877041 2.465729 -15.142681 -0.677543 -4.851977 -0.000000 0.000000 0.000000 8.834275 2.599185 -14.544304 4.202992 1.016895 -11.934259 -15.179706 -3.145068 -11.923453 0.000000 0.000000 -0.000000 5.581432 3.067039 3.662617 7.199734 -2.101129 -7.147181 2.916216 -1.980704 -1.935489 -14.886523 -10.523141 2.550060 -3.857945 -0.305052 -4.974709 9.186397 16.484159 -5.178544 3.088766 41.969683 -6.669862 26.594461 -17.732236 -43.501162 -7.199547 -27.168467 -15.930382 4.541472 -20.840755 -0.729704 -1.620548 -36.931660 -3.242596 4.513909 22.584444 42.065225 14.740694 38.969919 13.494124 +0.057469 96.089744 -1.166577 -98.668778 -0.305419 3.474722 7.151977 -6.497676 14.341086 5.755234 1.696941 3.718265 -15.743757 0.293086 -6.961797 -0.000000 0.000000 -0.000000 9.126851 2.727290 -14.632224 4.683647 0.881283 -13.134419 -15.477669 -3.192292 -10.300051 -0.000000 0.000000 0.000000 6.030185 2.960729 3.451917 7.744417 -2.380039 -7.779393 2.273348 -1.702520 -2.300806 -16.134444 -11.366250 3.915987 -2.337596 0.585595 -5.365019 10.255748 20.234948 -6.303488 5.296848 47.208864 -7.829800 31.332973 -17.171396 -39.794200 -2.455258 -25.306342 -16.426012 5.424856 -23.637077 -0.795677 -0.040460 -41.423984 -1.776717 5.727145 26.548079 46.697854 17.673803 42.291368 14.170805 +0.008059 96.032242 -0.952601 -99.125400 -0.145189 2.970814 7.698430 -6.797702 15.339379 6.239477 1.642240 4.595934 -16.228825 0.820197 -8.431845 -0.000000 0.000000 0.000000 9.539936 2.743706 -15.032243 5.118774 0.842830 -13.487251 -15.761585 -3.287997 -8.887568 -0.000000 0.000000 -0.000000 6.585800 2.813516 3.458897 7.986721 -2.579330 -8.297985 1.889789 -1.599422 -2.516823 -17.102487 -11.568806 4.310553 -1.188785 0.752573 -5.086965 10.932260 23.631466 -7.604821 7.218442 53.288446 -9.848515 31.184690 -13.653280 -34.045303 -1.338791 -27.334014 -15.155264 5.851173 -25.946945 -0.855201 2.035298 -44.935519 -0.263051 5.871120 30.070312 52.088715 21.218278 43.472907 13.265713 +-0.069874 95.998024 -0.734161 -99.681691 0.060452 2.459349 8.512875 -7.140707 16.097198 6.431275 1.718241 5.060051 -16.554102 0.911552 -9.244504 -0.000000 0.000000 -0.000000 10.122873 2.645706 -15.697763 5.379565 0.883986 -13.346568 -15.986711 -3.421895 -7.710663 -0.000000 0.000000 0.000000 7.155308 2.682233 3.700865 7.968141 -2.694543 -8.755982 1.758848 -1.617671 -2.557906 -17.691153 -11.326454 4.049132 -0.219652 0.309917 -4.637973 10.915355 26.099435 -8.940464 8.681001 59.070798 -12.813369 26.174134 -8.263422 -26.635957 -3.070850 -32.405554 -12.791783 5.672077 -27.395398 -0.850867 4.649841 -47.817499 1.524938 5.393108 32.820753 56.903210 24.428697 43.143095 11.363971 +-0.194940 95.977150 -0.608516 -100.070370 0.202143 2.268832 8.967836 -7.459192 16.555648 6.667050 1.730367 5.368169 -16.717047 1.125508 -9.860093 -0.000000 0.000000 -0.000000 10.545970 2.493350 -16.252797 5.541524 0.922260 -13.418106 -16.157725 -3.549891 -6.779765 -0.000000 0.000000 0.000000 7.384520 2.619631 4.029513 7.924519 -2.810794 -9.222375 1.803972 -1.615461 -2.515212 -17.976581 -11.216697 4.117208 0.852098 -0.120957 -4.865459 10.177630 26.989337 -10.086427 8.405013 62.723791 -15.088249 19.419136 -4.250064 -18.579895 -2.626641 -37.871786 -10.737779 5.056898 -27.798260 -0.563247 7.133203 -50.025949 3.760114 4.893244 34.593084 60.076126 25.118341 42.438203 10.312299 +-0.358612 95.957329 -0.617260 -100.180575 0.226233 2.368305 8.813823 -7.684599 16.851923 7.122417 1.593906 5.596743 -16.777169 1.528446 -10.475632 -0.000000 0.000000 -0.000000 10.542603 2.400502 -16.493261 5.844363 0.894159 -13.820102 -16.348448 -3.566433 -6.155418 -0.000000 0.000000 0.000000 7.260885 2.707223 4.279406 8.004213 -3.104164 -9.743803 1.920621 -1.542025 -2.482871 -18.249013 -11.466157 5.070618 1.918809 -0.070718 -5.852428 9.323495 26.308112 -11.097787 8.192909 63.999969 -16.559538 16.821049 -2.128622 -13.167521 0.759264 -40.764877 -9.109883 4.477980 -27.793992 0.098485 9.025218 -51.356537 6.283053 4.177891 35.540703 62.640347 23.860320 42.888373 10.496255 +-0.552167 95.934235 -0.792048 -99.984689 0.144747 2.510709 8.074618 -7.744843 17.044775 7.734251 1.315457 5.682636 -16.755859 1.849085 -10.863187 -0.000000 0.000000 -0.000000 9.935117 2.450179 -16.311553 6.448118 0.770432 -14.191192 -16.597879 -3.328076 -6.068078 0.000000 0.000000 0.000000 6.955864 3.001793 4.379792 8.208116 -3.620434 -10.158609 2.018271 -1.476752 -2.456983 -18.721857 -12.001733 6.704767 2.722283 0.588535 -7.090648 8.847855 24.492801 -12.056013 9.660385 62.585153 -17.125828 21.507005 -1.217139 -14.134835 5.170519 -41.188822 -8.243365 4.228583 -27.877830 1.270197 9.559571 -51.031588 8.419856 2.073245 35.688163 66.545203 22.184279 45.334169 11.751466 +-0.746765 95.909431 -1.049974 -99.684810 0.094691 2.377215 7.221312 -7.737612 17.239379 8.320089 0.984082 5.935522 -16.708959 2.181385 -11.117582 -0.000000 0.000000 0.000000 9.044679 2.539845 -15.836818 7.170358 0.629324 -14.394937 -16.835705 -3.001028 -6.184154 -0.000000 0.000000 -0.000000 6.791367 3.291097 4.411935 8.441913 -4.090768 -10.261118 1.960418 -1.482606 -2.402255 -19.400031 -12.725714 8.223946 3.356787 1.562123 -7.994570 8.653260 23.358708 -12.823690 10.704380 59.892160 -15.782608 28.110825 -2.447539 -18.562448 10.071169 -41.399898 -7.924630 4.157618 -28.122777 2.740309 8.735317 -49.265714 9.919647 -1.930481 35.845462 72.586980 21.340628 48.650554 13.297006 +-0.910946 95.897400 -1.333949 -99.445964 0.186559 1.810250 6.635100 -7.789246 17.389092 8.702179 0.744794 6.607539 -16.609936 2.544426 -11.326519 -0.000000 0.000000 -0.000000 8.244916 2.501207 -15.261159 7.638667 0.595059 -14.354711 -16.897452 -2.706250 -6.226497 0.000000 0.000000 -0.000000 6.959275 3.398657 4.484660 8.537919 -4.283491 -9.972357 1.735058 -1.576893 -2.181185 -20.038313 -13.504878 8.941682 3.809115 2.487363 -8.341217 8.345697 23.326974 -13.046017 10.396399 58.054664 -13.479578 30.790377 -4.845304 -22.305831 12.762993 -42.389188 -8.034289 3.604484 -27.743780 4.149311 6.627764 -46.251383 11.766128 -8.733182 36.369529 80.457973 22.542830 51.709221 13.076579 +-1.033564 95.897125 -1.617011 -99.170653 0.409262 1.145866 5.983247 -8.016754 17.746208 9.218108 0.552238 7.459836 -16.501957 3.100861 -11.844763 -0.000000 0.000000 0.000000 7.571775 2.245291 -14.868448 7.695317 0.715716 -14.178226 -16.711908 -2.284671 -6.098533 -0.000000 0.000000 0.000000 7.164076 3.215062 4.529906 8.483331 -4.157714 -9.575495 1.385623 -1.603553 -1.773231 -20.220435 -14.178738 8.857293 4.044505 3.035834 -8.459332 7.784344 23.325271 -13.131983 9.831563 58.092527 -11.789793 29.675329 -6.423969 -23.887772 11.592522 -43.579208 -8.094415 2.373270 -26.229679 5.648087 3.186634 -42.900359 14.858462 -17.290768 36.422003 87.738692 24.812306 54.066212 10.487985 +-1.060772 95.864792 -2.010441 -97.828738 0.753558 1.058650 3.040631 -8.533878 20.438101 11.190974 -0.493096 7.053250 -16.471267 4.346784 -14.023776 0.000000 0.000000 0.000000 5.752644 1.650447 -14.721346 7.536513 1.079269 -13.395599 -16.280470 -1.212696 -6.799946 0.000000 0.000000 -0.000000 6.266502 2.394930 3.938180 8.231080 -3.339164 -9.224026 0.782589 -1.599861 -1.255365 -19.157268 -13.820489 6.437910 3.378311 2.590597 -6.877942 7.383170 23.530501 -13.907345 7.944806 59.201704 -9.140117 26.972702 -7.082465 -23.267716 10.762803 -44.455370 -6.400393 1.199697 -23.220717 8.593559 -2.996685 -39.116939 18.962859 -25.849607 34.782605 91.753308 24.931652 54.427963 7.801569 +-1.054979 95.917908 -2.319966 -97.269534 0.799425 1.229283 1.667492 -8.606118 23.135003 11.662257 -1.363450 5.041682 -15.961759 4.295068 -14.990192 0.000000 0.000000 0.000000 5.141964 1.445728 -15.331392 6.931772 1.317300 -12.582644 -15.796955 -1.337617 -7.225805 -0.000000 0.000000 0.000000 6.546938 1.517259 3.367300 6.855246 -1.880839 -9.135865 1.217950 -1.432277 -0.601627 -18.881142 -13.020421 1.822650 3.235106 1.492929 -4.091065 6.600191 23.337720 -15.352940 5.395083 60.044893 -5.904070 25.122789 -6.665793 -21.756858 13.689561 -44.877871 -3.144634 -1.151032 -19.485194 12.816227 -10.194962 -34.869951 22.187235 -32.361652 30.700886 92.978176 25.896838 52.558139 5.169601 +-1.123693 95.989639 -2.485338 -97.383723 0.535937 1.288843 2.309640 -8.344123 21.216650 10.684899 -0.555866 6.194040 -15.429264 4.477807 -14.195320 0.000000 0.000000 -0.000000 5.708810 1.559320 -15.293517 5.848497 1.300804 -12.975907 -15.213855 -1.292366 -6.857479 -0.000000 0.000000 0.000000 7.207010 0.709886 3.267903 6.413611 -0.770621 -9.098418 1.536059 -0.169014 -0.170402 -20.043534 -14.508738 0.705087 4.093488 1.486934 -5.650808 6.417145 22.155968 -17.085624 7.744042 60.186359 -7.052297 24.327919 -7.000512 -21.247107 13.328917 -44.074133 -2.745253 -3.528199 -16.021738 15.937998 -15.623242 -30.193908 26.815989 -34.995156 29.349826 92.282958 28.618718 51.008735 2.528471 +-1.262197 96.100098 -2.539278 -97.926289 0.267875 1.261617 4.050083 -7.718612 18.389159 8.543135 0.001773 6.893716 -14.706114 3.709075 -12.033595 0.000000 0.000000 0.000000 6.888649 1.589258 -14.974016 4.643648 1.311053 -13.357121 -14.671144 -1.645607 -6.774561 0.000000 0.000000 -0.000000 8.421989 -0.002500 3.342361 5.875628 0.393293 -8.963674 2.055038 0.934745 0.162580 -21.583706 -15.825826 -0.870184 4.683537 1.352486 -6.542746 6.262858 21.143939 -18.604014 10.727356 59.816890 -8.517458 24.727012 -7.125801 -21.602725 11.944954 -43.312018 -4.460911 -5.633888 -12.116301 18.663370 -18.563207 -24.539943 29.314150 -34.892405 29.234998 93.473276 32.072900 51.792343 0.779707 +-1.406617 96.169807 -2.611108 -97.600888 0.278939 1.598170 4.409461 -7.424239 17.155033 6.779302 -0.164876 6.555361 -13.902052 3.194175 -10.841361 -0.000000 0.000000 -0.000000 6.836630 1.162357 -14.510787 3.914896 1.540493 -12.769207 -14.396687 -1.696038 -8.100204 0.000000 0.000000 -0.000000 8.756067 -0.747856 3.132897 5.398675 1.591902 -8.618018 2.113564 1.205344 0.387414 -21.658443 -15.850401 -4.059915 3.753506 0.621430 -4.636622 6.311297 21.413153 -19.566468 11.626626 59.193424 -7.857505 25.395925 -6.935489 -22.307948 12.869613 -42.596744 -6.176615 -5.941179 -8.099894 20.930295 -20.861137 -15.867167 28.382072 -31.252275 30.162870 97.102550 36.826607 52.855707 1.711986 +-1.516810 96.133766 -2.755243 -95.782138 0.580781 2.468584 1.684920 -7.634126 18.686500 7.131464 -1.184851 4.861327 -13.609092 4.498571 -11.537702 0.000000 0.000000 0.000000 4.829046 0.310261 -13.993522 3.647747 1.957245 -11.320450 -14.135814 -0.421472 -10.668345 -0.000000 0.000000 0.000000 6.886399 -1.439207 2.413401 6.379058 2.447191 -8.119533 0.711826 0.987514 0.590624 -19.874726 -15.508061 -6.971704 1.693389 -0.462987 -2.175439 6.583202 22.356933 -20.395875 11.626671 58.939545 -5.915577 25.546476 -7.029381 -23.100513 15.932026 -41.200597 -5.909406 -4.565785 -4.925525 22.314431 -24.792186 -6.319971 27.335020 -26.567091 32.062240 100.801190 43.500842 50.132922 3.236421 +-1.636526 96.208786 -2.548511 -96.500827 0.555169 3.103470 2.839965 -7.766390 18.190070 6.477545 -0.968781 4.300334 -13.172436 4.282679 -11.075445 -0.000000 0.000000 -0.000000 6.097200 0.123339 -15.073738 3.090400 1.893134 -10.905138 -14.217573 -1.193504 -10.737081 -0.000000 0.000000 -0.000000 7.995519 -1.293546 2.980599 5.727913 3.162317 -7.967668 1.336971 0.741628 1.074854 -20.160937 -15.522628 -9.391132 1.380351 -1.707620 -1.321782 4.960255 21.623155 -20.602755 11.854880 60.098808 -5.793558 26.220787 -5.134267 -22.181099 20.396610 -41.221068 -3.773657 -5.324811 -2.808002 22.931099 -27.468729 -0.945771 24.521984 -24.736752 31.106584 103.563108 50.872668 47.730486 2.730067 +-1.731239 96.226105 -2.442938 -96.445095 0.457104 4.377055 2.671969 -7.837174 17.380419 6.251355 -0.907441 3.780386 -12.918077 3.893546 -11.061258 0.000000 0.000000 -0.000000 6.411780 -0.107966 -15.402653 2.763474 1.894342 -11.399165 -14.322257 -1.342721 -11.251606 0.000000 0.000000 -0.000000 8.132731 -0.620893 3.503189 5.355664 3.198226 -8.000603 1.753650 0.644016 1.315832 -20.258593 -16.006060 -9.953562 0.826453 -2.643319 -2.552390 4.053201 20.689659 -20.547553 14.123848 60.966756 -8.682455 28.329423 -3.550371 -20.312278 22.095970 -42.680399 -2.533506 -5.305108 -2.130324 22.252403 -28.258741 0.133288 22.471923 -27.774054 30.267726 102.696068 54.990559 51.592559 -0.201316 +-1.791470 96.160767 -2.475172 -95.264352 0.443436 6.350983 0.643802 -7.935785 17.169742 6.573990 -1.127694 2.855291 -12.855043 4.025002 -11.993856 0.000000 0.000000 0.000000 5.288628 -0.516044 -14.844399 2.737982 2.071862 -12.610165 -14.231800 -0.167424 -12.440480 -0.000000 0.000000 0.000000 6.903285 0.422599 3.482432 5.631077 2.524048 -8.296487 1.511120 0.636508 1.120622 -20.074053 -17.091178 -8.251679 0.037374 -2.766305 -5.652831 4.568819 20.000952 -20.439868 17.971082 61.251318 -13.431144 31.616843 -3.577981 -18.580040 18.888957 -44.349890 -3.044085 -4.829078 -2.995618 21.044575 -29.270717 -4.076418 24.074964 -34.918257 30.921230 96.439381 53.099978 56.720939 -5.477535 +-1.804809 96.102089 -2.375768 -94.853621 0.226679 8.062050 0.231437 -8.233370 17.025470 6.133100 -0.145691 2.179584 -12.646538 4.490831 -12.810243 -0.000000 0.000000 -0.000000 5.091366 -0.407797 -15.217843 2.837139 1.886655 -14.241303 -14.042426 1.135088 -11.947564 -0.000000 0.000000 0.000000 6.458114 1.431114 3.323525 6.036682 1.810141 -8.816552 1.477684 1.003129 0.830573 -21.437786 -19.026697 -4.892997 0.785037 -1.880147 -10.211286 4.967708 18.811698 -20.412150 21.659837 61.908770 -17.420238 33.702011 -4.748509 -17.849357 13.661114 -44.350145 -3.635605 -6.213102 -4.323486 20.181157 -32.527611 -11.192958 28.528014 -40.267509 33.061326 88.581305 47.287686 51.838987 -7.216648 +-1.773912 96.149589 -2.098691 -96.041636 -0.042278 8.343421 1.888388 -8.528245 15.852239 6.226304 0.728444 3.715915 -12.673127 4.486715 -13.260845 -0.000000 0.000000 0.000000 6.822634 -0.229184 -16.002811 2.591012 1.680728 -14.505167 -14.172293 0.478924 -11.259833 -0.000000 0.000000 0.000000 8.037085 1.869793 3.578615 5.199833 1.789274 -9.220990 2.413129 0.987559 0.796361 -23.100420 -19.165978 -5.360374 2.204764 -1.601908 -10.130842 4.687205 18.273718 -20.343543 20.858306 62.784389 -16.813471 33.536638 -4.942027 -17.445696 13.728073 -43.780763 -3.390052 -7.938127 -5.427283 21.533751 -35.087141 -13.921684 30.617401 -41.939385 32.161005 84.488425 46.263443 44.145127 -6.519918 +-1.821521 96.215774 -1.958098 -96.619299 -0.018716 7.762361 3.203214 -8.026893 15.765254 5.061481 -0.100475 2.923508 -12.427669 3.631958 -11.979462 -0.000000 0.000000 -0.000000 7.407855 -0.340873 -15.829559 2.725188 1.855932 -14.099183 -14.312797 -0.345136 -11.418412 -0.000000 0.000000 0.000000 8.834616 1.908570 3.448358 4.485409 2.053511 -9.175845 2.773241 0.742545 0.806266 -23.327377 -18.619959 -6.982689 2.761771 -1.450323 -7.568571 5.090654 18.752681 -19.953367 17.823483 62.705053 -13.697430 31.808803 -4.861559 -17.978977 12.925970 -44.544017 -4.485012 -8.151553 -5.706263 23.355047 -33.774931 -14.994875 32.635927 -41.291521 30.541389 84.285222 45.742954 44.947311 -5.483420 +-1.768880 96.176933 -1.907427 -96.500214 0.015663 6.383906 3.222139 -8.193484 15.260014 5.732507 0.574798 4.285992 -12.917407 3.261834 -11.356280 0.000000 0.000000 -0.000000 7.027526 0.093015 -15.212083 3.125641 1.608801 -13.900033 -14.473258 -0.274058 -10.854576 0.000000 0.000000 0.000000 8.327545 1.402750 3.506822 4.489395 2.450922 -8.379439 2.956439 1.190394 0.995343 -23.653948 -19.072746 -6.417064 3.132310 -1.015658 -7.729740 5.336035 18.645663 -19.103812 18.382882 62.192250 -14.618296 30.530839 -4.700401 -18.660149 7.314345 -46.198867 -8.287948 -7.556880 -3.823953 22.703517 -29.039681 -13.837828 32.719678 -35.789637 31.868962 87.452589 42.777474 53.463432 -2.407790 +-1.696910 96.160141 -2.105916 -95.102556 0.335869 5.536463 1.099326 -7.685703 16.343149 6.406823 -0.840443 3.049292 -13.184065 3.154505 -10.493820 0.000000 0.000000 -0.000000 4.939229 -0.079909 -14.264781 3.541879 1.920630 -11.964082 -14.598126 -0.272979 -12.921406 -0.000000 0.000000 0.000000 6.733069 0.772970 3.284445 4.621422 3.169415 -7.509035 2.245379 0.662160 1.131051 -21.775925 -17.468154 -9.395680 1.591341 -1.953885 -3.800832 5.690577 20.175515 -19.459535 16.739954 61.247678 -12.158778 29.200122 -4.356143 -19.309335 12.244580 -47.029785 -6.738045 -5.601143 -2.184075 23.484609 -26.744264 -6.356695 29.815206 -27.072791 32.174946 91.145984 44.294606 55.431273 0.939567 +-1.619825 96.148674 -2.133755 -94.647517 0.488401 5.420648 0.010620 -7.724627 17.176032 7.392406 -1.329683 2.687087 -13.459411 4.184274 -10.707683 0.000000 0.000000 -0.000000 4.352978 -0.167098 -14.541693 3.526680 2.004622 -11.017651 -14.461174 -0.052546 -13.413601 -0.000000 0.000000 0.000000 6.100278 0.417126 3.256149 5.102785 3.646226 -7.012611 1.906224 0.447181 1.259876 -21.936966 -17.112585 -10.187053 1.047182 -2.550466 -3.058488 5.169575 20.677328 -20.018023 16.703809 61.273931 -11.278747 28.182969 -4.510411 -20.036496 17.846577 -46.084856 -3.298131 -5.228165 -1.313239 23.135370 -28.287779 -1.243582 27.971225 -20.999250 32.916883 94.181641 49.332775 48.831112 1.914913 +-1.559116 96.190048 -2.072518 -95.022453 0.416159 6.177424 0.514053 -7.672285 16.927467 6.992700 -1.240771 2.073348 -13.247526 3.956623 -10.601644 0.000000 0.000000 0.000000 5.023855 -0.247395 -15.161436 3.233695 2.097933 -10.949326 -14.517091 -0.633509 -13.691179 -0.000000 0.000000 0.000000 6.870036 0.626498 3.420979 4.731277 3.847335 -7.259341 2.278529 0.198121 1.160965 -22.477665 -16.723460 -11.224932 0.285983 -3.420057 -1.941056 4.710725 20.882632 -20.199680 15.785436 61.406752 -10.303533 28.173688 -4.417649 -20.515283 21.157403 -45.777828 -1.106840 -5.324225 -1.235425 22.872567 -29.486266 1.120023 25.608291 -21.456213 31.708285 95.999927 53.416517 47.108807 0.288452 +-1.556443 96.157638 -2.137136 -94.401637 0.477898 7.801512 -0.319157 -7.860295 16.342820 6.498525 -0.924680 1.537682 -12.893835 3.745958 -11.268784 0.000000 0.000000 -0.000000 4.481855 -0.624357 -14.675313 3.174965 2.277292 -12.184097 -14.373433 0.093281 -14.457344 -0.000000 0.000000 0.000000 6.422620 1.119345 3.034588 5.052197 3.401081 -7.835134 2.080615 0.419037 0.708261 -22.640392 -17.559601 -9.648287 -1.030373 -3.652882 -3.215413 5.555225 20.702200 -19.448425 16.754004 60.946892 -11.888892 29.247192 -5.400499 -21.228776 15.334969 -46.796812 -3.519701 -4.675945 -1.622900 21.183957 -29.630777 -2.166787 25.724326 -29.606485 31.282964 93.637755 51.759493 54.327680 -2.295313 +-1.563438 96.124977 -2.102527 -94.416362 0.330775 9.006045 0.207962 -8.385660 15.595868 5.451774 0.684499 1.502117 -12.441321 3.589317 -11.732773 -0.000000 0.000000 0.000000 4.649131 -0.450356 -14.932257 3.347969 1.950570 -14.284978 -14.197356 0.997048 -13.161218 -0.000000 0.000000 0.000000 6.501059 1.778444 2.799270 5.296661 2.847591 -8.433452 2.362509 1.226068 0.476387 -24.076054 -19.917344 -5.746607 -0.925549 -2.789615 -7.770875 6.014640 19.197656 -18.354781 19.147931 61.084397 -14.964199 30.921652 -6.828454 -21.881703 4.800136 -47.436720 -7.433623 -5.744139 -2.015767 19.344211 -31.498965 -10.284278 28.980956 -39.078921 32.117607 88.450887 46.405477 59.494934 -5.180423 +-1.564600 96.180374 -1.987682 -95.202402 0.288219 8.867745 1.125148 -8.623086 16.220566 5.649718 0.864250 1.545612 -12.386286 3.385132 -12.308045 -0.000000 0.000000 -0.000000 5.598158 -0.378128 -15.904359 3.319825 1.798458 -13.984707 -14.256510 0.415395 -12.443056 0.000000 0.000000 0.000000 7.442784 2.232167 3.019507 4.632708 2.872098 -8.716569 3.043441 1.235191 0.787695 -24.541680 -19.850054 -6.787770 -0.331167 -3.147532 -7.810117 5.643356 18.504283 -18.324802 17.628967 61.716972 -13.085816 32.004999 -7.077882 -22.006660 6.662305 -46.449580 -4.983419 -7.290080 -2.961633 20.911089 -36.224417 -14.388482 31.216043 -45.700285 29.595125 83.910846 46.081013 52.139044 -8.646590 +-1.552780 96.222641 -1.972045 -95.571101 0.249571 8.587869 1.536431 -8.836344 16.311307 5.977202 1.196871 2.271061 -12.467061 3.482037 -12.791658 0.000000 0.000000 -0.000000 6.050088 -0.264408 -16.304812 3.260184 1.671396 -13.776497 -14.261683 0.206388 -11.995617 0.000000 0.000000 0.000000 7.776380 2.297560 3.169203 4.377126 2.912030 -8.737735 3.333020 1.269297 0.947858 -24.825518 -19.775423 -7.170874 0.149243 -3.212971 -7.955159 5.389157 18.203270 -18.351401 17.099332 62.040422 -12.393293 32.167865 -7.038583 -21.938997 7.907549 -45.920905 -3.911516 -7.863540 -3.259499 21.546288 -37.976447 -15.486943 31.846830 -47.390547 28.819511 82.650797 46.667194 48.477591 -9.534650 +-1.565406 96.256348 -1.783192 -96.510965 0.289227 6.019626 3.369552 -8.173629 15.939108 5.647303 0.297563 3.430551 -12.963876 2.733217 -10.982731 0.000000 0.000000 -0.000000 7.218920 -0.182018 -15.715695 2.655345 1.914167 -12.689163 -14.081314 -0.617717 -11.243695 0.000000 0.000000 -0.000000 7.837046 2.192006 3.831927 4.668500 3.110177 -8.050579 3.299253 1.332413 1.477785 -23.916296 -19.328659 -7.738005 0.736125 -2.998659 -7.467561 5.300978 18.081463 -18.442215 16.207566 62.287874 -11.372355 30.911966 -6.039888 -21.225397 8.453312 -45.886491 -4.200347 -7.756766 -3.026674 22.850273 -35.825170 -16.171305 32.712655 -46.254343 28.121604 84.762475 45.501429 49.296078 -8.642583 +-1.404960 96.158974 -1.866648 -95.989389 0.211488 4.830984 2.523160 -8.223784 16.753343 6.931200 0.840120 4.612416 -13.769096 3.240069 -11.572782 -0.000000 0.000000 0.000000 6.560377 0.264039 -14.840679 2.591025 1.891563 -12.072497 -14.025529 0.052035 -11.397253 0.000000 0.000000 0.000000 6.287499 1.459730 3.579708 5.665775 3.294695 -7.601782 2.723315 1.606570 1.298216 -22.475580 -19.197362 -6.510842 0.088019 -2.454428 -6.747988 5.991017 18.604567 -18.205667 16.534173 61.896206 -12.054396 29.694838 -5.755846 -20.635855 4.025342 -47.144059 -7.907679 -6.325040 -1.387619 21.892513 -30.538888 -14.349844 32.318886 -38.957825 30.796120 88.314142 39.890724 57.135503 -2.946471 +-1.312475 96.266121 -1.734845 -97.356329 0.115217 3.970501 5.035188 -7.316398 15.608625 5.251918 0.044607 4.069127 -13.467278 2.123397 -9.097117 0.000000 0.000000 -0.000000 8.274747 0.349589 -14.938623 2.090932 2.056012 -10.941972 -14.121925 -1.468674 -11.849618 -0.000000 0.000000 -0.000000 7.415664 0.821005 3.700908 5.536768 3.914404 -7.712939 3.236161 1.085875 1.188071 -21.933004 -17.602690 -8.899581 -0.574612 -3.163914 -1.683926 5.098760 19.370230 -18.957842 14.617061 61.877975 -9.733995 27.305872 -4.300506 -20.086952 10.724681 -47.392337 -5.343268 -6.318620 0.074403 23.073216 -27.695637 -6.998283 27.673331 -29.311961 30.417611 92.409514 44.394850 53.636198 -0.284182 +-1.189418 96.285995 -1.698718 -97.899751 0.034927 3.945774 5.613144 -7.232299 16.191566 5.372098 0.071781 3.538399 -13.563342 2.600749 -9.034302 0.000000 0.000000 0.000000 8.800153 0.604127 -15.683185 2.275904 1.948994 -10.216662 -14.202727 -1.701057 -11.816342 0.000000 0.000000 0.000000 7.530675 0.251916 3.440386 6.056372 4.216005 -8.061383 3.348832 0.901285 0.997756 -21.969210 -17.115966 -9.125776 -0.984383 -3.269452 0.838742 4.277538 19.743706 -19.787509 13.414746 62.175528 -7.808844 26.058651 -3.993516 -20.004282 17.315293 -46.448446 -1.735198 -6.791338 0.794475 23.525520 -28.336788 -2.967514 26.016768 -22.329357 30.918351 94.897249 50.375800 45.976324 0.093410 +-1.140176 96.279831 -1.735933 -97.928639 0.031152 4.297989 5.394814 -7.234501 16.437944 5.610823 -0.109071 3.433684 -13.607622 2.776854 -9.592972 -0.000000 0.000000 0.000000 8.694658 0.622069 -15.761335 2.589867 1.933406 -10.466691 -14.285635 -1.615267 -11.832283 -0.000000 0.000000 0.000000 7.323175 0.207423 3.338656 6.427329 3.982377 -8.408920 3.276979 0.861913 0.902089 -21.905464 -17.200352 -8.487184 -1.521668 -3.048868 1.415041 4.037450 19.826488 -20.148219 13.439634 62.259502 -7.921664 26.919250 -4.179041 -19.753477 19.435850 -46.077500 -0.967028 -6.760781 0.433086 23.449071 -28.767564 -3.498923 25.688986 -24.148721 30.569237 95.506791 51.499087 46.052951 -0.750011 +-1.145138 96.254143 -1.784129 -97.852105 0.037893 4.582458 5.179685 -7.260573 16.113250 5.683195 -0.191528 3.957943 -13.655122 2.469501 -10.237243 -0.000000 0.000000 0.000000 8.575190 0.519208 -15.268011 2.701886 1.990866 -11.367971 -14.293004 -1.336328 -11.697498 0.000000 0.000000 0.000000 7.037360 0.549082 3.490693 6.806568 3.381604 -8.616000 3.038795 1.006081 0.960149 -21.744205 -17.743679 -7.115926 -1.937951 -2.427419 0.449421 4.373102 19.719296 -20.045437 14.437838 62.107671 -9.740119 28.942734 -4.857990 -19.444284 16.572468 -46.199714 -3.031652 -6.467679 -0.622886 23.158896 -28.492933 -7.666908 26.590190 -32.496793 30.245944 94.443735 48.026147 51.870077 -1.756905 +-1.132700 96.135353 -1.909452 -96.957919 0.126174 5.036472 3.207716 -7.854029 18.314583 7.235652 -0.082603 3.920930 -14.127899 3.767474 -12.881850 -0.000000 0.000000 0.000000 7.296503 0.427542 -15.216951 3.188272 2.065223 -12.041152 -14.177377 0.213049 -11.240781 0.000000 0.000000 -0.000000 5.510042 0.767052 3.223845 7.996663 2.669751 -8.700309 2.107761 1.389926 1.074375 -21.211387 -18.982167 -4.030608 -2.078792 -1.206705 -2.342530 5.152394 19.751931 -19.790810 15.117605 61.887788 -10.766916 31.032914 -6.646550 -19.911886 11.870055 -45.317651 -4.664618 -6.166518 -2.263676 22.543238 -30.963776 -14.816773 31.338931 -41.412899 31.527287 91.374404 45.442385 54.258411 -4.969297 +-1.113735 96.150879 -1.776737 -97.977117 -0.051471 4.846815 4.685124 -7.867047 20.011578 6.733032 0.162779 2.476329 -14.033521 3.676895 -13.023589 -0.000000 0.000000 -0.000000 8.389285 0.755674 -16.527379 3.416204 1.923962 -12.226529 -14.271079 -0.130410 -9.613784 -0.000000 0.000000 0.000000 6.285028 1.068060 3.465187 8.130627 2.433996 -8.846064 2.345122 1.521803 1.428411 -21.867381 -19.532033 -2.930307 -0.997221 -0.604455 -3.500081 4.775035 19.443417 -19.839984 14.080482 62.253355 -9.795789 31.692964 -7.212738 -20.497913 11.465492 -44.184170 -3.487513 -7.169841 -3.771786 23.233312 -34.171291 -19.734543 33.928236 -46.947250 30.713712 88.929833 47.308405 49.861150 -9.062478 +-1.095324 96.143288 -1.711706 -98.651709 0.090063 4.316098 5.092338 -8.344137 20.769618 7.933996 0.385079 3.540752 -14.401943 4.203343 -14.219702 -0.000000 0.000000 0.000000 8.856811 0.868733 -17.150131 3.943417 1.849110 -11.827359 -14.496381 -0.399179 -8.834387 0.000000 0.000000 -0.000000 6.730493 0.954856 3.551726 7.696889 2.397376 -8.732034 3.006976 1.532172 1.628139 -22.359068 -19.457636 -2.866742 0.326775 -0.193647 -3.272147 4.601377 19.468185 -19.584939 12.863209 62.578211 -8.830104 31.265568 -7.241772 -20.837415 12.389639 -43.673468 -2.559119 -7.490131 -4.961954 23.869584 -35.776794 -21.790631 36.118850 -47.499452 29.518721 86.617484 49.333011 45.908778 -10.817764 +-1.017961 96.108726 -1.734309 -98.441840 0.266036 3.381940 4.769094 -8.526615 21.684978 8.559263 0.530999 3.587151 -14.791956 4.068136 -14.235579 0.000000 0.000000 0.000000 7.933043 1.203047 -16.768381 5.134750 1.710663 -11.428810 -14.918344 -0.622767 -8.640848 0.000000 0.000000 0.000000 6.162843 0.490443 3.078574 6.826863 2.338036 -8.359665 3.541222 1.404534 1.408072 -21.933061 -19.232421 -2.814954 1.904524 0.518669 -2.452020 5.225988 19.346977 -18.734715 13.086006 63.071145 -9.734091 30.746990 -6.746817 -20.691647 8.603895 -45.272295 -5.073515 -7.143734 -4.646930 23.604300 -32.168187 -22.218024 38.567224 -41.081125 29.770558 84.990258 45.812105 50.318101 -8.286218 +-1.065870 96.162239 -1.778311 -98.007613 0.584944 2.129380 5.143226 -7.696253 19.120537 7.052929 -0.408235 4.375082 -14.797239 3.325212 -11.287122 0.000000 0.000000 0.000000 7.165487 0.843761 -14.771348 5.286402 1.973889 -10.929544 -14.897756 -0.905576 -9.950348 -0.000000 0.000000 0.000000 5.482352 -0.038360 2.834609 6.453659 2.230432 -7.886964 3.160621 0.992411 1.004592 -20.455063 -19.005451 -3.249669 2.509432 1.228811 -0.963812 5.957793 19.287640 -18.353820 15.769676 63.342444 -12.380800 29.561288 -6.157438 -20.194041 5.084670 -46.408414 -8.135891 -6.691169 -2.948593 23.541537 -26.878815 -18.300482 39.202507 -31.519102 31.332757 84.762206 41.480566 55.892376 -3.666049 +-0.961606 96.080482 -1.870641 -96.613538 0.849514 1.633718 3.306263 -8.316877 19.767562 7.972962 0.197867 5.416753 -15.125794 4.708834 -12.259455 0.000000 0.000000 0.000000 5.301263 0.769396 -14.015259 5.640586 1.890418 -10.479835 -14.729587 0.235498 -10.414936 -0.000000 0.000000 -0.000000 3.584974 -1.041484 1.931747 6.398224 2.269839 -7.514822 2.715939 0.885371 0.575013 -19.229012 -19.383535 -2.257361 3.511448 2.099832 -0.906813 6.431357 18.949928 -18.208463 17.590518 63.819910 -13.932969 29.444855 -5.868255 -19.743261 3.226899 -46.497993 -9.500195 -6.183468 -0.645573 22.860302 -25.246075 -14.121531 39.753230 -18.950114 34.515293 84.558094 40.961194 57.142372 0.065496 +-0.922604 96.255989 -1.581891 -98.983059 0.702305 0.677553 7.592815 -7.474063 16.936947 5.673919 0.555923 5.477674 -14.605057 2.479369 -8.532983 -0.000000 0.000000 -0.000000 8.639919 1.093141 -14.640780 4.432283 1.809002 -9.637972 -14.713540 -2.053982 -10.070365 -0.000000 0.000000 -0.000000 6.503564 -1.283597 2.734591 4.571517 2.765318 -7.656009 4.222491 0.319408 0.642681 -19.907442 -18.648657 -5.322517 4.722321 1.776632 2.579053 4.995192 18.272565 -19.028021 16.923477 64.363176 -13.244702 29.149840 -3.679609 -18.805243 8.247388 -46.509464 -7.820380 -7.742666 1.120940 24.838310 -25.075539 -7.818350 36.092798 -12.991824 33.283209 88.604855 47.522947 53.942102 -0.600206 +-0.862449 96.271591 -1.554718 -99.282804 0.594900 1.063750 7.717114 -7.318271 16.948272 5.874538 0.343565 4.919285 -14.649375 2.550870 -8.346024 -0.000000 0.000000 -0.000000 9.251746 1.056300 -14.893732 3.959344 1.902571 -9.335158 -14.652325 -2.277039 -10.555305 0.000000 0.000000 -0.000000 6.757128 -1.391726 2.837590 4.706781 2.801161 -7.953321 4.096652 0.020011 0.534754 -19.429219 -18.611091 -5.968611 4.297641 1.328387 3.806238 4.311136 18.233470 -19.744942 16.612947 64.139595 -12.695872 29.574247 -2.912425 -18.512904 12.151161 -45.866626 -6.344798 -7.814462 1.799094 25.157294 -25.896684 -4.404046 33.986172 -12.135684 33.250564 91.795849 52.311112 53.559059 -1.774349 +-0.822101 96.264252 -1.572473 -99.433461 0.364283 2.063628 7.414994 -7.186284 16.690075 6.274380 0.087818 4.612814 -14.713561 2.615542 -8.815488 -0.000000 0.000000 -0.000000 9.569791 1.050771 -14.951352 3.903577 1.971077 -9.999221 -14.739720 -2.349927 -10.875958 -0.000000 0.000000 0.000000 6.853963 -1.055766 3.056590 5.179327 2.495860 -8.342030 3.877009 0.006645 0.453130 -19.172176 -18.580781 -5.664033 3.126976 0.840802 2.979589 3.861814 18.396515 -19.843755 17.462253 63.413186 -13.819972 30.379944 -2.977544 -18.731474 12.840425 -45.443864 -6.666920 -7.518245 0.919077 24.206792 -26.223350 -3.869315 31.486925 -17.592438 32.051715 92.388961 53.090057 56.339871 -3.364548 +-0.786721 96.247551 -1.613056 -99.354542 0.114000 3.162620 6.934332 -7.045464 16.508592 6.467809 -0.127892 4.331295 -14.698488 2.651450 -9.517882 0.000000 0.000000 0.000000 9.455040 1.120664 -14.962040 4.232964 1.993837 -10.966229 -14.873242 -2.244999 -11.010234 -0.000000 0.000000 -0.000000 6.670078 -0.593264 3.150919 5.748787 2.081422 -8.639569 3.530906 0.131760 0.425398 -18.631973 -18.028269 -5.232808 1.528800 0.647792 1.207675 3.720174 18.952426 -19.552439 18.786700 62.469616 -15.288263 30.879882 -3.954750 -19.573979 12.345870 -44.815182 -6.983524 -7.243741 -1.082687 23.117447 -26.969975 -5.222578 29.776989 -24.855615 29.855809 89.283361 49.874968 56.956226 -3.940031 +-0.745307 96.161621 -1.770406 -98.077015 0.077669 4.195461 4.589891 -7.082837 18.422976 7.336048 -0.819713 3.276771 -14.871547 3.984073 -11.403021 -0.000000 0.000000 0.000000 7.586773 1.089687 -14.909407 5.135756 2.092191 -11.618324 -14.859104 -0.905718 -11.207882 -0.000000 0.000000 -0.000000 4.786693 -0.467915 2.518055 7.319820 1.703412 -8.632909 2.163600 0.457681 0.440003 -17.006123 -17.092198 -4.009016 -0.480533 1.097909 -1.465668 4.316227 20.202349 -19.279418 19.919862 61.345886 -15.681810 30.184721 -6.190796 -21.151253 12.106103 -43.687645 -5.912555 -6.477340 -3.766665 22.008180 -29.717766 -7.999241 30.391288 -30.104487 28.240085 82.601974 43.191287 52.241840 -1.741450 +-0.747789 96.216064 -1.575339 -99.801269 -0.210830 3.819794 7.480537 -7.045711 17.101590 6.258335 0.220072 4.376009 -14.613167 3.280487 -10.769442 -0.000000 0.000000 0.000000 9.707235 1.604715 -15.886205 5.051230 1.801491 -12.401019 -14.870034 -1.758559 -9.241106 -0.000000 0.000000 0.000000 6.444266 -0.293539 3.064511 7.151779 1.780284 -8.604121 2.998896 1.016922 0.830139 -18.033160 -16.279148 -3.782457 -0.299390 1.783007 -3.758146 3.445532 20.164648 -18.879367 20.949725 61.139160 -16.916583 28.748141 -6.637537 -21.808758 11.872238 -43.603131 -4.703642 -7.532208 -5.844814 21.819127 -31.366604 -10.302677 28.386171 -35.148841 24.303817 77.480020 37.521845 47.131829 -0.206439 +-0.747545 96.140472 -1.702711 -99.160721 -0.094536 3.772107 6.125120 -7.105988 18.792218 7.120446 -0.332148 3.691760 -14.963760 3.940703 -11.732945 0.000000 0.000000 -0.000000 8.695557 1.540608 -15.733635 5.402389 1.851435 -12.191436 -14.893529 -0.887152 -9.427022 0.000000 0.000000 -0.000000 5.111114 -0.248571 2.799686 8.707651 1.540541 -8.438787 1.984801 1.282453 0.860904 -17.070704 -15.434736 -2.653398 -1.560199 2.022751 -4.794153 4.090200 21.000355 -18.719931 21.124367 60.320497 -17.207998 28.082983 -7.589974 -21.981900 10.595155 -43.756072 -3.973526 -5.992070 -7.622698 20.701830 -31.613968 -12.803562 27.420945 -38.873737 22.893684 73.258341 27.569078 46.744649 2.240461 +-0.782585 96.186493 -1.624033 -100.571147 -0.138587 3.007453 8.282077 -6.939010 17.506513 6.525560 -0.030437 4.377620 -14.955602 2.567892 -10.442129 0.000000 0.000000 -0.000000 10.505023 1.703748 -15.944955 4.900870 1.685078 -11.888938 -15.024319 -2.023748 -9.026651 0.000000 0.000000 -0.000000 6.572778 0.267864 3.613835 8.578342 1.392586 -8.370776 2.701976 1.153390 0.911111 -18.037715 -14.490804 -3.061595 -1.768007 1.637227 -4.052663 3.783090 21.038106 -18.541255 21.511036 59.896795 -18.668504 27.719192 -6.603091 -21.172658 9.865574 -44.481033 -3.837450 -5.404022 -9.028171 19.924631 -28.754931 -14.091879 23.382063 -42.719073 19.278690 71.143453 17.990397 47.554234 4.538449 +-0.791797 96.165382 -1.667785 -100.743365 -0.070880 2.705260 8.391649 -6.996949 17.507667 6.762293 0.019868 4.434621 -15.165664 2.250911 -10.158652 -0.000000 0.000000 -0.000000 10.705219 1.760951 -15.975471 4.774247 1.512133 -11.665288 -15.098957 -2.183042 -9.005350 -0.000000 0.000000 -0.000000 6.789245 0.848946 4.039070 9.068987 0.968393 -8.165865 2.428551 0.719686 0.664501 -18.930216 -13.824769 -2.197362 -1.784547 1.379878 -4.165541 4.222731 21.146365 -18.408020 21.981119 59.503360 -20.000070 27.978325 -6.001270 -20.682188 8.053980 -44.300194 -4.647201 -3.772083 -10.933756 18.139221 -25.412818 -15.316087 18.935378 -41.314873 17.894456 68.733691 8.407857 46.008258 8.878781 +-0.771890 96.143448 -1.723514 -100.623649 -0.068471 2.558192 8.283247 -7.020698 17.323062 6.772392 0.245900 4.572596 -15.270733 2.017071 -9.892738 0.000000 0.000000 -0.000000 10.518110 1.923138 -16.033353 4.817320 1.319481 -11.616577 -15.179889 -2.297801 -8.934471 0.000000 0.000000 0.000000 6.951747 1.451911 4.342275 9.177465 0.491736 -7.929842 2.127276 0.164382 0.317763 -19.804839 -12.887420 -1.455363 -1.673237 1.291467 -4.404805 4.837100 21.486128 -18.081075 21.978553 59.204507 -20.647765 27.905495 -5.555124 -20.599959 7.846965 -43.775133 -4.966164 -1.942375 -13.495921 16.166254 -21.925074 -16.119995 14.035886 -36.306854 17.081172 66.510952 4.422187 41.716439 11.707652 +-0.738599 96.114387 -1.790548 -100.302060 -0.141009 2.474972 7.930937 -6.972087 17.212913 6.783240 0.471892 4.689068 -15.330649 1.856238 -9.771937 -0.000000 0.000000 0.000000 9.992427 2.185218 -15.984214 5.109755 1.152166 -11.726244 -15.342233 -2.373893 -8.876721 -0.000000 0.000000 -0.000000 6.956892 1.919400 4.451310 9.108116 0.078713 -7.694010 1.799007 -0.285184 -0.066714 -20.209415 -11.736317 -1.065207 -1.758213 1.235000 -4.601206 5.677432 22.134103 -17.353559 21.134570 58.958058 -20.449682 27.388551 -5.548685 -20.669192 8.623936 -43.745239 -4.921783 -0.169215 -16.188533 14.019376 -17.740049 -18.036082 9.711576 -29.074659 17.372236 64.740368 4.070480 37.088094 13.276225 +-0.733104 96.075249 -1.843557 -100.072288 -0.238620 2.346968 7.639931 -6.945342 17.059395 6.927181 0.737225 4.805583 -15.425935 1.651345 -9.612135 -0.000000 0.000000 0.000000 9.519866 2.473851 -15.846615 5.529300 0.977648 -11.947267 -15.581049 -2.374156 -8.736417 0.000000 0.000000 0.000000 6.892205 2.290775 4.509039 9.177201 -0.259281 -7.523651 1.530076 -0.508673 -0.431435 -20.344533 -10.984749 -0.569635 -1.930991 1.014246 -4.963861 6.575600 22.755985 -16.460440 20.082285 58.718981 -20.140549 26.876278 -5.869423 -20.556684 8.518760 -44.395596 -5.108396 1.229125 -18.447919 11.832809 -12.802816 -22.171980 6.474142 -20.822635 18.683421 62.436647 2.963892 33.120978 14.024113 +-0.790582 96.027267 -1.854587 -100.064385 -0.291279 2.206933 7.507708 -7.019611 17.024235 7.274289 0.925333 4.727977 -15.596845 1.453174 -9.401909 -0.000000 0.000000 0.000000 9.326052 2.661387 -15.794398 5.936024 0.800542 -12.115311 -15.879727 -2.315808 -8.519895 0.000000 0.000000 0.000000 6.807411 2.641105 4.561255 9.474820 -0.545136 -7.442578 1.403952 -0.626108 -0.746511 -20.536838 -10.948357 0.173292 -1.792625 0.541631 -5.372767 7.326557 23.171536 -15.625510 19.298148 58.459525 -20.155350 26.799588 -6.004545 -20.045689 7.620564 -45.236019 -5.627990 2.258488 -20.323070 10.141799 -7.574816 -28.071106 4.971629 -11.544623 19.701775 57.669136 0.668206 29.379677 14.078860 +-0.888819 95.979011 -1.827317 -100.166448 -0.290594 2.115068 7.519823 -7.161301 17.063236 7.581986 1.037862 4.527116 -15.783624 1.301871 -9.180252 -0.000000 0.000000 0.000000 9.351765 2.721987 -15.870482 6.194388 0.643159 -12.187792 -16.167141 -2.258287 -8.291001 -0.000000 0.000000 0.000000 6.696477 3.056528 4.622220 9.814493 -0.924841 -7.367537 1.430999 -0.848081 -1.032290 -20.992700 -11.286106 1.163305 -1.141181 0.274352 -5.746479 7.907786 23.464097 -14.822171 19.148782 58.181348 -20.871359 27.105944 -5.583380 -19.328143 6.567496 -45.654567 -6.433748 3.214765 -22.447591 9.088201 -2.575758 -33.716221 5.207871 -2.380352 18.736861 50.504055 -0.901902 26.015805 14.148440 +-0.995587 95.936569 -1.782231 -100.233815 -0.267864 2.054861 7.668693 -7.288858 16.936623 7.564078 1.168054 4.435406 -15.914038 1.096465 -8.909481 -0.000000 0.000000 -0.000000 9.448432 2.697375 -15.880833 6.253986 0.520834 -12.301374 -16.386301 -2.191832 -8.093353 0.000000 0.000000 -0.000000 6.461967 3.531437 4.706483 10.058934 -1.516322 -7.166877 1.584362 -1.271538 -1.281914 -21.516401 -11.595746 2.334209 -0.164757 0.799160 -5.989659 8.441565 23.779263 -13.918080 19.909258 58.074856 -22.629229 27.323976 -4.830870 -18.729575 4.883997 -45.384762 -7.705616 4.273861 -24.981943 8.657313 2.193616 -38.122713 7.088449 4.964241 15.560882 41.864496 -1.154635 23.451934 14.671676 +-1.080502 95.900787 -1.754594 -100.241721 -0.256470 1.936114 7.877081 -7.354848 16.608444 7.323812 1.354106 4.568815 -15.993803 0.824783 -8.598219 -0.000000 0.000000 0.000000 9.480843 2.690721 -15.661571 6.279425 0.417545 -12.597315 -16.557730 -2.097099 -7.874979 -0.000000 0.000000 -0.000000 6.151199 3.925251 4.804786 10.219198 -2.164417 -6.774183 1.761609 -1.759336 -1.467059 -21.758375 -11.674582 3.398331 0.556734 1.907578 -6.077912 9.047110 24.181103 -12.909975 21.142385 58.334028 -24.912464 26.728873 -4.499885 -18.491430 2.106347 -44.858716 -9.242255 5.363599 -27.342469 8.500761 7.034565 -42.084104 9.935967 9.828491 11.516382 33.539683 -1.711773 21.229521 15.316098 +-1.128630 95.872147 -1.770281 -100.287054 -0.234400 1.706382 8.056157 -7.395355 16.272363 7.210978 1.511084 4.939341 -16.099640 0.651806 -8.405683 0.000000 0.000000 0.000000 9.449352 2.725491 -15.201962 6.445234 0.332853 -13.133041 -16.727365 -1.977640 -7.539067 0.000000 0.000000 -0.000000 5.912142 4.080116 4.902787 10.403395 -2.675281 -6.206573 1.892401 -2.128388 -1.531377 -21.543046 -11.682773 4.059345 0.561900 2.980063 -6.068619 9.697441 24.701706 -11.908326 22.274734 59.035438 -26.974048 24.536328 -5.039129 -18.938676 -1.806463 -44.770035 -10.608986 6.240691 -29.066929 8.394980 11.433314 -46.496140 13.356094 10.641846 7.828984 26.555663 -3.849423 19.994206 15.255341 +-1.148871 95.848518 -1.821148 -100.414714 -0.169386 1.464790 8.109371 -7.484904 16.117000 7.455859 1.562232 5.385886 -16.278984 0.676883 -8.458355 -0.000000 0.000000 -0.000000 9.422085 2.742148 -14.690924 6.739670 0.269724 -13.766796 -16.920651 -1.875552 -7.138133 -0.000000 0.000000 0.000000 5.830707 4.056329 4.976919 10.694041 -3.023741 -5.719315 1.929272 -2.313310 -1.536256 -21.088556 -11.936917 4.368341 0.054127 3.371763 -6.091250 10.280586 25.327907 -11.098668 22.723586 59.778140 -28.068974 21.432820 -5.906717 -20.005926 -5.555587 -45.392670 -11.532125 6.768233 -30.332100 8.112667 14.988757 -51.218578 16.689888 7.716638 5.306959 21.371325 -6.878689 20.840413 14.294685 +-1.127395 95.838432 -1.905224 -100.567018 -0.072837 1.353340 7.984914 -7.609008 16.125555 7.965874 1.500260 5.725767 -16.461196 0.881259 -8.699799 0.000000 0.000000 0.000000 9.424631 2.707297 -14.220368 7.010316 0.241768 -14.378964 -17.091351 -1.880132 -6.858460 0.000000 0.000000 -0.000000 5.956661 3.933411 4.926155 10.972189 -3.212610 -5.634132 1.870276 -2.318798 -1.619014 -20.543246 -12.544032 4.436243 -0.607714 2.837845 -6.074345 10.694472 25.937985 -10.690792 22.199426 60.131989 -27.666777 18.748352 -6.444449 -21.374228 -7.795279 -46.510522 -11.989943 6.716057 -31.033362 7.452700 16.951634 -55.294037 18.689747 2.285626 4.387945 19.349784 -10.060682 24.607292 13.312562 +-1.065069 95.845764 -2.010608 -100.635481 -0.008429 1.383268 7.773168 -7.671850 16.138696 8.357454 1.426714 5.854886 -16.536236 1.089049 -8.876997 -0.000000 0.000000 0.000000 9.404846 2.675686 -13.802659 7.128181 0.235227 -14.860291 -17.172598 -1.988483 -6.826124 -0.000000 0.000000 -0.000000 6.200064 3.791276 4.665881 11.011592 -3.297085 -5.930109 1.816454 -2.279881 -1.865733 -19.980058 -13.070376 4.495724 -1.028440 2.105450 -5.762832 10.978952 26.331941 -10.584871 21.398307 60.061335 -26.588527 17.493814 -6.443267 -22.363871 -8.452351 -47.410220 -12.159214 6.241640 -31.152449 6.606508 18.079024 -57.895299 19.581954 -2.025593 3.932193 19.580232 -12.312581 29.068889 13.061500 +-0.963486 95.869362 -2.144214 -100.548925 -0.018481 1.468952 7.532118 -7.601939 16.094248 8.405647 1.426031 5.763268 -16.452401 1.162651 -8.825005 -0.000000 0.000000 0.000000 9.254550 2.732377 -13.413054 7.105398 0.204976 -15.084397 -17.106467 -2.096477 -7.105535 0.000000 0.000000 -0.000000 6.480299 3.602024 4.107069 10.721651 -3.256364 -6.489839 1.782027 -2.255363 -2.262461 -19.382322 -12.922979 4.707307 -1.028016 1.953937 -4.824509 11.173285 26.372155 -10.753916 20.794412 59.728909 -25.425039 18.182011 -6.123916 -22.493676 -7.273251 -47.643661 -11.820228 5.658889 -30.614122 6.122081 18.810343 -58.307833 19.941411 -2.319966 3.330435 20.603932 -12.161957 31.610009 12.903779 +-0.865344 95.894226 -2.295715 -100.391131 -0.056706 1.461489 7.326281 -7.470508 16.004414 8.251114 1.488111 5.649110 -16.304373 1.126305 -8.607566 -0.000000 0.000000 0.000000 8.966266 2.874249 -13.015664 7.127842 0.105743 -15.137593 -16.967928 -2.107556 -7.466890 -0.000000 0.000000 -0.000000 6.713582 3.389605 3.433321 10.366996 -3.138099 -7.018037 1.735429 -2.237887 -2.614979 -18.875581 -12.189513 5.130035 -0.835193 2.493485 -3.577127 11.259984 26.215320 -11.038208 20.418544 59.473422 -24.522213 19.683781 -5.867869 -22.019146 -5.007748 -47.478274 -10.983699 5.318607 -29.896526 6.297014 19.527290 -57.447081 20.591987 0.582970 2.823296 20.882054 -9.526349 32.005074 12.052036 +-0.826114 95.909477 -2.439342 -100.327292 -0.056539 1.258750 7.313952 -7.377886 15.919061 8.011931 1.566298 5.613198 -16.170974 1.037307 -8.279424 0.000000 0.000000 0.000000 8.647381 3.045510 -12.705051 7.362078 -0.078443 -15.071885 -16.856462 -2.016832 -7.634784 0.000000 0.000000 0.000000 6.911718 3.265647 2.938174 10.215412 -2.951216 -7.291205 1.696741 -2.183244 -2.751684 -18.724778 -11.360470 5.766012 -0.586941 3.354383 -2.666160 11.146419 25.921810 -11.411305 20.248867 59.402771 -24.171775 20.813066 -5.697625 -21.191792 -2.704942 -47.263792 -10.019352 5.329057 -29.327413 7.133198 20.381355 -56.161806 21.821830 5.296453 2.628842 20.171221 -5.063103 31.164787 10.704117 +-0.854813 95.914780 -2.548843 -100.421645 0.004754 0.975608 7.523921 -7.376303 15.874658 7.751923 1.618883 5.589523 -16.072151 0.929627 -7.928309 -0.000000 0.000000 -0.000000 8.453340 3.142071 -12.559565 7.719290 -0.258455 -14.986753 -16.830860 -1.941351 -7.558184 -0.000000 0.000000 0.000000 7.098765 3.342531 2.783472 10.339323 -2.743496 -7.341038 1.661296 -2.107942 -2.695550 -18.840024 -10.957623 6.322753 -0.404674 3.774388 -2.445614 10.857814 25.578738 -11.885968 20.315006 59.312381 -24.319438 21.235592 -5.467473 -20.408754 -1.151444 -47.209560 -9.280321 5.465915 -28.929527 8.144902 21.298964 -55.281489 23.119282 9.399342 2.532279 19.394671 -1.151902 30.606850 9.407028 +-0.939083 95.915466 -2.602746 -100.629087 0.093611 0.794088 7.931431 -7.448643 15.865376 7.377502 1.662239 5.424827 -15.951297 0.749380 -7.573879 -0.000000 0.000000 0.000000 8.479140 3.097550 -12.668342 7.990511 -0.318408 -14.903543 -16.880008 -1.974239 -7.335348 -0.000000 0.000000 -0.000000 7.237173 3.748058 3.042235 10.658199 -2.582458 -7.244763 1.634696 -2.077529 -2.513579 -19.077750 -11.196363 6.496010 -0.322602 3.345589 -3.074426 10.452337 25.235275 -12.455190 20.766005 58.927500 -24.961801 21.494426 -5.058175 -19.889941 -0.493012 -47.363170 -8.911632 5.566835 -28.722981 8.966322 21.982026 -55.026285 23.807852 11.543019 2.449204 19.148757 0.272625 30.635340 8.579360 +-1.019546 95.921074 -2.626957 -100.781887 0.138408 0.802239 8.324315 -7.499356 15.824590 6.874618 1.727096 5.108254 -15.761045 0.509015 -7.222409 0.000000 0.000000 -0.000000 8.597149 2.985536 -12.912692 8.041848 -0.253689 -14.828176 -16.913815 -2.107650 -7.180782 -0.000000 0.000000 -0.000000 7.298436 4.342082 3.446693 10.900331 -2.511669 -7.142315 1.651086 -2.126868 -2.341868 -19.310046 -11.670910 6.378460 -0.269185 2.609016 -4.053423 10.050610 24.934970 -12.938242 21.492779 58.268780 -25.841029 22.246424 -4.516503 -19.592507 -0.079746 -47.610386 -8.771837 5.570282 -28.717830 9.459493 22.246723 -54.899974 23.794335 12.311559 2.314626 19.189750 -0.104218 30.668209 8.429090 +-1.048390 95.933769 -2.646605 -100.769526 0.105977 0.986987 8.497110 -7.474176 15.708353 6.381996 1.807633 4.741318 -15.534669 0.283850 -6.921503 0.000000 0.000000 -0.000000 8.666346 2.891501 -13.167102 7.867051 -0.113123 -14.774089 -16.865861 -2.293232 -7.183626 -0.000000 0.000000 0.000000 7.290062 4.922321 3.762140 10.892279 -2.547583 -7.084044 1.716405 -2.258518 -2.248701 -19.483714 -11.979316 6.172603 -0.198516 2.177620 -4.892590 9.748578 24.711520 -13.114776 22.299563 57.576450 -26.718166 23.503333 -4.025542 -19.513928 0.437608 -47.887627 -8.746201 5.521089 -28.935402 9.607152 22.084287 -54.545375 23.328557 12.359329 2.075804 19.112777 -1.005811 30.339190 8.909137 +-1.029254 95.944427 -2.673750 -100.667399 0.058257 1.161735 8.453269 -7.421608 15.574806 6.121927 1.864465 4.495557 -15.393016 0.145003 -6.721613 0.000000 0.000000 -0.000000 8.639192 2.858141 -13.343982 7.670122 -0.002140 -14.728432 -16.760823 -2.429619 -7.230024 -0.000000 0.000000 -0.000000 7.276475 5.291680 3.913443 10.757478 -2.607741 -7.041883 1.772045 -2.394797 -2.203762 -19.615697 -12.011192 6.077042 -0.125244 2.194815 -5.309822 9.561576 24.567041 -13.040505 22.862448 57.155742 -27.295128 24.530783 -3.760305 -19.583571 0.932575 -48.125555 -8.733186 5.510319 -29.178950 9.637224 21.889793 -54.051130 23.004956 12.515731 1.803931 18.858447 -1.195906 29.954970 9.354939 +-0.973176 95.941116 -2.690241 -100.578704 0.064924 1.164129 8.250311 -7.407836 15.538759 6.301364 1.851896 4.505399 -15.472904 0.137148 -6.715069 -0.000000 0.000000 0.000000 8.549765 2.883368 -13.440262 7.599330 0.024920 -14.656019 -16.643462 -2.426238 -7.177141 -0.000000 0.000000 -0.000000 7.252620 5.311673 3.945939 10.713493 -2.617194 -6.976322 1.771685 -2.448184 -2.157848 -19.760745 -11.911469 6.127270 -0.097425 2.460300 -5.260137 9.489195 24.561930 -12.855498 22.882004 57.158074 -27.268134 24.617788 -3.791077 -19.800669 1.043799 -48.210706 -8.756201 5.565572 -29.264729 9.666328 21.884611 -53.713402 23.051031 12.979203 1.600501 18.700573 -0.511900 30.020741 9.305282 +-0.906946 95.926163 -2.670026 -100.598402 0.122088 1.003444 8.132273 -7.432434 15.632694 6.679837 1.807466 4.660436 -15.700756 0.175292 -6.827838 -0.000000 0.000000 0.000000 8.539750 2.927380 -13.537188 7.623566 0.014098 -14.530113 -16.562469 -2.353002 -7.006470 0.000000 0.000000 -0.000000 7.201051 5.127469 4.001879 10.877916 -2.565847 -6.883193 1.746859 -2.401887 -2.079110 -19.964152 -11.928531 6.194292 -0.093744 2.579804 -5.112873 9.432097 24.671466 -12.734730 22.544334 57.315013 -26.861711 24.039886 -3.923509 -20.059474 0.718270 -48.138578 -8.881120 5.619448 -29.203475 9.711701 21.958326 -53.656791 23.189651 13.389116 1.508085 18.805746 0.058464 30.438935 9.021854 +-0.837164 95.908379 -2.593263 -100.763733 0.162170 0.766490 8.300271 -7.418763 15.829300 6.938638 1.787980 4.810946 -15.948928 0.173892 -6.960857 0.000000 0.000000 0.000000 8.720997 3.005011 -13.711024 7.654151 0.025806 -14.342629 -16.533610 -2.310329 -6.775290 0.000000 0.000000 -0.000000 7.100149 4.910156 4.137758 11.264726 -2.499583 -6.803645 1.729047 -2.290193 -1.981479 -20.189851 -12.143450 6.188677 -0.063808 2.450977 -5.128193 9.356371 24.826464 -12.762731 22.129001 57.412679 -26.424942 23.338361 -4.009769 -20.223564 0.216179 -47.966645 -9.063341 5.641915 -29.099827 9.753311 21.871871 -53.827959 23.102975 13.375209 1.574411 19.092329 -0.085250 30.689790 8.916780 +-0.767008 95.898941 -2.489634 -100.999079 0.136045 0.589385 8.698778 -7.323620 16.043742 6.916125 1.814791 4.854043 -16.098047 0.128957 -7.058096 -0.000000 0.000000 0.000000 9.034523 3.123400 -13.952276 7.634596 0.072343 -14.140420 -16.529108 -2.363421 -6.590729 -0.000000 0.000000 0.000000 7.013751 4.796756 4.290298 11.671773 -2.487940 -6.778103 1.728657 -2.210817 -1.914720 -20.374313 -12.385729 6.148623 0.042902 2.309313 -5.294237 9.273774 24.909245 -12.862495 21.961442 57.422685 -26.301474 23.023364 -4.021708 -20.229356 -0.149825 -47.823027 -9.241414 5.642904 -29.058195 9.787953 21.621061 -53.980753 22.820132 13.037492 1.722280 19.316581 -0.606959 30.439907 9.070103 +-0.705654 95.901184 -2.397939 -101.206071 0.052686 0.563530 9.147642 -7.182885 16.223923 6.652478 1.873148 4.766259 -16.109621 0.093015 -7.131749 0.000000 0.000000 0.000000 9.344059 3.256076 -14.213321 7.588520 0.124414 -13.979411 -16.529972 -2.491460 -6.518820 -0.000000 0.000000 0.000000 7.033123 4.817456 4.360570 11.884864 -2.568908 -6.838067 1.716622 -2.249355 -1.931244 -20.458958 -12.482716 6.123516 0.233783 2.338664 -5.424776 9.239452 24.851603 -12.986323 22.132592 57.443111 -26.537222 23.243743 -3.983036 -20.109573 -0.189608 -47.784812 -9.303076 5.647262 -29.062719 9.851976 21.372728 -53.963212 22.551162 12.733494 1.844375 19.399250 -0.788664 29.853770 9.155543 +-0.661898 95.909264 -2.335419 -101.356105 -0.030004 0.634556 9.507063 -7.070039 16.361728 6.351200 1.930041 4.602305 -16.054835 0.079815 -7.177051 0.000000 0.000000 -0.000000 9.571528 3.363934 -14.483886 7.566742 0.156803 -13.841354 -16.529022 -2.629027 -6.500964 0.000000 0.000000 0.000000 7.214471 4.879236 4.342596 11.842180 -2.667086 -6.956284 1.683770 -2.374739 -2.010933 -20.506356 -12.470002 6.108630 0.460233 2.457373 -5.399566 9.236957 24.723794 -13.087255 22.389773 57.527496 -26.796632 23.695500 -3.907213 -19.992797 -0.070483 -47.851548 -9.262024 5.638812 -29.005024 9.947741 21.320746 -53.858885 22.481582 12.769736 1.843319 19.438574 -0.315882 29.638622 8.928929 +-0.646584 95.914833 -2.316836 -101.335426 -0.067190 0.776143 9.522432 -7.048801 16.404140 6.248626 1.947398 4.446869 -16.012475 0.077840 -7.203955 -0.000000 0.000000 0.000000 9.566567 3.394894 -14.680336 7.587557 0.163138 -13.778175 -16.523326 -2.679699 -6.517605 -0.000000 0.000000 0.000000 7.449905 4.885791 4.246883 11.518978 -2.695813 -7.098257 1.645650 -2.489335 -2.115005 -20.537247 -12.447015 6.005382 0.625516 2.445143 -5.228833 9.263173 24.622614 -13.172745 22.477349 57.630151 -26.783430 24.142759 -3.776434 -19.891953 0.261232 -47.976270 -9.061786 5.575676 -28.794926 9.998850 21.537651 -53.867943 22.616258 13.240420 1.723742 19.501540 0.536027 30.200041 8.399829 +-0.648267 95.918510 -2.321458 -101.171080 -0.087778 0.919632 9.262937 -7.059012 16.360864 6.326899 1.927472 4.359474 -16.003211 0.052640 -7.223229 0.000000 0.000000 -0.000000 9.380798 3.388744 -14.763225 7.620501 0.166420 -13.796116 -16.513244 -2.653511 -6.550003 -0.000000 0.000000 0.000000 7.569847 4.824646 4.145839 11.105987 -2.635076 -7.207015 1.647763 -2.498345 -2.184430 -20.562965 -12.487290 5.829853 0.714288 2.249917 -5.120703 9.272060 24.588204 -13.214551 22.412870 57.663462 -26.596637 24.477481 -3.613225 -19.740694 0.700878 -48.102762 -8.819950 5.453523 -28.535939 9.914859 21.858929 -54.097186 22.790921 13.694210 1.631870 19.540029 0.996156 30.976356 7.956728 +-0.649929 95.917107 -2.349297 -100.762991 -0.148651 1.070593 8.631826 -7.006890 16.131556 6.551313 1.868797 4.372053 -16.000704 -0.070645 -7.192469 -0.000000 0.000000 0.000000 8.894561 3.419827 -14.681482 7.688446 0.169329 -13.924288 -16.501200 -2.561156 -6.643679 -0.000000 0.000000 0.000000 7.410372 4.695442 4.035675 10.578055 -2.466165 -7.258371 1.736165 -2.323194 -2.185946 -20.550465 -12.569662 5.582182 0.766060 1.838894 -5.172897 9.230287 24.643828 -13.151348 22.288157 57.573188 -26.332678 24.719120 -3.413065 -19.424085 1.368064 -48.236664 -8.510046 5.254133 -28.313035 9.570557 22.294162 -54.696948 22.942000 13.711721 1.676452 19.527259 0.459218 31.439561 7.719626 +-0.644376 95.917625 -2.379390 -100.296856 -0.254744 1.163826 7.963626 -6.865018 15.823186 6.739426 1.802595 4.457019 -15.976579 -0.238445 -7.108536 0.000000 0.000000 -0.000000 8.319991 3.524331 -14.497742 7.791975 0.163056 -14.082178 -16.496967 -2.481385 -6.769207 0.000000 0.000000 -0.000000 7.092698 4.572428 3.936883 10.085203 -2.275785 -7.232742 1.874550 -2.072908 -2.127947 -20.494170 -12.622842 5.450304 0.804439 1.466224 -5.320402 9.150084 24.747785 -12.946597 22.265267 57.432503 -26.205456 24.753820 -3.243410 -19.091999 1.839192 -48.385674 -8.328612 5.077853 -28.294540 9.099976 22.666492 -55.323328 23.069046 13.145054 1.759154 19.442247 -0.594550 31.395121 7.612004 +-0.634018 95.920204 -2.394302 -99.990703 -0.357282 1.143977 7.579978 -6.694872 15.587862 6.789965 1.754617 4.550801 -15.947034 -0.363068 -6.977169 -0.000000 0.000000 0.000000 7.903158 3.666432 -14.358015 7.920681 0.147602 -14.137239 -16.513975 -2.462255 -6.861336 0.000000 0.000000 -0.000000 6.857364 4.504054 3.869381 9.729839 -2.132978 -7.145571 1.996725 -1.902095 -2.045152 -20.430182 -12.637493 5.543059 0.846356 1.324985 -5.372172 9.067477 24.884209 -12.632761 22.326029 57.333584 -26.203767 24.496924 -3.139099 -18.953671 1.709112 -48.532304 -8.454795 5.047256 -28.518745 8.773020 22.801882 -55.471663 23.203989 12.506565 1.656408 19.243790 -0.888034 31.458404 7.370436 +-0.621535 95.916260 -2.388743 -99.818234 -0.432016 1.041153 7.398396 -6.534342 15.450463 6.804412 1.692110 4.639158 -15.966831 -0.397064 -6.830920 -0.000000 0.000000 -0.000000 7.611661 3.812693 -14.353277 8.094401 0.140423 -14.060775 -16.568965 -2.479548 -6.881495 -0.000000 0.000000 0.000000 6.762428 4.476148 3.786372 9.399949 -1.994315 -7.022692 2.112303 -1.829316 -1.939128 -20.375439 -12.689461 5.809302 0.888836 1.331360 -5.277826 9.014043 25.052545 -12.240738 22.333100 57.281270 -26.230632 23.991000 -3.029597 -18.975812 0.860581 -48.694898 -9.072616 5.204335 -28.856038 8.694374 22.774706 -54.873193 23.497195 12.791783 1.229955 18.802456 0.613162 32.548482 6.948025 +-0.627621 95.907051 -2.353352 -99.913318 -0.385475 0.966091 7.542325 -6.581171 15.503639 6.818866 1.688671 4.618561 -16.059478 -0.303299 -6.755720 -0.000000 0.000000 -0.000000 7.695941 3.765392 -14.528231 8.138893 0.194491 -13.880060 -16.627854 -2.492487 -6.836441 0.000000 0.000000 0.000000 6.875266 4.450010 3.781939 9.294544 -1.908422 -6.961421 2.170264 -1.919280 -1.875895 -20.408189 -12.779068 5.953105 0.955851 1.428681 -5.121933 8.940155 25.168746 -12.058630 22.137672 57.250013 -26.133501 23.823808 -2.867669 -19.045538 0.264012 -48.784851 -9.663190 5.477711 -28.915229 9.115749 22.785754 -53.494591 23.822759 15.520397 0.796786 18.438019 4.255831 34.959984 6.476671 +-0.641371 95.896622 -2.301068 -100.042741 -0.303101 1.006658 7.720657 -6.719991 15.531312 6.835878 1.726470 4.519362 -16.160298 -0.182893 -6.686763 -0.000000 0.000000 -0.000000 7.891379 3.623481 -14.741709 8.095651 0.270112 -13.720589 -16.689704 -2.512599 -6.834669 0.000000 0.000000 0.000000 6.934487 4.416027 3.825685 9.287031 -1.841541 -6.961670 2.237085 -2.025910 -1.823966 -20.453519 -12.811474 5.924893 1.069881 1.459678 -5.125149 8.810863 25.234623 -12.068745 21.903355 57.155426 -26.024183 23.960251 -2.611943 -18.968956 0.488635 -48.866691 -9.896613 5.739613 -28.764976 9.689916 22.945737 -51.739355 23.986019 19.853909 0.681965 18.641156 9.223454 37.572383 5.433173 +-0.654245 95.891907 -2.234607 -100.113258 -0.240321 1.204765 7.840918 -6.876511 15.471204 6.804643 1.797025 4.381601 -16.201049 -0.088231 -6.669611 0.000000 0.000000 -0.000000 8.089343 3.476212 -14.918931 8.002787 0.302626 -13.654945 -16.753620 -2.583789 -6.927020 0.000000 0.000000 -0.000000 6.800492 4.406268 3.950026 9.383536 -1.853552 -7.028216 2.289331 -2.073868 -1.792203 -20.475194 -12.695590 5.725274 1.323132 1.427117 -5.380696 8.661451 25.253417 -12.274608 21.763800 57.021210 -25.971172 24.236188 -2.348461 -18.707897 1.834234 -48.886920 -9.516243 5.845247 -28.604832 10.056419 22.928925 -49.986506 23.425833 24.024573 1.541719 20.277018 13.478190 38.534282 4.506449 +-0.658480 95.891144 -2.163155 -100.133962 -0.203385 1.445378 7.905413 -7.009763 15.442426 6.763051 1.863922 4.317310 -16.196997 -0.007183 -6.818853 0.000000 0.000000 -0.000000 8.235307 3.390118 -15.061925 7.942058 0.264288 -13.648567 -16.817050 -2.689399 -7.040104 -0.000000 0.000000 0.000000 6.532080 4.453077 4.147138 9.594035 -1.992792 -7.125239 2.257055 -2.066501 -1.785505 -20.482175 -12.514361 5.525401 1.704822 1.441028 -5.696472 8.597936 25.277066 -12.540868 21.648023 56.994061 -25.869054 24.345151 -2.288303 -18.462226 3.516463 -48.708868 -8.841709 5.772230 -28.674281 10.024527 22.207801 -48.523616 21.940331 26.042259 3.619391 23.236658 14.948647 37.080471 5.041258 +-0.644868 95.888870 -2.096278 -100.169738 -0.167937 1.584982 7.939588 -7.122122 15.654590 6.839862 1.884868 4.438472 -16.219543 0.121598 -7.291197 0.000000 0.000000 -0.000000 8.335584 3.382437 -15.220790 7.973705 0.175035 -13.630574 -16.853243 -2.752930 -7.054444 -0.000000 0.000000 -0.000000 6.233640 4.547100 4.412803 10.005870 -2.273612 -7.260154 2.039881 -2.009321 -1.805557 -20.433075 -12.391076 5.480232 2.030135 1.545211 -5.842910 8.692066 25.359249 -12.832725 21.344151 57.218278 -25.328179 24.028044 -2.682315 -18.609489 4.769120 -48.244251 -8.035616 5.512126 -28.989862 9.534029 20.067305 -47.457566 19.409765 23.961408 7.152195 27.809321 12.738437 33.209410 7.002761 +-0.608158 95.884041 -2.046002 -100.257039 -0.125624 1.579870 7.936174 -7.203326 16.140297 7.119333 1.815204 4.693549 -16.323547 0.355232 -8.006220 -0.000000 0.000000 0.000000 8.417292 3.417940 -15.431394 8.072380 0.116587 -13.561854 -16.828279 -2.705868 -6.918017 -0.000000 0.000000 0.000000 5.982121 4.612352 4.672801 10.589349 -2.558768 -7.439312 1.686203 -1.930304 -1.825211 -20.280266 -12.354470 5.528832 2.076068 1.681571 -5.752968 8.820035 25.537320 -13.185555 20.568836 57.590182 -23.976186 23.415977 -3.344863 -19.284859 5.805741 -47.639947 -6.942158 5.119250 -29.114700 8.900065 16.769227 -46.508144 16.575472 18.771736 11.187912 33.926338 9.713570 29.708218 8.253806 +-0.535939 95.884323 -2.022157 -100.419856 -0.102214 1.418384 7.971034 -7.200033 16.735350 7.496730 1.678053 5.057444 -16.468330 0.664585 -8.770267 0.000000 0.000000 -0.000000 8.540078 3.495864 -15.635485 8.150219 0.143064 -13.479650 -16.714406 -2.610998 -6.647519 0.000000 0.000000 -0.000000 5.810089 4.598097 4.903118 11.309336 -2.751914 -7.700832 1.252244 -1.806887 -1.781464 -20.062141 -12.371873 5.544072 1.825281 1.771260 -5.607816 8.808125 25.759112 -13.710835 19.102045 58.029249 -21.596537 22.691694 -3.989248 -20.305299 7.486692 -46.954408 -5.337775 4.518194 -28.691843 8.481645 12.568205 -45.176968 13.883123 11.557956 15.644236 42.278264 8.393580 28.762642 8.156972 +-0.439975 95.895050 -2.011192 -100.618244 -0.107924 1.209286 8.098210 -7.120242 17.244910 7.767179 1.543697 5.468088 -16.553787 0.972848 -9.464321 -0.000000 0.000000 -0.000000 8.735658 3.596115 -15.782455 8.122600 0.215643 -13.422683 -16.543241 -2.562329 -6.364980 -0.000000 0.000000 0.000000 5.691060 4.519776 5.104304 12.009283 -2.862279 -8.008103 0.816797 -1.624050 -1.651640 -19.906400 -12.399531 5.410010 1.636006 1.829128 -5.651926 8.624751 25.896267 -14.376032 17.363166 58.452140 -18.880699 22.157553 -4.456667 -21.128252 9.859288 -46.145111 -3.664860 3.715190 -27.891619 8.422084 8.135426 -43.104562 11.702902 3.585213 20.091040 52.234661 9.309378 29.221287 7.891723 +-0.340457 95.919945 -1.992638 -100.830534 -0.113448 1.052141 8.363089 -7.025203 17.632608 7.789658 1.448311 5.848726 -16.505900 1.268718 -10.089011 -0.000000 0.000000 -0.000000 9.049321 3.653471 -15.891173 7.912754 0.301656 -13.356384 -16.329010 -2.569560 -6.167962 -0.000000 0.000000 0.000000 5.681509 4.367776 5.260924 12.463580 -2.876344 -8.318130 0.428922 -1.382597 -1.411429 -19.904125 -12.487927 5.061174 1.812860 1.901275 -5.930194 8.231438 25.861744 -15.160338 15.810161 58.888685 -16.336302 22.041227 -4.771246 -21.422899 12.700603 -45.143947 -2.204879 2.644485 -26.849135 8.909202 3.479591 -40.031061 10.426877 -4.891266 24.110874 62.648116 12.692570 29.712865 7.649592 +-0.265609 95.950951 -1.956154 -101.032301 -0.074712 0.993549 8.683546 -7.001774 17.941222 7.668822 1.377079 6.144577 -16.380784 1.569695 -10.654666 0.000000 0.000000 -0.000000 9.429264 3.601392 -16.002208 7.594141 0.394240 -13.246699 -16.115686 -2.586114 -6.082713 0.000000 0.000000 -0.000000 5.819762 4.146856 5.361129 12.535933 -2.762589 -8.577137 0.159080 -1.123807 -1.114861 -19.991743 -12.764227 4.615953 2.244026 2.034220 -6.165779 7.744761 25.702819 -15.933232 14.635956 59.347660 -14.167469 22.239089 -5.057661 -21.389887 15.139372 -44.176465 -1.164918 1.393377 -25.588889 9.834884 -1.176673 -36.472706 10.321977 -13.552380 26.741090 72.065529 17.066933 30.364755 7.190954 +-0.241134 95.976913 -1.916776 -101.114890 0.026609 1.096724 8.766565 -7.106248 18.108223 7.685391 1.259925 6.358474 -16.293147 1.932358 -11.130731 -0.000000 0.000000 0.000000 9.682425 3.379370 -16.062457 7.296677 0.525182 -13.124909 -15.948043 -2.532140 -6.172568 -0.000000 0.000000 -0.000000 6.049461 3.840831 5.340945 12.111140 -2.421488 -8.711682 0.111567 -0.855768 -0.813020 -20.062021 -13.413129 4.205084 2.646305 2.274702 -6.078520 7.261719 25.462705 -16.509587 14.055875 59.756685 -12.630812 22.673518 -5.375712 -21.259729 16.366033 -43.634021 -0.741812 0.089035 -23.894950 11.134455 -5.555489 -32.863958 11.811291 -21.072588 27.868474 78.469418 21.470879 32.564008 6.150219 +-0.252230 95.989220 -1.910170 -100.952325 0.138286 1.374443 8.285851 -7.281461 18.106048 8.133481 1.018954 6.592336 -16.337288 2.432439 -11.593664 0.000000 0.000000 -0.000000 9.584669 3.056582 -15.995415 7.140552 0.703982 -13.071543 -15.827213 -2.324114 -6.448991 -0.000000 0.000000 0.000000 6.120484 3.484311 5.189531 11.495521 -1.920398 -8.714688 0.178924 -0.565567 -0.540826 -20.026938 -14.265261 3.872640 2.776121 2.563071 -5.757802 6.848793 25.241039 -16.883158 13.963622 59.995857 -11.620886 23.103028 -5.715990 -21.246693 16.838433 -43.482031 -0.598308 -1.027717 -21.945642 12.545754 -9.570284 -29.307759 14.235530 -27.020764 28.133343 82.358884 25.579705 35.923889 4.560834 +-0.276821 95.961151 -1.999278 -100.092802 0.215820 2.004909 6.349003 -7.527198 18.072126 9.591131 0.505413 6.953169 -16.630173 3.422263 -12.435764 -0.000000 0.000000 -0.000000 8.548617 2.658459 -15.618160 7.245005 0.938346 -13.084275 -15.743379 -1.561769 -7.218053 0.000000 0.000000 -0.000000 5.361705 3.057380 4.824242 11.264140 -1.352511 -8.540086 -0.056587 -0.221056 -0.345126 -19.595372 -15.005209 3.664901 2.351808 2.773833 -5.554270 6.767391 25.172937 -17.183150 14.329371 59.889246 -11.084098 23.398848 -6.245185 -21.438792 16.950203 -43.400340 -0.573639 -1.354589 -19.956419 13.804242 -13.366714 -25.583582 16.801862 -30.685720 28.297584 84.220179 28.357677 38.762431 3.591931 +-0.318564 96.021377 -2.033143 -100.148366 0.074042 2.708633 6.103606 -7.204109 17.498222 9.595868 -0.067073 5.996564 -16.409690 2.689711 -11.728194 0.000000 0.000000 0.000000 8.768060 2.505544 -15.692784 7.023935 1.082508 -13.132406 -15.699629 -2.171799 -7.866236 -0.000000 0.000000 -0.000000 5.983225 2.862597 4.767095 9.898805 -0.436997 -8.426884 0.809586 -0.146273 0.028034 -19.997890 -14.615118 1.019190 2.096453 2.204816 -3.718586 5.943407 24.944220 -17.530076 13.749106 59.775359 -9.980066 23.297557 -5.410518 -21.228812 20.207204 -43.657036 0.708051 -2.529410 -17.946760 15.486046 -16.009475 -21.357727 16.703318 -33.613933 25.949459 86.393780 32.349921 40.209628 2.566468 +-0.321969 95.986916 -2.209127 -98.950303 -0.003644 4.111161 3.691709 -7.328041 17.899030 10.727229 -0.572019 5.161575 -16.388635 3.351261 -12.645963 -0.000000 0.000000 -0.000000 7.429132 2.216964 -15.572193 7.072056 1.229215 -13.079216 -15.610620 -1.212017 -9.229971 -0.000000 0.000000 -0.000000 4.984808 2.516383 4.416391 9.682345 0.154704 -8.242496 0.587206 0.125514 0.118685 -19.421686 -14.416512 -0.058390 1.164677 1.821199 -3.836786 6.207547 25.118676 -17.901514 13.851118 59.140206 -9.634449 23.560307 -5.548121 -21.315833 20.566277 -43.950917 0.828466 -2.030787 -16.382606 16.003834 -18.883981 -17.626678 17.056516 -34.715444 25.859836 87.360728 33.412057 41.766844 3.247000 +-0.407553 96.086426 -2.171782 -99.636930 -0.319954 5.032314 5.092426 -6.884998 15.615568 9.193587 -0.336839 4.560065 -15.775324 1.940649 -10.880334 -0.000000 0.000000 -0.000000 8.743510 2.132270 -15.718370 6.313756 1.232378 -13.396652 -15.599614 -2.099884 -9.867540 -0.000000 0.000000 -0.000000 6.278241 2.622637 4.896021 8.493570 0.739595 -8.225326 1.611085 0.362706 0.366207 -20.352571 -14.170867 -2.203979 1.119543 1.232885 -3.583780 5.638952 24.529003 -18.009931 14.282959 59.007029 -10.302236 22.820515 -4.616179 -21.054846 21.366253 -44.645840 1.034166 -3.218176 -15.009003 16.431368 -19.602393 -14.709152 15.791116 -36.804057 24.295473 88.158906 37.473434 43.339135 1.808567 +-0.489669 96.102974 -2.179145 -99.607432 -0.434196 5.994664 5.298967 -7.121508 14.783461 8.483295 0.263987 4.297487 -15.377634 1.735097 -10.781459 -0.000000 0.000000 -0.000000 8.970406 1.957644 -15.935556 6.034792 1.172258 -13.549757 -15.590285 -1.834310 -10.430204 0.000000 0.000000 0.000000 6.507090 2.590364 4.969878 7.987632 1.056389 -8.131001 2.112920 0.701075 0.414791 -20.878335 -14.657702 -2.531112 1.042254 1.137621 -4.502796 5.743048 24.120749 -17.654544 15.042862 58.810726 -11.213332 22.596994 -4.704003 -21.547084 18.220234 -45.512018 -0.171764 -3.582936 -13.892794 16.131132 -20.909426 -13.243928 16.488650 -38.031703 24.797140 86.663351 40.987157 45.794683 -0.982350 +-0.578562 96.122444 -2.203841 -99.432617 -0.425677 6.527498 5.417508 -7.311273 14.669120 7.659990 0.590666 3.778363 -14.954176 1.583532 -10.695839 0.000000 0.000000 -0.000000 8.782193 1.785563 -16.075689 6.064507 1.149829 -13.263243 -15.629435 -1.599102 -11.103877 -0.000000 0.000000 0.000000 6.526467 2.528985 4.812836 7.532244 1.401165 -8.002061 2.458539 0.798011 0.461298 -21.019493 -14.948458 -3.238380 0.905553 0.944176 -4.225492 5.834832 24.023801 -17.228464 15.261658 58.669242 -11.017436 22.210934 -4.898006 -22.491497 15.671544 -46.116070 -0.984108 -3.885043 -12.855702 16.518758 -22.365895 -11.738386 17.828423 -38.400106 24.943046 84.214039 44.991410 46.666246 -4.502817 +-0.653651 96.147598 -2.231177 -99.257233 -0.334759 6.224452 5.744511 -7.401720 14.842669 6.746040 0.867871 3.593543 -14.563676 1.478184 -10.366857 0.000000 0.000000 0.000000 8.343167 1.776938 -16.036350 6.368566 1.117108 -12.695363 -15.653809 -1.484964 -11.419929 -0.000000 0.000000 0.000000 6.406208 2.303436 4.469973 7.205093 1.788682 -7.799868 2.642858 0.827187 0.552458 -20.928926 -15.226776 -4.007842 1.061059 0.827732 -3.148630 5.855112 23.957145 -16.965533 15.196721 58.744594 -10.016481 21.434232 -5.040140 -23.503234 14.023557 -46.174826 -1.442517 -4.302003 -11.608654 17.669790 -23.712101 -10.033748 19.896891 -36.753846 24.908971 82.495741 47.305887 44.748770 -5.496230 +-0.706352 96.177711 -2.265961 -99.150407 -0.205667 5.317845 6.149779 -7.350612 15.090874 6.024905 0.964840 3.686651 -14.288696 1.364340 -9.783998 0.000000 0.000000 0.000000 7.892983 1.851457 -15.774055 6.690470 1.122219 -12.025980 -15.640832 -1.549177 -11.463592 -0.000000 0.000000 -0.000000 6.314804 1.871999 4.097185 6.975089 2.233085 -7.571314 2.694256 0.866998 0.669876 -20.571961 -15.433217 -4.923670 1.184605 0.697277 -1.611013 5.812938 23.832574 -17.027405 14.904938 58.951912 -8.718263 20.627648 -4.930835 -23.949931 13.209823 -46.012955 -1.861903 -4.809821 -9.899374 19.253663 -24.268257 -8.220483 22.018805 -33.693393 24.977934 82.982395 47.476921 42.728358 -4.032345 +-0.734116 96.202423 -2.320170 -99.108745 -0.022509 4.099945 6.259133 -7.214414 15.451388 6.034569 0.686821 3.935248 -14.295307 1.376925 -9.173930 -0.000000 0.000000 0.000000 7.540032 1.866405 -15.279929 6.852957 1.216127 -11.352657 -15.591712 -1.745920 -11.405313 -0.000000 0.000000 -0.000000 6.336136 1.181654 3.803891 6.969240 2.723692 -7.374758 2.569114 0.925986 0.743714 -19.937767 -15.530079 -6.000563 0.830938 0.442736 0.238361 5.727308 23.687257 -17.619986 14.354444 59.168415 -7.460669 20.160694 -4.519654 -23.401264 13.585664 -45.877223 -2.244609 -5.360373 -7.482874 20.973079 -23.596717 -6.024086 23.646132 -29.981984 25.576930 86.713497 46.142776 42.886472 -1.616885 +-0.744432 96.184067 -2.463261 -98.429845 0.303869 3.247031 4.641930 -7.167649 17.005025 7.489810 -0.462945 3.596116 -14.729165 2.289618 -9.511126 -0.000000 0.000000 0.000000 6.377892 1.575288 -14.648574 7.107551 1.493390 -10.480015 -15.539005 -1.521061 -11.938447 0.000000 0.000000 0.000000 5.672722 0.280348 3.311986 7.577511 3.203932 -7.218567 1.857745 0.858994 0.687145 -18.705936 -15.371815 -7.203660 -0.371046 -0.046951 2.477701 5.776444 23.978007 -18.663989 13.165868 59.118594 -5.568342 20.190022 -4.194838 -22.472653 16.176080 -45.634995 -1.795743 -5.398566 -4.896419 22.669474 -23.238450 -2.826268 24.956781 -26.262051 26.626105 91.947799 45.386113 44.983659 0.186820 +-0.742698 96.176956 -2.499743 -98.392030 0.480334 2.756864 3.934995 -7.272955 17.704849 8.773972 -1.034289 3.743885 -15.091102 3.172808 -9.763090 0.000000 0.000000 -0.000000 6.165119 1.442552 -14.623503 7.212858 1.623369 -10.115733 -15.515821 -1.564981 -11.767403 0.000000 0.000000 0.000000 5.813177 -0.512267 3.118874 8.032334 3.689131 -7.217997 1.684754 0.924911 0.615881 -18.702331 -15.625492 -7.660137 -0.899408 -0.276630 3.601962 5.477910 23.728771 -19.789298 12.260454 59.321769 -4.557782 20.264232 -3.717253 -21.568994 19.117750 -45.765707 -1.208452 -5.953822 -2.498233 23.793548 -24.138334 -0.049155 25.689693 -23.654416 27.437776 97.014966 48.376475 47.458998 0.943455 +-0.732079 96.195305 -2.467258 -98.695052 0.488334 2.693794 4.047070 -7.278735 17.881382 9.228055 -1.218079 3.711312 -15.183087 3.484884 -9.782787 0.000000 0.000000 0.000000 6.474109 1.466664 -15.010581 7.274150 1.668189 -9.977208 -15.560499 -1.881508 -11.488495 0.000000 0.000000 0.000000 6.426088 -0.922323 3.111906 8.173328 4.036551 -7.412804 1.868940 0.920054 0.532600 -19.089559 -15.779247 -8.076149 -1.092236 -0.448728 4.533358 5.030332 23.394018 -20.651787 11.275201 59.551728 -3.766250 20.649224 -3.303279 -20.987160 22.413333 -45.991037 -0.190246 -6.500997 -0.949292 24.636656 -25.822054 1.813238 25.789552 -22.918911 27.474349 100.159379 53.497810 49.248994 0.220625 +-0.715794 96.204948 -2.429677 -98.667103 0.401807 3.230278 4.007219 -7.235375 18.219413 9.018086 -1.309647 3.301931 -15.062042 3.612052 -10.244909 0.000000 0.000000 -0.000000 6.500395 1.469508 -15.374102 7.328178 1.700940 -10.113320 -15.554417 -1.809164 -11.578974 0.000000 0.000000 -0.000000 6.580605 -0.891404 2.999426 8.425409 4.033332 -7.723877 1.841230 0.888946 0.417450 -19.023331 -15.826362 -7.871949 -1.367060 -0.510978 4.668349 4.917231 23.280827 -20.918207 10.898991 59.466090 -3.715946 21.556055 -3.348226 -20.989496 23.982848 -46.199020 0.513144 -6.172280 -0.744275 24.596900 -27.622737 1.701508 25.653594 -25.016793 27.152562 99.244066 58.905206 51.005451 -2.914132 +-0.703716 96.207947 -2.380706 -98.500774 0.286520 4.020323 4.040914 -7.205541 18.557484 8.316796 -1.229913 2.773769 -14.815118 3.567966 -10.884401 0.000000 0.000000 -0.000000 6.488562 1.415873 -15.585052 7.247070 1.730904 -10.473643 -15.468444 -1.451897 -11.833646 -0.000000 0.000000 0.000000 6.492069 -0.590554 2.851314 8.747667 3.802195 -8.056199 1.653130 0.916229 0.337131 -18.559377 -15.890878 -7.233371 -1.782948 -0.496189 4.055642 5.107984 23.262802 -20.835554 11.275877 59.137660 -4.461470 22.683203 -3.703392 -21.251093 23.396480 -46.395539 0.504972 -5.471226 -1.410176 24.172863 -29.020685 -0.141289 25.625209 -29.017936 26.796898 95.046885 62.673268 52.600341 -7.335646 +-0.706821 96.190811 -2.319658 -98.272888 0.211100 4.802462 4.051978 -7.310618 18.976737 7.602515 -0.968334 2.236633 -14.618678 3.710427 -11.577685 -0.000000 0.000000 -0.000000 6.444320 1.301201 -15.648733 7.124511 1.749006 -10.984370 -15.287892 -0.702493 -11.973082 0.000000 0.000000 0.000000 6.166250 -0.154099 2.678796 9.356304 3.426550 -8.302398 1.262119 1.089842 0.314588 -17.998633 -16.344087 -5.863013 -2.251676 -0.196790 2.391094 5.620395 23.146439 -20.709107 12.607275 58.753684 -5.985604 23.836449 -4.683319 -21.769832 20.054899 -46.243124 -0.337531 -5.145371 -2.563967 23.775845 -30.609192 -3.980025 26.945482 -33.864973 27.157187 88.117474 61.258867 52.191551 -10.269960 +-0.721925 96.167992 -2.219951 -98.303834 0.138171 5.247085 4.409228 -7.523585 19.220003 7.083145 -0.435996 1.987264 -14.541110 4.075380 -11.980250 0.000000 0.000000 -0.000000 6.623603 1.309998 -15.854246 7.138932 1.681659 -11.530299 -15.120477 0.062868 -11.534154 0.000000 0.000000 0.000000 6.023687 0.243692 2.586464 10.117235 3.091374 -8.446057 0.933044 1.391512 0.345576 -18.035389 -17.227614 -3.908582 -2.273598 0.460917 0.051241 6.066337 22.715836 -20.785544 14.250191 58.654136 -7.524608 24.585439 -6.019389 -22.484306 16.014078 -45.551477 -1.122643 -5.696869 -3.661994 23.694095 -32.842450 -8.491994 29.225126 -37.665350 28.192205 81.096653 56.638549 48.458708 -10.668047 +-0.714829 96.170448 -2.014404 -98.936712 -0.052637 5.120675 5.778590 -7.793729 18.902976 6.506197 0.772408 2.336136 -14.460571 4.216602 -11.777367 -0.000000 0.000000 -0.000000 7.481525 1.710204 -16.438847 7.237306 1.385922 -12.204280 -15.097224 0.202779 -10.084691 -0.000000 0.000000 0.000000 6.606244 0.436311 2.718646 10.429400 2.976740 -8.508955 1.201965 1.802834 0.441881 -19.222443 -18.298514 -1.936604 -1.273009 1.242330 -2.342304 5.934028 21.753461 -20.850900 15.511641 59.151685 -8.783437 24.662946 -6.729413 -22.963523 12.656489 -45.042379 -1.805174 -7.014596 -4.013572 23.652386 -34.298081 -11.838215 30.570647 -38.649596 29.186064 77.637791 53.603883 44.269238 -9.862010 +-0.762427 96.226326 -1.744756 -100.160069 -0.007741 4.076374 7.661531 -7.719449 17.711012 6.376806 0.931694 3.323959 -14.586573 3.356973 -10.464910 -0.000000 0.000000 -0.000000 9.023013 1.760124 -16.540531 6.980671 1.378309 -11.854630 -15.155794 -0.672238 -9.434042 -0.000000 0.000000 0.000000 8.035335 0.548019 3.129741 9.719496 3.160337 -8.400929 2.106682 1.682546 0.600650 -20.158446 -18.000825 -2.697230 -0.509533 1.227634 -1.398225 5.712612 21.353241 -21.071743 15.138209 59.432827 -8.434996 24.321232 -6.352192 -23.163787 12.408798 -45.129141 -2.034591 -7.733021 -3.943290 24.983594 -33.712103 -11.968468 30.700614 -38.172990 27.807573 77.245604 52.063690 42.351323 -9.353391 +-0.814976 96.198585 -1.797948 -99.294236 0.256849 3.216771 6.361098 -7.407293 18.102033 7.039121 -0.165394 3.367221 -14.925673 3.316155 -10.084708 0.000000 0.000000 0.000000 7.940880 1.443554 -15.589311 6.832250 1.673008 -10.770098 -15.175696 -0.566898 -10.621937 -0.000000 0.000000 -0.000000 7.222038 0.244201 2.792857 9.548642 3.433574 -8.255078 1.654817 1.305624 0.414060 -18.983706 -16.952942 -4.151646 -1.182861 0.617243 1.357662 6.547318 22.125676 -21.458396 13.975121 58.899216 -6.770744 23.822416 -5.973714 -23.324476 13.157604 -45.780913 -2.456540 -6.542582 -3.046252 26.003433 -30.678987 -9.745730 30.980205 -33.291371 27.492772 80.374961 49.240073 44.925873 -7.203121 +-0.838650 96.127197 -1.834466 -97.851984 0.553366 2.744528 4.070266 -7.545378 19.165697 8.296047 -0.961355 3.421051 -15.371990 4.430283 -10.607641 0.000000 0.000000 0.000000 6.508524 0.953846 -14.693605 6.192329 1.914144 -10.001191 -14.787322 0.619965 -11.640554 -0.000000 0.000000 0.000000 5.481710 -0.340760 2.258115 10.304693 3.693808 -7.978749 0.563112 1.306749 0.320380 -18.030278 -16.890251 -3.998217 -1.714973 0.255677 1.822544 7.119057 22.734757 -21.828254 14.119298 58.379030 -6.343743 23.061203 -5.682957 -23.203901 13.367530 -46.320563 -3.041296 -5.185806 -1.708873 25.532673 -28.333268 -6.560371 30.931809 -26.452237 29.319866 85.072938 47.980374 48.168258 -3.919437 +-0.854004 96.213806 -1.607842 -98.876044 0.579526 2.269465 5.706030 -7.345384 18.769014 7.809623 -1.048704 3.295065 -15.150161 3.413574 -9.605246 -0.000000 0.000000 -0.000000 8.556084 0.789745 -15.298480 4.526095 1.978896 -9.052767 -14.671193 -0.999036 -11.759901 0.000000 0.000000 -0.000000 7.147663 -0.676166 2.745813 8.778478 4.450431 -8.076295 1.687390 0.976560 0.567366 -18.713510 -15.572101 -7.815052 -1.483470 -1.363428 5.194145 5.973279 22.900442 -22.500463 11.804257 58.418758 -4.229181 22.569659 -3.618943 -22.119325 20.107296 -46.808755 -0.738082 -5.590259 -0.588593 27.051676 -27.123157 -1.008953 27.372043 -21.967531 27.255233 91.447306 51.228924 48.329649 -2.262777 +-0.857937 96.241936 -1.467753 -99.288420 0.483160 2.462107 6.569724 -7.326528 17.936426 7.282373 -0.638091 3.468821 -14.976978 2.992349 -9.106539 0.000000 0.000000 0.000000 9.704030 0.744196 -15.737749 3.416596 1.932905 -9.061829 -14.500473 -1.620139 -11.572748 -0.000000 0.000000 0.000000 7.900989 -0.827881 3.099009 8.280302 4.750632 -8.246665 2.250629 1.094030 0.633391 -19.843906 -15.525695 -8.682472 -1.252322 -1.995072 5.390202 5.257091 22.737874 -22.895181 11.567638 58.439533 -4.368805 22.486868 -2.835712 -21.571967 22.894683 -46.974402 0.239279 -6.061295 0.027772 27.083864 -27.004037 1.633016 25.560588 -20.570650 26.929908 95.543010 53.667121 49.418825 -1.642975 +-0.842144 96.230255 -1.434470 -98.967754 0.383509 3.262977 6.087534 -7.329799 17.714742 7.222203 -0.668888 3.242804 -14.911277 2.919464 -9.483517 0.000000 0.000000 0.000000 9.588316 0.636763 -15.747244 3.195300 1.959526 -9.437344 -14.485020 -1.452114 -11.969498 -0.000000 0.000000 -0.000000 7.707331 -0.751205 3.082536 8.426933 4.602791 -8.493011 2.192013 1.150164 0.468618 -20.262628 -15.430621 -8.372978 -1.516683 -2.224908 4.993141 5.255310 22.832265 -22.966193 11.772527 58.257907 -4.952653 23.247219 -3.048556 -21.578231 23.347769 -46.756197 0.468386 -5.702878 -0.236868 26.535385 -27.862178 1.772546 24.941449 -23.655057 26.199151 95.630496 55.025613 51.675194 -3.127798 +-0.820767 96.205727 -1.418255 -98.410080 0.312738 4.076251 5.227730 -7.337223 18.056144 7.287040 -0.854143 2.797657 -14.875938 3.012005 -10.247146 0.000000 0.000000 0.000000 8.878749 0.595167 -15.709438 3.607218 1.992710 -9.882711 -14.596078 -0.966415 -12.343003 -0.000000 0.000000 0.000000 7.123146 -0.516404 2.882495 8.756584 4.259913 -8.737575 1.838038 1.124690 0.293456 -20.040007 -15.331728 -7.494128 -1.774809 -2.066395 4.530055 5.504999 22.963785 -22.844737 11.943916 58.186494 -5.293011 24.292003 -3.659622 -21.668009 22.814079 -46.154431 0.561202 -5.197460 -1.081216 26.143212 -29.674051 -0.035576 25.426422 -28.502097 25.491962 92.388221 55.544456 52.104625 -5.458013 +-0.826015 96.150894 -1.397793 -97.604591 0.363388 4.451967 4.020997 -7.488894 19.205473 7.648887 -1.086381 2.409351 -14.982506 3.689615 -11.427803 -0.000000 0.000000 0.000000 7.691797 0.544635 -15.618167 4.285552 2.053570 -10.248470 -14.630529 0.018516 -12.334024 -0.000000 0.000000 -0.000000 5.906305 -0.226771 2.594579 9.542684 3.825957 -8.750229 1.063371 1.213308 0.355461 -19.283296 -15.870573 -5.589081 -1.756847 -1.321617 3.225725 5.696998 22.967476 -22.513745 12.585695 58.356956 -5.740292 25.212185 -4.598633 -21.503199 21.435487 -45.159761 0.552220 -4.969607 -2.359278 25.816792 -32.396136 -3.900379 27.643833 -33.480200 26.142862 87.027031 54.288581 49.299332 -6.507115 +-0.875528 96.104492 -1.289584 -97.434199 0.393135 4.114308 4.051175 -7.737773 19.817514 7.642069 -0.718046 2.777423 -15.101770 4.236450 -12.094142 0.000000 0.000000 0.000000 7.372658 0.627778 -15.721991 4.644684 2.020105 -10.796488 -14.611068 0.687318 -11.251076 0.000000 0.000000 0.000000 5.197774 0.137180 2.747054 10.288208 3.433667 -8.523568 0.592487 1.560557 0.778270 -19.127390 -17.284260 -2.976511 -1.071077 -0.182451 0.706029 5.317712 22.560375 -21.931519 13.881896 58.825430 -6.944801 25.849914 -5.427724 -21.019379 19.207999 -44.382010 0.129948 -5.590288 -3.787769 25.427527 -34.686498 -8.748388 30.094880 -38.337069 27.652994 82.606419 52.163451 46.236705 -6.685578 +-0.974473 96.137039 -0.983835 -99.132896 0.312709 2.846190 7.137247 -7.854092 18.531586 6.743290 0.471540 4.441534 -15.087625 3.627631 -11.184031 -0.000000 0.000000 0.000000 9.606472 0.981692 -16.443408 4.217325 1.790607 -11.374836 -14.662788 -0.327462 -8.797185 0.000000 0.000000 -0.000000 6.654092 0.561109 3.847595 9.966085 3.298673 -8.163761 1.523601 1.963294 1.564462 -20.492529 -18.785269 -1.521130 0.416445 0.636093 -1.575122 3.844493 21.798379 -21.184566 15.026427 59.574059 -8.385307 25.800504 -5.402745 -20.551385 18.060086 -44.175511 0.043049 -7.348552 -5.087809 25.557506 -35.457505 -12.257468 30.900389 -43.238736 27.318469 81.916295 51.587970 44.289283 -7.894557 +-1.099084 96.187439 -0.800425 -100.265920 0.505532 1.613284 8.855263 -7.590176 17.973031 6.521246 -0.058014 5.214478 -15.246078 2.917772 -10.226431 -0.000000 0.000000 0.000000 11.080163 0.832683 -16.569135 3.714728 1.969384 -10.729651 -14.761983 -1.695683 -8.224850 -0.000000 0.000000 0.000000 7.643618 0.908912 4.804960 9.501877 3.298454 -7.719025 2.136196 1.698825 2.250914 -20.327291 -18.534637 -2.910212 0.224188 0.369933 -0.407816 2.958981 22.600774 -20.670605 14.225754 59.389160 -7.399236 25.113188 -5.234825 -20.808081 20.868167 -44.038628 1.264956 -7.678488 -6.700259 26.641503 -35.038661 -12.305732 31.137715 -46.952273 24.678733 83.634607 52.074038 44.119785 -9.469625 +-1.126733 96.105774 -0.763933 -99.842855 0.589246 1.194112 8.043027 -7.851847 19.265474 7.440757 -0.032921 5.236326 -15.763482 4.005589 -10.958416 0.000000 0.000000 0.000000 10.504768 0.918770 -16.461494 3.934818 1.884629 -10.919818 -14.785594 -0.958436 -7.488938 0.000000 0.000000 -0.000000 6.533071 0.751081 4.729913 10.505324 3.129167 -7.360035 1.579365 1.915539 2.401041 -19.844421 -19.259686 -0.987666 0.019759 0.803462 -2.198767 3.219814 23.084538 -20.089737 14.852586 59.125957 -7.616086 23.872943 -5.996603 -22.257657 17.615041 -44.400674 0.093765 -7.309846 -7.142279 25.345716 -33.180470 -13.244652 32.160908 -44.326350 25.655812 86.960254 49.725274 46.612185 -8.208456 +-1.141060 96.147766 -0.644612 -100.456394 0.598769 0.694617 9.160393 -7.435331 18.100327 6.930091 -0.309958 5.691456 -15.743754 3.014396 -9.735688 0.000000 0.000000 -0.000000 11.385615 0.964298 -16.060729 3.619832 1.883237 -10.369061 -14.925613 -1.889339 -8.069384 -0.000000 0.000000 0.000000 7.141248 0.565944 4.903406 9.734991 3.417775 -7.302558 2.224200 1.522550 2.317278 -18.968671 -17.933633 -3.307779 -0.619789 0.028467 0.766149 3.169784 23.947354 -19.969990 13.526108 58.695128 -6.052446 21.881713 -4.980535 -22.920247 19.782155 -45.169613 0.461226 -6.933633 -6.669636 25.940498 -29.448981 -9.567904 29.948068 -39.592563 23.637778 91.767568 49.741973 48.667030 -6.276224 +-1.103997 96.137886 -0.590808 -100.205441 0.591006 0.695729 8.817203 -7.341248 18.665033 7.041488 -0.548039 5.168025 -15.803997 3.232138 -9.709777 0.000000 0.000000 -0.000000 11.138961 0.977871 -15.761086 3.630383 1.855887 -9.800473 -15.019065 -1.726722 -8.906942 -0.000000 0.000000 0.000000 6.566688 0.106423 4.449802 9.802432 3.766180 -7.349395 2.108250 1.279903 2.008073 -17.618507 -17.154085 -4.506423 -1.311082 -0.568972 3.175646 3.203833 24.407676 -20.173764 12.634857 58.599559 -4.729297 20.461444 -4.227845 -22.803694 21.733370 -45.435023 1.002208 -6.659450 -5.117286 26.007332 -26.831237 -5.939114 28.161831 -32.417692 24.425125 95.804361 49.666121 48.060931 -3.023213 +-1.088629 96.153885 -0.474295 -100.509727 0.538874 0.565172 9.594727 -7.310431 18.326323 6.535031 -0.134252 5.177286 -15.649936 3.102823 -9.221386 0.000000 0.000000 0.000000 11.624020 1.114227 -15.846093 3.497966 1.749849 -9.573434 -15.071834 -1.986273 -8.977904 0.000000 0.000000 0.000000 6.649731 -0.233217 4.349929 9.600764 4.122328 -7.385497 2.494936 1.244731 1.797124 -17.317529 -17.180782 -5.078415 -1.401025 -0.877750 4.791891 2.682259 24.138429 -20.461229 12.733726 58.934066 -4.802672 19.743182 -3.400474 -21.860825 23.641820 -45.504409 1.592814 -7.275875 -3.306870 25.949141 -25.042363 -2.921387 26.493697 -26.633059 25.542287 99.049629 49.618524 46.013166 0.033692 +-1.113434 96.166115 -0.414155 -100.627526 0.543628 0.526074 9.920701 -7.321097 18.162812 6.285348 -0.010364 5.091034 -15.551520 3.061433 -8.953996 0.000000 0.000000 0.000000 11.806025 1.068018 -15.959727 3.452231 1.808164 -9.478470 -15.122318 -2.228477 -9.006721 0.000000 0.000000 -0.000000 6.628522 -0.252290 4.465140 9.663751 4.219483 -7.339372 2.626124 1.125336 1.708898 -17.432644 -17.605929 -5.059699 -1.654861 -1.099574 5.757174 2.109146 23.974495 -20.744693 13.575088 59.137023 -5.665401 20.276818 -3.076536 -20.877061 25.203485 -45.338122 2.080900 -7.567321 -2.390425 25.854329 -24.432084 -0.839115 25.380576 -24.751922 25.830515 100.579443 48.561016 45.437013 1.701362 +-1.151044 96.170692 -0.390024 -100.625071 0.533571 0.687673 9.883003 -7.337458 18.010216 6.297597 -0.084534 5.080816 -15.539611 3.050969 -8.986932 -0.000000 0.000000 -0.000000 11.786773 0.968832 -16.084546 3.544028 1.925012 -9.732061 -15.201968 -2.425132 -8.883562 -0.000000 0.000000 0.000000 6.587306 0.024744 4.671517 9.876253 4.022802 -7.338430 2.544585 0.954148 1.687614 -17.910652 -18.133975 -4.510971 -1.827569 -1.139122 5.883193 1.807909 23.927812 -20.917438 14.664705 59.188993 -6.785328 21.459176 -3.267634 -20.444436 25.613058 -44.959344 2.080273 -7.469477 -2.597660 25.686396 -24.764034 -0.145887 24.821629 -26.372335 25.267983 100.303099 46.758893 45.917198 2.567240 +-1.171936 96.165153 -0.371525 -100.562803 0.438889 1.233616 9.564718 -7.316790 18.047724 6.501790 -0.339242 4.905874 -15.590504 3.204980 -9.407803 0.000000 0.000000 -0.000000 11.682537 0.904348 -16.302407 3.783334 2.025390 -10.292424 -15.308108 -2.411332 -8.697013 0.000000 0.000000 0.000000 6.552050 0.524046 4.765505 10.151406 3.593778 -7.550925 2.249733 0.771822 1.695166 -18.395931 -18.526682 -3.679566 -1.789392 -0.886913 5.177995 1.907331 23.963833 -21.052494 15.252321 59.158830 -7.177459 22.785353 -3.958194 -20.777591 25.435998 -44.116122 2.125642 -7.260124 -3.934498 25.822187 -26.707533 -1.391154 25.484927 -30.507305 24.281181 97.736907 46.101495 45.115130 1.739834 +-1.171638 96.151794 -0.332515 -100.530342 0.279588 2.024609 9.194502 -7.257143 18.343179 6.758965 -0.697553 4.474273 -15.659410 3.528386 -10.054759 0.000000 0.000000 -0.000000 11.655404 0.870650 -16.557499 4.041530 2.102511 -10.864094 -15.433075 -2.218218 -8.638186 -0.000000 0.000000 -0.000000 6.501508 1.011846 4.706690 10.442231 3.168665 -7.895971 1.870588 0.657572 1.709964 -18.574776 -18.742320 -3.026670 -1.635748 -0.474502 4.203849 2.202730 23.989721 -21.182623 15.155013 59.102830 -6.777493 23.864389 -4.735342 -21.299884 25.383747 -43.193503 2.302432 -7.193238 -5.561693 26.285813 -29.464080 -3.712782 26.931662 -35.115148 23.712104 94.047565 47.047902 43.093018 -0.003903 +-1.164980 96.101173 -0.323583 -100.096969 0.184216 2.990519 8.008854 -7.268803 19.634122 7.451799 -1.451391 3.484906 -15.890140 4.361368 -11.310298 -0.000000 0.000000 0.000000 11.146923 0.657279 -16.540965 4.324222 2.285917 -11.083245 -15.555851 -1.394604 -9.205284 -0.000000 0.000000 0.000000 5.765829 1.310235 4.384244 11.204486 2.793004 -8.165432 1.049401 0.649148 1.703536 -17.886649 -18.874854 -2.395469 -1.875037 -0.004319 3.083628 2.923818 24.231557 -21.199937 14.623506 58.797856 -6.020876 24.689413 -5.707933 -21.772639 24.434015 -42.819041 1.955195 -6.825688 -6.908094 26.605169 -32.053554 -6.874141 29.198320 -39.796023 24.464780 90.027063 48.321564 42.380036 -2.007410 +-1.162651 95.992096 -0.254968 -99.790850 0.020926 3.756834 7.447631 -7.814831 20.535970 7.925177 -0.696605 3.402632 -16.165403 5.774201 -12.780904 -0.000000 0.000000 -0.000000 10.883852 0.761795 -16.734425 4.577213 2.118322 -12.243694 -15.498586 0.265298 -8.241263 -0.000000 0.000000 0.000000 4.678497 1.441832 4.129348 12.850011 2.280338 -8.231327 0.130086 1.417402 1.755543 -18.306145 -20.879357 1.532769 -1.052442 1.568980 -1.875957 3.455637 23.376318 -20.719825 16.527314 59.075818 -8.187919 24.890192 -7.185415 -22.335695 17.912888 -43.049249 -0.193242 -7.371534 -7.463192 25.005084 -33.823753 -12.804172 32.464086 -43.671554 28.206007 86.379191 48.203378 42.833559 -3.815136 +-1.238711 96.072510 0.018007 -101.776027 -0.041843 3.315372 10.476837 -7.656634 18.731715 7.071065 -0.333189 4.173947 -15.987438 4.238157 -11.373929 0.000000 0.000000 -0.000000 13.631719 0.717648 -17.236289 3.779732 2.097635 -11.846697 -15.538483 -1.348332 -7.950955 -0.000000 0.000000 0.000000 6.919888 1.614921 4.944744 11.471448 2.509066 -8.205823 1.743651 1.218514 2.056123 -19.421535 -20.163310 -0.938448 -0.452596 1.125411 -0.345238 2.742760 23.266136 -20.434610 15.329715 59.329808 -7.651097 24.037841 -6.313869 -22.351938 18.961604 -43.689827 0.254757 -8.183506 -7.835633 26.266563 -33.701557 -12.497968 31.402295 -46.722580 25.341616 85.242258 50.769204 42.791769 -6.721430 +-1.313373 96.076256 0.134891 -102.440407 0.040533 3.016660 11.644127 -7.867769 17.444928 6.779414 0.215016 5.174443 -16.065113 3.992866 -10.721790 0.000000 0.000000 -0.000000 14.636449 0.580462 -17.175716 3.335471 2.050528 -11.645180 -15.515665 -1.546952 -7.930739 -0.000000 0.000000 -0.000000 7.504135 1.573495 5.296209 11.288295 2.538608 -8.070772 2.191452 1.290243 2.123117 -19.948423 -20.196703 -1.139967 -0.158829 1.127385 -0.632687 2.759260 23.286172 -20.007394 15.539613 59.461063 -8.116536 22.345271 -6.275496 -23.099156 16.554429 -44.388343 -0.469374 -8.404200 -7.972741 26.128638 -32.759543 -12.734042 31.416480 -46.553653 24.810669 84.594928 51.517997 43.369458 -8.040919 +-1.393374 96.073341 0.138300 -102.408514 0.232469 2.633592 11.718633 -8.020820 17.612495 6.713729 0.231947 5.139394 -16.060459 3.965721 -10.408794 0.000000 0.000000 -0.000000 14.564491 0.459298 -17.067630 3.280415 1.970502 -11.279718 -15.510108 -1.495578 -8.022269 0.000000 0.000000 0.000000 7.574262 1.365577 5.187778 10.991266 2.688981 -7.910180 2.318873 1.102248 2.046545 -19.786050 -19.702997 -1.758539 -0.218585 0.801475 0.094269 2.938042 23.700298 -19.795829 14.965783 59.367736 -7.395590 20.759299 -5.800847 -23.749267 15.723219 -45.092126 -0.845605 -7.974033 -7.746027 26.020835 -30.815848 -11.147609 30.631812 -41.978258 24.237213 86.320504 50.481926 44.358189 -6.179432 +-1.468230 96.078094 0.105434 -102.210407 0.400674 2.135458 11.644838 -8.038827 17.902262 6.525543 0.147739 4.929538 -15.964786 3.765358 -9.975794 0.000000 0.000000 0.000000 14.234178 0.438502 -16.871654 3.322535 1.863417 -10.836161 -15.563954 -1.607018 -8.192565 0.000000 0.000000 -0.000000 7.591793 1.118870 4.991369 10.499245 2.928897 -7.800930 2.452111 0.877289 1.921032 -19.321753 -18.988700 -2.832267 -0.371025 0.325565 1.386033 2.988379 24.023134 -19.751747 14.211410 59.301755 -6.469423 19.719265 -5.061298 -23.786483 16.516825 -45.636827 -0.832351 -7.645753 -7.084417 26.125772 -28.338697 -8.872160 29.556119 -36.022926 24.130755 89.528847 49.230624 44.999041 -3.227371 +-1.534246 96.078751 0.057901 -101.896879 0.501886 1.584830 11.447561 -7.977258 18.096775 6.355151 0.090745 4.898043 -15.850053 3.667323 -9.603792 -0.000000 0.000000 -0.000000 13.781756 0.502533 -16.595855 3.355195 1.779972 -10.494951 -15.622485 -1.752187 -8.260771 -0.000000 0.000000 0.000000 7.462978 0.902650 4.860576 10.148052 3.169620 -7.680963 2.483934 0.777183 1.828524 -18.875000 -18.551502 -3.610810 -0.451652 -0.044255 2.164619 2.788979 24.003903 -19.874926 14.054655 59.385323 -6.274511 19.765818 -4.474420 -23.002624 18.333308 -45.792917 -0.564742 -7.614593 -6.044589 26.168182 -26.045430 -6.869992 28.739599 -30.504129 25.189478 93.270905 47.624781 45.148872 -0.226808 diff --git a/data/gradio_human/bvh/000708.bvh b/data/gradio_human/bvh/000708.bvh new file mode 100644 index 0000000000000000000000000000000000000000..b1245ed4c65e2afb2d4e050c7b8f6b4c05fcf9d8 --- /dev/null +++ b/data/gradio_human/bvh/000708.bvh @@ -0,0 +1,197 @@ +HIERARCHY +ROOT joint_3128009143 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_3095699716 + { + OFFSET 5.659700 1.017830 -9.058814 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1726421641 + { + OFFSET 3.825843 -0.627751 -35.531322 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_132207077 + { + OFFSET -1.537450 3.711881 -36.457790 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3264224812 + { + OFFSET 2.847295 -11.420543 -4.985844 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_396593456 + { + OFFSET -5.625093 0.898211 -8.889191 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2198230946 + { + OFFSET -3.772874 0.171158 -36.422077 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3287897233 + { + OFFSET 1.671101 3.664619 -36.299397 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1747479872 + { + OFFSET -2.328376 -11.847854 -4.287172 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_3730462863 + { + OFFSET -0.264308 2.507220 11.286632 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2403096931 + { + OFFSET 1.031003 -1.072757 16.003370 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1230490324 + { + OFFSET 0.103244 -1.696144 5.970602 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2035619977 + { + OFFSET -0.132393 2.028674 20.121174 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3749906687 + { + OFFSET 0.988185 -5.553662 7.383417 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + JOINT joint_408431726 + { + OFFSET 7.570128 2.550323 11.546081 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3078640559 + { + OFFSET 9.085510 0.887260 2.413414 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1599716102 + { + OFFSET 23.969933 2.169971 -1.037790 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_86764776 + { + OFFSET 23.375410 0.595938 0.640223 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 8.271320 0.460200 -0.828124 + } + } + } + } + } + JOINT joint_1718067033 + { + OFFSET -7.868145 2.852892 10.902870 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1791882276 + { + OFFSET -9.973220 0.685927 2.612803 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2971727967 + { + OFFSET -23.251417 1.679162 -0.874967 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3102869284 + { + OFFSET -23.875307 1.072404 0.357927 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -7.952037 -0.033256 -0.858522 + } + } + } + } + } + } + } + } +} +MOTION +Frames: 63 +Frame Time: 0.050000 +-0.874229 108.353905 2.208687 -82.617703 -3.355432 0.383736 -14.120402 -5.948582 -6.086921 23.591320 3.696407 -3.722688 6.325357 4.272327 0.024463 0.000000 0.000000 0.000000 -18.807441 6.265266 0.906997 29.128824 -7.567636 -8.699060 13.803479 -7.693347 3.606561 0.000000 0.000000 -0.000000 0.093011 2.465070 -3.043696 5.076400 -3.752791 -7.016141 -5.125405 -0.444961 -3.745546 12.910804 4.925501 -6.191613 -27.065881 -7.318318 2.424535 19.862649 12.034379 1.758212 10.145142 59.660211 -0.596498 10.035306 -24.969829 -96.167004 -30.637310 18.016500 -32.196317 19.321375 -5.729869 -2.651213 30.044145 -72.553670 22.078999 -8.283190 25.045635 121.568706 -53.872464 -36.345973 14.905345 +-1.606723 116.071511 2.388631 -84.784223 -2.689544 -2.072582 -21.680253 -3.437495 -10.480119 59.566148 5.920989 -4.516827 1.572498 1.718203 5.298410 -0.000000 0.000000 -0.000000 -25.773747 1.017227 4.187573 65.722400 -13.865121 -7.748945 6.048660 -5.959412 0.775886 0.000000 0.000000 0.000000 1.234059 3.440128 -2.014992 5.914644 -5.168789 -5.471853 -7.687152 1.128271 -2.713195 15.655325 1.104045 -6.236703 -23.098034 -5.461834 2.128897 21.416865 19.891290 -2.528368 3.681343 62.229434 5.836373 13.095316 -27.353683 -66.150951 -19.346627 13.652910 -27.464975 22.895508 -11.897712 1.467614 9.225241 -70.138580 -0.719180 -11.483018 31.866545 109.680263 -51.036784 -25.321551 20.754204 +-2.335173 120.147194 2.138076 -89.701576 -0.687110 -3.286270 -28.431124 -0.266051 -11.272005 103.799624 4.804557 -7.102429 -0.274367 -1.540731 5.670126 0.000000 0.000000 -0.000000 -29.136579 -5.013145 5.194234 108.730478 -20.767463 -3.123675 5.947340 1.281736 -2.200823 -0.000000 0.000000 0.000000 7.952508 2.424363 -1.875756 5.159837 -5.872090 -3.956669 -9.883003 1.475694 -1.357716 18.834359 -0.546613 -8.722472 -21.101693 -5.227151 2.749937 18.933074 22.162856 -9.726457 -3.086742 60.926483 9.726833 19.424373 -24.052700 -37.910896 -8.608010 30.058877 -12.294865 23.355256 -12.888134 9.605621 -3.136095 -63.591944 -14.338316 -5.961798 36.399060 93.495260 -55.854711 -27.002524 12.066984 +-3.264255 121.373208 2.509535 -94.354458 0.977311 -1.933344 -26.659863 0.681158 -12.418811 138.202703 3.776221 -12.182845 14.671841 -1.821429 5.747327 0.000000 0.000000 -0.000000 -24.780912 -4.286039 5.288373 142.012848 -19.527426 6.345451 22.097250 1.548082 -0.831700 -0.000000 0.000000 -0.000000 11.365985 1.084229 -2.265090 9.174878 -8.160560 -4.023426 -12.079693 1.557363 -0.962550 21.354858 0.339104 -11.736013 -22.071358 -5.441935 4.202884 18.950023 20.698268 -13.212502 -4.550868 57.764194 15.834030 16.529048 -22.590278 -46.235430 -9.703778 39.367051 -7.536239 21.171752 -10.890068 13.373708 -6.633111 -62.887216 -20.402187 -7.678183 28.144100 94.473333 -62.023950 -34.087695 5.243776 +-3.447109 121.908463 3.181900 -97.839384 2.699561 -0.967949 -20.952606 0.123044 -11.359819 146.548057 4.333654 -13.353055 38.181903 8.679676 1.917356 -0.000000 0.000000 -0.000000 -21.745642 -2.317213 7.219509 148.198255 -14.015970 6.947470 40.108095 -2.053181 6.217657 -0.000000 0.000000 0.000000 13.214568 -1.610839 -3.507146 11.920616 -9.940879 -4.014981 -13.434762 1.063670 -0.742885 23.951508 2.348664 -12.398802 -22.754038 -5.333093 5.305686 19.069386 18.289567 -10.304498 -6.538390 53.956301 22.605304 11.541132 -18.933568 -66.430000 -19.224074 47.031265 -6.929925 18.719192 -9.478891 11.334745 -10.039227 -66.943914 -25.117749 -10.489025 19.078742 98.018486 -59.959686 -26.490111 13.210110 +-3.073771 121.510567 4.203562 -97.842323 4.477123 0.133472 -20.149114 3.071904 -7.579964 128.926552 8.039866 -11.622423 12.352897 2.744349 5.976451 -0.000000 0.000000 -0.000000 -23.576880 -4.285885 7.998152 132.956427 -15.426332 3.426279 16.859926 5.367088 -2.028640 0.000000 0.000000 0.000000 14.774920 -5.221192 -5.424927 5.468695 -10.502041 -4.559621 -10.432827 -0.588748 -1.379877 26.312312 3.943035 -11.149719 -22.788029 -3.440226 7.546138 20.139489 16.480630 -4.399420 -9.679847 53.227477 27.753265 7.077257 -16.243172 -79.742192 -39.080263 43.544785 -7.587884 20.129012 -10.424606 8.100477 -9.341518 -67.071388 -23.573771 -10.353714 15.733100 91.985401 -54.266537 -13.999797 23.553790 +-3.120654 118.659501 4.624565 -94.484984 4.800320 0.609113 -22.940563 4.162891 -3.961359 105.375193 8.622462 -5.468428 -13.385999 -3.306463 5.634157 -0.000000 0.000000 0.000000 -28.784228 -3.697802 7.783967 112.538865 -12.750091 -1.303432 -3.280444 5.977265 -3.794047 -0.000000 0.000000 -0.000000 13.806672 -7.683138 -6.932898 -0.061990 -9.876970 -4.828039 -6.301269 -1.685522 -1.687469 22.140715 4.415169 -8.085823 -21.020361 -1.803906 8.267071 19.671124 15.296572 1.127040 -11.410859 53.659305 29.344307 1.759111 -15.387820 -90.922397 -43.966937 35.391028 -16.796834 19.719623 -12.038014 4.761958 -8.669211 -67.004202 -22.030866 -11.789235 13.482543 83.345013 -45.908860 -7.138696 27.235536 +-3.168539 113.136704 4.800627 -92.153308 3.821676 -0.238098 -22.497067 3.257967 -3.001826 76.008891 10.012501 -0.945691 -19.443899 -3.607537 5.106804 0.000000 0.000000 -0.000000 -27.667572 -0.320126 7.585777 84.092324 -8.161793 -6.635604 -2.693255 2.305339 -6.825721 -0.000000 0.000000 0.000000 13.754630 -8.299760 -6.498988 -1.189174 -8.689754 -4.785912 -5.842418 -2.190481 -1.584210 18.222135 6.390963 -7.150580 -20.805284 -2.478295 9.039087 19.989204 14.508684 3.554572 -12.196588 57.322125 26.976735 -5.435166 -19.674349 -98.366143 -38.982294 23.233372 -28.221811 19.252315 -11.032680 2.832501 -10.514211 -69.883519 -23.781761 -13.058601 13.791092 77.342083 -41.768961 -4.676062 27.782212 +-3.240651 105.604286 4.795334 -89.657778 2.755736 -1.631118 -22.127820 1.495758 -2.577178 49.377280 10.062078 3.681212 -15.400368 -2.083619 7.000557 0.000000 0.000000 0.000000 -24.271088 3.018055 6.684332 54.244703 -3.336836 -5.713493 2.439045 -0.139102 -6.358767 -0.000000 0.000000 -0.000000 11.290731 -8.194468 -5.734982 0.090532 -7.062682 -4.863822 -4.202734 -1.910139 -1.614928 14.371770 8.328651 -4.510355 -23.418731 -3.438110 8.056981 18.841089 14.309948 6.408974 -10.403486 62.092192 20.202184 -9.680680 -25.761296 -100.726895 -38.005689 10.670364 -36.836275 20.261602 -11.638430 1.452562 -8.113021 -71.684417 -18.057423 -11.454267 17.630821 74.966067 -42.295549 -5.297456 30.823658 +-4.250390 95.073043 4.500814 -88.277096 1.985036 -2.547762 -24.265017 0.138136 -4.961229 41.395400 8.335095 -6.987518 -19.444043 -5.276003 6.682559 0.000000 0.000000 0.000000 -23.115840 5.332728 7.246155 43.068008 -3.817667 -1.138522 -7.487889 -0.938248 -3.701434 -0.000000 0.000000 -0.000000 9.694845 -6.462643 -4.144177 7.106997 -6.997081 -4.930408 -6.570034 -0.779921 -1.981362 11.467408 5.858619 7.849449 -29.030187 2.734144 -0.404356 10.035476 14.625279 8.230066 17.581010 65.576633 -5.120594 -17.072363 -23.969716 -96.426142 -28.373369 4.817065 -42.024658 14.795104 -13.066960 2.560225 12.995676 -72.675183 -0.459981 -11.127107 22.710532 75.346993 -45.725560 -4.423728 34.844736 +-5.532493 85.313087 3.041144 -89.185497 1.821677 -3.168285 -32.121921 0.225001 -6.193686 55.776264 7.227123 -13.169247 -35.042861 -10.734831 4.047733 0.000000 0.000000 -0.000000 -28.563474 4.955442 6.388343 55.772385 -3.201162 1.295655 -28.316284 2.731887 -5.161398 0.000000 0.000000 -0.000000 16.153901 -5.505160 -3.007219 6.416039 -4.749162 -4.766999 -6.388013 -0.601641 -1.679293 4.213978 5.510955 9.432739 -27.437723 3.037003 -1.105620 5.574844 14.519356 3.110979 25.829679 65.663875 -14.653976 -17.691254 -26.381328 -86.831366 -23.345640 6.067707 -38.669833 11.370411 -14.140746 7.988649 26.703189 -72.393632 12.458587 -11.399626 26.519872 75.027680 -46.319261 -4.742642 36.701244 +-5.958863 81.727233 1.032446 -90.868812 1.955958 -3.505750 -37.369979 2.044915 -7.907815 65.490196 7.210533 -10.994406 -36.210309 -13.090140 5.748832 0.000000 0.000000 -0.000000 -33.776159 3.078307 8.789056 66.052894 -3.539750 1.120102 -29.267836 4.852428 -7.172586 0.000000 0.000000 0.000000 24.063710 -5.528383 -2.617531 6.457251 -2.793479 -4.280994 -7.946041 -0.096322 -1.365082 -1.323187 4.468972 10.026108 -25.976391 2.856950 -1.805827 4.040303 13.564890 -3.082333 33.299299 63.531333 -25.891998 -11.322786 -29.560012 -69.348847 -16.151615 5.526864 -35.961942 9.552462 -12.127748 13.090300 36.936952 -71.215075 23.438823 -9.563015 28.364123 73.241945 -45.602678 -5.359953 36.378356 +-5.781242 82.691161 -1.137228 -89.732450 1.867858 -3.569069 -38.474941 2.788205 -8.340208 62.311126 6.468929 -10.592631 -33.455263 -13.081550 7.123929 0.000000 0.000000 0.000000 -35.373011 2.542800 9.771750 63.350404 -3.810469 0.114731 -27.173823 5.427278 -7.813136 -0.000000 0.000000 -0.000000 28.665711 -5.309767 -2.649870 5.679205 -1.608383 -4.155965 -9.303820 -0.091778 -1.391824 -2.620251 4.260716 10.223974 -28.256274 2.397296 -2.120327 3.556638 13.208841 -5.245942 38.153020 63.846540 -30.067813 -3.752757 -32.430806 -61.125710 -10.736136 2.896144 -38.238824 9.652928 -11.341388 15.624934 37.194526 -69.803458 24.621863 -7.379323 29.020998 74.060301 -43.474465 -6.987525 38.138369 +-5.291884 86.324378 -3.568798 -85.020183 0.995254 -4.088628 -39.399843 -0.045492 -6.780128 50.922614 8.761334 -8.772222 -29.061132 -8.082298 4.361598 0.000000 0.000000 -0.000000 -37.406319 4.168367 8.912342 53.281349 -3.994577 -1.052075 -21.709810 3.561858 -6.592884 -0.000000 0.000000 0.000000 28.782680 -4.568098 -3.047710 3.058319 -0.621644 -4.075485 -7.787305 0.119183 -1.454648 -6.126359 3.670538 10.558277 -28.166599 2.558654 -2.770827 4.396047 14.561098 -3.736391 41.744001 63.839853 -32.070080 -0.393631 -32.963726 -59.876293 -13.922496 -3.018297 -42.066515 10.759803 -11.825994 14.029422 37.484837 -70.120773 26.729726 -5.827773 27.804100 76.007390 -44.667280 -3.886260 39.201761 +-4.837613 90.130576 -5.710792 -81.364445 0.667409 -4.613911 -37.697353 -3.623562 -4.551579 38.439981 10.687610 -4.740652 -24.703706 -4.087000 4.615357 -0.000000 0.000000 -0.000000 -37.797039 5.453474 7.549861 44.692034 -6.124818 -2.812880 -18.050068 0.754665 -4.757962 -0.000000 0.000000 -0.000000 28.956892 -3.642021 -3.209866 1.515332 -0.366320 -3.735524 -7.352527 -0.133916 -1.719302 -5.976739 3.599847 10.590331 -30.314590 3.388796 -3.591334 5.034984 14.907636 -1.955923 44.866280 64.152555 -34.157001 3.008064 -33.369120 -58.130331 -16.776484 -7.842075 -45.040242 11.383191 -11.891798 12.931763 36.723017 -70.064887 25.084579 -3.635311 27.304836 75.843061 -44.830010 -1.464189 40.941845 +-4.623665 91.270789 -7.392785 -78.853307 1.041327 -4.804865 -38.281467 -4.274551 -5.337447 36.406706 8.541444 -0.044545 -22.311440 -5.918852 9.211648 -0.000000 0.000000 0.000000 -39.449872 5.273841 5.806587 46.785937 -10.577884 -3.565131 -16.666846 -2.933714 -2.289305 0.000000 0.000000 -0.000000 27.436972 -2.265167 -2.958601 1.566133 -1.068777 -3.935618 -6.403241 -0.695183 -2.211937 -6.854386 3.118982 10.828407 -29.990231 1.427524 -4.764916 5.175770 15.138510 -1.127523 44.372409 65.791517 -34.122213 2.394607 -31.090252 -56.681850 -14.839351 -6.782438 -44.392055 12.065744 -13.276864 12.023961 29.152927 -68.193213 17.187664 -1.539235 26.549010 75.015013 -40.329160 -4.287689 39.397259 +-4.425465 90.059318 -8.732195 -78.147565 0.791311 -4.507165 -39.350518 -2.760421 -8.539482 43.309540 6.761696 -4.468231 -24.563011 -7.333369 8.857671 0.000000 0.000000 0.000000 -39.581181 4.740408 4.284743 53.768689 -13.833558 -3.148175 -16.059876 -1.940025 -2.248376 0.000000 0.000000 0.000000 27.764550 -0.324283 -2.966672 1.116137 -1.679862 -4.392808 -6.440285 -1.489176 -2.627208 -6.714795 3.011370 9.824080 -31.247223 -1.293841 -5.649596 5.230570 15.967717 -2.864815 43.165688 66.415338 -33.866112 -2.385193 -25.558806 -53.310968 -17.409711 -9.192389 -44.357740 11.228961 -14.323407 12.767242 25.700962 -67.924678 13.022571 -0.988911 25.318872 71.834921 -38.748291 -1.969637 38.999545 +-4.057096 86.283843 -9.596245 -79.181892 0.530271 -4.248300 -41.494382 -0.721732 -10.970792 57.506295 5.860069 -9.110579 -30.076983 -9.182094 9.440711 -0.000000 0.000000 -0.000000 -38.331587 3.063793 4.774594 63.283288 -14.101756 -1.793572 -21.285642 2.853987 -5.403411 -0.000000 0.000000 -0.000000 28.275523 0.700273 -2.471026 1.014980 -2.223594 -4.794685 -7.184179 -2.040799 -2.165896 -7.832009 4.009460 7.618071 -32.488168 -3.011387 -5.601819 6.331295 18.182972 -7.430382 33.903433 62.910615 -27.636894 -7.624126 -20.019890 -50.884034 -21.431301 -4.522410 -40.976296 11.569146 -16.322806 16.597569 19.220428 -67.587792 6.836015 -4.961092 24.426439 71.331688 -39.445824 -0.997730 37.424443 +-3.811886 81.799979 -10.009730 -81.921878 0.272240 -4.293670 -39.896581 0.135343 -10.859232 65.532009 5.544397 -13.331206 -39.902208 -13.508834 9.534929 0.000000 0.000000 -0.000000 -35.389459 1.520782 5.063206 70.424366 -12.063375 0.800787 -30.778283 7.602259 -7.300397 -0.000000 0.000000 0.000000 28.755718 1.201273 -1.816722 2.790123 -2.551313 -4.622469 -8.386887 -1.989486 -1.801924 -13.922787 2.996931 8.037188 -28.303820 -0.811128 -5.890290 5.339845 18.262156 -8.527502 25.882432 58.036970 -25.247223 -14.137976 -16.922802 -55.990855 -17.932585 6.989128 -37.142449 10.012423 -18.887379 18.319493 16.925552 -66.262366 6.625449 -13.946143 22.403843 79.391254 -39.661613 -8.407827 32.383217 +-3.665257 81.498870 -9.622647 -83.811149 -0.368760 -4.321622 -37.153738 -0.452962 -9.653198 65.321862 6.931288 -13.740208 -42.963677 -14.381267 7.384466 0.000000 0.000000 0.000000 -31.113663 1.195688 4.611760 67.816990 -10.688482 0.030649 -36.675727 9.449693 -8.108450 -0.000000 0.000000 0.000000 26.562555 1.102953 -1.635291 1.787044 -2.053433 -4.583894 -7.517632 -1.606357 -1.779530 -13.823116 2.436102 7.896206 -26.573833 1.500351 -6.531478 2.990999 13.276567 -6.835758 22.155819 56.266703 -25.899135 -21.267681 -16.994350 -76.262094 -19.594362 17.314535 -32.229770 7.088582 -16.342195 15.990627 21.046422 -66.161855 16.697689 -20.493999 22.838625 98.005123 -42.584010 -16.877371 26.534692 +-3.951980 86.988837 -7.506126 -83.832226 -1.185921 -4.247696 -29.947345 -1.861063 -7.875291 53.425550 7.541483 -11.778492 -35.819172 -10.008861 4.629841 -0.000000 0.000000 -0.000000 -23.858487 2.068348 3.865027 54.589768 -9.527333 -3.151226 -29.375591 6.915738 -6.977776 0.000000 0.000000 0.000000 17.684275 0.992924 -1.246963 4.164480 -1.882709 -4.306199 -8.096439 -0.608544 -1.581529 -8.401689 2.012956 7.760758 -24.232999 2.067987 -7.288459 3.366302 10.885012 -5.476780 20.467175 52.093179 -23.933824 -22.002132 -16.951184 -97.194830 -17.340165 26.444027 -32.084502 6.952516 -12.696862 13.369035 28.129225 -67.705072 26.711912 -21.094764 21.736642 115.171875 -43.646108 -22.800762 22.310742 +-4.834506 97.880783 -4.900734 -81.274856 -1.705501 -3.968669 -21.556154 -4.120726 -8.175356 32.789952 6.849941 -9.777860 -15.282834 0.281019 3.865467 -0.000000 0.000000 0.000000 -17.912635 1.705522 3.738171 37.559275 -9.301152 -7.592756 -7.177145 0.005406 -5.898863 0.000000 0.000000 0.000000 5.592700 2.632939 -0.791432 5.130168 -3.156159 -4.007668 -8.524566 -0.575919 -0.946602 3.217504 5.253199 6.256144 -25.240765 -1.447754 -7.601641 7.092336 13.422743 -2.160620 21.294403 49.836950 -19.417506 -10.339535 -17.844174 -95.617970 -16.812399 37.002665 -27.732713 13.574485 -13.416965 12.123150 29.032955 -68.240181 25.683425 -10.146061 20.364912 112.874659 -44.526128 -33.012467 17.216263 +-5.814696 108.501579 -3.169188 -78.913617 -1.077051 -2.801520 -23.876156 -5.189096 -12.405077 39.782805 5.737414 -10.785438 -4.963195 2.449361 8.931210 0.000000 0.000000 -0.000000 -21.963652 -1.610037 4.884279 49.616057 -14.855807 -7.855662 -1.700068 -4.259811 -5.499846 0.000000 0.000000 0.000000 -3.963638 4.631072 -0.004126 7.461480 -4.561074 -3.925707 -12.472268 -0.997010 -0.976028 17.298556 8.739901 1.979670 -29.654788 -8.080913 -6.811034 11.196309 19.944927 -2.180215 16.955653 45.223270 -7.956841 0.620570 -20.119241 -78.257548 -9.555482 49.404603 -19.588036 20.512914 -16.836132 13.760730 15.015229 -67.383970 6.095064 -4.588322 19.577767 102.017824 -47.191372 -40.795022 9.451644 +-7.032921 113.668556 -2.728269 -82.400601 -0.598925 -1.349490 -31.443829 -3.699101 -17.843945 83.127719 6.503210 -11.616241 -7.993577 -9.903764 20.197351 -0.000000 0.000000 -0.000000 -27.110475 -5.733399 4.061468 91.887876 -24.230204 2.956124 -7.917292 -0.871351 -3.628041 -0.000000 0.000000 0.000000 -3.396828 7.337214 0.589523 10.213196 -5.484159 -3.675776 -14.816235 -0.546872 -1.521538 16.149701 6.065650 -0.397108 -24.907313 -9.744789 -4.607741 14.272065 19.369571 -2.389963 10.130363 41.794718 0.302732 5.308707 -22.458680 -59.309109 -7.321421 53.215447 -9.171340 18.529336 -15.029738 11.740092 2.067091 -66.278036 -9.258779 -7.061555 16.282074 101.615111 -54.156340 -38.701286 7.084070 +-7.576958 115.636132 -2.673939 -86.881564 -0.181187 -1.527216 -34.022002 -2.168681 -19.824390 128.997060 4.795079 -14.875645 -13.752575 -20.270920 24.096107 0.000000 0.000000 -0.000000 -27.535212 -7.154051 3.345700 137.514391 -23.493455 19.754825 -10.682090 3.293979 1.450030 0.000000 0.000000 0.000000 1.062730 6.705742 -0.785139 7.318871 -5.134702 -2.341352 -12.457412 0.550550 -1.336430 16.542050 4.639994 -0.722596 -25.440186 -8.396424 -3.911748 14.778578 16.416411 1.538166 0.766971 39.243449 11.178944 0.913846 -22.089208 -54.347301 -10.685810 49.538971 -8.095115 15.663204 -11.365746 8.045574 -14.555932 -61.231912 -23.724655 -10.046392 11.356932 104.889218 -55.529181 -32.256901 14.048416 +-7.158836 116.201310 -2.025733 -88.919223 -0.435527 -4.532593 -30.630122 -3.089717 -16.244661 148.356244 8.245416 -20.619667 -13.452255 -22.546291 23.709901 0.000000 0.000000 0.000000 -27.509884 -2.976721 6.103508 151.595868 -13.465119 25.119920 -3.694472 0.957888 9.301902 -0.000000 0.000000 -0.000000 2.418713 4.300821 -1.025102 5.268004 -4.565098 -0.010433 -10.910313 1.758125 -0.126881 17.880586 1.948587 2.429203 -25.600061 -1.951257 -4.909554 12.765258 11.465019 7.855022 -2.925097 39.009029 20.957648 -6.807804 -22.116057 -65.510909 -18.042997 46.837073 -9.104161 14.044346 -9.417620 4.453441 -20.167537 -57.608746 -27.399499 -14.526080 7.806262 100.842467 -54.137200 -26.588656 17.242941 +-6.851156 117.001107 -0.385120 -90.110005 0.382134 -4.945681 -29.149292 -3.624978 -9.822085 129.605417 12.097797 -19.668208 -20.502586 -17.946336 15.491680 -0.000000 0.000000 -0.000000 -29.426922 0.488929 7.057425 133.582425 -14.674472 16.261167 -5.194668 4.236265 -0.686194 0.000000 0.000000 0.000000 2.022615 2.016217 -0.960182 3.537372 -4.679934 0.905446 -8.902740 1.276342 0.483397 19.531932 2.358656 3.670464 -25.668031 1.526185 -5.338101 11.895515 9.438592 12.802752 -3.566845 37.812692 26.438580 -12.243326 -22.484168 -77.259209 -22.892288 45.935906 -13.653836 13.315125 -9.293318 1.136233 -16.534209 -56.817807 -25.955440 -17.435946 11.768400 94.951006 -53.428132 -25.283238 17.486047 +-6.395109 116.084816 1.593192 -91.299404 0.898696 -1.646870 -22.709616 -2.101089 -6.262825 93.525934 11.610015 -13.712553 -20.958979 -13.559812 13.260621 0.000000 0.000000 0.000000 -25.497997 4.362406 4.713744 101.413570 -17.494040 1.315451 -2.195789 1.787914 -9.567678 -0.000000 0.000000 -0.000000 0.793843 -0.352531 -1.778433 4.129118 -4.801143 0.299157 -6.790310 1.069663 0.160947 20.782217 4.138215 3.445963 -28.372272 2.767955 -5.495172 12.608219 8.400999 15.860764 -5.320481 39.061455 30.502631 -15.216546 -21.135128 -90.359701 -25.178280 40.655799 -18.818097 14.867333 -8.030937 -0.511022 -13.566466 -59.707060 -25.552389 -14.279768 15.393681 90.571889 -53.739798 -23.211513 19.207391 +-6.284241 112.629982 3.074505 -91.501829 1.505004 1.437455 -14.817538 -2.371094 -4.247319 56.668544 8.163268 -4.374690 -13.878949 -9.976024 15.934296 -0.000000 0.000000 -0.000000 -18.904588 5.564341 1.522573 67.353337 -15.561382 -7.509688 1.795462 -1.628833 -8.979390 0.000000 0.000000 0.000000 -2.037650 -1.949664 -1.676148 8.409962 -5.621344 -0.229840 -6.872154 0.772026 -0.240457 18.840594 4.687696 4.865744 -28.337184 4.743964 -7.737199 12.688141 8.109251 19.350519 -5.573589 42.644451 29.882364 -15.665532 -19.754001 -101.921190 -19.570392 36.815180 -27.631392 15.789341 -8.192538 -2.547892 -7.680248 -62.105334 -21.598955 -11.314079 15.813990 86.987821 -51.272390 -24.301493 20.975345 +-6.259601 105.806923 3.109713 -88.573325 0.885007 5.277479 -14.826948 -1.743028 -5.650253 34.126377 5.987335 -5.489852 -5.259515 -1.761079 11.805959 0.000000 0.000000 -0.000000 -17.549141 5.771399 1.877722 41.540595 -11.386519 -8.781908 4.264490 -3.262593 -6.804003 0.000000 0.000000 -0.000000 -3.967556 -1.377857 -1.571588 7.739239 -5.135895 -1.105937 -6.489815 -0.033583 -0.952101 16.790030 5.099701 3.722272 -30.387696 4.407553 -8.132078 11.868418 9.746313 20.258618 -0.431766 47.110967 26.694162 -14.056975 -17.537103 -107.469811 -20.854645 22.351407 -36.664169 16.700412 -9.990553 -3.100261 -0.995158 -63.374105 -15.852135 -7.569426 18.655247 84.702882 -49.739093 -23.691760 23.635031 +-6.332077 96.375579 1.976477 -88.700340 -0.022435 8.635571 -18.784865 -0.763107 -9.000075 35.637827 6.771415 -14.340384 -14.880110 -4.362150 9.290227 -0.000000 0.000000 0.000000 -19.274877 5.531677 5.345421 38.149931 -7.242811 -3.485329 -7.559313 -0.447250 -7.944023 0.000000 0.000000 0.000000 1.878173 -0.918958 -1.702378 5.175741 -4.357418 -1.659814 -6.675011 -0.666564 -1.195219 10.208203 5.111343 2.407248 -31.056153 4.270862 -7.313856 10.100843 12.595327 18.775086 5.414618 52.343177 21.271368 -14.640066 -18.812571 -108.237070 -22.509860 9.757144 -42.927599 15.481974 -12.704393 -1.062239 6.706888 -63.616411 -7.600971 -6.278903 22.283913 82.702314 -48.802202 -19.407014 27.185217 +-6.841206 87.083190 0.038630 -91.895515 0.445886 10.010893 -24.931022 -1.104354 -6.896452 52.897247 5.712598 -16.483300 -34.381229 -10.946272 5.224823 0.000000 0.000000 -0.000000 -24.164557 5.076242 5.546402 54.320112 -7.359432 -0.678051 -26.527397 3.432984 -7.047292 -0.000000 0.000000 -0.000000 12.492892 -3.868997 -2.037594 4.337762 -3.430455 -0.931034 -6.838336 -0.135774 -0.630443 -0.795933 3.032154 3.260994 -26.414687 7.084139 -6.905821 6.359479 14.105126 14.347244 13.801055 60.226478 8.838168 -15.846097 -25.639557 -98.911812 -15.292814 6.232252 -41.407351 11.328880 -14.607787 4.546115 18.498834 -63.729394 7.058225 -8.257176 25.504031 78.304621 -45.171061 -15.469981 31.034771 +-7.210082 82.936912 -2.344373 -93.116738 0.353520 9.230953 -29.896682 -0.167792 -7.408691 62.106528 5.954289 -13.649004 -39.744691 -12.731368 4.417023 -0.000000 0.000000 0.000000 -29.723736 4.521964 6.094512 64.071159 -6.735504 -0.168240 -30.255810 4.905931 -6.816361 0.000000 0.000000 -0.000000 19.034842 -5.483949 -1.222368 7.000688 -2.729552 -0.491194 -8.815268 0.224937 0.506815 -5.827922 2.535791 3.800405 -25.404593 8.814244 -7.342807 4.035636 16.084381 7.173219 25.246675 64.982979 -8.760255 -12.877206 -28.350285 -81.647382 -6.051331 13.830813 -34.787944 9.673520 -14.924040 12.655777 27.362121 -63.679272 18.564542 -11.565421 25.469123 75.213169 -41.893585 -16.863548 30.989129 +-7.019579 85.094115 -4.716992 -91.895006 0.774166 7.445192 -29.950656 -0.417665 -7.657256 56.429785 6.264115 -12.146982 -35.573421 -11.488150 5.778952 0.000000 0.000000 0.000000 -30.124698 3.297404 7.501882 58.132292 -5.943019 -0.832759 -26.556297 4.751809 -6.810727 -0.000000 0.000000 -0.000000 24.026985 -6.619266 -1.307780 5.033698 -1.930136 -0.098224 -8.291898 0.083308 1.037477 -7.125953 2.669410 4.964898 -27.061101 8.380909 -7.371947 3.455365 15.960664 3.813867 34.430119 66.147101 -18.807883 -6.169675 -30.992265 -73.875755 -5.178070 10.466273 -36.456330 9.850029 -14.226556 15.703973 30.969587 -63.126173 24.551120 -8.792819 25.658501 78.115939 -41.638249 -17.682327 30.637757 +-6.619787 89.217422 -7.230160 -86.436926 1.237404 5.481747 -31.292095 -1.514270 -7.267843 45.720245 7.062631 -9.355397 -30.627530 -7.453250 5.635768 0.000000 0.000000 -0.000000 -32.075421 3.440107 8.227356 46.913017 -5.929785 -1.209740 -21.738393 1.883570 -4.163309 -0.000000 0.000000 -0.000000 23.949501 -5.683884 -1.380959 2.794044 -2.462810 -0.566281 -8.215275 -0.582341 0.622419 -6.950708 2.789999 5.774812 -29.924391 6.561527 -6.577054 3.631971 16.271053 4.538377 39.924849 66.425971 -23.254492 -2.510547 -31.686331 -74.577985 -5.940277 7.706700 -39.506665 9.636192 -15.580541 14.619707 31.822728 -60.501577 25.793188 -5.606413 26.584764 82.335860 -40.186079 -21.656155 28.835444 +-6.425187 91.816070 -9.266884 -82.211909 1.746656 3.429779 -32.126624 -2.868193 -8.234565 42.233146 8.381262 -7.337554 -26.772559 -5.781571 6.009451 -0.000000 0.000000 -0.000000 -33.279476 3.915375 7.117212 41.262399 -8.541913 -0.961375 -17.361598 -2.026416 -0.552797 -0.000000 0.000000 0.000000 22.977954 -3.674733 -1.405810 0.486064 -3.394323 -1.792481 -6.808081 -1.929660 -0.454138 -8.912037 3.348057 4.837882 -31.191913 2.793086 -5.362429 5.285366 18.073774 4.058770 33.889298 68.167856 -18.474835 -10.637776 -23.203445 -80.962764 -14.003004 13.288411 -37.060094 11.116536 -17.492207 13.078899 19.686630 -56.866384 16.587025 -6.202263 21.901107 92.281371 -37.689769 -28.350654 24.694677 +-6.460435 91.293350 -10.761402 -80.246318 2.206590 2.166855 -32.862307 -3.109760 -8.567085 47.525592 7.724260 -8.179341 -26.826358 -6.796671 4.815567 -0.000000 0.000000 -0.000000 -35.036890 4.131204 5.574553 45.808919 -11.772416 -2.729231 -15.190503 -0.121351 0.203129 0.000000 0.000000 -0.000000 22.019904 -2.477188 -2.162206 -0.001027 -3.827983 -2.572197 -5.735821 -2.090634 -1.298123 -12.115664 1.709969 4.803413 -30.591039 2.263236 -4.571631 4.265594 13.674360 5.260038 23.144830 65.309513 -10.581471 -20.002942 -13.819251 -93.704900 -27.951691 23.925101 -31.406617 8.859268 -14.268778 9.172190 10.267840 -54.178826 10.674877 -12.116391 14.312162 107.555157 -40.143769 -30.198096 23.686882 +-6.716243 91.247947 -11.014587 -79.824943 2.052724 0.767172 -28.308488 -3.542807 -6.252473 39.823911 6.285382 -8.445730 -29.174078 -7.459806 4.948314 -0.000000 0.000000 0.000000 -31.203315 3.768105 4.141914 38.810575 -11.019860 -2.527443 -16.464461 1.975460 -1.645998 -0.000000 0.000000 0.000000 19.537171 -2.907736 -2.648525 -1.408617 -1.829655 -2.533007 -3.710643 -1.353540 -1.635973 -11.503439 -1.123267 6.045497 -31.214639 2.746109 -5.001256 1.106009 2.423392 7.271698 9.581863 58.952758 -1.002043 -28.393364 -8.204566 -106.886376 -32.988921 30.125778 -33.727431 3.598350 -1.798149 3.021988 1.005351 -52.896160 3.033556 -16.814039 9.788179 120.556747 -50.181995 -33.931075 20.169676 +-6.923581 97.290992 -10.413467 -79.039790 0.943393 -1.048705 -19.666298 -4.210587 -5.393841 20.777369 5.047504 -7.556789 -13.708315 -0.664337 3.908130 0.000000 0.000000 -0.000000 -23.274138 3.316244 3.123392 21.375987 -8.786361 -6.497827 -2.157912 -0.133915 -3.720109 -0.000000 0.000000 0.000000 13.707174 -1.691066 -2.585877 -0.937980 -0.437537 -2.424222 -3.813280 -1.108056 -2.019595 -0.748816 0.996392 6.585958 -35.253580 0.548071 -5.835286 4.584627 -1.368979 5.882171 4.876132 54.326925 6.383062 -26.852243 -11.907053 -115.508801 -28.808007 35.837642 -33.872144 7.184887 6.702476 1.569068 -0.219681 -52.762535 -3.084966 -11.772600 13.440724 126.424332 -57.419632 -39.300994 16.327908 +-7.114191 105.365463 -9.416211 -79.387161 -0.677810 -2.641552 -19.075962 -2.508718 -9.443186 29.272077 4.695569 -8.186986 -2.608494 4.222931 4.370145 0.000000 0.000000 -0.000000 -23.650962 1.623018 3.574906 35.599510 -11.137239 -8.900114 4.409550 -4.487101 -3.819525 0.000000 0.000000 -0.000000 6.586273 2.339997 -2.158448 3.012457 -0.972312 -3.424636 -4.796749 -0.918916 -2.263997 13.532824 6.683592 2.723704 -38.092532 -6.157218 -4.877928 9.950252 8.119587 4.269187 14.171064 60.246367 -1.804363 -12.995395 -16.113475 -97.736849 -21.975156 39.864894 -26.380596 14.702739 -0.061682 1.619882 5.175724 -60.855262 -6.159457 -0.707626 19.312827 113.314212 -57.664687 -47.165206 6.631294 +-7.251704 109.835976 -9.065996 -83.684778 -0.728879 -3.680769 -25.347318 -0.102093 -14.681815 71.425449 9.716641 -10.160003 -5.036256 -3.803114 14.119175 -0.000000 0.000000 0.000000 -26.637757 -3.706003 8.150205 77.592830 -18.064652 -0.544196 -1.890043 -0.724785 -1.383639 -0.000000 0.000000 0.000000 5.330787 4.921491 -2.011259 11.903012 -2.004483 -3.847273 -10.349706 -0.048333 -2.295638 21.788371 8.820609 -1.080049 -37.053082 -9.955500 -3.199663 12.116985 23.519972 -1.049623 18.201275 58.672851 -6.642144 -10.657546 -15.991323 -73.679305 -11.992588 34.838572 -23.580005 16.575168 -12.349662 4.737574 3.666354 -64.036963 -16.869262 0.274640 18.597142 91.316768 -56.648189 -43.850651 3.230176 +-6.947304 109.356186 -10.290142 -87.781930 -0.053674 -5.758491 -32.410455 0.585318 -14.470627 122.212299 11.777730 -17.066490 -12.401217 -12.173411 18.236284 -0.000000 0.000000 -0.000000 -30.059806 -5.764610 9.421454 126.227729 -20.541213 9.569495 -6.222168 6.844698 -3.396340 0.000000 0.000000 0.000000 7.813932 4.349511 -2.944925 14.896453 -1.931235 -2.498394 -10.879315 1.212122 -1.891699 21.696276 7.106326 0.460191 -34.539631 -6.043062 -2.512965 12.059806 24.526118 -1.521259 22.458808 62.017673 -9.567607 -7.584186 -16.223978 -77.436326 -14.359934 30.585143 -24.420541 15.345785 -12.936670 6.850460 -1.006754 -66.994206 -25.764332 -2.764259 17.283320 69.785440 -61.265558 -31.990245 8.248848 +-6.381373 107.538948 -11.732809 -89.138764 -0.538654 -7.612444 -34.890433 -1.591524 -12.873089 153.273435 10.627591 -24.924857 -16.763713 -16.492682 16.336493 0.000000 0.000000 -0.000000 -34.304511 -1.716414 9.533063 154.873893 -13.813564 15.293318 -7.507001 8.872034 -2.939443 -0.000000 0.000000 -0.000000 10.195361 4.383024 -3.555253 15.121314 -2.426514 -1.463768 -11.287651 1.832576 -1.746325 18.886626 4.463429 4.403750 -33.093536 0.746302 -3.282975 12.426856 18.878397 2.721991 29.942260 69.541828 -17.354283 -5.371508 -15.115142 -91.346917 -14.270777 32.760226 -25.419092 17.058252 -11.354231 5.665775 -7.204614 -66.225901 -30.742565 -3.939957 24.277012 55.967590 -52.113561 -27.960641 8.165507 +-5.498750 106.125069 -12.253400 -90.853442 0.421821 -6.466177 -36.011236 -1.302874 -11.039946 131.661161 13.505874 -17.565323 -22.273239 -16.938476 14.640304 0.000000 0.000000 0.000000 -38.036560 0.265491 9.265013 133.791129 -16.827363 10.552960 -10.888220 10.483988 -4.182887 0.000000 0.000000 -0.000000 13.608808 1.171082 -4.603881 14.744805 -2.753593 -1.955451 -12.426292 1.547102 -1.737980 16.601981 6.389809 5.252475 -32.955816 1.648540 -3.313578 11.434099 19.055405 3.210612 32.454577 66.808456 -19.533482 -5.513133 -14.524526 -92.683290 -14.136076 27.678041 -28.708926 16.914683 -10.152319 4.702556 -5.315201 -66.055163 -31.870486 -4.982112 22.036494 50.779893 -51.295143 -22.879652 14.019555 +-4.665780 103.881615 -12.593056 -90.553680 1.576323 -5.073688 -32.043998 -0.980351 -9.033461 92.065663 11.997780 -7.327951 -22.347354 -11.829126 16.810742 0.000000 0.000000 -0.000000 -35.469340 -0.291393 8.120824 94.822441 -17.291073 -2.807841 -5.393645 6.833469 -11.601748 -0.000000 0.000000 -0.000000 15.279031 -2.482925 -5.858051 9.073949 -2.777741 -3.197222 -8.668103 0.686394 -2.110040 13.822946 8.740804 7.168717 -32.325090 0.788420 -2.525236 9.704108 18.119027 3.663359 31.641716 66.765868 -21.949942 -5.310064 -15.691033 -81.714474 -9.142607 20.058354 -33.233278 16.339998 -8.638030 2.890301 -5.870776 -65.069671 -32.058757 -2.183528 21.296555 51.290093 -45.089617 -23.893688 15.433366 +-4.210476 98.464180 -12.498539 -87.892957 1.167375 -4.842834 -24.115195 -1.402413 -7.700270 54.017009 7.445880 -4.797621 -18.173846 -5.921373 15.176909 -0.000000 0.000000 -0.000000 -28.140006 -0.021893 7.427350 58.442672 -10.983283 -5.560234 -2.588434 -0.147795 -8.495431 0.000000 0.000000 -0.000000 11.152039 -2.836041 -5.802419 7.405149 -3.270851 -5.405136 -6.794237 -0.088488 -3.173835 11.938825 10.872745 9.746524 -31.710368 -1.177186 -1.470468 7.910526 17.152992 2.468915 31.917505 67.331814 -23.740357 -6.137628 -17.814800 -68.819673 -8.820358 11.715644 -35.437675 15.593965 -9.984476 2.008465 -4.992251 -65.462613 -29.326530 -4.538873 18.411742 57.593309 -40.127976 -21.702568 20.467808 +-3.870962 90.947158 -13.421250 -89.829750 0.521558 -5.334582 -21.064572 -1.333084 -7.571689 49.602226 7.533596 -12.323989 -29.474659 -9.794966 12.695780 -0.000000 0.000000 0.000000 -22.412430 -0.891533 8.175078 50.099039 -6.917597 3.470618 -19.044823 3.299859 -7.130557 0.000000 0.000000 0.000000 15.659463 -2.294256 -5.460310 2.583531 -2.641637 -6.995715 -3.803600 -1.119580 -4.176477 4.873995 10.669795 10.775464 -29.097734 -2.092002 1.232696 6.185379 16.578522 -0.074641 26.527130 64.786683 -21.457838 -6.507080 -16.775706 -57.715429 -14.479323 9.778296 -34.672679 12.301723 -12.394624 0.638144 -5.630473 -66.636622 -24.846950 -5.272184 16.764933 62.470663 -39.531346 -18.728271 23.979062 +-3.781352 83.115073 -15.596949 -90.595122 -0.127693 -5.545616 -30.222505 -0.283776 -7.157530 67.294946 7.908790 -14.116599 -38.825603 -13.910183 10.752485 -0.000000 0.000000 -0.000000 -31.314812 -1.856029 8.358393 68.058622 -6.587749 2.822767 -28.122544 7.040602 -8.644645 0.000000 0.000000 -0.000000 21.766971 -2.107336 -5.270229 2.648490 -3.300393 -7.029045 -5.052952 -1.208671 -3.916483 -4.674318 8.580327 12.703010 -27.760346 -0.797201 0.472951 4.264212 17.299802 -4.428365 22.983305 58.609465 -20.551980 -9.025187 -15.701008 -53.411304 -17.482289 10.601717 -33.020268 8.393590 -17.878436 7.543568 8.415031 -67.246762 -8.768757 -10.638375 18.820530 67.091093 -39.777002 -10.865553 30.727292 +-3.567410 78.622466 -18.033238 -90.745778 -0.094536 -4.822852 -36.031316 1.723759 -8.549803 74.873766 7.800180 -12.765275 -41.391371 -17.237445 11.431502 -0.000000 0.000000 0.000000 -38.602985 -2.965627 9.990987 78.374278 -7.583001 2.069766 -28.888714 8.805110 -10.190216 -0.000000 0.000000 -0.000000 29.289142 -3.649518 -4.805293 2.828989 -3.632069 -6.453041 -8.704623 -1.138461 -3.016311 -11.789266 7.405708 12.598809 -28.655593 0.119241 -0.685986 4.739690 17.826796 -9.756289 20.048998 51.939932 -19.597761 -12.676807 -15.525369 -56.858722 -22.446050 16.056080 -31.553550 6.796371 -18.471310 16.246633 23.214163 -66.496609 9.395308 -12.431925 23.538153 72.319650 -44.654877 -10.235176 31.311756 +-3.141614 79.069747 -20.674208 -90.279467 0.568294 -3.442430 -39.482434 2.663139 -9.475141 74.958157 7.115461 -10.221466 -36.440167 -15.577950 11.697817 0.000000 0.000000 0.000000 -39.798349 -3.023827 9.932742 75.840859 -7.731786 1.500609 -27.793103 9.267618 -9.994614 -0.000000 0.000000 0.000000 35.413537 -6.688235 -3.901427 1.288943 -2.673090 -5.546018 -10.023459 -1.124386 -1.661627 -17.108426 6.457876 11.776696 -29.310310 1.519443 -2.258189 3.293885 15.476329 -12.205929 16.140361 48.241787 -18.134337 -20.049573 -9.872586 -70.660582 -30.367708 30.628707 -25.666200 7.026468 -15.001879 21.818059 21.381886 -61.350864 16.515985 -13.862901 19.680191 83.864857 -43.523079 -19.957852 26.633228 +-2.925150 80.973258 -23.510266 -87.480780 -0.442352 -2.135379 -43.817005 3.989974 -10.597024 71.576323 7.562684 -7.817824 -30.616086 -12.027426 10.413269 0.000000 0.000000 0.000000 -42.629249 -0.935021 10.255481 70.853823 -7.960409 -0.040618 -25.516570 8.138959 -8.537812 -0.000000 0.000000 0.000000 38.280167 -7.364404 -2.463158 -2.395897 -1.771137 -4.726251 -10.581386 -1.513614 -0.879160 -19.297905 6.263034 9.742935 -30.711320 1.861580 -2.908394 1.580413 11.213867 -12.920628 12.243683 40.810229 -15.378258 -23.107526 -5.399571 -88.239449 -45.313898 42.773489 -20.664992 5.312809 -10.679220 23.967604 15.269455 -54.504131 18.350702 -15.087652 15.355874 100.164902 -45.856873 -26.853104 22.758402 +-2.784354 82.642257 -25.348661 -85.725513 -1.473546 -1.516077 -42.723844 3.851911 -10.881394 64.593134 7.371740 -9.064485 -31.570220 -11.012993 7.620565 0.000000 0.000000 0.000000 -43.296155 1.372582 9.333736 65.558558 -7.777295 0.315628 -25.059255 7.584156 -7.323689 0.000000 0.000000 -0.000000 37.929111 -6.712485 -1.646219 -4.670689 -0.849488 -4.120098 -10.159613 -1.897990 -0.493429 -19.541291 4.557202 9.005927 -31.299669 2.102189 -2.804431 -1.105699 4.617312 -13.407716 5.323099 30.112693 -9.697834 -28.943723 1.982944 -102.656525 -59.428744 49.534248 -18.417193 1.016976 -4.330832 26.096990 7.702251 -46.851064 20.330271 -19.578085 10.262566 114.076357 -50.472590 -29.796760 21.914661 +-3.088982 84.087508 -26.292743 -85.727729 -0.879122 -1.105167 -40.183737 1.939411 -9.185354 59.508519 5.430222 -11.254258 -32.573069 -9.930035 4.676243 0.000000 0.000000 -0.000000 -41.434196 1.969322 7.708316 60.541909 -8.055708 0.003836 -24.084226 7.385810 -6.491514 -0.000000 0.000000 0.000000 35.020101 -6.674028 -1.516709 -5.122608 -0.215914 -3.355614 -8.575037 -2.462817 -0.065648 -15.335692 2.856097 10.805765 -34.896756 3.578824 -3.625381 -5.498563 -5.319201 -15.174554 -3.056973 20.468719 -2.634750 -37.265661 6.879762 -106.040029 -69.420397 53.748908 -14.145355 -4.509610 3.496630 30.175539 -3.348039 -41.337374 18.844189 -28.724044 3.829715 123.905028 -53.189112 -31.180962 23.513371 +-3.557491 89.615638 -25.948293 -86.125715 -0.824733 -0.778460 -32.131301 -0.491091 -6.648370 44.891912 5.367189 -10.937305 -24.987188 -6.603387 2.525829 -0.000000 0.000000 0.000000 -33.678474 3.870284 5.116030 46.364475 -8.507423 -0.362879 -16.129254 5.406667 -5.210441 -0.000000 0.000000 0.000000 27.479361 -4.908959 -1.518464 -3.415511 -0.943779 -3.319871 -5.659031 -2.969475 -0.503066 -8.915076 1.788901 12.136616 -36.367819 4.935250 -4.964349 -3.494541 -14.186718 -12.940831 -8.251079 16.754495 2.125483 -37.959057 3.609369 -105.780586 -63.520498 56.533883 -17.120872 -6.780620 9.692717 27.696119 -9.447392 -45.000217 17.042233 -32.908499 -0.427940 129.645838 -61.938812 -36.347085 21.355111 +-3.937677 99.513450 -24.684549 -83.340631 -1.818611 -0.563429 -19.458155 -2.526006 -3.628932 14.872402 4.291601 -8.318082 -1.860487 3.764245 -2.159520 -0.000000 0.000000 -0.000000 -19.621580 7.058533 1.694386 14.686448 -8.607288 -5.500533 6.574334 -3.953643 -1.633322 0.000000 0.000000 -0.000000 15.370653 -2.031311 -1.432086 -3.364704 -2.284544 -4.505582 -2.733409 -2.914326 -1.606112 7.862413 5.179104 8.255000 -42.224767 1.201268 -5.291089 6.278993 -15.011117 -5.443193 -6.411371 18.799758 6.121112 -25.116146 -4.192927 -109.808797 -58.853545 54.792034 -18.373435 0.087385 11.968681 18.557915 -4.193946 -59.848474 16.558830 -23.084678 0.717912 132.092517 -69.003995 -42.231113 17.352470 +-4.391048 109.271103 -24.464044 -80.617828 -2.515568 -2.544208 -17.557068 -2.793732 -4.808155 15.954711 5.028876 -4.122067 8.192047 8.433721 0.029691 0.000000 0.000000 -0.000000 -16.509029 5.801786 0.029550 13.208676 -9.186312 -15.369154 15.434577 -6.848914 -4.266304 0.000000 0.000000 0.000000 5.131188 0.168873 -0.901556 0.047178 -3.589061 -4.921963 -3.150991 -2.316271 -2.152103 22.170142 10.878524 4.227210 -43.868251 -2.548349 -5.963731 9.477487 -2.650007 -0.563139 0.416933 29.277843 8.338961 -12.039316 -12.631321 -102.286174 -45.729652 50.266481 -16.939647 8.357175 0.837220 11.318188 8.614698 -70.833411 14.348811 -8.953057 3.149825 122.651484 -65.299560 -42.105228 13.738453 +-4.333271 116.287255 -25.867757 -83.296545 -2.267404 -5.915349 -23.094080 0.366703 -11.095370 53.880985 9.005553 -9.587583 3.431266 1.379694 8.618590 0.000000 0.000000 -0.000000 -22.841099 0.916254 4.433295 52.201413 -14.168652 -10.107858 8.584849 -3.003988 -6.068164 -0.000000 0.000000 0.000000 3.812147 0.792052 -0.685507 8.255272 -4.720444 -3.936876 -6.467350 -0.646662 -0.527589 22.597588 13.700688 2.123500 -38.570174 -5.343327 -5.695136 9.816271 14.759486 -2.494204 7.113046 38.101688 5.335636 -4.799879 -12.379628 -78.484640 -29.429035 35.300182 -19.185802 13.623170 -15.542483 13.065165 4.191413 -68.956471 -0.945392 -7.454330 2.978547 103.809628 -52.774417 -31.401899 17.358278 +-4.391508 118.723031 -28.557529 -91.307906 -0.323292 -6.273345 -26.640987 3.488938 -14.196043 101.744020 11.526848 -12.872016 -5.783644 -10.897776 17.018801 -0.000000 0.000000 -0.000000 -24.393276 -3.308308 7.055979 97.876110 -20.214932 2.801726 -0.730117 2.214561 -3.294182 -0.000000 0.000000 -0.000000 14.596908 0.477440 -1.281852 12.433534 -4.095165 -2.889919 -8.235750 -0.413239 0.376681 19.772217 11.454930 1.089829 -36.261080 -6.209992 -4.665358 10.012580 23.257500 -10.724855 13.119461 45.511525 -7.969284 0.743912 -14.392411 -38.284905 -10.006422 23.793078 -23.801194 15.192289 -19.382961 20.394902 -0.235984 -64.413101 -8.722960 -11.861350 7.097199 81.664222 -46.628965 -24.536168 20.525153 +-4.480038 118.044320 -32.261566 -92.090468 -0.241171 -4.496599 -37.055186 4.280873 -16.578248 145.753639 9.324229 -19.371242 -13.493022 -19.199020 20.092446 0.000000 0.000000 -0.000000 -33.450867 -0.434788 6.564482 142.491681 -19.084583 17.565426 -9.032624 7.433803 1.950402 0.000000 0.000000 0.000000 19.266164 0.955681 -1.906130 15.717564 -3.837741 -2.764523 -10.262389 -0.248819 -0.335135 17.548294 8.141616 0.097537 -37.368807 -5.779827 -3.131508 11.176885 24.509375 -16.750047 18.188831 52.354325 -16.907955 6.113206 -17.776138 -17.312323 -0.210320 28.372491 -18.952975 14.366043 -17.158543 23.898820 -7.091104 -64.904400 -17.307161 -12.491840 9.504026 69.926930 -45.643763 -25.995361 20.153291 +-4.265675 117.078164 -36.003228 -91.901182 0.156652 -6.963245 -44.774938 1.150213 -14.480204 147.337675 9.962280 -22.386805 -20.740275 -19.600880 15.961784 -0.000000 0.000000 0.000000 -42.920400 0.817022 7.269100 148.973219 -16.926919 16.802355 -16.291158 10.910906 -0.056442 -0.000000 0.000000 -0.000000 25.963951 1.683684 -1.716677 16.312252 -2.726122 -0.922723 -11.971543 -0.149627 0.086521 11.219798 5.514351 2.523435 -36.813375 -1.674796 -4.540609 12.188430 23.330421 -11.160537 18.967913 55.839688 -12.966404 5.705522 -17.987223 -38.924486 -1.752556 18.068117 -23.462044 15.271643 -15.335764 21.869665 -6.051804 -65.876066 -15.022844 -11.845536 9.730088 68.569314 -51.128323 -18.193446 27.223475 +-3.653990 115.480408 -38.370080 -89.303548 1.803316 -9.349443 -47.372147 -0.127419 -11.850433 117.953099 13.230449 -17.565670 -26.594935 -14.672597 10.873495 -0.000000 0.000000 -0.000000 -48.082064 -1.536993 9.964395 122.860333 -19.626733 4.437303 -17.379478 10.846237 -8.533317 -0.000000 0.000000 -0.000000 28.626572 -0.699931 -1.894081 15.004061 -1.014277 1.224632 -12.025386 0.155961 1.487301 7.034798 4.988390 4.240231 -36.292478 1.515962 -6.049716 11.204016 20.584333 -5.793772 26.320558 58.804630 -10.785369 8.428602 -25.100518 -56.475927 -7.409897 6.657466 -29.234325 15.014441 -12.524585 19.696809 4.845537 -68.308626 -6.009756 -11.642108 15.056584 67.045633 -56.342787 -7.435119 34.656702 +-3.581230 111.445114 -39.165624 -85.082720 2.725847 -5.665662 -39.291996 0.876377 -9.313226 78.930127 10.377067 -7.522405 -18.010766 -11.611481 15.187871 0.000000 0.000000 0.000000 -41.568359 -1.043657 7.862409 87.182333 -17.503450 -4.269885 -5.840547 4.306519 -10.654291 -0.000000 0.000000 0.000000 22.316185 -2.378419 -2.343503 14.271043 -3.491834 0.220985 -10.230837 -0.892772 0.837720 9.123980 6.465343 4.477300 -36.721639 1.410773 -5.510469 11.472830 17.496004 -1.137353 23.263982 62.241434 -3.086550 9.814932 -26.446265 -63.330366 -10.431552 6.903924 -31.802202 16.469230 -11.139442 15.952295 5.195937 -66.693932 -7.582480 -7.652722 16.539857 68.768577 -53.845606 -7.871469 34.382334 +-3.521078 105.090889 -39.138718 -82.781426 3.196643 -2.083233 -26.638164 0.200663 -7.517202 45.128050 5.802206 -2.209245 -3.057486 -4.065773 15.072664 0.000000 0.000000 0.000000 -29.189113 -0.006462 5.900410 54.139322 -13.048970 -11.287809 5.015522 -0.931051 -10.577269 0.000000 0.000000 0.000000 15.024894 -2.473081 -3.128858 14.222802 -5.595825 -1.418688 -8.714214 -1.712666 -0.325439 11.392871 7.462905 5.882640 -37.710936 1.522063 -5.844058 12.619080 14.432103 3.251724 19.125306 63.362425 2.775258 11.519117 -21.431824 -65.312159 -12.929757 8.026037 -33.800151 17.259497 -10.962002 11.422606 6.175672 -66.075817 -7.980975 -5.136405 15.589689 71.243098 -47.959176 -9.663655 33.764434 diff --git a/data/gradio_human/bvh/000926.bvh b/data/gradio_human/bvh/000926.bvh new file mode 100644 index 0000000000000000000000000000000000000000..be2d93075af11dd9c53390e48bba20c9b3a7003b --- /dev/null +++ b/data/gradio_human/bvh/000926.bvh @@ -0,0 +1,332 @@ +HIERARCHY +ROOT joint_1982086572 +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT joint_1019416226 + { + OFFSET 7.102357 0.946080 -9.187089 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_881884780 + { + OFFSET 3.741475 0.354130 -39.738529 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_3120030631 + { + OFFSET -1.264815 4.525899 -41.847397 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1122161023 + { + OFFSET 2.604784 -12.021109 -5.831362 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_1245698947 + { + OFFSET -6.865149 0.694195 -9.079150 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1329143467 + { + OFFSET -4.239295 0.750050 -40.424046 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1585352811 + { + OFFSET 1.552550 4.351840 -41.866096 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2820003239 + { + OFFSET -2.462430 -12.399174 -5.000521 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT joint_3964437525 + { + OFFSET -0.274779 2.247957 10.716465 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2325705794 + { + OFFSET 0.416249 0.038094 13.547511 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2057428903 + { + OFFSET 0.175577 -2.597323 5.140836 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1299020862 + { + OFFSET -0.322930 4.119717 21.317842 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2110532032 + { + OFFSET 0.488529 -5.290440 6.705844 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + JOINT joint_442621484 + { + OFFSET 7.597309 3.333200 11.949052 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_196924809 + { + OFFSET 8.691912 0.685446 3.438255 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1602476126 + { + OFFSET 26.798223 2.884027 -1.695592 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_875299672 + { + OFFSET 25.620781 0.027418 1.076812 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 8.614013 0.333236 -1.258522 + } + } + } + } + } + JOINT joint_3514538222 + { + OFFSET -7.826191 3.909013 11.688710 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_1157073263 + { + OFFSET -9.100839 0.884105 3.568563 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_2673173741 + { + OFFSET -26.155325 2.243578 -1.710362 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT joint_865834849 + { + OFFSET -26.268906 0.499587 0.873784 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.306824 0.194641 -1.189939 + } + } + } + } + } + } + } + } +} +MOTION +Frames: 198 +Frame Time: 0.050000 +0.055843 95.132065 -0.821348 -95.374030 4.923462 -0.329661 -14.056609 -13.253725 0.725145 38.469802 2.337660 -15.429811 -20.142297 1.629248 5.432088 -0.000000 0.000000 -0.000000 -10.492999 -2.850080 -8.230634 36.181669 -0.316114 2.922675 -22.535410 -0.460115 -7.742938 -0.000000 0.000000 -0.000000 14.830576 5.239488 -3.730930 -8.716471 15.074753 -2.060235 2.788390 7.940522 -4.147290 3.735074 3.336983 -13.581788 15.637633 -7.360063 6.020239 -11.706989 7.222947 0.239421 -10.075068 30.163798 -15.085855 -32.352332 -17.038469 -89.100596 -24.913455 24.752525 -4.060973 -16.804392 21.532342 1.452206 -20.686264 -0.677612 1.501406 -26.511871 12.362048 85.420618 -42.849699 -45.881496 -12.895173 +0.258269 94.598587 -1.538825 -94.952587 5.384023 -1.193115 -15.579563 -13.671781 0.594795 39.994528 2.495369 -14.579072 -20.808281 1.332218 5.008613 0.000000 0.000000 -0.000000 -12.597624 -2.892015 -8.142758 38.382018 -0.519667 2.743472 -22.989981 -0.643567 -6.981937 -0.000000 0.000000 -0.000000 16.060989 5.701586 -3.678063 -8.039011 15.118692 -2.208549 2.478162 8.000999 -4.156960 3.853770 3.486058 -13.063927 14.091432 -7.601156 5.697039 -11.107889 7.786456 -0.766842 -10.132889 30.136255 -14.312162 -32.942938 -16.273224 -89.245213 -24.993996 25.497812 -3.522609 -16.458647 20.892791 1.769474 -21.169328 -0.448340 1.385663 -28.758411 12.024730 89.138362 -41.627066 -46.096161 -12.251653 +0.589684 94.286903 -2.155516 -94.158003 5.656930 -1.527294 -17.432898 -13.449573 0.137106 41.086143 2.242307 -14.186238 -21.005099 1.193799 5.139662 -0.000000 0.000000 -0.000000 -14.292134 -2.656894 -7.684875 39.165323 -1.185651 2.207341 -22.971867 -0.852536 -6.478637 -0.000000 0.000000 0.000000 16.583233 5.847372 -3.464805 -7.409469 14.536821 -2.411147 2.269495 7.840806 -3.870578 4.038814 3.557606 -12.296118 12.750443 -7.712108 4.484207 -10.831702 6.968431 -1.699516 -10.144299 29.083295 -13.799651 -33.404154 -15.230302 -89.013563 -25.005292 25.886715 -3.427544 -16.249169 20.254691 1.917714 -20.762611 -0.901450 1.395013 -29.740741 12.067463 92.537537 -41.538262 -46.578255 -12.721836 +1.131023 94.268394 -2.634692 -93.504375 5.242021 -1.292386 -18.476433 -12.264176 -0.427989 40.893714 2.250031 -13.814654 -20.592334 0.725602 5.471926 0.000000 0.000000 -0.000000 -15.442010 -1.921417 -7.638285 39.199961 -1.038090 2.352125 -22.513686 -0.892532 -6.802005 -0.000000 0.000000 -0.000000 17.128321 5.769089 -2.899064 -7.055173 13.593068 -2.558353 2.158131 7.318062 -3.654372 4.547039 3.934302 -12.036264 11.461218 -7.601834 3.597428 -10.858810 5.514331 -2.172393 -11.009656 26.830016 -13.022213 -33.357450 -14.412605 -88.857781 -24.637826 26.016945 -3.690856 -15.768301 19.574430 2.215538 -19.689086 -1.566571 1.190000 -30.078710 12.053545 94.979737 -41.030384 -46.963985 -12.902060 +1.852626 94.379517 -3.016074 -93.107476 4.275307 -0.464648 -18.970236 -10.446605 -0.921140 40.018049 2.512363 -13.651446 -19.755008 0.253081 5.683046 0.000000 0.000000 -0.000000 -16.099136 -0.667907 -7.897754 38.910989 -0.362357 2.254458 -21.960376 -1.021355 -7.403656 0.000000 0.000000 0.000000 17.860969 5.480099 -2.067289 -6.896822 12.432445 -2.794982 2.167140 6.646942 -3.249455 5.175659 4.261646 -11.826622 10.468182 -7.681763 2.615466 -10.989553 3.327915 -2.373016 -12.250615 24.201526 -12.294097 -32.794867 -13.003705 -88.666383 -24.395744 26.009238 -4.084112 -15.135232 18.949279 2.423121 -18.439811 -3.227074 0.518025 -30.813785 12.028631 96.807904 -38.747095 -47.117086 -11.823243 +2.804267 94.581909 -3.307768 -92.633517 2.999896 1.259775 -19.469572 -7.993474 -1.254037 38.842120 2.582920 -14.150941 -18.830487 -0.264656 5.844090 0.000000 0.000000 -0.000000 -16.577785 1.250063 -7.928670 38.591763 -0.119418 1.840597 -21.386476 -1.184317 -8.354154 -0.000000 0.000000 0.000000 18.358439 4.741008 -1.242293 -7.105917 10.604254 -3.070107 2.634911 5.871018 -2.576233 4.581308 4.102374 -10.467685 10.137610 -7.859140 0.789951 -12.140343 1.020351 -2.103248 -13.154533 19.841951 -11.511673 -31.348179 -11.483790 -88.626714 -23.172937 27.020000 -4.614912 -15.022115 17.009105 2.248120 -17.143769 -4.884356 0.102581 -32.765823 11.453996 98.548947 -35.222335 -46.567506 -10.327491 +3.996609 94.762070 -3.482467 -92.367100 1.564747 3.276599 -19.568192 -4.908270 -1.667439 37.646174 2.316367 -14.879218 -17.670560 -0.887552 6.242929 -0.000000 0.000000 0.000000 -16.577650 3.634247 -7.843560 38.302428 -0.097606 1.105484 -20.797112 -1.408619 -9.113599 0.000000 0.000000 -0.000000 18.463041 3.673600 -0.164897 -6.889311 8.246665 -3.406570 2.838079 4.927444 -1.643108 4.856499 3.582836 -9.104880 8.932899 -7.826418 -1.295668 -12.736976 -1.815855 -2.106882 -14.219712 14.849430 -10.090124 -30.280065 -10.083743 -88.809379 -22.117986 27.302195 -5.662725 -15.436621 14.696820 2.295026 -16.048361 -7.404962 -0.128616 -35.543157 10.485645 100.232326 -31.648441 -45.646598 -8.342425 +5.525602 94.799896 -3.584680 -92.509533 0.251797 4.576536 -19.230040 -1.585243 -2.458228 37.131194 1.984235 -15.030189 -17.039530 -1.620401 7.120414 0.000000 0.000000 -0.000000 -16.091042 6.085485 -7.394897 37.952427 -0.120522 0.091495 -20.256372 -2.048467 -9.466125 0.000000 0.000000 -0.000000 18.470962 2.219728 1.391487 -6.641457 5.180755 -3.353419 3.343310 3.535330 -0.257915 4.359465 2.853727 -7.167647 7.302029 -7.526727 -3.871468 -13.952034 -5.497141 -1.565842 -14.787296 10.865366 -8.840664 -30.069352 -8.400043 -88.409820 -21.070039 27.479612 -6.528591 -15.272874 12.390789 2.429859 -15.802097 -10.261986 0.256960 -39.527765 8.431869 101.294241 -31.928186 -45.259500 -8.309652 +7.275641 94.660156 -3.819896 -92.454321 -0.812376 5.176905 -19.420663 1.498871 -3.955506 37.302930 2.295472 -14.572040 -16.540429 -2.619735 8.398109 0.000000 0.000000 0.000000 -16.180805 8.393945 -6.497780 37.960205 -0.192404 -0.401517 -19.680922 -2.546196 -9.981899 0.000000 0.000000 0.000000 17.932443 0.553888 3.249391 -6.533395 1.691841 -2.949452 4.171394 1.897170 1.353421 3.544531 1.536900 -5.245470 5.790308 -6.914516 -6.824481 -14.784302 -9.718548 -0.815324 -15.384355 7.457111 -7.503379 -29.924451 -7.253961 -87.228304 -20.218851 27.819556 -7.508790 -15.437071 10.278040 2.483914 -15.630889 -12.753793 1.691584 -42.258002 6.554768 100.819158 -32.862500 -44.033483 -7.250509 +9.087048 94.447235 -4.082390 -92.879494 -1.388675 5.856638 -19.502521 4.075591 -4.871138 38.152863 2.179281 -14.485868 -16.386424 -3.468408 9.459623 -0.000000 0.000000 0.000000 -15.593196 10.530926 -6.204960 37.709624 -0.615368 -0.899351 -19.198917 -2.910213 -10.216518 -0.000000 0.000000 0.000000 18.089475 -1.657571 5.090278 -6.758151 -2.017944 -2.460348 4.593930 -0.191468 2.789243 2.363737 0.292205 -3.992252 4.998297 -5.528676 -9.417816 -15.312883 -13.645048 -0.215720 -16.110102 4.965563 -6.147515 -29.062832 -7.295731 -84.708734 -19.352026 27.883945 -8.648383 -15.281176 8.576354 2.870005 -15.497267 -14.338860 3.130078 -43.767572 6.282047 99.500764 -31.835354 -41.164469 -5.174508 +10.723907 94.255096 -4.303742 -93.094555 -1.748368 7.040045 -19.717940 6.243164 -5.390987 38.641670 1.907441 -14.825794 -16.124322 -4.400486 9.996718 -0.000000 0.000000 0.000000 -15.113890 12.750218 -6.495968 37.817531 -1.431143 -0.940754 -18.957970 -3.304792 -10.202267 0.000000 0.000000 -0.000000 17.967620 -3.523694 6.679180 -7.104849 -6.012442 -2.332422 4.495587 -2.497971 3.682871 1.149401 -1.180358 -2.881522 4.857228 -4.245579 -11.887508 -15.315029 -17.064182 0.242685 -16.698137 2.809333 -4.981714 -27.535226 -8.029879 -81.602964 -17.902996 27.621425 -9.787878 -15.035769 6.524380 2.879435 -15.202127 -15.719776 4.919983 -44.455652 7.037571 98.047259 -29.845270 -39.679002 -3.896408 +11.815886 94.209671 -4.520573 -93.641742 -1.914202 7.536987 -19.515469 7.169286 -5.212141 39.057182 2.040977 -15.110163 -16.179947 -4.427800 10.165596 0.000000 0.000000 0.000000 -14.285208 14.357657 -6.793976 37.596171 -2.248886 -0.978930 -18.620159 -3.773900 -9.763726 0.000000 0.000000 -0.000000 18.542369 -4.704797 8.147384 -6.956646 -9.465522 -2.201719 3.661161 -4.669892 4.336649 -0.659091 -2.963777 -1.697880 4.004420 -3.548265 -13.833890 -14.890159 -19.423375 0.232941 -17.370627 0.748235 -3.104570 -26.472076 -9.474248 -79.841133 -14.903737 26.866257 -10.634894 -14.618095 4.055947 2.744463 -15.056389 -17.721515 5.440246 -44.591462 7.928056 97.008349 -28.686989 -39.528231 -3.538016 +12.527530 94.180397 -4.793417 -93.985940 -2.156337 7.145669 -19.400356 7.767191 -4.908529 39.198539 2.441174 -14.804267 -15.912941 -4.565349 10.161600 0.000000 0.000000 0.000000 -14.147645 15.654734 -6.662486 37.617483 -2.834033 -0.812103 -18.389250 -4.229061 -9.153131 -0.000000 0.000000 -0.000000 19.296347 -5.714460 9.056383 -6.582836 -11.910381 -2.125823 2.661118 -6.150456 4.741361 -1.562178 -4.120072 -0.720934 2.732579 -3.121246 -14.425538 -14.356413 -20.533937 0.616820 -18.079620 -1.777990 -0.751558 -25.734005 -10.413214 -79.429091 -11.150388 26.046836 -11.516347 -13.661721 1.751085 2.968958 -14.457494 -20.352625 5.636774 -44.254430 8.080144 95.974231 -28.181677 -39.577080 -3.217412 +12.820576 94.060516 -5.161059 -93.713984 -2.532441 6.051813 -20.139984 8.235549 -4.167797 39.482945 2.718209 -14.362633 -15.881450 -4.751058 10.313583 0.000000 0.000000 0.000000 -15.474242 16.828796 -6.385256 38.382836 -3.038404 -0.438244 -18.272876 -4.673453 -8.181016 0.000000 0.000000 -0.000000 20.154893 -6.471465 9.128498 -6.599935 -13.022003 -2.113223 2.220617 -6.803274 5.111886 -1.916616 -4.864018 -0.255402 2.115405 -3.006188 -14.147101 -14.040364 -20.229559 1.633249 -18.364265 -3.890601 0.951599 -25.676962 -10.103332 -80.138976 -9.303137 25.486845 -11.917532 -12.745909 -0.286204 2.972201 -13.574919 -21.132812 6.186895 -42.501031 8.065381 94.966959 -27.823861 -40.248991 -3.511452 +12.850265 93.984932 -5.514042 -93.503993 -2.824374 4.867150 -20.707438 8.317776 -3.534882 39.474088 3.024914 -13.849428 -15.949556 -4.607924 10.451401 -0.000000 0.000000 -0.000000 -16.773866 17.543985 -6.135672 39.021467 -3.110825 0.089725 -18.153096 -4.956131 -7.452405 0.000000 0.000000 -0.000000 20.944863 -7.156103 8.920780 -6.052373 -13.411364 -2.064656 1.707799 -7.157905 5.179403 -1.465764 -4.875698 -0.384362 1.485736 -3.189929 -13.197756 -13.673151 -19.270123 2.203812 -18.597531 -4.601348 2.262221 -26.898633 -9.520344 -81.772401 -8.308222 24.861930 -12.745233 -11.741116 -1.219474 3.249146 -13.288195 -20.141251 5.814111 -40.345817 8.098354 94.358910 -24.879969 -40.053194 -1.813220 +12.547314 93.961182 -5.858801 -93.603356 -2.823800 3.414762 -20.757155 7.928294 -3.205098 39.166713 3.131787 -13.346124 -15.783190 -4.420422 10.809020 0.000000 0.000000 0.000000 -17.680010 17.294280 -5.594937 39.325561 -3.070907 0.415608 -18.021383 -5.001163 -7.075698 0.000000 0.000000 -0.000000 21.964258 -7.347579 8.364389 -5.323325 -13.183186 -2.084357 1.453427 -7.236806 4.873305 -0.625367 -4.975716 -0.540588 1.252276 -3.356264 -11.797906 -13.152635 -18.188928 2.389441 -18.136091 -4.623803 3.130800 -27.824465 -8.481884 -83.448578 -9.508952 24.767667 -12.617243 -11.377062 -0.974009 3.708120 -13.018571 -18.719870 5.892333 -38.858523 6.846164 93.589838 -25.629210 -40.003622 -1.745358 +11.976538 94.047005 -6.153826 -93.475886 -2.433533 1.790580 -20.974724 7.105857 -3.141991 38.888943 2.980731 -12.516841 -15.787627 -4.047896 11.341711 0.000000 0.000000 0.000000 -18.601042 16.276189 -5.063041 39.188726 -3.043269 0.756986 -17.877085 -4.991599 -6.778048 0.000000 0.000000 0.000000 22.443597 -7.159810 7.597753 -4.575787 -12.777943 -2.220524 1.496565 -7.121463 4.493303 0.090656 -5.047987 -0.550756 1.234603 -3.470237 -10.887774 -12.734132 -17.628000 2.483604 -17.503498 -3.638846 2.971426 -27.671890 -7.926628 -84.537908 -11.831104 26.491729 -12.157028 -11.373354 -0.236066 3.713603 -13.048973 -17.358008 6.491239 -37.340289 6.186046 92.800658 -27.046897 -40.133224 -1.984218 +11.112418 94.290985 -6.416185 -93.283773 -1.686043 -0.173341 -21.003450 5.619217 -3.073346 38.373915 2.679746 -11.750643 -15.647498 -3.604322 11.784580 0.000000 0.000000 -0.000000 -19.190900 14.433841 -4.630943 38.412887 -2.863575 1.320564 -17.292439 -5.037395 -6.396124 0.000000 0.000000 -0.000000 22.951595 -6.455156 6.814757 -4.140653 -12.069112 -2.476587 1.539583 -6.864440 4.004830 0.311118 -4.921382 -0.282867 1.536706 -3.573878 -10.428401 -12.529007 -17.119115 1.991370 -16.752871 -2.026208 2.187399 -27.017716 -7.972915 -84.491714 -13.529843 27.021793 -11.912993 -11.432665 0.622977 3.890440 -13.451562 -16.205637 7.124937 -36.437687 6.341492 92.480406 -28.117925 -40.018328 -2.278674 +10.021701 94.634430 -6.597502 -92.953628 -0.711160 -2.336491 -20.931312 3.352584 -2.647820 37.668246 2.573232 -10.978124 -15.408701 -2.774842 11.796253 0.000000 0.000000 -0.000000 -19.612771 11.944014 -4.148963 37.265373 -2.522620 1.908852 -16.599624 -4.951874 -6.057759 0.000000 0.000000 0.000000 23.090836 -5.543955 5.835121 -3.770208 -10.968977 -2.583945 1.598295 -6.431931 3.399559 0.408387 -4.441318 -0.250460 1.898743 -3.950066 -9.748043 -12.147937 -16.286478 1.015720 -16.655255 0.091106 1.068058 -27.502437 -7.925635 -84.033545 -16.087296 27.001011 -11.552173 -11.535345 1.867941 4.303362 -13.970531 -15.609445 7.565782 -35.810286 7.090699 92.308895 -29.294388 -39.249966 -2.608876 +8.624832 95.004143 -6.728157 -92.293856 0.553400 -4.890206 -21.025250 0.064825 -1.716204 37.081508 2.758840 -10.121281 -15.477880 -1.796675 11.416962 0.000000 0.000000 -0.000000 -20.103545 8.643587 -3.697381 35.874901 -1.919593 2.653346 -15.754274 -4.403289 -5.899043 0.000000 0.000000 0.000000 23.096351 -4.258895 4.390643 -4.265591 -9.318567 -2.661922 1.961693 -5.856153 2.668367 -0.051237 -3.749641 -0.457735 3.247719 -4.380909 -8.353975 -12.156852 -15.289198 0.612368 -17.064769 3.471945 -0.871766 -29.030101 -7.365285 -84.136768 -18.631575 25.349862 -11.543427 -12.540935 3.558262 4.257357 -14.190759 -15.654538 8.848537 -35.034965 7.607604 91.766373 -30.283303 -39.142007 -2.816927 +6.971769 95.266846 -6.873357 -91.619608 2.042759 -7.770779 -21.119846 -3.777787 -0.591358 37.072914 2.900148 -9.278420 -15.898299 -0.603588 10.916140 -0.000000 0.000000 -0.000000 -20.448010 4.567512 -3.016602 34.577295 -0.911887 3.353941 -14.983090 -3.719400 -5.875989 0.000000 0.000000 0.000000 22.995452 -2.696217 2.558273 -4.937359 -7.233912 -2.634586 2.531872 -5.117338 2.028128 -0.544575 -2.937713 -0.922097 4.623110 -5.082645 -6.838538 -12.809665 -13.655138 0.131049 -17.715862 7.550458 -3.453993 -31.234927 -7.312887 -84.975111 -20.835040 23.233429 -10.907605 -13.430332 5.268119 4.266035 -14.711834 -15.274037 10.024598 -33.900785 7.995530 91.103038 -31.755719 -38.011947 -2.558614 +5.128982 95.261734 -7.237000 -90.977110 3.496861 -10.211471 -21.464880 -7.228830 -0.630263 37.711569 2.856953 -8.022528 -16.259814 0.352956 10.573923 0.000000 0.000000 -0.000000 -20.931706 0.662552 -1.801312 34.127293 -0.618439 3.358017 -14.605619 -3.122866 -5.693428 0.000000 0.000000 -0.000000 23.051892 -0.775883 0.494901 -5.646407 -4.715503 -2.737931 2.915905 -4.045754 1.200010 -1.232878 -2.412802 -1.478125 5.761756 -5.889694 -4.955881 -13.342379 -11.376756 -0.824813 -18.159471 13.137141 -6.707942 -35.387150 -7.963808 -86.405704 -23.129686 22.694452 -10.007842 -13.896237 7.675224 4.155425 -15.404227 -15.226931 10.137231 -34.069606 9.185021 91.335438 -34.833356 -37.769397 -3.466088 +3.265673 95.090714 -7.679841 -90.997118 4.949230 -11.467798 -21.303236 -10.093483 -1.171338 38.337191 2.469205 -7.231759 -16.426501 1.338100 10.391592 0.000000 0.000000 0.000000 -20.637604 -2.528695 -1.239501 33.965766 -0.853115 3.193660 -14.514029 -2.580785 -5.271433 -0.000000 0.000000 -0.000000 23.575362 0.945979 -1.404393 -5.451320 -1.819816 -3.447280 3.141238 -2.627935 -0.351607 -2.232063 -2.041159 -2.312740 6.497181 -7.200908 -3.029046 -13.584763 -8.312973 -2.362870 -18.621820 18.934971 -9.873026 -39.481410 -10.177547 -88.835946 -24.721568 21.540458 -8.718362 -15.059276 10.127248 4.073558 -16.504457 -15.582968 9.596194 -34.626537 11.133180 91.341980 -37.828414 -38.008924 -4.605161 +1.475502 94.758438 -8.167821 -91.144239 6.020808 -12.266094 -21.118629 -12.757584 -1.374710 38.850538 2.416468 -6.679734 -16.704175 2.030669 9.688176 -0.000000 0.000000 0.000000 -20.654498 -5.174495 -1.600923 34.588337 -0.582399 3.434250 -14.835829 -1.924726 -4.886427 0.000000 0.000000 0.000000 24.577241 2.835311 -3.176411 -5.661640 1.519559 -4.332354 2.939187 -0.910546 -2.229942 -3.080463 -1.729437 -3.357706 7.848295 -9.184288 -0.797706 -12.924521 -4.601986 -3.947959 -18.502162 23.536195 -12.511283 -41.011602 -11.858400 -91.343867 -25.777003 20.550413 -8.242497 -15.740269 12.181262 4.064362 -17.688763 -15.722263 8.126249 -35.318609 12.872962 91.169041 -37.209002 -37.373118 -3.288476 +-0.024854 94.386215 -8.602894 -91.063223 6.821731 -12.943832 -21.287894 -15.174801 -1.196149 39.535624 2.529821 -6.310310 -17.072257 2.681756 8.657353 -0.000000 0.000000 0.000000 -21.002909 -7.090062 -2.120170 35.355621 -0.574753 3.314651 -15.284083 -1.859648 -4.026787 -0.000000 0.000000 -0.000000 25.280334 4.323089 -4.884364 -6.042671 4.829142 -5.173027 2.609357 1.078070 -3.581428 -4.323999 -1.340164 -4.151272 9.558710 -10.363028 0.796903 -12.394870 -1.209255 -4.423140 -17.042667 27.991827 -15.228764 -40.224339 -13.275238 -92.698063 -26.569088 20.983226 -8.132154 -16.316155 13.944573 3.151882 -18.579930 -15.222077 7.240179 -35.304220 14.315892 91.367252 -35.718068 -36.842814 -1.887316 +-1.113937 94.147316 -8.862411 -90.821098 7.732527 -12.907108 -21.786066 -17.217142 -1.082707 40.158737 2.291971 -6.262978 -17.359111 3.404959 7.525293 0.000000 0.000000 -0.000000 -21.132031 -8.493090 -2.800167 35.582358 -0.956125 3.104161 -15.475132 -1.799357 -3.298559 0.000000 0.000000 0.000000 25.676831 5.139043 -6.167871 -6.021117 7.148861 -5.811834 2.103507 2.503620 -4.618787 -5.253281 -0.098050 -4.845747 9.129872 -10.544689 1.969973 -11.353405 1.894426 -4.651463 -15.954530 31.485599 -16.135377 -39.277879 -15.001825 -93.605108 -26.272792 22.224849 -8.216614 -16.446299 15.357534 2.050383 -19.550656 -14.038411 5.951860 -35.346525 15.600646 93.810587 -33.961706 -36.932046 -1.036205 +-1.885145 94.060470 -8.918756 -90.977193 8.494604 -13.047225 -21.340097 -18.786169 -0.773014 40.170269 2.200001 -6.120902 -17.512915 4.022745 6.681196 0.000000 0.000000 -0.000000 -20.518398 -9.625090 -3.230332 35.293047 -1.142899 2.888353 -15.670163 -1.686239 -2.772157 -0.000000 0.000000 -0.000000 26.103785 6.264655 -6.753052 -5.416785 8.803311 -6.156645 1.443053 3.411686 -5.250205 -5.886145 1.127961 -5.241045 7.967716 -10.799274 2.300241 -10.360043 3.980837 -5.298793 -14.890341 33.454578 -16.104067 -38.875115 -15.584050 -94.150767 -27.650179 23.269153 -7.524203 -16.166881 16.104693 1.499299 -19.946116 -13.421395 4.028270 -36.837056 16.334496 98.028699 -33.635498 -38.054529 -1.727374 +-2.270030 94.027077 -8.882155 -91.050140 9.230135 -12.926399 -21.075242 -19.900888 -1.029321 40.119473 2.266172 -5.929125 -17.690637 4.288261 6.206188 -0.000000 0.000000 -0.000000 -20.001106 -10.471328 -3.451320 34.926106 -1.364444 2.712233 -15.677251 -1.649939 -2.562280 -0.000000 0.000000 0.000000 26.219038 7.341903 -6.674240 -4.695806 9.397195 -6.114021 0.990263 3.687347 -5.401950 -5.883339 1.913553 -5.382910 6.982281 -10.832105 1.798866 -9.746269 4.659619 -5.603828 -14.270140 34.254933 -16.081545 -38.163301 -15.743803 -94.128112 -27.610814 24.370650 -7.054978 -15.800103 16.549572 0.867786 -19.842404 -13.508323 2.807740 -37.871511 16.379286 101.588672 -34.321333 -38.983004 -2.710402 +-2.293954 93.990486 -8.788169 -91.108900 9.602542 -12.428360 -21.219216 -20.191580 -1.386471 40.349291 2.223407 -6.013754 -17.863912 4.241099 6.146451 -0.000000 0.000000 -0.000000 -19.750806 -10.683756 -3.934036 34.784209 -1.374352 2.812283 -15.795723 -1.561394 -2.588518 -0.000000 0.000000 0.000000 26.055302 8.044189 -6.190593 -3.951649 9.576175 -6.024746 0.768434 3.797220 -5.401938 -5.475184 2.538332 -5.254778 6.169366 -10.609725 1.286452 -9.476399 4.505028 -5.730250 -14.116596 33.377722 -15.278269 -36.877368 -16.232135 -94.066837 -26.742269 25.342766 -6.777971 -15.585209 16.499225 0.883281 -19.617536 -13.287503 2.254780 -37.876961 16.365241 103.685623 -33.304594 -39.413896 -2.150855 +-1.891285 94.016418 -8.648275 -91.305925 9.514560 -11.508525 -21.241463 -19.671760 -1.639318 40.222373 2.336928 -6.391405 -17.922229 3.902124 6.157554 -0.000000 0.000000 -0.000000 -19.516135 -10.213248 -3.912917 34.711861 -1.385964 2.702622 -15.822068 -1.491964 -3.078779 0.000000 0.000000 -0.000000 25.859349 8.345761 -5.689599 -3.205137 9.215810 -5.774002 0.772457 3.665030 -5.095339 -4.953220 2.924710 -5.057378 5.391527 -10.206780 0.547852 -9.382443 3.816070 -5.695266 -13.815386 31.345802 -14.184461 -35.983565 -15.339027 -93.719276 -26.893737 26.186472 -6.267858 -15.350913 16.032110 1.390417 -18.536790 -12.936309 2.628717 -37.381506 15.776902 105.115058 -33.434995 -40.555649 -3.057758 +-1.127853 94.130249 -8.450803 -91.736930 9.033783 -9.879295 -21.195516 -18.308916 -2.075658 39.922389 2.490575 -7.250091 -17.619095 3.566757 6.309028 -0.000000 0.000000 0.000000 -19.083734 -9.241934 -3.741322 34.504921 -1.168228 2.453391 -15.960647 -1.307458 -4.265630 0.000000 0.000000 -0.000000 26.100057 7.816485 -5.191787 -2.813622 8.693441 -5.584069 0.883923 3.500594 -4.698450 -4.663670 3.248898 -4.956112 4.900142 -9.620424 0.044212 -9.364191 2.662292 -5.348889 -13.696463 29.288524 -12.514216 -34.912346 -14.706959 -93.021778 -27.293640 26.610591 -6.445362 -15.167013 15.737205 2.195625 -17.186498 -13.079820 3.458090 -36.251704 15.787236 106.237573 -32.972660 -41.391193 -3.602134 +-0.097440 94.405701 -8.180388 -91.895213 7.737713 -8.119904 -21.044390 -16.063356 -2.061564 38.802715 2.950650 -8.184340 -17.057856 3.108673 6.474717 -0.000000 0.000000 -0.000000 -18.980827 -7.693609 -3.198173 34.311682 -0.305987 2.340923 -16.049874 -1.002871 -5.994405 -0.000000 0.000000 -0.000000 25.901156 7.314312 -4.536743 -2.577933 7.984954 -5.126498 1.098005 3.148193 -4.020068 -4.390350 3.255536 -5.303309 3.955746 -9.403199 -0.424523 -9.577210 1.999954 -4.997377 -13.997630 25.875867 -11.103690 -33.354949 -13.671530 -92.022220 -26.835794 27.328462 -6.070918 -14.772020 14.704695 3.247544 -15.521897 -13.024406 4.309212 -34.929598 15.598802 106.383739 -32.206386 -42.000468 -4.081630 +1.156058 94.785614 -7.889128 -91.904911 5.883581 -5.643886 -20.848225 -12.854763 -2.265087 36.980158 3.383727 -8.878524 -16.120631 2.568773 6.341713 -0.000000 0.000000 0.000000 -19.004769 -5.356935 -2.915060 34.169888 0.747394 1.837977 -15.937785 -1.044214 -7.524494 -0.000000 0.000000 -0.000000 25.985613 6.457123 -3.603424 -2.839328 7.096639 -4.837417 1.348655 2.789374 -3.414760 -3.816621 2.962885 -5.454943 2.961320 -9.283048 -1.515742 -9.992916 0.516072 -4.417146 -14.454807 22.314272 -9.985192 -31.478281 -12.907479 -91.216499 -26.130430 28.359685 -6.262757 -14.484552 13.693970 3.898525 -13.685359 -14.601362 5.368245 -33.730755 15.595694 105.465253 -30.442636 -41.380821 -3.543449 +2.666485 95.155098 -7.539268 -91.744322 3.856825 -2.724381 -20.697658 -9.108758 -2.729835 35.093801 3.706194 -9.675861 -14.981521 2.169464 6.200120 -0.000000 0.000000 -0.000000 -18.997632 -2.331128 -3.090865 34.190964 1.563197 0.912778 -15.980927 -1.380005 -8.641566 0.000000 0.000000 -0.000000 25.820192 5.349726 -2.267773 -3.105180 5.533586 -4.789465 1.677317 2.139303 -2.568678 -3.240300 2.587897 -4.781516 1.673949 -9.025526 -3.144761 -10.456910 -1.574231 -4.037022 -15.125772 18.479174 -9.146903 -30.688812 -11.731210 -90.812481 -24.615010 28.369506 -7.218301 -14.208982 11.599609 4.372814 -11.857340 -17.246114 6.109777 -33.764136 15.350369 103.597861 -27.164371 -39.189973 -1.861569 +4.372829 95.425034 -7.275636 -91.718599 1.941611 0.279831 -20.449316 -5.126726 -3.652390 33.609134 3.947782 -10.577866 -13.845140 1.416418 6.619933 0.000000 0.000000 0.000000 -18.689504 1.121198 -3.423894 34.224205 1.774314 -0.043221 -15.864750 -2.047710 -9.490864 -0.000000 0.000000 0.000000 25.705116 4.162214 -0.309116 -3.132541 3.223469 -4.522818 2.217599 1.156038 -1.379730 -3.497290 2.138731 -3.260260 0.855659 -8.597591 -5.759673 -11.578462 -4.222475 -4.009086 -15.584264 14.539195 -9.291846 -30.006512 -11.116625 -89.775038 -22.856048 27.188885 -8.730621 -13.960411 8.697676 4.409841 -10.896348 -19.268940 6.042588 -34.458490 14.495162 100.935255 -27.026735 -38.534392 -1.065640 +6.350116 95.443764 -7.027805 -92.036287 0.463381 3.472917 -20.077491 -1.020552 -5.255851 33.090969 3.804459 -11.491868 -13.179243 0.415576 7.617697 -0.000000 0.000000 0.000000 -17.681733 4.893167 -3.828593 34.272036 0.889651 -1.320044 -16.100391 -2.739009 -10.175892 -0.000000 0.000000 -0.000000 25.469485 2.395544 2.233453 -2.570669 0.152007 -4.075822 2.655898 -0.385650 -0.216403 -3.537665 1.293620 -1.826809 -0.736898 -7.704009 -8.027412 -12.754830 -7.123770 -4.384202 -16.000457 10.179786 -9.482939 -29.799147 -9.700519 -88.366986 -21.121105 25.890878 -10.006176 -14.094043 6.100799 4.505153 -10.373772 -19.869500 5.711372 -35.606017 11.708882 97.293299 -30.071472 -37.172902 -1.449963 +8.481284 95.256401 -6.816511 -92.088111 -0.628798 6.420535 -20.280770 2.766116 -6.646819 33.536247 3.425054 -12.437221 -12.695444 -0.610009 8.319261 0.000000 0.000000 -0.000000 -16.864689 8.573512 -4.315047 34.531939 -0.332469 -2.479378 -16.229272 -3.399702 -10.470947 0.000000 0.000000 -0.000000 24.867281 0.136510 4.614600 -2.391230 -3.219378 -3.755616 2.804586 -2.040268 1.273732 -3.005416 0.079445 -0.845081 -2.123173 -6.657457 -10.060585 -13.738990 -10.720815 -4.632681 -16.514938 6.203675 -8.828377 -29.239413 -8.757402 -86.887654 -19.232984 26.858122 -10.643945 -13.615554 4.257161 5.104896 -10.526778 -20.089217 5.497324 -37.551994 10.513738 94.941426 -30.066788 -36.973340 -1.994490 +10.491244 95.047440 -6.553224 -92.273826 -1.307308 8.814928 -20.293240 5.792997 -7.450034 34.412155 2.948829 -13.508109 -12.629043 -1.539540 8.917819 -0.000000 0.000000 0.000000 -15.614109 11.708311 -5.237965 34.425818 -1.495526 -3.044335 -16.374883 -3.869851 -10.600349 -0.000000 0.000000 0.000000 23.649005 -1.926297 7.029569 -2.036598 -7.004788 -3.123583 2.889989 -3.996443 2.447814 -3.207964 -1.123245 -0.270861 -2.071629 -5.019044 -12.268177 -14.632990 -13.991935 -4.870783 -16.736393 3.371213 -8.199428 -28.666083 -9.715485 -85.155154 -15.547781 27.186355 -11.378670 -13.866592 2.519392 5.307947 -10.645806 -20.177939 6.044065 -39.080318 11.075708 94.642026 -26.799025 -37.953917 -2.261783 +12.337668 94.874123 -6.291156 -92.343021 -2.285597 10.198081 -19.839400 8.624193 -8.084372 34.601547 2.960237 -13.770761 -12.409445 -2.481569 9.195377 -0.000000 0.000000 0.000000 -14.575298 14.935273 -5.675570 34.435816 -2.546986 -3.446469 -16.375476 -4.636848 -10.069386 0.000000 0.000000 -0.000000 22.796322 -3.800633 8.870068 -1.759854 -9.937752 -2.719866 1.993858 -5.249489 3.374389 -3.478694 -2.397500 0.395405 -1.996842 -3.544077 -13.897181 -15.405943 -16.667909 -4.687294 -16.538642 0.455149 -7.426720 -27.031121 -10.804074 -83.496000 -12.697574 28.231302 -11.248364 -13.605484 0.761819 5.514037 -10.118606 -21.427351 7.591568 -40.621003 10.701494 94.645425 -26.665091 -38.857351 -3.065792 +13.747081 94.727425 -6.023805 -92.339263 -3.070964 10.639394 -19.428464 10.431392 -8.023081 34.515039 3.377455 -13.984957 -12.402649 -2.998253 9.461606 0.000000 0.000000 -0.000000 -13.872635 17.336608 -6.099078 34.310719 -3.016442 -3.397770 -16.307989 -5.098682 -9.782972 -0.000000 0.000000 -0.000000 22.357243 -5.407257 9.970182 -1.622335 -11.932748 -2.564890 1.223938 -6.031643 4.132818 -4.391423 -3.364452 1.010837 -3.072954 -2.802927 -14.457739 -15.345478 -17.756660 -4.411544 -16.519005 -3.079501 -5.614307 -24.431637 -10.825885 -83.311014 -10.187789 28.726881 -12.471502 -12.903103 -1.121335 6.121599 -10.002717 -21.445314 8.575571 -40.679306 10.196610 94.279761 -25.596448 -39.046196 -2.827179 +14.864622 94.594986 -5.783319 -91.957672 -3.693424 10.701429 -19.451150 11.487076 -7.199509 34.157422 3.908435 -14.173302 -12.364695 -3.136545 8.909396 0.000000 0.000000 -0.000000 -13.915343 19.235210 -6.424899 34.336753 -3.175077 -3.289622 -16.171008 -5.809354 -9.287479 0.000000 0.000000 -0.000000 21.974730 -6.738148 10.262476 -1.780882 -13.112729 -2.533160 0.464266 -6.615719 4.668032 -4.963007 -4.211184 1.525714 -3.836304 -2.484063 -13.756149 -15.062903 -17.826085 -3.991830 -15.858720 -5.625615 -4.062386 -22.760463 -10.636545 -84.717133 -8.121501 29.229297 -13.649916 -12.178861 -2.443180 6.692408 -9.751651 -20.553996 9.032237 -39.600530 9.528502 93.587067 -23.612192 -39.107386 -1.908239 +15.587669 94.503647 -5.521529 -91.660317 -4.025000 10.541477 -19.586753 12.023655 -6.524655 34.185984 4.357437 -14.165876 -12.366406 -3.300543 8.724669 0.000000 0.000000 0.000000 -14.079092 20.474858 -6.397564 34.512483 -3.516971 -3.155021 -16.222245 -6.183163 -8.874181 0.000000 0.000000 -0.000000 21.550638 -7.689708 10.076205 -1.533306 -13.751938 -2.723763 -0.004504 -6.972016 4.679846 -5.178206 -4.954840 1.333535 -4.345248 -2.584263 -12.930821 -14.490040 -17.179620 -3.713972 -15.126522 -6.594289 -2.923804 -22.861433 -10.023365 -86.611453 -7.167976 28.848575 -14.375949 -11.858468 -3.046165 7.033650 -9.730518 -18.916237 8.978631 -38.411291 8.724184 93.073328 -22.585010 -39.434916 -1.543899 +15.964429 94.468231 -5.206156 -91.723654 -4.007404 9.780365 -19.306313 12.012369 -6.153241 34.069540 4.579122 -13.789770 -12.596653 -3.369406 8.839928 0.000000 0.000000 -0.000000 -13.996953 20.772886 -6.116959 34.386248 -3.658257 -3.056825 -16.175237 -6.509144 -8.466828 -0.000000 0.000000 0.000000 21.508133 -8.163434 9.722794 -1.184137 -14.004498 -2.966958 -0.415341 -7.133085 4.440552 -4.635443 -5.701255 0.827520 -3.779172 -2.966428 -12.223519 -14.081143 -16.510660 -3.762106 -14.897102 -6.163896 -2.687147 -23.190458 -10.304814 -88.000253 -6.183221 27.954431 -15.144973 -11.514122 -2.862225 7.201006 -10.120646 -17.998889 8.690959 -37.696497 8.339322 92.576961 -22.409140 -39.543163 -0.952396 +15.858306 94.601013 -4.818780 -92.097648 -3.398580 7.970687 -18.784079 11.032892 -5.480484 33.983647 4.385194 -13.397733 -12.829801 -3.022608 9.072899 0.000000 0.000000 0.000000 -13.872562 19.681698 -5.795574 33.890488 -3.314622 -2.583602 -15.993057 -6.614235 -7.913221 0.000000 0.000000 -0.000000 22.009270 -8.037931 9.088206 -1.172573 -13.688725 -3.311846 -0.375359 -7.069994 4.005704 -3.526272 -6.283835 0.697658 -2.536287 -3.674368 -11.683255 -13.564006 -15.804297 -4.220098 -14.987668 -5.411507 -2.765337 -23.446407 -11.029438 -88.639845 -5.434955 27.044953 -15.666018 -11.572541 -2.379336 7.356707 -10.784747 -17.705461 8.479230 -36.825151 8.864552 91.952590 -21.515479 -38.340186 0.230736 +15.388649 94.844452 -4.427769 -92.324835 -2.395862 5.306763 -18.443651 9.253989 -4.602644 34.058400 4.233897 -12.546132 -13.405240 -2.778177 9.504712 0.000000 0.000000 -0.000000 -14.185290 17.916557 -5.343559 33.294058 -2.984878 -1.867485 -15.561110 -6.767515 -7.087669 0.000000 0.000000 -0.000000 22.454635 -7.229626 8.199698 -1.108466 -13.043616 -3.528008 -0.231347 -6.895174 3.627076 -2.660564 -6.502797 1.115128 -0.993490 -4.257166 -11.263475 -13.549647 -15.376429 -4.699700 -15.108631 -3.839297 -3.650194 -23.705016 -11.310461 -88.052188 -6.526062 27.406122 -15.423342 -11.910761 -1.686567 7.150461 -11.663081 -17.106420 8.697228 -35.742094 9.582543 90.967676 -22.097694 -38.061911 0.113430 +14.467941 95.169701 -4.084565 -92.099034 -0.941981 1.684522 -18.453298 6.413909 -3.584448 33.935816 4.321873 -11.552668 -13.907051 -2.492374 9.881226 -0.000000 0.000000 0.000000 -15.158922 15.270272 -4.814468 32.548732 -2.658109 -0.521304 -15.055178 -6.595521 -6.447205 0.000000 0.000000 -0.000000 22.410023 -6.043996 6.988631 -1.228052 -11.643498 -3.620811 0.413368 -6.325072 3.088676 -2.179771 -6.091256 1.285584 0.708260 -4.829481 -10.435733 -13.258118 -14.509938 -5.077874 -15.557352 -1.618546 -4.826273 -25.315018 -10.160461 -86.629049 -10.408810 26.786531 -14.622658 -12.092306 -0.585962 7.121378 -12.437500 -16.282222 9.257057 -35.507688 9.863871 90.359014 -23.534924 -37.957548 -0.540848 +13.170640 95.518692 -3.731210 -91.776134 0.627961 -2.482227 -18.280495 2.977599 -2.497576 33.866846 4.555178 -10.036707 -14.557753 -1.883929 10.025873 0.000000 0.000000 -0.000000 -15.945366 12.002019 -4.359452 31.584324 -1.986675 1.145806 -14.482464 -6.668175 -5.442571 -0.000000 0.000000 0.000000 21.979771 -4.592911 5.524991 -1.516227 -9.567466 -3.569794 1.180028 -5.411594 2.448847 -1.639581 -5.240802 0.969313 2.956303 -5.591175 -9.087735 -13.810513 -12.730920 -5.509886 -16.295423 2.145349 -7.679203 -27.798112 -8.482066 -85.159288 -14.660521 26.022553 -13.777414 -12.578349 0.744762 6.961643 -12.881059 -15.392629 10.101803 -34.846111 10.000724 89.888716 -25.155514 -38.007131 -1.057255 +11.426759 95.814102 -3.505538 -91.820371 2.069987 -6.320534 -17.476779 -0.467092 -1.732590 33.996067 4.741917 -8.509149 -15.418511 -1.089417 10.316126 -0.000000 0.000000 -0.000000 -16.125036 8.383241 -3.728953 31.029409 -1.031751 2.557791 -14.070789 -6.500166 -4.689037 -0.000000 0.000000 -0.000000 21.711492 -2.679447 3.800472 -2.128917 -6.810616 -3.774263 1.982518 -4.186576 1.480112 -1.391743 -4.107781 0.363644 5.514473 -6.295227 -7.212006 -14.233753 -9.779792 -6.550166 -16.963314 7.527551 -11.254946 -32.129352 -7.327791 -84.958078 -19.108522 22.833746 -12.785366 -13.723554 2.403526 6.699344 -13.237046 -14.503313 10.921549 -34.024952 10.500840 89.548654 -26.608209 -36.586795 -1.070349 +9.381150 95.902916 -3.542824 -91.745410 3.377031 -9.330124 -17.009405 -3.886461 -1.520815 34.559993 5.060773 -7.060053 -16.047263 -0.196797 10.432821 -0.000000 0.000000 -0.000000 -16.495621 4.523834 -2.449391 31.289235 -0.229569 3.290467 -14.381648 -5.788086 -4.699466 -0.000000 0.000000 -0.000000 21.195174 -0.661556 1.477893 -2.676153 -3.557213 -4.155311 2.673873 -2.589732 0.182441 -1.464951 -2.775343 -0.423185 7.292419 -6.970807 -4.315738 -14.139072 -6.205081 -8.051267 -17.145839 13.477225 -15.337055 -38.281073 -6.607927 -86.612642 -23.767075 20.029434 -11.717198 -14.791643 4.463489 6.763799 -13.712761 -13.564224 11.405106 -33.668083 10.837914 88.984413 -30.030334 -36.445860 -2.121948 +7.134080 95.777512 -3.899154 -92.077403 4.444926 -10.890392 -16.354067 -7.016782 -1.300502 35.175272 5.151676 -6.383811 -16.881767 0.462250 10.187855 0.000000 0.000000 -0.000000 -16.565230 0.955603 -1.572465 32.360586 0.518234 3.712595 -15.269037 -4.510529 -5.351604 0.000000 0.000000 -0.000000 21.468555 1.424030 -1.182733 -3.195205 0.241793 -5.012953 2.687208 -0.666902 -1.682250 -2.226013 -1.614059 -2.078347 8.858955 -8.282754 -1.312859 -13.650365 -1.983065 -9.887690 -17.271993 18.409126 -19.280907 -42.649969 -7.139142 -90.254483 -26.190467 18.088237 -10.608523 -15.700577 6.965421 7.143652 -14.538880 -12.747716 10.922777 -32.912591 12.334586 88.009267 -30.447608 -36.305530 -2.166288 +4.878683 95.543266 -4.379132 -92.410864 5.338564 -11.550389 -15.917092 -9.891265 -0.989895 35.833167 5.075569 -6.217750 -17.611667 1.229352 9.561184 -0.000000 0.000000 0.000000 -16.502641 -1.960328 -1.511479 33.382923 0.971848 3.674485 -16.129652 -3.847046 -5.294585 -0.000000 0.000000 -0.000000 21.986082 3.383905 -3.580428 -3.887811 4.114601 -6.152348 2.531407 1.542496 -3.523456 -3.105008 -0.754918 -3.957139 10.962643 -9.519954 0.426206 -13.272360 1.487563 -10.600984 -16.366163 22.870380 -23.508388 -43.509851 -7.619645 -92.287228 -27.985086 17.809455 -10.573812 -16.915245 9.575181 6.556674 -14.591482 -12.334671 10.765744 -31.188401 14.302642 86.803583 -28.802505 -36.054782 -1.172777 +2.799249 95.373741 -4.905643 -92.734411 6.371416 -12.292855 -15.348790 -13.000245 0.205415 36.302479 4.819357 -6.465129 -18.118848 2.262071 8.564987 0.000000 0.000000 -0.000000 -16.070491 -4.498493 -1.783235 33.718197 1.046035 4.028168 -16.539801 -3.295015 -4.723243 -0.000000 0.000000 -0.000000 22.581565 5.253564 -5.567689 -4.283057 7.228930 -6.907906 2.112837 3.244559 -4.891477 -3.800842 0.518868 -5.241192 11.691929 -9.952754 1.142647 -12.670168 4.166066 -10.560767 -15.685010 24.834618 -25.013527 -42.206366 -9.492464 -92.252802 -27.757184 18.653036 -10.634166 -17.749764 11.508719 5.740700 -13.985999 -11.521621 10.444558 -28.330124 15.399896 87.613671 -29.427708 -36.308840 0.117206 +0.953263 95.280808 -5.343446 -92.893375 7.669305 -13.485304 -14.600849 -16.329964 1.520600 36.479948 4.720394 -6.638212 -18.254031 3.486220 7.766116 0.000000 0.000000 0.000000 -15.464283 -7.178993 -1.958946 33.501255 0.998319 4.425463 -16.557819 -2.805205 -4.318636 -0.000000 0.000000 -0.000000 22.688597 7.067630 -6.748939 -3.894064 9.317677 -6.970372 1.350047 4.240250 -5.447043 -3.943603 2.141158 -5.646463 10.770642 -10.091547 1.686519 -11.784224 5.711769 -11.027757 -15.289792 25.537268 -24.703604 -41.470060 -10.479244 -91.433567 -27.435786 18.861522 -10.341175 -17.433329 13.110763 5.271284 -13.231722 -10.490918 8.677839 -26.685173 16.630799 91.266239 -29.088572 -35.805088 1.601014 +-0.313888 95.066765 -5.718972 -92.702678 8.857645 -14.406946 -14.490633 -18.866740 1.483361 36.852945 4.813454 -6.119032 -18.326984 4.120957 7.436130 0.000000 0.000000 -0.000000 -15.236028 -9.047294 -2.382918 33.105908 0.539014 4.781295 -16.305138 -2.808618 -3.698058 0.000000 0.000000 0.000000 22.434838 8.491119 -6.566668 -2.936049 10.130777 -6.664460 0.473175 4.542217 -5.526100 -3.754040 3.399428 -5.557217 9.440522 -10.094028 1.467308 -11.057794 6.604570 -11.685366 -14.802727 25.965780 -24.615365 -41.768794 -10.613778 -91.186893 -27.248603 19.258951 -9.949876 -16.647080 13.549624 4.802214 -13.122736 -8.995306 6.663232 -26.207073 17.671351 94.772326 -29.284696 -36.050439 1.202345 +-1.215727 94.837631 -6.088190 -92.868036 9.626010 -14.313141 -14.509210 -20.341299 0.930803 37.122775 4.789072 -5.859739 -18.364134 4.440615 7.374497 0.000000 0.000000 -0.000000 -15.064120 -10.262640 -2.619935 33.220487 0.102721 4.727918 -16.343458 -2.556700 -3.707180 0.000000 0.000000 -0.000000 22.730316 9.580082 -6.297140 -2.037775 10.554214 -6.457992 -0.163346 4.625065 -5.626453 -3.242063 4.123709 -5.409887 8.399935 -10.288261 1.280174 -10.708722 7.117511 -12.266445 -15.098704 25.263074 -24.276107 -41.424555 -11.105578 -91.203213 -26.271978 20.635300 -9.693369 -16.018413 13.562539 4.859317 -13.083607 -8.317405 5.355278 -26.141336 18.683382 96.093286 -28.612768 -36.664354 0.828125 +-1.745968 94.628250 -6.405217 -92.945832 9.815926 -13.668918 -15.004045 -21.235108 0.934755 37.392596 4.860393 -6.300435 -18.214665 4.782745 6.876363 -0.000000 0.000000 0.000000 -15.327157 -10.847331 -2.724453 33.596267 -0.025445 4.520188 -16.522993 -2.083277 -4.073288 0.000000 0.000000 0.000000 22.933026 9.997567 -6.204113 -1.640855 10.724250 -6.224180 -0.358819 4.669765 -5.499506 -2.476364 4.694065 -5.203981 8.155306 -10.272078 1.312334 -10.695030 6.954875 -12.471871 -15.552382 24.114353 -23.406803 -40.737365 -11.162793 -90.998856 -25.247186 20.726351 -9.492472 -15.716382 13.528711 5.267869 -12.964774 -8.317933 4.936705 -26.120932 19.524930 97.015896 -26.182348 -36.406170 1.230696 +-1.942880 94.573921 -6.613322 -93.322188 9.385832 -12.540394 -15.097887 -21.154036 1.204619 37.034578 5.012219 -6.780188 -17.854422 5.090566 6.241210 -0.000000 0.000000 0.000000 -15.356049 -10.413221 -3.033087 33.847870 -0.021531 4.381335 -16.630563 -1.915630 -4.398456 -0.000000 0.000000 0.000000 23.350117 9.953036 -6.030717 -1.438351 10.742101 -6.109968 -0.257051 4.736249 -5.268954 -1.878523 5.074723 -4.882513 8.025087 -10.004912 1.280058 -10.841729 6.595323 -12.283656 -15.971034 22.884513 -22.356698 -39.864173 -11.222288 -90.785924 -23.979590 20.603585 -9.855086 -15.645231 13.351770 5.442570 -12.821892 -8.201996 5.028152 -25.977276 20.151693 98.732578 -23.786930 -36.346534 1.801283 +-1.696227 94.759476 -6.711719 -93.600024 8.286947 -10.875193 -15.297101 -19.564929 1.134819 36.178578 4.909417 -7.583285 -17.281814 4.871039 6.201950 0.000000 0.000000 -0.000000 -15.391244 -9.127036 -3.494112 33.679033 0.307786 4.260438 -16.703428 -1.765483 -5.260952 -0.000000 0.000000 -0.000000 23.669182 9.275078 -5.590901 -1.572955 10.445803 -5.937208 0.071571 4.674861 -4.936234 -1.495231 5.072796 -4.904143 8.125422 -9.699294 1.142961 -11.315141 6.122736 -11.574434 -15.929774 21.247880 -21.467183 -38.090516 -11.094402 -90.627246 -24.234040 21.720263 -9.254837 -15.580520 13.020069 5.539459 -12.427104 -7.761732 5.365590 -25.863453 20.090704 99.679091 -22.452757 -36.476619 1.807788 +-1.186247 95.167870 -6.744550 -93.641711 6.781503 -8.850267 -15.364355 -17.150257 0.769770 34.387154 4.860157 -8.367459 -16.292381 4.439310 6.431580 0.000000 0.000000 0.000000 -15.447462 -7.610808 -3.647683 33.043938 1.013161 3.994299 -16.553535 -1.563707 -6.666381 0.000000 0.000000 0.000000 24.012268 8.394039 -4.929195 -2.128717 9.675858 -5.795134 0.652833 4.325145 -4.410729 -1.232858 4.858878 -4.984996 7.705250 -9.694132 0.470276 -12.142042 4.942727 -10.841268 -15.989277 18.786426 -20.510387 -35.829725 -10.899257 -90.594139 -23.093796 22.454911 -9.150286 -15.570537 12.527863 5.778731 -12.044239 -7.606771 5.382932 -26.328264 20.096503 99.641641 -19.316317 -35.947756 2.257386 +-0.219226 95.764916 -6.748640 -93.179415 4.819250 -6.265501 -15.758677 -13.623831 0.248651 31.955513 4.373770 -9.515637 -14.766337 3.907264 6.728962 -0.000000 0.000000 0.000000 -15.635132 -5.055667 -3.893953 31.837330 1.416724 3.538904 -16.019807 -1.753139 -7.900718 -0.000000 0.000000 0.000000 23.788950 7.132568 -3.846576 -2.649818 8.150037 -5.892427 1.377310 3.783033 -3.722179 -1.162932 4.312011 -4.695856 6.744512 -9.423174 -1.170050 -13.301082 2.742458 -10.496367 -16.440749 14.508406 -19.322938 -33.141953 -10.731351 -90.016679 -20.612133 23.307972 -9.079676 -16.200004 11.319824 6.126521 -12.028620 -8.488911 5.910449 -27.889982 19.121275 98.860834 -16.644739 -35.632249 2.692170 +1.200518 96.372460 -6.768699 -92.517868 2.877564 -3.202283 -16.425839 -9.292215 -0.771220 29.828551 3.308245 -10.846579 -13.249182 3.120542 7.263483 -0.000000 0.000000 0.000000 -15.779537 -1.688735 -4.774574 30.504548 1.426515 2.849955 -15.087654 -2.555837 -8.454412 0.000000 0.000000 0.000000 23.442251 5.440432 -2.087235 -3.149413 5.728341 -6.118183 2.273447 2.786159 -2.698289 -1.170820 3.801874 -3.787030 5.119217 -8.778813 -3.644197 -14.562767 -1.091400 -10.124527 -16.568363 10.661684 -18.216913 -29.833360 -10.633074 -88.501105 -18.941683 23.271119 -10.004319 -16.846137 10.108823 6.574710 -12.285948 -10.692213 6.730747 -31.787503 18.031655 98.222097 -12.878309 -33.392341 4.216646 +3.098801 96.669129 -6.936933 -91.738017 1.199650 -0.375208 -17.504243 -4.853232 -3.070758 28.849090 2.816266 -11.260340 -12.067936 1.276343 8.375736 0.000000 0.000000 0.000000 -16.254253 1.741221 -4.088488 30.037417 0.534239 2.062655 -14.631353 -2.977022 -10.112647 -0.000000 0.000000 0.000000 22.254819 3.904300 0.392522 -2.325151 1.521484 -5.611130 2.813757 1.575088 -1.329676 -1.940629 0.854441 -0.525401 1.911843 -5.669830 -8.281658 -14.195133 -5.187882 -9.212843 -17.636303 5.765583 -18.283255 -26.371178 -11.897174 -85.963445 -13.395135 18.945178 -15.043965 -16.089804 7.358964 5.875564 -13.628175 -11.202709 10.103593 -37.487895 17.252773 96.477253 -12.412292 -27.055645 7.341592 +5.292360 96.516052 -7.082924 -92.028013 -0.024084 2.170583 -18.257057 -0.725347 -4.638040 30.038056 1.948648 -11.996023 -11.841397 0.280709 9.203842 -0.000000 0.000000 0.000000 -16.139129 4.937745 -3.836619 30.942439 -0.090071 0.973609 -14.706503 -3.414764 -11.041041 -0.000000 0.000000 -0.000000 22.697484 1.497478 3.127816 -2.234468 -2.061981 -4.939523 3.157469 -0.478202 0.522691 -3.242907 -0.285883 0.634588 -0.860590 -4.747153 -10.626475 -14.957254 -9.590184 -9.445018 -17.244544 1.259696 -16.173852 -23.830868 -11.679612 -84.007146 -10.549102 19.055248 -16.279283 -16.043941 5.800530 7.408702 -15.409854 -11.975285 10.965228 -42.416266 13.937034 95.543900 -14.292590 -24.491750 7.668202 +7.523673 95.886810 -7.185413 -92.463541 -0.679674 4.957140 -19.487288 2.682834 -5.832700 32.702137 1.304498 -13.020575 -12.151128 -0.900735 9.630395 -0.000000 0.000000 0.000000 -16.064146 7.929531 -4.139468 32.568571 -1.039081 -0.186336 -15.217130 -3.444451 -11.721393 0.000000 0.000000 -0.000000 22.891049 -1.489684 5.755164 -2.328159 -5.959913 -3.918034 3.110686 -2.729089 2.339721 -4.803493 -1.315017 0.765753 -2.111194 -3.298832 -12.757261 -15.776351 -13.475768 -9.458461 -16.207715 -0.901363 -14.251266 -20.359508 -13.352644 -82.406676 -7.778379 19.966213 -16.119275 -16.002141 4.718398 8.454458 -17.329835 -12.565154 11.664636 -45.779314 14.499596 95.869359 -10.859695 -23.926410 7.183395 +9.385655 95.378113 -7.095987 -92.747657 -1.666125 7.550125 -20.037987 5.748787 -6.883473 34.401398 1.469436 -13.810476 -12.396434 -1.757451 9.895862 0.000000 0.000000 -0.000000 -15.755391 11.404725 -5.295822 34.312769 -1.907299 -1.180455 -16.043656 -3.781449 -11.020949 -0.000000 0.000000 0.000000 22.688563 -3.450268 7.772097 -2.821310 -9.460540 -3.404161 1.891994 -4.689084 3.513549 -5.547381 -2.292111 0.746424 -0.886220 -2.766922 -14.447776 -16.951316 -17.182320 -10.999567 -13.238852 -1.761748 -10.585096 -18.027930 -14.568210 -82.902731 -7.758208 22.972993 -14.824643 -16.773165 3.323030 10.592561 -16.957971 -14.239338 9.991491 -47.311270 13.782863 96.375619 -10.983354 -29.478846 4.378076 +10.767504 95.159859 -6.898298 -93.490812 -2.408604 9.539679 -19.490083 7.765436 -7.134749 35.409619 1.645554 -14.494984 -12.758766 -2.390200 9.586769 -0.000000 0.000000 -0.000000 -14.007441 14.225847 -6.335314 34.614480 -3.129202 -1.983136 -16.481519 -4.474543 -10.434453 -0.000000 0.000000 -0.000000 22.455036 -5.624106 9.264102 -2.689511 -12.036074 -3.124463 0.894582 -5.982536 4.270630 -6.023600 -2.973942 0.355297 -1.532080 -1.646482 -15.341301 -17.049389 -17.813930 -10.147072 -12.490051 -2.703536 -10.045604 -16.188113 -14.215622 -84.239182 -7.005122 22.978196 -15.832723 -16.178393 1.092051 10.028552 -16.830567 -13.600049 10.017921 -46.171432 13.303738 95.206342 -8.389293 -29.857342 5.237936 +11.793443 94.983009 -6.755372 -93.987055 -3.134207 10.550712 -18.846527 9.243425 -6.943433 35.704828 1.880434 -14.887639 -13.008845 -2.807732 9.341580 -0.000000 0.000000 -0.000000 -12.955323 16.107102 -6.832056 34.985261 -3.471140 -2.280738 -16.894642 -4.820067 -10.165283 -0.000000 0.000000 -0.000000 22.444109 -7.265650 9.824919 -2.138209 -13.638162 -3.138364 -0.216699 -6.880509 4.793039 -6.292794 -3.679088 0.203289 -2.812705 -1.169797 -14.557837 -16.732971 -17.666724 -9.403502 -11.771967 -4.107446 -8.447204 -15.001425 -13.096218 -86.123226 -6.693386 22.912479 -16.446968 -15.444597 -0.402139 10.231540 -16.498748 -12.340343 9.894061 -45.048618 11.848521 93.913450 -6.663017 -29.689585 5.694343 +12.449861 94.863289 -6.667195 -94.190236 -3.435809 10.798372 -18.686373 10.074656 -6.336875 36.115219 1.654380 -15.146153 -13.156695 -2.987103 9.186762 0.000000 0.000000 -0.000000 -12.417581 17.016130 -6.996090 34.900120 -3.519542 -2.440663 -16.944543 -4.914170 -10.059055 0.000000 0.000000 -0.000000 22.430220 -8.500726 9.635264 -1.680048 -14.627260 -3.400037 -0.759771 -7.537703 5.095472 -6.053684 -4.038331 -0.041228 -3.934287 -0.936755 -13.239485 -16.318645 -17.491084 -9.041133 -10.996091 -4.562871 -6.714245 -14.272362 -12.824025 -87.491844 -6.613619 23.805137 -16.455334 -14.934676 -0.635034 10.855806 -16.331806 -11.184659 9.764000 -44.151027 11.313421 93.860715 -5.235558 -30.686274 5.578793 +12.836820 94.853699 -6.556621 -94.262524 -3.485854 10.313271 -18.425506 10.456885 -5.917002 36.034029 1.407966 -15.108874 -13.322099 -3.077604 9.426201 0.000000 0.000000 0.000000 -12.234902 17.390091 -6.738723 34.698472 -3.621619 -2.368125 -16.849420 -4.976973 -9.873402 -0.000000 0.000000 0.000000 22.492149 -9.215114 9.374792 -1.222320 -15.230348 -3.560672 -1.181423 -7.910130 4.909315 -5.635429 -4.490752 -0.120051 -4.444904 -0.703176 -12.469657 -15.493515 -17.252752 -8.845116 -10.204369 -5.102093 -5.448109 -14.084908 -12.848132 -88.537981 -6.349224 23.163628 -16.730782 -14.686866 -0.821308 11.147595 -16.110485 -9.977240 10.091076 -42.689296 10.951832 93.773557 -4.562934 -29.620641 6.233647 +12.856416 95.041245 -6.343820 -94.340730 -3.102202 8.545452 -17.933495 9.726337 -5.420856 35.419030 1.548872 -14.569606 -13.482661 -2.906686 9.738699 0.000000 0.000000 -0.000000 -12.230296 16.866981 -6.654746 33.850520 -3.277723 -1.759125 -16.279125 -5.376115 -9.149236 0.000000 0.000000 -0.000000 22.779972 -9.046831 9.165562 -0.754846 -15.350714 -3.579137 -1.266148 -8.204016 4.848900 -5.267281 -4.529011 -0.020411 -4.494735 -0.918180 -12.215452 -15.514268 -17.306290 -8.988181 -9.933720 -4.751954 -5.425921 -13.964351 -13.137747 -89.164956 -5.621350 23.191003 -16.813720 -14.640584 -0.519350 11.181545 -16.160613 -9.375736 10.022469 -40.912092 11.090246 93.541264 -5.403202 -31.256563 5.883012 +12.542817 95.345009 -6.096161 -94.204814 -2.255474 6.219366 -17.701818 8.283708 -4.816867 34.808756 1.571989 -13.949950 -13.707818 -2.515396 10.218545 0.000000 0.000000 -0.000000 -12.544443 15.593592 -6.480955 32.699003 -3.052539 -1.002310 -15.585711 -5.658589 -8.401125 -0.000000 0.000000 -0.000000 23.056916 -8.537282 8.704561 -0.391912 -14.964598 -3.610137 -1.178917 -8.199492 4.722742 -4.846709 -4.362176 0.162714 -4.368090 -1.263391 -12.013841 -15.678985 -17.009753 -9.266844 -9.988586 -4.607726 -5.918734 -14.224136 -12.940001 -89.184647 -5.273525 23.265780 -16.788825 -14.377025 -0.220704 11.216859 -16.163372 -8.964325 9.789457 -39.715169 11.055630 93.066952 -6.698240 -31.776043 5.464070 +11.808478 95.714073 -5.840906 -93.720823 -0.885090 3.359254 -17.865950 6.039830 -3.981245 34.413213 1.293831 -13.116148 -13.956129 -2.200877 10.604902 0.000000 0.000000 -0.000000 -13.185301 13.427761 -6.213864 31.284839 -2.957071 -0.118267 -14.604997 -5.964370 -7.757611 -0.000000 0.000000 -0.000000 23.295038 -7.690103 7.841645 -0.498106 -13.899458 -3.668728 -0.696292 -7.885004 4.217316 -4.741910 -3.941711 0.468373 -3.609242 -1.686849 -11.165862 -15.620125 -16.185415 -9.324878 -10.703583 -3.560126 -6.622029 -15.491436 -12.928146 -88.805043 -5.723920 22.732412 -16.270157 -14.389145 0.184596 10.989937 -16.225671 -8.524496 9.889093 -38.195153 11.348518 92.663789 -7.893150 -31.741088 5.415638 +10.672144 96.071686 -5.576171 -93.153217 0.675147 -0.019266 -17.934053 3.195210 -3.448320 34.076111 1.202210 -11.673074 -14.279386 -1.497897 10.907869 0.000000 0.000000 0.000000 -13.890337 10.674122 -5.679022 29.965355 -2.904782 0.631212 -13.671686 -6.237213 -6.807070 -0.000000 0.000000 0.000000 23.258102 -6.262399 6.824355 -0.373543 -12.366399 -3.608939 -0.124668 -7.393996 3.690395 -4.569462 -3.593576 0.932206 -2.665541 -2.348530 -10.250723 -15.948047 -14.746164 -9.440899 -11.627930 -0.509688 -8.563552 -17.942500 -12.682236 -87.838732 -6.703456 22.897528 -15.715138 -14.545572 0.887140 10.449521 -16.484440 -8.155715 10.135274 -37.090253 12.118966 92.772050 -10.099240 -32.427797 4.771805 +9.110340 96.351380 -5.288484 -93.056939 2.164703 -3.204480 -17.210755 -0.083395 -2.857572 33.751246 1.290200 -10.256071 -14.724023 -0.494499 10.732786 0.000000 0.000000 0.000000 -13.902412 7.659525 -5.210882 29.004481 -2.709066 1.297781 -13.096747 -6.385603 -5.607364 0.000000 0.000000 0.000000 23.529330 -4.433177 5.446088 -0.503602 -9.975997 -3.806003 0.354898 -6.580248 2.775122 -3.492143 -3.065413 0.451829 -1.651658 -3.738465 -8.582296 -16.171762 -12.189823 -10.036922 -12.804791 4.931599 -11.361100 -21.653464 -12.879785 -87.208531 -9.382942 21.970170 -14.306096 -14.940814 2.293356 10.074890 -16.774462 -8.518783 10.118276 -35.741474 12.979341 92.906175 -12.576142 -32.320068 4.457837 +7.237919 96.471939 -5.263652 -92.946360 3.381523 -6.029178 -16.605043 -3.413894 -2.279473 33.622564 1.692984 -8.821755 -15.117757 0.536486 10.425355 0.000000 0.000000 -0.000000 -14.348896 4.297380 -4.235443 29.140555 -1.992542 2.017563 -13.115800 -5.660160 -5.242366 -0.000000 0.000000 -0.000000 23.200916 -2.301945 3.572156 0.094227 -7.009161 -4.099279 1.027138 -5.294768 1.457287 -2.955083 -2.500526 -0.236778 -0.653130 -5.278033 -6.376796 -15.840355 -8.537968 -11.187160 -14.340273 10.678084 -14.090987 -27.289827 -14.215097 -87.978569 -11.048301 20.897711 -12.350509 -15.369792 4.161830 9.997806 -17.304825 -9.111570 10.195316 -34.607725 15.008233 92.938296 -14.516377 -32.032229 3.605950 +5.257540 96.294777 -5.515145 -93.244955 4.204454 -8.296533 -15.749412 -6.434724 -2.057276 33.640873 2.524424 -7.399116 -15.429948 1.542700 10.013739 -0.000000 0.000000 0.000000 -14.895325 0.853148 -2.668436 30.404702 -0.794792 2.544065 -13.912326 -4.601957 -5.774749 -0.000000 0.000000 0.000000 23.580912 -0.010376 1.022869 0.659439 -3.296436 -4.605714 1.255102 -3.351238 0.023344 -2.856000 -1.904153 -0.899256 0.141481 -7.340569 -3.190177 -14.986914 -4.647127 -12.528886 -15.557138 15.987486 -16.938791 -33.677306 -15.046310 -90.207521 -13.884135 18.656460 -10.972653 -15.560897 6.482937 10.350852 -17.679821 -9.512277 9.866488 -34.009523 16.739686 92.567117 -16.301733 -31.558214 3.669560 +3.344108 95.934799 -5.837994 -93.577655 4.877959 -10.004478 -15.005358 -9.146342 -1.407728 33.829041 3.068541 -6.457322 -15.874210 2.306912 9.493963 -0.000000 0.000000 0.000000 -15.402711 -1.919821 -1.928836 32.061466 0.089427 3.026876 -14.967132 -3.571988 -5.803799 0.000000 0.000000 0.000000 24.103208 1.785543 -1.414027 0.964947 0.793214 -5.504706 1.126105 -0.964725 -1.371458 -3.486874 -1.419545 -1.706753 1.736104 -9.709240 -0.373562 -14.490029 -1.025428 -13.597319 -16.041245 20.478598 -19.558894 -37.749750 -15.490025 -92.583450 -15.619196 16.297288 -10.569818 -16.188519 9.054554 10.620670 -18.145712 -9.874391 9.232583 -33.263712 18.476029 91.912996 -17.150644 -32.220689 3.446946 +1.704267 95.648384 -6.194905 -93.782813 5.474814 -10.836823 -14.718556 -11.316592 -0.564888 34.375674 2.985607 -6.329105 -16.266161 2.894554 8.766956 -0.000000 0.000000 0.000000 -15.574110 -3.859226 -2.139676 33.067696 0.544208 3.394316 -15.669939 -3.034423 -5.123741 0.000000 0.000000 0.000000 25.151231 3.088926 -3.280687 -0.049415 4.389277 -6.353816 0.823357 0.774717 -2.648071 -3.772515 -0.616506 -2.752063 3.487966 -10.808428 2.328842 -13.886886 2.005557 -13.809764 -16.341181 24.319033 -21.230631 -38.214179 -16.696588 -93.695988 -15.946120 16.442943 -10.326566 -16.667192 11.839144 10.364635 -18.755311 -9.494568 8.473537 -31.855359 19.803564 91.480449 -16.744018 -31.745669 4.677657 +0.311417 95.526207 -6.474185 -94.079900 6.294529 -11.458607 -14.005714 -13.547277 0.124238 34.361692 3.058228 -6.166244 -16.472880 3.621383 8.126132 -0.000000 0.000000 0.000000 -15.122340 -5.709574 -2.310810 33.242716 0.683312 3.618286 -15.854139 -2.839286 -4.677361 -0.000000 0.000000 -0.000000 26.162524 4.361556 -4.383771 -0.453987 6.687128 -6.684073 0.293215 1.703369 -3.472954 -3.940320 0.558990 -3.396153 3.767648 -11.124232 3.741349 -12.966113 4.004972 -14.333337 -15.743999 26.675134 -21.797602 -38.026380 -17.488220 -93.554035 -15.719657 16.337439 -10.535870 -17.073573 13.793447 10.151676 -19.362760 -7.883059 7.355513 -31.088697 20.618319 92.499851 -16.517974 -32.204336 5.155071 +-0.681930 95.444809 -6.635079 -93.934519 6.949242 -11.660340 -13.888757 -15.237392 0.326443 34.205481 3.027467 -5.939115 -16.445990 4.257096 7.518261 0.000000 0.000000 -0.000000 -15.005043 -7.097648 -2.392630 33.063319 0.503783 3.634376 -15.909349 -2.582789 -4.635803 0.000000 0.000000 -0.000000 25.918960 5.587617 -4.791931 0.183934 7.443422 -6.786628 -0.207512 2.025053 -3.866699 -3.272841 1.467235 -3.568519 3.109049 -10.962216 3.887394 -11.994834 4.588600 -15.022361 -14.914313 27.109679 -21.575113 -38.078008 -17.662174 -92.919493 -15.845690 16.785109 -10.601443 -16.858013 14.724295 10.056297 -19.684978 -6.546559 6.598480 -31.829556 20.745046 95.016055 -16.722773 -32.445322 5.061563 +-1.380135 95.348991 -6.734699 -93.832192 7.285788 -11.680289 -13.878075 -16.262528 0.321334 34.086358 3.010523 -5.798911 -16.338038 4.575996 7.210203 0.000000 0.000000 -0.000000 -15.114074 -7.949947 -2.476382 33.215511 0.330490 3.576889 -16.014064 -2.300260 -4.808113 -0.000000 0.000000 -0.000000 25.621390 6.694898 -4.871953 0.740501 7.691874 -6.766576 -0.541436 2.164465 -3.978250 -2.438830 1.746182 -3.592506 2.826947 -11.076330 3.521124 -11.465445 4.307072 -15.398817 -14.561286 26.561570 -21.107544 -38.000121 -17.636514 -92.894521 -15.378052 16.130578 -10.705332 -16.627844 15.091362 10.062686 -19.525585 -6.416403 6.312061 -32.517718 21.281315 97.674192 -15.501977 -32.460810 5.256002 +-1.737897 95.249496 -6.772939 -94.013483 7.135546 -11.403735 -13.657709 -16.496391 0.213298 33.799116 3.272984 -5.896474 -16.164766 4.702493 7.177646 -0.000000 0.000000 -0.000000 -15.174101 -8.021855 -2.613100 33.616612 0.265480 3.589080 -16.291868 -1.917182 -5.154758 -0.000000 0.000000 -0.000000 25.524583 7.336225 -4.556203 1.221890 7.766716 -6.557755 -0.671949 2.247814 -3.850031 -1.667810 1.963057 -3.820881 2.617699 -11.311848 2.668140 -11.756442 4.222690 -15.706449 -14.919636 24.963568 -20.917411 -37.367274 -17.383807 -92.497252 -15.080879 17.939857 -10.068609 -16.547304 14.854472 10.349443 -18.917923 -6.473690 6.313349 -32.203352 21.465108 99.428431 -15.387498 -33.434715 4.593598 +-1.815279 95.234047 -6.785186 -94.180210 6.729838 -10.778556 -13.644422 -16.181098 0.200567 33.512352 3.425571 -6.280345 -15.866174 4.598229 7.164062 -0.000000 0.000000 0.000000 -15.207108 -7.520300 -2.951486 33.847549 0.228955 3.705667 -16.422577 -1.618678 -5.469492 0.000000 0.000000 -0.000000 25.440418 7.275422 -4.133476 1.566187 7.616185 -6.337922 -0.839008 2.197236 -3.508816 -1.113279 2.428030 -3.964089 2.147127 -11.147350 2.288856 -11.859718 3.669272 -15.733771 -15.594377 23.400780 -19.841701 -36.360633 -17.177204 -92.135141 -14.560628 18.418252 -9.807226 -16.069933 14.659297 10.996039 -18.532035 -6.561482 6.396703 -31.555557 21.889035 100.532398 -14.490930 -33.776470 4.349106 +-1.565242 95.413620 -6.661556 -94.422224 5.840040 -9.753540 -13.271280 -14.979423 0.319072 32.477257 3.513517 -6.829748 -15.328284 4.299645 7.231936 -0.000000 0.000000 -0.000000 -14.955202 -6.310531 -3.260514 33.631972 0.294554 3.814083 -16.463533 -1.563111 -5.950329 0.000000 0.000000 -0.000000 24.993161 6.878135 -3.476112 2.089227 7.011231 -5.983319 -0.826332 1.941458 -2.989565 -0.857139 2.588004 -3.910557 1.692598 -10.671597 1.464196 -12.211761 2.691033 -14.958315 -15.654387 21.546586 -18.751044 -34.254141 -16.002912 -91.306539 -15.238051 18.908261 -9.909843 -15.813574 13.996304 11.204101 -17.987584 -6.844755 7.223616 -30.273112 21.866399 100.381857 -11.684877 -33.417716 5.245524 +-1.098550 95.757050 -6.455321 -94.501362 4.682977 -8.178064 -12.891294 -13.082153 -0.004909 30.841209 3.406556 -7.539941 -14.495524 3.958012 7.432810 0.000000 0.000000 -0.000000 -14.538525 -4.845248 -3.544721 32.779981 0.566806 3.659128 -16.417839 -1.365500 -6.868694 0.000000 0.000000 -0.000000 24.338464 6.188925 -2.542372 2.302325 5.953208 -5.639572 -0.352969 1.526172 -2.167812 -0.999852 2.614591 -4.038659 1.123943 -10.580933 0.117775 -12.899531 1.399943 -14.253670 -15.557920 18.646879 -17.627399 -31.806353 -15.097941 -90.759584 -14.926478 20.267977 -9.770530 -15.365904 12.984788 11.628234 -16.815406 -7.258726 6.904275 -30.599895 21.496388 100.475713 -10.044990 -33.764107 5.000216 +-0.320607 96.184509 -6.135461 -94.566230 3.273485 -6.209023 -12.414951 -10.452581 -0.742303 28.972971 3.121242 -8.373769 -13.516394 3.643163 8.074757 -0.000000 0.000000 0.000000 -13.882165 -2.961235 -3.387181 31.855751 0.777124 2.981693 -16.178171 -1.663878 -7.838633 -0.000000 0.000000 0.000000 23.481135 5.328466 -1.286269 2.321389 4.177670 -5.170857 0.192118 0.785134 -1.361423 -0.764526 2.364816 -3.369163 0.306345 -9.635955 -2.166141 -13.387910 -0.951576 -13.542939 -15.399946 15.148910 -16.427050 -30.333093 -14.388242 -90.209030 -14.387260 21.221842 -10.473470 -15.111658 11.460188 11.476487 -15.668221 -8.393035 7.175268 -30.645773 21.063982 99.517915 -9.004297 -32.274433 5.156475 +0.669313 96.471718 -5.853222 -94.149372 1.878597 -3.914288 -12.803126 -7.818046 -2.278049 27.749913 3.334000 -9.629752 -12.548189 2.059604 9.295699 0.000000 0.000000 0.000000 -13.624194 -0.715648 -3.019254 30.884278 0.302502 2.315749 -15.987140 -1.909688 -9.322791 -0.000000 0.000000 -0.000000 22.092125 4.171099 0.138158 1.432722 1.600073 -4.458908 1.802876 0.360813 -0.330199 -0.880444 0.700986 -1.513970 -0.877265 -6.786064 -6.209190 -13.078396 -3.621230 -11.168621 -16.252225 10.878694 -17.416356 -28.015141 -14.156776 -88.569651 -12.695898 16.859222 -14.650335 -14.160694 9.196100 9.192627 -13.917423 -9.292751 9.743091 -31.342428 21.775908 96.645096 -8.067214 -27.056515 8.395381 +1.832597 96.575951 -5.549631 -94.165938 0.782222 -1.389948 -13.345333 -5.316107 -3.071607 28.069738 2.910190 -11.124444 -12.327239 1.722709 9.720453 0.000000 0.000000 -0.000000 -13.155086 1.492651 -3.441354 30.830252 0.041028 1.680076 -16.002903 -2.139974 -10.325881 0.000000 0.000000 -0.000000 21.649701 2.660439 1.727267 0.518994 -0.764731 -3.912044 2.332778 -0.889177 0.692526 -0.982633 0.811236 -1.331670 -1.136072 -5.549004 -8.752560 -13.899003 -6.838414 -10.125315 -17.271518 6.900580 -16.575503 -27.076450 -13.611200 -87.258252 -10.716916 16.375877 -15.397101 -13.961906 7.675884 8.738596 -13.252207 -10.014295 9.409934 -30.701240 20.967974 93.667451 -9.218122 -26.081235 7.859175 +2.945840 96.449349 -5.263711 -94.045083 0.023703 0.923001 -14.378359 -3.456363 -3.674163 29.292510 2.795529 -12.509554 -12.582604 1.196410 9.858407 0.000000 0.000000 0.000000 -13.187629 3.154900 -3.625675 31.521890 -0.189016 0.778363 -16.463235 -2.050522 -11.315905 0.000000 0.000000 0.000000 20.826873 1.347828 2.994960 -0.311105 -3.095407 -3.250208 2.894909 -2.108769 1.603008 -1.391341 0.581284 -0.922878 -0.531816 -4.589187 -11.269019 -14.902578 -10.444194 -8.773769 -18.595706 3.765147 -16.027605 -27.237945 -14.042232 -86.126314 -8.377298 17.393597 -15.133630 -13.766772 6.351766 7.819963 -12.970445 -11.245420 9.634484 -29.915168 21.019639 90.152366 -10.954100 -27.675748 6.250326 +3.755465 96.253357 -4.959316 -94.486609 -0.439090 2.512931 -14.464956 -2.485533 -3.767664 30.187393 3.038791 -13.616311 -12.817480 1.052024 9.714311 0.000000 0.000000 -0.000000 -12.734049 4.221141 -3.637193 32.519533 -0.360757 -0.006387 -17.140102 -2.019780 -12.041761 -0.000000 0.000000 -0.000000 20.802695 0.544674 3.591481 -0.928109 -4.879873 -2.792020 2.908039 -3.015630 2.281300 -1.760854 -0.288049 -0.300265 0.249429 -4.119317 -12.767942 -15.503660 -12.779854 -7.301402 -19.989355 0.458479 -15.023677 -28.337201 -15.165895 -86.834832 -4.268661 16.280685 -15.940843 -13.654921 4.835671 7.099404 -12.622398 -12.668963 9.998815 -29.039739 21.988882 87.904300 -10.037702 -27.979498 5.974690 +4.302279 96.121338 -4.729953 -95.029961 -0.859581 3.503683 -14.325486 -1.587269 -3.657198 31.125231 3.007726 -14.387784 -13.259607 0.937809 9.732619 0.000000 0.000000 0.000000 -12.018976 5.340985 -3.966805 33.109247 -0.745925 -0.355623 -17.748324 -2.161327 -12.208454 0.000000 0.000000 0.000000 20.922565 -0.190515 4.039798 -1.483213 -5.942135 -2.635207 2.899081 -3.434227 2.664142 -2.301390 -0.868199 0.380557 0.943682 -3.450874 -13.435152 -15.828095 -13.659695 -5.522854 -20.737185 -2.022314 -13.891105 -28.052395 -14.909452 -87.714234 -3.555894 15.398203 -16.462941 -13.582508 3.260508 6.375173 -11.873576 -13.386791 10.674880 -28.286560 21.961474 87.437535 -9.862656 -27.923359 5.560905 +4.698886 96.022423 -4.455052 -95.168968 -1.194493 4.473080 -14.387340 -0.518515 -3.985960 31.832790 2.543520 -14.960397 -13.634422 0.370363 9.855703 -0.000000 0.000000 0.000000 -11.351628 6.652181 -5.085219 33.055593 -1.322322 -0.298608 -17.983339 -2.484451 -11.787668 0.000000 0.000000 0.000000 19.967399 -1.258990 4.842454 -1.898404 -6.391605 -2.697107 3.112226 -3.438019 3.023858 -1.847835 -0.602224 0.448338 1.753204 -2.799660 -13.234125 -15.759656 -13.269194 -4.796316 -19.885195 -1.446916 -13.670833 -25.397775 -14.328204 -85.515534 -2.966926 15.640145 -16.861475 -13.176791 2.534084 5.830902 -11.429706 -12.433312 10.532477 -27.393342 21.783424 87.801488 -7.489452 -27.758623 6.228722 +4.888989 96.020561 -4.238410 -95.498946 -1.297199 5.525973 -14.074777 0.046373 -4.467411 32.104351 2.157385 -15.424656 -13.802685 0.029712 9.929865 -0.000000 0.000000 0.000000 -10.270318 7.250294 -5.780476 32.566518 -1.887857 -0.501461 -18.128111 -2.386280 -11.878072 0.000000 0.000000 -0.000000 19.289335 -2.113315 5.405629 -1.954962 -6.508608 -2.762437 2.904944 -3.419022 2.855862 -1.595037 -0.750644 0.508504 2.411033 -2.512520 -12.324049 -14.777313 -12.798669 -4.614783 -18.759061 -0.714870 -12.667680 -24.146869 -15.242939 -85.010241 -2.643530 17.471832 -16.460598 -12.702722 2.553317 6.077126 -11.230751 -11.568313 10.162405 -26.870332 21.495695 87.497688 -8.038023 -28.860210 6.148844 +4.862585 95.977028 -3.944237 -95.925026 -1.366866 7.640647 -13.776480 0.395260 -4.977721 32.426156 1.481957 -16.512551 -13.962593 0.086562 9.650963 -0.000000 0.000000 0.000000 -8.763800 7.474619 -6.790698 31.993152 -2.433192 -1.336596 -18.439783 -2.232446 -12.134445 -0.000000 0.000000 -0.000000 18.555008 -2.309877 5.463550 -2.156121 -6.478867 -3.253833 3.090892 -3.461974 2.647376 -1.908256 -1.253939 0.157749 2.736482 -2.947946 -11.818946 -14.833788 -12.636023 -4.413291 -18.329402 0.696520 -13.458147 -24.348637 -14.341511 -86.184796 -4.879711 17.251530 -16.325715 -12.926385 2.903741 5.688720 -10.679787 -11.852028 9.911219 -25.995523 21.250702 86.898867 -8.203760 -29.447940 5.913297 +4.708411 95.907303 -3.601406 -96.086825 -1.189645 10.118587 -13.938048 0.377639 -5.585207 32.900187 0.826267 -17.856988 -14.153709 0.152285 9.332937 0.000000 0.000000 -0.000000 -7.483921 7.339542 -7.936065 31.362075 -3.191855 -2.331665 -18.844856 -1.880047 -12.551784 -0.000000 0.000000 0.000000 17.408589 -2.140550 5.509438 -2.595495 -6.608703 -3.751169 3.169649 -3.626494 2.521748 -2.009849 -1.254545 0.266924 3.235251 -3.051676 -11.629631 -15.083955 -13.189281 -4.460777 -18.599808 1.529340 -14.682733 -24.670236 -13.785351 -86.337600 -6.854426 16.001604 -16.336545 -12.789322 3.225595 5.095910 -9.861829 -12.019985 9.508474 -23.529972 21.973163 85.690349 -8.449298 -28.896642 5.937831 +4.607370 95.879242 -3.070923 -96.172262 -0.793421 12.592479 -14.103844 0.429900 -6.567660 33.502416 -0.168358 -19.319018 -14.536223 0.088994 9.433867 0.000000 0.000000 0.000000 -5.856758 7.135792 -9.332159 30.071089 -4.280350 -3.068063 -18.941916 -1.809443 -12.896863 0.000000 0.000000 0.000000 15.871043 -1.849086 6.073190 -3.303670 -6.858640 -3.955127 3.413282 -3.935229 2.579144 -1.806604 -0.905208 0.933739 3.721068 -2.710512 -11.194704 -15.312432 -14.287571 -4.333637 -19.465592 0.882683 -15.547554 -25.655453 -12.397319 -85.797951 -8.231612 15.341048 -15.865801 -12.582705 3.487701 4.335051 -8.302943 -12.123996 8.967235 -21.068526 22.081066 85.170034 -9.783617 -29.414425 5.325946 +4.640732 95.910584 -2.318116 -96.455594 -0.524901 14.790853 -13.680005 0.846454 -7.706838 33.962060 -1.435395 -20.680807 -15.114424 -0.249854 10.038236 -0.000000 0.000000 -0.000000 -3.923150 6.870436 -10.791408 28.777110 -5.053949 -3.637518 -19.141541 -1.858371 -13.198797 0.000000 0.000000 0.000000 14.331622 -1.589273 6.975790 -4.261961 -6.908387 -3.875185 3.659758 -4.168809 2.917302 -1.589115 -0.573674 2.197962 4.777105 -2.508950 -10.806079 -15.973685 -15.913422 -3.835893 -20.835234 -0.519354 -15.636850 -26.978020 -11.938123 -85.397490 -8.159112 15.152836 -15.787063 -12.309995 4.097649 3.630407 -6.673268 -12.677543 8.244850 -18.214223 22.414747 85.429980 -11.915158 -30.588191 4.949888 +4.935584 95.932984 -1.376115 -96.849526 -1.028829 17.164034 -12.533589 2.315864 -9.550253 34.241284 -2.413126 -22.705158 -15.389662 -1.492258 12.039050 0.000000 0.000000 0.000000 -1.755084 7.225325 -12.416058 28.001027 -5.320177 -4.371701 -19.579252 -1.699512 -13.111095 -0.000000 0.000000 -0.000000 12.395127 -0.638885 8.238102 -4.501547 -7.183341 -3.558885 3.645612 -4.522301 3.613275 -2.006306 0.173328 3.027924 6.656046 -2.528879 -10.207108 -17.820204 -18.124347 -5.072205 -20.708536 -2.117326 -13.309071 -31.264123 -11.620129 -85.335209 -9.265513 16.618532 -12.909717 -13.135789 4.738494 4.799327 -4.640349 -12.690238 5.504870 -15.034908 22.025268 87.226066 -18.106109 -37.170697 -0.003188 +5.187427 95.922371 -0.405028 -97.390120 -1.248692 19.807875 -11.463475 2.732755 -10.615329 34.421481 -3.082011 -24.483940 -15.928066 -1.917032 12.737511 -0.000000 0.000000 0.000000 0.351757 6.453025 -12.934768 27.226189 -5.313430 -5.363597 -20.192038 -1.132186 -14.723199 -0.000000 0.000000 0.000000 11.033330 -0.353478 9.067133 -5.555539 -7.111181 -2.698445 3.790774 -4.801064 4.351372 -1.757235 0.494146 3.368248 7.496767 -2.180123 -9.932602 -18.728086 -19.390420 -4.319063 -22.822417 -4.305572 -12.936715 -34.162433 -11.360457 -84.167614 -7.257144 14.537151 -12.597354 -12.924070 5.023960 4.896117 -2.162629 -12.847767 5.489864 -10.457383 22.794439 87.350792 -19.315181 -36.630427 0.183643 +5.473501 95.863251 0.388684 -97.561719 -1.688406 22.689380 -11.150670 2.995990 -11.303850 35.009549 -3.157179 -25.802559 -16.245326 -1.964712 12.178852 -0.000000 0.000000 0.000000 1.934111 6.084567 -13.508827 26.837108 -5.447761 -6.778247 -20.787435 -0.534905 -15.626838 0.000000 0.000000 -0.000000 9.107979 -0.041722 9.808440 -6.093853 -6.997320 -1.644841 3.884512 -4.903777 5.494333 -1.468971 0.679576 3.499076 8.488376 -2.127423 -10.273525 -19.696568 -19.999564 -3.462833 -24.271469 -4.946529 -12.924985 -37.532759 -11.740003 -83.883325 -5.450807 13.937163 -12.338738 -12.281490 4.848784 5.432320 -0.229879 -13.183171 6.321836 -5.605046 23.206478 86.634006 -23.671396 -39.241317 -1.635939 +5.727270 95.805832 1.149808 -97.551773 -2.225011 25.965865 -11.032664 3.170984 -12.018242 35.344257 -2.981257 -26.896254 -16.590657 -1.862495 11.007534 0.000000 0.000000 0.000000 3.722595 5.924682 -14.626481 26.099614 -5.828173 -8.317659 -21.298188 -0.336139 -15.919468 0.000000 0.000000 0.000000 6.707918 -0.134233 10.734877 -6.051324 -6.596749 -0.465466 3.614876 -4.677417 6.290078 -0.750835 0.559831 3.154406 9.514309 -1.981783 -10.225828 -20.365201 -19.671904 -2.171390 -24.158506 -3.530736 -13.272404 -38.933570 -12.605233 -85.143280 -4.778265 12.708244 -12.007126 -11.454964 4.365819 6.020676 0.903704 -13.376542 8.203666 -1.129915 23.770520 85.641261 -25.129846 -40.254744 -1.383691 +5.972970 95.671715 1.817691 -97.410225 -3.165250 29.948767 -10.829172 4.058170 -13.186167 35.618894 -3.149534 -27.916389 -16.662631 -1.972183 9.509860 -0.000000 0.000000 -0.000000 5.849178 6.139685 -16.431970 25.017453 -6.480295 -10.146499 -21.553953 -0.273416 -16.102643 -0.000000 0.000000 0.000000 4.553978 -0.598359 11.872744 -5.996612 -5.858529 0.486314 3.139390 -4.036114 6.940349 -0.311820 0.264540 2.425361 11.081714 -1.544876 -10.148218 -19.778943 -18.826950 -0.595750 -20.727324 1.293790 -13.024026 -35.518914 -13.901073 -85.743948 -7.454420 12.027769 -11.937553 -11.593508 4.579970 6.677117 0.522101 -13.214198 11.016360 0.068120 23.587029 85.753571 -25.324840 -38.937288 -0.828571 +6.191364 95.487213 2.341554 -96.539474 -4.226439 34.318010 -11.209843 5.416041 -14.376493 35.691248 -3.296608 -28.673182 -16.450742 -1.915609 7.619899 -0.000000 0.000000 -0.000000 7.049598 6.609131 -18.232705 24.523180 -6.962937 -11.965157 -22.006021 -0.134947 -16.455425 0.000000 0.000000 -0.000000 2.170262 -1.026921 13.029775 -6.069743 -4.983023 1.140007 2.956248 -3.046950 7.588251 -0.475360 -0.736176 2.102039 12.158698 -1.058641 -10.099620 -18.676929 -17.318810 0.233511 -14.872874 7.364263 -13.312813 -27.991845 -14.805658 -81.970178 -10.287395 12.475184 -11.813052 -12.177964 5.001019 7.464777 -1.619083 -11.808250 14.166513 -2.186821 22.348461 86.365512 -23.407387 -37.367625 1.134599 +6.247437 95.441261 2.697032 -95.006996 -5.150663 38.808300 -12.107695 6.360369 -15.046018 34.813004 -2.808866 -29.557568 -15.558444 -1.311004 4.634291 0.000000 0.000000 -0.000000 7.329473 6.862270 -19.403964 23.960613 -7.015001 -14.155077 -22.035033 0.739470 -17.846416 0.000000 0.000000 -0.000000 -0.104836 -1.208840 13.772516 -5.496510 -3.733476 1.695633 2.409369 -1.952244 8.214692 -1.313029 -2.065016 1.286837 12.059677 -0.643604 -9.695579 -17.724999 -15.456464 -0.163920 -8.120820 13.621291 -13.917641 -18.006266 -17.226659 -75.913730 -10.713680 13.583115 -11.184540 -13.205435 6.154360 9.012935 -5.330266 -10.294529 16.714647 -7.344886 21.740654 86.768026 -21.580489 -35.868647 1.269242 +6.275105 95.519608 2.939555 -93.677360 -6.011551 42.742440 -12.552433 7.178048 -15.531837 33.654321 -2.284247 -30.285142 -14.613090 -0.425079 1.929224 0.000000 0.000000 0.000000 7.705975 6.953111 -20.582529 23.201811 -6.637332 -15.991242 -21.841461 1.139958 -18.772859 0.000000 0.000000 0.000000 -1.334741 -1.549766 14.307390 -4.846174 -2.164256 2.348729 1.593961 -1.043457 8.500421 -2.529720 -3.143046 0.102827 11.912323 -0.479196 -8.421384 -16.959521 -11.997285 -0.249249 -1.812957 19.128639 -14.592853 -10.590581 -18.720666 -73.140249 -11.750162 14.517172 -11.180058 -13.786759 6.957624 11.296955 -10.665428 -7.704205 19.386624 -12.995492 20.482153 85.765323 -17.329108 -32.949695 2.880330 +6.237604 95.686661 2.999049 -92.656407 -6.572537 46.110378 -12.831565 7.893062 -16.284168 32.612561 -1.890864 -30.715586 -13.427531 0.027921 -0.204704 0.000000 0.000000 -0.000000 7.949001 6.798816 -21.332155 22.685216 -6.338706 -17.697587 -21.621619 1.399493 -19.460361 0.000000 0.000000 -0.000000 -1.335429 -1.902525 14.793413 -5.186312 -0.413907 3.396842 0.727345 -0.365892 8.888876 -3.193681 -4.157144 -2.313199 11.603093 -0.701097 -6.635042 -16.423042 -8.909954 0.296609 3.572478 25.143188 -15.927401 -6.383870 -20.835474 -74.588250 -12.659661 15.037425 -10.208550 -15.016874 8.458999 13.239649 -15.442571 -6.356621 21.294250 -17.694254 19.533840 84.266885 -14.499181 -32.641660 2.783787 +6.204067 95.802475 2.993286 -91.761823 -6.807295 48.764981 -13.233974 8.701644 -16.977772 31.937087 -1.784229 -30.903725 -12.629374 0.156635 -1.606549 0.000000 0.000000 0.000000 7.928096 6.757020 -22.121795 22.212862 -6.296922 -19.074308 -21.444056 1.635508 -19.904068 -0.000000 0.000000 -0.000000 -1.788857 -2.273321 15.240590 -5.068468 0.903802 4.662731 0.289801 0.178669 9.562606 -3.705899 -4.857899 -4.337855 11.313969 -0.825812 -5.883689 -16.687502 -6.731366 1.909052 8.720521 29.473597 -18.555160 -1.478610 -22.344847 -76.213488 -14.777403 16.783698 -9.069335 -16.278712 9.080548 14.381145 -19.591933 -4.345794 23.875699 -21.134815 18.411108 82.556882 -12.504760 -32.854714 2.382424 +6.122733 95.859551 2.880439 -91.037120 -7.028380 50.560567 -13.664987 9.545383 -17.529252 31.735332 -1.663472 -30.917297 -12.111762 0.122127 -2.306323 0.000000 0.000000 0.000000 7.729659 7.103287 -22.949555 22.323223 -6.387067 -19.833521 -21.535968 1.663081 -19.949486 0.000000 0.000000 0.000000 -2.117366 -2.469557 15.917160 -4.971274 1.470648 5.441230 0.089004 0.581695 10.433441 -4.084568 -5.200439 -4.275002 11.394242 -0.850895 -5.897860 -16.925290 -6.199986 2.342457 13.578320 30.622139 -19.943807 3.854876 -22.211918 -77.354010 -15.772889 17.906468 -9.017959 -16.516470 9.432590 15.733877 -22.928270 -2.610492 25.965511 -24.140893 17.371782 81.668409 -10.039501 -32.404882 2.281647 +6.000566 95.854767 2.687397 -90.677022 -7.166204 51.966955 -14.128495 10.095883 -17.875635 31.921561 -1.601359 -31.045179 -11.665285 0.316226 -2.769754 -0.000000 0.000000 0.000000 7.535464 7.305010 -23.485551 22.690025 -6.573962 -20.465796 -21.704582 1.717259 -19.993760 -0.000000 0.000000 0.000000 -2.038482 -2.664412 16.517259 -4.692442 1.522903 5.878630 -0.370156 0.756405 11.173657 -4.162158 -5.587357 -3.736461 11.171258 -0.600489 -6.463640 -16.607656 -6.204714 1.920940 17.306292 30.052940 -20.101549 7.804848 -22.779922 -79.388879 -16.491972 19.458766 -9.463710 -16.637530 9.083513 17.160758 -25.464978 -1.148702 27.711663 -26.061147 16.675968 81.195679 -8.670269 -32.469889 2.019515 +5.890525 95.789604 2.402579 -90.500025 -7.338785 53.093541 -14.386677 10.515461 -18.456258 32.011137 -1.342624 -31.235406 -11.364004 0.329134 -2.931674 -0.000000 0.000000 0.000000 7.504827 7.601976 -23.774190 22.962984 -6.962881 -20.927948 -21.713050 1.739569 -20.039417 0.000000 0.000000 -0.000000 -2.440176 -2.810889 17.263594 -3.291107 1.050383 6.172937 -0.780492 0.579265 11.559201 -4.462377 -5.722063 -3.031055 10.757822 -0.161052 -7.504882 -16.744421 -6.713802 1.653688 19.535693 29.508355 -20.869479 9.765662 -22.586207 -81.962814 -17.794660 21.330217 -9.087587 -16.761459 8.066897 17.746133 -27.021074 -0.259576 29.324752 -27.078982 15.911646 81.341092 -7.376892 -33.412112 1.376150 +5.765400 95.787140 2.089812 -90.276731 -7.591238 53.898367 -14.490669 11.028822 -18.931582 32.079445 -1.135389 -31.253998 -11.308802 0.164744 -3.008429 -0.000000 0.000000 -0.000000 7.459344 8.024384 -23.983988 23.233683 -7.152500 -21.289248 -21.713902 1.693272 -20.019717 -0.000000 0.000000 -0.000000 -2.783743 -2.850010 17.730584 -2.751763 0.288550 6.353730 -0.475116 0.372502 12.045184 -4.565213 -5.817603 -2.115136 10.996609 0.091004 -8.905058 -17.345214 -7.640563 1.809253 20.652157 28.595975 -22.446457 10.688760 -22.008704 -84.493963 -19.685423 22.782292 -8.662665 -16.638632 7.289760 17.314575 -27.190557 -0.741578 30.662167 -27.841811 16.095749 82.185517 -6.254849 -34.265235 0.496502 +5.717976 95.827408 1.771507 -90.351536 -7.942710 53.868078 -14.138518 11.302624 -18.857106 31.829778 -1.108391 -31.088543 -11.062067 0.072248 -3.161891 0.000000 0.000000 -0.000000 7.635799 8.404953 -23.958689 23.338962 -7.153306 -21.568339 -21.568562 1.542598 -19.714886 -0.000000 0.000000 -0.000000 -2.465785 -3.060893 17.649745 -3.111899 -0.583264 6.189005 -0.272042 0.047823 12.332096 -3.645417 -5.891552 -1.184630 11.511108 0.415494 -8.752947 -17.649760 -8.871120 1.568655 20.089506 27.669980 -23.154845 9.775689 -21.040671 -86.580862 -21.837271 22.859949 -8.548480 -16.265274 6.469967 17.557533 -25.709377 -2.876637 31.523574 -28.469484 16.642610 82.779619 -5.352906 -34.393571 0.056282 +5.650481 95.826180 1.477517 -90.263813 -8.097287 53.336264 -14.098009 11.384167 -18.757266 31.520966 -0.776831 -30.653419 -10.846453 0.207351 -3.212743 0.000000 0.000000 0.000000 7.411670 8.960249 -23.664113 23.581929 -7.212139 -21.805100 -21.438946 1.415699 -19.061305 -0.000000 0.000000 0.000000 -3.088430 -2.990958 17.421245 -2.384022 -1.736866 5.520731 -0.523963 -0.342011 12.251877 -2.798103 -5.964311 0.223235 11.748918 0.203692 -9.765671 -17.725337 -10.590596 0.814569 18.541321 25.867818 -24.036812 7.810755 -19.618643 -88.684074 -24.042528 23.022958 -8.510207 -16.059740 5.127413 17.739371 -23.389600 -6.439456 33.680842 -27.935284 17.351261 81.825098 -5.163323 -34.607969 -0.650445 +5.578379 95.859467 1.309302 -90.613163 -8.403368 52.094313 -13.613078 11.047247 -18.372384 31.193094 -0.433066 -30.398082 -10.671845 0.330298 -2.873980 -0.000000 0.000000 -0.000000 7.567543 9.198650 -23.133092 23.596436 -7.074408 -21.671556 -21.239345 1.269576 -18.402778 0.000000 0.000000 -0.000000 -2.709864 -2.564118 16.864804 -2.595854 -2.845017 4.331361 -0.729405 -0.875033 11.826914 -2.463098 -6.099707 1.902066 12.102312 -0.452895 -10.195310 -18.149905 -12.864255 -0.961751 15.838212 22.983333 -24.133037 4.939422 -19.041686 -91.076637 -24.837260 21.983825 -8.570799 -15.820987 4.317033 18.451297 -19.189480 -11.039659 35.097592 -25.843898 18.495784 80.567642 -6.632206 -34.957305 -1.679054 +5.506723 95.892777 1.231029 -90.957966 -8.532674 50.400863 -13.269391 10.639575 -17.752842 30.963711 -0.261807 -30.333484 -10.547902 0.569565 -2.078463 0.000000 0.000000 0.000000 7.464051 9.370001 -22.272551 23.615416 -6.921072 -21.268550 -21.034972 1.259779 -17.944267 -0.000000 0.000000 -0.000000 -2.859205 -1.867107 16.154057 -2.548223 -4.108352 2.967939 -0.458024 -1.542850 10.979052 -2.667119 -6.060920 3.573503 11.769868 -0.870387 -11.175619 -18.229992 -15.553638 -3.219014 11.849221 19.779441 -23.591346 0.317655 -18.705945 -92.470745 -25.758007 19.902335 -8.842226 -16.008097 3.370258 19.070830 -13.892102 -16.025446 37.072520 -21.192358 20.173167 78.559812 -9.723858 -35.374557 -2.930690 +5.486662 95.887932 1.260896 -91.756073 -8.328659 47.357396 -12.777208 9.755358 -17.153822 30.965454 -0.250764 -29.655178 -10.836603 0.609714 -0.667758 -0.000000 0.000000 0.000000 7.072444 9.129447 -20.706969 23.849866 -6.548046 -20.388414 -20.885009 1.278155 -17.620374 -0.000000 0.000000 0.000000 -2.615785 -1.498303 15.308025 -2.922332 -5.339290 1.860893 -0.198711 -2.190537 10.477963 -2.757903 -6.026750 5.604882 11.448764 -1.291052 -11.706154 -18.224104 -18.589040 -5.493328 6.559318 16.147341 -22.284961 -4.907920 -15.923390 -90.869134 -27.279642 20.254978 -8.942148 -15.636693 2.688250 19.665068 -7.450409 -20.718604 39.424337 -15.195522 21.573953 75.981474 -13.642102 -36.806836 -5.010525 +5.512388 95.933983 1.352418 -92.454968 -7.894096 43.483367 -12.396042 8.954008 -16.190203 31.158757 -0.427770 -29.090681 -11.402926 0.251261 1.299816 0.000000 0.000000 -0.000000 6.449698 9.179740 -19.334568 24.122520 -6.282194 -18.747541 -20.851077 1.321839 -17.007698 -0.000000 0.000000 -0.000000 -2.481770 -1.194290 14.544055 -3.248172 -6.493481 0.935486 0.144919 -2.880102 10.063415 -2.938529 -5.698935 7.501105 10.850543 -1.704044 -12.195824 -19.303574 -21.335962 -7.245598 0.531422 11.768157 -20.380609 -7.986097 -15.258442 -87.570302 -25.702803 20.314811 -8.562773 -15.035293 2.551138 20.447415 -0.320094 -25.909203 42.388068 -8.605500 23.214356 73.314701 -18.521636 -37.825300 -7.228949 +5.651624 95.980919 1.500471 -93.210651 -7.260276 38.890515 -11.834523 8.067260 -15.129959 31.294756 -0.561568 -28.197694 -12.230123 -0.310129 3.516419 0.000000 0.000000 0.000000 5.777789 9.403153 -18.150187 24.379129 -6.149099 -16.567534 -20.678131 1.160172 -15.979908 0.000000 0.000000 -0.000000 -2.403027 -1.126803 14.062491 -3.017816 -7.715308 0.415733 0.179796 -3.649498 9.925441 -2.876687 -4.983696 8.955168 10.067064 -2.078840 -13.103674 -20.420467 -23.769825 -8.534998 -4.819068 7.411947 -18.186112 -10.077176 -13.608190 -83.226266 -25.684935 21.896262 -8.259339 -13.338526 1.855926 21.666395 5.916375 -29.846923 45.018748 -2.246631 24.361218 71.132696 -22.905406 -39.418768 -8.956343 +5.872280 96.017166 1.601254 -93.971742 -6.606627 34.187025 -11.135259 7.210861 -14.319363 31.400784 -0.340257 -26.934218 -12.986742 -0.700943 5.844846 -0.000000 0.000000 -0.000000 5.216228 9.723195 -16.932766 24.570272 -6.117784 -14.369381 -20.632472 0.950436 -14.644493 -0.000000 0.000000 -0.000000 -2.632062 -1.149952 13.881327 -1.905382 -8.961909 0.139434 0.317473 -4.283541 10.169630 -3.103656 -4.687023 10.210825 9.105230 -2.221809 -14.325531 -20.958101 -25.897872 -9.277697 -8.993080 3.496613 -16.149754 -13.327571 -13.146739 -80.482423 -24.683298 23.277861 -8.017997 -11.843678 0.495113 22.261450 10.895789 -32.067829 46.506172 4.040548 25.259789 70.335406 -29.679884 -41.973881 -12.212699 +6.096877 96.056282 1.642675 -94.160553 -5.699758 30.005868 -11.231511 6.573526 -13.174673 31.908742 -0.291622 -25.986942 -13.903551 -1.559732 7.627468 0.000000 0.000000 -0.000000 3.814741 9.979852 -15.807775 25.284995 -5.897525 -12.175833 -20.837442 0.840754 -13.532678 -0.000000 0.000000 -0.000000 -2.815207 -1.190747 13.428208 -2.207287 -9.838671 0.038631 0.733878 -4.682118 10.354824 -2.709828 -4.518995 11.027312 8.890844 -2.751894 -15.317636 -20.998684 -27.275411 -9.369757 -12.184094 0.039060 -14.673706 -15.315910 -12.938770 -78.892439 -23.286006 24.611924 -8.315904 -10.644487 -0.661375 22.278586 15.172943 -33.804523 47.520421 9.218282 25.894659 69.602461 -33.866228 -43.927031 -13.783779 +6.353143 96.009033 1.742410 -94.580734 -5.046653 26.179299 -10.952225 5.977432 -11.787032 32.485251 -0.303994 -25.129757 -14.866315 -2.231729 9.128262 -0.000000 0.000000 -0.000000 2.753248 10.131066 -14.960734 26.240833 -5.393334 -10.143973 -20.961266 0.659049 -12.689654 -0.000000 0.000000 0.000000 -2.444852 -1.336493 12.704722 -1.874501 -10.304737 -0.098483 0.427426 -5.085034 10.359375 -2.075655 -4.078790 10.986493 8.559499 -2.885126 -15.067672 -21.680751 -28.067014 -9.297780 -14.679761 -2.263613 -13.443788 -15.628151 -13.320640 -77.616362 -22.379255 26.157821 -7.704566 -10.020745 -0.782013 22.527303 17.846338 -34.603601 48.403032 13.304212 25.156061 69.475372 -37.073402 -44.597450 -14.979190 +6.626569 95.931511 2.045794 -95.152559 -4.482132 22.755076 -10.251530 5.356859 -10.508430 32.866919 -0.340640 -24.237600 -15.844370 -2.662397 10.145306 -0.000000 0.000000 0.000000 2.154427 9.839769 -13.814699 26.994553 -4.620861 -8.600722 -21.248100 0.699287 -12.142154 -0.000000 0.000000 -0.000000 -1.958694 -1.518821 11.829112 -2.174337 -10.459417 -0.196182 0.593109 -5.282903 10.376542 -1.767380 -3.731673 10.545697 8.741933 -3.031384 -14.994583 -22.061182 -27.876934 -9.443297 -15.374004 -3.347565 -12.600775 -15.992123 -12.681596 -76.691174 -21.385438 26.980417 -7.302125 -10.199799 -0.970226 22.811110 18.793110 -34.517191 48.708601 14.843128 25.154209 70.428539 -36.726023 -44.806240 -14.746459 +6.834761 95.870209 2.383498 -95.500770 -3.937689 19.391949 -9.664083 4.831033 -9.943640 33.212963 0.047231 -22.615325 -16.738606 -3.182087 11.062509 0.000000 0.000000 0.000000 1.286860 9.477134 -12.237937 27.830914 -3.822967 -7.257647 -21.564871 0.450303 -11.569753 0.000000 0.000000 -0.000000 -1.909641 -1.522631 11.144896 -2.448263 -10.502630 -0.129012 0.526588 -5.293707 10.326847 -1.169906 -3.997904 10.134706 9.108997 -2.931679 -14.772184 -22.042011 -27.061233 -9.416316 -15.374228 -2.632262 -12.721098 -15.998074 -12.984809 -76.366324 -20.720993 27.172864 -7.168534 -10.009215 -1.013336 23.018520 17.786438 -33.593097 48.680960 14.702526 25.171335 71.337998 -36.804447 -44.782327 -14.027488 +6.904806 95.783959 2.846894 -95.883905 -3.348735 16.186220 -8.868272 3.945657 -9.160874 33.227356 0.601325 -21.065609 -17.401070 -3.588957 11.433650 0.000000 0.000000 0.000000 0.793851 8.925654 -11.055968 28.366641 -2.994449 -5.666906 -21.683968 0.286077 -11.100439 0.000000 0.000000 -0.000000 -1.983077 -1.458331 10.573137 -2.235844 -10.174790 0.071438 0.031934 -5.109288 10.067901 -1.520431 -4.512368 9.492320 9.578578 -2.976737 -14.157557 -21.807770 -25.868140 -9.467254 -14.482028 -0.933917 -13.066191 -15.048239 -13.289303 -76.142691 -21.086614 26.476093 -7.400134 -10.369639 -0.686644 23.409456 15.602595 -32.372419 48.967433 12.717282 24.964647 71.880549 -35.781084 -43.684535 -13.173485 +6.884336 95.752701 3.391101 -96.341013 -2.695151 12.784482 -7.792737 2.893189 -7.806172 33.022169 0.940386 -19.482004 -18.178653 -3.737943 11.406903 -0.000000 0.000000 -0.000000 0.544277 8.336500 -10.273200 28.445809 -2.121737 -4.126625 -21.629351 -0.085267 -10.332776 -0.000000 0.000000 0.000000 -2.244436 -1.326205 10.205928 -2.118817 -9.715639 0.641183 -0.291838 -5.105183 9.836865 -1.977462 -4.854067 8.472725 9.939277 -2.728294 -13.787307 -21.695707 -24.374433 -9.809994 -12.855363 2.702730 -14.162970 -13.288869 -14.436116 -75.665243 -21.179767 26.209843 -6.880743 -11.051792 -0.184082 23.759539 12.222382 -30.883358 48.647376 10.163514 24.833339 72.636614 -34.028772 -42.103148 -12.232946 +6.750102 95.769547 3.827294 -96.680481 -2.078548 9.833509 -6.737453 1.963017 -6.935122 32.595560 1.313648 -17.635452 -18.772719 -3.725960 11.184510 -0.000000 0.000000 -0.000000 0.365100 7.921257 -9.812779 28.604410 -1.554633 -2.871984 -21.523168 -0.662324 -9.168470 0.000000 0.000000 -0.000000 -2.528152 -1.333326 9.638320 -1.963306 -8.833009 0.763867 -0.846022 -4.689977 9.684237 -2.420739 -5.337257 7.479586 10.279319 -2.699038 -12.925832 -21.412729 -22.219161 -10.196058 -10.380213 8.044190 -15.916975 -11.260540 -16.219318 -75.519000 -22.388564 27.043623 -6.031280 -11.660110 0.479584 24.265161 7.660651 -29.324204 48.208301 6.724575 24.865392 73.049330 -31.742653 -41.695451 -10.902463 +6.555706 95.804054 4.158570 -96.758657 -1.441842 7.308487 -6.110400 1.120199 -6.089194 32.372506 1.529553 -15.662054 -19.332204 -3.622107 10.624931 -0.000000 0.000000 0.000000 -0.050241 7.433232 -9.500758 28.736397 -0.983409 -1.973845 -21.492656 -1.143586 -7.876367 0.000000 0.000000 0.000000 -3.073790 -1.375580 9.045135 -2.154924 -7.671280 0.945220 -0.923548 -4.168432 9.175484 -3.159350 -5.950193 6.030727 10.611451 -2.714016 -11.726974 -20.851360 -19.728484 -10.273012 -7.125000 15.257535 -18.438120 -9.018209 -18.964913 -75.471404 -24.536174 28.299133 -4.641327 -12.920263 1.978438 24.227864 2.780095 -28.065148 47.865826 3.005315 25.235650 73.318144 -31.113198 -41.768641 -10.914483 +6.272027 95.744408 4.436590 -96.880599 -0.804116 5.003472 -5.399972 0.093230 -5.337464 31.979300 1.948061 -13.842184 -19.659906 -3.316342 9.928843 0.000000 0.000000 -0.000000 -0.420863 6.684562 -8.764763 28.958332 -0.463956 -1.247156 -21.620293 -1.094386 -7.343317 -0.000000 0.000000 0.000000 -3.668456 -1.423855 8.188450 -1.653167 -6.261430 1.061069 -1.265303 -3.410412 8.386182 -3.936074 -6.797656 4.108052 10.712292 -2.693561 -10.249422 -19.522299 -16.978944 -10.316294 -3.154563 22.483495 -20.861098 -6.003216 -21.370118 -74.310640 -26.901237 30.896816 -2.486346 -14.202431 3.997992 24.238102 -3.005510 -26.329438 47.429922 -1.202370 25.189155 72.815799 -30.213196 -42.216370 -11.073680 +5.951148 95.681397 4.670786 -96.808069 -0.228996 2.871001 -4.968814 -1.057398 -4.282776 31.694236 2.509435 -12.638215 -19.957025 -2.984389 9.346835 0.000000 0.000000 -0.000000 -1.023703 5.908592 -8.061123 29.251139 0.089296 -0.047868 -21.712424 -1.038066 -7.018771 -0.000000 0.000000 0.000000 -3.876919 -1.249403 7.073262 -1.868640 -4.696714 0.742611 -1.356262 -2.476516 7.271271 -4.970704 -7.768106 2.236164 10.991483 -2.848343 -8.495743 -17.975617 -14.096974 -10.146944 1.226539 28.035134 -22.590746 -0.835394 -23.650605 -71.657851 -30.102705 33.462917 -0.520000 -15.931428 5.888516 24.105128 -8.156662 -24.633165 47.277314 -5.133472 25.403991 71.913477 -29.414389 -42.634139 -11.525987 +5.575121 95.648071 4.889653 -96.398893 0.177467 0.315975 -4.693753 -2.169691 -2.885070 31.181330 3.292756 -11.427016 -20.185032 -2.742464 8.910800 -0.000000 0.000000 0.000000 -2.163241 5.180636 -6.979826 29.781186 0.769335 1.368687 -21.856370 -0.767393 -7.163637 -0.000000 0.000000 -0.000000 -4.604362 -0.608572 5.684675 -2.095154 -3.281365 0.324867 -1.352177 -1.577365 6.109427 -5.560831 -8.750210 0.731136 11.765022 -2.697246 -7.038238 -15.586091 -11.506949 -9.799559 5.898325 31.891548 -23.177531 4.515678 -23.632354 -68.913565 -32.882879 36.020150 1.085445 -17.573845 7.823886 23.705768 -12.650612 -22.453294 47.091256 -8.653689 24.458601 70.311528 -29.380585 -43.045597 -12.521903 +5.210773 95.628906 5.083619 -95.907813 0.616362 -2.778815 -4.271901 -3.138716 -1.943667 30.489120 4.230173 -9.330664 -20.564275 -2.482554 8.679980 -0.000000 0.000000 0.000000 -3.424320 4.244496 -5.367979 30.332797 1.600595 2.751227 -21.868010 -0.833953 -7.376273 -0.000000 0.000000 0.000000 -5.279760 -0.376999 4.067442 -2.455337 -1.946061 0.186704 -0.818478 -0.221104 4.985668 -5.983916 -10.773872 0.381856 10.992046 -0.691679 -6.739163 -13.437896 -8.252151 -7.022360 11.331391 32.922924 -25.742724 9.750676 -21.073270 -66.507361 -31.246322 38.050373 1.443765 -19.542249 8.672796 21.105781 -15.422884 -18.759929 49.842818 -11.512300 21.491834 67.597618 -21.580024 -40.418255 -9.719937 +4.783304 95.655823 5.293502 -95.517780 1.095646 -6.641519 -3.461085 -3.882440 -0.560155 29.798468 4.851590 -7.766652 -20.862166 -2.621587 9.294446 0.000000 0.000000 -0.000000 -4.620452 3.352553 -4.159840 30.875537 2.583567 4.714909 -21.947404 -0.773339 -7.256367 -0.000000 0.000000 -0.000000 -5.446225 -0.101855 2.800551 -2.734111 -0.640029 0.183904 -1.302140 0.693927 4.133151 -6.403743 -11.122528 -1.048835 10.811201 -0.443473 -5.455120 -11.948136 -6.137752 -5.883928 14.975159 34.903311 -25.267879 14.753502 -21.458612 -64.924388 -31.850499 40.621478 2.543250 -20.432208 10.402671 20.265786 -19.422846 -15.941197 49.043316 -13.733913 20.171489 66.387564 -21.081441 -41.001462 -10.084212 +4.363397 95.647461 5.408812 -95.125148 1.624501 -11.016714 -2.614263 -4.458925 0.671316 29.190788 5.482232 -5.971417 -21.145159 -2.985979 10.339662 -0.000000 0.000000 -0.000000 -5.898506 2.476237 -3.100660 31.520877 3.635607 6.866947 -21.958915 -1.030475 -6.591839 0.000000 0.000000 0.000000 -5.396604 -0.017363 1.950047 -3.303332 0.518014 0.487285 -1.783878 1.479522 3.637691 -6.646941 -10.958377 -2.599747 10.893230 -0.224553 -4.776666 -11.119752 -4.468164 -4.997457 17.248585 36.295602 -24.965074 17.830867 -21.212734 -63.766261 -32.152825 42.356706 3.187227 -21.258787 11.969156 19.482803 -22.513492 -13.527320 47.895169 -15.901417 19.137286 65.511692 -21.187342 -41.366264 -10.773343 +3.948870 95.587814 5.449468 -94.508100 2.080205 -15.407686 -2.136266 -4.926666 1.814991 28.818093 6.078195 -4.102240 -21.494589 -3.407725 11.315949 0.000000 0.000000 -0.000000 -7.498461 1.703780 -2.126974 32.321856 4.445786 8.858456 -21.754378 -1.443904 -5.601222 0.000000 0.000000 -0.000000 -5.937420 0.236364 1.278142 -3.534738 1.048098 0.920728 -2.103232 1.879328 3.557215 -6.807624 -10.619462 -3.522391 10.689175 0.220963 -4.485310 -11.167807 -3.713149 -4.377006 18.359755 36.434973 -25.514928 19.339297 -20.542566 -64.055188 -32.939781 43.760935 4.456696 -21.804658 12.793051 18.863151 -24.607610 -11.819617 47.493601 -17.644744 18.404368 64.324909 -21.069295 -42.437870 -11.645036 +3.638309 95.510223 5.470482 -94.234386 2.647411 -19.292527 -1.233082 -5.204763 2.744228 28.258151 6.343467 -2.386497 -21.901158 -3.718624 12.352309 -0.000000 0.000000 -0.000000 -8.462865 1.068431 -1.335542 32.777996 4.815686 10.238122 -21.593405 -2.020607 -4.390807 -0.000000 0.000000 0.000000 -6.195587 0.587688 0.941076 -3.718865 1.193825 1.090154 -2.386138 1.974567 3.494115 -6.263656 -10.447398 -3.583772 10.553164 0.336896 -4.339773 -11.099553 -3.669573 -5.115584 18.736502 36.263571 -26.311608 19.322695 -20.547960 -64.280084 -33.382673 44.715098 4.372243 -22.050996 13.148914 18.751045 -25.880837 -11.099941 46.899999 -18.865429 18.323797 63.647454 -21.797177 -42.882086 -12.346205 +3.453173 95.438835 5.417359 -94.050424 3.242076 -22.201538 -0.558192 -5.491030 3.517681 27.935871 6.423694 -0.988767 -21.936868 -3.933920 13.171061 -0.000000 0.000000 -0.000000 -9.005634 0.485249 -0.757761 32.879563 4.988349 11.106165 -21.276510 -2.505886 -3.346235 -0.000000 0.000000 -0.000000 -6.301676 0.570843 0.419977 -3.554682 1.242724 0.735279 -2.605183 2.101089 3.173518 -6.112849 -9.988519 -3.475241 10.587481 0.321993 -4.095394 -11.582220 -4.363228 -5.920639 18.151672 35.999869 -27.145774 17.681836 -20.665277 -64.615522 -33.594685 43.707467 4.187114 -22.287460 13.821948 18.821360 -25.706276 -11.822672 46.622809 -19.849579 18.628000 63.534032 -22.417128 -42.699907 -12.800901 +3.384943 95.409714 5.326052 -93.894107 3.833932 -24.693646 0.143192 -6.080528 4.598126 27.663110 6.857619 0.134231 -22.038975 -3.990797 13.411615 -0.000000 0.000000 -0.000000 -9.262660 -0.139103 -0.007797 32.698754 5.139409 11.631521 -20.744249 -2.919833 -2.384527 0.000000 0.000000 -0.000000 -6.458860 0.669166 -0.219980 -3.432373 0.980842 0.479921 -2.616777 2.066344 2.845515 -5.730227 -9.637657 -3.301855 10.589756 0.437134 -4.193681 -12.428823 -4.990758 -6.621482 16.369911 36.003069 -28.681024 15.234582 -21.293978 -65.109986 -34.772671 43.776609 5.875852 -22.500968 13.858232 18.685476 -24.222494 -13.512882 46.972494 -19.748870 19.184085 63.646371 -24.289827 -43.052345 -14.227638 +3.322082 95.389107 5.154843 -93.726537 4.297109 -27.045245 0.997761 -6.838162 6.020159 26.931085 7.627483 1.324258 -22.007761 -3.711435 13.064342 -0.000000 0.000000 -0.000000 -9.533636 -0.653588 0.891819 32.433652 5.247912 11.729224 -20.050719 -3.470569 -1.019962 -0.000000 0.000000 -0.000000 -6.840350 1.170991 -1.001988 -2.949652 0.327953 -0.017641 -2.717066 1.681707 2.294989 -4.982245 -9.192296 -2.596024 10.790109 0.691728 -4.529634 -13.166691 -5.972875 -7.290698 13.216138 35.874732 -30.193052 10.291994 -22.019430 -66.454783 -34.398632 42.313491 5.660643 -22.518552 13.538969 18.380469 -20.517779 -16.789526 48.367112 -18.082537 20.106571 63.794488 -26.861305 -43.106796 -15.400160 +3.326602 95.389359 5.004634 -93.700214 5.027183 -29.366419 1.909234 -7.368304 7.288299 26.557414 7.916409 2.142097 -21.954118 -3.372643 13.206678 0.000000 0.000000 -0.000000 -9.487120 -1.072805 1.525102 32.058264 5.106083 11.732095 -19.220061 -4.094193 0.690345 0.000000 0.000000 -0.000000 -6.846973 1.568295 -1.789429 -2.900380 -0.611870 -0.896860 -2.640098 1.161745 1.708015 -3.578764 -8.599510 -1.601700 11.087659 0.732608 -5.096131 -14.223422 -7.531374 -8.755440 9.076538 35.323110 -31.561933 4.454089 -22.944425 -67.773732 -33.916472 40.234039 5.476899 -22.072708 12.980771 18.609782 -15.294613 -21.168764 49.986692 -14.447841 21.564162 63.509002 -29.635528 -42.522492 -16.530231 +3.393331 95.367607 4.921457 -93.611475 5.986617 -32.370999 2.970250 -7.530189 8.149253 26.234575 7.896312 3.153745 -21.857756 -3.516908 14.144468 -0.000000 0.000000 0.000000 -9.374657 -1.781246 2.429836 31.673065 5.073589 12.198362 -18.530316 -4.500611 2.183169 -0.000000 0.000000 -0.000000 -6.747194 1.970915 -2.230026 -2.827381 -1.877107 -1.881256 -2.505614 0.421651 1.284155 -2.363940 -7.924444 -0.183604 11.260342 0.403043 -6.010169 -15.456848 -10.365167 -11.582049 3.791490 33.373722 -32.341905 -2.386173 -23.317938 -68.265225 -33.250345 38.414890 5.583615 -21.464456 12.009383 19.467514 -8.058122 -26.185998 52.013309 -9.282683 23.371411 62.017284 -33.115700 -42.957243 -18.439429 +3.457685 95.384178 4.871769 -93.414140 7.059088 -36.065770 4.245265 -7.547822 8.829922 25.756234 7.944483 4.465363 -21.760379 -3.735598 15.676248 0.000000 0.000000 0.000000 -9.194274 -2.693836 3.700647 31.222761 5.148559 12.900918 -17.671756 -4.968927 3.759071 0.000000 0.000000 0.000000 -6.264519 2.483144 -2.449993 -2.830576 -3.568402 -2.862499 -2.475066 -0.521080 1.122388 -1.739936 -6.965739 1.562761 11.121150 0.011456 -8.102176 -17.047529 -13.864779 -14.733710 -2.062307 29.996757 -32.239312 -8.863688 -22.972136 -68.645425 -31.745371 37.141554 5.199858 -20.373618 10.359492 20.587327 0.104478 -31.211031 54.842584 -3.302362 25.239035 59.689645 -36.439144 -43.216003 -20.372158 +3.607809 95.489143 4.933391 -92.723726 7.909506 -39.892610 5.090483 -7.532659 9.697484 25.257974 7.908018 5.648063 -21.608691 -3.822946 17.305453 0.000000 0.000000 -0.000000 -9.286728 -3.537953 4.828776 30.337808 5.056404 13.775538 -16.793394 -5.375095 5.272960 0.000000 0.000000 -0.000000 -6.188858 2.983039 -2.723337 -2.612376 -5.571289 -3.848043 -2.279246 -1.703954 1.048071 -1.797170 -6.120878 3.854862 10.051546 -0.208526 -9.850366 -18.759833 -17.743000 -17.230292 -7.676161 26.040547 -31.260600 -14.725505 -22.035986 -69.326927 -31.043757 36.344770 5.381699 -18.998775 8.579960 21.223815 9.070485 -36.026077 58.890231 3.031542 26.409542 57.322124 -41.659296 -43.848825 -24.204128 +3.717642 95.668350 5.118888 -91.909819 8.884386 -43.430050 5.877309 -7.713818 12.026000 25.199531 7.062223 6.556349 -21.895333 -2.614168 17.879357 -0.000000 0.000000 -0.000000 -8.969582 -4.467538 5.560131 29.038102 4.991029 14.917546 -15.775882 -5.146009 6.530975 -0.000000 0.000000 -0.000000 -5.210923 2.890807 -3.413913 -2.685079 -7.160899 -5.138638 -3.426056 -3.379564 0.814377 -1.400916 -3.030189 4.964602 10.093052 -2.928141 -9.396167 -19.066515 -21.825152 -20.851526 -15.537007 23.013620 -25.712875 -17.067069 -24.834105 -70.188246 -34.614948 41.503546 5.069062 -15.283849 8.193292 23.918141 14.744686 -41.931253 60.589363 11.317954 30.339507 55.045981 -53.114545 -46.908212 -30.225956 +3.865093 95.739258 5.317442 -90.766822 9.187495 -45.942102 5.690674 -7.992767 12.582560 25.103130 7.148442 7.583568 -21.783591 -2.748966 18.838983 0.000000 0.000000 -0.000000 -9.320617 -5.135292 6.313719 27.927316 4.737906 15.578423 -14.745777 -5.418876 7.252181 0.000000 0.000000 -0.000000 -4.976490 3.036533 -3.978093 -2.918061 -8.922623 -6.285488 -3.494160 -4.367990 0.215822 -1.179100 -3.069688 5.574787 9.248754 -3.449351 -10.569233 -19.326113 -23.640693 -21.593436 -19.636081 18.745496 -24.555342 -19.493147 -23.473955 -70.847413 -34.158956 42.768480 5.153607 -13.868471 6.921615 23.798567 22.652490 -44.130151 64.697328 16.043037 30.870499 54.180453 -55.360071 -48.013029 -31.362192 +4.048944 95.763939 5.540849 -89.857105 9.385604 -47.626157 5.336091 -8.146806 12.794355 25.224827 7.077802 8.071179 -21.669113 -3.147993 19.817006 -0.000000 0.000000 -0.000000 -9.603505 -5.621878 6.781872 27.110560 4.516750 16.305263 -13.978291 -5.495201 7.366472 -0.000000 0.000000 -0.000000 -4.928968 3.177866 -4.302963 -3.039713 -10.335043 -7.282925 -3.116141 -5.094979 -0.455951 -0.993296 -3.269032 5.059825 8.525412 -4.254040 -11.764982 -19.414427 -24.820176 -21.954523 -22.272647 15.415742 -24.176519 -20.873675 -22.072618 -71.064909 -33.715499 42.848235 5.373827 -13.302847 6.055634 23.346019 28.911958 -45.125589 67.181508 18.451678 30.873927 54.686246 -57.016870 -48.311115 -32.104873 +4.295336 95.723915 5.770115 -89.335881 9.692319 -48.669875 5.133980 -8.374109 13.053394 25.659909 7.065734 8.329052 -21.895963 -3.165909 20.319314 -0.000000 0.000000 0.000000 -9.614102 -5.849186 7.175628 26.614212 4.248968 16.408129 -13.324452 -5.832438 7.774787 0.000000 0.000000 0.000000 -4.457448 3.081476 -4.474731 -3.008697 -11.273709 -7.842571 -3.093986 -5.577320 -1.205745 -0.518179 -3.556112 4.098399 8.159149 -4.778403 -13.134752 -19.459737 -25.439894 -22.258896 -23.690265 13.852510 -24.073644 -21.080623 -21.406743 -70.643863 -32.457853 44.429424 4.832935 -13.196879 6.030666 22.539439 31.963834 -45.714405 67.829495 19.616865 30.879710 55.777831 -58.618010 -48.862400 -32.952115 +4.549101 95.668732 5.946382 -88.976794 9.854431 -49.441980 4.793999 -8.467119 13.128433 26.257734 7.124342 8.582665 -22.141360 -3.340065 20.658891 -0.000000 0.000000 -0.000000 -9.748112 -5.887017 7.377409 26.363431 4.051124 16.770276 -12.871353 -6.100843 7.862655 -0.000000 0.000000 0.000000 -4.210675 2.858300 -4.715030 -2.662890 -11.852704 -8.383222 -3.223813 -5.816385 -1.769292 0.033727 -3.609037 3.078526 7.712651 -4.827648 -13.684107 -19.059187 -25.505020 -22.407761 -24.144055 13.019175 -24.024758 -20.994234 -20.871943 -70.282780 -31.781794 44.942204 4.787510 -13.344811 5.963562 22.054673 32.085962 -45.425984 66.927481 19.682466 30.388614 56.670584 -58.149293 -48.928110 -32.200143 +4.787615 95.594734 6.068103 -88.700635 9.945750 -50.090200 4.490241 -8.501142 13.172588 26.854437 7.055833 8.694138 -22.411287 -3.181233 20.565949 0.000000 0.000000 -0.000000 -10.009209 -6.001150 7.630003 26.396182 4.047656 16.870464 -12.754901 -6.351265 8.059387 0.000000 0.000000 0.000000 -3.870662 2.590890 -4.980663 -2.828626 -12.071654 -8.753847 -3.269782 -5.770211 -2.216202 0.533988 -3.925866 2.327146 7.809495 -4.863956 -14.064181 -18.433901 -25.102916 -22.596826 -23.328695 14.295226 -24.580276 -20.574478 -21.715996 -69.863079 -31.901414 45.008027 5.015866 -13.933048 6.196134 21.424876 29.675580 -44.614552 64.922637 19.153030 30.894505 57.287484 -58.995578 -48.226866 -32.840409 +4.974769 95.528870 6.106312 -88.459559 10.082080 -50.614117 4.341119 -8.606998 13.178772 27.242042 7.022626 9.053931 -22.759912 -3.060150 20.148257 0.000000 0.000000 0.000000 -10.215424 -6.154110 7.752653 26.456987 4.050538 16.886586 -12.635599 -6.698224 8.354954 0.000000 0.000000 -0.000000 -3.521173 2.422541 -5.330731 -3.121147 -11.999507 -9.126780 -3.281931 -5.727635 -2.905321 0.639158 -4.424721 1.385146 8.375992 -4.652930 -13.577956 -17.446058 -23.597981 -22.841999 -21.661392 16.782962 -25.877877 -20.235152 -22.884673 -69.144292 -31.604107 44.710263 4.930131 -14.775950 6.294732 21.067588 25.584500 -43.159039 62.220451 16.920721 30.728953 57.748718 -58.387281 -48.754711 -32.175420 +5.100791 95.505867 6.084269 -88.144102 10.188008 -51.219551 4.099136 -8.796280 13.213517 27.594938 7.086599 10.069936 -23.059778 -2.973535 19.708521 -0.000000 0.000000 -0.000000 -10.349948 -6.326325 7.705027 26.201981 4.089426 17.024792 -12.293004 -7.124421 8.823515 0.000000 0.000000 -0.000000 -3.725945 2.224799 -5.626058 -3.104679 -11.476562 -9.493697 -3.147839 -5.341945 -3.538238 0.201556 -5.243645 0.372981 9.164627 -4.631994 -12.618249 -16.381718 -21.271824 -23.314763 -19.082531 21.730248 -28.093758 -19.089154 -24.794874 -67.950042 -30.988625 44.015739 4.868096 -15.652169 6.795808 20.561445 19.867567 -41.576110 59.072316 13.893621 31.312437 58.330578 -56.827994 -48.666670 -30.895411 +5.195924 95.502602 5.971221 -87.804484 10.389482 -51.787817 3.971819 -9.164351 13.392569 27.850011 7.044855 10.867565 -23.169488 -2.873508 19.021610 0.000000 0.000000 0.000000 -10.411922 -6.702516 7.658728 25.891982 4.145352 17.369565 -12.000417 -7.249783 9.093732 0.000000 0.000000 -0.000000 -3.905314 1.937897 -6.102118 -2.794891 -10.567819 -9.723370 -3.021532 -4.809565 -4.284118 -0.371469 -5.987537 -1.496104 9.353709 -4.715529 -11.115495 -15.096846 -18.504370 -23.784270 -15.535526 27.900988 -30.637153 -17.049945 -27.435331 -66.182167 -31.691821 43.431776 5.613395 -16.584774 8.073480 20.202017 13.130018 -39.870813 55.627245 10.531269 32.244594 59.398380 -55.640113 -48.504040 -29.840663 +5.302823 95.467339 5.749497 -87.508134 10.560301 -52.360717 3.699098 -9.481029 13.661608 28.226695 6.826800 11.788538 -23.411096 -2.585116 18.390066 0.000000 0.000000 0.000000 -10.535690 -7.117572 7.524682 25.594996 4.268860 17.651698 -11.571474 -7.581151 9.482175 -0.000000 0.000000 -0.000000 -3.501365 1.532811 -6.691219 -2.681352 -9.065633 -9.878400 -2.903818 -4.059928 -5.395466 -1.217377 -6.486102 -3.972826 8.731735 -4.631253 -9.366753 -13.683943 -15.249802 -24.125667 -11.283015 34.187857 -33.469254 -13.364581 -30.015257 -62.800009 -32.270213 43.423963 6.801557 -18.346750 9.955674 19.864955 6.049259 -37.643015 52.393340 6.852243 32.428700 59.877284 -54.376611 -48.908162 -29.034570 +5.383680 95.456009 5.422056 -87.252396 10.599143 -53.199817 3.417915 -9.772979 14.009743 28.566560 6.814856 12.592820 -23.576343 -2.347754 17.955425 0.000000 0.000000 0.000000 -10.830789 -7.529566 7.481731 25.426335 4.409023 18.287679 -11.072480 -7.982964 9.719819 -0.000000 0.000000 -0.000000 -3.163423 1.340423 -7.297131 -2.413680 -7.416437 -10.161197 -2.514639 -3.055653 -6.270657 -2.314772 -7.144299 -5.900868 8.473474 -4.470474 -8.287802 -11.915596 -11.738758 -25.067119 -6.573679 38.325699 -36.174141 -8.722633 -31.606256 -57.981863 -31.046181 44.061373 6.752214 -19.937974 11.420933 19.727395 -1.599504 -33.484537 48.848101 3.603839 32.404898 60.175393 -50.898093 -47.354209 -26.541728 +5.479522 95.526421 5.000094 -86.994316 10.389614 -54.110462 3.019278 -10.079598 14.374516 28.802734 7.069325 13.381153 -23.648616 -2.207783 17.633541 0.000000 0.000000 0.000000 -11.318047 -7.988975 7.610010 25.294501 4.649573 19.086917 -10.544874 -8.159935 9.519133 0.000000 0.000000 0.000000 -2.575712 0.924924 -8.214243 -2.573022 -5.425978 -10.544882 -2.213244 -1.977181 -7.743237 -2.803762 -6.585864 -7.881644 8.152439 -3.974299 -6.133308 -10.240220 -8.335586 -25.254594 -1.847311 41.690024 -37.912967 -3.612773 -32.667302 -53.328817 -31.362821 45.058306 7.709877 -21.920211 13.155768 19.640160 -7.639850 -29.884475 46.975437 -0.552686 31.544214 60.151962 -47.587883 -46.112642 -24.304500 +5.517611 95.541382 4.508051 -86.657497 10.104085 -55.146942 2.630903 -10.459982 14.835688 28.744941 7.307716 13.910996 -23.573407 -1.877722 17.357870 -0.000000 0.000000 0.000000 -11.902209 -8.464670 7.721808 25.015729 4.773949 19.843536 -9.976827 -8.382755 9.474564 0.000000 0.000000 -0.000000 -2.346262 1.220788 -9.111954 -2.118717 -3.891147 -11.256438 -1.722236 -0.942026 -9.149808 -3.609082 -6.873278 -8.894488 8.447854 -3.592165 -4.401673 -8.122944 -5.227237 -25.885091 1.711537 43.483286 -38.714795 -0.102929 -33.071109 -50.253494 -30.326567 46.230217 7.239455 -23.734446 14.540757 19.346546 -12.459847 -26.708017 45.414891 -5.002944 30.977201 60.339974 -45.014813 -46.003974 -22.759076 +5.458650 95.594940 3.903809 -86.220953 9.799295 -56.494837 2.242321 -10.983871 15.304929 28.724402 7.598885 14.395270 -23.419068 -1.709469 17.219529 -0.000000 0.000000 0.000000 -12.635163 -9.170953 7.979060 24.910370 4.893667 20.807890 -9.427826 -8.441389 9.332088 -0.000000 0.000000 -0.000000 -2.209022 1.865518 -9.864916 -1.785715 -2.574514 -11.799109 -1.268693 -0.089844 -10.774611 -3.814305 -7.129830 -9.900192 9.027873 -3.193008 -3.001377 -6.230694 -2.662684 -26.074277 4.638749 44.819361 -39.214264 2.651650 -32.790942 -48.404138 -29.543841 46.778737 7.257755 -24.719149 15.847600 18.449941 -15.698236 -23.747141 43.945902 -8.520593 30.170633 61.673971 -43.773476 -45.357401 -21.957051 +5.410380 95.601555 3.245924 -85.724848 9.595870 -58.329342 1.932633 -11.483003 15.873172 28.718428 7.877630 15.375153 -23.265255 -1.702465 17.278408 -0.000000 0.000000 0.000000 -13.374972 -10.045214 8.375656 24.862280 4.958465 21.440763 -8.821722 -8.476596 9.738562 0.000000 0.000000 -0.000000 -1.739019 2.312990 -10.833432 -1.871872 -1.191537 -12.471185 -1.035644 0.801886 -11.670933 -3.350782 -7.033733 -10.636975 9.711864 -3.346269 -1.662910 -4.570156 -0.854696 -26.155299 6.597135 46.360380 -39.121203 4.885677 -32.977555 -47.228341 -29.016633 47.893652 7.123810 -25.282325 16.943455 17.880054 -17.567242 -22.407864 42.279788 -10.743842 30.148193 63.000837 -42.673837 -45.288696 -21.086459 +5.415506 95.571465 2.654114 -85.206044 9.529135 -60.566930 1.634162 -11.873193 16.091354 29.090665 8.123167 16.730024 -23.265789 -1.808246 17.725040 -0.000000 0.000000 0.000000 -13.904731 -10.939749 8.847293 24.686874 4.958294 22.057741 -8.144366 -8.703369 10.649747 -0.000000 0.000000 0.000000 -1.413634 2.892190 -11.225929 -1.625804 -0.513094 -12.767879 -1.051511 1.369461 -12.163623 -3.494581 -6.758305 -10.509594 10.009450 -2.878907 -1.581648 -3.379034 0.787724 -26.329674 8.330863 47.018104 -39.703736 5.869868 -33.138930 -46.632258 -28.724261 48.807169 7.045472 -25.256534 16.754342 17.002049 -18.371077 -21.178339 41.605978 -12.182037 30.332163 64.223224 -44.209015 -45.676835 -21.822887 +5.476862 95.506332 2.087452 -84.735809 9.616961 -63.080961 1.566013 -12.299357 16.410772 29.515849 8.502383 18.036297 -23.384851 -2.079116 18.185202 0.000000 0.000000 0.000000 -14.278327 -11.958251 9.354237 24.641611 5.090567 22.896979 -7.434816 -8.929427 11.412141 0.000000 0.000000 0.000000 -1.029078 3.530696 -11.449533 -1.126734 -0.179781 -12.898818 -1.071955 1.710430 -12.386722 -3.942787 -6.497489 -9.952564 9.649045 -2.721479 -1.336574 -2.964520 1.585453 -26.316287 9.151825 47.271103 -39.895157 6.647315 -32.731525 -46.972840 -28.262904 49.116548 6.958558 -25.167573 16.029167 16.568963 -18.980167 -20.860526 41.411188 -13.574595 30.271489 65.069227 -43.652177 -45.566614 -21.781514 +5.582991 95.451477 1.625886 -84.341004 9.574011 -65.023894 1.406362 -12.623800 16.848502 29.778973 8.627043 19.109398 -23.276192 -2.079685 18.242117 -0.000000 0.000000 -0.000000 -14.660864 -12.734284 9.609231 24.506133 5.212602 23.345840 -6.828634 -8.850740 12.265037 0.000000 0.000000 -0.000000 -0.867094 3.983311 -11.709133 -0.941662 0.029390 -13.118715 -1.146952 1.814697 -12.553708 -4.111333 -5.994860 -8.997850 9.332955 -2.634549 -1.092128 -2.893894 1.664177 -26.543517 9.109822 47.634999 -39.651037 6.598504 -32.988608 -47.267232 -28.149238 49.547450 6.991295 -25.028019 15.919581 16.719620 -18.701952 -22.372466 42.172477 -14.710951 30.876434 65.218968 -42.616722 -45.526577 -21.422156 +5.706862 95.454712 1.228370 -83.948204 9.445669 -66.254130 1.174480 -13.134168 17.181044 29.899084 8.906643 19.683146 -23.177906 -2.048484 17.994614 0.000000 0.000000 0.000000 -15.024300 -13.372585 9.718815 24.255228 5.272832 23.632833 -6.355695 -8.724058 12.580257 0.000000 0.000000 -0.000000 -0.841229 4.528387 -11.926592 -0.900326 -0.039494 -13.361077 -1.185879 1.806695 -12.678548 -4.045992 -5.612614 -8.296823 9.471573 -2.601777 -1.033135 -2.917530 1.129648 -26.727222 8.165977 47.645454 -39.322215 5.973304 -33.453214 -48.377802 -28.463921 49.457829 7.069789 -24.999317 15.724813 16.915743 -17.521965 -24.522328 43.408436 -15.341122 31.819599 65.571877 -42.137061 -45.538318 -21.514650 +5.816629 95.502602 1.024334 -83.864247 9.386312 -66.441511 1.125771 -13.341100 17.263220 29.723621 9.046925 19.820569 -23.055528 -1.764033 17.760578 -0.000000 0.000000 -0.000000 -15.078503 -13.507693 9.833160 23.920101 5.247364 23.196966 -5.927792 -8.694897 12.912868 0.000000 0.000000 0.000000 -0.919869 5.016922 -11.999328 -0.582737 -0.363670 -13.621094 -1.481725 1.830790 -12.793698 -3.657807 -5.314368 -7.489182 9.421606 -2.467969 -1.595065 -3.030803 0.303790 -26.663251 6.220601 46.900513 -38.832081 3.708445 -34.220015 -51.291301 -29.573604 49.577045 7.644302 -24.785321 15.090495 16.907434 -15.355578 -27.243260 45.590191 -15.386565 32.858104 66.106648 -43.255661 -45.567725 -22.580842 +5.918656 95.556221 0.924589 -84.024275 9.466677 -65.998715 1.198983 -13.317652 17.138683 29.522275 9.005394 19.752169 -22.979116 -1.513219 17.460503 0.000000 0.000000 0.000000 -14.873175 -13.359430 9.822089 23.597922 5.271049 22.516812 -5.709493 -8.678414 13.300873 0.000000 0.000000 -0.000000 -0.826589 5.376551 -11.953460 -0.474217 -0.701951 -13.815547 -1.676289 1.793221 -12.662374 -3.303130 -4.935570 -6.648877 9.607494 -2.478162 -2.439603 -3.565713 -0.867211 -26.444016 3.362440 46.101331 -38.080353 -0.167527 -35.168728 -55.447682 -30.927419 49.583933 8.021811 -24.630958 14.287413 16.970047 -11.895062 -31.095890 48.167628 -15.214903 34.394539 66.968574 -43.396669 -45.559236 -23.073478 +5.981970 95.551743 0.943503 -84.278690 9.458112 -65.100883 1.107634 -13.115516 16.798719 29.348778 8.938805 19.352738 -22.827313 -1.572909 17.195164 0.000000 0.000000 0.000000 -14.810802 -13.004562 9.749867 23.550577 5.284732 21.815157 -5.891601 -8.475836 13.331173 -0.000000 0.000000 0.000000 -0.795082 5.779224 -11.428570 -0.413292 -1.425267 -13.427995 -1.805845 1.325120 -12.263096 -3.373062 -4.093855 -5.908571 10.099451 -2.294494 -3.631165 -4.996687 -2.427091 -26.181145 0.161185 45.256109 -38.250943 -6.056498 -35.929111 -60.442798 -29.798403 47.664362 7.603828 -23.801101 13.441016 16.998681 -7.555109 -34.948167 50.645277 -15.432540 35.783486 68.346965 -43.858627 -45.771169 -23.791940 +6.020742 95.598396 1.010475 -84.932890 9.482794 -63.790288 1.268233 -12.462367 16.329286 28.966769 8.779727 18.747738 -22.586149 -1.898667 16.999074 -0.000000 0.000000 0.000000 -14.649805 -12.263514 9.442870 23.833514 5.406381 21.022254 -6.535443 -8.250414 13.543565 0.000000 0.000000 -0.000000 -0.455284 5.876130 -10.901959 -0.696701 -1.808806 -13.189499 -1.932700 1.207308 -11.119603 -3.045592 -3.060496 -5.239195 9.984447 -2.780411 -4.758206 -7.117561 -4.541179 -25.547854 -4.361601 43.626698 -37.416156 -12.036434 -35.562419 -66.723969 -31.007035 46.184921 9.535625 -22.700181 11.958977 16.926847 -1.385453 -40.574743 53.367307 -17.016946 37.696800 71.639512 -43.741321 -46.250580 -24.941474 +5.941928 95.660858 1.141678 -85.499608 9.452796 -61.665453 1.179143 -12.051349 15.833766 28.830225 8.496666 17.669485 -22.242607 -2.064466 16.534496 -0.000000 0.000000 -0.000000 -14.445333 -11.636264 8.919638 24.124784 5.693364 20.048528 -7.435330 -7.594089 13.223408 -0.000000 0.000000 0.000000 -0.248162 5.772309 -10.067373 -1.050497 -2.573914 -12.877891 -1.963379 0.885132 -9.641598 -3.011779 -1.227282 -3.702774 9.967303 -3.230690 -6.507035 -9.872585 -7.474465 -25.325216 -9.707895 41.576584 -35.990701 -17.496974 -35.405658 -72.199707 -31.526565 44.759200 10.040237 -20.980610 10.210684 16.911695 5.816345 -46.731318 55.534416 -19.880613 40.423742 76.965298 -44.494300 -47.107664 -26.298721 +5.853248 95.712052 1.312665 -86.057839 9.170210 -58.812268 0.633782 -11.635637 15.076966 28.865567 8.128168 16.208116 -22.019471 -2.086466 16.166385 0.000000 0.000000 -0.000000 -14.511592 -10.897328 8.476441 24.654896 5.924396 18.710024 -8.547429 -7.156187 12.599954 0.000000 0.000000 0.000000 -0.069385 5.956778 -8.958495 -1.796068 -3.681454 -12.397536 -1.972102 0.313971 -8.220415 -2.600346 0.628907 -1.431524 9.652822 -3.300067 -9.006294 -12.226272 -10.303510 -25.493762 -15.083373 38.094886 -34.818000 -22.968679 -34.388542 -76.345287 -31.186378 44.648095 10.202846 -18.585632 7.794959 16.303081 13.297020 -51.089317 57.228229 -20.560821 42.739642 81.114095 -45.867776 -47.689787 -27.781279 +5.665752 95.771790 1.594913 -86.816479 8.887948 -54.688588 0.002123 -11.259255 13.869395 29.002265 7.816870 13.517751 -21.844706 -2.363265 16.123140 0.000000 0.000000 -0.000000 -14.246818 -9.825417 7.785056 25.226379 6.000866 17.281822 -9.944798 -6.657774 10.940200 -0.000000 0.000000 0.000000 0.250022 6.092506 -7.786242 -2.785980 -4.451021 -12.018263 -1.589097 -0.170574 -6.971151 -2.370684 2.147976 0.605636 9.177796 -3.760356 -10.690303 -14.891463 -13.420668 -25.447979 -19.519410 33.429497 -34.169201 -26.634712 -32.401227 -78.359769 -30.069921 43.569994 9.763266 -16.935097 6.524689 15.034198 21.588523 -54.639324 58.734539 -18.452713 43.623070 81.374292 -50.155048 -48.951756 -31.192976 +5.459610 95.780464 1.915105 -87.409927 8.438504 -49.674213 -1.120862 -11.070328 12.394079 29.342365 7.376199 10.266514 -21.543267 -2.652617 16.007285 0.000000 0.000000 0.000000 -14.094061 -8.783279 6.995702 25.887747 5.922752 15.945809 -11.563061 -5.858502 8.454786 -0.000000 0.000000 0.000000 0.442271 6.223876 -6.601763 -3.704338 -5.166786 -11.547169 -1.389874 -0.708102 -6.037989 -2.686525 3.195685 2.343907 9.698406 -4.226073 -11.659976 -16.821815 -16.360620 -25.489173 -23.793804 28.547697 -33.525020 -29.467944 -31.004378 -79.092315 -28.463054 43.133962 8.686148 -15.113435 5.684219 14.053392 28.245693 -57.008447 58.129365 -14.506312 44.977655 79.417189 -53.025058 -49.866616 -33.496338 +5.263350 95.765915 2.282411 -88.070946 8.079403 -43.784061 -2.335357 -10.954209 10.756905 29.926258 6.828811 6.569719 -21.351440 -2.721062 15.752201 -0.000000 0.000000 0.000000 -13.564742 -7.725994 6.178814 26.448145 5.661468 14.157173 -13.096348 -4.967039 5.709857 0.000000 0.000000 0.000000 0.524751 6.369370 -5.597925 -4.402365 -5.652603 -11.084175 -0.892445 -1.097358 -5.253148 -3.120316 3.474190 4.278252 9.991678 -4.659392 -12.275675 -18.232700 -18.275701 -25.001381 -27.247619 24.087814 -33.454527 -30.962651 -29.526455 -78.781038 -26.986766 42.943697 7.381931 -13.707765 4.937114 12.568689 33.038840 -58.398030 57.017997 -9.097330 45.085204 74.278703 -54.622595 -50.201580 -33.966283 +5.063598 95.737557 2.702029 -88.645212 7.769711 -37.261372 -3.847332 -10.930254 8.989911 30.895407 6.036442 2.573602 -21.398857 -2.612417 15.119166 -0.000000 0.000000 0.000000 -12.820404 -6.789843 5.096682 26.963178 5.313769 12.296792 -14.723924 -3.894701 2.788507 -0.000000 0.000000 0.000000 0.480671 6.503406 -4.698925 -4.974721 -6.084410 -10.882128 -0.443084 -1.629987 -4.649853 -3.066869 4.065101 5.726284 9.535409 -4.948664 -12.137589 -18.850297 -18.951426 -24.779161 -29.892791 20.329664 -33.068584 -32.655391 -28.084785 -78.867298 -24.892281 42.725525 6.561177 -12.134366 3.858268 11.694368 33.755190 -58.963865 53.096774 -5.533954 44.548534 71.440125 -55.243418 -49.979421 -34.704227 +4.934172 95.663323 3.132243 -89.464244 7.512025 -30.090723 -5.249949 -10.654861 6.915429 31.823539 5.053245 -1.329829 -21.490530 -2.576364 14.192192 0.000000 0.000000 -0.000000 -11.735832 -5.677581 3.532896 27.604862 4.666571 9.990489 -16.285717 -2.675979 -0.047070 -0.000000 0.000000 0.000000 0.551870 6.536586 -3.889282 -5.386225 -6.242178 -11.038419 -0.016049 -1.750675 -4.565387 -3.440626 3.911370 6.526428 9.980071 -5.142306 -11.708674 -19.135597 -19.097164 -24.228086 -31.008171 18.671721 -32.996691 -33.558135 -27.736698 -79.023232 -24.525651 41.869005 6.419808 -11.700442 3.050172 10.871649 33.023130 -59.127882 50.070160 -4.937541 44.025536 70.562395 -55.448934 -50.264831 -34.510455 +4.871988 95.589867 3.549693 -90.288566 7.092171 -22.943514 -6.707609 -10.209448 4.916447 32.806703 4.106553 -4.793059 -21.335835 -2.327388 12.888412 0.000000 0.000000 0.000000 -10.490871 -4.594590 2.076400 27.988052 3.920825 7.303355 -17.866385 -1.539291 -2.507630 -0.000000 0.000000 -0.000000 0.595304 6.584993 -3.099520 -5.876822 -6.234685 -11.179250 0.296042 -1.777007 -4.676655 -4.004262 3.341457 6.891042 10.930752 -5.131305 -11.566615 -18.764599 -18.852781 -23.632085 -30.979174 18.531118 -33.095917 -33.859302 -28.058021 -79.592945 -25.477215 41.285294 6.638665 -12.160241 2.810916 10.172341 31.534526 -58.839054 48.216762 -6.077724 44.223001 70.790102 -55.456076 -50.335286 -34.435011 +4.854564 95.544823 3.911034 -91.097872 6.601246 -16.243363 -7.882642 -9.672002 3.111580 33.509698 3.266473 -7.462578 -21.205040 -1.849677 11.142606 -0.000000 0.000000 0.000000 -9.069002 -3.720622 0.628126 28.107198 3.203045 4.768814 -18.917074 -0.576772 -4.633330 -0.000000 0.000000 0.000000 0.213234 6.553714 -2.492393 -5.865252 -6.052256 -11.311736 0.354918 -1.635039 -4.459737 -4.175687 2.709329 6.508033 11.506211 -5.003376 -11.403128 -18.246551 -18.261308 -23.356175 -29.066058 20.234197 -33.506121 -32.927424 -29.132540 -80.130895 -26.466182 40.616559 6.559364 -12.583862 2.936082 10.525708 26.802239 -57.438439 45.490333 -8.747984 44.086468 72.227639 -54.365571 -50.450344 -33.691343 +4.885830 95.552261 4.256682 -91.899204 6.115565 -9.992142 -8.790199 -8.926005 1.373914 34.071792 2.259613 -9.489325 -20.940933 -1.389765 9.540194 0.000000 0.000000 -0.000000 -7.340280 -2.743689 -1.070862 27.714154 2.184783 2.165315 -19.627346 0.038232 -5.976688 -0.000000 0.000000 -0.000000 -0.568971 6.158520 -1.489187 -5.288055 -5.701176 -11.028948 0.240660 -1.264736 -4.341631 -4.512347 2.161686 5.743934 12.089715 -4.656444 -11.634145 -17.709390 -17.365916 -23.235684 -25.625267 23.733541 -34.918839 -31.105591 -30.879113 -80.411697 -28.387395 39.984210 7.201157 -13.252856 3.276496 10.945761 20.752067 -54.927658 42.631928 -11.292898 44.011143 73.651385 -52.901167 -50.323558 -32.550521 +4.991362 95.550339 4.563159 -92.695149 5.705009 -4.661456 -9.311420 -8.178765 -0.377607 34.563179 1.347819 -11.008228 -20.979373 -0.819718 7.993289 -0.000000 0.000000 0.000000 -5.539602 -2.014917 -2.813373 27.222735 1.367721 0.070306 -20.254371 0.195833 -6.511641 -0.000000 0.000000 0.000000 -1.419273 5.571723 -0.506122 -4.940003 -5.269324 -10.560108 0.141318 -1.178614 -4.118458 -4.390086 1.621192 4.824663 12.434399 -3.698751 -11.430001 -16.617532 -15.842526 -23.325900 -20.413982 28.744455 -37.075384 -28.900834 -33.086973 -80.155978 -30.327812 39.920243 7.622594 -13.784930 3.956035 12.090867 12.620678 -49.866390 39.543812 -10.470208 43.455905 73.080469 -51.526029 -49.941674 -31.166863 +5.151050 95.492966 4.805620 -93.495896 5.197790 -0.263430 -9.546785 -7.373541 -2.061464 35.069500 0.668357 -12.125981 -21.048678 -0.382061 6.680742 -0.000000 0.000000 -0.000000 -3.920779 -1.350804 -4.184396 26.998320 0.613858 -1.871826 -20.843524 0.271437 -6.983442 -0.000000 0.000000 0.000000 -2.187545 4.759630 0.314343 -4.569369 -4.658178 -9.749321 0.156217 -1.116667 -3.692056 -4.396992 0.957263 3.189041 12.807328 -2.601781 -10.799989 -15.598730 -14.283247 -23.425869 -13.134917 35.391725 -40.730948 -26.569945 -35.631931 -78.399838 -33.394566 38.722913 8.623645 -14.853459 5.476089 13.759534 5.283451 -43.940652 38.257735 -8.389705 43.122404 71.028134 -49.688054 -49.509172 -29.778609 +5.325729 95.418930 5.072038 -94.426339 4.432895 3.418387 -9.240433 -6.219778 -3.583643 35.269892 -0.034819 -12.744255 -21.141630 -0.143487 5.656007 -0.000000 0.000000 0.000000 -2.005457 -0.486179 -5.452335 26.485517 -0.154955 -3.741578 -21.232373 0.186487 -7.112369 -0.000000 0.000000 0.000000 -2.723497 3.471320 1.050372 -3.741212 -3.456593 -8.931604 -0.302563 -0.623963 -3.349520 -4.313347 0.347431 0.731002 12.901794 -1.924399 -9.596248 -14.100071 -12.023215 -23.905762 -5.061008 42.552638 -44.780943 -22.374082 -39.051257 -74.705199 -34.980261 38.646183 9.192537 -16.080692 7.852544 16.335709 -1.097864 -39.988723 38.076650 -8.533588 43.220117 69.042625 -47.229035 -49.474470 -28.194944 +5.363611 95.362084 5.255366 -95.012625 3.471691 6.677635 -9.104716 -4.980237 -4.723542 35.314380 -0.693567 -13.534284 -21.131065 -0.144911 4.721773 -0.000000 0.000000 0.000000 -0.648861 0.271599 -6.649805 26.188917 -0.668017 -4.984328 -21.638319 0.413579 -7.870095 -0.000000 0.000000 0.000000 -3.245711 2.481843 1.647214 -3.031093 -2.109709 -8.248964 -0.697269 0.013059 -3.318448 -4.520811 -0.578944 -1.798100 12.766609 -1.421692 -8.287839 -12.035390 -8.890799 -24.150794 3.292063 47.604711 -48.809606 -15.552319 -41.371441 -69.614078 -35.881861 38.422574 9.898398 -17.384111 9.628669 18.862822 -6.583444 -36.565595 38.850373 -10.157547 42.814328 67.576559 -43.589724 -48.584777 -26.183649 +5.406232 95.294144 5.538045 -95.257597 2.452384 9.508707 -8.995230 -3.758179 -5.606624 35.172615 -1.220722 -14.151148 -21.130081 -0.044586 3.706686 0.000000 0.000000 -0.000000 0.311268 1.035100 -7.809560 26.184999 -1.021006 -6.170692 -22.106590 0.597324 -8.254378 -0.000000 0.000000 -0.000000 -4.047704 1.723407 2.213140 -2.522813 -0.817517 -7.820857 -0.753555 0.838462 -3.317987 -4.651400 -1.716754 -3.708232 12.576305 -1.144206 -7.435299 -9.762708 -5.954864 -24.368575 10.718468 50.562935 -51.544066 -7.152068 -41.504224 -64.444656 -37.257315 41.089986 11.040884 -18.595450 10.744537 20.729510 -11.475962 -33.495016 39.842028 -11.831305 42.040267 67.034904 -41.281715 -48.607649 -25.615945 +5.368490 95.247200 5.801891 -95.152217 1.434930 12.205027 -9.263038 -2.624300 -6.644549 35.125605 -1.491812 -14.839575 -20.959088 0.111815 2.982903 0.000000 0.000000 -0.000000 0.825835 1.708680 -8.733271 26.408445 -1.291559 -7.312009 -22.567384 0.763934 -8.717875 0.000000 0.000000 -0.000000 -4.653143 1.456479 2.652142 -2.236106 0.251297 -7.783531 -0.961103 1.466594 -3.414781 -4.709685 -2.932073 -4.841437 12.465664 -1.065103 -6.816931 -7.841143 -4.513243 -24.760066 18.346731 52.559174 -53.922655 -0.415185 -41.358210 -60.507083 -38.786091 42.955170 12.003354 -19.958430 11.972448 22.412008 -15.225987 -31.128265 40.893613 -13.580620 41.205711 66.940350 -39.270785 -48.737816 -25.131675 +5.317631 95.190590 6.102715 -95.101535 0.673226 14.263196 -9.281478 -1.855101 -7.216398 34.945056 -1.847506 -15.410826 -20.779881 0.358045 2.315663 -0.000000 0.000000 -0.000000 1.392473 2.076053 -9.461849 26.346406 -1.475875 -8.208279 -22.961340 1.098024 -9.231660 0.000000 0.000000 0.000000 -4.909802 1.197499 2.987739 -1.780113 1.051623 -7.698698 -1.592718 1.892307 -3.338746 -4.712683 -3.645922 -5.651691 12.657933 -1.025513 -6.467899 -6.510061 -3.802878 -25.042926 25.071928 54.004732 -55.916640 4.599008 -41.373508 -57.809088 -39.712762 43.455326 11.990365 -21.372816 13.161755 23.942333 -17.528701 -29.588052 41.601640 -15.508506 40.246696 67.472338 -36.872738 -48.230910 -23.829670 +5.265898 95.127777 6.310952 -94.795822 0.058524 16.034664 -9.565650 -1.008399 -7.975723 34.882860 -2.182337 -15.823696 -20.610351 0.181006 1.961721 -0.000000 0.000000 0.000000 1.628839 2.535860 -9.979014 26.453841 -1.861590 -8.951339 -23.343096 1.271177 -9.618269 0.000000 0.000000 -0.000000 -5.506218 0.987034 3.381262 -1.465473 1.522496 -7.358378 -1.883029 2.382533 -3.168104 -4.399209 -4.280321 -6.055557 12.983588 -0.598609 -6.496176 -5.238372 -2.775603 -24.696303 29.129449 54.079151 -57.264927 9.141269 -40.707456 -56.133471 -40.235587 44.836279 12.087567 -21.096388 13.359542 24.639483 -19.760400 -27.194121 42.708480 -16.759445 39.701582 68.245277 -35.618899 -48.105383 -22.954025 +5.225457 95.087875 6.446438 -94.736773 -0.333129 17.507629 -9.632983 -0.387619 -8.418024 34.814614 -2.706858 -16.624483 -20.607544 0.123917 2.001289 0.000000 0.000000 -0.000000 2.098743 2.764389 -10.614875 26.204697 -2.184936 -9.549740 -23.440948 1.400185 -9.850167 -0.000000 0.000000 -0.000000 -5.750657 0.653666 3.756054 -1.234660 1.840872 -7.058050 -2.017133 2.616368 -2.844298 -3.946777 -4.380589 -6.355519 12.847957 -0.558712 -6.314713 -4.879171 -2.323005 -24.581500 29.850564 53.670692 -56.365663 10.610240 -40.493797 -56.665848 -40.700017 44.731932 11.893900 -21.056263 13.441447 25.405470 -20.517091 -26.374782 42.996068 -17.251413 39.069758 69.157469 -34.008299 -47.285455 -21.673226 +5.153983 95.079796 6.443190 -94.650479 -0.603718 18.502097 -9.759309 0.118214 -8.980830 34.808145 -3.018830 -16.920612 -20.569285 0.024691 2.000844 -0.000000 0.000000 -0.000000 2.347592 2.985111 -10.945060 26.041871 -2.514437 -10.278562 -23.415021 1.325799 -9.718849 0.000000 0.000000 -0.000000 -5.769148 0.326107 4.031603 -1.302718 2.023052 -6.693836 -2.090275 2.538378 -2.307636 -3.681856 -4.290052 -6.460810 12.842419 -0.627893 -6.113217 -5.158051 -2.176682 -23.941905 28.800710 53.864226 -55.059068 7.633836 -39.462847 -59.202239 -39.864940 44.748252 12.484295 -20.833089 13.345344 25.748930 -20.064400 -27.009494 43.695621 -17.166272 38.335725 69.695009 -31.818200 -47.206899 -20.940790 +5.078818 95.150208 6.314608 -94.428815 -0.856067 18.871359 -9.898994 0.661626 -9.326444 34.585442 -3.269827 -17.137280 -20.359068 -0.022048 2.239641 0.000000 0.000000 -0.000000 2.217535 3.348587 -11.345607 25.933076 -2.615784 -10.713509 -23.394447 1.270639 -9.251002 0.000000 0.000000 0.000000 -5.700536 0.167063 4.404578 -1.504820 1.843548 -6.280783 -2.213471 2.310564 -1.630655 -3.292584 -4.050613 -5.861436 12.611769 -0.972938 -6.417151 -6.396370 -3.203955 -22.723358 24.842750 53.453192 -52.156263 2.768875 -39.827150 -63.263558 -40.052625 43.740855 12.446747 -20.732457 12.756674 25.659756 -17.492175 -29.642130 44.685175 -15.572416 38.447657 69.298968 -32.782050 -47.111288 -21.531915 +5.019142 95.258064 6.095895 -94.234799 -1.103899 18.920614 -9.883218 1.177849 -9.732500 34.162534 -3.299992 -17.214064 -20.009441 -0.191477 2.664882 -0.000000 0.000000 0.000000 2.047791 3.829639 -11.593338 25.815540 -2.718416 -11.090097 -23.161332 1.044728 -8.744601 0.000000 0.000000 -0.000000 -5.309654 0.044537 4.870559 -1.984693 1.310063 -5.758510 -2.058744 1.890488 -0.848782 -3.746182 -3.892721 -5.159398 12.937326 -1.316826 -7.602783 -8.310425 -4.488523 -21.345362 19.048464 51.974111 -48.841554 -4.125388 -40.323723 -68.282024 -39.402695 42.396533 11.883497 -20.153032 11.634250 25.168101 -13.561721 -32.579924 46.165936 -13.197776 39.216822 68.451495 -33.458142 -46.631282 -21.579551 +5.000801 95.398300 5.858897 -94.116668 -1.280659 18.814710 -9.807960 1.472456 -9.855760 33.614768 -3.178760 -17.298930 -19.513158 -0.240837 3.132712 0.000000 0.000000 0.000000 1.996524 4.073810 -11.586200 25.377260 -2.583531 -11.401914 -22.731042 1.004675 -8.426591 0.000000 0.000000 -0.000000 -4.968323 -0.061631 5.385211 -2.210562 0.524708 -5.267347 -1.943149 1.317657 0.051289 -3.405378 -2.998919 -3.829781 12.525785 -1.795944 -8.176172 -10.421790 -6.568615 -20.568174 10.709633 49.881959 -44.357913 -12.798912 -40.540412 -73.876676 -37.078697 40.647583 11.149671 -18.823518 10.074846 24.874319 -8.794539 -36.644286 46.782368 -10.320177 40.180540 67.198100 -37.428805 -47.465874 -24.110677 +5.042143 95.523865 5.654065 -93.848190 -1.424365 18.921805 -9.952871 1.779924 -9.974163 33.144025 -3.055254 -17.548273 -18.956405 -0.346557 3.540036 0.000000 0.000000 -0.000000 1.848238 4.304627 -11.440065 24.910155 -2.556049 -11.688652 -22.315149 0.947119 -8.382173 0.000000 0.000000 -0.000000 -4.945385 0.149750 5.799689 -2.181245 -0.649332 -5.030083 -1.964269 0.719630 1.067804 -2.787413 -2.211253 -2.229193 12.361912 -2.329062 -9.471029 -12.536962 -8.827658 -19.969638 2.086768 45.934812 -40.044470 -20.783843 -39.284866 -78.368944 -34.295579 38.644619 9.727022 -16.417969 8.062492 24.254167 -3.251595 -40.171782 47.200802 -7.600562 41.124701 65.847479 -40.235004 -47.920775 -25.483045 +5.086496 95.637734 5.646221 -93.828122 -1.371403 19.452271 -9.940079 1.661900 -9.846516 32.847050 -3.002001 -18.521675 -18.596662 -0.396265 3.880615 0.000000 0.000000 -0.000000 2.299413 4.087005 -11.386285 24.106922 -2.598419 -11.951352 -21.987392 0.940223 -8.704629 -0.000000 0.000000 0.000000 -4.585723 0.601614 6.171987 -2.651495 -2.078986 -4.994243 -1.610683 -0.031903 1.824913 -2.338253 -1.367424 -0.675076 12.240268 -2.998318 -11.397561 -14.650091 -11.390131 -18.818741 -5.205963 40.614238 -36.145955 -25.891146 -37.762709 -82.367755 -30.446421 37.244299 8.043663 -14.100030 5.589120 22.819005 2.028418 -43.095123 46.276683 -4.632856 41.041228 65.160400 -43.807502 -49.034360 -26.829131 +5.146442 95.689377 5.572044 -93.449416 -1.359405 20.366825 -10.502446 1.743010 -10.099235 32.764834 -2.696511 -19.528243 -18.176204 -0.602121 4.381207 -0.000000 0.000000 -0.000000 2.187067 4.090513 -11.092435 23.778590 -2.893279 -12.195604 -21.789259 1.149099 -9.634896 0.000000 0.000000 0.000000 -4.299845 1.425299 6.496819 -2.778681 -3.445634 -5.106119 -1.365468 -0.707007 2.125300 -1.809884 -0.993030 0.646986 11.538101 -3.607804 -13.001412 -15.875551 -13.909212 -17.191467 -10.495248 33.427111 -32.237081 -30.045613 -35.314044 -86.757023 -26.298407 36.177290 6.252275 -12.169712 3.414092 20.717817 6.367266 -44.364989 44.113093 -3.710897 40.137509 66.852200 -48.986028 -49.576996 -29.347036 +5.329226 95.676117 5.544999 -93.370959 -1.467108 21.472816 -10.734299 1.976967 -10.257503 32.760308 -2.686747 -20.774055 -18.061450 -0.707826 4.951403 0.000000 0.000000 0.000000 2.405967 4.250484 -11.149380 23.605770 -3.222399 -12.279232 -21.723444 1.110359 -10.522465 -0.000000 0.000000 0.000000 -3.906022 2.036402 6.878285 -2.385203 -4.539757 -5.329184 -0.723218 -1.013335 2.248776 -1.030697 -1.092351 1.632743 10.773471 -3.966863 -14.702880 -15.597523 -15.496616 -14.757991 -13.680432 25.481234 -27.219263 -31.921789 -31.836210 -91.356955 -20.711011 35.123631 2.933833 -11.154441 1.621101 17.538346 8.133983 -44.442642 39.494405 -6.288502 38.240381 72.104983 -48.446626 -49.601584 -28.056357 +5.538178 95.658890 5.486549 -93.525345 -1.724045 22.575369 -10.741225 2.343558 -10.454771 32.883420 -2.733250 -22.069170 -17.845384 -0.932532 5.487075 0.000000 0.000000 0.000000 3.014365 4.504045 -11.702960 23.191901 -3.396848 -12.067012 -21.585407 1.170929 -11.446725 -0.000000 0.000000 0.000000 -3.326146 2.260422 7.104341 -1.643289 -5.250849 -5.361808 0.469306 -1.308817 2.175242 0.029768 -0.902836 1.689746 9.861716 -3.713630 -15.105268 -14.817585 -15.351087 -10.737653 -14.708687 18.810449 -22.287104 -31.855815 -27.592913 -96.076337 -16.808443 33.613005 0.134014 -10.627578 0.182558 14.108304 7.515068 -42.812520 33.697363 -10.820762 36.044711 78.921239 -43.362743 -49.019884 -24.708285 +5.668303 95.664063 5.175199 -93.427794 -1.782110 22.732006 -11.162866 2.541131 -10.566067 33.078019 -2.442223 -22.521054 -17.755105 -1.182074 5.908084 0.000000 0.000000 0.000000 2.820111 4.765147 -11.604303 22.987633 -3.431100 -11.383580 -21.192936 1.049856 -12.538411 -0.000000 0.000000 0.000000 -2.387966 1.916575 7.067309 -0.743321 -5.531629 -4.929202 1.363185 -1.133639 2.439748 1.091530 -1.255593 1.057146 9.322214 -3.346172 -14.799378 -13.417502 -14.107969 -5.362738 -14.670431 13.979518 -17.733285 -29.914788 -24.496808 -100.202575 -14.314349 32.769984 -2.849200 -10.337904 -1.053202 10.284943 5.140204 -39.470372 28.100561 -15.190095 32.667579 84.397771 -38.372527 -47.897438 -20.111023 +5.735574 95.649925 4.712587 -93.510574 -1.958589 22.566174 -11.376828 2.807227 -10.602974 33.134198 -2.152691 -22.870373 -17.526242 -1.494594 6.301400 0.000000 0.000000 -0.000000 2.570766 5.107513 -11.626117 22.933044 -3.352675 -10.651256 -20.919622 1.407506 -13.722650 -0.000000 0.000000 0.000000 -0.432088 1.530116 6.906542 -0.151411 -5.411259 -4.399184 2.295079 -0.921408 2.662013 1.925762 -1.629639 0.142542 8.847504 -3.152792 -14.082336 -11.553956 -13.104698 -0.180156 -13.713423 10.650168 -12.463241 -27.838076 -21.266442 -102.688039 -14.389957 31.267493 -4.878630 -10.324323 -1.264442 7.009637 2.582519 -36.186476 23.087240 -19.532694 29.819028 88.365041 -30.229009 -46.375458 -15.050991 +5.716340 95.685715 4.086758 -93.315613 -1.897190 22.004131 -12.063672 2.792544 -10.179612 33.111055 -1.894101 -22.885903 -17.250109 -1.344844 6.490237 0.000000 0.000000 -0.000000 1.522804 5.366080 -11.300038 23.252831 -3.232276 -9.964527 -20.659150 1.209292 -13.918035 -0.000000 0.000000 0.000000 2.050003 1.250555 6.610666 0.128962 -5.189370 -3.808425 3.069564 -0.911628 2.929825 2.866044 -1.699991 -0.539024 8.326780 -2.798862 -13.507125 -9.875746 -11.923152 3.904786 -12.076851 9.486346 -6.939495 -27.691759 -19.877207 -103.470962 -14.024176 30.723182 -5.002731 -10.262937 -1.427400 4.709137 -1.494151 -32.267539 17.808195 -23.487249 27.242832 90.172241 -26.451858 -45.707101 -13.124897 +5.554983 95.752182 3.248489 -93.020962 -1.538989 21.500977 -13.230521 2.481704 -9.817631 33.208031 -1.637968 -22.961027 -16.815607 -0.990188 6.557845 -0.000000 0.000000 0.000000 -0.037123 5.393313 -11.013911 23.981577 -3.201826 -9.288147 -20.472971 1.236960 -14.362522 0.000000 0.000000 -0.000000 5.226561 0.711293 6.426803 0.037346 -4.770713 -3.103429 3.947601 -0.796827 3.146883 3.027640 -1.701938 -1.127331 8.008829 -2.450587 -13.075015 -8.889451 -10.831745 7.502849 -11.498380 9.638217 -2.622544 -27.647853 -20.010748 -102.022137 -13.468033 30.402614 -5.281424 -10.533280 -1.208699 2.116654 -5.779847 -28.011439 13.265467 -26.271278 25.463395 89.882159 -22.812832 -44.780506 -10.808330 +5.225740 95.837387 2.118101 -92.710953 -1.074660 21.364905 -14.795597 2.150592 -9.650947 33.449542 -1.532777 -22.811158 -16.032852 -0.333239 6.264858 -0.000000 0.000000 -0.000000 -1.897550 5.206615 -10.698881 25.035977 -3.230084 -9.173639 -20.313634 1.124760 -14.399117 0.000000 0.000000 -0.000000 9.704122 0.049522 6.157570 -0.170376 -3.934831 -2.472851 4.217675 -0.794662 3.241582 3.198532 -1.172132 -2.027990 6.741865 -2.609937 -12.134568 -9.124266 -9.410987 9.433129 -12.656494 10.400890 0.802053 -28.420829 -20.324222 -99.057443 -14.298480 33.201134 -4.175431 -10.376653 -0.262841 0.746273 -10.328257 -24.419230 8.265342 -29.324463 23.774519 88.033017 -21.649165 -44.314588 -9.884002 diff --git a/data/gradio_human/conversion_summary.json b/data/gradio_human/conversion_summary.json new file mode 100644 index 0000000000000000000000000000000000000000..3e02590cb209a63376fe654fc9fb9ccbbce12b0a --- /dev/null +++ b/data/gradio_human/conversion_summary.json @@ -0,0 +1,35 @@ +{ + "success_count": 4, + "failed_count": 0, + "total": 4, + "results": [ + { + "filename": "000327", + "num_frames": 151, + "num_joints": 27, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_human/bvh/000327.bvh", + "success": true + }, + { + "filename": "000419", + "num_frames": 198, + "num_joints": 27, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_human/bvh/000419.bvh", + "success": true + }, + { + "filename": "000708", + "num_frames": 63, + "num_joints": 27, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_human/bvh/000708.bvh", + "success": true + }, + { + "filename": "000926", + "num_frames": 198, + "num_joints": 27, + "bvh_path": "/gpfsdata/home/cuiyuzhuo/019/release/data/gradio_human/bvh/000926.bvh", + "success": true + } + ] +} \ No newline at end of file diff --git a/data/gradio_human/joint_text_features/000327.npz b/data/gradio_human/joint_text_features/000327.npz new file mode 100644 index 0000000000000000000000000000000000000000..d0a310d1f9d819b53844009cc03ab238706e27f9 --- /dev/null +++ b/data/gradio_human/joint_text_features/000327.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cd4084f31f468eedfdfbc4d811a9e5961f0ad3afa03da1e0a8d7f833ffb03b2 +size 71490 diff --git a/data/gradio_human/joint_text_features/000419.npz b/data/gradio_human/joint_text_features/000419.npz new file mode 100644 index 0000000000000000000000000000000000000000..d0a310d1f9d819b53844009cc03ab238706e27f9 --- /dev/null +++ b/data/gradio_human/joint_text_features/000419.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cd4084f31f468eedfdfbc4d811a9e5961f0ad3afa03da1e0a8d7f833ffb03b2 +size 71490 diff --git a/data/gradio_human/joint_text_features/000708.npz b/data/gradio_human/joint_text_features/000708.npz new file mode 100644 index 0000000000000000000000000000000000000000..d0a310d1f9d819b53844009cc03ab238706e27f9 --- /dev/null +++ b/data/gradio_human/joint_text_features/000708.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cd4084f31f468eedfdfbc4d811a9e5961f0ad3afa03da1e0a8d7f833ffb03b2 +size 71490 diff --git a/data/gradio_human/joint_text_features/000926.npz b/data/gradio_human/joint_text_features/000926.npz new file mode 100644 index 0000000000000000000000000000000000000000..d0a310d1f9d819b53844009cc03ab238706e27f9 --- /dev/null +++ b/data/gradio_human/joint_text_features/000926.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cd4084f31f468eedfdfbc4d811a9e5961f0ad3afa03da1e0a8d7f833ffb03b2 +size 71490 diff --git a/data/gradio_human/processed/000327.npz b/data/gradio_human/processed/000327.npz new file mode 100644 index 0000000000000000000000000000000000000000..6536a61bd65b9f480a5cb84c5267e7e1496b7d43 --- /dev/null +++ b/data/gradio_human/processed/000327.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cba1d2d8fd8fba55ed7834b973b94fd39bdf3f7fda39ce74cb5c880328c796f5 +size 299956 diff --git a/data/gradio_human/processed/000419.npz b/data/gradio_human/processed/000419.npz new file mode 100644 index 0000000000000000000000000000000000000000..f246ff3b9b98522ed0e1ebcdc5585a25e6598753 --- /dev/null +++ b/data/gradio_human/processed/000419.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc40ae087b1f23076ae269d490cadaf7e844e8ff0fb726803adf17428d44f5f8 +size 389624 diff --git a/data/gradio_human/processed/000708.npz b/data/gradio_human/processed/000708.npz new file mode 100644 index 0000000000000000000000000000000000000000..a91146c6dca126a4d0d090df51c4e5615f73f311 --- /dev/null +++ b/data/gradio_human/processed/000708.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e42cb270b3903db47f0df6e241e83986af866267dcea5a4172c4caed8f54cf58 +size 128213 diff --git a/data/gradio_human/processed/000926.npz b/data/gradio_human/processed/000926.npz new file mode 100644 index 0000000000000000000000000000000000000000..2c55881b547820340c85f0cc6b3663e922ac86e9 --- /dev/null +++ b/data/gradio_human/processed/000926.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d7f63c6f303af95fbb269baeb497744483c819cb396a6c1b08d792f46b00611 +size 392709 diff --git a/data/gradio_skel/animo/joint_text_features/dama_gazelle_male_runtostandturnl.npz b/data/gradio_skel/animo/joint_text_features/dama_gazelle_male_runtostandturnl.npz new file mode 100644 index 0000000000000000000000000000000000000000..28710432e8e8983673e5729ffbf9f8c92596ea39 --- /dev/null +++ b/data/gradio_skel/animo/joint_text_features/dama_gazelle_male_runtostandturnl.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1efcdd0f8c9990323a8d01c641178466c2f6e456378e6e8b3fe8784b962b3efb +size 131731 diff --git a/data/gradio_skel/animo/joint_text_features/malayan_tapir_male_standidle01.npz b/data/gradio_skel/animo/joint_text_features/malayan_tapir_male_standidle01.npz new file mode 100644 index 0000000000000000000000000000000000000000..4be55a0cd834fd6fb65aa9387484571194652d27 --- /dev/null +++ b/data/gradio_skel/animo/joint_text_features/malayan_tapir_male_standidle01.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feab8254e314979f988f2c2cc89e7f903b315cfc477fae775fac833d3b371e99 +size 131672 diff --git a/data/gradio_skel/animo/joint_text_features/wisent_male_attackfence.npz b/data/gradio_skel/animo/joint_text_features/wisent_male_attackfence.npz new file mode 100644 index 0000000000000000000000000000000000000000..4be55a0cd834fd6fb65aa9387484571194652d27 --- /dev/null +++ b/data/gradio_skel/animo/joint_text_features/wisent_male_attackfence.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:feab8254e314979f988f2c2cc89e7f903b315cfc477fae775fac833d3b371e99 +size 131672 diff --git a/data/gradio_skel/animo/processed/dama_gazelle_male_runtostandturnl.npz b/data/gradio_skel/animo/processed/dama_gazelle_male_runtostandturnl.npz new file mode 100644 index 0000000000000000000000000000000000000000..79ceea0a427e457451e442f833715a722888926a --- /dev/null +++ b/data/gradio_skel/animo/processed/dama_gazelle_male_runtostandturnl.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7cf85d286d0d95d002e38c4e191f99d56d6fb4caafeadd1a05531ca1a0915d3 +size 159553 diff --git a/data/gradio_skel/animo/processed/malayan_tapir_male_standidle01.npz b/data/gradio_skel/animo/processed/malayan_tapir_male_standidle01.npz new file mode 100644 index 0000000000000000000000000000000000000000..b056109a3aec07df110d72fdd16bd60de7a87366 --- /dev/null +++ b/data/gradio_skel/animo/processed/malayan_tapir_male_standidle01.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:690fab02e584793ec56547c943c65e1f33b45f4cbad6ba2be1d87c50794d10b4 +size 761307 diff --git a/data/gradio_skel/animo/processed/wisent_male_attackfence.npz b/data/gradio_skel/animo/processed/wisent_male_attackfence.npz new file mode 100644 index 0000000000000000000000000000000000000000..acfcbee0835ec68a1828877672dc98db23f36ea1 --- /dev/null +++ b/data/gradio_skel/animo/processed/wisent_male_attackfence.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da8b4160de88e4233a84af04ffdb7429694ca3bafec13d9ca9f440d0409dcde0 +size 468984 diff --git a/data/gradio_skel/human/joint_text_features/amy.npz b/data/gradio_skel/human/joint_text_features/amy.npz new file mode 100644 index 0000000000000000000000000000000000000000..35933bff08974d01ce734310b502522dfe230474 --- /dev/null +++ b/data/gradio_skel/human/joint_text_features/amy.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5a3d3c7229878b105e25e3cc37e6a154d773edf23425e91152edc099fa14663 +size 71491 diff --git a/data/gradio_skel/human/joint_text_features/guard.npz b/data/gradio_skel/human/joint_text_features/guard.npz new file mode 100644 index 0000000000000000000000000000000000000000..35933bff08974d01ce734310b502522dfe230474 --- /dev/null +++ b/data/gradio_skel/human/joint_text_features/guard.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5a3d3c7229878b105e25e3cc37e6a154d773edf23425e91152edc099fa14663 +size 71491 diff --git a/data/gradio_skel/human/joint_text_features/mousey.npz b/data/gradio_skel/human/joint_text_features/mousey.npz new file mode 100644 index 0000000000000000000000000000000000000000..35933bff08974d01ce734310b502522dfe230474 --- /dev/null +++ b/data/gradio_skel/human/joint_text_features/mousey.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5a3d3c7229878b105e25e3cc37e6a154d773edf23425e91152edc099fa14663 +size 71491 diff --git a/data/gradio_skel/human/processed/amy.npz b/data/gradio_skel/human/processed/amy.npz new file mode 100644 index 0000000000000000000000000000000000000000..55a076e1b2a19d49b8659198fcb34e036ec83ca0 --- /dev/null +++ b/data/gradio_skel/human/processed/amy.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:206c1566703b4e8f00a8314dcd428e4e84d73fe579f1941e6c23f11ec12df88a +size 3618 diff --git a/data/gradio_skel/human/processed/guard.npz b/data/gradio_skel/human/processed/guard.npz new file mode 100644 index 0000000000000000000000000000000000000000..a7829fbc5d6b4f52157c0a9845157491ee29daf7 --- /dev/null +++ b/data/gradio_skel/human/processed/guard.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5868346512fc6c2580366a6c9128b0818539e15b169d842991fa8f6a92572ff1 +size 3585 diff --git a/data/gradio_skel/human/processed/mousey.npz b/data/gradio_skel/human/processed/mousey.npz new file mode 100644 index 0000000000000000000000000000000000000000..722eeab23a7b3184ba52cbf69275f839dd4433d7 --- /dev/null +++ b/data/gradio_skel/human/processed/mousey.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:963e9fb4d78b37438443124f183730ddee3eae26385959fac966125e788be6a8 +size 4961 diff --git a/data/gradio_target_bvh/animo/dama_gazelle_male_runtostandturnl.bvh b/data/gradio_target_bvh/animo/dama_gazelle_male_runtostandturnl.bvh new file mode 100644 index 0000000000000000000000000000000000000000..6e3bb9eb3ece27b025e11d7aa77fa9c8bdc319dc --- /dev/null +++ b/data/gradio_target_bvh/animo/dama_gazelle_male_runtostandturnl.bvh @@ -0,0 +1,329 @@ +HIERARCHY +ROOT def_c_root_joint +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT def_c_hips_joint + { + OFFSET -0.000000 -0.985200 0.093600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine1_joint + { + OFFSET 0.000000 -0.162200 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine2_joint + { + OFFSET 0.000000 -9.916100 -1.368100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine3_joint + { + OFFSET 0.000000 -9.966200 -0.935800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_chest_joint + { + OFFSET 0.000000 -10.903400 0.601800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck1_joint + { + OFFSET 0.000000 -18.528900 -1.530700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck2_joint + { + OFFSET 0.000000 -7.703800 5.503200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck3_joint + { + OFFSET 0.000000 -5.515400 7.732500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck4_joint + { + OFFSET -0.000000 -3.947000 8.622800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_head_joint + { + OFFSET -0.000000 -3.451100 9.252900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_jaw_joint + { + OFFSET -0.000000 -2.586400 -1.581400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -13.516133 -6.855483 + } + } + JOINT def_eye_joint.L + { + OFFSET 4.078000 -5.090000 2.412200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.832300 -0.350200 -0.108800 + } + } + JOINT def_eye_joint.R + { + OFFSET -4.078000 -5.090000 2.412200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.832300 -0.350200 -0.108800 + } + } + } + } + } + } + } + JOINT def_clavicle_joint.L + { + OFFSET 5.511100 -7.185700 3.807100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.L + { + OFFSET 1.208500 -6.555000 -11.437100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.L + { + OFFSET -0.176700 8.465700 -12.365100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.L + { + OFFSET -0.055200 -1.609700 -25.257800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.L + { + OFFSET -0.271500 0.987900 -23.173900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.337300 -6.151100 -5.738400 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.L + { + OFFSET -0.027600 -0.804800 -12.628900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.016600 -0.482900 -7.577300 + } + } + } + } + } + JOINT def_clavicle_joint.R + { + OFFSET -5.511100 -7.185700 3.807200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.R + { + OFFSET -1.208500 -6.555000 -11.437100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.R + { + OFFSET 0.176700 8.465700 -12.365100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.R + { + OFFSET 0.055200 -1.609600 -25.257800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.R + { + OFFSET 0.271500 0.987900 -23.173900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.337300 -6.151100 -5.738400 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.R + { + OFFSET 0.027600 -0.804800 -12.628900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.016600 -0.482900 -7.577300 + } + } + } + } + } + } + } + } + } + JOINT def_c_tail1_joint + { + OFFSET -0.000000 23.386700 3.546700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_tail2_joint + { + OFFSET -0.000000 5.616800 -3.426400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 5.681100 -3.294000 + } + } + } + JOINT def_rearLegUpr_joint.L + { + OFFSET 7.658600 11.566600 -1.528100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.L + { + OFFSET 0.756400 -1.668000 -20.412300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.L + { + OFFSET -1.304100 18.229900 -18.950600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.L + { + OFFSET 2.051000 -2.622300 -29.413800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.538100 -6.421800 -5.397800 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.L + { + OFFSET -0.652100 9.115000 -9.475300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.391200 5.469000 -5.685200 + } + } + } + JOINT def_rearLegUprAllTwist_joint.L + { + OFFSET 0.378200 -0.834000 -10.206100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.226900 -0.500400 -6.123700 + } + } + } + JOINT def_rearLegUpr_joint.R + { + OFFSET -7.658600 11.566600 -1.528100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.R + { + OFFSET -0.757500 -1.679000 -20.411400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.R + { + OFFSET 1.305200 18.240900 -18.951500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.R + { + OFFSET -2.051000 -2.622300 -29.413800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.538000 -6.421800 -5.397800 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.R + { + OFFSET 0.648300 8.876400 -9.699400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.389100 5.327500 -5.821500 + } + } + } + JOINT def_rearLegUprAllTwist_joint.R + { + OFFSET -0.378700 -0.839500 -10.205700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.227200 -0.503700 -6.123400 + } + } + } + JOINT def_c_anus_joint + { + OFFSET -0.000000 24.823400 -3.415000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 4.274500 0.000000 0.000000 + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.000000 75.773700 0.000000 -90.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 +17.707800 72.987000 -14.961200 -96.602351 14.865078 -20.545873 -0.000001 -0.000001 0.005545 5.351191 -2.567038 21.873286 0.461389 -1.299545 -8.734312 -8.139806 -1.223508 -8.293211 2.678360 0.000332 43.274132 10.859830 -2.308382 5.412901 3.864915 -5.679073 6.795883 1.014260 -2.781651 5.583036 0.001834 0.000000 -0.000010 -6.022143 8.884988 10.494783 -6.381606 0.000008 -0.000017 -7.860797 -3.924106 -0.475232 -12.096570 -0.126995 -1.297169 -10.094109 -0.167753 -1.603711 -27.747806 -5.597778 -10.313179 -17.557633 10.531493 18.375941 42.844861 0.991183 -2.564377 32.148768 -20.438313 3.411363 0.000005 0.000003 0.000004 -0.719567 -0.764066 0.323313 -8.726473 8.661442 5.178575 -25.705943 2.894397 -20.238561 57.906323 -0.595139 3.194662 71.000472 -3.207003 8.737308 -0.000009 0.000000 -0.000001 12.322010 -1.377279 0.381697 -0.905479 1.470958 -21.802860 -32.853989 -5.573900 8.976280 41.602607 7.038312 -2.718434 -15.189733 -11.867611 1.635468 16.040197 -8.925064 -1.334952 0.000002 -0.000001 0.000003 -0.000013 -0.000005 -0.000003 -23.660899 2.153243 0.952261 16.142618 -2.513872 0.670393 -12.122357 -6.546363 10.840831 26.460445 -8.237948 1.732085 -0.648898 -4.818047 8.425573 -0.000001 0.000001 0.000005 -0.000000 0.000000 -0.005544 +16.206300 71.302300 -0.311900 -97.831286 12.284915 -12.169449 -0.000001 0.000002 0.005542 4.848677 -1.038173 19.981918 0.405314 -2.204118 -8.097197 -9.707571 -1.219756 -7.621277 2.440750 -0.000231 42.224943 11.853041 -2.180414 5.871885 3.961743 -6.450248 7.437307 1.243587 -2.751948 4.945740 0.001832 0.000000 -0.000004 -5.053134 8.518317 9.138052 -6.381601 0.000008 -0.000018 -8.484982 -3.314971 -0.240642 -11.968571 -0.008757 -1.242216 -10.194261 -0.126806 -1.636531 -20.606529 -5.946483 -9.255501 -21.136195 9.976465 18.569558 48.127193 1.086882 -2.917438 25.103262 -21.597678 3.306469 0.000010 0.000004 0.000001 -2.171489 -0.712527 0.551607 -18.865903 10.766914 8.492685 -21.566635 4.144169 -23.378846 50.536341 -1.936876 2.678922 85.020678 -2.273828 7.485490 -0.000007 -0.000002 0.000002 10.819423 -0.171406 -1.858855 -1.582846 1.736896 -21.749182 -20.728852 -1.097550 6.175424 45.922244 7.390234 -4.174182 -19.793159 -9.622854 1.318615 5.255661 -10.594944 -3.084307 -0.000005 0.000000 0.000001 -0.000008 -0.000005 -0.000005 -29.920760 5.135640 0.086427 25.286373 -4.192011 1.395861 -12.847872 -7.712070 11.369942 22.765000 -5.300326 0.309144 -0.638455 -4.619353 8.085497 0.000006 -0.000001 0.000004 0.000000 0.000001 -0.005545 +16.181900 70.295200 13.678300 -97.693230 9.481031 -5.272821 -0.000001 -0.000001 0.005541 4.081347 0.862336 18.907371 0.760608 -3.218405 -7.544926 -10.933716 -1.158029 -6.625884 1.776820 -0.001423 41.147734 13.505888 -1.586049 6.595921 3.839815 -7.768533 8.961105 1.174534 -2.403818 3.889207 0.001836 -0.000003 -0.000010 -4.538809 9.101855 7.548376 -6.381601 0.000008 -0.000016 -9.135686 -2.683130 0.024331 -12.214319 -0.233509 -1.350651 -10.219066 -0.031074 -1.629135 -6.842297 -7.907225 -7.638032 -25.168147 11.300638 14.389247 46.516286 -1.931878 -3.153824 9.506681 -16.385369 1.479421 0.000005 0.000003 -0.000002 -3.584294 -0.679166 0.752493 -18.505298 11.509955 13.678245 -25.251346 9.481244 -30.580840 63.304290 -4.105460 3.264964 53.913740 -0.455848 3.096707 -0.000005 0.000003 0.000001 4.746953 1.580742 -2.889647 -5.811172 3.403026 -21.474386 -3.368057 3.767031 3.875203 39.952160 6.698947 -3.774475 -24.874939 -7.960164 0.856976 7.387600 -12.775842 -2.798696 -0.000002 0.000001 0.000001 -0.000011 -0.000006 -0.000006 -31.246196 7.039199 0.220651 26.046993 -4.540932 1.381696 -12.398870 -2.569434 10.586586 11.839775 -8.438982 1.832581 -0.634471 -4.587377 8.019907 -0.000002 -0.000001 0.000004 0.000001 0.000000 -0.005542 +17.488100 70.136500 26.954200 -96.246522 7.038616 0.284673 0.000001 0.000000 0.005543 3.100414 2.872425 18.722918 1.497294 -4.414706 -7.078611 -11.174767 -1.109659 -5.721191 0.422571 -0.003260 40.210338 15.950307 -0.483314 7.409824 3.078309 -9.102760 10.917720 0.561320 -2.122035 3.057110 0.001837 -0.000005 -0.000009 -4.483692 10.911346 5.901821 -6.381606 0.000008 -0.000014 -9.557363 -2.271758 0.198845 -12.615443 -0.600886 -1.527427 -7.590081 -0.047126 -1.207608 3.832049 -9.293120 -6.466597 -16.236516 14.613060 5.337132 20.012132 -4.248335 -1.682337 -0.213340 -10.722168 0.107814 0.000004 0.000001 -0.000000 -5.150611 -0.780189 0.991007 -4.702153 10.130695 17.853577 -27.910219 13.782950 -36.873702 62.595501 -4.450350 3.319790 7.863149 1.006658 6.402017 -0.000009 0.000002 -0.000002 -5.473930 3.488350 -2.368702 -13.226450 6.221747 -20.725584 3.222856 6.164399 7.985490 40.771295 7.001564 -3.855363 -26.758658 -5.709146 0.143711 29.750125 -15.310950 5.638707 -0.000000 0.000001 0.000000 -0.000010 -0.000005 -0.000003 -24.825129 9.715757 -0.508564 25.165321 -4.593628 1.342505 -15.620398 -3.619364 10.667125 3.863537 -6.926267 0.125323 -0.628679 -4.573406 7.994839 -0.000004 0.000000 0.000006 -0.000000 0.000000 -0.005543 +20.027300 71.174100 39.534300 -94.106438 5.135888 4.828315 -0.000000 0.000000 0.005542 1.159831 4.556975 19.409917 2.065162 -4.745507 -6.650282 -10.371301 -0.723281 -5.334527 -0.301941 0.003019 39.398949 19.074246 1.091900 8.200943 0.949245 -7.933499 10.350582 -0.592099 -4.023108 4.846366 0.001841 0.000002 -0.000008 -4.980403 12.980941 4.640452 -6.402589 0.000007 -0.000015 -9.563779 -2.269089 0.199440 -13.358188 -1.285205 -1.871202 -2.019529 -0.046325 -0.316589 10.773397 -12.468386 -6.026099 -17.024380 15.346911 0.218662 11.465896 -3.915336 -1.139195 -4.854472 -8.486638 -0.005561 0.000010 0.000002 0.000001 -3.181331 -0.652539 0.653259 -3.324102 7.672586 21.818853 -19.530424 10.048445 -39.275107 39.951228 -4.188910 2.077012 -10.817718 -2.425567 8.760666 -0.000010 -0.000002 0.000000 -10.813173 4.782725 -0.979198 -15.750389 7.089766 -20.246827 3.508176 5.825564 12.214288 42.485843 7.426433 -3.822810 -24.912502 -3.172033 -0.460596 54.847123 -8.236666 11.782291 0.000003 -0.000002 -0.000003 -0.000011 -0.000008 -0.000003 -13.341981 13.326894 0.069324 23.708930 -4.845028 1.195551 -21.154628 -4.145025 10.881396 2.586837 -7.109676 -1.628693 -0.626298 -4.507538 7.912802 -0.000000 0.000001 0.000004 -0.000000 0.000000 -0.005542 +23.689600 73.505800 51.436900 -91.922533 4.069670 8.271161 -0.000000 0.000000 0.005542 -1.307393 5.514153 21.217122 2.457346 -4.026062 -6.246940 -8.757508 -0.008199 -5.526076 -0.182856 0.000436 38.587570 21.783807 2.867222 8.850969 -1.457758 -3.944157 6.878031 -1.447592 -7.715436 8.685743 0.001839 -0.000002 -0.000010 -6.027025 14.219533 4.417897 -6.423555 0.000010 -0.000016 -9.773179 -2.068455 0.287473 -14.745760 -2.532084 -2.528316 3.750595 0.039396 0.593305 15.016362 -17.847887 -5.877082 -23.924474 15.581984 -0.265834 18.605632 -2.026400 -1.545607 -5.075923 -7.320362 -0.245212 0.000006 0.000003 0.000003 1.914412 -0.457716 -0.162237 -9.889514 4.085311 24.933372 -2.854027 -0.990790 -38.977069 2.679466 -3.642933 -0.014645 -9.067265 -4.303033 7.664064 -0.000007 0.000001 -0.000000 -12.759107 5.278505 1.103434 -15.115011 6.781137 -20.108768 2.648033 5.212014 15.467634 42.074901 7.220575 -3.537700 -18.750512 -2.639893 -0.279645 55.862294 -0.485546 7.023306 -0.000000 0.000003 0.000000 -0.000012 -0.000006 -0.000005 -7.678588 16.788282 4.061586 23.169153 -4.958718 1.023850 -22.344692 -6.023172 11.396173 19.222388 -8.653638 -1.872253 -0.617378 -4.540758 7.939503 -0.000001 -0.000001 0.000006 -0.000000 0.000001 -0.005543 +28.108900 75.129400 62.759600 -90.768968 3.994701 12.492156 -0.000000 0.000000 0.005545 -2.671041 5.529448 22.524531 2.804504 -3.332952 -5.643692 -8.305170 0.354095 -6.278456 0.056396 0.000431 37.160658 22.083031 3.896655 9.318832 -1.666989 -0.070121 3.129506 -1.384293 -9.283248 10.690853 0.001836 -0.000003 -0.000008 -7.189227 12.257605 5.768479 -6.010875 0.000008 -0.000016 -10.002131 -1.860177 0.378098 -15.672419 -3.346738 -2.981947 4.317368 0.333227 0.601391 8.426302 -20.905544 -7.487642 -32.957008 13.988127 9.959090 48.569851 1.283116 -3.086295 6.762858 -9.621575 1.901603 0.000002 0.000005 -0.000002 1.459700 -1.087140 0.070894 4.783912 1.282075 24.166823 -4.187119 -0.992149 -39.395384 -5.091096 -3.156964 -0.347583 -19.493175 -4.171424 5.968338 -0.000009 0.000000 -0.000002 -10.614419 5.206899 1.873319 -11.717579 5.450067 -20.208185 -15.453609 -2.143732 20.322740 66.805459 9.343194 -7.208544 -34.987787 -5.455121 -3.821727 62.228856 3.105113 4.102586 -0.177761 0.906970 -1.603262 -0.000010 -0.000005 -0.000008 -10.654576 18.684833 7.622580 27.694477 -5.434695 1.443259 -19.694323 -6.628599 11.697920 57.448892 -12.357662 4.678301 -0.615134 -4.480486 7.842852 -0.000002 0.000000 0.000003 -0.000000 0.000000 -0.005542 +33.223900 76.173200 73.221700 -91.351271 4.427676 17.133983 -0.000000 0.000000 0.005542 -3.266260 4.361304 23.450881 2.714649 -2.631733 -4.916154 -8.415270 0.436395 -7.059080 1.182622 0.002329 35.348855 20.615265 4.107072 9.500153 -0.857017 1.112147 1.862529 -1.634046 -6.134178 8.488408 0.001837 -0.000003 -0.000008 -8.205195 7.281570 8.440740 -5.640179 0.000008 -0.000016 -9.431536 -2.392430 0.149202 -15.540796 -3.232308 -2.919593 4.148658 0.338624 0.565686 -3.646834 -18.710637 -9.851012 -28.194280 11.637052 14.458956 66.158811 2.344772 -3.863438 40.943176 -6.649765 10.975315 0.000007 -0.000001 0.000004 -0.885811 -1.520495 0.363337 20.500324 -1.173329 21.794186 -6.051248 -0.619835 -38.722070 -8.794365 -3.954282 -0.567349 -22.380443 -3.332108 5.638690 -0.000008 0.000002 0.000002 -5.674565 4.542925 1.913478 -7.240912 3.725782 -20.249967 -23.467109 -5.911702 23.061956 75.188000 9.718359 -8.591139 -64.615789 -4.918911 -10.337162 83.436642 3.568290 3.668807 -0.431115 2.522966 -4.435499 -0.000009 -0.000004 -0.000003 -13.373084 17.935428 9.531901 32.288965 -5.803755 1.997317 -16.036325 -4.307381 11.441370 67.781704 -16.041463 12.333264 -0.613693 -4.406058 7.730672 -0.000000 -0.000002 0.000003 -0.000000 0.000000 -0.005542 +38.839500 76.875200 82.823100 -93.785391 5.639842 21.903484 -0.000000 0.000000 0.005544 -3.642526 1.233839 24.058604 1.946591 -1.696737 -4.195918 -8.596002 0.123086 -7.390053 3.553526 0.007383 33.494636 17.188997 3.403079 9.302224 0.341069 -0.096910 2.838979 -1.363685 -1.984854 5.250316 0.001837 -0.000004 -0.000008 -7.909660 3.365505 10.575136 -5.766079 0.000010 -0.000016 -8.267085 -3.529392 -0.325294 -14.524530 -2.330802 -2.422154 2.377365 0.069469 0.370013 -7.400372 -12.830557 -8.112210 -33.089514 11.876090 12.813956 66.884996 1.310166 -3.786241 76.346427 3.464659 15.370444 0.000007 0.000001 0.000001 -5.357953 -2.087206 0.847830 35.541169 -2.104374 18.883784 -6.540299 -1.887314 -38.584384 -9.408917 -5.371820 -0.695707 -15.734580 -2.713986 5.541368 -0.000009 0.000000 -0.000002 -1.002799 2.410209 1.959725 -4.298781 2.586397 -20.065945 -26.646692 -9.702694 23.298609 57.595864 8.545806 -5.678107 -59.323997 -5.193041 -11.687401 88.498105 1.959573 1.313288 -0.622004 4.380918 -7.671077 -0.000010 -0.000006 -0.000005 -17.968476 15.955091 10.566209 41.898402 -6.997007 3.209727 -19.421587 -0.629246 11.233234 66.794612 -20.839928 18.439969 -0.608851 -4.204294 7.355514 -0.000004 -0.000001 0.000006 -0.000000 0.000000 -0.005546 +44.839600 77.339100 91.527300 -97.471012 6.023474 26.910865 -0.000001 -0.000001 0.005539 -2.935877 -1.993714 24.148965 1.354238 -0.909670 -3.471937 -8.301778 -0.428975 -7.599353 4.914721 -0.001746 31.726806 12.595630 2.045317 8.746906 1.430878 -2.271045 4.685068 -0.567891 -0.618400 3.913967 0.001837 -0.000004 -0.000008 -6.464024 3.229944 10.699788 -5.961915 0.000009 -0.000016 -6.758325 -5.020412 -0.908563 -12.885425 -0.855966 -1.656862 -1.550012 -0.026289 -0.248981 -8.383378 -10.535143 -7.290797 -40.669948 10.716907 14.079360 72.614794 0.528832 -4.007039 72.257780 4.143766 16.754451 0.000001 0.000003 0.000003 -1.857092 -1.690677 0.264876 32.396093 -2.169881 15.617108 -6.548344 -1.743424 -33.275558 -9.543467 -6.618887 -0.796055 32.061048 1.951726 3.837108 -0.000010 0.000002 0.000004 3.813867 0.156348 1.973183 -2.355210 1.822863 -19.733899 -22.044558 -8.279626 23.860950 39.770573 6.397485 -3.357175 -42.827328 -11.257695 -8.601314 64.926959 -1.957729 -3.190338 -0.614883 4.293440 -7.508682 -0.000009 -0.000006 -0.000005 -21.213096 13.607005 9.429519 50.603089 -7.967708 4.462166 -27.507083 1.833146 11.331978 60.340002 -24.160968 18.639096 -0.589636 -3.983374 6.960353 -0.000001 -0.000004 0.000002 -0.000000 0.000001 -0.005541 +51.090000 77.632000 99.334200 -101.530385 4.559986 32.243600 -0.000000 0.000000 0.005542 -0.964160 -4.101670 23.575677 1.149007 -0.429041 -2.706677 -7.599128 -0.976854 -7.734074 4.909960 -0.004403 29.987143 7.975843 0.277548 7.804673 2.287837 -4.848246 6.936556 0.358366 -1.620346 4.159133 0.001839 -0.000003 -0.000009 -4.260648 5.930940 8.933164 -6.178755 0.000009 -0.000017 -5.361373 -6.419745 -1.413604 -11.008727 0.887106 -0.820219 -6.088189 -0.069684 -0.959962 -7.297286 -9.097520 -7.042556 -34.182078 9.575645 16.639806 68.045008 0.369572 -3.747914 56.149619 -2.871929 18.411671 0.000004 0.000005 0.000002 6.244437 -1.231928 -0.790012 17.495273 2.812932 12.120996 -8.671994 -2.348730 -22.338269 -8.271985 -6.448199 -0.702311 83.514772 2.046618 1.651287 -0.000010 0.000000 0.000004 8.620453 -1.256755 1.552038 -1.312932 1.407762 -19.332255 -17.965749 -4.243262 19.734157 24.576590 4.265293 -1.509613 -21.914529 -14.546571 -1.638854 29.556418 -2.648403 -4.761131 -0.280720 1.495930 -2.640759 -0.000010 -0.000007 -0.000001 -22.892511 11.264751 5.710637 54.449831 -8.370091 5.084378 -35.487573 2.492379 11.577971 44.438508 -22.425128 10.786347 -0.576433 -3.853365 6.757094 -0.000002 -0.000001 0.000004 0.000001 -0.000001 -0.005544 +57.499100 77.448900 106.420800 -105.075562 0.972323 37.515121 0.000003 -0.000002 0.005544 1.933741 -4.705317 22.515312 0.962856 -0.007680 -1.874688 -6.534483 -1.143284 -7.727193 4.475742 0.002130 28.247461 4.022562 -1.541691 6.708136 2.952305 -6.724068 8.272973 1.170134 -2.716928 4.376656 0.001834 -0.000003 -0.000008 -1.877815 7.827193 7.057276 -6.395593 0.000008 -0.000013 -4.621985 -7.174542 -1.669615 -9.481349 2.346027 -0.168388 -9.627983 -0.049593 -1.534177 -7.322229 -8.724429 -7.455776 -26.434772 9.799320 19.031111 49.879594 0.405561 -2.752153 47.685891 -12.843815 12.325359 0.000011 -0.000001 0.000003 7.928889 -1.149825 -1.025062 9.675876 6.487254 8.128920 -11.648979 -4.025326 -17.298369 5.796080 -5.438878 0.073146 85.450277 0.747301 3.599413 -0.000010 0.000000 -0.000003 13.387233 -1.476191 0.537281 -0.963943 1.256307 -18.885113 -14.426292 -3.008144 16.964458 20.368965 3.693589 -0.988777 -12.177309 -10.465528 1.026773 14.550769 -5.668488 -2.861886 -0.018440 0.067711 -0.130936 -0.000008 -0.000006 -0.000002 -24.268823 9.042496 0.082872 48.500043 -7.796299 4.312957 -35.951111 2.796832 11.084708 36.707615 -16.133933 6.351690 -0.588113 -3.996255 7.005544 0.000001 -0.000002 0.000003 -0.000001 0.000001 -0.005547 +63.804400 76.765300 112.585700 -105.221452 -1.148336 42.474517 0.000002 -0.000001 0.005543 1.976023 -4.601537 21.155188 0.620864 0.809065 -1.192286 -5.333538 -0.971286 -7.239684 3.685659 -0.004049 26.353849 1.075428 -2.101715 5.758538 3.066369 -6.206715 7.492321 1.658342 -3.118112 4.634872 0.001842 -0.000004 -0.000009 -0.287299 7.378517 6.210509 -6.395589 0.000011 -0.000018 -3.512116 -8.311006 -2.035815 -9.516615 2.308585 -0.186703 -11.277015 -0.014813 -1.792546 -7.556237 -9.404927 -8.024937 -22.820144 10.241884 20.720292 37.244431 -0.685877 -2.095680 38.711029 -18.063057 3.525445 0.000008 0.000004 0.000002 6.657361 -1.008197 -0.875809 2.971953 7.116464 5.712645 -16.354818 -3.413635 -16.232552 28.774508 -3.334253 1.496575 73.890687 -0.868998 5.754121 -0.000010 0.000000 -0.000002 14.389962 -1.315451 -0.717820 -0.939098 1.193786 -18.385206 -8.398987 -2.602934 13.333081 24.704762 4.430468 -1.777352 -15.293277 -8.013525 1.040835 13.234027 -6.120046 -2.171417 -0.000330 0.001368 0.002446 -0.000009 -0.000007 -0.000006 -24.658441 6.600513 -2.327183 36.717167 -6.354940 2.822142 -25.984065 2.938445 10.205918 29.581846 -11.585346 4.826837 -0.610436 -4.273155 7.482265 -0.000006 0.000000 0.000003 -0.000000 0.000000 -0.005544 +69.957100 75.507900 117.975400 -104.142057 -2.433394 47.069038 0.000001 -0.000001 0.005544 0.987361 -4.220122 19.864909 0.271664 1.720049 -0.649935 -4.335402 -0.638408 -6.444828 2.973678 -0.000945 24.397251 -0.878796 -1.587847 4.814283 3.019237 -5.230287 6.373589 1.896107 -2.925384 4.289714 0.001839 -0.000003 -0.000010 0.482658 6.522175 5.278195 -6.395589 0.000010 -0.000016 -1.870491 -10.013224 -2.545544 -10.324044 1.535873 -0.524576 -11.210285 -0.019271 -1.785711 -2.212335 -11.828464 -7.775732 -18.302081 11.220619 22.496948 23.657516 -1.563896 -1.437080 25.276437 -18.942360 -7.469674 0.000009 0.000002 0.000003 2.733952 -0.835915 -0.234115 -1.202491 6.930771 4.138041 -16.317430 -3.601504 -15.981490 37.962499 -1.308158 2.067799 70.745863 -2.704026 7.250168 -0.000006 0.000001 0.000003 13.896459 -0.944675 -1.873943 -1.137588 1.212103 -17.868482 -1.021446 -1.490830 9.259860 25.658849 4.701775 -2.108617 -18.892744 -6.377842 0.798881 13.307611 -5.973518 -1.645790 0.013146 0.001611 -0.003890 -0.000011 -0.000004 -0.000012 -24.987112 3.984064 -2.020955 24.729829 -4.486667 1.375468 -15.289088 0.797373 10.064829 23.807830 -7.652706 3.375126 -0.629234 -4.569119 7.979766 -0.000002 -0.000003 0.000006 -0.000000 0.000000 -0.005543 +75.914500 73.939200 122.681500 -102.376167 -3.075198 51.078128 -0.000000 -0.000001 0.005540 0.312397 -3.296374 18.985399 0.269014 2.266707 -0.261290 -4.233935 -0.338824 -5.424202 1.984951 -0.002151 22.440631 -1.725429 -0.687710 4.409302 2.984664 -5.224792 6.260092 1.927070 -2.074534 2.848292 0.001839 -0.000005 -0.000006 0.743951 5.849810 3.739398 -6.395600 0.000010 -0.000018 -0.511623 -11.435026 -2.934428 -10.882387 1.006173 -0.760581 -10.764880 -0.052624 -1.712381 2.861007 -13.767937 -7.339300 -8.946084 14.418024 22.541622 -0.146990 -1.530810 -0.088965 23.100466 -17.182309 -15.542833 0.000005 0.000004 0.000003 0.280672 -0.780169 0.161402 -6.702744 6.782569 3.872888 -16.239263 -2.801996 -17.065610 48.412873 -0.855133 2.652266 62.882854 -3.520193 6.382100 -0.000003 0.000001 0.000000 11.503964 -0.236899 -2.634442 -2.472489 1.580373 -17.294700 7.534384 -0.128161 5.303468 22.333211 4.311926 -1.908745 -20.292583 -5.089515 0.525880 9.275116 -5.487922 -1.565418 -0.001290 -0.000169 -0.010232 -0.000010 -0.000005 -0.000009 -25.530398 2.970015 -0.842728 18.165534 -3.157030 0.716156 -9.626204 -2.744301 10.464056 18.219366 -4.093454 1.672449 -0.655130 -4.749028 8.308247 0.000001 -0.000001 0.000000 -0.000000 0.000000 -0.005542 +81.603300 72.987000 126.618600 -99.840433 -2.404259 54.315842 -0.000000 0.000000 0.005546 0.641510 -1.656099 18.636521 1.276510 2.067828 -0.001699 -5.949227 -0.284263 -4.286524 -0.316805 -0.012474 20.483430 -1.651569 -0.052993 4.684775 2.795323 -5.777186 6.883057 1.694874 -1.494703 1.496310 0.001842 -0.000003 -0.000008 0.493047 6.007403 1.876946 -6.395594 0.000006 -0.000018 0.413410 -12.418327 -3.181918 -10.508399 1.362182 -0.604753 -9.969087 -0.118201 -1.571672 7.212385 -14.161111 -6.748203 -6.858388 14.946611 23.707691 -6.094197 -0.685889 0.238996 14.185890 -14.341304 -19.878326 0.000008 -0.000002 0.000002 -1.633946 -0.745316 0.473564 -9.064943 7.648646 5.064793 -21.941576 -0.603242 -19.584171 53.076888 -1.356021 2.952784 62.069385 -2.919151 4.064295 -0.000008 0.000000 0.000000 6.586815 0.610447 -2.795165 -5.002000 2.230358 -16.728043 13.722533 1.629695 3.591170 17.120482 3.543166 -1.451843 -18.233625 -3.784336 0.377999 6.574072 -5.915099 -1.108463 -0.001767 -0.000943 -0.016567 -0.000011 -0.000005 0.000001 -25.472525 4.266394 -0.987427 19.341474 -3.364403 0.822311 -9.718775 -3.507334 10.610932 9.254536 -2.304175 0.838547 -0.643665 -4.721032 8.258126 -0.000002 0.000000 0.000005 -0.000001 0.000001 -0.005539 +86.980800 72.748900 129.865800 -96.856854 -0.436870 56.769883 -0.000000 -0.000001 0.005542 1.257421 0.327119 18.673163 2.936106 1.047689 0.138255 -7.940237 -0.500721 -3.209089 -4.122926 -0.011260 18.740951 -0.233964 0.570882 5.403700 2.228375 -6.737294 8.122783 0.996435 -1.570900 0.775585 0.001839 -0.000004 -0.000009 -0.526527 7.028754 -0.091706 -6.395589 0.000010 -0.000013 0.742656 -12.762192 -3.261735 -9.115213 2.696488 -0.014826 -9.279048 -0.128903 -1.470866 13.168309 -12.951063 -5.806808 -14.143917 11.689741 24.942727 6.861553 -0.206109 -0.663668 -3.694129 -10.384505 -22.161638 0.000007 0.000000 -0.000001 -2.783281 -0.695430 0.658244 -3.679099 10.101016 6.284335 -31.708159 0.475926 -22.015698 50.055366 -2.167795 2.804044 62.588520 -1.640950 1.522679 -0.000016 0.000000 0.000001 -0.164621 1.238752 -2.483612 -8.215274 2.866298 -16.326748 15.674220 3.507844 4.614084 13.267494 2.867460 -1.057203 -13.536968 -2.671266 0.318777 9.501018 -6.177993 0.401092 -0.002286 -0.001357 -0.003121 -0.000010 -0.000005 -0.000008 -22.355814 5.976190 -2.192239 19.886675 -3.628936 0.902187 -11.514805 -2.361490 10.385269 -0.014117 -2.072068 0.630772 -0.634175 -4.664742 8.176916 -0.000002 -0.000001 0.000005 -0.000000 0.000000 -0.005544 +92.071500 73.041900 132.606500 -94.160947 1.919681 58.624228 -0.000000 0.000000 0.005542 0.455141 1.708603 18.941052 3.779176 -0.364970 0.161962 -8.591292 -0.639476 -2.365525 -6.156905 -0.000818 17.398372 3.165227 1.555734 6.402397 1.159354 -7.643640 9.627152 -0.127953 -1.767513 0.631025 0.001837 -0.000003 -0.000010 -2.101976 8.641907 -1.107944 -6.395591 0.000008 -0.000017 0.286494 -12.287886 -3.146494 -8.128328 3.661998 0.381061 -9.418962 0.025057 -1.509164 21.191196 -11.516023 -4.572405 -20.112207 9.988195 24.213885 13.640149 -0.360201 -1.240649 -16.900161 -6.332971 -23.146509 0.000010 0.000003 0.000001 -3.583651 -0.621986 0.766169 0.124324 13.088996 6.902772 -31.538385 -1.397931 -24.599736 43.977348 -3.388442 2.375366 39.003133 1.780626 1.604233 -0.000013 0.000000 0.000000 -7.146721 1.434079 -1.952306 -11.635042 3.324996 -16.123456 9.983581 3.112854 6.443843 15.899097 3.159696 -0.884675 -7.546371 -1.010429 0.066101 27.200844 -2.969371 4.144267 -0.002815 -0.001772 0.010320 -0.000012 -0.000005 -0.000007 -15.885862 6.331194 -3.521742 14.152330 -2.700041 0.543302 -12.281127 -1.900207 9.985144 -5.741636 -2.208335 0.276439 -0.643325 -4.725749 8.263304 -0.000000 0.000000 0.000002 -0.000000 0.000000 -0.005540 +96.911800 73.951400 134.901600 -92.055435 4.035798 60.075968 -0.000000 0.000000 0.005547 -1.297198 2.447189 19.344738 3.810073 -1.720516 0.084408 -8.509587 -0.703958 -1.702680 -6.317420 -0.001013 16.231094 8.619579 2.925888 7.608094 -0.051576 -7.596611 10.408375 -1.313674 -1.527506 0.774486 0.001842 -0.000005 -0.000008 -4.133943 9.510786 -0.465294 -6.367615 0.000007 -0.000015 -0.943555 -10.990575 -2.815502 -8.217428 3.578259 0.344688 -8.928585 0.073631 -1.429801 26.263450 -10.308294 -3.828245 -19.819513 10.986395 22.377974 9.091426 -0.628539 -1.007935 -14.996847 -5.359410 -23.071645 0.000005 0.000002 -0.000000 -2.614252 -0.303752 0.535109 -1.573601 14.725690 7.672550 -21.850123 -5.940487 -24.560619 26.162314 -4.877547 1.167211 12.251373 3.204985 6.635794 -0.000008 0.000000 0.000000 -11.775230 1.152408 -1.501281 -13.421222 3.161946 -16.179453 -3.428077 0.322628 8.006349 25.532396 4.627189 -1.456371 -6.684499 -0.753146 -0.002957 44.564829 2.357037 3.215881 -0.003635 0.002301 -0.001052 -0.000012 -0.000006 -0.000003 -6.958873 5.342800 -5.032640 2.963631 -0.668241 0.086524 -10.097578 -1.851740 9.540638 -9.423000 -2.641346 -0.237727 -0.645924 -4.850165 8.481657 -0.000001 -0.000001 0.000007 -0.000000 0.000000 -0.005539 +101.648500 75.068400 136.958600 -90.744381 5.645200 61.430000 -0.000000 0.000000 0.005543 -3.352291 2.501303 19.890926 3.250016 -2.604661 -0.097038 -7.844820 -0.704068 -1.373247 -5.113529 0.005318 14.951781 12.279367 3.996263 8.712267 -0.727138 -4.471029 7.633471 -1.656544 -1.187253 1.538153 0.001836 -0.000004 -0.000007 -5.100211 5.900060 2.387160 -6.129802 0.000011 -0.000017 -3.374911 -8.450962 -2.080251 -8.726123 3.080744 0.139476 -8.516074 0.094716 -1.357761 27.177883 -9.750583 -3.475101 -12.544768 13.645016 18.871007 -2.421102 -1.100519 -0.368000 -4.012272 -6.212479 -21.792977 0.000007 0.000001 0.000000 -0.865882 0.063755 0.148643 -3.026702 14.929171 7.903922 -12.311927 -9.969359 -21.421031 5.359173 -5.376947 0.056641 11.350598 2.922716 7.355004 -0.000007 0.000000 0.000001 -11.083251 0.551064 -1.429019 -10.900326 1.843406 -16.624832 -13.559449 1.722673 8.800485 28.854397 5.100837 -1.696711 -28.210025 -5.476145 -0.636163 60.756882 3.014847 1.693978 -0.004454 0.006371 -0.012417 -0.000008 -0.000005 -0.000003 -0.316370 4.113096 -6.357222 -6.731611 1.206669 -0.014216 -4.687671 -2.137776 9.543062 -10.753282 -2.476184 -0.805895 -0.652517 -4.928761 8.618488 -0.000002 -0.000001 0.000011 -0.000000 0.000000 -0.005542 +106.183600 75.947400 138.808100 -90.093458 6.474083 62.937722 0.000001 0.000000 0.005544 -5.497576 2.031544 20.237502 2.149524 -2.918506 -0.285260 -5.973598 -0.580051 -1.347557 -3.063288 0.003552 13.546290 13.138580 4.387498 9.544295 -0.243407 -1.032801 4.136288 -1.321678 -1.157559 2.536558 0.001841 -0.000004 -0.000010 -5.345526 1.055544 5.511435 -5.843012 0.000007 -0.000012 -6.233123 -5.543236 -1.103537 -8.771291 3.031263 0.120473 -9.191439 0.203427 -1.473867 26.824077 -10.071128 -3.223924 -3.925887 16.050099 14.311921 -12.796779 -1.671384 0.153781 8.914082 -7.896038 -18.780918 0.000005 0.000002 0.000001 -1.852617 -0.138159 0.365048 6.253302 15.873836 6.297022 -13.074434 -11.404933 -20.469793 -3.642373 -5.414540 -0.379846 5.014877 2.394742 7.702779 -0.000006 0.000000 0.000000 -7.859462 -0.066068 -1.723223 -6.930325 0.211864 -17.090115 -17.730606 4.021670 8.885728 18.553270 3.395848 -0.607551 -33.452730 -8.453363 -0.804170 66.442571 0.614915 0.415542 -0.003909 -0.008926 -0.003656 -0.000011 -0.000005 -0.000005 1.102136 4.329610 -7.505980 -7.214638 1.328137 0.008810 -1.495864 -2.244499 9.828523 -5.270260 -2.107839 -1.431913 -0.655949 -4.891926 8.557211 -0.000003 -0.000002 0.000010 -0.000000 0.000000 -0.005542 +110.425800 76.338000 140.450000 -89.796251 6.796567 64.731595 -0.000000 0.000000 0.005541 -7.663972 1.335695 20.076089 0.750691 -2.661201 -0.519807 -3.448569 -0.307744 -1.213001 -0.595122 0.006281 12.252588 12.813992 4.363880 10.129592 0.491972 -1.416392 4.652660 -0.895918 -1.427977 2.808048 0.001836 -0.000003 -0.000008 -5.074968 0.267775 6.023079 -5.864002 0.000012 -0.000016 -8.718672 -3.082586 -0.142531 -8.585245 3.216402 0.196003 -9.402960 0.214410 -1.492139 23.504474 -10.094455 -3.319283 -8.060854 15.193717 13.677791 -1.829662 -1.200132 -0.296789 25.528686 -11.972043 -9.683672 0.000007 0.000003 0.000003 -3.269569 -0.428288 0.666510 14.278559 15.819787 4.950771 -16.680939 -11.315217 -20.473941 -4.363413 -5.419144 -0.408642 -1.660503 2.172482 7.879363 -0.000009 0.000000 0.000001 -5.099920 -0.599590 -2.330621 -4.005315 -1.070941 -17.373150 -19.711673 4.183466 10.875614 14.539239 2.739666 -0.184182 -23.546034 -9.963541 0.192267 47.577824 -1.850185 -1.385381 -0.005112 0.000344 -0.000278 -0.000011 -0.000005 -0.000006 2.744845 4.773039 -8.837338 -5.744022 0.946907 0.004094 -2.641244 -2.648958 9.707714 8.258020 -2.098750 -2.076442 -0.646160 -4.771908 8.344426 -0.000003 -0.000001 0.000009 -0.000000 0.000000 -0.005542 +114.375000 76.460100 141.884500 -89.745881 6.727936 66.756743 -0.000000 0.000000 0.005541 -9.077339 0.802745 19.444690 -0.088242 -1.936132 -0.767284 -0.992945 0.048840 -0.998518 0.863876 -0.000785 11.204075 11.874776 3.995680 10.447988 1.108329 -3.932594 7.453789 -0.492916 -1.953938 2.591081 0.001832 -0.000004 -0.000009 -4.220682 2.047787 4.610820 -6.171767 0.000009 -0.000016 -10.696195 -1.188777 0.679527 -8.524451 3.280209 0.223423 -8.257857 0.028677 -1.308645 15.367837 -9.193780 -3.907482 -20.336099 11.906743 14.575200 23.212400 -0.148834 -1.480339 41.960260 -10.505108 3.226380 0.000009 0.000001 0.000003 -4.359824 -0.630000 0.878587 20.343440 14.570602 4.060411 -19.360733 -11.091784 -20.315047 -4.985974 -5.066923 -0.430918 -4.613161 2.087840 7.873991 -0.000009 0.000000 0.000000 -3.302396 -1.081407 -3.116442 -2.416225 -1.887935 -17.465675 -19.770759 4.295335 13.123482 10.859738 2.098425 0.309603 -12.748859 -10.071677 0.473661 22.736841 -2.447720 -2.692363 -0.006329 0.009617 0.003095 -0.000012 -0.000003 -0.000006 3.295444 5.217176 -6.767472 -2.538146 0.203193 -0.009974 -10.414966 -3.874644 8.045865 29.355979 -2.436162 -2.747674 -0.579558 -3.918288 6.858814 -0.000004 -0.000001 0.000003 -0.000000 0.000000 -0.005540 +118.006800 76.441800 143.141900 -89.921204 6.141757 68.912423 -0.000001 0.000000 0.005544 -9.646479 0.438204 18.498963 -0.402059 -0.955318 -0.992692 1.090111 0.395278 -0.754222 1.547734 -0.001827 10.302599 10.233218 3.462596 10.609853 1.504541 -5.096740 8.507946 0.016980 -3.855346 3.614195 0.001836 -0.000003 -0.000009 -2.681181 3.865464 2.814459 -6.367598 0.000008 -0.000018 -12.191425 0.213251 1.337116 -8.787759 3.016686 0.118825 -7.895850 -0.045569 -1.258180 7.582751 -8.953967 -4.800302 -22.842335 10.565681 13.241201 34.741064 0.277696 -2.043101 38.618081 -6.580039 6.901331 0.000010 0.000003 0.000003 -5.198973 -0.760017 1.023307 24.950012 12.645924 3.599410 -21.124404 -10.838662 -19.851289 -5.633211 -4.466343 -0.439830 -5.562920 1.993590 7.762348 -0.000009 0.000000 0.000000 -1.608546 -1.456488 -3.927481 -1.447093 -2.415199 -17.308041 -19.586433 3.947253 13.770344 9.788050 1.816449 0.557132 -6.173484 -8.694010 0.170382 7.853641 -2.763480 -2.544750 -0.006445 0.003824 -0.008098 -0.000010 -0.000005 -0.000005 2.876541 6.135576 -3.238898 2.549866 -0.784538 0.011223 -22.643228 -3.860262 7.442963 48.943028 -6.371171 -1.216519 -0.551383 -3.568154 6.250270 -0.000004 -0.000001 0.000003 0.000001 0.000000 -0.005543 +121.296800 76.301400 144.197900 -90.345067 4.806557 71.116999 -0.000001 0.000000 0.005543 -8.987551 0.267239 17.345170 -0.419019 0.002542 -1.162878 2.464134 0.670849 -0.460755 1.895622 -0.000731 9.478070 7.312281 2.689118 10.561434 1.745496 -5.386143 8.492310 0.563909 -5.146297 4.326651 0.001837 -0.000003 -0.000006 -0.784751 4.425392 1.394292 -6.423559 0.000010 -0.000020 -12.662286 0.650298 1.549994 -9.011136 2.801018 0.017807 -8.057798 -0.063249 -1.289107 1.743214 -8.926436 -5.706731 -24.150529 9.680252 12.825147 40.161738 -0.063354 -2.348516 26.486138 -6.067658 6.035532 0.000004 0.000004 0.000003 -5.829206 -0.817558 1.107076 28.468915 10.654398 3.356269 -21.997700 -10.596018 -19.112623 -6.332085 -3.895697 -0.447819 -6.022635 1.900163 7.645762 -0.000010 0.000000 0.000000 0.052717 -1.661642 -4.584403 -1.235767 -2.577258 -16.827453 -13.976116 4.417546 11.626592 8.409486 1.515406 0.248802 -6.325600 -7.440671 0.363414 2.249118 -2.509121 -2.653374 -0.007291 0.008075 -0.009577 -0.000012 -0.000007 -0.000004 2.180597 6.912651 -2.117785 8.556866 -1.809452 0.193968 -34.541861 -1.669809 7.280528 60.823982 -11.433491 3.158381 -0.537564 -3.425001 6.011736 -0.000002 0.000000 0.000006 -0.000000 0.000000 -0.005542 +124.245000 76.038900 145.113500 -90.880639 2.810786 73.253960 -0.000000 0.000000 0.005543 -6.834454 0.347817 16.081643 -0.328748 0.634305 -1.251425 2.786536 0.793245 -0.121458 1.981313 -0.003955 8.681520 3.833677 1.886016 10.340304 1.900524 -4.789378 7.617647 1.046924 -5.014910 4.168256 0.001837 -0.000004 -0.000008 1.081790 3.115552 1.079801 -6.402569 0.000009 -0.000015 -12.419010 0.425038 1.443563 -9.079313 2.734410 -0.003664 -8.421008 -0.053916 -1.338147 2.256744 -8.217484 -5.671845 -22.906405 9.620302 11.948858 36.205200 -1.359515 -2.250752 8.006430 -7.540988 1.483408 0.000007 0.000002 0.000001 -6.095539 -0.820187 1.129439 31.018095 9.030198 3.150644 -22.082627 -10.282713 -18.288335 -7.162386 -3.522654 -0.468568 -5.155047 1.942721 7.430362 -0.000009 0.000000 0.000000 1.137038 -1.705541 -5.046288 -2.196553 -2.361625 -16.082597 -7.448466 4.751676 9.324963 7.044582 1.302157 -0.097139 -8.023179 -6.430377 0.638446 -0.615501 -2.334721 -2.718652 -0.007439 0.002641 -0.000991 -0.000010 -0.000005 -0.000005 -1.331181 6.868037 -4.061939 15.391749 -2.962465 0.588184 -41.081785 0.618546 7.084830 63.561365 -12.441560 5.556706 -0.508029 -3.153485 5.540252 -0.000001 -0.000002 0.000007 -0.000000 0.000000 -0.005540 +126.918500 75.868000 145.888700 -91.338685 0.606282 75.235706 -0.000000 0.000000 0.005546 -3.672270 0.620485 14.755353 -0.080797 0.775189 -1.240742 2.240964 0.750866 0.273483 1.655419 0.002261 7.933921 0.909508 1.381557 10.079623 1.846571 -3.779466 6.265625 1.748467 -4.688412 3.931539 0.001842 -0.000005 -0.000007 3.001264 1.533435 0.936127 -6.381595 0.000010 -0.000017 -12.314729 0.328924 1.395202 -9.246468 2.573237 -0.071302 -8.520353 -0.054767 -1.356612 3.118817 -5.871173 -5.371336 -17.372219 10.112723 9.324431 23.029924 -3.240736 -1.643619 -6.382334 -6.970676 -3.186369 0.000009 0.000002 0.000002 -5.981704 -0.791104 1.103064 32.799914 8.033832 2.842507 -21.656525 -9.852371 -17.565532 -8.085742 -3.456013 -0.505978 -2.521154 2.215122 7.106911 -0.000009 0.000000 0.000000 1.148954 -1.646446 -5.292688 -4.386259 -1.866108 -15.164261 -1.258749 4.746322 7.087038 5.870516 1.160793 -0.323565 -9.470947 -5.540591 0.748829 -2.572638 -2.245905 -2.594169 -0.007606 -0.002795 0.007598 -0.000011 -0.000005 -0.000005 -3.611078 6.881856 -6.223065 17.605760 -3.357841 0.795914 -39.806424 1.985135 6.473006 58.891168 -11.143712 5.835569 -0.475517 -2.924756 5.115189 -0.000002 -0.000001 0.000005 -0.000000 0.000000 -0.005540 +129.280600 75.886300 146.541900 -91.572100 -1.143559 76.981810 -0.000000 0.000000 0.005544 -0.851861 0.862532 13.469605 0.160994 0.626069 -1.130773 1.486457 0.634484 0.701989 1.190963 -0.006015 7.270248 -1.369429 1.112863 9.786535 1.064199 -2.689208 4.757937 3.086395 -4.296761 3.682892 0.001837 -0.000004 -0.000010 4.829146 0.099211 0.795310 -6.381598 0.000011 -0.000015 -12.285889 0.299916 1.379911 -9.461876 2.369452 -0.158807 -8.335013 -0.066852 -1.342093 3.602389 -3.280347 -4.991469 -8.158021 10.751759 5.184278 3.190453 -5.106780 -0.323283 -6.717236 -5.152675 -5.970800 0.000007 0.000001 0.000002 -4.905981 -0.693086 0.957586 30.197045 7.394213 2.845184 -20.550409 -9.120205 -16.904682 -8.256789 -3.616585 -0.519337 7.764690 3.583813 6.143225 -0.000008 0.000000 0.000000 -0.439968 -1.422227 -5.288278 -7.680116 -1.148155 -14.083971 3.447180 4.383039 5.069190 4.598145 1.018516 -0.442304 -9.335295 -4.559918 0.724414 -4.156815 -2.286065 -2.237267 -0.008450 0.001455 0.006116 -0.000012 -0.000005 -0.000004 -4.888885 7.382064 -6.535777 16.529077 -3.251436 0.793746 -32.359100 1.858704 5.665942 48.090600 -9.615638 4.605641 -0.440002 -2.694143 4.739532 0.000001 -0.000002 0.000006 -0.000000 0.000000 -0.005543 +131.356000 76.258700 147.072900 -91.573708 -2.158714 78.442007 -0.000000 0.000000 0.005543 0.547839 0.898570 12.327478 0.415122 0.363752 -0.932355 1.222881 0.492374 1.125500 0.726446 -0.009253 6.690459 -3.177208 0.916862 9.412672 -0.414911 -1.511065 3.160346 4.844260 -3.762354 3.507614 0.001842 -0.000004 -0.000009 6.339757 -1.114645 1.029704 -6.381593 0.000011 -0.000016 -11.929573 -0.023686 1.222610 -9.513686 2.317530 -0.178937 -8.742245 -0.060740 -1.377054 6.193610 -1.749123 -4.177437 -4.734899 10.168249 2.851423 -4.107943 -5.660452 0.083660 -7.365275 -4.723617 -7.006599 0.000007 0.000000 0.000003 -3.759409 -0.607780 0.810082 23.435895 7.029895 3.225956 -25.185800 -6.332574 -16.885717 5.307078 -3.850571 0.102570 22.527036 5.181420 2.798201 -0.000008 0.000000 0.000000 -4.349454 -1.061400 -4.939920 -12.522994 -0.198934 -12.817189 7.335569 4.055683 3.317486 1.982587 0.614111 -0.417196 -7.816609 -3.488466 0.609618 -4.817951 -2.390831 -1.774791 -0.009303 0.005706 0.004636 -0.000012 -0.000005 -0.000005 -7.780958 8.173030 -6.346754 15.450115 -3.160867 0.759372 -21.350662 0.327445 5.218452 31.421206 -7.722399 2.155441 -0.424467 -2.473573 4.353966 -0.000003 -0.000001 0.000004 -0.000000 0.000000 -0.005543 +133.168800 76.930100 147.536800 -91.462571 -2.713535 79.641109 -0.000000 0.000000 0.005543 0.687049 0.752348 11.360737 0.705182 0.096085 -0.670230 1.449875 0.354149 1.446966 0.197796 -0.001195 6.173644 -4.503787 0.774120 8.975554 -2.206956 -0.390196 1.666087 6.435827 -3.150273 3.407545 0.001841 -0.000006 -0.000005 7.181558 -2.103222 1.491184 -6.381593 0.000011 -0.000014 -11.022946 -0.878668 0.818787 -9.079313 2.734415 -0.003665 -9.370212 -0.071739 -1.398293 8.978664 -1.320727 -3.522133 -4.056996 10.158198 1.907137 -4.830531 -5.652092 0.050518 -7.748870 -5.230658 -7.235422 0.000007 0.000003 0.000004 -3.898973 -0.623457 0.830690 18.191551 7.014468 3.468303 -31.991718 -3.626878 -15.170492 20.723275 -3.119580 0.964011 41.044266 2.339202 -2.467606 -0.000009 0.000000 0.000000 -9.186200 -0.614678 -4.327856 -17.831116 0.769517 -11.403441 10.874110 3.825937 1.797278 -1.836081 -0.044236 -0.333936 -5.443665 -2.376220 0.446128 -4.547433 -2.525891 -1.273736 -0.010135 0.009957 0.003156 -0.000012 -0.000006 -0.000006 -8.611189 8.150372 -6.255991 12.613918 -2.653306 0.590851 -11.368947 -0.992112 4.969198 12.638536 -6.159908 0.264516 -0.407521 -2.295667 4.014792 -0.000001 -0.000001 0.000005 -0.000000 0.000000 -0.005542 +134.694700 77.278000 147.933600 -91.300188 -2.910974 80.710560 -0.000000 0.000000 0.005541 0.218677 0.565090 10.461353 0.683110 -0.021056 -0.393196 1.592259 0.263600 1.640545 -0.083647 0.002124 5.635895 -4.725185 0.811925 8.521954 -3.987167 0.442897 0.518058 6.879435 -2.704091 3.344458 0.001832 -0.000003 -0.000011 6.262363 -2.969306 1.846381 -6.192748 0.000011 -0.000019 -9.077449 -2.735183 0.003903 -7.512458 4.269658 0.618630 -9.534642 -0.091008 -1.347481 10.391903 -1.293381 -2.932375 -2.505060 10.161858 1.234363 -5.538847 -5.487740 0.026311 -4.886497 -5.059980 -6.956605 0.000006 0.000003 0.000003 -3.906568 -0.635151 0.837563 13.952628 6.884450 3.515705 -29.841076 -3.344985 -12.885569 18.421401 -2.254655 0.875351 50.969904 -0.605771 -2.982865 -0.000009 0.000000 0.000000 -11.799126 -0.174651 -3.692005 -20.594648 1.329775 -10.037992 12.251773 3.262736 0.570385 -3.085358 -0.253894 -0.282591 -3.766268 -1.452040 0.282964 -3.765385 -2.709597 -0.762547 -0.010982 0.014208 0.001675 -0.000009 -0.000005 -0.000005 -5.966431 7.479693 -7.032921 9.733306 -2.118423 0.461799 -7.287563 -0.835663 4.611145 2.651648 -5.856156 -0.387834 -0.387951 -2.124792 3.745249 -0.000002 0.000000 0.000002 -0.000000 0.000000 -0.005542 +136.000900 77.387900 148.287700 -91.121839 -2.887961 81.711104 -0.000000 0.000000 0.005544 -0.220176 0.443150 9.546362 0.354003 -0.102125 -0.113259 1.300923 0.176915 1.751050 -0.195951 0.002868 5.126128 -4.896722 0.802555 8.039047 -4.794110 0.724167 -0.023803 6.307477 -2.389213 3.139153 0.001839 -0.000004 -0.000009 3.712834 -3.622602 2.053743 -5.710118 0.000010 -0.000014 -6.387710 -5.381987 -1.043071 -4.933902 6.854351 1.559981 -9.462943 -0.119609 -1.269200 11.748108 -1.347909 -2.376395 -1.110699 10.085464 0.657568 -6.252502 -5.260472 0.006750 -1.567879 -4.850581 -6.625055 0.000006 0.000001 0.000003 -3.858585 -0.645146 0.838674 10.512905 6.893256 3.375189 -18.883805 -4.219101 -13.619239 8.310404 -2.283873 0.352256 33.247599 1.118775 0.127405 -0.000009 0.000000 0.000000 -12.291171 0.272626 -3.096296 -21.048024 1.612855 -8.774914 12.025175 2.517214 -0.493810 -2.366517 -0.123481 -0.247670 -2.705312 -0.727470 0.128379 -2.652487 -2.889328 -0.260691 -0.011097 0.008416 -0.009519 -0.000011 -0.000005 -0.000006 -4.214990 6.943220 -7.676513 8.086199 -1.790034 0.390775 -5.112079 -0.673023 4.244636 -2.444853 -5.563528 -0.690099 -0.347598 -1.947085 3.425976 -0.000001 0.000000 0.000006 -0.000000 0.000000 -0.005543 +137.106000 77.332900 148.598600 -90.939195 -2.703380 82.647074 -0.000000 0.000000 0.005543 -0.454161 0.392067 8.596064 -0.027393 -0.165523 0.185804 0.679369 0.107558 1.801846 -0.361438 -0.000101 4.654125 -5.354332 0.699758 7.479521 -4.571059 0.714544 -0.123413 5.091071 -2.100181 2.878630 0.001836 -0.000003 -0.000007 0.270611 -3.751139 2.364880 -5.019197 0.000011 -0.000016 -3.246510 -8.584746 -2.125154 -2.197885 9.669723 2.444361 -9.068165 -0.141628 -1.141550 13.743223 -1.407476 -2.005090 -1.075677 9.843432 0.313266 -6.824791 -4.991038 0.012239 0.333412 -4.717116 -6.425860 0.000007 0.000003 0.000002 -4.351034 -0.675992 0.896906 8.420698 6.855687 3.030627 -8.329553 -5.134264 -14.812681 -1.775154 -3.226652 -0.186557 12.845343 2.230327 3.251097 -0.000009 0.000000 0.000000 -11.062819 0.696242 -2.540230 -19.633377 1.704632 -7.575166 10.799148 1.720513 -1.473649 -0.520079 0.205835 -0.216405 -1.971368 -0.000419 -0.013995 -1.385864 -3.168857 0.226622 -0.000009 0.000000 0.000002 -0.000012 -0.000005 -0.000007 -2.954244 6.494353 -8.323611 7.059656 -1.606351 0.368639 -4.052442 -0.477842 3.911917 -4.918794 -5.357630 -0.846139 -0.324991 -1.788438 3.151589 -0.000003 -0.000001 0.000006 -0.000000 0.000000 -0.005542 +138.064300 77.113200 148.879400 -90.765888 -2.379109 83.543078 -0.000000 0.000000 0.005543 -0.525844 0.399250 7.652784 -0.237263 -0.159685 0.410670 -0.005827 0.088058 1.844921 -0.614110 0.001322 4.227460 -5.642495 0.580683 6.884336 -3.822574 0.721511 0.061540 3.409433 -1.672139 2.730922 0.001836 -0.000003 -0.000006 -3.433918 -3.051967 3.320739 -4.165851 0.000008 -0.000013 0.207122 -12.193774 -3.123344 -0.275721 11.689033 2.997321 -8.114342 -0.146821 -0.980766 14.769575 -1.395855 -1.760138 -1.216033 9.405785 0.119588 -7.222789 -4.717886 -0.005150 0.520029 -4.538775 -6.379766 0.000007 0.000002 0.000002 -5.115084 -0.700620 0.975440 7.582070 6.420015 2.505872 -3.292648 -4.934823 -15.050928 -6.123430 -4.285618 -0.463441 5.939051 2.739798 3.882163 -0.000009 0.000000 0.000000 -9.247642 1.097605 -1.989051 -17.483604 1.756988 -6.408010 8.832257 0.936888 -2.406771 2.174826 0.683126 -0.225697 -1.538575 0.648482 -0.135739 -0.094453 -3.445394 0.685853 -0.000005 0.000001 -0.000000 -0.000011 -0.000005 -0.000004 -2.363826 6.200263 -8.950211 6.914720 -1.581946 0.378127 -3.616006 -0.219803 3.644419 -6.588593 -5.212719 -0.944001 -0.303867 -1.665149 2.933464 -0.000001 -0.000002 0.000006 -0.000000 0.000000 -0.005542 +138.900500 76.771400 149.123500 -90.595288 -1.897757 84.381817 -0.000000 0.000000 0.005542 -0.646571 0.406270 6.675205 -0.279709 -0.102824 0.549426 -0.502979 0.096207 1.907420 -0.810952 0.008388 3.891738 -5.766503 0.496143 6.304043 -2.822097 0.690143 0.521656 1.601596 -1.052040 2.575348 0.001842 -0.000003 -0.000006 -6.611846 -1.903280 4.772115 -3.312509 0.000011 -0.000016 3.307391 -15.494866 -3.847113 0.605693 12.621447 3.228948 -6.764605 -0.161295 -0.773286 14.256513 -1.300271 -1.599512 -0.893989 8.830062 -0.007570 -7.434319 -4.478115 0.011588 -0.665692 -4.224176 -6.401206 0.000007 0.000004 0.000003 -5.478656 -0.669261 1.004058 7.444011 5.310948 1.813022 -0.899906 -3.916898 -14.108089 -6.802141 -4.460771 -0.500285 0.859748 1.950903 4.101866 -0.000008 0.000000 0.000001 -7.101160 1.482490 -1.443064 -14.868690 1.805176 -5.257098 6.458047 0.217874 -3.321203 5.343490 1.212220 -0.246709 -1.483985 1.214940 -0.239784 1.115329 -3.713360 1.104134 -0.000000 0.000001 0.000000 -0.000011 -0.000005 -0.000005 -2.507188 6.056897 -9.506951 7.830324 -1.713959 0.405486 -3.812343 0.112811 3.407580 -7.879110 -5.099917 -1.004026 -0.282270 -1.541944 2.715304 -0.000002 -0.000001 0.000000 -0.000000 0.000000 -0.005543 +139.663500 76.557800 149.331100 -90.451179 -1.320932 85.169266 -0.000000 0.000000 0.005543 -0.672449 0.450374 5.672124 -0.147063 -0.076921 0.587069 -0.979274 0.107373 2.025837 -1.006834 0.002456 3.667931 -5.745417 0.430002 5.807776 -1.722187 0.570687 0.998288 0.053958 -0.741014 2.592302 0.001837 -0.000002 -0.000009 -8.444761 -0.850446 5.889978 -2.529117 0.000009 -0.000017 5.161378 -17.284917 -4.102886 0.884233 12.739044 3.344346 -5.467493 -0.167972 -0.597078 13.189941 -1.127208 -1.465496 -0.356390 8.192855 -0.124833 -7.520110 -4.227133 0.037785 -3.306619 -3.769167 -6.489725 0.000007 0.000002 0.000002 -5.481246 -0.552883 0.953572 7.053144 4.028957 1.163264 0.830318 -2.799574 -12.893391 -7.366467 -4.260682 -0.510957 -2.344654 0.869645 4.034346 -0.000010 0.000001 0.000000 -4.735698 1.801672 -0.940704 -11.931091 1.831788 -4.156097 4.871331 -0.306207 -4.220543 6.852096 1.464406 -0.270508 -0.939652 1.816744 -0.326652 2.178134 -3.892513 1.461417 -0.000007 0.000000 0.000001 -0.000012 -0.000005 -0.000005 -2.301111 5.732100 -10.083062 7.708121 -1.667646 0.398933 -3.658478 0.368973 3.183125 -8.770013 -5.041996 -1.054793 -0.260429 -1.446347 2.547795 -0.000002 -0.000002 0.000005 -0.000000 0.000000 -0.005543 +140.353300 76.515000 149.477600 -90.337346 -0.761532 85.905781 -0.000000 0.000000 0.005543 -0.667187 0.469842 4.664984 0.076764 -0.075829 0.524039 -1.266938 0.126264 2.178914 -1.098023 0.003714 3.549028 -5.574591 0.408137 5.410126 -0.749722 0.256423 1.533721 -0.993765 -0.799158 2.735126 0.001837 -0.000002 -0.000011 -8.927393 0.048666 6.397820 -1.745707 0.010393 0.009355 6.337365 -16.790077 -3.462447 1.299006 11.558064 3.843429 -4.170344 -0.170659 -0.420764 11.451372 -0.896477 -1.393928 0.242289 7.535732 -0.180291 -7.385461 -4.003906 0.041383 -5.895796 -3.341176 -6.500274 0.000007 0.000000 0.000003 -5.367420 -0.385904 0.888036 6.259321 2.815874 0.622913 1.922218 -2.118946 -11.843936 -7.563749 -3.842935 -0.499984 -4.465464 1.853467 4.317372 -0.000009 0.000000 0.000000 -2.373396 2.083277 -0.464315 -9.034276 1.881872 -3.114640 3.545548 -0.664961 -4.817848 7.675390 1.585751 -0.275039 -0.460360 2.464058 -0.376445 3.434437 -4.165253 1.752541 -0.000000 0.000001 0.000002 -0.000012 -0.000005 -0.000005 -1.860848 5.311786 -10.636411 6.975796 -1.524193 0.351425 -3.358833 0.548982 2.968617 -8.776901 -5.034875 -1.069389 -0.252276 -1.349975 2.380293 -0.000002 -0.000001 0.000005 -0.000000 0.000000 -0.005543 +140.988100 76.612700 149.563000 -90.252219 -0.318500 86.592046 -0.000000 0.000000 0.005542 -0.905756 0.471447 3.659843 0.174808 -0.090480 0.389251 -1.112745 0.121438 2.361319 -0.768612 0.003000 3.507041 -5.169816 0.436765 5.075470 -0.217808 -0.193785 2.042572 -1.573052 -1.123419 2.937548 0.001841 -0.000003 -0.000008 -8.933869 0.746044 6.356501 -1.123196 0.036432 0.032701 7.954531 -14.314430 -1.763638 2.849194 8.897578 5.289457 -2.870578 -0.139186 -0.261923 9.062867 -0.658956 -1.413787 0.680433 6.947696 -0.093934 -6.921484 -3.764927 0.063558 -6.664629 -3.104003 -6.367165 0.000007 0.000000 0.000003 -5.275967 -0.201499 0.814142 5.124878 1.741546 0.201532 2.742613 -1.444425 -10.986839 -7.528868 -3.426940 -0.470134 -5.530709 2.433612 4.497819 -0.000009 0.000000 0.000000 -0.272387 2.304795 -0.037706 -6.488836 1.950693 -2.147967 -1.072933 -1.025576 -3.663048 12.061469 2.371196 -0.458759 -1.165598 3.173695 -0.390697 5.335118 -4.761817 1.956442 -0.000003 0.000000 0.000001 -0.000010 -0.000005 -0.000005 -1.455210 4.975028 -11.125430 6.280312 -1.368269 0.319968 -3.089549 0.649820 2.762939 -7.702619 -5.047564 -1.037940 -0.243851 -1.253628 2.212794 -0.000004 -0.000002 0.000005 -0.000000 0.000000 -0.005543 +141.567900 76.893500 149.624100 -90.193329 -0.006468 87.221735 -0.000000 0.000000 0.005543 -1.128714 0.449512 2.707102 0.167873 -0.102024 0.212526 -0.832151 0.108537 2.544265 -0.228898 0.001038 3.507021 -4.482002 0.520713 4.783223 -0.209551 -0.757258 2.482686 -1.696023 -1.586910 3.027990 0.001839 -0.000003 -0.000009 -8.765531 1.095610 5.640934 -0.927367 0.062390 0.056136 9.359967 -10.733818 0.441895 5.646134 5.768362 7.640208 -1.654276 -0.102633 -0.113603 6.514509 -0.445892 -1.478145 0.938458 6.432375 0.062477 -6.276281 -3.509254 0.093799 -5.466845 -3.053330 -6.097188 0.000007 0.000003 0.000003 -5.303537 -0.027640 0.741186 4.187424 0.840361 -0.101999 3.236016 -0.747858 -10.192509 -7.330081 -3.061426 -0.445424 -6.126902 2.056286 4.333665 -0.000008 0.000000 0.000001 1.309349 2.491706 0.325730 -4.617841 2.032115 -1.286974 -6.564340 -1.567019 -1.112342 17.349205 3.284014 -0.752975 -2.618356 2.865862 -0.323581 7.383309 -3.875462 1.823865 -0.000003 0.000001 0.000001 -0.000011 -0.000005 -0.000006 -0.897072 4.631079 -11.548389 5.293629 -1.169027 0.276896 -2.731383 0.648677 2.559539 -5.603362 -5.091229 -0.971351 -0.235129 -1.157304 2.045281 -0.000002 -0.000002 0.000008 -0.000000 0.000000 -0.005543 +142.068400 77.296300 149.642400 -90.143821 0.166412 87.809203 -0.000000 0.000000 0.005542 -1.142170 0.435632 1.780389 0.195873 -0.112167 0.021937 -0.719263 0.089988 2.748529 0.241001 -0.005088 3.535016 -3.541220 0.688750 4.542178 -0.438431 -1.414800 2.781815 -1.567442 -2.174772 2.902506 0.001841 -0.000003 -0.000008 -8.487757 0.895828 4.041890 -1.522000 0.123454 0.113738 9.947290 -6.631860 2.832573 9.613690 3.171913 10.851594 -0.739318 -0.088504 0.016540 4.547317 -0.264092 -1.517073 1.071165 5.936550 0.142586 -5.675155 -3.236215 0.119718 -4.589761 -2.993694 -5.773563 0.000007 0.000002 0.000003 -5.201367 0.101236 0.681315 3.067447 0.163646 -0.268749 3.603463 -0.270243 -9.424141 -6.951914 -2.657061 -0.409288 -6.559467 1.678924 4.010825 -0.000010 0.000000 0.000000 2.057607 2.607224 0.602993 -3.721089 2.142489 -0.555923 -10.580169 -2.155636 1.483218 21.035625 3.862545 -1.013275 -5.446929 1.162308 -0.162220 10.228264 -1.347746 1.309698 -0.000000 0.000002 0.000002 -0.000011 -0.000005 -0.000005 -0.319735 4.347176 -11.919437 4.286261 -0.967009 0.237470 -2.390853 0.568954 2.364862 -2.513192 -5.119368 -0.857237 -0.205578 -1.071902 1.887887 0.000000 -0.000001 0.000003 -0.000000 0.000000 -0.005543 +142.526200 77.668700 149.636300 -90.103289 0.123057 88.333702 -0.000000 0.000000 0.005543 -1.058414 0.444327 0.912186 0.314766 -0.122519 -0.168461 -0.606307 0.071842 2.952833 0.457849 0.001354 3.563003 -2.439385 0.775485 4.258098 -0.767319 -1.841557 2.961223 -1.379532 -2.433928 2.704749 0.001841 -0.000003 -0.000008 -8.250618 0.932534 2.891576 -2.452440 0.183071 0.172869 10.615990 -3.061031 5.060966 13.901117 0.447529 14.582857 -0.171810 -0.067478 0.106057 3.502966 -0.092085 -1.474093 1.084758 5.455920 0.087736 -5.270872 -2.966957 0.134294 -4.173982 -2.913352 -5.420141 0.000006 0.000002 0.000004 -5.005554 0.157879 0.620828 2.070436 -0.243920 -0.311830 3.893865 -0.067262 -8.639952 -6.544911 -2.241238 -0.373798 -6.776800 1.487891 3.588837 -0.000009 0.000000 0.000000 2.021454 2.701418 0.784631 -3.812700 2.238504 0.034370 -13.109176 -2.604631 2.935987 23.277333 4.212370 -1.187646 -9.585896 -0.812649 -0.076389 13.944468 0.901138 0.707792 -0.000007 0.000001 -0.000000 -0.000008 -0.000004 -0.000004 0.146557 4.218001 -12.222568 3.747738 -0.860267 0.207074 -2.238340 0.467877 2.186703 0.739623 -5.114260 -0.742673 -0.189735 -0.985579 1.730589 -0.000001 -0.000001 0.000010 -0.000000 0.000000 -0.005543 +142.929100 77.937200 149.642400 -90.080913 -0.101398 88.802325 -0.000000 0.000000 0.005543 -0.974437 0.440341 0.127128 0.559395 -0.164901 -0.326285 -0.374412 0.057642 3.108144 0.360549 -0.011707 3.555999 -1.270719 0.811090 3.939122 -1.190520 -1.786370 2.804698 -1.164464 -2.227751 2.380079 0.001842 -0.000003 -0.000010 -8.065392 1.040355 2.350407 -2.935240 0.229085 0.246733 10.856848 -1.008705 6.390155 16.417111 -1.564469 16.935201 0.153163 -0.080605 0.156858 3.073705 0.049501 -1.369979 1.069966 4.992187 -0.042536 -5.056935 -2.694055 0.139956 -3.842231 -2.809721 -5.048186 0.000007 0.000002 0.000003 -4.758577 0.112329 0.613734 1.454743 -0.409180 -0.303895 4.047243 -0.052304 -7.787276 -6.260673 -1.855578 -0.348298 -6.759389 1.542936 3.035106 -0.000009 0.000000 0.000000 1.481509 2.748597 0.899586 -4.591121 2.315262 0.499451 -14.030775 -2.711158 4.141509 22.914941 4.142522 -1.179586 -12.459229 -2.208202 -0.042952 17.109619 1.615866 0.230993 -0.000007 0.000001 0.000001 -0.000012 -0.000005 -0.000005 0.990721 3.997744 -12.495047 3.028373 -0.735157 0.180300 -2.044901 0.410666 2.015714 2.448599 -5.108701 -0.711898 -0.173663 -0.899298 1.573273 -0.000001 -0.000002 0.000004 -0.000000 0.000000 -0.005542 +143.277000 78.102000 149.685100 -90.059964 -0.472573 89.026263 -0.000000 0.000000 0.005543 -0.806544 0.450532 -0.359922 0.838873 -0.211388 -0.448987 -0.102016 0.072285 3.226947 0.100518 0.000277 3.507011 0.061803 0.803309 3.600169 -1.618175 -0.939403 1.993355 -0.882823 -1.276399 1.646736 0.001839 -0.000004 -0.000008 -7.551881 1.005831 2.145981 -2.963456 0.276728 0.318987 10.449248 -0.368689 6.771298 15.827664 -3.647852 16.600100 0.228003 -0.090289 0.178645 3.168602 0.157323 -1.202960 1.039934 4.527195 -0.199581 -5.024116 -2.438703 0.158919 -3.539874 -2.690147 -4.698422 0.000007 0.000002 0.000004 -4.409093 -0.048591 0.614495 0.970622 -0.444356 -0.272347 4.107312 -0.052766 -6.911992 -6.045956 -1.533388 -0.330145 -6.275754 1.632669 2.411444 -0.000009 0.000000 0.000000 0.514259 2.787891 1.157938 -5.936999 2.366957 0.882792 -13.305313 -2.410657 5.889293 19.649804 3.604922 -0.968903 -12.415454 -3.097706 0.118890 18.318383 1.432841 -0.208287 -0.000000 0.000000 0.000000 -0.000010 -0.000005 -0.000007 1.908770 3.823176 -12.538371 2.439593 -0.646720 0.178519 -1.851629 0.352873 1.844919 3.118512 -5.068960 -0.731988 -0.157207 -0.821696 1.446007 -0.000001 -0.000001 0.000004 -0.000000 0.000000 -0.005543 +143.570000 78.211900 149.709500 -90.026003 -0.927888 88.956723 -0.000000 0.000000 0.005543 -0.498810 0.444671 -0.489915 1.013546 -0.234826 -0.513597 0.044832 0.077124 3.289997 -0.102798 0.002018 3.402097 1.334034 0.739253 3.225940 -1.944759 -0.014066 1.187818 -0.480107 -0.206287 0.933375 0.001836 -0.000003 -0.000008 -6.486066 1.173874 2.231229 -3.005665 0.317773 0.356966 9.855349 0.356337 7.202349 14.809734 -6.362057 15.891104 0.060945 -0.103750 0.160043 3.758328 0.323356 -0.982254 0.925145 4.084558 -0.379745 -5.099053 -2.235401 0.172411 -3.315821 -2.569807 -4.371754 0.000007 0.000004 0.000003 -3.987326 -0.237970 0.625687 0.567962 -0.370578 -0.231669 4.069469 -0.048369 -6.099639 -5.838627 -1.287662 -0.316580 -5.196737 1.704195 1.800097 -0.000009 0.000000 0.000000 -0.845143 2.804333 1.637545 -7.745195 2.400726 1.214374 -11.990271 -1.885690 7.919482 15.116161 2.829520 -0.672492 -10.493067 -3.143309 0.249435 18.104057 0.971027 -0.450018 0.000002 0.000001 0.000001 -0.000013 -0.000004 -0.000004 2.844593 3.744194 -12.293605 1.828634 -0.575153 0.198518 -1.525144 0.269885 1.666952 3.226341 -5.050199 -0.774016 -0.140564 -0.744127 1.318715 -0.000002 -0.000001 0.000006 -0.000000 0.000000 -0.005543 +143.808000 78.285200 149.727800 -89.992884 -1.362316 88.705580 -0.000000 0.000000 0.005543 -0.065161 0.439009 -0.373555 0.985326 -0.261118 -0.530263 0.003291 0.068508 3.304403 -0.166454 0.012336 3.241230 2.432215 0.636780 2.827419 -2.188850 0.316332 0.972084 -0.060517 0.272485 0.770267 0.001839 -0.000004 -0.000008 -4.997669 1.602977 2.671436 -3.096803 0.349020 0.405582 8.639009 1.497450 7.886036 14.005842 -8.543730 15.293062 -0.252028 -0.115182 0.124379 4.668130 0.532940 -0.738968 0.752764 3.642362 -0.591808 -5.232887 -2.079677 0.182593 -3.148449 -2.449332 -4.046510 0.000007 0.000002 0.000003 -3.419676 -0.423418 0.622351 0.181304 -0.251616 -0.158756 3.765519 -0.039410 -5.496935 -5.667127 -1.122730 -0.308381 -2.061833 1.711003 1.281153 -0.000008 0.000000 0.000000 -2.643374 2.728568 2.178066 -9.958692 2.380523 1.430444 -10.792015 -1.484234 9.359979 11.869854 2.246592 -0.480551 -8.863965 -2.850406 0.281982 16.845436 1.240088 -0.609014 -0.000003 0.000001 0.000001 -0.000011 -0.000006 -0.000005 3.583521 3.750217 -11.855044 1.537704 -0.535734 0.213289 -1.394831 0.202615 1.501877 2.961574 -5.061272 -0.848884 -0.123771 -0.666594 1.191406 -0.000002 -0.000001 0.000005 -0.000000 0.000000 -0.005543 +143.991200 78.321800 149.740000 -89.994440 -1.698124 88.376798 -0.000000 0.000000 0.005543 0.368428 0.420282 -0.153167 0.852169 -0.289063 -0.519590 -0.143687 0.065886 3.283238 -0.151715 -0.000861 3.080354 3.327795 0.500577 2.445581 -2.284842 0.210518 1.130295 0.344689 0.308088 0.958004 0.001837 -0.000004 -0.000009 -3.298198 2.103803 3.141719 -3.222945 0.379927 0.454470 6.890056 2.956879 8.808113 13.473772 -10.127915 14.883030 -0.636419 -0.149757 0.094175 5.695203 0.772497 -0.483591 0.566363 3.236295 -0.806525 -5.394760 -1.925950 0.178398 -2.960259 -2.362277 -3.735455 0.000006 0.000002 0.000003 -2.733143 -0.539082 0.569417 -0.165624 -0.186902 -0.095831 3.132782 -0.023328 -5.047955 -5.498951 -0.992559 -0.302204 3.244328 1.655257 0.827234 -0.000008 0.000000 0.000000 -4.881488 2.450989 2.565891 -12.518445 2.204881 1.407984 -9.873720 -1.095980 10.002241 10.523221 2.006246 -0.401757 -7.829939 -2.777107 0.286144 14.394388 0.522932 -0.600701 -0.000003 0.000001 0.000001 -0.000010 -0.000004 -0.000006 4.208360 3.767272 -11.340293 1.246753 -0.496393 0.228265 -1.242135 0.108786 1.351858 2.409474 -5.032642 -0.914018 -0.107907 -0.599357 1.054613 -0.000002 -0.000001 0.000006 -0.000000 0.000000 -0.005543 +144.137600 78.340100 149.746100 -89.994160 -1.915068 88.076040 -0.000000 0.000000 0.005543 0.718164 0.417152 0.069827 0.663057 -0.316530 -0.509277 -0.311616 0.062121 3.262088 -0.109075 -0.012645 2.891507 3.962666 0.377578 2.072334 -2.054860 -0.068209 1.382961 0.606793 0.134811 1.198893 0.001842 -0.000004 -0.000008 -1.590499 2.425759 3.326663 -3.348930 0.390103 0.484520 4.841691 4.536899 9.888546 13.184814 -11.207764 14.651094 -1.034725 -0.183929 0.062104 6.686296 1.015573 -0.232327 0.378369 2.829634 -1.043421 -5.554035 -1.800044 0.173467 -2.701959 -2.292986 -3.423839 0.000007 0.000002 0.000003 -1.976699 -0.552236 0.475822 -0.649870 -0.241948 -0.023915 2.688599 -0.020786 -4.577835 -5.284411 -0.817631 -0.293287 6.210431 1.565127 0.507884 -0.000009 0.000000 0.000000 -7.515214 1.965576 2.662356 -15.369611 1.910802 1.122907 -9.549872 -0.823478 10.390597 10.252352 1.943934 -0.374640 -6.821368 -2.818180 0.268976 11.502790 -0.897194 -0.576574 -0.000000 0.000001 0.000003 -0.000012 -0.000006 -0.000005 4.697253 3.759199 -10.877576 0.908416 -0.433360 0.223854 -1.069380 0.042747 1.198094 1.695601 -5.021705 -0.979145 -0.105817 -0.530959 0.918054 -0.000002 0.000000 0.000004 -0.000000 0.000000 -0.005543 +144.235300 78.327900 149.727800 -89.975375 -1.978712 87.922784 -0.000000 0.000000 0.005542 0.921014 0.415833 0.131669 0.452950 -0.347179 -0.464362 -0.450758 0.044929 3.220700 -0.046541 -0.002587 2.702662 4.288344 0.265171 1.736013 -1.379184 -0.475397 1.692830 0.663807 -0.209916 1.472574 0.001839 -0.000004 -0.000008 -0.137641 2.545693 3.264246 -3.391034 0.404792 0.489089 2.728223 6.069205 11.033807 13.168164 -11.745209 14.633486 -1.431585 -0.199610 0.019575 7.550549 1.258750 0.015996 0.246233 2.449583 -1.272004 -5.711848 -1.688652 0.182281 -2.408318 -2.241977 -3.112180 0.000007 0.000002 0.000002 -0.927092 -0.528223 0.308481 -1.659862 -0.346676 0.122732 2.531997 -0.010002 -4.165173 -4.914746 -0.636292 -0.280944 6.764415 1.506771 0.360523 -0.000009 0.000000 0.000000 -10.779765 1.340124 2.460096 -18.703179 1.514734 0.681766 -9.342634 -0.806324 10.564757 9.967554 1.880575 -0.347363 -6.024204 -2.783380 0.241069 9.233185 -0.750150 -0.637006 -0.000002 0.000000 -0.000001 -0.000012 -0.000006 -0.000005 5.066108 3.687281 -10.571133 0.500495 -0.363375 0.221299 -0.868090 0.034896 1.065325 0.904143 -5.029684 -1.030067 -0.102068 -0.456227 0.815870 -0.000003 0.000000 0.000004 -0.000000 0.000000 -0.005543 +144.284200 78.303500 149.709500 -89.952340 -1.923563 87.874616 -0.000000 0.000000 0.005543 0.983972 0.413809 0.095612 0.243079 -0.350142 -0.416891 -0.534042 0.030962 3.179238 0.036985 0.008240 2.541784 4.375193 0.160870 1.423785 -0.509808 -0.946207 2.077793 0.592156 -0.640126 1.808441 0.001837 -0.000004 -0.000009 0.946519 2.615067 3.188049 -3.419133 0.419596 0.493568 0.854598 7.357210 12.060012 13.381647 -11.827812 14.802173 -1.757702 -0.223025 -0.026946 8.217599 1.521765 0.228714 0.140672 2.069367 -1.488555 -5.798066 -1.591694 0.191965 -2.115543 -2.189332 -2.821785 0.000006 0.000002 0.000003 0.240685 -0.505063 0.128218 -2.935819 -0.481631 0.319929 2.375088 -0.006875 -3.857199 -4.439370 -0.450816 -0.267349 6.517394 1.468447 0.296256 -0.000009 0.000000 0.000000 -14.354892 0.684431 2.080066 -22.249343 1.084091 0.181393 -9.390029 -0.852682 10.607497 9.801500 1.824973 -0.324133 -5.331965 -2.715290 0.197071 7.581558 -0.419566 -0.660682 0.000002 0.000001 0.000001 -0.000011 -0.000006 -0.000005 5.307347 3.568683 -10.393354 0.057802 -0.289917 0.220021 -0.646615 0.068598 0.927314 0.112671 -5.036961 -1.081098 -0.078474 -0.393637 0.703796 -0.000002 0.000000 0.000005 -0.000000 0.000000 -0.005542 +144.351300 78.266800 149.691200 -89.947899 -1.804739 87.846790 -0.000000 0.000000 0.005543 0.955997 0.411622 0.060213 0.103157 -0.353760 -0.369003 -0.568450 0.019752 3.137734 0.093491 -0.003333 2.380907 4.293193 0.071925 1.115088 0.320155 -1.396705 2.446165 0.495062 -1.071714 2.143390 0.001844 -0.000004 -0.000007 1.640440 2.640543 3.114864 -3.447025 0.409470 0.494213 -0.554261 8.298810 12.874841 13.753387 -11.577294 15.105320 -2.021308 -0.247237 -0.066168 8.708952 1.780047 0.441722 0.064548 1.736653 -1.709857 -5.882363 -1.515622 0.200919 -1.821730 -2.163148 -2.531720 0.000006 0.000003 0.000003 1.295376 -0.463134 -0.054624 -3.910089 -0.626450 0.558600 1.289366 0.054896 -3.655797 -2.684499 -0.323836 -0.177686 5.619098 1.446684 0.216423 -0.000009 0.000000 0.000000 -17.429041 0.087876 1.687313 -25.212477 0.675530 -0.280064 -9.625472 -0.903865 10.637988 9.841307 1.837661 -0.303428 -4.853138 -2.658518 0.184679 6.605953 -0.320315 -0.659807 0.000002 0.000001 0.000000 -0.000012 -0.000005 -0.000006 5.519563 3.427771 -10.238134 -0.438902 -0.187208 0.194983 -0.425057 0.101770 0.789179 -0.707594 -5.078041 -1.121011 -0.069565 -0.343963 0.607453 -0.000001 -0.000001 0.000003 -0.000000 0.000000 -0.005543 +144.412300 78.236300 149.654600 -89.941843 -1.643978 87.839973 -0.000000 0.000000 0.005543 0.858069 0.413248 -0.002398 0.019184 -0.359809 -0.299887 -0.560959 0.010850 3.096214 0.107470 -0.002773 2.206044 4.112762 -0.013055 0.837160 0.860550 -1.730389 2.721203 0.452097 -1.402370 2.377851 0.001837 -0.000003 -0.000008 1.921877 2.643018 3.060523 -3.495909 0.399167 0.495001 -1.309369 8.806724 13.333009 14.189388 -11.131538 15.467590 -2.217340 -0.262125 -0.079074 9.054092 2.016724 0.593707 0.022963 1.415937 -1.933441 -5.923089 -1.455944 0.195886 -1.528059 -2.135482 -2.241794 0.000005 0.000003 0.000003 1.948285 -0.397550 -0.181338 -4.136630 -0.827496 0.772673 -0.543959 0.159502 -3.530083 -0.335449 -0.221054 -0.061852 4.505421 1.446088 0.114949 -0.000009 0.000000 0.000000 -19.208128 -0.372383 1.403917 -26.848620 0.335089 -0.614094 -9.871240 -0.917033 10.636748 9.923685 1.843125 -0.293771 -4.627642 -2.629577 0.173145 6.230484 -0.346915 -0.654818 -0.000002 0.000001 -0.000002 -0.000009 -0.000006 -0.000006 5.760127 3.261705 -10.118643 -1.024716 -0.065045 0.182693 -0.188216 0.150343 0.669491 -1.450707 -5.120125 -1.154656 -0.060575 -0.294307 0.511104 -0.000001 -0.000001 0.000004 -0.000000 0.000000 -0.005543 +144.467300 78.211900 149.624000 -89.935271 -1.469239 87.854144 -0.000000 0.000000 0.005543 0.683202 0.415025 -0.064450 -0.008824 -0.366219 -0.230426 -0.497601 0.004944 3.054689 0.079510 -0.003807 2.031178 3.910748 -0.080947 0.581561 1.036328 -1.887938 2.814612 0.493120 -1.544045 2.475409 0.001839 -0.000003 -0.000009 1.937622 2.631166 3.039411 -3.523892 0.399364 0.505076 -1.465380 8.942586 13.462899 14.522739 -10.796641 15.740401 -2.330004 -0.278428 -0.082073 9.251831 2.247411 0.748310 -0.017325 1.131975 -2.131574 -5.942910 -1.394318 0.191253 -1.262481 -2.107930 -1.952286 0.000007 0.000003 0.000003 2.067828 -0.288393 -0.231735 -3.965178 -1.024134 0.845038 -1.623080 0.212954 -3.360531 0.898583 -0.096842 -0.001113 3.894156 1.421463 0.049504 -0.000009 0.000000 0.000000 -19.439190 -0.676962 1.225816 -26.918517 0.066513 -0.816777 -10.049975 -0.910340 10.638577 9.964175 1.845784 -0.282802 -4.452192 -2.696768 0.185533 6.002974 -0.284160 -0.718841 -0.000003 0.000002 0.000000 -0.000012 -0.000006 -0.000004 6.000999 3.096145 -9.998471 -1.590622 0.040921 0.186455 -0.014089 0.198147 0.554141 -2.018360 -5.165352 -1.187129 -0.051500 -0.244664 0.414744 -0.000003 -0.000001 0.000005 -0.000000 0.000000 -0.005543 +144.534400 78.181400 149.599600 -89.928744 -1.294497 87.868301 -0.000000 0.000000 0.005543 0.487353 0.417026 -0.126345 -0.008777 -0.351866 -0.158824 -0.407088 0.015202 3.026351 0.051548 -0.004767 1.898281 3.708467 -0.149969 0.370466 1.000293 -1.867725 2.734556 0.512170 -1.498176 2.427161 0.001842 -0.000004 -0.000009 1.911398 2.617093 3.006235 -3.551950 0.409000 0.504836 -1.276328 8.865999 13.403187 14.666419 -10.724804 15.854826 -2.350348 -0.271988 -0.087990 9.282915 2.443593 0.872080 -0.014750 0.873026 -2.332436 -5.911382 -1.355995 0.186267 -1.017075 -2.101259 -1.677131 0.000007 0.000003 0.000003 1.909490 -0.182551 -0.251605 -3.619327 -1.217540 0.847968 -2.234362 0.231338 -3.176761 1.493110 0.022972 0.034861 3.581547 1.369298 0.012562 -0.000009 0.000000 0.000000 -18.860913 -0.915741 1.044057 -26.177415 -0.171528 -1.027840 -10.179150 -0.870217 10.606223 9.900603 1.831347 -0.278283 -4.493633 -2.654499 0.162935 6.060884 -0.336752 -0.662391 -0.000000 0.000002 -0.000001 -0.000011 -0.000005 -0.000005 6.158815 2.950246 -9.919634 -2.052198 0.136395 0.188141 0.081299 0.263793 0.414579 -2.347328 -5.215315 -1.198479 -0.042344 -0.195040 0.318384 -0.000001 -0.000001 0.000008 -0.000000 0.000000 -0.005543 +144.571000 78.163100 149.556900 -89.924097 -1.168680 87.903360 -0.000000 0.000000 0.005543 0.291514 0.422142 -0.209014 -0.008770 -0.349480 -0.109423 -0.295616 0.026517 2.997989 0.023584 -0.005661 1.765381 3.505881 -0.201777 0.181746 0.877115 -1.779888 2.599699 0.500521 -1.386536 2.331613 0.001834 -0.000003 -0.000008 1.843218 2.600848 2.974966 -3.559038 0.418820 0.504444 -0.900296 8.672967 13.234740 14.735395 -10.711440 15.915761 -2.308158 -0.266642 -0.086443 9.195872 2.620723 0.956946 -0.031933 0.643479 -2.534803 -5.837814 -1.314673 0.202872 -0.772093 -2.093385 -1.416005 0.000006 0.000002 0.000003 1.602281 -0.082908 -0.219523 -3.174855 -1.360211 0.813072 -2.398148 0.238029 -2.994633 1.371231 0.138098 0.027038 3.687703 1.298813 0.012084 -0.000008 0.000000 0.000000 -18.024967 -1.128302 0.854475 -25.226983 -0.397276 -1.229719 -10.302435 -0.850085 10.575803 9.885918 1.820202 -0.275300 -4.438671 -2.630379 0.174270 6.007148 -0.367039 -0.662540 0.000003 0.000001 0.000001 -0.000012 -0.000005 -0.000004 6.261807 2.841784 -9.837670 -2.363286 0.196123 0.166848 0.100091 0.329220 0.280615 -2.430541 -5.270364 -1.201663 -0.031201 -0.130075 0.236189 -0.000002 0.000000 0.000004 -0.000000 0.000000 -0.005542 +144.577100 78.157000 149.526400 -89.921560 -1.098781 87.938382 -0.000000 0.000000 0.005543 0.165616 0.424345 -0.271399 -0.008767 -0.347093 -0.060022 -0.183048 0.016855 2.970781 0.016593 -0.005870 1.660463 3.289102 -0.236473 0.015406 0.712723 -1.705820 2.480845 0.489398 -1.283498 2.255224 0.001834 -0.000004 -0.000009 1.775030 2.584628 2.957663 -3.566020 0.418317 0.494613 -0.477841 8.442347 13.026314 14.818538 -10.659909 15.983467 -2.288319 -0.279153 -0.077095 9.109973 2.774688 1.026204 -0.046515 0.457076 -2.718985 -5.735266 -1.284064 0.205284 -0.525653 -2.105327 -1.154938 0.000007 0.000003 0.000003 1.212955 -0.037447 -0.171688 -2.784829 -1.412432 0.746299 -2.080228 0.191036 -2.846527 0.672882 0.242943 -0.013833 4.038303 1.219388 0.034119 -0.000010 0.000000 0.000000 -17.323158 -1.297924 0.701441 -24.451118 -0.579480 -1.397730 -10.378764 -0.816045 10.547521 9.857262 1.808114 -0.271888 -4.383716 -2.606252 0.185585 5.974394 -0.397568 -0.662578 -0.000002 0.000001 0.000000 -0.000012 -0.000005 -0.000002 6.367247 2.744796 -9.784708 -2.613398 0.226022 0.169592 0.093040 0.397152 0.176524 -2.408422 -5.327613 -1.195198 -0.021237 -0.075363 0.144535 -0.000001 -0.000001 0.000005 -0.000000 0.000000 -0.005542 +144.552700 78.163100 149.489800 -89.920312 -1.063830 87.973383 -0.000000 0.000000 0.005543 0.060706 0.426574 -0.333936 0.005225 -0.344715 -0.010537 -0.092159 0.020006 2.942817 0.009601 -0.006068 1.569533 3.072239 -0.278233 -0.102206 0.550357 -1.676163 2.424818 0.460147 -1.251729 2.215696 0.001839 -0.000003 -0.000009 1.706835 2.568432 2.940341 -3.572889 0.403655 0.500265 -0.118672 8.221012 12.836228 14.936060 -10.509096 16.082123 -2.268468 -0.291655 -0.067742 9.004659 2.898634 1.076666 -0.079079 0.315491 -2.884814 -5.618783 -1.252152 0.207839 -0.301457 -2.117653 -0.943010 0.000007 0.000002 0.000003 0.769895 -0.017442 -0.103555 -2.645907 -1.400455 0.614650 -1.517087 0.161806 -2.700265 0.357399 0.312452 -0.024520 4.066669 1.149075 0.054359 -0.000010 0.000000 0.000000 -16.678402 -1.403302 0.589903 -23.779088 -0.703356 -1.492997 -10.429088 -0.796115 10.522010 9.807677 1.794611 -0.267840 -4.291886 -2.584272 0.173162 5.955634 -0.428259 -0.662534 -0.000002 0.000002 0.000000 -0.000012 -0.000006 -0.000004 6.452548 2.653554 -9.730026 -2.826805 0.267736 0.185548 0.086103 0.465101 0.072443 -2.343558 -5.357753 -1.184736 -0.012891 -0.044242 0.078632 -0.000002 -0.000001 0.000005 -0.000000 0.000000 -0.005542 +144.552700 78.181400 149.459200 -89.919822 -1.049850 88.008370 -0.000000 0.000000 0.005542 -0.009249 0.425814 -0.375945 0.019214 -0.342326 0.038949 -0.022226 0.022040 2.914856 0.002609 -0.006255 1.506581 2.911300 -0.303228 -0.197072 0.389386 -1.678894 2.414412 0.453271 -1.254874 2.221922 0.001839 -0.000003 -0.000008 1.694582 2.555115 2.941487 -3.579831 0.398432 0.495594 0.139615 8.087313 12.717430 15.061793 -10.324297 16.185253 -2.275414 -0.291538 -0.068571 8.949905 2.994220 1.120952 -0.109585 0.203151 -3.031567 -5.502306 -1.220234 0.210330 -0.125520 -2.146926 -0.752514 0.000006 0.000003 0.000003 0.352682 -0.007866 -0.056622 -2.723965 -1.378914 0.448862 -0.932668 0.149121 -2.533800 0.647574 0.326001 0.001369 3.682140 1.082412 0.029245 -0.000010 0.000000 0.000000 -16.034385 -1.451362 0.533666 -23.126783 -0.774437 -1.537218 -10.445868 -0.766308 10.497976 9.737138 1.779685 -0.263166 -4.201077 -2.547134 0.173305 5.936875 -0.458951 -0.662498 -0.000000 0.000002 0.000002 -0.000013 -0.000006 -0.000002 6.581350 2.591193 -9.709658 -3.053465 0.320238 0.191825 0.102648 0.515141 0.003334 -2.279124 -5.408860 -1.174269 -0.005526 -0.027289 0.028195 -0.000001 -0.000001 0.000008 -0.000000 0.000000 -0.005542 +144.564900 78.224100 149.434800 -89.919337 -1.035869 88.022361 -0.000000 0.000000 0.005543 -0.016252 0.424670 -0.418423 0.005230 -0.349954 0.045175 -0.001271 0.023107 2.914846 -0.004383 -0.006437 1.464613 2.799347 -0.311681 -0.269133 0.299496 -1.706287 2.420708 0.447216 -1.279384 2.241540 0.001839 -0.000003 -0.000009 1.745254 2.545021 2.925840 -3.586914 0.408695 0.505081 0.235815 8.024492 12.670478 15.136828 -10.206523 16.248153 -2.282370 -0.291418 -0.069402 8.925579 3.050996 1.136325 -0.136559 0.134824 -3.146144 -5.401707 -1.168737 0.213426 -0.013610 -2.180664 -0.611561 0.000007 0.000002 0.000003 0.032733 0.002890 -0.020774 -2.879005 -1.362835 0.293564 -0.425185 0.136102 -2.408908 1.044722 0.358191 0.028548 3.234917 1.021797 0.003134 -0.000011 0.000000 0.000000 -15.544669 -1.459964 0.514100 -22.627686 -0.817241 -1.540482 -10.382987 -0.734910 10.478965 9.583786 1.744522 -0.240939 -4.110276 -2.509992 0.173388 5.918114 -0.489642 -0.662474 -0.000005 0.000001 0.000001 -0.000012 -0.000005 -0.000007 6.749552 2.516015 -9.712981 -3.357949 0.370156 0.191454 0.183981 0.567231 -0.042949 -2.256827 -5.459104 -1.167738 0.003467 -0.004027 0.012112 -0.000002 -0.000001 0.000004 -0.000000 0.000000 -0.005543 +144.589400 78.254600 149.416500 -89.919337 -1.035869 88.036349 -0.000000 0.000000 0.005543 0.018676 0.418439 -0.426565 -0.008753 -0.357583 0.051398 -0.029212 0.021684 2.914858 -0.011375 -0.006615 1.450622 2.771272 -0.329574 -0.282106 0.265531 -1.731322 2.428639 0.468919 -1.297052 2.249027 0.001839 -0.000003 -0.000008 1.795924 2.534914 2.910205 -3.579924 0.408757 0.505033 0.239642 8.027742 12.669862 15.161118 -10.165222 16.263331 -2.268468 -0.291654 -0.067739 8.903157 3.072876 1.153119 -0.159578 0.112692 -3.193619 -5.315043 -1.118536 0.216266 -0.008359 -2.222702 -0.548676 0.000007 0.000002 0.000003 -0.106570 0.016331 -0.005620 -2.963273 -1.351708 0.230427 -0.183298 0.142884 -2.354519 1.281615 0.404808 0.055255 2.976206 0.957443 0.006488 -0.000010 0.000000 0.000000 -15.334975 -1.456472 0.511239 -22.414248 -0.814153 -1.537345 -10.320095 -0.703532 10.459925 9.458384 1.711208 -0.219620 -3.998514 -2.472656 0.175766 5.864376 -0.519929 -0.662767 -0.000000 0.000001 0.000001 -0.000014 -0.000007 -0.000004 6.870556 2.453979 -9.712657 -3.585901 0.412418 0.188676 0.288203 0.607673 -0.061935 -2.269644 -5.508633 -1.150553 0.011769 0.009804 0.006336 -0.000003 -0.000001 0.000001 -0.000000 0.000000 -0.005543 diff --git a/data/gradio_target_bvh/animo/fennec_fox_male_drinktostand.bvh b/data/gradio_target_bvh/animo/fennec_fox_male_drinktostand.bvh new file mode 100644 index 0000000000000000000000000000000000000000..90dea8c19fce0f4dc5c8c93c7d19ae93a835b9c2 --- /dev/null +++ b/data/gradio_target_bvh/animo/fennec_fox_male_drinktostand.bvh @@ -0,0 +1,308 @@ +HIERARCHY +ROOT def_c_root_joint +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT def_c_hips_joint + { + OFFSET 0.000000 0.240000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine1_joint + { + OFFSET 0.000000 -0.240000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine2_joint + { + OFFSET 0.000000 -4.208500 -0.528300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine3_joint + { + OFFSET 0.000000 -3.974000 -0.455200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_chest_joint + { + OFFSET 0.000000 -3.996600 -0.165500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck1_joint + { + OFFSET 0.000000 -4.152900 0.213600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck2_joint + { + OFFSET 0.000000 -3.335800 1.261100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_head_joint + { + OFFSET 0.000000 -3.075700 1.840500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_jaw_joint + { + OFFSET 0.000000 -0.227500 -0.877900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -4.642250 -3.061500 + } + } + JOINT def_eye_joint.L + { + OFFSET 1.776500 -4.377100 -0.441200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.042500 -1.954800 -0.046400 + } + } + JOINT def_eye_joint.R + { + OFFSET -1.776500 -4.377100 -0.441200 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.042500 -1.954800 -0.046400 + } + } + } + } + } + JOINT def_clavicle_joint.L + { + OFFSET 1.928800 -2.305700 3.049400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.L + { + OFFSET 1.115100 -1.646200 -5.514800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.L + { + OFFSET -0.174700 2.191500 -5.152200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.L + { + OFFSET -0.356300 0.440600 -8.066700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.L + { + OFFSET 0.133600 -0.741500 -1.963400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.020200 -0.635000 -0.429540 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.L + { + OFFSET -0.178100 0.220300 -4.033400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.106900 0.132200 -2.420000 + } + } + } + } + } + JOINT def_clavicle_joint.R + { + OFFSET -1.928800 -2.305800 3.049400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.R + { + OFFSET -1.115100 -1.646200 -5.514700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.R + { + OFFSET 0.174700 2.191500 -5.152200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.R + { + OFFSET 0.356300 0.440600 -8.066700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.R + { + OFFSET -0.133600 -0.741600 -1.963400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.020200 -0.634940 -0.429540 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.R + { + OFFSET 0.178100 0.220300 -4.033400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.106900 0.132200 -2.420000 + } + } + } + } + } + } + } + } + } + JOINT def_c_tail1_joint + { + OFFSET -0.000000 7.392700 -0.015700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_tail2_joint + { + OFFSET -0.000000 3.790200 -2.331700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 3.790200 -2.331700 + } + } + } + JOINT def_rearLegUpr_joint.L + { + OFFSET 2.782800 2.468600 -0.676100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.L + { + OFFSET 0.580500 0.355400 -7.589500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.L + { + OFFSET 0.154800 4.939300 -5.051700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.L + { + OFFSET 0.508000 -1.094400 -5.763100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.091375 -0.447450 -0.503600 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.L + { + OFFSET 0.077400 2.469700 -2.525800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.046400 1.481800 -1.515500 + } + } + } + JOINT def_rearLegUprAllTwist_joint.L + { + OFFSET 0.290200 0.177700 -3.794700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.174100 0.106600 -2.276800 + } + } + } + JOINT def_rearLegUpr_joint.R + { + OFFSET -2.782800 2.468600 -0.676000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.R + { + OFFSET -0.580900 0.347100 -7.589900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.R + { + OFFSET -0.154300 4.947600 -5.051400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.R + { + OFFSET -0.508000 -1.094400 -5.763100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.091350 -0.447425 -0.503600 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.R + { + OFFSET -0.089700 2.369900 -2.619300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.053800 1.423000 -1.572900 + } + } + } + JOINT def_rearLegUprAllTwist_joint.R + { + OFFSET -0.290500 0.173500 -3.794900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.174300 0.104100 -2.277000 + } + } + } + JOINT def_c_anus_joint + { + OFFSET -0.000000 7.183100 -2.297300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.936100 -0.713600 + } + } + } +} +MOTION +Frames: 49 +Frame Time: 0.033333 +0.000000 19.584000 0.000000 -90.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 +-0.673000 19.485700 2.274500 -92.406940 0.448171 -3.363818 -0.000000 0.000000 0.005542 7.765209 -0.452192 3.486797 11.007369 -0.220730 1.618092 13.727566 0.037579 -1.942817 9.550322 0.176571 0.015356 17.159131 -0.661961 -2.838333 14.362366 -0.381897 4.997093 -25.258231 -0.337498 -1.505993 -8.526234 0.000334 -0.000093 0.502669 0.011220 0.000509 0.502664 -0.010764 -0.000327 -23.440986 -10.130402 -3.774999 17.928716 -2.577870 8.083460 -61.185934 0.032090 3.112739 11.894715 5.904480 1.964258 17.860368 7.675070 0.935351 0.126610 -0.149012 2.784076 -25.382568 5.180895 3.376156 34.900795 13.197070 -2.387959 -58.508746 -0.100654 -2.987351 6.228715 -6.167070 -12.091833 5.492487 -7.018877 5.897734 0.615595 0.612303 -12.388389 -8.301174 2.221818 4.656986 -10.918779 -4.717915 0.708569 2.112349 1.612325 1.421424 16.986518 1.022046 1.196494 -17.029647 -0.628256 -1.445143 16.661787 3.433394 0.448800 0.000015 0.000001 -0.000001 -0.000002 0.000001 0.000000 -20.944727 -4.004915 18.321065 24.971848 -1.614817 -1.643474 -17.098429 1.034555 0.642787 14.937801 -5.152162 -0.154150 -0.032602 0.523566 -0.532036 -0.000002 -0.000002 -0.000001 0.006099 0.000000 -0.000008 +-0.673000 19.467300 2.274500 -92.462800 0.451455 -3.363402 -0.000000 0.000000 0.005542 7.751615 -0.459135 3.535270 10.951626 -0.228702 1.673466 13.698722 0.012627 -1.992882 9.613280 0.172593 -0.061675 16.970493 -0.652605 -2.840496 14.363929 -0.399755 5.008009 -24.964044 -0.326094 -1.495611 -9.008853 0.000352 -0.000095 0.502547 0.010719 0.021486 0.502659 -0.010764 -0.000326 -23.419351 -10.083876 -3.752051 18.062924 -2.540681 8.031604 -61.290743 0.029289 3.117581 11.873751 5.902090 1.966411 17.900835 7.596238 0.932107 0.127260 -0.149743 2.798033 -25.382574 5.180895 3.376157 34.836547 13.261357 -2.364459 -58.278248 -0.106282 -2.976409 6.162184 -6.168533 -12.093968 5.490852 -7.075345 5.878033 0.615597 0.612302 -12.388390 -8.902696 1.624588 5.249440 -9.834796 -5.326672 1.081538 2.042784 1.607168 1.417890 17.327403 1.046039 1.217232 -17.231831 -0.633076 -1.463281 16.607065 3.421359 0.450419 0.000008 0.000001 -0.000001 -0.000004 0.000001 0.000000 -20.917784 -3.997460 18.320750 25.173543 -1.630570 -1.653678 -17.425981 1.046913 0.674528 15.088791 -5.184470 -0.145089 -0.032598 0.523565 -0.532037 -0.000001 -0.000003 -0.000002 0.006098 0.000000 -0.000008 +-0.673000 19.400200 2.256200 -92.624634 0.439943 -3.362113 -0.000000 0.000000 0.005543 7.541593 -0.462632 3.570023 10.818980 -0.239011 1.728518 13.823645 -0.017154 -2.056933 9.746160 0.166203 -0.180818 16.558341 -0.631499 -2.882778 14.093756 -0.441448 5.016934 -24.033002 -0.307739 -1.379327 -9.722289 0.000379 -0.000098 0.523014 0.009194 0.105529 0.530629 -0.011369 -0.000506 -23.301882 -9.826019 -3.671858 18.237466 -2.809908 8.101502 -61.374543 0.027040 3.121447 11.566012 5.870197 2.011511 18.283848 7.613047 0.965355 0.127915 -0.150474 2.811991 -25.299888 5.165900 3.380478 34.435341 13.344595 -2.134952 -57.600652 -0.122566 -2.944108 5.967015 -6.158133 -12.125264 5.534646 -7.028234 5.861262 0.616361 0.612914 -12.402359 -11.305575 1.031976 5.845476 -7.315410 -6.269025 1.656793 1.780093 1.606548 1.454612 18.398733 1.122242 1.281472 -17.841351 -0.656260 -1.566355 16.401868 3.376217 0.456396 0.000471 0.014667 -0.015000 -0.000004 0.000001 0.000000 -21.028742 -3.962885 18.323343 25.931587 -1.690109 -1.691530 -18.204163 1.045926 0.705702 15.370827 -5.244767 -0.106935 -0.032592 0.523563 -0.532039 -0.000002 -0.000004 -0.000002 0.006110 0.000000 -0.000008 +-0.575300 19.241500 2.164600 -93.010349 0.315570 -3.394542 -0.000000 0.000000 0.005542 6.472011 -0.380536 2.931477 10.492561 -0.080882 1.556694 14.701204 0.069819 -1.625521 10.068007 0.213532 -0.065290 15.726529 -0.598636 -2.955488 12.978322 -0.533237 5.003812 -21.149223 -0.261996 -1.131082 -9.953116 0.000388 -0.000099 0.619395 0.005693 0.357887 0.628833 -0.014612 0.047816 -22.422534 -8.225439 -3.171344 16.528298 -5.288741 8.756694 -59.774940 0.068953 3.047043 10.092335 5.761074 2.116755 20.128663 8.453063 0.946228 0.125954 -0.148281 2.770122 -24.911182 5.134016 3.336138 32.327859 13.109138 -1.201015 -55.141572 -0.178430 -2.825324 5.246922 -6.085580 -12.261884 5.869077 -6.189138 5.969233 0.620190 0.615974 -12.472169 -19.099147 0.682514 4.958749 -2.406125 -6.939529 1.601550 0.837723 1.845539 1.683721 21.264906 1.331897 1.446241 -19.362490 -0.667966 -1.871416 16.069792 3.067050 0.420704 0.002354 0.073330 -0.075002 -0.000004 0.000002 0.000000 -21.696203 -3.638221 18.455699 28.004057 -1.855373 -1.790967 -19.802914 1.016609 0.776994 15.856776 -5.648411 0.082616 -0.031650 0.490719 -0.495749 -0.000003 -0.000002 -0.000001 0.006103 0.000000 -0.000008 +-0.508200 19.162100 2.085300 -93.392891 -0.102868 -3.491781 -0.000000 0.000000 0.005542 5.935417 -0.279814 2.161506 10.148690 0.266566 1.098082 14.905785 0.419025 -1.219689 10.312315 0.411065 0.357486 15.459225 -0.620405 -3.012065 12.206142 -0.535810 5.063388 -18.637114 -0.234989 -0.888027 -8.812985 0.000345 -0.000095 0.674474 0.003813 0.505091 0.692071 -0.017059 0.096365 -21.752735 -7.066134 -2.833101 15.517199 -7.580012 9.599224 -58.308027 0.105546 2.977810 8.074795 5.584245 2.272028 25.594665 10.125659 0.234068 0.123997 -0.146086 2.728252 -24.615232 5.122079 3.311024 30.437013 12.401225 -0.006669 -52.682342 -0.229147 -2.704255 4.492456 -6.052623 -12.367745 6.208822 -5.024435 6.182311 0.622109 0.617501 -12.507080 -21.559014 0.689699 3.449715 -2.331321 -7.055946 1.121096 0.496468 2.409692 1.958445 22.509957 1.425493 1.514519 -19.974104 -0.670958 -2.042238 15.627866 2.733916 0.399396 0.003810 0.117328 -0.120005 -0.000004 0.000002 -0.000001 -21.945881 -3.052681 18.754813 29.109757 -1.944993 -1.841561 -20.840543 1.000007 0.822802 16.355368 -5.988477 0.213903 -0.031242 0.476640 -0.480200 -0.000002 -0.000001 -0.000004 0.006108 0.000000 -0.000007 +-0.422700 19.119400 1.963200 -93.818914 -0.532019 -3.592065 -0.000000 0.000000 0.005543 5.539312 -0.130872 1.108657 9.702343 0.677398 0.473632 14.850131 0.877567 -0.605051 10.610328 0.649831 0.979974 14.561818 -0.635451 -3.087692 11.838070 -0.503183 5.126829 -15.285591 -0.208486 -0.642852 -7.672877 0.000302 -0.000088 0.729545 0.002075 0.652296 0.755467 -0.020106 0.172887 -19.772436 -5.799634 -2.084622 12.978172 -10.444987 10.480386 -57.092547 0.134515 2.919748 5.928357 5.365511 2.437652 34.931524 12.395837 -1.520610 0.123022 -0.144988 2.707318 -24.233769 5.110217 3.240203 28.001561 11.387573 1.387247 -49.635989 -0.284690 -2.551448 3.550271 -6.007091 -12.496372 6.774830 -3.526462 6.445141 0.624024 0.619028 -12.541984 -22.883463 1.107147 1.435916 -2.323892 -6.927845 -0.102097 0.160240 3.039191 2.324717 23.407152 1.493852 1.562455 -20.324961 -0.675585 -2.223961 15.102236 2.325339 0.375827 0.005296 0.161324 -0.165009 -0.000004 0.000002 0.000000 -22.112444 -2.357298 19.076261 29.735614 -1.996146 -1.869427 -21.601112 0.969359 0.820929 17.100910 -6.427739 0.395418 -0.030822 0.462562 -0.464648 0.000000 -0.000004 -0.000003 0.006096 0.000000 -0.000008 +-0.221300 19.168300 1.627500 -94.443433 -0.982856 -3.698248 -0.000000 0.000000 0.005542 5.517538 0.088622 -0.696719 9.001608 1.191797 -0.209171 14.177740 1.464915 0.756234 11.044868 0.920150 1.675034 10.457281 -0.606399 -3.236219 11.864932 -0.331517 5.040822 -6.913118 -0.264323 -0.560702 -9.372595 0.000366 -0.000097 0.882158 0.002571 0.856081 0.917795 -0.028429 0.409636 -9.306642 -3.404495 0.920810 14.350060 -12.134388 10.960722 -68.910448 -0.197560 3.454944 7.681242 4.983908 2.504733 44.951152 14.039159 -3.668895 0.130853 -0.153761 2.874794 -23.307481 5.067880 3.104180 23.121157 10.151552 3.020786 -44.629966 -0.358087 -2.294615 1.989603 -5.864862 -12.772539 8.372980 -1.407455 6.720735 0.630932 0.624508 -12.667654 -23.882451 2.712101 -1.368889 -4.110678 -6.364815 -4.549601 -0.795747 3.877469 3.084227 24.193070 1.554343 1.603563 -20.332153 -0.637709 -2.582112 14.990399 1.571097 0.278051 0.009787 0.288415 -0.295026 -0.000004 0.000001 0.000001 -22.411755 -1.213891 19.443616 29.151483 -1.948392 -1.843433 -21.631639 0.926387 0.632167 19.373261 -7.465161 0.939864 -0.031511 0.486025 -0.490564 -0.000005 -0.000004 -0.000002 0.006104 0.000000 -0.000008 +-0.105300 19.259800 1.407700 -94.824531 -1.448549 -3.804231 0.000001 0.000000 0.005542 5.941401 0.259740 -2.028801 8.508861 1.624253 -0.859142 13.167319 1.919281 1.645877 11.252496 1.186708 2.351269 7.575497 -0.595553 -3.428002 11.890423 -0.141777 4.984602 -2.609758 -0.239090 -0.415152 -10.121004 0.000394 -0.000100 0.944506 0.029980 -0.227411 0.994875 -0.033547 1.493554 -2.700206 -2.002507 2.376000 14.746665 -11.428081 9.504817 -71.213478 -0.274744 3.550674 6.655563 4.702379 2.707608 43.883501 13.036806 -2.630247 0.136088 -0.159599 2.986447 -22.711967 5.050017 3.006319 19.992433 8.943753 4.230898 -41.281096 -0.394547 -2.119660 0.918167 -5.780480 -12.944829 9.450362 0.213867 6.929775 0.634010 0.626942 -12.723503 -23.569410 2.987772 -3.249520 -5.150925 -5.079523 -5.697515 -1.031836 4.624563 3.628310 23.504547 1.501317 1.567594 -19.617763 -0.613748 -2.736736 14.556487 1.004942 0.221067 0.012698 0.366620 -0.375043 -0.000003 0.000001 0.000000 -22.294965 -0.295112 19.780974 27.990160 -1.854254 -1.790319 -21.315106 0.921592 0.457728 21.322064 -8.156091 1.332761 -0.032595 0.523564 -0.532035 -0.000001 -0.000003 -0.000003 0.006098 0.000000 -0.000008 +0.004500 19.394100 1.206300 -95.094948 -1.921012 -3.931102 -0.000000 0.000000 0.005542 6.753420 0.409257 -3.180416 8.124495 2.015119 -1.366261 11.790258 2.240558 2.404286 11.262006 1.438600 2.877425 4.825527 -0.597369 -3.657361 12.019123 0.157435 4.850873 1.098767 -0.199528 -0.274337 -10.449756 0.000406 -0.000101 0.998033 0.036938 -1.990156 1.038785 -0.043382 2.822440 2.396915 -0.844493 3.261542 15.298399 -10.685962 7.199369 -70.660110 -0.255849 3.527954 4.702990 4.115216 3.419403 40.165197 12.241272 -1.424649 0.161774 -0.187912 3.530758 -22.159352 5.041802 2.917058 17.536359 7.949848 5.169938 -38.729666 -0.415432 -1.985112 0.110523 -5.699792 -13.085550 10.457122 1.529417 7.050263 0.637087 0.629371 -12.779360 -23.266927 2.988594 -4.695483 -6.159358 -4.026087 -6.407485 -1.035594 5.399309 4.132077 22.002194 1.387143 1.486919 -18.437182 -0.588445 -2.836321 14.029712 0.469418 0.158812 0.015714 0.444821 -0.455064 -0.000004 0.000001 0.000000 -22.015020 0.618265 20.087117 26.258485 -1.715931 -1.707610 -20.642671 0.921015 0.245616 23.457036 -8.801588 1.756917 -0.034430 0.589261 -0.604611 -0.000003 -0.000002 -0.000002 0.006104 0.000000 -0.000007 +0.108300 19.540600 0.998800 -95.108039 -2.410907 -4.036516 -0.000000 0.000000 0.005542 7.567388 0.533311 -4.137907 7.740552 2.325971 -1.641138 10.344952 2.420911 3.047469 11.084819 1.610492 3.131971 2.032364 -0.604169 -3.939624 12.044056 0.620134 4.595978 4.524312 -0.164168 -0.171962 -10.491715 0.000408 -0.000102 1.051289 0.040796 -3.689968 1.082648 -0.051390 4.116368 5.845165 0.189942 3.651604 14.700370 -10.656056 3.487040 -63.719101 -0.038104 3.228327 1.165254 2.964668 5.123529 33.389953 12.758520 -0.697181 0.232944 -0.263616 5.010281 -21.583017 5.028294 2.800416 15.358572 7.296608 5.891223 -36.618481 -0.428164 -1.873167 -0.555052 -5.612341 -13.222779 11.522524 2.508806 7.101600 0.640167 0.631798 -12.835209 -22.450285 2.437224 -5.347829 -7.270742 -3.154069 -6.728046 -1.201017 6.168605 4.640711 20.165843 1.250527 1.384297 -17.054115 -0.551514 -2.921269 13.488702 -0.068439 0.091258 0.019632 0.542565 -0.555097 -0.000004 0.000002 0.000000 -21.913364 1.545512 20.386469 24.220703 -1.556460 -1.604990 -19.802180 0.937425 0.012217 25.886984 -9.479970 2.243880 -0.036419 0.664346 -0.687553 -0.000005 -0.000003 -0.000002 0.006108 0.000000 -0.000008 +0.230400 19.729800 0.736300 -94.831128 -2.956578 -4.128488 -0.000000 0.000000 0.005542 8.396369 0.632789 -5.013855 7.180111 2.561965 -1.690647 8.728600 2.476999 3.696902 10.874941 1.731932 3.131264 -1.022283 -0.620651 -4.342821 11.701872 1.333478 4.145045 7.296893 -0.121414 -0.073562 -10.491716 0.000408 -0.000101 1.079242 0.048937 -4.683120 1.125722 -0.055683 5.291421 8.266382 1.046765 3.788043 10.402365 -10.674331 -0.790617 -55.137812 0.178500 2.825129 -2.563059 1.219178 7.670491 28.629470 13.397814 -0.554048 0.355709 -0.385519 7.474168 -20.852006 5.029006 2.658869 12.920901 6.983569 6.450543 -34.556188 -0.436614 -1.763431 -1.167597 -5.497375 -13.363726 12.845439 3.247502 7.089079 0.645565 0.636037 -12.932955 -21.285895 1.802062 -5.319058 -8.576867 -2.383009 -6.277722 -1.594389 7.009885 5.222121 17.598739 1.065225 1.233636 -15.171718 -0.506734 -3.015531 13.063399 -0.644978 -0.005939 0.024573 0.659850 -0.675149 -0.000004 0.000001 0.000000 -21.992948 2.558142 20.665303 21.396626 -1.341707 -1.453558 -18.490418 0.995483 -0.344507 29.445174 -10.314145 2.986710 -0.038602 0.820166 -0.838938 -0.000003 -0.000001 -0.000003 0.006104 -0.000001 -0.000008 +0.444000 20.083800 0.229700 -94.554775 -3.502602 -4.182831 0.000001 0.000000 0.005542 9.961792 0.821943 -6.365419 6.351784 2.747916 -1.535091 6.169346 2.338526 4.885011 10.702418 1.813096 2.984877 -5.570748 -0.701042 -5.176036 10.121228 2.822142 3.066036 8.964012 -0.146429 -0.056910 -10.491716 0.000408 -0.000102 1.126729 0.041997 -4.508026 1.176843 -0.041795 5.753141 9.488635 1.597080 3.774693 8.608939 -12.229724 -5.635414 -54.035416 0.201874 2.771125 -3.138194 -2.023139 11.702668 23.745320 12.871575 0.549884 0.584401 -0.587096 11.817073 -19.390256 4.955961 2.390581 8.248525 6.884484 6.974254 -31.179878 -0.441909 -1.583342 -2.126469 -5.288692 -13.616965 15.264658 4.116034 7.021976 0.653671 0.642378 -13.079569 -18.963996 3.183885 6.167798 -10.695126 -3.034248 -1.178379 -2.189128 8.079803 6.151790 13.221343 0.765487 0.958175 -11.888133 -0.423796 -3.243247 13.244725 -1.385469 -0.123788 0.035885 0.909044 -0.930304 -0.000004 0.000002 0.000000 -21.984989 3.612400 21.178991 21.139266 -1.322512 -1.439234 -18.726803 1.363406 -0.852375 35.783709 -11.751258 4.636448 -0.044545 1.205984 -1.244321 -0.000003 -0.000001 -0.000001 0.006103 0.000000 -0.000007 +0.547800 20.254700 -0.051100 -93.964068 -4.071881 -4.213785 -0.000000 0.000001 0.005542 10.476971 0.891392 -6.949126 5.723892 2.851512 -1.290158 4.712426 2.281892 5.492952 10.342685 1.860449 2.768924 -7.252825 -0.765847 -5.644072 8.599618 3.542183 2.447428 7.308127 -0.326392 -0.270357 -9.274657 0.000363 -0.000096 0.350463 0.082106 -4.372430 0.404518 -0.108373 5.939062 9.476854 1.591765 3.771405 10.894350 -13.018980 -8.590267 -56.216456 0.154628 2.877526 -2.063832 -4.341198 13.958733 19.735538 11.951753 1.346338 0.722874 -0.695171 14.319440 -18.552366 5.069684 2.302514 7.232088 7.045142 6.991350 -30.818186 -0.441847 -1.564038 -2.085836 -5.165890 -13.702645 16.711147 4.283873 6.957245 0.659084 0.646595 -13.177312 -16.914905 3.534290 12.875422 -10.853638 -3.098594 2.853951 -2.698138 8.906961 6.665287 10.177738 0.569927 0.753592 -9.717031 -0.377934 -3.346401 12.828027 -1.843871 -0.214652 0.043297 1.060489 -1.085432 -0.000003 0.000001 0.000000 -20.722855 3.734665 21.866922 27.645495 -1.826525 -1.774190 -23.046530 2.120232 -1.268533 39.411868 -12.392453 5.730207 -0.045953 1.767376 -1.802241 -0.000004 -0.000003 -0.000001 0.006108 0.000000 -0.000008 +0.627100 20.370700 -0.289200 -93.322176 -4.617134 -4.235091 -0.000000 0.000000 0.005542 10.538854 0.935426 -7.246795 5.094463 2.902695 -0.923195 3.743263 2.264997 5.968759 10.082224 1.887971 2.453242 -8.500558 -0.829825 -6.023053 7.237983 4.117138 1.871125 5.286642 -0.598166 -0.671012 -7.001299 0.000277 -0.000085 -0.425892 0.120373 -4.236301 -0.368165 -0.175574 6.061148 9.430842 1.584700 3.761981 12.581508 -12.929732 -10.330422 -57.684820 0.120553 2.948117 -1.070351 -5.735144 14.833419 16.391211 10.542836 1.878642 0.778381 -0.735837 15.299706 -17.817208 5.176709 2.243243 7.656672 7.650905 6.645561 -32.315192 -0.441312 -1.643932 -1.385944 -5.040442 -13.730708 19.058033 4.060959 6.840167 0.665668 0.651702 -13.296006 -14.758075 3.726965 17.952271 -10.505817 -3.156276 6.543936 -3.280627 9.651610 7.104356 7.699034 0.418897 0.579531 -7.946520 -0.323885 -3.444091 12.322080 -2.219888 -0.313412 0.050344 1.197261 -1.225570 -0.000003 0.000002 -0.000001 -17.521438 3.829524 22.056964 32.724833 -2.244518 -1.994755 -26.576872 2.969744 -1.978269 42.099053 -12.583762 6.537692 -0.041343 2.436728 -2.479630 -0.000002 -0.000002 -0.000003 0.006104 0.000000 -0.000008 +0.700400 20.450100 -0.521100 -92.792029 -5.154350 -4.259918 -0.000000 0.000000 0.005543 10.195242 0.950825 -7.406865 4.464488 2.935668 -0.437605 3.303168 2.297614 6.423623 10.053454 1.907213 2.032919 -9.949081 -0.916471 -6.386653 5.897388 4.627994 1.312564 3.009888 -0.919735 -1.217530 -3.902377 0.000162 -0.000063 -0.420001 0.116750 -4.096418 -0.360356 -0.177238 6.159023 9.384846 1.577659 3.752563 13.163550 -11.397540 -9.818598 -57.665218 0.121020 2.947181 -0.465751 -5.526441 13.432196 13.410425 8.879511 2.140408 0.696156 -0.675067 13.843112 -17.086321 5.323037 2.171330 8.391805 8.489962 6.043631 -34.615863 -0.436425 -1.766613 -0.452749 -4.902864 -13.746645 22.725349 3.595654 6.658367 0.672263 0.656796 -13.414696 -12.464714 4.287325 22.137106 -9.398997 -3.658622 10.635337 -3.940190 10.352041 7.535920 5.804826 0.308651 0.442225 -6.504587 -0.303619 -3.563899 11.830995 -2.570638 -0.386096 0.057733 1.334016 -1.365734 -0.000003 0.000002 -0.000001 -12.303423 4.065181 21.885203 34.187682 -2.368366 -2.051330 -27.837121 3.928423 -3.177282 44.407858 -12.567094 7.215661 -0.025012 3.298415 -3.370276 -0.000003 -0.000003 -0.000003 0.006104 0.000000 -0.000008 +0.749200 20.523300 -0.801900 -92.541932 -5.670952 -4.285273 -0.000000 0.000000 0.005543 9.771182 0.944294 -7.308784 3.771079 2.916212 0.151559 2.977797 2.369643 6.686394 10.151493 1.906800 1.553576 -12.045274 -0.985399 -6.819760 5.419349 5.519921 0.545583 3.327872 -1.179934 -1.556640 -1.880829 0.000086 -0.000045 -0.414410 0.112162 -3.914578 -0.352719 -0.178407 6.235917 9.287863 1.551758 3.753478 12.148082 -8.736636 -7.841531 -55.130630 0.178657 2.824779 -0.255167 -4.461879 10.487039 10.790510 7.084584 2.121861 0.528824 -0.540894 10.787615 -16.188460 5.542426 2.071551 9.601137 9.457152 5.190720 -37.867105 -0.421129 -1.939430 1.005243 -4.764805 -13.696223 28.091163 2.797619 6.575395 0.677312 0.660680 -13.505458 -9.985328 4.254315 24.339521 -7.449042 -3.974076 13.257922 -4.694888 10.922230 8.028303 4.453509 0.232814 0.342093 -5.302504 -0.294421 -3.759308 11.504177 -2.815603 -0.468961 0.065455 1.470751 -1.505924 -0.000003 0.000002 -0.000001 -4.778350 4.261190 21.273681 31.422350 -2.135491 -1.941738 -26.304529 4.918938 -5.165071 46.165221 -12.169618 7.652127 0.020554 4.480451 -4.576447 -0.000004 -0.000002 -0.000003 0.006101 0.000000 -0.000008 +0.791900 20.590500 -1.332900 -92.869762 -5.997153 -4.311603 -0.000000 0.000001 0.005543 9.200676 0.892131 -6.941393 2.959597 2.808256 0.828233 2.707429 2.390848 6.776813 10.313630 1.857021 1.053731 -15.898251 -1.031548 -7.561936 6.241196 7.295524 -0.889998 8.469780 -1.417746 -1.455624 -8.501252 0.000334 -0.000094 -0.395732 0.104199 -3.613802 -0.331030 -0.178658 6.326749 9.081268 1.506891 3.738413 7.103925 -4.363691 -2.246628 -46.243546 0.336876 2.378074 -1.122143 -2.503582 4.209969 9.329716 5.394645 1.670457 0.202957 -0.232194 4.391815 -14.516935 5.966645 1.886720 15.003622 10.019615 3.942185 -48.337788 -0.305877 -2.485473 5.262104 -4.466993 -13.474851 38.778198 1.572644 6.627972 0.682365 0.664560 -13.596220 -8.001723 3.984317 19.442880 -4.076184 -3.961292 13.567017 -6.375592 11.049661 8.888634 4.703509 0.246667 0.360753 -4.634251 -0.355263 -4.234867 11.767991 -2.940223 -0.540448 0.078553 1.690465 -1.731284 -0.000003 0.000003 0.000001 7.763264 4.219436 19.980923 18.895104 -1.157936 -1.310750 -18.351552 6.141243 -9.372359 46.578663 -11.083897 7.858604 0.197002 6.952864 -7.125255 -0.000004 -0.000002 -0.000005 0.006110 0.000000 -0.000007 +0.700400 20.492800 -1.638100 -93.288139 -5.467965 -4.255467 -0.000000 0.000000 0.005543 8.395108 0.733763 -5.593111 2.414407 2.404434 1.455747 3.017271 2.203266 6.013179 10.408285 1.604863 0.615669 -17.108528 -1.029674 -7.900025 6.822678 8.305642 -1.763360 11.320348 -1.594589 -1.451041 -8.485497 0.000333 -0.000093 -0.375660 0.100564 -3.494830 -0.309950 -0.177278 6.347653 8.956915 1.479643 3.734260 3.677889 -2.402389 0.115093 -39.919246 0.406431 2.047949 -0.436094 -1.729943 1.378596 7.604523 4.378149 1.266358 0.066640 -0.080255 1.485091 -13.680198 6.176704 1.789612 23.241551 8.600694 3.428671 -57.807484 -0.117638 -2.953988 9.082494 -4.677856 -12.335535 41.495295 0.677674 6.981352 0.632858 0.626031 -12.702552 -5.752199 3.410544 13.219824 -0.820348 -3.481116 11.388490 -8.226461 9.841221 9.156132 7.870798 0.429119 0.591800 -6.019447 -0.466962 -4.608272 11.681748 -2.686357 -0.572693 0.080678 1.724637 -1.766346 -0.000003 0.000002 0.000000 12.705374 3.351891 19.526488 11.146394 -0.630964 -0.819818 -13.333990 6.492546 -11.418375 43.905368 -10.013311 7.412638 0.333207 8.236874 -8.462181 -0.000005 -0.000002 -0.000002 0.006103 -0.000001 -0.000007 +0.560000 20.395100 -1.961600 -93.951901 -4.731898 -4.174564 0.000001 0.000000 0.005543 7.688454 0.508945 -3.950142 2.070450 1.970940 2.025919 3.331028 1.938600 4.974585 10.417528 1.305751 0.245615 -17.594562 -1.045707 -8.239699 7.229024 9.117829 -2.565345 13.336118 -1.841948 -1.532708 -8.392804 0.000331 -0.000093 -0.355374 0.097624 -3.403830 -0.288874 -0.175888 6.368553 8.835453 1.448670 3.716807 -0.128010 -1.111120 1.596830 -33.051897 0.440279 1.683224 0.376947 -1.665398 -0.428629 5.534647 3.832040 0.885928 -0.014935 0.018591 -0.339579 -12.842759 6.385314 1.689380 30.357561 5.316525 3.937663 -63.957782 0.044964 -3.239071 11.826170 -5.417041 -10.059046 42.190335 0.896563 7.274245 0.523318 0.536229 -10.684882 -3.557409 2.649046 5.431678 1.965301 -2.822674 6.719122 -10.024432 8.275050 9.262028 11.482347 0.652416 0.842550 -7.671598 -0.587642 -5.002513 11.758740 -2.285454 -0.591383 0.081289 1.734402 -1.776367 -0.000004 0.000002 -0.000001 15.931382 2.455316 18.929007 5.445229 -0.288227 -0.415750 -9.610141 6.333491 -12.492845 39.540105 -8.725912 6.823462 0.408940 8.845055 -9.094820 -0.000004 -0.000002 -0.000002 0.006101 0.000000 -0.000007 +0.431800 20.315800 -2.584200 -95.034244 -3.945539 -4.095583 -0.000000 0.000000 0.005543 6.696015 0.291461 -2.235849 2.317053 1.573301 2.436347 3.949899 1.651596 3.891250 9.851400 1.009492 -0.035931 -17.007229 -1.256961 -9.024306 6.031924 9.150445 -3.145307 9.918779 -2.727223 -2.688946 -2.814233 0.000123 -0.000055 -0.334873 0.095367 -3.340793 -0.268030 -0.173851 6.361488 8.519164 1.378348 3.687089 -7.282010 -0.148581 2.595124 -21.249104 0.396056 1.055972 -0.807972 -3.014205 -1.256899 4.339742 4.571011 0.300207 -0.045440 0.057261 -1.040757 -11.210364 6.701180 1.494475 33.728137 -3.220866 6.977656 -62.655183 0.007986 -3.180173 12.609631 -6.815672 -5.774493 42.126267 4.526342 6.913897 0.318943 0.350107 -6.747289 -1.395073 0.897897 -8.743016 4.612570 -3.163803 -1.042907 -12.455350 6.527780 9.526968 15.170455 0.896339 1.083643 -9.006298 -0.773007 -5.559647 12.568431 -1.794192 -0.612082 0.084665 1.788099 -1.831471 -0.000002 0.000003 -0.000001 19.696135 2.169779 17.751035 -1.264335 0.061169 0.100288 -5.469762 5.517107 -12.991935 27.996952 -6.447792 6.028777 0.416169 8.901138 -9.154712 -0.000008 -0.000002 -0.000002 0.006106 0.000001 -0.000007 +0.285300 20.193700 -2.901600 -95.946564 -3.137873 -3.991065 -0.000001 0.000000 0.005543 6.312884 0.080710 -0.647879 2.909481 1.176913 2.796104 4.130182 1.327082 2.836607 8.885239 0.718716 -0.279423 -16.505091 -1.374523 -9.354693 5.065702 9.131826 -3.503588 6.562275 -3.555834 -3.595424 -2.150390 0.000098 -0.000050 -0.299922 0.094084 -3.340624 -0.247190 -0.171817 6.354419 8.339979 1.341796 3.674518 -10.157365 0.535246 2.568055 -15.047001 0.321428 0.733627 -1.598671 -3.601169 -1.317563 3.600756 4.513135 0.008042 -0.044083 0.055518 -1.009328 -10.341656 6.803927 1.401451 30.854437 -5.646894 6.888736 -55.970152 -0.160179 -2.865616 11.366472 -6.745589 -5.394630 39.329950 5.966437 6.622778 0.294554 0.326104 -6.259928 0.012786 0.107318 -12.196916 6.989644 -3.468854 -4.737174 -14.269242 4.823856 9.352880 19.068565 1.170494 1.320912 -10.220458 -0.954266 -5.888063 12.304792 -1.326073 -0.671263 0.081591 1.739282 -1.781375 -0.000004 0.000002 0.000000 18.966185 0.952822 16.938702 1.194963 -0.059836 -0.093544 -6.454451 4.916777 -12.419033 20.124606 -4.845432 5.793107 0.337832 8.270025 -8.488796 -0.000004 -0.000003 -0.000002 0.006103 0.000000 -0.000007 +0.120500 20.065500 -3.145800 -96.796739 -2.336154 -3.891762 -0.000000 0.000000 0.005542 5.998605 -0.116929 0.920535 3.519985 0.745485 3.070877 4.220737 0.985364 1.700378 7.890115 0.460235 -0.528685 -16.045851 -1.408196 -9.618161 4.247269 8.984796 -3.713005 3.606691 -4.192147 -4.328507 -2.053088 0.000093 -0.000047 -0.264978 0.092799 -3.340450 -0.226172 -0.170266 6.368330 8.188146 1.306622 3.666867 -12.366531 1.144402 2.627090 -9.687732 0.229197 0.462941 -2.117110 -3.924725 -1.268876 2.674035 4.273491 -0.196904 -0.039405 0.049531 -0.901151 -9.623871 6.889810 1.321833 28.266004 -5.907446 5.840163 -50.925187 -0.262177 -2.616473 10.505810 -6.619629 -5.186541 35.733306 5.465575 7.180777 0.279342 0.310932 -5.954034 0.205565 -0.224958 -13.192552 9.125563 -3.637095 -6.248841 -15.825255 3.188720 9.009961 22.659646 1.436845 1.522590 -11.223418 -1.130530 -6.144632 11.820917 -0.858861 -0.738731 0.077061 1.666054 -1.706240 -0.000004 0.000002 0.000000 18.547051 -0.116567 15.950659 2.950473 -0.151259 -0.228664 -7.033648 4.241393 -11.714236 12.801489 -3.346087 5.850637 0.260088 7.567979 -7.746090 -0.000001 -0.000002 -0.000003 0.006106 0.000000 -0.000008 +-0.026000 20.004500 -3.353300 -97.537702 -1.564542 -3.763078 0.000001 0.000000 0.005543 6.150656 -0.294714 2.371599 4.200548 0.334914 3.090759 3.827624 0.675258 0.398389 6.726355 0.224602 -0.719081 -15.807621 -0.956312 -10.020925 4.023400 8.484867 -3.620681 2.807695 -4.444819 -4.386576 -4.690857 0.000190 -0.000070 -0.250997 0.092286 -3.340383 -0.205271 -0.168390 6.368252 8.039232 1.267735 3.645897 -13.115772 1.453932 2.954029 -6.460415 0.161587 0.304508 -1.841410 -4.013813 -1.162791 1.583105 4.102928 -0.269070 -0.034715 0.043552 -0.792979 -8.896818 6.850245 1.261925 27.171683 -5.675769 5.506528 -48.054779 -0.310295 -2.471029 10.434354 -6.391961 -5.073860 28.879170 5.377133 7.766504 0.272143 0.303693 -5.808668 0.005227 0.233168 -8.922638 10.049915 -3.738114 -5.697276 -16.914405 1.708525 8.561479 25.087399 1.623861 1.649330 -11.556892 -1.281287 -6.313647 11.210111 -0.394939 -0.807289 0.074390 1.622114 -1.661165 -0.000004 0.000002 0.000001 18.714257 -0.968645 14.850877 3.020735 -0.155007 -0.234013 -6.648609 3.547882 -11.069425 5.642546 -1.923488 6.168797 0.194605 6.920378 -7.087752 -0.000002 -0.000003 -0.000002 0.006104 0.000001 -0.000007 +-0.178600 19.974000 -3.542500 -98.118286 -0.784109 -3.621093 -0.000000 0.000000 0.005542 6.384559 -0.478468 3.709160 4.879833 -0.059567 2.969491 3.253093 0.427909 -0.838555 5.408821 0.036150 -0.761547 -15.668244 -0.397360 -10.273787 4.116018 7.935114 -3.557405 3.091441 -4.613827 -4.371371 -8.000326 0.011790 0.007908 -0.237016 0.091772 -3.340312 -0.184370 -0.166514 6.368175 7.849232 1.226916 3.617225 -13.121295 1.548412 3.200956 -4.324515 0.111979 0.201846 -1.153880 -3.941356 -1.032564 0.525470 3.897042 -0.269193 -0.031532 0.039507 -0.719688 -8.049214 6.632905 1.219645 25.278288 -5.601185 5.214989 -43.974961 -0.366022 -2.260571 9.952122 -6.061659 -5.106976 20.188103 5.835386 8.321018 0.269443 0.300969 -5.754033 -0.407586 0.203126 -3.270228 10.503086 -4.393794 -4.453670 -17.891361 0.261369 8.093139 26.833349 1.761597 1.735532 -11.466556 -1.498629 -6.467590 10.867623 0.201027 -0.902952 0.070876 1.563525 -1.601067 -0.000004 0.000002 -0.000001 18.995130 -1.719976 13.600072 2.185741 -0.110926 -0.170147 -5.742667 2.753011 -10.399848 -0.929276 -0.635195 6.791351 0.135654 6.258030 -6.415351 -0.000005 -0.000003 -0.000004 0.006098 0.000000 -0.000008 +-0.337300 20.041100 -3.792800 -98.840464 0.003425 -3.458156 -0.000000 0.000000 0.005542 6.650827 -0.657132 5.068607 5.875978 -0.510006 2.790453 2.673908 0.213985 -2.076916 3.692526 -0.144798 -0.780696 -15.759885 -0.294661 -9.853442 4.673767 6.604880 -3.093401 5.013574 -3.379863 -5.366434 -8.449386 0.010267 0.007022 -0.174111 0.089463 -3.339995 -0.128644 -0.161511 6.367964 7.497110 1.150652 3.588412 -14.054067 1.624656 3.421141 -0.490830 0.013471 0.022481 -1.259035 -3.561020 -0.799505 -0.176292 3.351625 -0.163617 -0.022560 0.028165 -0.513831 -6.463426 6.010321 1.229797 20.643338 -5.288201 4.619940 -36.909608 -0.426653 -1.888629 8.315258 -5.402868 -5.382931 9.347861 6.729767 9.089508 0.272952 0.304509 -5.825017 -2.814355 -2.969151 4.144957 10.727099 -5.230778 0.845301 -18.565571 -1.096306 7.889277 27.633402 1.825577 1.773625 -10.838541 -2.080693 -6.782195 11.658379 1.267054 -1.125813 0.061550 1.402386 -1.435824 -0.000003 0.000002 -0.000001 19.356292 -2.242657 11.889764 0.682121 -0.033916 -0.053555 -4.422698 1.674917 -9.679456 -5.922783 0.421876 7.905247 0.074927 5.435707 -5.567222 -0.000004 -0.000003 -0.000003 0.006106 0.000000 -0.000008 +-0.502100 20.120500 -3.921000 -99.001373 0.839706 -3.289095 -0.000000 0.000000 0.005543 6.984989 -0.832430 6.506108 6.182335 -0.924036 2.534076 1.812144 0.059179 -3.427157 2.591766 -0.331577 -0.753894 -15.960235 -1.067738 -8.684154 5.185655 6.801220 -3.322473 6.644022 -2.565696 -5.956844 -8.422819 0.008790 0.006051 -0.137808 0.092389 -3.521625 -0.095443 -0.154089 6.179030 7.268441 1.107278 3.574675 -14.936403 1.428916 3.629008 3.041252 -0.087724 -0.136619 -1.511793 -3.199327 -0.608455 -0.881353 3.002542 -0.033585 -0.015079 0.018770 -0.342858 -5.445977 5.452967 1.292312 18.303789 -4.965018 4.390851 -33.243931 -0.439932 -1.693478 7.823011 -4.942448 -5.553513 6.441861 7.241173 9.264859 0.277503 0.309087 -5.916945 -4.673221 -1.076248 9.239115 10.586111 -5.340055 4.497658 -19.557287 -2.903432 7.278512 29.622657 1.986914 1.864441 -10.826856 -2.435886 -6.794098 12.910884 2.651830 -1.323518 0.050609 1.202147 -1.230576 -0.000002 0.000001 0.000000 19.164531 -3.313123 10.987701 -0.118177 0.005813 0.009309 -3.362532 1.069220 -9.417257 -6.773092 1.066318 8.691136 0.053219 5.074165 -5.182227 -0.000005 -0.000002 -0.000003 0.006101 0.000000 -0.000008 +-0.673000 20.193700 -4.030800 -98.910220 1.591200 -3.123142 -0.000000 0.000000 0.005542 7.160848 -0.998185 7.768556 6.210760 -1.269747 2.241473 0.963652 -0.040923 -4.644779 1.729444 -0.484537 -0.674569 -16.131278 -2.214966 -7.257215 5.672765 7.794060 -3.899251 8.033096 -2.013796 -5.964887 -8.326296 0.007316 0.005073 -0.101494 0.095201 -3.703256 -0.062212 -0.146777 5.990090 7.079783 1.058108 3.540754 -15.296542 1.127437 3.799198 5.589030 -0.166715 -0.247366 -1.498010 -2.848162 -0.459529 -1.537816 2.771725 0.115286 -0.009718 0.012074 -0.220725 -4.537709 4.907041 1.370221 16.511229 -4.673732 4.288307 -30.407562 -0.441629 -1.542125 7.552593 -4.525212 -5.722439 5.395291 7.516027 9.261853 0.283100 0.314699 -6.029809 -6.663664 0.353213 11.958247 10.184288 -4.906202 6.942714 -20.182765 -4.922738 6.786634 31.298901 2.125246 1.936587 -10.690517 -2.736802 -6.724387 13.834328 4.239665 -1.597522 0.041109 1.016522 -1.040391 -0.000003 0.000003 0.000001 18.745912 -4.355540 10.303107 -0.821001 0.039974 0.064967 -2.287106 0.591408 -9.311314 -7.030878 1.585191 9.369774 0.040627 4.853164 -4.953682 -0.000003 -0.000002 -0.000003 0.006104 0.000000 -0.000008 +-0.795100 20.260900 -4.122400 -98.662804 2.152303 -3.026315 0.000001 0.000000 0.005543 7.157321 -1.120176 8.726228 6.051078 -1.497262 1.958795 0.264997 -0.079084 -5.601775 1.105538 -0.605749 -0.582867 -16.121420 -2.765995 -6.061020 6.083954 9.033316 -4.516620 9.100319 -1.749228 -5.035809 -8.180813 0.005845 0.004083 -0.071187 0.079287 -3.080746 -0.041186 -0.145359 6.003989 6.886753 1.014644 3.526499 -14.921948 0.815494 3.905144 6.662982 -0.201473 -0.292979 -0.953063 -2.570179 -0.358897 -2.140600 2.617040 0.257403 -0.007108 0.008823 -0.161388 -3.643106 4.361901 1.460680 14.719812 -4.387930 4.214157 -27.711008 -0.436295 -1.398321 7.137643 -4.125287 -5.903900 4.565914 7.357305 9.278915 0.289403 0.320990 -6.156634 -8.799719 1.197658 11.401934 9.444557 -4.367573 7.682433 -19.964537 -6.683986 6.644440 31.132347 2.111407 1.929601 -9.667898 -3.000182 -6.559043 13.587744 5.610913 -1.879049 0.034957 0.889501 -0.910290 -0.000004 0.000001 0.000000 18.213881 -5.145772 9.787309 -1.440276 0.069504 0.114350 -1.327651 0.221764 -9.322971 -7.224388 1.986617 9.968880 0.033634 4.735291 -4.839715 -0.000005 -0.000002 -0.000003 0.006098 0.000000 -0.000008 +-0.868300 20.279200 -4.214000 -98.218731 2.465170 -2.995237 -0.000000 0.000000 0.005542 6.870102 -1.185082 9.211485 5.583432 -1.540754 1.703759 -0.358184 -0.053501 -6.192144 0.678340 -0.658935 -0.472582 -15.949332 -2.845174 -4.788016 6.452575 10.110216 -5.011752 9.983507 -1.590991 -3.550406 -7.909454 0.004372 0.003092 -0.062329 0.037829 -1.339440 -0.019492 -0.145697 6.094807 6.693712 0.971230 3.512100 -14.483648 0.387733 4.058475 7.841659 -0.240599 -0.342279 -0.366837 -2.288117 -0.259167 -2.790333 2.496635 0.399179 -0.004494 0.005577 -0.102051 -2.688988 3.716515 1.612987 12.689238 -4.106491 4.150498 -24.609073 -0.421799 -1.233424 6.573251 -3.654380 -6.102341 4.259198 6.948053 9.235268 0.296418 0.327958 -6.297415 -11.125141 2.397620 10.528046 8.364373 -4.116803 7.848004 -19.734918 -8.280291 6.842995 30.965773 2.097588 1.922573 -8.731162 -3.296345 -6.392071 13.135544 6.974922 -2.166234 0.028002 0.738033 -0.755190 -0.000003 0.000001 -0.000001 17.039015 -5.572637 9.333232 -1.154089 0.055925 0.091488 -0.723091 -0.095274 -9.417438 -7.456744 2.177176 10.556455 0.028575 4.654918 -4.767401 -0.000003 -0.000002 -0.000003 0.006101 -0.000001 -0.000007 +-0.856100 20.205900 -4.366500 -97.273428 2.443375 -3.042686 0.000001 0.000000 0.005542 5.706708 -1.178158 9.169379 4.464221 -1.308313 1.410322 -0.927546 0.079204 -6.504196 0.279990 -0.607683 -0.353405 -15.037713 -0.829801 -3.334134 6.163522 9.303641 -4.533276 8.826889 -2.138495 -1.271250 -7.197418 0.002899 0.002087 -0.038770 -0.067360 3.130183 0.053884 -0.185209 8.066613 6.390998 0.909402 3.480474 -13.441832 -0.355984 4.339681 9.425354 -0.294752 -0.407237 0.613706 -1.847068 -0.129655 -3.749548 2.318573 0.665414 -0.001877 0.002333 -0.042712 -1.359130 2.726999 1.962963 9.122353 -3.881206 3.957039 -18.417935 -0.366321 -0.907843 5.218662 -2.850002 -6.382621 4.047564 6.162974 9.145805 0.305542 0.336973 -6.480079 -14.197136 1.594972 3.464454 5.829838 -2.753798 3.944599 -18.988551 -9.777059 7.779785 29.171939 1.950083 1.844357 -6.834513 -3.700679 -6.074447 10.347781 8.262032 -2.277053 0.020246 0.557226 -0.570104 -0.000001 0.000003 0.000001 13.797965 -5.661924 8.978845 1.946059 -0.098444 -0.151696 -1.000551 -0.380358 -9.921247 -8.115159 2.084106 11.444284 0.035554 4.763800 -4.864093 -0.000004 -0.000002 -0.000003 0.006103 0.000000 -0.000007 +-0.825600 20.089900 -4.427600 -96.844118 2.343379 -3.081626 0.000001 0.000000 0.005543 4.659696 -1.142476 8.905349 4.005930 -1.160823 1.249587 -0.736154 0.090875 -6.461099 0.063403 -0.559235 -0.252987 -14.364789 0.295882 -2.746299 5.531696 6.866466 -3.438130 6.866786 -2.415819 -1.815992 -6.044717 0.013188 0.008635 -0.021682 -0.065547 3.108765 0.074387 -0.181925 8.031573 6.264034 0.876789 3.453901 -12.749477 -0.792238 4.460138 9.835816 -0.309077 -0.423827 1.147617 -1.628005 -0.081255 -4.140159 2.266839 0.799146 -0.000490 0.000616 -0.011284 -0.743174 2.394434 2.097645 7.231433 -4.071700 3.892654 -15.220494 -0.323987 -0.742537 4.469879 -2.464612 -6.496538 4.018094 5.896015 9.113288 0.308747 0.340125 -6.544090 -15.242896 0.566521 -0.237614 4.249371 -2.255766 1.126566 -19.264147 -9.905702 8.137312 29.165300 1.949542 1.844057 -6.933001 -3.852061 -6.191366 8.784759 8.220681 -2.150097 0.018442 0.513243 -0.525088 -0.000002 0.000002 -0.000001 11.700303 -5.645806 8.944940 4.920068 -0.258718 -0.376864 -1.851201 -0.400024 -10.227689 -8.597764 1.914402 11.850180 0.041808 4.853907 -4.939991 -0.000004 -0.000003 -0.000002 0.006101 0.000000 -0.000008 +-0.776800 19.967900 -4.470300 -96.565859 2.174227 -3.113571 -0.000000 0.000000 0.005543 3.759731 -1.088223 8.446321 3.715989 -1.015142 1.148811 -0.530404 0.105932 -6.186873 -0.195124 -0.484104 -0.175111 -13.697137 0.917265 -2.189803 4.908833 4.641982 -2.503984 4.693458 -2.663063 -2.532596 -4.738130 0.023634 0.014925 -0.004193 -0.061724 3.003442 0.094247 -0.177072 7.926614 6.171267 0.845765 3.433822 -11.974768 -1.098429 4.521233 9.918076 -0.311963 -0.427138 1.522746 -1.444870 -0.047589 -4.300834 2.191785 0.924344 -0.000027 0.000041 -0.000788 -0.273909 2.170728 2.214050 5.690517 -4.293070 3.804196 -12.449604 -0.279891 -0.601377 3.715460 -2.111145 -6.597512 4.086462 5.645998 9.084690 0.311957 0.343273 -6.608100 -15.838819 -0.412185 -2.842582 3.037111 -2.451375 -0.925752 -19.518498 -9.855257 8.692690 29.555052 1.981379 1.861445 -7.822673 -3.867573 -6.683833 7.517364 7.870850 -1.973184 0.023325 0.630530 -0.645135 0.000002 0.000003 -0.000000 9.915682 -5.479051 8.980140 7.766026 -0.422866 -0.584318 -2.763053 -0.400848 -10.529782 -9.046239 1.657946 12.181980 0.043900 4.923596 -5.034193 -0.000004 -0.000003 -0.000002 0.006108 0.000000 -0.000008 +-0.703500 19.851900 -4.525200 -96.512233 1.989754 -3.155104 -0.000000 0.000000 0.005542 3.312500 -1.030390 7.994030 3.452461 -0.868796 1.060932 -0.877784 0.190485 -5.861994 -0.658899 -0.422565 -0.118901 -12.726100 0.977792 -1.205128 4.246391 1.510768 -1.253547 2.145751 -2.679547 -3.787698 -3.086863 0.012892 0.008834 0.031295 -0.059747 2.595383 0.111849 -0.172527 7.617330 6.072495 0.828463 3.436736 -10.606734 -1.300635 4.541121 9.704424 -0.304479 -0.418527 1.922248 -1.171057 -0.022112 -4.257500 1.928152 1.104707 0.000008 -0.000001 -0.000001 0.243681 1.892341 2.446160 3.561176 -4.466677 3.558975 -8.046692 -0.195931 -0.381918 2.256481 -1.543129 -6.802969 4.317818 5.128023 9.037018 0.320304 0.351435 -6.774366 -16.419281 -1.884456 -2.882083 2.175246 -3.225406 -2.107583 -19.332015 -10.731033 10.697849 30.009105 2.018616 1.881433 -9.361392 -3.440496 -8.894814 7.087280 7.618292 -1.838639 0.074694 1.627094 -1.666271 -0.000003 0.000002 -0.000001 8.338325 -5.222739 8.857021 10.525355 -0.591694 -0.777475 -3.583195 -0.364751 -10.929518 -9.478464 1.281341 12.756676 0.052338 5.064359 -5.174526 -0.000004 -0.000003 -0.000002 0.006103 0.000000 -0.000008 +-0.642500 19.888500 -4.549700 -96.731526 1.826743 -3.175769 -0.000000 0.000000 0.005542 3.981769 -0.967972 7.501621 3.408084 -0.734936 0.991247 -1.754901 0.347164 -5.497977 -0.931598 -0.363022 -0.060777 -12.133571 0.851099 -0.757600 4.107755 0.364655 -0.716403 1.552050 -2.430174 -3.918983 -3.611449 0.012830 0.008945 0.033090 -0.051156 2.238770 0.109612 -0.166932 7.372591 6.024592 0.826312 3.427518 -9.752804 -1.512492 4.589971 9.327342 -0.291347 -0.403261 2.366354 -1.019902 -0.013080 -4.365636 1.850467 1.208153 0.000624 -0.000764 0.013952 0.698887 1.750123 2.515717 2.236976 -4.686099 3.539903 -5.902005 -0.148984 -0.277501 1.608286 -1.254033 -6.921535 4.483883 4.949757 9.006692 0.325222 0.356221 -6.872083 -16.885394 -2.681943 -1.676324 0.945971 -4.430773 -2.682040 -18.032719 -10.822413 12.086646 28.708709 1.912397 1.823410 -10.006575 -3.026661 -10.086808 6.751900 7.273555 -1.674717 0.118113 2.281078 -2.337766 -0.000003 0.000000 0.000000 8.055453 -4.838493 8.720900 10.901171 -0.615404 -0.803150 -3.017676 -0.375959 -11.136361 -9.890727 0.916787 13.062492 0.059945 5.204988 -5.330761 -0.000004 -0.000003 -0.000003 0.006104 0.000000 -0.000008 +-0.581400 19.931200 -4.568000 -96.950862 1.663812 -3.197061 -0.000000 0.000000 0.005542 4.741746 -0.899817 7.009926 3.384859 -0.600671 0.921913 -2.655341 0.484907 -5.104160 -1.204355 -0.303756 -0.002371 -11.575601 0.691558 -0.443720 4.122905 -0.239305 -0.390031 1.532211 -2.203126 -3.756014 -4.429815 0.012729 0.009119 0.035647 -0.039381 1.749301 0.106957 -0.160205 7.078903 5.990198 0.811325 3.424745 -8.940489 -1.725810 4.642731 8.894388 -0.276395 -0.385626 2.812031 -0.888974 -0.000105 -4.477917 1.799867 1.296893 0.000624 -0.000763 0.013953 1.124867 1.656576 2.562941 1.054079 -4.911884 3.525727 -4.029870 -0.104832 -0.187842 1.012889 -1.022877 -7.024438 4.648407 4.827714 8.989453 0.330148 0.360997 -6.969799 -17.205562 -3.360772 -0.335969 -0.207721 -4.900130 -1.239383 -16.759177 -10.539621 12.975870 27.408298 1.807521 1.762997 -10.742268 -2.719526 -10.696132 7.211175 7.050491 -1.574102 0.142708 2.607865 -2.673817 -0.000006 0.000002 -0.000000 7.869433 -4.442930 8.565953 11.047323 -0.624670 -0.813093 -2.314871 -0.379844 -11.282098 -10.302599 0.550373 13.316744 0.069063 5.337045 -5.457091 -0.000004 -0.000003 -0.000003 0.006104 0.000000 -0.000008 +-0.520400 19.980100 -4.580200 -97.171023 1.487000 -3.218990 -0.000000 0.000000 0.005542 5.466453 -0.833281 6.440459 3.361815 -0.471162 0.894329 -3.509606 0.593227 -4.604592 -1.449208 -0.243378 0.084394 -10.897921 0.540143 -0.191883 4.120917 -0.627962 -0.194532 1.478220 -2.060423 -3.556605 -4.919428 0.012668 0.009223 0.039621 -0.021931 1.022088 0.103649 -0.151699 6.708295 5.955786 0.796325 3.421950 -8.172207 -1.874000 4.575044 8.384610 -0.258962 -0.364718 3.285555 -0.755711 0.012242 -4.584686 1.714557 1.386255 0.000624 -0.000763 0.013953 1.370702 1.572785 2.646995 -0.102685 -5.123942 3.362532 -1.850430 -0.049773 -0.085346 0.116519 -0.797595 -7.141861 4.904764 4.679854 8.965971 0.335082 0.365765 -7.067511 -17.047754 -4.001610 0.980527 -1.291566 -5.229297 0.399883 -15.581950 -9.965657 13.428924 26.163448 1.708438 1.702953 -11.575867 -2.553160 -10.839409 8.301008 6.943104 -1.530204 0.146155 2.651750 -2.718973 -0.000007 0.000001 0.000002 7.682150 -4.032462 8.398867 11.172582 -0.632633 -0.821595 -1.609515 -0.381926 -11.407239 -10.711930 0.147184 13.568066 0.078486 5.469075 -5.583464 -0.000003 -0.000002 -0.000003 0.006103 0.000000 -0.000008 +-0.459400 20.010600 -4.586300 -97.370274 1.309089 -3.242116 -0.000001 0.000000 0.005542 6.119513 -0.756322 5.893404 3.360158 -0.364552 0.885408 -4.261762 0.665227 -4.105674 -1.652171 -0.184319 0.150615 -9.974782 0.442505 -0.020520 4.071411 -0.980445 0.019258 1.224787 -1.841236 -3.219107 -5.409045 0.012608 0.009325 0.046257 0.005149 -0.110703 0.098525 -0.138172 6.120916 5.935258 0.795414 3.417994 -7.435602 -1.955752 4.507922 7.742150 -0.237257 -0.338148 3.773422 -0.626304 0.003303 -4.613414 1.584803 1.474440 0.000625 -0.000763 0.013953 1.582455 1.487246 2.739398 -1.298451 -5.289642 3.171866 0.328906 0.009143 0.014980 -0.805240 -0.523384 -7.265672 5.190213 4.483623 8.942299 0.342145 0.372562 -7.207104 -16.822903 -4.525100 2.152392 -2.196128 -5.651683 2.048582 -14.417151 -9.354037 13.834259 24.918586 1.610684 1.640772 -12.413590 -2.399742 -10.949177 9.390685 6.836565 -1.484272 0.147701 2.671253 -2.739044 -0.000001 0.000002 -0.000001 7.476542 -3.606857 8.177854 11.353529 -0.644165 -0.833848 -0.914895 -0.340336 -11.538991 -11.095832 -0.285466 13.871661 0.089372 5.619829 -5.730745 -0.000003 -0.000002 -0.000003 0.006103 0.000000 -0.000008 +-0.380000 20.035000 -4.629000 -97.604510 1.133243 -3.265088 0.000001 0.000000 0.005543 6.621023 -0.709885 5.420049 3.344961 -0.290155 0.971313 -4.834346 0.699480 -3.651002 -1.771161 -0.150407 0.134499 -8.324004 0.340470 0.014903 4.330579 -1.117560 0.255166 2.187413 -1.341732 -2.261037 -6.248388 0.012499 0.009500 -1.468342 0.098751 -2.699370 -1.428382 -0.200579 4.672163 5.894200 0.793586 3.410069 -6.612059 -1.740454 4.372551 6.513048 -0.196570 -0.286648 4.421029 -0.388863 -0.000278 -4.388321 1.157317 1.620615 0.000008 -0.000002 -0.000001 1.795906 1.359501 2.964041 -2.633450 -5.185515 2.904428 2.368435 0.067702 0.106784 -1.677564 -0.016980 -7.483808 5.616852 3.940882 8.919682 0.353480 0.383402 -7.430453 -16.587323 -4.452111 2.846729 -2.073764 -6.260143 3.720055 -13.454253 -8.626590 14.013830 23.854495 1.528214 1.585955 -13.191906 -2.448849 -10.825741 10.421611 6.783924 -1.480026 0.134428 2.500579 -2.563446 -0.000004 0.000001 0.000001 7.137985 -3.132815 7.717616 11.757180 -0.670035 -0.861047 -0.366167 -0.191898 -11.672647 -11.393124 -0.872771 14.428766 0.100813 5.797856 -5.928922 -0.000004 -0.000002 -0.000003 0.006110 0.000000 -0.000007 +-0.319000 20.053300 -4.647300 -97.741027 0.951900 -3.290599 -0.000000 0.000000 0.005542 6.888606 -0.640058 4.949527 3.329675 -0.217375 1.071135 -5.134867 0.712906 -3.199450 -1.813195 -0.117363 0.097678 -7.477625 0.274390 0.013372 4.560892 -1.003459 0.297122 3.037446 -1.054338 -1.722911 -6.682048 0.012443 0.009590 -3.578337 0.284504 -4.149155 -3.581706 -0.251566 3.825615 5.880323 0.779517 3.411239 -6.287509 -1.572528 4.294442 6.038164 -0.181147 -0.266520 4.601008 -0.270658 0.011389 -4.192668 0.914943 1.700735 0.000008 -0.000002 -0.000001 1.978614 1.302036 3.062484 -3.210873 -5.074561 2.801555 3.136690 0.090600 0.140818 -2.035681 0.247708 -7.585759 5.882936 3.653484 8.917514 0.359518 0.389141 -7.549111 -16.242448 -3.313289 2.689696 -2.321230 -5.433849 4.154586 -13.097015 -8.126625 14.162214 23.437191 1.496153 1.564042 -13.341759 -2.471268 -10.770940 10.734386 6.599506 -1.481338 0.130351 2.446925 -2.508270 -0.000004 0.000003 -0.000001 6.745368 -2.705003 7.463914 12.188616 -0.697897 -0.889919 0.175140 -0.099590 -11.725766 -11.763033 -1.338631 14.704397 0.108048 5.905587 -6.048917 -0.000003 -0.000001 -0.000002 0.006104 0.000000 -0.000008 +-0.251800 20.065500 -4.665600 -97.848877 0.782970 -3.316942 0.000001 0.000000 0.005542 7.045355 -0.583348 4.491413 3.300683 -0.165737 1.168540 -5.317787 0.697461 -2.764196 -1.813242 -0.084233 0.060955 -6.785159 0.221290 0.008365 4.720877 -0.829876 0.301023 3.645674 -0.810222 -1.287595 -7.045755 0.012395 0.009665 -5.782529 0.537796 -5.289591 -5.825730 -0.267096 3.139183 5.866445 0.765447 3.412401 -6.157722 -1.433486 4.211111 5.800719 -0.173498 -0.256408 4.690745 -0.164710 0.001969 -4.002370 0.707339 1.780781 0.000009 -0.000001 -0.000001 2.118900 1.261058 3.135179 -3.513422 -4.961292 2.728117 3.437003 0.099677 0.154038 -2.214575 0.479411 -7.666942 6.091751 3.413719 8.918653 0.364500 0.393861 -7.646828 -15.912334 -2.187728 2.227742 -2.577995 -4.504376 4.027084 -12.877407 -7.668019 14.298654 23.179859 1.476462 1.550411 -13.433128 -2.492107 -10.732455 10.925973 6.414188 -1.485333 0.127423 2.407906 -2.468144 -0.000003 0.000003 -0.000001 6.309326 -2.280965 7.256871 12.675739 -0.729617 -0.922266 0.694803 -0.017791 -11.746729 -12.147320 -1.792672 14.921194 0.114195 5.994573 -6.148073 -0.000004 -0.000002 -0.000004 0.006103 0.000000 -0.000007 +-0.178600 20.071600 -4.683900 -97.921866 0.612050 -3.330050 -0.000000 0.000000 0.005543 7.103857 -0.521329 4.033930 3.271629 -0.115744 1.279868 -5.409741 0.676589 -2.330093 -1.785288 -0.051083 0.024264 -6.078701 0.168135 0.003953 4.741039 -0.667932 0.284701 3.713356 -0.561886 -0.889152 -7.409476 0.012347 0.009739 -7.958999 0.862848 -6.299379 -8.069862 -0.237795 2.523456 5.852854 0.771563 3.407842 -6.132473 -1.299364 4.129759 5.681997 -0.169689 -0.251340 4.690669 -0.076248 0.009116 -3.791084 0.502839 1.840250 0.000624 -0.000763 0.013953 2.259246 1.220247 3.207972 -3.689897 -4.838293 2.671810 3.534774 0.102648 0.158331 -2.314028 0.680227 -7.744932 6.272511 3.173311 8.922198 0.369489 0.398570 -7.744538 -15.600943 -0.979216 1.433654 -2.380429 -3.856245 3.257074 -12.726235 -7.229530 14.419036 22.999033 1.462663 1.540782 -13.503744 -2.515881 -10.691461 11.075985 6.221226 -1.485358 0.124531 2.368888 -2.428028 -0.000003 0.000002 0.000002 5.848621 -1.878391 7.053409 13.183737 -0.762989 -0.955709 1.194250 0.069086 -11.766803 -12.529997 -2.248151 15.135004 0.122869 6.093707 -6.238180 -0.000003 -0.000002 -0.000003 0.006108 0.000000 -0.000008 +-0.129800 20.071600 -4.702300 -97.966959 0.439517 -3.343616 -0.000000 0.000000 0.005543 7.093064 -0.464421 3.575791 3.214183 -0.052566 1.392775 -5.431631 0.652442 -1.896838 -1.743332 -0.016864 0.008522 -5.351276 0.107274 -0.019392 4.684126 -0.458545 0.238473 3.499562 -0.309712 -0.493145 -7.836143 0.012289 0.009827 -9.978316 1.204548 -7.137436 -10.159111 -0.185284 1.992826 5.839264 0.777686 3.403299 -6.156733 -1.161984 4.036654 5.577240 -0.166338 -0.246862 4.605285 0.025808 0.011207 -3.510592 0.310660 1.920741 0.001240 -0.001526 0.027909 2.344980 1.175700 3.293339 -3.786913 -4.735108 2.615086 3.520811 0.102222 0.157718 -2.362775 0.915259 -7.819680 6.425256 2.931878 8.913930 0.374488 0.403272 -7.842259 -15.295172 -0.155970 0.802594 -2.085240 -3.307295 2.487423 -12.665116 -6.819463 14.548023 22.880794 1.453656 1.534463 -13.548765 -2.557093 -10.644530 11.174455 6.040219 -1.508726 0.121666 2.329864 -2.387912 -0.000005 0.000002 0.000002 5.345514 -1.476089 6.827358 13.691687 -0.796654 -0.988855 1.683411 0.192443 -11.764028 -12.911101 -2.705045 15.345832 0.131692 6.192827 -6.328315 -0.000003 -0.000002 -0.000002 0.006106 0.000000 -0.000007 +-0.068700 20.065500 -4.720600 -97.872462 0.258809 -3.372169 -0.000000 0.000000 0.005543 6.893382 -0.404598 3.117972 3.114659 0.009437 1.505729 -5.327944 0.608202 -1.409648 -1.701369 0.018068 0.006725 -4.428035 0.019982 -0.031972 4.543254 -0.165708 0.141143 2.941300 -0.040609 -0.066535 -8.668486 0.012175 0.009995 -11.293674 1.487889 -7.682605 -11.540164 -0.113883 1.643507 5.839072 0.764227 3.407106 -6.145227 -0.979380 3.839436 5.262976 -0.156332 -0.233390 4.464959 0.199943 0.030881 -3.004191 0.003007 2.075227 0.001857 -0.002287 0.041863 2.426311 1.132238 3.461196 -3.945175 -4.595102 2.454212 3.576682 0.103922 0.160170 -2.413296 1.302338 -7.966475 6.580991 2.558001 8.923819 0.383792 0.411979 -8.023737 -15.036730 -0.126185 0.606195 -1.448225 -3.281098 2.137737 -12.823442 -6.428016 14.678703 22.859935 1.452068 1.533347 -13.569872 -2.702446 -10.631382 11.245534 5.932474 -1.550092 0.114259 2.227415 -2.282617 -0.000006 0.000003 0.000001 4.679541 -1.031443 6.412687 14.234427 -0.832949 -1.023940 2.103649 0.408868 -11.747921 -13.200062 -3.278196 15.744127 0.142432 6.315338 -6.444603 -0.000003 -0.000003 -0.000002 0.006104 0.000000 -0.000007 +-0.019900 20.053300 -4.714500 -97.587056 0.108790 -3.401045 0.000001 0.000000 0.005542 6.533798 -0.357529 2.707855 2.952583 0.051914 1.588623 -5.146903 0.567453 -1.028003 -1.659406 0.052999 0.004902 -4.148266 0.009307 -0.020494 4.487066 -0.045012 0.083920 2.717492 0.022577 0.031246 -9.214060 0.012099 0.010105 -10.862865 1.425708 -7.673882 -11.092301 -0.118269 1.669262 5.839072 0.764227 3.407107 -6.230847 -0.866340 3.746600 5.290910 -0.157219 -0.234590 4.310910 0.282796 0.036983 -2.772542 -0.147047 2.149842 0.002474 -0.003049 0.055818 2.486607 1.102426 3.532553 -3.900661 -4.491861 2.403599 3.437002 0.099677 0.154039 -2.403238 1.475915 -8.030472 6.669193 2.378404 8.932037 0.388094 0.415989 -8.107498 -14.872810 -0.418679 0.582645 -1.148188 -3.437310 1.937635 -13.151287 -6.231757 14.979199 22.839075 1.450481 1.532226 -13.480407 -2.672105 -10.807421 11.217921 5.778218 -1.584426 0.120947 2.320105 -2.377881 -0.000004 0.000001 0.000000 4.042062 -0.683727 6.257044 14.526655 -0.852628 -1.042690 2.405219 0.506064 -11.740019 -13.389388 -3.634928 15.884652 0.145833 6.371121 -6.517051 -0.000003 -0.000001 -0.000002 0.006099 0.000000 -0.000008 +0.016700 20.035000 -4.720600 -97.215828 -0.011393 -3.408372 -0.000001 0.000000 0.005543 6.118835 -0.316172 2.452116 2.769822 0.081282 1.656153 -4.965554 0.532923 -0.772036 -1.645414 0.072875 -0.017148 -3.987390 -0.001280 -0.008956 4.431043 0.028979 0.030677 2.528631 0.039217 0.062025 -9.738644 0.012025 0.010210 -10.432769 1.361992 -7.580758 -10.642661 -0.161559 1.904152 5.839074 0.764226 3.407105 -6.265896 -0.778829 3.663523 5.255994 -0.156110 -0.233091 4.184734 0.367887 0.043160 -2.579916 -0.275178 2.224228 0.003092 -0.003810 0.069773 2.512794 1.070046 3.611667 -3.856078 -4.388662 2.352918 3.332244 0.096502 0.149433 -2.398938 1.622965 -8.087674 6.728764 2.226121 8.940844 0.392403 0.419990 -8.191253 -14.763942 -0.795150 0.610779 -0.850489 -3.533740 1.889733 -13.584336 -6.245761 15.375249 22.846016 1.451009 1.532599 -13.303773 -2.573147 -11.146425 11.131130 5.669997 -1.593184 0.136660 2.529840 -2.593544 -0.000004 0.000001 0.000000 3.412866 -0.446525 6.114023 14.714524 -0.865331 -1.054690 2.706776 0.603301 -11.732631 -13.549263 -3.898981 16.025393 0.148590 6.417538 -6.579056 -0.000004 -0.000003 -0.000002 0.006108 0.000000 -0.000008 +0.004500 20.010600 -4.720600 -96.828423 0.140777 -3.387812 -0.000000 0.000000 0.005543 5.719730 -0.315340 2.529742 2.625058 0.005977 1.662203 -4.721708 0.460834 -0.804999 -1.645423 0.017712 -0.000302 -3.777560 -0.011838 0.002618 4.319122 0.103018 -0.022429 2.080991 0.035291 0.053057 -10.452087 0.011922 0.010351 -11.052698 0.947911 -5.445902 -11.094605 -0.670426 4.166332 5.839072 0.764226 3.407106 -5.997176 -0.666229 3.500516 4.571584 -0.134580 -0.203561 4.231215 0.487377 0.043292 -2.277475 -0.460044 2.371521 0.002783 -0.003430 0.062795 2.549665 1.014603 3.733032 -3.888955 -4.266933 2.272510 3.143674 0.090811 0.141127 -2.338178 1.860182 -8.207272 6.804506 1.982932 8.937714 0.399238 0.426316 -8.323877 -14.685894 -1.437146 0.835366 -0.277091 -3.488422 2.139306 -14.106256 -6.793600 15.739935 23.075545 1.468499 1.544861 -13.128392 -2.424297 -11.632164 10.973059 5.719565 -1.616505 0.159900 2.822391 -2.894633 -0.000003 0.000003 -0.000001 2.849344 -0.603076 5.804450 14.749303 -0.867688 -1.056908 3.048653 0.714155 -11.719272 -13.684495 -4.070958 16.250666 0.156161 6.493203 -6.643174 -0.000003 -0.000003 -0.000002 0.006104 0.000000 -0.000008 +-0.007700 20.010600 -4.714500 -96.545804 0.299265 -3.367933 -0.000000 0.000000 0.005542 5.391432 -0.332706 2.605098 2.550134 -0.064911 1.647257 -4.477907 0.389703 -0.865613 -1.645415 -0.037452 0.016543 -3.721604 -0.002794 0.006643 4.249181 0.129303 -0.046439 1.836187 0.031609 0.043939 -10.494062 0.011916 0.010360 -5.386802 0.133180 -2.137094 -5.385059 -0.130422 2.117019 5.839067 0.764224 3.407107 -5.428496 -0.607389 3.421794 3.356361 -0.097226 -0.150506 4.650216 0.512739 0.034575 -2.183972 -0.506169 2.422670 0.002474 -0.003049 0.055817 2.567155 0.992062 3.773730 -3.921956 -4.190926 2.263896 2.913199 0.083891 0.130949 -2.272717 1.927191 -8.236259 6.875969 1.921479 8.930137 0.401399 0.428311 -8.365754 -14.632978 -1.699872 0.875725 -0.055440 -3.417926 2.319920 -14.506150 -7.037779 15.665558 23.235503 1.480715 1.553366 -13.114756 -2.437392 -11.649701 10.928785 5.768451 -1.626879 0.160307 2.827267 -2.899654 -0.000005 0.000001 0.000002 2.394568 -0.771542 5.625672 14.811931 -0.871933 -1.060896 3.370868 0.753711 -11.720258 -13.865545 -4.148094 16.340900 0.159127 6.530643 -6.684991 -0.000003 -0.000004 -0.000002 0.006098 0.000000 -0.000008 +-0.019900 19.998400 -4.720600 -96.429165 0.376500 -3.347648 -0.000001 0.000000 0.005542 5.223660 -0.338686 2.646627 2.530132 -0.099447 1.636299 -4.338547 0.354054 -0.902907 -1.645410 -0.050703 0.031233 -3.700620 0.006248 0.010660 4.214220 0.137651 -0.059604 1.738271 0.022269 0.047461 -10.501050 0.011915 0.010361 0.491880 0.013509 -0.005204 0.499266 -0.016374 -0.000139 5.839076 0.764227 3.407105 -5.164410 -0.577889 3.398557 2.776684 -0.079806 -0.124921 4.860059 0.521175 0.027590 -2.160907 -0.515921 2.437171 0.002165 -0.002668 0.048840 2.555634 0.986336 3.785246 -4.232193 -4.176645 2.234427 3.248433 0.093970 0.145743 -2.415204 1.931866 -8.253603 6.918296 1.908295 8.922222 0.402120 0.428975 -8.379715 -14.610731 -1.781106 0.877305 0.013002 -3.377056 2.399130 -14.692075 -7.165353 15.615906 23.367652 1.490826 1.560364 -13.156319 -2.441915 -11.673979 10.918476 5.787962 -1.639950 0.159511 2.817516 -2.889614 -0.000004 0.000002 -0.000001 2.124900 -0.857122 5.534989 14.944131 -0.880908 -1.069301 3.571163 0.771104 -11.722274 -14.029581 -4.195829 16.368748 0.160988 6.554042 -6.711130 -0.000003 -0.000002 -0.000002 0.006110 0.000000 -0.000007 diff --git a/data/gradio_target_bvh/animo/malayan_tapir_male_standidle01.bvh b/data/gradio_target_bvh/animo/malayan_tapir_male_standidle01.bvh new file mode 100644 index 0000000000000000000000000000000000000000..59eadfeda6e5dd1c7f0ef349cf8614f0ab8c47f0 --- /dev/null +++ b/data/gradio_target_bvh/animo/malayan_tapir_male_standidle01.bvh @@ -0,0 +1,559 @@ +HIERARCHY +ROOT def_c_root_joint +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT def_c_hips_joint + { + OFFSET -0.000000 -0.646700 -2.580300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine1_joint + { + OFFSET 0.000000 -1.517500 0.186900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine2_joint + { + OFFSET 0.000000 -12.228400 1.506400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine3_joint + { + OFFSET 0.000100 -20.420900 1.919900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_chest_joint + { + OFFSET -0.000100 -18.799900 -0.892400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck1_joint + { + OFFSET 0.010200 -28.422500 -17.363600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck2_joint + { + OFFSET -0.000100 -8.353600 6.849300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_head_joint + { + OFFSET -0.010100 -7.647500 7.655200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_jaw_joint + { + OFFSET -0.000000 -7.703200 -16.531900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.029433 -17.427767 -12.023000 + } + } + JOINT def_eye_joint.L + { + OFFSET 7.009400 -22.890000 -13.031300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 4.937000 -2.279700 -0.605800 + } + } + JOINT def_eye_joint.R + { + OFFSET -7.009400 -22.890000 -13.031300 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -4.937000 -2.279700 -0.605800 + } + } + } + } + } + JOINT def_clavicle_joint.L + { + OFFSET 11.984000 -22.528200 -0.276300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.L + { + OFFSET 0.235200 0.377000 -26.539900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.L + { + OFFSET 0.409900 12.182000 -15.120600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.L + { + OFFSET -1.620600 -2.914800 -22.032200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.L + { + OFFSET -0.234300 -2.189900 -13.671900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.264350 -1.475125 -1.646100 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.L + { + OFFSET -0.810300 -1.457400 -11.016100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.486200 -0.874400 -6.609700 + } + } + } + } + } + JOINT def_clavicle_joint.R + { + OFFSET -11.984000 -22.528200 -0.276300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.R + { + OFFSET -0.235200 0.377000 -26.539900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.R + { + OFFSET -0.409900 12.182000 -15.120600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.R + { + OFFSET 1.620600 -2.914800 -22.032200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.R + { + OFFSET 0.234300 -2.189900 -13.671900 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.264350 -1.475125 -1.646100 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.R + { + OFFSET 0.810300 -1.457400 -11.016100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.486200 -0.874400 -6.609700 + } + } + } + } + } + } + } + } + } + JOINT def_c_tail1_joint + { + OFFSET -0.000000 37.465300 -14.270100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_tail2_joint + { + OFFSET -0.000000 3.003300 -2.884500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.725700 -1.016800 + } + } + } + JOINT def_rearLegUpr_joint.L + { + OFFSET 11.139900 18.248600 -7.842800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.L + { + OFFSET 1.406700 -8.399200 -25.005200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.L + { + OFFSET -1.204600 7.192300 -22.072900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.L + { + OFFSET 0.103000 -0.265100 -12.992400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.106700 -2.245633 -9.063767 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.L + { + OFFSET -0.602300 3.596200 -11.036400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.361400 2.157700 -6.621900 + } + } + } + JOINT def_rearLegUprAllTwist_joint.L + { + OFFSET 0.703400 -4.199600 -12.502600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.422000 -2.519800 -7.501600 + } + } + } + JOINT def_rearLegUpr_joint.R + { + OFFSET -10.717700 18.248700 -7.842800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.R + { + OFFSET -1.853900 -8.389600 -24.861100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.R + { + OFFSET 1.229600 7.182700 -22.217000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.R + { + OFFSET -0.103100 -0.265100 -12.992400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.106667 -2.245567 -9.063767 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.R + { + OFFSET 0.614800 3.591300 -11.108500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.368900 2.154800 -6.665100 + } + } + } + JOINT def_rearLegUprAllTwist_joint.R + { + OFFSET -0.927000 -4.194800 -12.430600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.556200 -2.516900 -7.458300 + } + } + } + JOINT def_c_anus_joint + { + OFFSET -0.000000 33.595300 -16.219000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 6.935000 0.000000 + } + } + } +} +MOTION +Frames: 300 +Frame Time: 0.033333 +0.000000 79.557367 0.000000 -90.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 +0.847300 78.257900 -36.811100 -79.865484 -0.965145 6.835512 -0.002181 -0.000181 0.005289 -2.180380 -1.400101 -10.260953 -11.191341 -1.044461 -0.369468 -5.881700 0.994588 4.536119 7.909348 -0.118788 -3.213435 0.258570 -0.010129 -0.010447 -0.508050 -0.370025 0.461267 -2.429746 -0.100651 -0.062429 -10.194172 -0.000018 -0.000004 0.000772 0.001397 -0.000214 0.000774 -0.001497 0.000266 -8.025305 9.713880 -0.259769 13.776484 -7.024007 -1.663058 1.756185 -0.188853 -0.102987 -2.101405 2.775781 6.799305 -4.732793 -3.094213 0.119980 0.594568 0.598039 6.874970 1.793369 -12.583427 -3.479710 9.914120 14.668289 13.806081 1.655212 0.179038 0.095685 -2.606158 0.779981 -19.322361 -10.061291 -1.873614 3.635493 0.978181 -1.789237 -19.129121 -18.395858 -1.397597 -1.196500 -14.822163 0.287110 -0.950161 0.636402 1.186702 -23.418128 -2.273863 -0.380715 -0.007548 9.558847 -1.663050 32.687872 -15.444567 8.143683 -0.679349 3.987481 -8.035986 31.927070 0.000006 0.000005 0.000009 -10.609534 0.262374 10.642626 2.273964 -0.447354 -0.009833 -3.513399 4.901604 -25.898932 -9.418749 -0.098965 -5.159089 2.751964 6.513051 -24.970733 -0.000000 0.000004 -0.000004 -0.007868 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.865484 -0.965145 6.835512 -0.002181 -0.000181 0.005289 -2.180380 -1.400101 -10.260953 -11.191341 -1.044460 -0.369468 -5.881697 0.994588 4.536119 7.909347 -0.118788 -3.213436 0.258571 -0.010129 -0.010447 -0.508057 -0.370026 0.461267 -2.429740 -0.100651 -0.062429 -10.194160 -0.000017 -0.000004 0.000775 0.001397 -0.000212 0.000775 -0.001496 0.000266 -8.025304 9.713881 -0.259770 13.776474 -7.024007 -1.663056 1.756186 -0.188853 -0.102987 -2.101405 2.775779 6.799305 -4.732795 -3.094213 0.119979 0.594567 0.598038 6.874968 1.793369 -12.583425 -3.479710 9.914136 14.668296 13.806077 1.655212 0.179041 0.095686 -2.606155 0.779981 -19.322361 -10.061296 -1.873614 3.635497 0.978183 -1.789237 -19.129120 -18.395858 -1.397597 -1.196500 -14.822163 0.287110 -0.950161 0.636402 1.186702 -23.418128 -2.273865 -0.380715 -0.007548 9.558846 -1.663050 32.687872 -15.444567 8.143682 -0.679348 3.987482 -8.035983 31.927074 0.000006 0.000005 0.000009 -10.609534 0.262374 10.642626 2.273964 -0.447354 -0.009833 -3.513399 4.901604 -25.898932 -9.418749 -0.098965 -5.159089 2.751964 6.513051 -24.970733 -0.000000 0.000004 -0.000004 -0.007868 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.865484 -0.965145 6.835512 -0.002181 -0.000181 0.005289 -2.180380 -1.400102 -10.260960 -11.191344 -1.044461 -0.369468 -5.881700 0.994589 4.536116 7.909346 -0.118787 -3.213435 0.258561 -0.010129 -0.010447 -0.508064 -0.370025 0.461268 -2.429744 -0.100651 -0.062429 -10.194159 -0.000017 -0.000004 0.000775 0.001397 -0.000212 0.000775 -0.001493 0.000263 -8.025302 9.713879 -0.259771 13.776476 -7.024010 -1.663057 1.756183 -0.188853 -0.102986 -2.101402 2.775781 6.799302 -4.732796 -3.094212 0.119979 0.594571 0.598037 6.874967 1.779045 -12.582904 -3.482709 9.927695 14.673061 13.803472 1.669090 0.180554 0.096469 -2.606159 0.779980 -19.322371 -10.081962 -1.877398 3.634814 0.978184 -1.789238 -19.129123 -18.395858 -1.397597 -1.196500 -14.822163 0.287110 -0.950161 0.636402 1.186702 -23.418128 -2.273865 -0.380714 -0.007548 9.558845 -1.663052 32.687868 -15.444565 8.143681 -0.679347 3.987485 -8.035982 31.927074 0.000006 0.000005 0.000009 -10.609534 0.262374 10.642626 2.273964 -0.447354 -0.009833 -3.513399 4.901604 -25.898932 -9.418749 -0.098965 -5.159089 2.751964 6.513051 -24.970733 -0.000000 0.000004 -0.000004 -0.007868 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.865484 -0.965145 6.835512 -0.002181 -0.000181 0.005289 -2.180380 -1.400101 -10.260956 -11.191343 -1.044460 -0.369468 -5.881700 0.994588 4.536117 7.909347 -0.118788 -3.213436 0.258570 -0.010129 -0.010446 -0.508057 -0.370025 0.461268 -2.408750 -0.100674 -0.062392 -10.194160 -0.000017 -0.000004 0.000773 0.001398 -0.000226 0.000776 -0.001497 0.000263 -8.025299 9.713890 -0.259765 13.776480 -7.024008 -1.663055 1.756183 -0.188853 -0.102988 -2.101403 2.775780 6.799305 -4.732799 -3.094212 0.119980 0.594571 0.598038 6.874965 1.764723 -12.582374 -3.485713 9.941258 14.677814 13.800861 1.682969 0.182068 0.097252 -2.606156 0.779980 -19.322371 -10.102610 -1.881180 3.634146 0.978184 -1.789235 -19.129109 -18.395858 -1.397597 -1.196500 -14.822163 0.287110 -0.950161 0.636402 1.186702 -23.418128 -2.273865 -0.380714 -0.007548 9.558847 -1.663052 32.687872 -15.444567 8.143683 -0.679347 3.987487 -8.035986 31.927081 0.000006 0.000005 0.000009 -10.609534 0.262374 10.642626 2.273964 -0.447354 -0.009833 -3.513399 4.901604 -25.898932 -9.420288 -0.112871 -5.159087 2.751964 6.513051 -24.970733 -0.000000 0.000004 -0.000004 -0.007868 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.865484 -0.965145 6.835512 -0.002181 -0.000181 0.005289 -2.180380 -1.400102 -10.260960 -11.191343 -1.044461 -0.369468 -5.895640 0.993483 4.536357 7.909348 -0.118788 -3.213436 0.258559 -0.010129 -0.010447 -0.508054 -0.370026 0.461268 -2.408745 -0.100674 -0.062392 -10.194160 -0.000018 -0.000003 0.000775 0.001398 -0.000226 0.000774 -0.001496 0.000261 -8.025305 9.713899 -0.259762 13.804626 -7.025457 -1.659374 1.756187 -0.188856 -0.102987 -2.101403 2.775779 6.799305 -4.732798 -3.094213 0.119984 0.594575 0.598038 6.874966 1.750401 -12.581835 -3.488711 9.957304 14.674124 13.808503 1.696853 0.183581 0.098032 -2.585678 0.775394 -19.322646 -10.123260 -1.884961 3.633455 0.978182 -1.789236 -19.129113 -18.378477 -1.566330 -1.245436 -14.793276 0.339447 -1.024331 0.636402 1.186702 -23.418128 -2.273865 -0.380714 -0.007548 9.558845 -1.663052 32.687865 -15.444565 8.143682 -0.679347 3.987488 -8.035987 31.927084 0.000006 0.000005 0.000009 -10.609534 0.262374 10.642626 2.273964 -0.447354 -0.009833 -3.513399 4.901604 -25.898932 -9.421812 -0.126777 -5.159091 2.751964 6.513051 -24.970733 -0.000000 0.000004 -0.000004 -0.007868 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.865484 -0.965145 6.835512 -0.002181 -0.000181 0.005289 -2.180379 -1.400101 -10.260956 -11.191342 -1.044460 -0.369468 -5.909600 0.992376 4.536600 7.909351 -0.118788 -3.213436 0.258561 -0.010129 -0.010447 -0.528956 -0.380081 0.471001 -2.408748 -0.100674 -0.062391 -10.194159 -0.000017 -0.000003 0.000774 0.001398 -0.000226 0.000773 -0.001496 0.000271 -8.025304 9.713896 -0.259762 13.783519 -7.024364 -1.662133 1.804770 -0.194158 -0.105709 -2.115449 2.796541 6.797083 -4.732799 -3.094213 0.119983 0.594570 0.598038 6.874964 1.721757 -12.580782 -3.494713 9.973330 14.670428 13.816150 1.710735 0.185096 0.098801 -2.578854 0.773870 -19.322745 -10.143900 -1.888741 3.632778 0.978182 -1.789237 -19.129120 -18.269761 -2.298813 -1.459075 -14.600574 0.519862 -1.392554 0.636402 1.186702 -23.418128 -2.273865 -0.380714 -0.007548 9.558845 -1.663052 32.687865 -15.458718 8.143583 -0.677345 3.987487 -8.035985 31.927081 0.000006 0.000005 0.000009 -10.609039 0.278360 10.688907 2.273960 -0.447352 -0.009837 -3.502862 4.918721 -25.949166 -9.437242 -0.139153 -5.159133 2.761955 6.527392 -25.025052 -0.001980 -0.008918 -0.026447 -0.007868 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.865481 -0.965142 6.821537 -0.002187 -0.000181 0.005289 -2.159727 -1.403839 -10.260459 -11.212316 -1.044324 -0.369846 -5.909598 0.992377 4.536601 7.909349 -0.118789 -3.213436 0.258568 -0.001276 0.000383 -0.549885 -0.390141 0.480731 -2.380764 -0.100705 -0.062343 -10.194156 -0.000017 -0.000003 0.000776 0.001398 -0.000221 0.000778 -0.001497 0.000266 -8.025305 9.713894 -0.259762 13.804617 -7.025459 -1.659372 1.777008 -0.191125 -0.104153 -2.101454 2.803491 6.795432 -4.732798 -3.094212 0.119982 0.594571 0.598038 6.874969 1.693112 -12.579719 -3.500710 10.010361 14.676475 13.794654 1.696859 0.183582 0.098031 -2.551541 0.767755 -19.323104 -10.164560 -1.892523 3.632098 0.978179 -1.789236 -19.129111 -18.043487 -2.997297 -1.634548 -14.253719 0.666483 -1.723070 0.642356 1.210774 -23.345421 -2.273870 -0.380714 -0.007549 9.559844 -1.663730 32.624972 -15.472842 8.143477 -0.675346 3.975760 -8.022820 31.872313 0.011616 0.015375 -0.004507 -10.608954 0.280646 10.695508 2.273957 -0.447352 -0.009835 -3.491605 4.936449 -25.950532 -9.450380 -0.130673 -5.159155 2.761952 6.527397 -25.025069 -0.001973 -0.008918 -0.026452 -0.007874 0.000003 -0.000038 +0.847300 78.257900 -36.811100 -79.865481 -0.965142 6.807528 -0.002186 -0.000181 0.005291 -2.159730 -1.403837 -10.260447 -11.219311 -1.044277 -0.369974 -5.909597 0.992379 4.536602 7.923302 -0.119618 -3.213397 0.258568 0.007579 0.011215 -0.570787 -0.400204 0.490457 -2.373779 -0.100712 -0.062331 -10.194158 -0.000017 -0.000004 0.000775 0.001399 -0.000222 0.000775 -0.001495 0.000263 -8.025306 9.713897 -0.259762 13.790559 -7.024729 -1.661210 1.797834 -0.193399 -0.105323 -2.115474 2.810394 6.795154 -4.734414 -3.108107 0.119891 0.594569 0.598039 6.874968 1.685955 -12.579442 -3.502209 10.029520 14.666925 13.787329 1.717676 0.185851 0.099193 -2.534870 0.778217 -19.325281 -10.185203 -1.896303 3.631416 0.978183 -1.789235 -19.129111 -17.734120 -3.674711 -1.754992 -13.787690 0.791021 -2.033153 0.639658 1.199823 -23.378469 -2.273875 -0.380715 -0.007545 9.559296 -1.663354 32.659946 -15.465775 8.143526 -0.676345 3.984548 -8.032693 31.913386 0.011610 0.015375 -0.004506 -10.608888 0.282932 10.702126 2.273961 -0.447353 -0.009828 -3.495356 4.930542 -25.950076 -9.437248 -0.139154 -5.159131 2.761953 6.527392 -25.025050 -0.001972 -0.008919 -0.026448 -0.007870 0.000003 -0.000039 +0.859500 78.257900 -36.811100 -79.865481 -0.965142 6.807528 -0.002186 -0.000181 0.005290 -2.159730 -1.403837 -10.260447 -11.226407 -1.058141 -0.368597 -5.930502 0.990717 4.536956 7.937266 -0.120449 -3.213363 0.258569 0.007579 0.011214 -0.591699 -0.410272 0.500180 -2.366778 -0.100720 -0.062318 -10.194150 -0.000018 -0.000003 0.000778 0.001399 -0.000227 0.000777 -0.001495 0.000263 -8.053674 9.714659 -0.255216 13.776486 -7.024003 -1.663055 1.853370 -0.199464 -0.108431 -2.129493 2.820205 6.815654 -4.736052 -3.122006 0.119807 0.595362 0.599976 6.888794 1.678797 -12.579188 -3.503711 10.042148 14.672493 13.794767 1.724624 0.186612 0.099588 -2.518186 0.788683 -19.327439 -10.205857 -1.900084 3.630730 0.978180 -1.789234 -19.129116 -17.285081 -3.903986 -1.641302 -13.187313 0.746453 -2.117628 0.626610 1.205362 -23.371579 -2.287666 -0.383023 -0.007639 9.559294 -1.663356 32.659946 -15.458692 8.143585 -0.677354 3.984554 -8.032689 31.913376 0.025404 0.017684 -0.004515 -10.608823 0.285214 10.708740 2.273971 -0.447354 -0.009834 -3.487848 4.942359 -25.951005 -9.438019 -0.146106 -5.159127 2.761960 6.527389 -25.025050 -0.001967 -0.008921 -0.026450 -0.007871 0.000004 -0.000040 +0.865700 78.257900 -36.811100 -79.863825 -0.979032 6.807567 -0.002180 -0.000181 0.005291 -2.139432 -1.409513 -10.273805 -11.233493 -1.072005 -0.367221 -5.951379 0.988292 4.551288 7.937266 -0.120449 -3.213363 0.258561 0.007579 0.011215 -0.598619 -0.420230 0.510008 -2.380763 -0.100704 -0.062343 -10.194156 -0.000017 -0.000003 0.000776 0.001399 -0.000220 0.000777 -0.001500 0.000271 -8.053677 9.714657 -0.255217 13.797591 -7.025091 -1.660293 1.846416 -0.198704 -0.108041 -2.143511 2.827100 6.815365 -4.736049 -3.122003 0.119809 0.596151 0.601914 6.902616 1.671642 -12.578929 -3.505213 10.054780 14.678085 13.802222 1.731565 0.187368 0.099973 -2.506052 0.778865 -19.326618 -10.226508 -1.903864 3.630049 0.978183 -1.789237 -19.129109 -16.699727 -3.777917 -1.356591 -12.457213 0.611243 -1.997770 0.618409 1.230616 -23.305188 -2.301460 -0.385331 -0.007729 9.569082 -1.674920 32.597505 -15.472825 8.143473 -0.675340 3.972831 -8.019526 31.858618 0.035928 0.039585 -0.011280 -10.608968 0.280650 10.695520 2.273952 -0.447352 -0.009832 -3.480144 4.954357 -25.937911 -9.438783 -0.153058 -5.159138 2.761955 6.527391 -25.025053 0.001809 0.010550 -0.033304 -0.007869 0.000003 -0.000037 +0.865700 78.257900 -36.811100 -79.862164 -0.992921 6.807586 -0.002181 -0.000181 0.005291 -2.132892 -1.412697 -10.287497 -11.240439 -1.065004 -0.368102 -5.951318 0.987531 4.565251 7.937267 -0.120449 -3.213364 0.272537 0.016437 0.022043 -0.626530 -0.430362 0.519666 -2.394734 -0.081556 -0.053753 -10.194150 -0.000017 -0.000003 0.000776 0.001399 -0.000222 0.000773 -0.001495 0.000268 -8.067862 9.715041 -0.252943 13.790058 -7.035606 -1.670051 1.901947 -0.204773 -0.111141 -2.171580 2.854758 6.812883 -4.736051 -3.122003 0.133793 0.596944 0.603853 6.916442 1.642995 -12.577856 -3.511207 10.067398 14.683652 13.809653 1.738497 0.188123 0.100360 -2.493912 0.769045 -19.325844 -10.247166 -1.907646 3.629362 0.978186 -1.789237 -19.129118 -16.006798 -3.476580 -0.904122 -11.629370 0.459712 -1.759084 0.625205 1.228931 -23.305338 -2.315256 -0.387640 -0.007826 9.577853 -1.685811 32.598041 -15.486856 8.129379 -0.673361 3.972829 -8.019522 31.858611 0.048627 0.048419 -0.013548 -10.608601 0.292065 10.728558 2.253358 -0.443299 -0.009829 -3.461174 4.958339 -25.967879 -9.439540 -0.160013 -5.159124 2.766965 6.534558 -25.052219 0.001804 0.010552 -0.033301 -0.007872 0.000004 -0.000040 +0.847300 78.257900 -36.811100 -79.849102 -0.984325 6.793810 -0.002181 -0.000181 0.005292 -2.125833 -1.412977 -10.280390 -11.247385 -1.058007 -0.368984 -5.951348 0.987912 4.558266 7.937263 -0.120448 -3.213363 0.286529 0.025297 0.032867 -0.654317 -0.455352 0.544145 -2.408721 -0.081543 -0.053772 -10.194153 -0.000017 -0.000003 0.000773 0.001400 -0.000222 0.000772 -0.001499 0.000269 -8.067864 9.715041 -0.252941 13.782509 -7.046126 -1.679814 1.922761 -0.207044 -0.112305 -2.199621 2.870494 6.826197 -4.736055 -3.122003 0.147788 0.596549 0.602885 6.909532 1.613798 -12.590768 -3.517533 10.086549 14.674105 13.802330 1.766261 0.191153 0.101924 -2.477230 0.779508 -19.328003 -10.267823 -1.911427 3.628670 0.978181 -1.789238 -19.129120 -15.259623 -3.065977 -0.347979 -10.737583 0.319461 -1.434977 0.679017 1.242682 -23.359766 -2.370438 -0.396873 -0.008200 9.596433 -1.687156 32.668877 -15.486841 8.129371 -0.673365 3.988956 -8.037631 31.933931 0.000002 0.000004 -0.000002 -10.608755 0.287496 10.715346 2.253370 -0.443301 -0.009828 -3.449005 4.951118 -25.948027 -9.442588 -0.187823 -5.159139 2.764454 6.530979 -25.038633 0.001806 0.010551 -0.033296 -0.007872 0.000003 -0.000040 +0.847300 78.257900 -36.811100 -79.836033 -0.975718 6.780102 -0.002178 -0.000181 0.005291 -2.116305 -1.399629 -10.275194 -11.268469 -1.071778 -0.367865 -5.972298 0.986626 4.551641 7.951239 -0.121280 -3.213334 0.300517 0.034161 0.043692 -0.682096 -0.480354 0.568608 -2.422715 -0.077389 -0.028915 -10.194141 -0.000018 -0.000003 0.000776 0.001398 -0.000220 0.000777 -0.001502 0.000281 -8.082052 9.715430 -0.250669 13.775733 -7.040316 -1.676318 1.978297 -0.213118 -0.115398 -2.227675 2.886225 6.839527 -4.738471 -3.142844 0.140660 0.596942 0.603854 6.916443 1.613255 -12.604731 -3.517843 10.078542 14.675949 13.798503 1.794028 0.194185 0.103472 -2.460550 0.789969 -19.330161 -10.288476 -1.915207 3.627980 0.978182 -1.789236 -19.129120 -14.433453 -2.531595 0.384186 -9.761872 0.146283 -1.057527 0.681139 1.251295 -23.355437 -2.377348 -0.398030 -0.008249 9.596425 -1.687159 32.668849 -15.486863 8.129370 -0.673364 3.988948 -8.037632 31.933925 0.012707 0.008846 -0.002255 -10.608930 0.315742 10.668593 2.239638 -0.440598 -0.009821 -3.454124 4.955562 -25.891575 -9.443366 -0.194774 -5.159145 2.755703 6.518429 -24.991099 -0.003233 -0.015410 -0.024163 -0.007873 0.000003 -0.000040 +0.865700 78.257900 -36.798900 -79.841330 -0.990436 6.779989 -0.002180 -0.000181 0.005291 -2.107297 -1.389186 -10.290795 -11.289548 -1.085552 -0.366754 -5.993158 0.984196 4.565970 7.965195 -0.122110 -3.213299 0.300512 0.043014 0.054521 -0.723840 -0.505500 0.592932 -2.471667 -0.064611 -0.023234 -10.194145 -0.000016 -0.000002 0.000776 0.001400 -0.000227 0.000773 -0.001498 0.000268 -8.082054 9.715437 -0.250669 13.768958 -7.034514 -1.672819 2.013011 -0.216917 -0.117325 -2.255715 2.900010 6.839002 -4.718416 -3.152216 0.134765 0.597335 0.604823 6.923351 1.555400 -12.616573 -3.530210 10.118026 14.694459 13.785525 1.856497 0.201003 0.106971 -2.448409 0.780152 -19.329348 -10.305342 -1.939626 3.627411 0.978185 -1.789236 -19.129121 -13.542444 -1.613217 1.109436 -8.716290 0.481074 -0.077842 0.681657 1.253338 -23.370954 -2.384247 -0.399184 -0.008300 9.596200 -1.687008 32.682841 -15.486855 8.129376 -0.673367 3.993357 -8.042565 31.954480 0.025404 0.017684 -0.004506 -10.608710 0.322593 10.688419 2.225919 -0.437899 -0.009809 -3.448388 4.951648 -25.906120 -9.444122 -0.201727 -5.173135 2.759460 6.523807 -25.011475 -0.003240 -0.015407 -0.024160 -0.007871 0.000003 -0.000040 +0.865700 78.270100 -36.792800 -79.846625 -1.005152 6.779913 -0.002187 -0.000180 0.005290 -2.103241 -1.405998 -10.302583 -11.310536 -1.085417 -0.367147 -6.014007 0.981760 4.580280 7.979173 -0.122941 -3.213268 0.300498 0.051869 0.065353 -0.765569 -0.530665 0.617236 -2.548615 -0.064579 -0.023321 -10.194157 -0.000017 -0.000003 0.000777 0.001397 -0.000212 0.000775 -0.001495 0.000266 -8.102940 9.729984 -0.247116 13.761410 -7.045026 -1.682582 2.068531 -0.222989 -0.120413 -2.283763 2.913799 6.838484 -4.712251 -3.159962 0.149095 0.597731 0.605793 6.930261 1.541077 -12.616024 -3.533212 10.082876 14.686794 13.786937 1.946735 0.210862 0.111997 -2.484059 0.781038 -19.327902 -10.327246 -1.936523 3.626674 0.978180 -1.789235 -19.129120 -12.633638 -0.106646 1.615075 -7.640214 1.560780 1.711158 0.684317 1.264148 -23.360017 -2.391137 -0.400337 -0.008350 9.612303 -1.673660 32.697424 -15.486858 8.129367 -0.673368 3.993354 -8.042561 31.954459 0.038115 0.026525 -0.006769 -10.608493 0.329444 10.708247 2.212191 -0.435198 -0.009805 -3.435160 4.959556 -25.921539 -9.446420 -0.222586 -5.187130 2.760704 6.525601 -25.018256 -0.003231 -0.015410 -0.024167 -0.007872 0.000004 -0.000039 +0.871800 78.270100 -36.792800 -79.833552 -0.996563 6.780099 -0.002179 -0.000181 0.005289 -2.094939 -1.399469 -10.296436 -11.310544 -1.085417 -0.367147 -6.014008 0.981761 4.580283 7.993139 -0.123772 -3.213234 0.328456 0.060756 0.076156 -0.807198 -0.565751 0.651405 -2.674528 -0.064528 -0.023463 -10.194150 -0.000018 -0.000003 0.000777 0.001397 -0.000226 0.000777 -0.001498 0.000271 -8.102943 9.729987 -0.247115 13.733500 -7.038116 -1.681849 2.124059 -0.229069 -0.123491 -2.325822 2.927557 6.838696 -4.706096 -3.167715 0.163422 0.598127 0.606762 6.937176 1.526758 -12.615497 -3.536223 10.119262 14.690234 13.790660 1.925918 0.208589 0.110843 -2.458266 0.768164 -19.327284 -10.349163 -1.933423 3.625938 0.978189 -1.789236 -19.129120 -11.749010 1.830093 1.946326 -6.629620 3.190137 4.109323 0.742845 1.267685 -23.396804 -2.473927 -0.414189 -0.008938 9.650173 -1.687346 32.727241 -15.508047 8.129208 -0.670366 4.003634 -8.054071 32.002401 0.001092 -0.006527 0.002260 -10.608138 0.340864 10.741295 2.219045 -0.436546 -0.009807 -3.422128 4.967288 -25.950945 -9.448728 -0.243442 -5.180148 2.769462 6.538140 -25.065792 0.019875 -0.006488 -0.028895 -0.007871 0.000004 -0.000039 +0.884000 78.276200 -36.786700 -79.820488 -0.987964 6.759351 -0.002188 -0.000180 0.005290 -2.086642 -1.392937 -10.290292 -11.324513 -1.085325 -0.367409 -6.027971 0.980645 4.580529 7.993135 -0.123772 -3.213235 0.356452 0.053408 0.100240 -0.876685 -0.611044 0.675340 -2.828384 -0.053980 0.004126 -10.194167 -0.000018 -0.000003 0.000777 0.001398 -0.000215 0.000776 -0.001498 0.000266 -8.117130 9.730371 -0.244836 13.740864 -7.035171 -1.696171 2.179589 -0.235150 -0.126560 -2.367883 2.944209 6.859681 -4.699941 -3.175463 0.156765 0.598518 0.607732 6.944091 1.498223 -12.614605 -3.528226 10.155638 14.693663 13.794374 1.953680 0.211622 0.112391 -2.456752 0.774925 -19.328279 -10.367297 -1.950962 3.625318 0.978183 -1.789236 -19.129118 -10.867892 4.316008 2.015673 -5.727673 5.540591 7.279738 0.738185 1.277983 -23.392336 -2.487724 -0.416497 -0.009039 9.644744 -1.691744 32.727080 -15.507941 8.115220 -0.670382 4.005088 -8.055714 32.009234 0.019597 0.009998 -0.002259 -10.608069 0.343144 10.747905 2.225925 -0.437901 -0.009806 -3.408692 4.975365 -25.952402 -9.451035 -0.264297 -5.173161 2.769465 6.538139 -25.065795 0.029255 0.005141 -0.033522 -0.007872 0.000003 -0.000040 +0.884000 78.288400 -36.774500 -79.825792 -1.002682 6.752253 -0.002183 -0.000181 0.005288 -2.065106 -1.391811 -10.304610 -11.338600 -1.099144 -0.366169 -6.041918 0.979528 4.580765 7.993136 -0.123772 -3.213234 0.384374 0.075598 0.127287 -0.946129 -0.656368 0.699220 -3.017239 -0.037754 0.018966 -10.194159 -0.000017 -0.000003 0.000777 0.001398 -0.000215 0.000777 -0.001496 0.000264 -8.117128 9.730369 -0.244836 13.705983 -7.030001 -1.716021 2.262878 -0.244281 -0.131155 -2.409949 2.958918 6.866846 -4.693791 -3.183219 0.164105 0.599706 0.610641 6.964824 1.469687 -12.613753 -3.520239 10.101337 14.695543 13.803118 2.064733 0.223767 0.118562 -2.480256 0.765992 -19.326020 -10.387963 -1.954743 3.624619 0.978183 -1.789237 -19.129126 -10.093674 7.313852 1.982545 -5.029552 8.098011 10.926614 0.733088 1.286508 -23.328123 -2.501518 -0.418805 -0.009137 9.649093 -1.707706 32.664475 -15.507847 8.101240 -0.670395 3.993347 -8.042561 31.954463 0.038115 0.026525 -0.006771 -10.608150 0.340865 10.741303 2.205331 -0.433847 -0.009802 -3.395044 4.983616 -25.939870 -9.451031 -0.264300 -5.180154 2.769461 6.538137 -25.065785 0.034867 -0.002705 -0.031297 -0.007871 0.000004 -0.000042 +0.884000 78.282300 -36.774500 -79.831091 -1.017393 6.745172 -0.002182 -0.000181 0.005291 -2.046047 -1.404313 -10.317003 -11.352694 -1.112963 -0.364933 -6.055797 0.977646 4.594963 8.007091 -0.124603 -3.213196 0.412319 0.088945 0.143492 -1.015586 -0.701777 0.762613 -3.227084 -0.021588 0.033847 -10.194161 -0.000017 -0.000003 0.000775 0.001398 -0.000219 0.000774 -0.001501 0.000276 -8.138035 9.744931 -0.241279 13.712770 -7.035809 -1.719520 2.311476 -0.249609 -0.133832 -2.452057 2.987470 6.872074 -4.687633 -3.190969 0.171442 0.600883 0.613552 6.985552 1.454425 -12.633989 -3.537741 10.158075 14.727061 13.801176 2.030030 0.219972 0.116635 -2.451439 0.766635 -19.327381 -10.408602 -1.958519 3.623911 0.978180 -1.789236 -19.129121 -9.418389 10.539261 1.991203 -4.583848 10.804942 14.953203 0.805692 1.288768 -23.380781 -2.591210 -0.433812 -0.009805 9.691854 -1.716622 32.729481 -15.507996 8.122225 -0.670375 4.008043 -8.058997 32.022953 0.001092 -0.006527 0.002259 -10.607795 0.352284 10.774363 2.184739 -0.429795 -0.009786 -3.381916 4.991432 -25.962324 -9.453324 -0.285155 -5.187164 2.774475 6.545296 -25.092939 0.042977 0.002434 -0.033631 -0.007871 0.000003 -0.000040 +0.884000 78.282300 -36.768400 -79.824959 -1.009625 6.738296 -0.002190 -0.000180 0.005289 -2.040230 -1.411412 -10.308960 -11.366684 -1.112874 -0.365202 -6.069683 0.975763 4.609170 8.021062 -0.125414 -3.199177 0.440279 0.102300 0.159691 -1.084956 -0.747221 0.796276 -3.450930 -0.018231 0.043019 -10.194150 -0.000017 -0.000003 0.000775 0.001398 -0.000217 0.000774 -0.001497 0.000271 -8.158930 9.759482 -0.237716 13.698936 -7.029630 -1.716942 2.380882 -0.257222 -0.137644 -2.522186 3.015941 6.878796 -4.660587 -3.201116 0.179941 0.601278 0.614521 6.992467 1.440154 -12.633542 -3.533749 10.105971 14.702976 13.806738 2.154967 0.233645 0.123557 -2.481772 0.759232 -19.325026 -10.429251 -1.962296 3.623199 0.978179 -1.789235 -19.129111 -8.821428 13.812676 2.102378 -4.451455 13.655736 19.345987 0.807807 1.297390 -23.376425 -2.611909 -0.437275 -0.009960 9.697299 -1.712217 32.729706 -15.507922 8.115216 -0.670381 4.009505 -8.060644 32.029786 0.026505 0.011156 -0.002257 -10.531356 0.364273 10.702338 2.116107 -0.416289 -0.009726 -3.367455 5.000397 -25.893939 -9.455630 -0.306013 -5.194168 2.763200 6.529184 -25.031831 -0.003240 -0.015410 -0.024169 -0.007870 0.000003 -0.000039 +0.884000 78.288400 -36.756200 -79.818837 -1.001857 6.731419 -0.002184 -0.000180 0.005290 -2.031933 -1.404881 -10.302810 -11.380660 -1.112784 -0.365471 -6.083621 0.974638 4.609404 8.035023 -0.126221 -3.185150 0.468198 0.115662 0.175884 -1.154324 -0.792704 0.829882 -3.674746 -0.014910 0.052203 -10.194147 -0.000017 -0.000003 0.000776 0.001397 -0.000212 0.000778 -0.001498 0.000271 -8.159125 9.752489 -0.237783 13.685110 -7.023448 -1.714366 2.450282 -0.264841 -0.141447 -2.571262 3.030609 6.886375 -4.649076 -3.223567 0.187585 0.601673 0.615492 6.999380 1.425881 -12.633086 -3.529756 10.169203 14.719336 13.790005 2.127206 0.230606 0.122021 -2.452954 0.759875 -19.326372 -10.449909 -1.966074 3.622493 0.978184 -1.789234 -19.129108 -8.352419 17.125876 2.373994 -4.651306 16.576681 24.090064 0.865909 1.299171 -23.353542 -2.694681 -0.451122 -0.010603 9.725072 -1.735227 32.710234 -15.529070 8.108065 -0.667398 4.010972 -8.062282 32.036630 0.001097 -0.006527 0.002257 -10.538100 0.366841 10.731167 2.102386 -0.413589 -0.009715 -3.354222 5.008305 -25.909354 -9.457937 -0.326868 -5.201180 2.766961 6.534554 -25.052205 0.017352 -0.019467 -0.024329 -0.007872 0.000004 -0.000040 +0.902300 78.300600 -36.737900 -79.810252 -1.014934 6.724553 -0.002181 -0.000181 0.005290 -2.024153 -1.401255 -10.317447 -11.394641 -1.112694 -0.365743 -6.097586 0.973514 4.609646 8.048975 -0.127054 -3.192107 0.419250 0.117952 0.201083 -1.125561 -0.851692 0.879724 -3.898596 0.007493 0.070050 -10.194153 -0.000017 -0.000003 0.000775 0.001398 -0.000219 0.000778 -0.001498 0.000269 -8.159320 9.745496 -0.237849 13.671368 -7.019392 -1.731446 2.519695 -0.272469 -0.145243 -2.620343 3.045275 6.893968 -4.637549 -3.246004 0.195227 0.602064 0.616461 7.006297 1.411500 -12.632447 -3.539778 10.103766 14.708000 13.811668 2.259076 0.245051 0.129301 -2.484799 0.745710 -19.323063 -10.470568 -1.969853 3.621790 0.978178 -1.789238 -19.129121 -8.121198 20.134885 3.179178 -5.229693 19.154149 28.648402 0.861232 1.309455 -23.349077 -2.722287 -0.455739 -0.010823 9.739306 -1.741701 32.710968 -15.529192 8.122049 -0.667383 4.012441 -8.063925 32.043474 0.040307 0.013467 -0.002252 -10.545121 0.360277 10.733542 2.088651 -0.410887 -0.009698 -3.340782 5.016386 -25.910806 -9.446343 -0.349263 -5.194113 2.770722 6.539926 -25.072569 0.037946 -0.023525 -0.024484 -0.007874 0.000004 -0.000040 +0.902300 78.300600 -36.737900 -79.801667 -1.028009 6.717698 -0.002181 -0.000181 0.005291 -2.002618 -1.400139 -10.331765 -11.422773 -1.133379 -0.364028 -6.111521 0.972388 4.609872 8.048985 -0.127065 -3.199104 0.454151 0.133818 0.242352 -1.194786 -0.902230 0.918147 -4.122450 0.029826 0.087985 -10.194166 -0.000017 -0.000003 0.000775 0.001399 -0.000213 0.000771 -0.001495 0.000261 -8.180221 9.760047 -0.234284 13.573659 -6.999951 -1.750703 2.720967 -0.294602 -0.156197 -2.725459 3.059741 6.904547 -4.623632 -3.247604 0.189021 0.602460 0.617431 7.013196 1.382231 -12.645250 -3.553147 10.167302 14.741898 13.808385 2.224381 0.241247 0.127390 -2.462805 0.747886 -19.324296 -10.491212 -1.973628 3.621068 0.978182 -1.789236 -19.129116 -8.166499 22.991327 4.735914 -5.337123 20.396589 33.444636 0.940109 1.307827 -23.408494 -2.832668 -0.474203 -0.011716 9.787619 -1.746261 32.769195 -15.529292 8.136040 -0.667369 4.025682 -8.078699 32.105120 0.001097 -0.006527 0.002257 -10.468127 0.372969 10.727864 1.999450 -0.393333 -0.009594 -3.319852 5.036300 -25.913217 -9.434751 -0.371657 -5.187051 2.770709 6.539927 -25.072564 -0.003250 -0.015406 -0.024160 -0.007869 0.000003 -0.000040 +0.908400 78.306700 -36.731800 -79.795535 -1.020245 6.710827 -0.002185 -0.000180 0.005290 -1.980718 -1.397091 -10.332205 -11.450798 -1.140153 -0.363828 -6.139330 0.968994 4.631300 8.048981 -0.127046 -3.185115 0.489063 0.147251 0.258513 -1.264123 -0.942936 0.966410 -4.325335 0.046359 0.118738 -10.194156 -0.000017 -0.000003 0.000773 0.001399 -0.000219 0.000778 -0.001496 0.000261 -8.201127 9.774599 -0.230714 13.644338 -7.000378 -1.756775 2.658497 -0.287729 -0.152811 -2.718507 3.074587 6.909161 -4.623636 -3.247608 0.182022 0.602855 0.618403 7.020115 1.353073 -12.658241 -3.552497 10.101608 14.713040 13.816581 2.356252 0.255705 0.134642 -2.494655 0.733720 -19.320995 -10.511867 -1.977406 3.620364 0.978183 -1.789237 -19.129121 -8.476986 25.501963 7.107766 -4.849458 20.450744 38.401185 0.933855 1.311695 -23.401720 -2.860256 -0.478818 -0.011943 9.807306 -1.748318 32.770148 -15.529255 8.129043 -0.667376 4.027156 -8.080337 32.111957 0.041043 0.009013 -0.015498 -10.468075 0.386193 10.723295 1.985718 -0.390630 -0.009575 -3.298908 5.056212 -25.915628 -9.434755 -0.371656 -5.194049 2.770715 6.539923 -25.072562 0.024216 -0.020819 -0.024379 -0.007870 0.000003 -0.000037 +0.920600 78.318900 -36.719600 -79.789410 -1.012478 6.703927 -0.002179 -0.000181 0.005290 -1.961313 -1.407666 -10.330750 -11.457848 -1.147063 -0.363214 -6.167190 0.966351 4.638747 8.048973 -0.127028 -3.171123 0.523972 0.160695 0.274666 -1.305138 -1.003042 1.034881 -4.528223 0.062785 0.149550 -10.194157 -0.000017 -0.000003 0.000775 0.001400 -0.000217 0.000776 -0.001497 0.000266 -8.208405 9.767801 -0.229638 13.630575 -6.996308 -1.773852 2.734846 -0.296132 -0.156954 -2.781607 3.089178 6.917539 -4.612117 -3.270050 0.196670 0.604030 0.621314 7.040853 1.345973 -12.658069 -3.546998 10.171639 14.731810 13.798542 2.321547 0.251897 0.132741 -2.472657 0.735893 -19.322245 -10.532532 -1.981185 3.619650 0.978179 -1.789235 -19.129121 -8.860106 27.588732 9.451726 -3.715382 19.839912 43.689705 1.019586 1.308620 -23.417082 -2.977534 -0.498433 -0.012949 9.844282 -1.771869 32.793104 -15.529371 8.143045 -0.653368 4.035986 -8.090184 32.153057 0.002583 -0.015413 -0.024227 -10.467987 0.377538 10.741091 1.971997 -0.387931 -0.009547 -3.277974 5.076120 -25.918029 -9.437057 -0.392510 -5.201058 2.775725 6.547086 -25.099723 0.051651 -0.026225 -0.024593 -0.007869 0.000003 -0.000041 +0.914500 78.318900 -36.701200 -79.794726 -1.027191 6.710849 -0.002186 -0.000181 0.005291 -1.962559 -1.414477 -10.329795 -11.464877 -1.153972 -0.362600 -6.174127 0.965404 4.645843 8.069927 -0.128269 -3.178067 0.537937 0.165190 0.280042 -1.346082 -1.063197 1.103313 -4.696125 0.079202 0.180376 -10.194148 -0.000017 -0.000003 0.000776 0.001397 -0.000215 0.000775 -0.001497 0.000264 -8.215687 9.760993 -0.228561 13.616251 -7.000997 -1.780111 2.811186 -0.304538 -0.161083 -2.844703 3.103761 6.925930 -4.600594 -3.292490 0.211318 0.605209 0.624224 7.061586 1.324537 -12.657341 -3.544523 10.174085 14.744268 13.807071 2.370135 0.257230 0.135407 -2.489340 0.725431 -19.320104 -10.553185 -1.984961 3.618938 0.978180 -1.789237 -19.129116 -8.877940 28.542350 11.292400 -1.852163 18.975282 49.365363 1.021274 1.315470 -23.353001 -3.012036 -0.504202 -0.013247 9.869369 -1.780041 32.731407 -15.529487 8.157029 -0.639371 4.025676 -8.078702 32.105120 0.049026 0.003636 -0.013242 -10.376915 0.388115 10.750699 1.862184 -0.366321 -0.009378 -3.256829 5.096203 -25.906460 -9.425450 -0.414909 -5.207972 2.776986 6.548874 -25.106517 -0.003231 -0.015411 -0.024166 -0.007873 0.000004 -0.000040 +0.920600 78.325000 -36.695100 -79.800030 -1.041900 6.717782 -0.002184 -0.000181 0.005290 -1.941018 -1.413366 -10.344102 -11.485904 -1.160792 -0.362269 -6.181071 0.964456 4.652947 8.090872 -0.129512 -3.185008 0.474958 0.169306 0.285640 -1.309712 -1.136750 1.158376 -4.864048 0.095527 0.211250 -10.194168 -0.000017 -0.000003 0.000772 0.001401 -0.000226 0.000774 -0.001500 0.000269 -8.222398 9.775163 -0.227279 13.497415 -6.978239 -1.782416 3.054108 -0.331329 -0.174162 -2.942831 3.118198 6.936253 -4.586673 -3.294080 0.205123 0.605208 0.624224 7.061586 1.302993 -12.656446 -3.556059 10.095088 14.728142 13.831380 2.543653 0.276280 0.144899 -2.520308 0.715187 -19.338566 -10.573840 -1.988737 3.618218 0.978185 -1.789237 -19.129120 -9.084866 29.615273 13.246871 0.233650 18.295620 54.955395 1.113192 1.308287 -23.419336 -3.143114 -0.526122 -0.014424 9.926382 -1.795367 32.797230 -15.543726 8.170907 -0.644334 4.041885 -8.096737 32.180464 0.002195 -0.013195 -0.017613 -10.376615 0.386316 10.788302 1.841589 -0.362269 -0.009334 -3.236495 5.115583 -25.950817 -9.413858 -0.437305 -5.214868 2.787011 6.563185 -25.160829 0.031082 -0.022172 -0.024438 -0.007870 0.000003 -0.000038 +0.920600 78.337200 -36.676800 -79.786956 -1.033317 6.704009 -0.002183 -0.000181 0.005290 -1.919480 -1.412260 -10.358405 -11.506938 -1.167614 -0.361939 -6.215903 0.961237 4.660510 8.090870 -0.129494 -3.171020 0.495938 0.173839 0.290993 -1.350438 -1.201933 1.221763 -5.053088 0.137173 0.253737 -10.194167 -0.000017 -0.000003 0.000777 0.001398 -0.000220 0.000772 -0.001497 0.000273 -8.229113 9.789334 -0.225995 13.582453 -6.975089 -1.792097 2.963884 -0.321371 -0.169319 -2.928882 3.133081 6.940484 -4.593633 -3.293283 0.197729 0.605206 0.624226 7.061587 1.281437 -12.655520 -3.567604 10.185485 14.754071 13.809354 2.460363 0.267134 0.140354 -2.482169 0.693439 -19.330141 -10.594481 -1.992511 3.617502 0.978181 -1.789237 -19.129118 -9.396290 30.657092 15.248165 2.016484 17.855043 60.358737 1.113184 1.308286 -23.419342 -3.177621 -0.531892 -0.014744 9.946064 -1.797415 32.798169 -15.536602 8.163973 -0.652346 4.044838 -8.100011 32.194165 0.056674 0.000335 -0.026477 -10.306774 0.370398 10.785224 1.752383 -0.344714 -0.009157 -3.215436 5.135563 -25.946243 -9.402279 -0.459701 -5.207790 2.789516 6.566767 -25.174409 -0.003233 -0.015412 -0.024164 -0.007873 0.000004 -0.000038 +0.914500 78.337200 -36.664600 -79.773880 -1.024735 6.704276 -0.002181 -0.000181 0.005291 -1.897585 -1.409221 -10.358848 -11.527973 -1.174435 -0.361615 -6.229815 0.959716 4.667721 8.090867 -0.129476 -3.157031 0.516852 0.187228 0.307172 -1.391068 -1.267157 1.285102 -5.242144 0.178678 0.296360 -10.194164 -0.000017 -0.000003 0.000775 0.001400 -0.000227 0.000774 -0.001498 0.000264 -8.250588 9.782910 -0.222623 13.575990 -6.967002 -1.813662 3.033288 -0.329029 -0.173045 -2.977975 3.147697 6.948160 -4.602989 -3.313335 0.211178 0.606386 0.627137 7.082323 1.259447 -12.668770 -3.565446 10.201235 14.753779 13.801795 2.502009 0.271703 0.142627 -2.492240 0.680503 -19.335021 -10.615144 -1.996288 3.616785 0.978545 -1.791300 -19.142959 -9.808804 31.628567 17.196260 0.512158 17.168929 64.992474 1.213041 1.304014 -23.428386 -3.315597 -0.554961 -0.016056 9.998340 -1.817556 32.821856 -15.543829 8.184891 -0.637322 4.052204 -8.108204 32.228401 0.002188 -0.013195 -0.017613 -10.306821 0.381338 10.774058 1.738666 -0.342016 -0.009120 -3.194383 5.155550 -25.941675 -9.418498 -0.479017 -5.200930 2.792037 6.570340 -25.187996 0.031077 -0.022171 -0.024436 -0.007873 0.000004 -0.000039 +0.926700 78.343300 -36.658500 -79.779189 -1.039449 6.704139 -0.002181 -0.000181 0.005290 -1.889450 -1.403665 -10.359624 -11.548999 -1.181256 -0.361291 -6.243727 0.958198 4.674942 8.104832 -0.130303 -3.163986 0.537777 0.200625 0.323348 -1.410677 -1.331962 1.348888 -5.431074 0.194551 0.327594 -10.194162 -0.000017 -0.000003 0.000774 0.001397 -0.000217 0.000777 -0.001498 0.000266 -8.272063 9.776483 -0.219254 13.570356 -6.942600 -1.821964 3.102696 -0.336694 -0.176762 -3.027069 3.160376 6.941997 -4.591458 -3.335780 0.211848 0.607561 0.630048 7.103058 1.237452 -12.682022 -3.563296 10.132091 14.755126 13.808108 2.654704 0.288489 0.150948 -2.522786 0.672159 -19.339676 -10.652093 -1.988820 3.615496 0.978905 -1.793361 -19.156758 -10.247560 32.459429 18.976475 -2.824934 16.212671 68.925119 1.207841 1.312131 -23.430525 -3.350109 -0.560731 -0.016393 10.022445 -1.825022 32.823106 -15.550925 8.184842 -0.622334 4.055159 -8.111482 32.242123 0.055937 0.004790 -0.013241 -10.236786 0.383193 10.779638 1.642585 -0.323109 -0.008889 -3.173328 5.175537 -25.937136 -9.406901 -0.501415 -5.207822 2.794534 6.573913 -25.201550 -0.003240 -0.015408 -0.024162 -0.007872 0.000003 -0.000041 +0.926700 78.355500 -36.634100 -79.786140 -1.040262 6.704040 -0.002184 -0.000181 0.005291 -1.881330 -1.398111 -10.360412 -11.556043 -1.188166 -0.360681 -6.257645 0.956675 4.682153 8.118802 -0.131132 -3.170944 0.481735 0.213583 0.339797 -1.353238 -1.394982 1.414534 -5.620028 0.210317 0.358879 -10.194161 -0.000018 -0.000004 0.000777 0.001400 -0.000217 0.000777 -0.001495 0.000263 -8.271683 9.790468 -0.219120 13.564143 -6.926959 -1.819441 3.151277 -0.342060 -0.179357 -3.055142 3.173147 6.934682 -4.578336 -3.344317 0.212613 0.607169 0.629080 7.096142 1.237788 -12.675142 -3.556129 10.213563 14.783675 13.792278 2.578359 0.280095 0.146791 -2.488870 0.663559 -19.346989 -10.689015 -1.981349 3.614221 0.978725 -1.792333 -19.149865 -10.642653 33.103516 20.426866 -4.226122 15.337755 72.771977 1.304508 1.294990 -23.435002 -3.488088 -0.583797 -0.017761 10.064181 -1.854204 32.825397 -15.558140 8.205755 -0.628291 4.049186 -8.104831 32.258919 0.002198 -0.013194 -0.017611 -10.236720 0.385480 10.786243 1.628857 -0.320406 -0.008859 -3.159783 5.183704 -25.931667 -9.395305 -0.523809 -5.214723 2.797047 6.577495 -25.215146 0.031082 -0.022172 -0.024434 -0.007872 0.000004 -0.000040 +0.914500 78.361600 -36.621900 -79.772243 -1.038628 6.704278 -0.002181 -0.000180 0.005290 -1.862279 -1.410634 -10.372820 -11.563084 -1.195074 -0.360073 -6.285503 0.954009 4.689604 8.132765 -0.131933 -3.156923 0.495771 0.202835 0.348599 -1.373283 -1.435082 1.453560 -5.809113 0.245104 0.398863 -10.194151 -0.000016 -0.000003 0.000777 0.001398 -0.000227 0.000780 -0.001496 0.000270 -8.271312 9.804451 -0.218982 13.487557 -6.907482 -1.825988 3.317846 -0.360477 -0.188227 -3.125197 3.173823 6.945476 -4.600012 -3.348878 0.211350 0.606782 0.628108 7.089232 1.216521 -12.667228 -3.567506 10.233942 14.790814 13.788314 2.613066 0.283911 0.148684 -2.495905 0.664144 -19.353841 -10.695909 -1.982608 3.613980 0.978905 -1.793361 -19.156760 -10.986410 33.584464 21.604040 -6.345933 14.940072 74.963833 1.362059 1.294518 -23.418668 -3.584669 -0.599941 -0.018765 10.059182 -1.858916 32.797237 -15.501447 8.185238 -0.643366 4.040234 -8.094935 32.262057 0.002183 -0.013198 -0.017611 -10.159926 0.380450 10.771890 1.532769 -0.301500 -0.008589 -3.138937 5.203519 -25.941069 -9.397619 -0.544667 -5.221731 2.799563 6.581072 -25.228740 -0.003233 -0.015410 -0.024163 -0.007872 0.000003 -0.000038 +0.945000 78.361600 -36.603600 -79.778607 -1.040317 6.697333 -0.002184 -0.000181 0.005289 -1.853415 -1.417193 -10.386138 -11.586253 -1.206261 -0.370587 -6.302480 0.938293 4.700017 8.127922 -0.142883 -3.151770 0.516338 0.207515 0.353713 -1.378633 -1.479285 1.489550 -6.005018 0.261282 0.426844 -10.194161 -0.000007 0.000004 0.000776 0.001401 -0.000232 0.000777 -0.001498 0.000275 -8.296034 9.791525 -0.221063 13.559068 -6.908190 -1.845030 3.250024 -0.354003 -0.182002 -3.099400 3.167958 6.940613 -4.598400 -3.350583 0.219108 0.608727 0.626180 7.093400 1.204051 -12.681717 -3.573790 10.174298 14.781388 13.791957 2.745501 0.298482 0.155876 -2.537897 0.633417 -19.364129 -10.718606 -1.985980 3.599401 0.978476 -1.793449 -19.172747 -11.236872 33.903024 22.358112 -11.369877 15.935885 73.741646 1.441288 1.251742 -23.489246 -3.747686 -0.627183 -0.020508 10.171761 -1.788165 32.852349 -15.486551 8.185348 -0.640945 4.062598 -8.117142 32.318092 -0.000009 0.000003 0.000012 -10.167696 0.368016 10.772575 1.519362 -0.298863 -0.008544 -3.125526 5.222765 -25.940377 -9.407272 -0.553241 -5.206184 2.793528 6.574014 -25.229436 0.041242 -0.040367 -0.031686 -0.007871 0.000003 -0.000039 +0.945000 78.361600 -36.603600 -79.764707 -1.038688 6.697607 -0.002179 -0.000181 0.005290 -1.839651 -1.419716 -10.385804 -11.586248 -1.206263 -0.370587 -6.302484 0.938292 4.700018 8.127929 -0.142883 -3.151771 0.439389 0.207040 0.353989 -1.300695 -1.516893 1.531168 -6.194047 0.285367 0.439229 -10.194155 -0.000006 0.000005 0.000778 0.001398 -0.000212 0.000778 -0.001498 0.000263 -8.296032 9.791526 -0.221061 13.559941 -6.895046 -1.861262 3.298610 -0.359375 -0.184583 -3.141427 3.167779 6.942935 -4.598405 -3.350588 0.219106 0.609509 0.628122 7.107230 1.189730 -12.681171 -3.576809 10.255772 14.809916 13.776085 2.683027 0.291605 0.152480 -2.517430 0.628816 -19.364365 -10.739271 -1.989750 3.598685 0.978470 -1.793451 -19.172739 -11.125459 33.678532 22.467011 -13.969931 16.543855 72.018915 1.509175 1.234840 -23.490711 -3.878759 -0.649083 -0.021970 10.171752 -1.788165 32.852339 -15.500440 8.157246 -0.638967 4.070006 -8.125310 32.352345 0.001106 -0.006670 -0.019862 -10.090973 0.360677 10.751630 1.430143 -0.281307 -0.008263 -3.110209 5.246671 -25.921295 -9.393378 -0.554781 -5.206047 2.793531 6.574015 -25.229443 -0.006787 -0.030897 -0.031325 -0.007872 0.000004 -0.000039 +0.945000 78.379900 -36.579200 -79.750818 -1.037052 6.697837 -0.002180 -0.000180 0.005292 -1.825884 -1.422238 -10.385454 -11.607221 -1.206127 -0.371027 -6.316331 0.935999 4.721193 8.127926 -0.142883 -3.151772 0.453364 0.207126 0.353940 -1.299674 -1.556482 1.570733 -6.403988 0.297716 0.477294 -10.194169 -0.000006 0.000004 0.000776 0.001395 -0.000214 0.000775 -0.001499 0.000257 -8.310218 9.791904 -0.218762 13.560817 -6.881907 -1.877493 3.347187 -0.364750 -0.187161 -3.183458 3.167606 6.945260 -4.600803 -3.371430 0.218965 0.610293 0.630063 7.121043 1.175396 -12.680610 -3.579841 10.201419 14.790901 13.786683 2.828778 0.307650 0.160385 -2.579618 0.607286 -19.358856 -10.759931 -1.993519 3.597960 0.978476 -1.793447 -19.172735 -10.463904 32.741697 21.680178 -14.387097 16.452691 71.088001 1.502377 1.236530 -23.490554 -3.906376 -0.653697 -0.022281 10.247114 -1.781004 32.855812 -15.557146 8.177761 -0.630908 4.072963 -8.128579 32.366057 0.049028 0.003628 -0.013241 -10.091046 0.358398 10.745017 1.416417 -0.278606 -0.008218 -3.095196 5.270314 -25.923182 -9.381789 -0.577177 -5.205924 2.793526 6.574016 -25.229438 0.027525 -0.037663 -0.031586 -0.007869 0.000003 -0.000039 +0.945000 78.386000 -36.567000 -79.757766 -1.037863 6.697772 -0.002182 -0.000181 0.005293 -1.839650 -1.419715 -10.385803 -11.614299 -1.219989 -0.369670 -6.330192 0.933705 4.742374 8.141883 -0.143679 -3.137744 0.467357 0.207212 0.353889 -1.299027 -1.581225 1.595460 -6.613991 0.315693 0.502659 -10.194152 -0.000006 0.000005 0.000776 0.001400 -0.000226 0.000774 -0.001497 0.000257 -8.324403 9.792275 -0.216468 13.457280 -6.841144 -1.889539 3.520687 -0.383957 -0.196327 -3.260516 3.167283 6.949517 -4.600007 -3.364478 0.219016 0.609903 0.629091 7.114131 1.161072 -12.680075 -3.582866 10.262564 14.812293 13.774770 2.780200 0.302299 0.157754 -2.581137 0.600526 -19.357875 -10.756821 -1.971622 3.598073 0.978833 -1.795514 -19.186575 -9.360417 31.414475 20.217792 -14.397105 16.140741 69.559275 1.590635 1.214560 -23.492461 -4.023656 -0.673289 -0.023640 10.289879 -1.800324 32.858032 -15.564386 8.198686 -0.629879 4.075917 -8.131847 32.379745 0.000358 -0.002229 -0.006615 -10.027950 0.351620 10.768520 1.340923 -0.263752 -0.007954 -3.080488 5.293692 -25.946051 -9.384078 -0.598035 -5.205959 2.802336 6.586522 -25.276986 -0.006785 -0.030897 -0.031328 -0.007874 0.000004 -0.000039 +0.945000 78.379900 -36.567000 -79.764705 -1.038688 6.697607 -0.002181 -0.000181 0.005290 -1.839650 -1.419716 -10.385800 -11.621403 -1.233853 -0.368312 -6.316276 0.935241 4.735164 8.155852 -0.144471 -3.123715 0.376348 0.219920 0.370474 -1.193464 -1.603090 1.623170 -6.823989 0.333575 0.528088 -10.194153 -0.000007 0.000004 0.000775 0.001398 -0.000219 0.000776 -0.001502 0.000269 -8.317311 9.792080 -0.217615 13.527600 -6.845057 -1.880562 3.444342 -0.375500 -0.192304 -3.239414 3.146589 6.951267 -4.599216 -3.357528 0.219060 0.609507 0.628123 7.107227 1.146742 -12.679524 -3.585895 10.181081 14.783767 13.790636 2.946774 0.320657 0.166735 -2.649272 0.584456 -19.374066 -10.751202 -1.963488 3.577285 0.979197 -1.797576 -19.200391 -7.766242 29.557193 17.878963 -14.559457 15.710137 67.246115 1.590632 1.214559 -23.492463 -4.044342 -0.676745 -0.023886 10.308550 -1.812185 32.859043 -15.571634 8.219614 -0.628845 4.078888 -8.135115 32.393460 0.049035 0.003630 -0.013237 -10.028193 0.349093 10.739794 1.320350 -0.259704 -0.007874 -3.060695 5.298386 -25.920238 -9.386406 -0.618890 -5.205979 2.799817 6.582947 -25.263391 0.027525 -0.037663 -0.031586 -0.007873 0.000004 -0.000039 +0.945000 78.392100 -36.542500 -79.750816 -1.037054 6.697838 -0.002180 -0.000180 0.005289 -1.839649 -1.419715 -10.385801 -11.628349 -1.226854 -0.369214 -6.302359 0.936775 4.727951 8.141872 -0.143645 -3.109762 0.383353 0.219966 0.370447 -1.171796 -1.627243 1.648502 -7.033844 0.332246 0.544935 -10.194160 -0.000007 0.000004 0.000775 0.001396 -0.000212 0.000779 -0.001502 0.000278 -8.310216 9.791886 -0.218765 13.500061 -6.834732 -1.894972 3.499872 -0.381651 -0.195234 -3.288353 3.125592 6.956843 -4.570570 -3.353763 0.220729 0.609120 0.627150 7.100307 1.153910 -12.679795 -3.584375 10.242203 14.805174 13.778755 2.884308 0.313768 0.163379 -2.657615 0.579228 -19.373015 -10.745567 -1.955352 3.577477 0.979557 -1.799636 -19.214213 -6.533124 27.883469 16.078293 -14.532088 14.905640 64.561557 1.675377 1.207427 -23.454514 -4.161635 -0.696335 -0.025292 10.345313 -1.846061 32.833194 -15.578885 8.240534 -0.627813 4.077405 -8.133481 32.386619 0.001109 -0.006669 -0.019859 -9.965173 0.340026 10.756701 1.244854 -0.244850 -0.007592 -3.030151 5.320373 -25.930781 -9.388717 -0.639747 -5.219990 2.803597 6.588303 -25.283767 -0.006780 -0.030897 -0.031325 -0.007870 0.000003 -0.000038 +0.945000 78.398200 -36.530300 -79.736919 -1.035426 6.684088 -0.002180 -0.000181 0.005292 -1.867176 -1.414672 -10.386481 -11.621299 -1.219945 -0.369817 -6.288328 0.936788 4.748679 8.127911 -0.142849 -3.116796 0.390345 0.220010 0.370419 -1.150117 -1.651390 1.673844 -7.243679 0.330855 0.561776 -10.194161 -0.000006 0.000004 0.000776 0.001398 -0.000217 0.000776 -0.001501 0.000264 -8.303127 9.791704 -0.219912 13.375138 -6.797145 -1.904209 3.694182 -0.403191 -0.205439 -3.365399 3.122359 6.940265 -4.562824 -3.347609 0.221190 0.608729 0.626179 7.093399 1.161072 -12.680069 -3.582866 10.131107 14.754662 13.791339 3.092526 0.336734 0.174551 -2.754359 0.563496 -19.381049 -10.739936 -1.947217 3.577668 0.979910 -1.801700 -19.228031 -5.496988 26.264114 14.582372 -14.430137 13.895018 61.635299 1.676460 1.211807 -23.441301 -4.175434 -0.698640 -0.025457 10.363984 -1.857934 32.834229 -15.564749 8.240657 -0.615853 4.080353 -8.136751 32.400300 0.049784 -0.000823 -0.026474 -9.965203 0.326803 10.761260 1.231126 -0.242150 -0.007536 -3.018686 5.338285 -25.918258 -9.375575 -0.648241 -5.233829 2.803601 6.588297 -25.283750 0.020667 -0.036311 -0.031536 -0.007872 0.000004 -0.000039 +0.945000 78.398200 -36.530300 -79.750816 -1.037048 6.669840 -0.002179 -0.000180 0.005289 -1.894359 -1.407696 -10.373311 -11.614336 -1.224681 -0.348055 -6.274379 0.937946 4.748450 8.127916 -0.142831 -3.102810 0.299315 0.232690 0.387024 -1.037080 -1.687740 1.687069 -7.439777 0.354425 0.574433 -10.194158 -0.000006 0.000004 0.000777 0.001398 -0.000224 0.000776 -0.001498 0.000261 -8.296031 9.791520 -0.221055 13.446067 -6.792320 -1.906113 3.569264 -0.389338 -0.198889 -3.323189 3.078052 6.923008 -4.555061 -3.341452 0.207654 0.608332 0.625211 7.086501 1.153910 -12.679796 -3.584375 10.203363 14.768343 13.768307 2.988409 0.325246 0.168978 -2.747956 0.560071 -19.394966 -10.720537 -1.936573 3.578324 0.979916 -1.801701 -19.228029 -4.539089 24.599411 13.168136 -14.344669 12.816636 58.515508 1.752667 1.199398 -23.489410 -4.272041 -0.714775 -0.026651 10.394903 -1.885391 32.898982 -15.579074 8.261514 -0.599804 4.096657 -8.154702 32.475675 0.001843 -0.011113 -0.033109 -9.964965 0.322714 10.792276 1.217400 -0.239449 -0.007480 -3.007630 5.355840 -25.933648 -9.364002 -0.670643 -5.226713 2.807367 6.593658 -25.304118 0.045319 -0.056725 -0.011659 -0.007870 0.000003 -0.000040 +0.932800 78.361600 -36.585300 -79.743867 -1.036239 6.655985 -0.002181 -0.000180 0.005290 -1.921531 -1.400727 -10.360115 -11.607375 -1.230922 -0.340198 -6.239523 0.940839 4.747884 8.127909 -0.142813 -3.088821 0.299283 0.237117 0.392439 -1.008268 -1.716612 1.707703 -7.635742 0.365206 0.581405 -10.194156 -0.000007 0.000004 0.000773 0.001397 -0.000210 0.000775 -0.001501 0.000278 -8.288932 9.791326 -0.222201 13.424971 -6.791141 -1.908783 3.597035 -0.392415 -0.200346 -3.344099 3.050264 6.928007 -4.544902 -3.314456 0.194254 0.607943 0.624238 7.079577 1.146741 -12.679529 -3.585896 10.078684 14.713098 13.783452 3.196629 0.348232 0.180114 -2.851100 0.547788 -19.389124 -10.701143 -1.925934 3.564990 0.979914 -1.801701 -19.228021 -3.653785 22.883685 11.841064 -14.273572 11.657792 55.178626 1.754288 1.205964 -23.469578 -4.285841 -0.717079 -0.026820 10.398315 -1.900654 32.899321 -15.572194 8.282561 -0.607780 4.099624 -8.157968 32.489379 0.043622 -0.006429 -0.039720 -9.881087 0.309010 10.795702 1.107584 -0.217842 -0.007021 -2.984896 5.391475 -25.922545 -9.352410 -0.693042 -5.219570 2.811144 6.599015 -25.324494 -0.005806 -0.026445 -0.018107 -0.007872 0.000003 -0.000039 +0.926700 78.361600 -36.573100 -79.736920 -1.035436 6.614128 -0.002175 -0.000181 0.005290 -1.951195 -1.407390 -10.345029 -11.600289 -1.216303 -0.334602 -6.203507 0.929813 4.746537 8.099968 -0.141197 -3.074907 0.299264 0.241545 0.397854 -0.979409 -1.745471 1.728350 -7.831716 0.375961 0.588414 -10.194152 -0.000006 0.000004 0.000776 0.001397 -0.000212 0.000779 -0.001502 0.000280 -8.281844 9.791139 -0.223351 13.285394 -6.761503 -1.908889 3.777472 -0.412433 -0.209796 -3.400020 3.020404 6.920988 -4.534752 -3.287463 0.201836 0.607554 0.623267 7.072659 1.161072 -12.680081 -3.582870 10.150930 14.726783 13.760482 3.078643 0.335204 0.173816 -2.837455 0.544718 -19.389254 -10.685494 -1.894650 3.565509 0.980268 -1.803762 -19.241833 -2.765076 20.861454 10.376919 -14.236597 10.561826 51.391754 1.823825 1.195662 -23.451164 -4.361732 -0.729751 -0.027777 10.419074 -1.937377 32.921717 -15.579455 8.303479 -0.599744 4.107044 -8.166115 32.523653 0.010936 -0.023023 -0.028597 -9.887988 0.300393 10.813582 1.093859 -0.215142 -0.006962 -2.965313 5.396004 -25.910746 -9.354721 -0.713898 -5.226602 2.808630 6.595448 -25.310931 0.011002 -0.049969 -0.011408 -0.007872 0.000004 -0.000037 +0.926700 78.373800 -36.567000 -79.745477 -1.022340 6.572005 -0.002176 -0.000180 0.005293 -1.980329 -1.411162 -10.309150 -11.572233 -1.201803 -0.328569 -6.167497 0.918786 4.745195 8.072037 -0.139602 -3.074983 0.208284 0.245336 0.403655 -0.852639 -1.771409 1.752079 -8.006507 0.367791 0.586678 -10.194160 -0.000007 0.000004 0.000775 0.001395 -0.000212 0.000775 -0.001504 0.000267 -8.274749 9.790946 -0.224497 13.362737 -6.765825 -1.899122 3.610914 -0.393953 -0.201076 -3.322817 2.977187 6.908912 -4.524597 -3.260462 0.195422 0.607163 0.622297 7.065753 1.176251 -12.659659 -3.579356 10.026286 14.671559 13.775540 3.266032 0.355906 0.183812 -2.925428 0.536115 -19.384550 -10.666084 -1.884010 3.566142 0.980627 -1.805827 -19.255669 -1.892068 18.518028 8.823099 -14.196453 9.521363 47.219270 1.818673 1.203910 -23.431183 -4.354841 -0.728601 -0.027689 10.422490 -1.952644 32.922062 -15.586522 8.303418 -0.591724 4.110014 -8.169377 32.537351 0.047237 -0.028098 -0.017443 -9.845581 0.302945 10.863870 1.100730 -0.216493 -0.006990 -2.993842 5.429902 -25.936050 -9.357044 -0.734753 -5.233613 2.755338 6.606784 -25.348533 -0.009027 -0.041857 -0.042275 -0.007869 0.000004 -0.000040 +0.932800 78.373800 -36.554700 -79.754022 -1.009239 6.529926 -0.002182 -0.000181 0.005291 -2.009469 -1.414952 -10.273279 -11.544216 -1.198943 -0.300168 -6.132639 0.921679 4.744640 8.044100 -0.138008 -3.075057 0.215163 0.263094 0.425286 -0.823775 -1.800247 1.772755 -8.181299 0.359625 0.584916 -10.194167 -0.000006 0.000005 0.000777 0.001397 -0.000212 0.000780 -0.001501 0.000268 -8.267655 9.790756 -0.225649 13.334618 -6.764249 -1.902673 3.610905 -0.393956 -0.201079 -3.315660 2.933713 6.900509 -4.514430 -3.233464 0.189000 0.606771 0.621326 7.058843 1.190859 -12.653217 -3.576174 10.092946 14.657714 13.760809 3.154983 0.343633 0.177897 -2.929111 0.519762 -19.403345 -10.629788 -1.848969 3.567322 0.980986 -1.807892 -19.269511 -1.074999 15.885721 7.216681 -14.168959 8.515344 42.694003 1.884130 1.206300 -23.379603 -4.410038 -0.737817 -0.028398 10.428323 -1.993000 32.922786 -15.593779 8.324331 -0.583682 4.112986 -8.172630 32.551039 0.012392 -0.031777 -0.032967 -9.845346 0.298863 10.894865 1.025235 -0.201640 -0.006646 -2.917663 5.431886 -25.930407 -9.359352 -0.755608 -5.240645 2.810943 6.599012 -25.346598 0.002887 -0.055107 -0.009075 -0.007869 0.000003 -0.000042 +0.920600 78.373800 -36.536400 -79.760180 -1.016980 6.487840 -0.002185 -0.000181 0.005292 -2.055544 -1.394583 -10.240764 -11.537202 -1.195963 -0.272207 -6.076812 0.925552 4.757723 8.030130 -0.137179 -3.047118 0.222018 0.280854 0.446915 -0.780902 -1.828647 1.793899 -8.328123 0.351750 0.582957 -10.194159 -0.000007 0.000004 0.000778 0.001399 -0.000219 0.000776 -0.001497 0.000269 -8.246366 9.790181 -0.229093 13.208583 -6.746290 -1.909796 3.763596 -0.410893 -0.209069 -3.357528 2.888135 6.880733 -4.504268 -3.206468 0.182578 0.605196 0.617446 7.031197 1.205466 -12.646783 -3.572991 9.956035 14.572589 13.785149 3.370134 0.367420 0.189332 -3.045022 0.514510 -19.419213 -10.603497 -1.837077 3.568176 0.981342 -1.809954 -19.283326 -0.361568 12.972111 5.583175 -14.133465 7.538981 37.707576 1.881656 1.225486 -23.326587 -4.396230 -0.735511 -0.028218 10.421107 -2.017253 32.908678 -15.600866 8.324274 -0.575668 4.102508 -8.161136 32.547299 0.039645 -0.025093 -0.048447 -9.823605 0.275598 10.998814 1.032093 -0.202990 -0.006678 -2.927194 5.469782 -25.985805 -9.347783 -0.778011 -5.247485 2.782020 6.619877 -25.409362 -0.010782 -0.050576 -0.046597 -0.007873 0.000003 -0.000040 +0.914500 78.373800 -36.536400 -79.747067 -1.008460 6.432110 -0.002176 -0.000181 0.005291 -2.105334 -1.394682 -10.205383 -11.509152 -1.180678 -0.259229 -6.020977 0.929437 4.770788 8.016162 -0.136372 -3.033168 0.137943 0.297892 0.469000 -0.647557 -1.839400 1.803186 -8.474938 0.343879 0.580976 -10.194155 -0.000007 0.000003 0.000779 0.001397 -0.000212 0.000779 -0.001498 0.000259 -8.225453 9.775628 -0.232668 13.278911 -6.750226 -1.900938 3.610910 -0.393954 -0.201074 -3.294306 2.822098 6.858600 -4.491707 -3.158629 0.176281 0.603624 0.613565 7.003558 1.220077 -12.640352 -3.569815 9.952390 14.543435 13.773200 3.363193 0.366654 0.188965 -3.081975 0.509638 -19.410023 -10.577211 -1.825188 3.555026 0.981700 -1.812016 -19.297130 0.191634 9.766681 3.929780 -14.034300 6.574804 32.033406 1.926709 1.233012 -23.274588 -4.382425 -0.733205 -0.028044 10.375366 -2.072064 32.927908 -15.607911 8.324204 -0.567652 4.082214 -8.191083 32.570966 0.017522 -0.062625 -0.081435 -9.823602 0.282212 10.996525 0.984062 -0.193542 -0.006445 -2.875630 5.471759 -25.928525 -9.337741 -0.814320 -5.254339 2.813467 6.602574 -25.360176 -0.014624 -0.071869 -0.002125 -0.007869 0.000003 -0.000040 +0.914500 78.373800 -36.530300 -79.754792 -1.002286 6.355032 -0.002181 -0.000180 0.005291 -2.154607 -1.391919 -10.149219 -11.481102 -1.165388 -0.246256 -5.963531 0.913964 4.754759 7.981239 -0.134391 -3.019271 0.144778 0.315657 0.490624 -0.590832 -1.862397 1.819870 -8.621828 0.341775 0.566228 -10.194164 -0.000007 0.000004 0.000772 0.001395 -0.000209 0.000777 -0.001501 0.000268 -8.204557 9.761077 -0.236237 13.138283 -6.742347 -1.918652 3.784405 -0.413205 -0.210157 -3.364239 2.783405 6.839151 -4.465211 -3.112391 0.170728 0.603241 0.612593 6.996644 1.234686 -12.633909 -3.566634 9.880903 14.490535 13.774147 3.460353 0.377409 0.194105 -3.187803 0.517321 -19.420980 -10.514613 -1.778275 3.543011 0.981697 -1.812018 -19.297142 0.558957 6.526894 2.231306 -13.909297 5.715286 25.743762 1.946195 1.253782 -23.202173 -4.368639 -0.730902 -0.027871 10.362511 -2.100582 32.927557 -15.615119 8.338125 -0.573598 4.088949 -8.188032 32.578595 0.018980 -0.071379 -0.085789 -9.822619 0.265872 11.120563 0.984059 -0.193541 -0.006446 -2.855473 5.490945 -25.986930 -9.348582 -0.848302 -5.247502 2.809921 6.610352 -25.417284 -0.014791 -0.070246 -0.061874 -0.007874 0.000004 -0.000041 +0.920600 78.373800 -36.518100 -79.762516 -0.996105 6.277921 -0.002181 -0.000181 0.005292 -2.224530 -1.385516 -10.093545 -11.453027 -1.146314 -0.198526 -5.879350 0.914711 4.739071 7.988228 -0.134783 -3.019252 0.102908 0.305915 0.534647 -0.533642 -1.900202 1.821748 -8.768697 0.339705 0.551474 -10.194165 -0.000007 0.000004 0.000777 0.001398 -0.000217 0.000774 -0.001501 0.000269 -8.233450 9.747658 -0.217796 13.186600 -6.758243 -1.896210 3.652548 -0.398571 -0.203254 -3.329034 2.696485 6.821394 -4.438711 -3.066154 0.165166 0.601654 0.608716 6.968994 1.206547 -12.626236 -3.544471 9.813125 14.424933 13.790415 3.578344 0.390484 0.200321 -3.299729 0.497988 -19.428041 -10.449497 -1.745129 3.545011 0.981699 -1.812017 -19.297139 0.767341 3.222875 0.522593 -13.777859 4.943688 18.710866 1.965652 1.274582 -23.129765 -4.354836 -0.728598 -0.027693 10.349653 -2.129108 32.927171 -15.622337 8.352050 -0.579547 4.104662 -8.194827 32.583069 0.020426 -0.080136 -0.090157 -9.821937 0.257939 11.204700 0.984066 -0.193542 -0.006446 -2.834498 5.510828 -25.989520 -9.359407 -0.882284 -5.240670 2.797529 6.605631 -25.426781 -0.017310 -0.083226 -0.057303 -0.007870 0.000004 -0.000040 +0.908400 78.373800 -36.518100 -79.770229 -0.989912 6.172893 -0.002186 -0.000180 0.005290 -2.293946 -1.376289 -10.017068 -11.424988 -1.129481 -0.171664 -5.829937 0.911415 4.744895 7.918382 -0.130846 -2.991455 0.060667 0.334056 0.547690 -0.378819 -1.925062 1.836881 -8.915384 0.318551 0.528076 -10.194159 -0.000007 0.000004 0.000777 0.001398 -0.000219 0.000779 -0.001500 0.000271 -8.162252 9.752856 -0.236146 13.003703 -6.744867 -1.889763 3.895442 -0.425537 -0.215937 -3.426962 2.643932 6.805026 -4.412212 -3.019922 0.159577 0.600081 0.604835 6.941342 1.271895 -12.600319 -3.558307 9.720173 14.327269 13.793313 3.696314 0.403569 0.206502 -3.438947 0.484838 -19.434878 -10.384407 -1.711984 3.546970 0.982234 -1.815114 -19.317865 0.794822 -0.142039 -1.239507 -13.613285 4.297575 10.235489 1.989297 1.312958 -23.004499 -4.341042 -0.726296 -0.027516 10.336800 -2.157623 32.926805 -15.629259 8.337988 -0.564555 4.130892 -8.192247 32.589090 0.021883 -0.088892 -0.094520 -9.842225 0.249963 11.289098 0.984051 -0.193538 -0.006449 -2.813517 5.530706 -25.992090 -9.342416 -0.919368 -5.254391 2.793124 6.611584 -25.432858 -0.019837 -0.096206 -0.052738 -0.007871 0.000004 -0.000039 +0.902300 78.373800 -36.512000 -79.764023 -0.982206 6.068115 -0.002182 -0.000181 0.005291 -2.363387 -1.367157 -9.940597 -11.396949 -1.110369 -0.123949 -5.738765 0.912354 4.736089 7.925364 -0.131235 -2.991441 0.018698 0.335104 0.582877 -0.307962 -1.952530 1.849193 -9.062218 0.310205 0.510384 -10.194156 -0.000007 0.000004 0.000775 0.001399 -0.000224 0.000779 -0.001500 0.000268 -8.191127 9.739431 -0.217712 13.066422 -6.758210 -1.880798 3.756642 -0.410121 -0.208705 -3.398803 2.550048 6.788643 -4.368583 -2.947509 0.154853 0.598500 0.600956 6.913700 1.250920 -12.592933 -3.534626 9.620801 14.244727 13.810780 3.862873 0.422065 0.215196 -3.598638 0.476325 -19.441570 -10.319304 -1.678835 3.548901 0.982763 -1.818204 -19.338574 0.604054 -3.639823 -3.039765 -13.135378 3.728987 0.510716 1.992988 1.328307 -22.958235 -4.341031 -0.726295 -0.027516 10.323164 -2.185624 32.975306 -15.636202 8.323943 -0.563551 4.168988 -8.202678 32.649899 0.023336 -0.097649 -0.098880 -9.862326 0.251097 11.399937 0.984059 -0.193540 -0.006449 -2.792528 5.550590 -25.994670 -9.339345 -0.954902 -5.268332 2.788743 6.617533 -25.438946 -0.022364 -0.109183 -0.048178 -0.007870 0.000003 -0.000040 +0.902300 78.361600 -36.499800 -79.757794 -0.974518 5.942315 -0.002186 -0.000181 0.005291 -2.432318 -1.355222 -9.843312 -11.333964 -1.092813 -0.089484 -5.682445 0.910389 4.727838 7.848538 -0.126937 -2.949667 0.088437 0.355501 0.584435 -0.237072 -1.979981 1.861537 -9.180986 0.293518 0.511645 -10.194154 -0.000007 0.000004 0.000777 0.001400 -0.000220 0.000776 -0.001496 0.000271 -8.105871 9.737367 -0.245402 12.855435 -6.745405 -1.897559 4.062007 -0.444063 -0.224563 -3.538763 2.497494 6.773876 -4.327359 -2.895941 0.149959 0.598103 0.599987 6.906795 1.323081 -12.574172 -3.554172 9.514407 14.142252 13.815842 4.029436 0.440587 0.223831 -3.758326 0.467834 -19.448291 -10.245435 -1.615664 3.537030 0.982938 -1.819237 -19.345500 0.165784 -7.308133 -4.885398 -12.072432 2.993558 -9.386282 1.998221 1.350237 -22.892151 -4.272035 -0.714774 -0.026649 10.259345 -2.218537 33.021185 -15.643341 8.330868 -0.562511 4.135141 -8.196946 32.720192 0.024740 -0.106122 -0.059008 -9.861764 0.234031 11.457638 0.929160 -0.182741 -0.006168 -2.709482 5.549583 -25.926922 -9.338627 -1.011288 -5.282312 2.817254 6.607928 -25.380551 -0.021932 -0.108777 -0.003940 -0.007873 0.000004 -0.000041 +0.908400 78.355500 -36.499800 -79.772432 -0.968989 5.816205 -0.002180 -0.000180 0.005289 -2.501281 -1.343403 -9.746018 -11.298938 -1.075180 -0.055566 -5.610397 0.887932 4.732164 7.820591 -0.125389 -2.935748 0.018394 0.363633 0.595703 -0.068233 -2.004285 1.877381 -9.299903 0.295333 0.505878 -10.194153 -0.000006 0.000004 0.000775 0.001397 -0.000217 0.000776 -0.001499 0.000269 -8.105872 9.737354 -0.245402 12.868053 -6.769141 -1.878561 4.068941 -0.444835 -0.224922 -3.573666 2.403526 6.760260 -4.318499 -2.819513 0.143411 0.596921 0.597079 6.886051 1.308760 -12.573622 -3.557169 9.455450 14.056451 13.812074 4.251507 0.465319 0.235266 -3.958956 0.468619 -19.454692 -10.187230 -1.583786 3.524672 0.985056 -1.831625 -19.428447 -0.490000 -10.986136 -6.797321 -10.901524 1.910696 -18.742971 2.027999 1.384900 -22.773679 -4.258228 -0.712466 -0.026479 10.250747 -2.252341 33.035077 -15.664607 8.337653 -0.559427 4.165090 -8.187982 32.720076 0.028373 -0.127939 -0.058859 -9.860676 0.226592 11.586006 0.929143 -0.182738 -0.006172 -2.675276 5.577392 -25.945100 -9.337910 -1.067675 -5.275309 2.805721 6.616274 -25.401231 -0.024936 -0.123990 -0.005985 -0.007870 0.000003 -0.000039 +0.896200 78.355500 -36.493700 -79.787050 -0.963438 5.690012 -0.002184 -0.000180 0.005290 -2.567924 -1.318050 -9.650618 -11.263961 -1.055261 -0.000795 -5.538350 0.865483 4.736534 7.792659 -0.123848 -2.921826 0.025296 0.372560 0.606489 0.010299 -2.051251 1.909842 -9.418835 0.297160 0.500114 -10.194166 -0.000007 0.000004 0.000776 0.001398 -0.000217 0.000773 -0.001500 0.000266 -8.105868 9.737358 -0.245403 12.775795 -6.778267 -1.883721 4.263261 -0.466479 -0.234911 -3.692613 2.328350 6.733292 -4.281800 -2.746308 0.124205 0.595731 0.594169 6.865321 1.381763 -12.541412 -3.541391 9.202843 13.913978 13.852199 4.577671 0.501726 0.251880 -4.209023 0.441182 -19.483603 -10.084548 -1.522541 3.513465 0.985928 -1.836781 -19.462984 -1.395500 -14.640065 -8.818537 -9.645363 0.310623 -27.068934 2.055141 1.408637 -22.688270 -4.244441 -0.710167 -0.026303 10.241607 -2.285778 33.083879 -15.685695 8.323467 -0.556378 4.206966 -8.191990 32.774789 0.043629 -0.134400 -0.063193 -9.880556 0.218959 11.714638 0.929160 -0.182740 -0.006173 -2.652332 5.587462 -25.961771 -9.334850 -1.103210 -5.282242 2.791677 6.621059 -25.408343 -0.027944 -0.139202 -0.008039 -0.007870 0.000003 -0.000040 +0.890100 78.349400 -36.481500 -79.780773 -0.955791 5.564181 -0.002179 -0.000181 0.005292 -2.634934 -1.294736 -9.569035 -11.228969 -1.036819 0.040054 -5.468018 0.863920 4.742082 7.764706 -0.122292 -2.886921 0.032188 0.381489 0.617276 0.088853 -2.098173 1.942370 -9.537713 0.293244 0.507105 -10.194163 -0.000007 0.000004 0.000775 0.001397 -0.000212 0.000772 -0.001496 0.000264 -8.035521 9.714468 -0.256996 12.657600 -6.745473 -1.886536 4.297958 -0.470344 -0.236694 -3.734592 2.253254 6.703093 -4.234404 -2.702521 0.105475 0.594547 0.591264 6.844593 1.374601 -12.541129 -3.542887 9.281612 13.888323 13.832555 4.549910 0.498623 0.250472 -4.307802 0.448391 -19.487829 -10.046976 -1.494420 3.500464 0.986803 -1.841941 -19.497525 -2.558103 -18.135937 -10.983433 -8.372428 -1.779319 -34.788363 2.064861 1.450366 -22.562722 -4.154745 -0.695186 -0.025205 10.147954 -2.326159 33.086065 -15.692614 8.309408 -0.555376 4.147077 -8.209980 32.775021 0.058891 -0.140859 -0.067522 -9.886597 0.197740 11.803413 0.929157 -0.182741 -0.006168 -2.628569 5.598239 -25.922610 -9.333358 -1.152645 -5.289200 2.771319 6.616917 -25.381487 -0.030950 -0.154412 -0.010098 -0.007869 0.000004 -0.000039 +0.890100 78.337200 -36.475400 -79.789750 -0.935575 5.438179 -0.002181 -0.000181 0.005291 -2.705416 -1.292009 -9.484575 -11.180020 -1.018338 0.081143 -5.397762 0.863118 4.733665 7.736016 -0.134722 -2.852004 0.039100 0.390418 0.628060 0.180773 -2.124808 1.955682 -9.614808 0.308815 0.522501 -10.194154 -0.000006 0.000004 0.000777 0.001397 -0.000217 0.000777 -0.001501 0.000257 -8.035522 9.714469 -0.256996 12.700366 -6.738004 -1.882217 4.284077 -0.468798 -0.235980 -3.755623 2.143538 6.676875 -4.219339 -2.633851 0.099184 0.593361 0.588356 6.823847 1.440423 -12.508618 -3.528648 8.975195 13.726658 13.881470 4.987085 0.547561 0.272448 -4.610017 0.412596 -19.506619 -9.943032 -1.440090 3.503125 0.987672 -1.847106 -19.532101 -3.928461 -21.345540 -13.310459 -7.203024 -4.194072 -42.195905 2.071977 1.481127 -22.470197 -4.140935 -0.692879 -0.025041 10.158985 -2.361842 33.108037 -15.699755 8.316338 -0.554348 4.199447 -8.204587 32.809114 0.053433 -0.150765 -0.071896 -9.892419 0.192501 11.938475 0.867396 -0.170590 -0.005866 -2.541411 5.617687 -25.939610 -9.331870 -1.202083 -5.296172 2.822303 6.615070 -25.407737 -0.033964 -0.169625 -0.012142 -0.007869 0.000004 -0.000040 +0.896200 78.337200 -36.475400 -79.798682 -0.915343 5.326082 -0.002183 -0.000180 0.005291 -2.762112 -1.291682 -9.399805 -11.131089 -0.999824 0.122214 -5.325709 0.840669 4.738059 7.707332 -0.147191 -2.838076 -0.051918 0.398266 0.639515 0.363816 -2.153276 2.007110 -9.691902 0.324367 0.537918 -10.194158 -0.000006 0.000005 0.000776 0.001398 -0.000226 0.000774 -0.001498 0.000259 -7.992966 9.713314 -0.263816 12.526801 -6.687875 -1.898386 4.506142 -0.493577 -0.247302 -3.888644 2.071430 6.670677 -4.178892 -2.589276 0.094029 0.592173 0.585450 6.803114 1.476765 -12.495992 -3.520878 9.007235 13.707814 13.843437 4.945453 0.542891 0.270368 -4.695368 0.415805 -19.517906 -9.891685 -1.409488 3.490414 0.988538 -1.852267 -19.566632 -5.456397 -24.291669 -15.792120 -6.157579 -6.633539 -49.301747 2.081042 1.520691 -22.351251 -4.016759 -0.672138 -0.023560 10.062233 -2.431653 33.124194 -15.721031 8.323128 -0.551263 4.154545 -8.218115 32.809305 0.050167 -0.173729 -0.071768 -9.898337 0.178111 12.047099 0.874265 -0.171941 -0.005889 -2.516785 5.643408 -25.949692 -9.330394 -1.251518 -5.303129 2.801327 6.622229 -25.407318 -0.035991 -0.180373 -0.000964 -0.007876 0.000004 -0.000039 +0.884000 78.337200 -36.457100 -79.807578 -0.895085 5.214049 -0.002181 -0.000180 0.005290 -2.815416 -1.270938 -9.317904 -11.103109 -0.995231 0.164421 -5.274573 0.816494 4.742781 7.679388 -0.145683 -2.810175 -0.045026 0.407198 0.650298 0.449277 -2.194882 2.044992 -9.741009 0.340164 0.553194 -10.194169 -0.000007 0.000005 0.000775 0.001397 -0.000215 0.000775 -0.001495 0.000256 -7.972265 9.691756 -0.267428 12.493854 -6.645571 -1.896894 4.561659 -0.499778 -0.250120 -3.944710 1.982537 6.642730 -4.159300 -2.542261 0.087912 0.590183 0.580607 6.768557 1.513108 -12.483347 -3.513119 8.832328 13.627470 13.850696 5.257726 0.577939 0.285861 -4.945028 0.390502 -19.533180 -9.819681 -1.375170 3.478169 0.989400 -1.857427 -19.601173 -7.132957 -26.962395 -18.431428 -5.286517 -9.108371 -56.148642 2.052980 1.555095 -22.226814 -3.892561 -0.651388 -0.022128 10.017782 -2.531778 33.108635 -15.721113 8.330121 -0.537263 4.150059 -8.213244 32.788712 0.061796 -0.201076 -0.091442 -9.904212 0.163705 12.155713 0.881122 -0.173290 -0.005930 -2.491953 5.669302 -25.945829 -9.328917 -1.300957 -5.310096 2.780365 6.629392 -25.406922 -0.038001 -0.191126 0.010202 -0.007873 0.000003 -0.000041 +0.884000 78.337200 -36.444900 -79.816436 -0.874823 5.122970 -0.002180 -0.000181 0.005289 -2.855255 -1.254462 -9.249525 -11.075124 -0.992884 0.185763 -5.223433 0.792321 4.747526 7.651448 -0.144190 -2.782277 -0.038142 0.416132 0.661079 0.534768 -2.236430 2.082938 -9.755071 0.347674 0.587404 -10.194154 -0.000006 0.000004 0.000775 0.001397 -0.000224 0.000776 -0.001492 0.000254 -7.950978 9.691171 -0.270833 12.384849 -6.581414 -1.926585 4.749016 -0.520727 -0.259576 -4.056802 1.893744 6.616582 -4.139694 -2.495259 0.060795 0.588454 0.561912 6.735927 1.535132 -12.470177 -3.508340 8.725005 13.571007 13.846018 5.486708 0.603691 0.297092 -5.160603 0.357495 -19.548843 -9.747649 -1.340864 3.465889 0.989924 -1.860525 -19.621907 -8.794786 -29.040632 -21.186847 -4.093143 -11.123517 -62.210148 2.056502 1.570779 -22.136320 -3.878770 -0.649087 -0.021968 10.035542 -2.553399 33.109957 -15.756953 8.378722 -0.518070 4.206209 -8.201568 32.794617 0.070154 -0.208688 -0.095777 -9.889132 0.140548 12.237650 0.887987 -0.174641 -0.005961 -2.478395 5.677466 -25.940474 -9.348301 -1.348043 -5.317525 2.759378 6.636553 -25.406506 -0.041009 -0.206338 0.008153 -0.007874 0.000004 -0.000040 +0.877900 78.337200 -36.438800 -79.825261 -0.854535 5.045950 -0.002182 -0.000181 0.005289 -2.897644 -1.253642 -9.193081 -11.047098 -1.004434 0.208617 -5.172193 0.767020 4.773244 7.650707 -0.158123 -2.754283 -0.031234 0.425067 0.671859 0.634645 -2.287303 2.131410 -9.720183 0.355693 0.621315 -10.194152 -0.000007 0.000004 0.000775 0.001398 -0.000229 0.000776 -0.001498 0.000264 -7.929706 9.690584 -0.274236 12.303961 -6.518783 -1.952701 4.908627 -0.538597 -0.267579 -4.168879 1.828670 6.608162 -4.123338 -2.476052 0.033528 0.587661 0.559974 6.722092 1.557156 -12.457000 -3.503560 8.605320 13.547361 13.845278 5.715695 0.629492 0.308228 -5.371554 0.344818 -19.567508 -9.699454 -1.332196 3.432048 0.990434 -1.863623 -19.642646 -9.983683 -30.353009 -23.674399 -3.088399 -12.025401 -67.682216 2.055084 1.564459 -22.111902 -3.768372 -0.630637 -0.020736 9.939366 -2.558264 33.174116 -15.777997 8.364507 -0.515002 4.162011 -8.226248 32.843549 0.078489 -0.216305 -0.100115 -9.874013 0.112843 12.306371 0.798770 -0.157090 -0.005489 -2.400712 5.694912 -25.942525 -9.344485 -1.376630 -5.324439 2.820430 6.624567 -25.427386 -0.041511 -0.208566 0.001538 -0.007876 0.000004 -0.000040 +0.865700 78.325000 -36.414400 -79.820125 -0.833021 4.982996 -0.002187 -0.000180 0.005290 -2.940041 -1.252863 -9.136635 -11.019070 -1.015973 0.231479 -5.141855 0.739992 4.799262 7.649988 -0.172057 -2.726288 -0.024204 0.420721 0.666391 0.734574 -2.338089 2.179972 -9.650417 0.372724 0.635863 -10.194156 -0.000007 0.000004 0.000777 0.001397 -0.000220 0.000778 -0.001500 0.000266 -7.922612 9.690388 -0.275368 12.209858 -6.439016 -1.967160 5.068224 -0.556493 -0.275532 -4.252969 1.763567 6.598738 -4.120875 -2.455211 0.019641 0.586868 0.558037 6.708260 1.607692 -12.444681 -3.506869 8.485648 13.523717 13.844502 5.923858 0.652980 0.318265 -5.568880 0.329090 -19.586295 -9.651245 -1.323556 3.398193 0.992144 -1.873955 -19.711755 -10.488754 -30.983005 -25.619218 -3.650494 -11.471729 -72.414096 2.053685 1.558140 -22.087483 -3.699391 -0.619112 -0.019988 9.912510 -2.570124 33.221596 -15.799076 8.350303 -0.511939 4.172473 -8.237594 32.891534 0.077377 -0.252331 -0.095475 -9.874375 0.107780 12.248915 0.791912 -0.155741 -0.005448 -2.387199 5.688854 -25.832052 -9.340664 -1.405214 -5.331337 2.805914 6.591866 -25.319446 -0.038331 -0.265418 0.013103 -0.007870 0.000003 -0.000040 +0.871800 78.318900 -36.396000 -79.814976 -0.811514 4.934131 -0.002182 -0.000180 0.005288 -2.981024 -1.243293 -9.116757 -10.991028 -1.027501 0.254342 -5.097623 0.714907 4.811140 7.635298 -0.185268 -2.684351 -0.017169 0.417840 0.695868 0.834554 -2.388793 2.228627 -9.545693 0.390163 0.650157 -10.194166 -0.000006 0.000004 0.000780 0.001394 -0.000207 0.000778 -0.001498 0.000264 -7.915908 9.676213 -0.276639 12.116738 -6.346060 -1.997700 5.227824 -0.574408 -0.283439 -4.337107 1.681728 6.570360 -4.118409 -2.434371 0.005760 0.584868 0.553199 6.673709 1.637302 -12.417584 -3.514317 8.361078 13.516993 13.823055 6.159766 0.679648 0.329529 -5.779845 0.316547 -19.605064 -9.589264 -1.312473 3.385627 0.992654 -1.877049 -19.732485 -10.440051 -31.026486 -27.079171 -5.239632 -10.091082 -75.717367 2.048009 1.532704 -22.011973 -3.630386 -0.607579 -0.019246 9.903328 -2.569623 33.179037 -15.855908 8.377686 -0.503669 4.162027 -8.226247 32.843569 0.066493 -0.229430 -0.089040 -9.843980 0.048067 12.395315 0.764460 -0.150341 -0.005300 -2.355052 5.740660 -25.948317 -9.350761 -1.432231 -5.338579 2.833022 6.618033 -25.435618 -0.043533 -0.219317 0.012708 -0.007871 0.000003 -0.000040 +0.865700 78.318900 -36.383800 -79.826150 -0.763332 4.920001 -0.002177 -0.000181 0.005290 -3.008190 -1.235952 -9.096572 -10.962931 -1.055948 0.250912 -5.053394 0.689831 4.823039 7.620624 -0.198489 -2.642422 -0.031163 0.417670 0.695968 0.949498 -2.463576 2.302742 -9.356885 0.397149 0.689363 -10.194166 -0.000007 0.000004 0.000777 0.001398 -0.000222 0.000774 -0.001498 0.000261 -7.895035 9.661649 -0.280168 11.975305 -6.233912 -2.020620 5.422123 -0.596250 -0.292985 -4.435269 1.601894 6.556115 -4.115942 -2.413536 -0.022116 0.582875 0.548360 6.639140 1.667080 -12.390802 -3.500762 8.209518 13.500786 13.806235 6.395688 0.706363 0.340695 -5.995446 0.283812 -19.620975 -9.523589 -1.322068 3.359160 0.993166 -1.880152 -19.753214 -10.215996 -30.584515 -28.122162 -10.535495 -10.889249 -73.254462 2.044575 1.517298 -22.058219 -3.561399 -0.596050 -0.018524 9.848500 -2.558714 33.245570 -15.855623 8.349712 -0.503713 4.173978 -8.239211 32.898398 0.066104 -0.269766 -0.075506 -9.843845 0.020897 12.338074 0.764453 -0.150339 -0.005298 -2.361544 5.729723 -25.877480 -9.359287 -1.445345 -5.345792 2.815998 6.606139 -25.373750 -0.023895 -0.265673 0.041782 -0.007874 0.000003 -0.000042 +0.865700 78.306700 -36.359400 -79.837314 -0.715149 4.926873 -0.002184 -0.000181 0.005293 -3.036129 -1.233468 -9.111025 -10.948815 -1.084455 0.247234 -5.009026 0.663252 4.862903 7.633903 -0.213114 -2.614373 -0.045157 0.417501 0.696071 1.064593 -2.538210 2.377012 -9.133468 0.430231 0.739738 -10.194151 -0.000007 0.000004 0.000779 0.001400 -0.000220 0.000778 -0.001500 0.000268 -7.874160 9.647084 -0.283696 11.835224 -6.104158 -2.064881 5.616416 -0.618123 -0.302470 -4.533440 1.522085 6.541743 -4.115111 -2.406588 -0.050061 0.582078 0.546424 6.625327 1.717769 -12.378768 -3.483110 8.041045 13.530954 13.788014 6.631588 0.733120 0.351736 -6.207964 0.264645 -19.638933 -9.457911 -1.331691 3.332699 0.995020 -1.891515 -19.829207 -10.013151 -29.848432 -28.549832 -12.705187 -10.929531 -70.516355 1.993846 1.450048 -21.934760 -3.444106 -0.576445 -0.017318 9.783443 -2.533673 33.115421 -15.890893 8.342341 -0.498594 4.144111 -8.206777 32.761303 0.073409 -0.228281 -0.089001 -9.800040 -0.078097 12.305678 0.764459 -0.150340 -0.005301 -2.378699 5.807247 -25.848477 -9.367830 -1.458459 -5.332021 2.796739 6.650650 -25.355853 -0.043031 -0.217090 0.019321 -0.007873 0.000003 -0.000040 +0.859600 78.300600 -36.341100 -79.847297 -0.680906 4.933720 -0.002175 -0.000181 0.005292 -3.094993 -1.247056 -9.123198 -10.934692 -1.112966 0.243564 -4.943741 0.638489 4.902542 7.647182 -0.227731 -2.586320 -0.059149 0.417330 0.696173 1.179739 -2.612694 2.451433 -8.888989 0.456735 0.771336 -10.194163 -0.000007 0.000005 0.000777 0.001395 -0.000215 0.000778 -0.001501 0.000273 -7.852669 9.653480 -0.287012 11.675093 -5.956752 -2.097928 5.831528 -0.642375 -0.312878 -4.631587 1.463083 6.524350 -4.114286 -2.399643 -0.078003 0.581276 0.544490 6.611503 1.768340 -12.366538 -3.479487 7.872538 13.561166 13.769886 6.888316 0.762294 0.363634 -6.420489 0.245543 -19.656974 -9.409238 -1.365675 3.305867 0.995360 -1.893580 -19.843037 -9.801638 -28.762558 -28.442950 -13.526756 -10.134620 -67.533454 1.946314 1.396902 -21.964135 -3.326840 -0.556841 -0.016162 9.788526 -2.529008 33.136659 -15.948078 8.397695 -0.490271 4.148572 -8.211647 32.781855 0.073395 -0.228284 -0.089006 -9.778197 -0.133322 12.272983 0.764457 -0.150340 -0.005302 -2.386846 5.820627 -25.847731 -9.373996 -1.450725 -5.332172 2.805123 6.650043 -25.348046 -0.043042 -0.217088 0.019327 -0.007875 0.000004 -0.000041 +0.859500 78.325000 -36.243500 -79.845465 -0.637318 4.967825 -0.002178 -0.000182 0.005292 -3.130411 -1.252466 -9.134661 -10.920789 -1.158856 0.229547 -4.887221 0.611612 4.921691 7.654276 -0.255402 -2.549639 -0.089795 0.422788 0.708750 1.327600 -2.669313 2.527558 -8.614942 0.477911 0.807386 -10.194141 -0.000007 0.000004 0.000773 0.001396 -0.000214 0.000774 -0.001500 0.000273 -7.823577 9.646379 -0.288537 11.496163 -5.798997 -2.136835 6.069130 -0.671087 -0.325137 -4.748481 1.394571 6.506171 -4.123713 -2.407459 -0.103461 0.581132 0.539959 6.583904 1.809153 -12.335818 -3.468254 7.709467 13.594173 13.740780 7.149198 0.791994 0.375584 -6.621018 0.229947 -19.665014 -9.337397 -1.403546 3.265219 0.999453 -1.884858 -19.865216 -9.328263 -27.115062 -27.944544 -13.141847 -8.847594 -64.168644 1.870182 1.353591 -21.952757 -3.140806 -0.525737 -0.014403 9.665009 -2.462370 33.082216 -15.964509 8.337054 -0.502447 4.138167 -8.192547 32.708540 0.073948 -0.233917 -0.088451 -9.759961 -0.201485 12.247480 0.764731 -0.150395 -0.005299 -2.370710 5.827996 -25.845175 -9.409642 -1.442720 -5.340184 2.833743 6.643289 -25.347539 -0.040908 -0.214581 0.021158 -0.007876 0.000004 -0.000039 +0.859500 78.312800 -36.219000 -79.849716 -0.588545 4.995771 -0.002184 -0.000181 0.005290 -3.179235 -1.247596 -9.156500 -10.892673 -1.195022 0.219983 -4.835304 0.579509 4.947180 7.653272 -0.276308 -2.507654 -0.089782 0.422788 0.708751 1.449973 -2.743188 2.612485 -8.328549 0.508834 0.847659 -10.194154 -0.000007 0.000004 0.000777 0.001397 -0.000210 0.000776 -0.001501 0.000274 -7.802306 9.645787 -0.291919 11.309431 -5.630059 -2.174000 6.346665 -0.702495 -0.338296 -4.881647 1.328828 6.490345 -4.102867 -2.409968 -0.130562 0.579929 0.537056 6.563164 1.845461 -12.323141 -3.460597 7.526226 13.644935 13.718332 7.419782 0.822856 0.387850 -6.833547 0.210942 -19.683174 -9.288771 -1.437591 3.231451 0.999795 -1.886924 -19.879020 -8.351212 -24.532848 -27.081331 -12.909909 -7.301619 -60.062320 1.812526 1.287110 -21.939872 -2.954542 -0.494588 -0.012745 9.595009 -2.420899 33.049656 -15.964517 8.337050 -0.502445 4.121795 -8.174662 32.633158 0.073945 -0.233917 -0.088446 -9.758928 -0.243182 12.276700 0.840224 -0.165245 -0.005713 -2.422618 5.825689 -25.923073 -9.411216 -1.456619 -5.340221 2.817139 6.622023 -25.420704 -0.040903 -0.214580 0.021154 -0.007873 0.000003 -0.000042 +0.841200 78.288400 -36.194600 -79.853991 -0.539767 5.023710 -0.002182 -0.000181 0.005291 -3.228058 -1.242708 -9.178343 -10.864550 -1.231195 0.210436 -4.783380 0.547428 4.972707 7.652282 -0.297214 -2.465662 -0.138720 0.422184 0.709112 1.593455 -2.815917 2.698599 -7.972257 0.541017 0.887133 -10.194169 -0.000006 0.000005 0.000775 0.001398 -0.000229 0.000778 -0.001499 0.000263 -7.781426 9.631213 -0.295440 11.122869 -5.460999 -2.210595 6.624202 -0.733968 -0.351298 -5.014833 1.263123 6.474364 -4.106227 -2.437740 -0.158686 0.578731 0.534153 6.542425 1.881771 -12.310455 -3.452942 7.342949 13.695773 13.696059 7.690349 0.853773 0.399965 -7.046079 0.192007 -19.701406 -9.240168 -1.471666 3.197709 1.001961 -1.900363 -19.968874 -7.316397 -21.445520 -25.911173 -12.729474 -5.799580 -55.592310 1.736323 1.201637 -21.992849 -2.768270 -0.463432 -0.011188 9.515354 -2.368066 33.065502 -16.042024 8.315236 -0.491215 4.118824 -8.171410 32.619464 0.072475 -0.225017 -0.061969 -9.729989 -0.311739 12.226490 0.840226 -0.165246 -0.005708 -2.409162 5.833775 -25.924748 -9.464475 -1.429477 -5.341561 2.868722 6.608854 -25.420479 -0.040903 -0.214581 0.021154 -0.007875 0.000003 -0.000041 +0.835100 78.288400 -36.170200 -79.881052 -0.471940 5.079411 -0.002184 -0.000181 0.005289 -3.258670 -1.256763 -9.211656 -10.850359 -1.289791 0.188960 -4.731368 0.514616 5.012222 7.651308 -0.318121 -2.423672 -0.068913 0.431907 0.719421 1.625830 -2.908527 2.764455 -7.615976 0.573444 0.926408 -10.194168 -0.000007 0.000003 0.000773 0.001396 -0.000212 0.000776 -0.001495 0.000259 -7.760551 9.616626 -0.298953 10.917079 -5.268581 -2.275820 6.901736 -0.765509 -0.364152 -5.120042 1.197338 6.457633 -4.107914 -2.451629 -0.186730 0.577525 0.531253 6.521693 1.939952 -12.284379 -3.454612 7.155997 13.759372 13.658474 7.988694 0.887934 0.413150 -7.258637 0.173138 -19.719716 -9.187941 -1.526434 3.164105 1.002451 -1.903460 -19.989600 -6.330852 -18.026918 -24.603467 -12.623456 -4.322645 -50.887553 1.664972 1.138216 -21.979844 -2.554399 -0.427653 -0.009528 9.436953 -2.316027 33.004536 -16.042105 8.322229 -0.491202 4.099503 -8.150238 32.530378 0.072461 -0.225021 -0.061977 -9.700820 -0.393548 12.180883 0.929431 -0.182794 -0.006175 -2.486006 5.856995 -25.930094 -9.489926 -1.405482 -5.342193 2.822806 6.617848 -25.421409 -0.040901 -0.214582 0.021153 -0.007872 0.000003 -0.000042 +0.829000 78.270100 -36.145800 -79.887282 -0.402267 5.135378 -0.002180 -0.000180 0.005292 -3.289313 -1.270801 -9.244994 -10.836178 -1.348393 0.167498 -4.678111 0.467924 5.051007 7.649717 -0.353005 -2.381669 -0.103851 0.429486 0.739369 1.763228 -2.996039 2.835835 -7.245749 0.606347 0.965335 -10.194155 -0.000007 0.000005 0.000775 0.001398 -0.000217 0.000773 -0.001502 0.000266 -7.739677 9.602058 -0.302464 10.732859 -5.069745 -2.314155 7.179270 -0.797106 -0.376853 -5.225347 1.117731 6.442721 -4.130469 -2.462975 -0.229670 0.576320 0.528355 6.500949 1.983824 -12.257796 -3.459233 6.969037 13.823091 13.621095 8.287002 0.922156 0.426156 -7.477426 0.127335 -19.734252 -9.135759 -1.581236 3.130548 1.002944 -1.906563 -20.010330 -5.476199 -14.272806 -23.136245 -12.551279 -2.886851 -45.958516 1.574545 1.053630 -22.039371 -2.340538 -0.391870 -0.007995 9.357465 -2.263202 33.013497 -16.105559 8.307561 -0.496017 4.093564 -8.143710 32.502934 0.069550 -0.207508 -0.053248 -9.671731 -0.475377 12.135330 0.936307 -0.184147 -0.006212 -2.500277 5.873948 -25.942636 -9.518521 -1.409285 -5.342892 2.832451 6.619016 -25.420388 -0.040904 -0.214581 0.021152 -0.007877 0.000003 -0.000040 +0.822900 78.264000 -36.121400 -79.893563 -0.332608 5.177278 -0.002188 -0.000181 0.005289 -3.316611 -1.264316 -9.281216 -10.822042 -1.407002 0.146051 -4.624818 0.421268 5.089825 7.648152 -0.387889 -2.339671 -0.138518 0.404928 0.732229 1.899793 -3.063613 2.927154 -6.875100 0.614640 1.008268 -10.194160 -0.000007 0.000005 0.000776 0.001397 -0.000214 0.000778 -0.001495 0.000271 -7.718208 9.608447 -0.305764 10.548787 -4.870788 -2.351844 7.456792 -0.828762 -0.389399 -5.330648 1.038147 6.427637 -4.153017 -2.474300 -0.272605 0.575111 0.525457 6.480215 2.027853 -12.231498 -3.442860 6.795638 13.891665 13.581531 8.550644 0.952458 0.437502 -7.696897 0.078795 -19.769755 -9.088419 -1.608506 3.096897 1.004920 -1.918973 -20.093259 -4.867182 -10.242472 -21.494243 -12.493194 -1.509301 -40.827333 1.481306 0.956587 -22.028139 -2.147367 -0.359545 -0.006732 9.287978 -2.221926 32.953255 -16.105663 8.314557 -0.509994 4.083282 -8.132384 32.410791 0.069550 -0.207509 -0.053252 -9.642338 -0.581628 12.083454 0.943167 -0.185496 -0.006245 -2.514545 5.890907 -25.955175 -9.516950 -1.395384 -5.342852 2.845894 6.625526 -25.439746 -0.035655 -0.188417 0.034151 -0.007871 0.000004 -0.000040 +0.816800 78.251800 -36.097000 -79.899915 -0.262956 5.233162 -0.002186 -0.000180 0.005289 -3.343897 -1.257812 -9.317404 -10.786901 -1.465561 0.125143 -4.599355 0.372157 5.128876 7.646601 -0.422773 -2.297667 -0.096822 0.426132 0.724061 1.945521 -3.135632 3.013674 -6.504589 0.628911 1.038373 -10.194150 -0.000008 0.000004 0.000776 0.001397 -0.000215 0.000777 -0.001499 0.000273 -7.696737 9.614848 -0.309066 10.364360 -4.684648 -2.417390 7.706545 -0.857307 -0.400562 -5.401009 0.958421 6.411824 -4.175584 -2.485612 -0.315550 0.573904 0.522555 6.459481 2.071353 -12.219164 -3.426805 6.622228 13.960335 13.542133 8.814277 0.982814 0.448713 -7.889139 0.024056 -19.805474 -9.068648 -1.640576 3.062482 1.005575 -1.923106 -20.120902 -4.618080 -6.088998 -19.632032 -12.387360 -0.219380 -35.576157 1.387911 0.859024 -22.105537 -1.954208 -0.327216 -0.005573 9.217279 -2.179794 32.969945 -16.105731 8.321552 -0.495993 4.089280 -8.139002 32.393965 0.068433 -0.200838 -0.033397 -9.612970 -0.681048 12.051464 0.950028 -0.186844 -0.006277 -2.564753 5.930060 -25.984755 -9.515377 -1.381486 -5.328822 2.835426 6.635688 -25.489311 -0.034178 -0.181722 0.053988 -0.007872 0.000003 -0.000040 +0.810700 78.233400 -36.072500 -79.906327 -0.193303 5.289102 -0.002186 -0.000180 0.005291 -3.374556 -1.271793 -9.350740 -10.765819 -1.510260 0.102395 -4.561821 0.345188 5.169021 7.645992 -0.436695 -2.255688 -0.145822 0.429938 0.729842 2.076062 -3.217974 3.090159 -6.134038 0.643375 1.068386 -10.194156 -0.000007 0.000004 0.000773 0.001397 -0.000219 0.000773 -0.001501 0.000271 -7.676064 9.593285 -0.312638 10.180837 -4.487456 -2.473478 7.956316 -0.885904 -0.411594 -5.471451 0.864859 6.397833 -4.219002 -2.494321 -0.345415 0.572699 0.519658 6.438750 2.114677 -12.206536 -3.431788 6.448787 14.029119 13.502960 9.098694 1.015618 0.460644 -8.080763 -0.027763 -19.820589 -9.025854 -1.682882 3.014762 1.006222 -1.927241 -20.148529 -4.666560 -1.980141 -17.607744 -12.321962 1.006288 -30.306075 1.293618 0.757808 -22.085729 -1.761045 -0.294884 -0.004518 9.137308 -2.147520 32.888344 -16.105817 8.328547 -0.481993 4.061144 -8.107907 32.285929 0.067323 -0.194164 -0.013538 -9.555828 -0.793773 11.979989 0.943177 -0.185498 -0.006248 -2.614450 5.969669 -25.979359 -9.527720 -1.366017 -5.315130 2.816125 6.633379 -25.491335 -0.034679 -0.183951 0.047373 -0.007872 0.000004 -0.000040 +0.792400 78.227300 -36.048100 -79.912814 -0.123660 5.359036 -0.002182 -0.000181 0.005288 -3.405876 -1.289631 -9.411812 -10.744771 -1.554965 0.079661 -4.522993 0.304332 5.208414 7.644799 -0.464594 -2.213692 -0.194686 0.420466 0.719374 2.206773 -3.300145 3.166839 -5.763724 0.669432 1.072756 -10.194155 -0.000008 0.000004 0.000775 0.001397 -0.000217 0.000775 -0.001498 0.000273 -7.654789 9.592681 -0.316007 10.010482 -4.304167 -2.511486 8.206087 -0.914550 -0.422505 -5.541932 0.769384 6.369861 -4.260677 -2.489128 -0.375205 0.570679 0.514828 6.404190 2.158641 -12.180114 -3.422458 6.275376 14.098035 13.463991 9.383139 1.048486 0.472416 -8.272832 -0.081396 -19.849739 -8.983078 -1.725222 2.967074 1.008164 -1.939654 -20.231457 -5.036743 2.084433 -15.424688 -12.259542 2.193562 -24.993902 1.198179 0.651684 -22.167808 -1.567881 -0.262546 -0.003586 9.046972 -2.103301 32.904061 -16.105718 8.321540 -0.495993 4.053720 -8.099672 32.273778 0.064403 -0.176800 -0.026931 -9.499360 -0.886992 11.879634 0.936312 -0.184148 -0.006211 -2.646023 5.998302 -25.955013 -9.540042 -1.350549 -5.322419 2.796814 6.631074 -25.493350 -0.032666 -0.173202 0.036193 -0.007871 0.000003 -0.000041 +0.780200 78.221200 -36.042000 -79.920710 -0.040096 5.428981 -0.002182 -0.000181 0.005290 -3.433468 -1.285003 -9.461887 -10.723716 -1.613584 0.058454 -4.484153 0.263505 5.247850 7.622661 -0.491599 -2.150898 -0.138721 0.421167 0.718963 2.210277 -3.364380 3.211501 -5.497847 0.668019 1.066782 -10.194158 -0.000006 0.000005 0.000774 0.001399 -0.000215 0.000774 -0.001500 0.000268 -7.633521 9.592081 -0.319371 9.840309 -4.120761 -2.548940 8.469707 -0.944828 -0.433887 -5.612382 0.687798 6.339861 -4.288466 -2.485647 -0.404386 0.568661 0.509996 6.369627 2.202595 -12.153696 -3.413147 6.101939 14.167051 13.425226 9.646765 1.078997 0.483180 -8.485359 -0.130155 -19.879088 -8.945040 -1.740009 2.940243 1.008645 -1.942759 -20.252192 -5.839431 5.686562 -12.752023 -12.206608 3.180816 -19.787999 1.106601 0.563259 -22.197106 -1.374723 -0.230207 -0.002751 8.973920 -2.046489 32.857663 -16.105646 8.314550 -0.495999 4.041955 -8.086626 32.196880 0.063674 -0.172349 -0.013693 -9.470597 -0.991337 11.812462 0.943173 -0.185497 -0.006247 -2.678211 6.026399 -25.972513 -9.531542 -1.337431 -5.315229 2.774208 6.647758 -25.490514 -0.028689 -0.153524 0.051474 -0.007868 0.000003 -0.000040 +0.774100 78.215100 -36.029800 -79.927368 0.029535 5.498974 -0.002189 -0.000181 0.005290 -3.442652 -1.297470 -9.509583 -10.702676 -1.672212 0.037270 -4.446489 0.235856 5.302035 7.614521 -0.519216 -2.108967 -0.159704 0.420904 0.719117 2.268443 -3.400807 3.264395 -5.343736 0.658775 1.074883 -10.194169 -0.000006 0.000007 0.000774 0.001395 -0.000209 0.000775 -0.001500 0.000266 -7.626429 9.591879 -0.320492 9.653963 -3.972213 -2.598217 8.733338 -0.975164 -0.445130 -5.682840 0.609144 6.330533 -4.316247 -2.482154 -0.447560 0.567855 0.508066 6.355801 2.246018 -12.141245 -3.404165 5.911729 14.216445 13.405844 9.931178 1.111975 0.494635 -8.677481 -0.183596 -19.908567 -8.907034 -1.754819 2.913425 1.009125 -1.945860 -20.272924 -6.967523 8.863691 -9.778896 -12.111870 3.994626 -14.645828 1.013461 0.468290 -22.246413 -1.181568 -0.197865 -0.002032 8.918250 -2.011108 32.833457 -16.105723 8.321551 -0.495997 4.036096 -8.080113 32.147358 0.062919 -0.167903 -0.000453 -9.441979 -1.095715 11.745321 0.874555 -0.171998 -0.005898 -2.686333 6.039792 -25.971709 -9.505199 -1.291125 -5.307637 2.840487 6.642801 -25.516501 -0.028205 -0.151290 0.058085 -0.007872 0.000004 -0.000040 +0.774100 78.209000 -36.011500 -79.934119 0.099152 5.568882 -0.002178 -0.000181 0.005293 -3.465638 -1.307615 -9.557602 -10.695663 -1.709993 0.013431 -4.422798 0.207703 5.342319 7.606979 -0.532863 -2.067055 -0.180682 0.420641 0.719272 2.327192 -3.447047 3.307465 -5.238853 0.661393 1.089303 -10.194167 -0.000006 0.000004 0.000774 0.001397 -0.000214 0.000772 -0.001498 0.000261 -7.619340 9.591681 -0.321614 9.467779 -3.823506 -2.647004 8.996963 -1.005552 -0.456236 -5.753319 0.530503 6.321117 -4.323196 -2.481279 -0.489829 0.567043 0.506135 6.341977 2.289434 -12.128791 -3.395202 5.721500 14.265909 13.386618 10.215605 1.145009 0.505934 -8.869640 -0.236930 -19.938229 -8.866667 -1.783433 2.886691 1.011203 -1.959308 -20.362737 -8.296619 11.625732 -6.539622 -12.022416 4.712087 -9.641638 0.921251 0.377792 -22.282642 -1.009101 -0.168986 -0.001483 8.846286 -1.988937 32.808568 -16.105811 8.328542 -0.495985 4.030247 -8.073588 32.097822 0.060733 -0.154842 -0.004963 -9.413748 -1.169118 11.682317 0.874548 -0.171997 -0.005894 -2.694757 6.052924 -25.991861 -9.526051 -1.288779 -5.301103 2.830256 6.652948 -25.543963 -0.027696 -0.149063 0.064701 -0.007874 0.000003 -0.000040 +0.755800 78.202900 -36.011500 -79.938891 0.147882 5.617871 -0.002184 -0.000181 0.005291 -3.488636 -1.317738 -9.605627 -10.688675 -1.747776 -0.010407 -4.399080 0.179566 5.382613 7.599429 -0.546515 -2.025143 -0.180689 0.420642 0.719271 2.344014 -3.495659 3.348021 -5.176030 0.668967 1.091445 -10.194156 -0.000007 0.000005 0.000776 0.001397 -0.000222 0.000775 -0.001497 0.000264 -7.612645 9.577499 -0.322868 9.281670 -3.671514 -2.665791 9.295270 -1.040000 -0.468625 -5.872623 0.472986 6.309127 -4.330142 -2.480399 -0.504120 0.566236 0.504202 6.328151 2.318548 -12.115828 -3.389124 5.540020 14.291791 13.363146 10.500018 1.178100 0.517065 -9.075447 -0.286962 -19.968130 -8.805621 -1.808561 2.860632 1.011678 -1.962417 -20.383494 -9.830897 13.965275 -3.057582 -11.923440 5.328060 -4.752885 0.832019 0.300510 -22.279266 -0.836639 -0.140107 -0.001018 8.774898 -1.967089 32.748756 -16.105892 8.335538 -0.495971 4.014127 -8.055580 32.000427 0.058554 -0.141780 -0.009480 -9.385254 -1.244335 11.656978 0.874545 -0.171996 -0.005893 -2.727239 6.080784 -26.030266 -9.523692 -1.267928 -5.294051 2.820017 6.663100 -25.571424 -0.027212 -0.146831 0.071313 -0.007874 0.000003 -0.000041 +0.749700 78.196800 -36.005400 -79.943701 0.196608 5.666841 -0.002184 -0.000181 0.005291 -3.511305 -1.325907 -9.639790 -10.681686 -1.785562 -0.034240 -4.375428 0.152203 5.408955 7.591900 -0.560171 -1.983232 -0.180682 0.420641 0.719271 2.357714 -3.489903 3.334031 -5.190143 0.675078 1.094481 -10.194156 -0.023602 0.034711 0.000778 0.001399 -0.000217 0.000777 -0.001498 0.000263 -7.584701 9.562723 -0.327478 9.094296 -3.541170 -2.701761 9.593586 -1.074515 -0.480842 -5.991934 0.415496 6.297022 -4.335320 -2.465636 -0.518331 0.565423 0.502272 6.314322 2.347659 -12.102866 -3.383057 5.358549 14.317755 13.339738 10.784436 1.211243 0.528029 -9.275814 -0.313862 -19.980270 -8.748081 -1.813025 2.834466 1.012149 -1.965519 -20.404212 -11.392359 15.662098 0.511263 -11.706018 5.778651 -0.152654 0.746094 0.237973 -22.340273 -0.698676 -0.117002 -0.000703 8.770047 -1.961354 32.776428 -16.106783 8.419467 -0.516826 4.005268 -8.045679 31.981449 0.045849 -0.150619 -0.007261 -9.357193 -1.308881 11.598367 0.874543 -0.171996 -0.005901 -2.759095 6.109188 -26.026796 -9.521361 -1.247075 -5.287008 2.805973 6.667927 -25.578510 -0.024235 -0.131614 0.073362 -0.007868 0.000003 -0.000039 +0.743600 78.190700 -35.993200 -79.948554 0.245327 5.715829 -0.002178 -0.000181 0.005291 -3.531666 -1.320406 -9.675870 -10.674719 -1.821091 -0.037206 -4.351757 0.124852 5.435313 7.584364 -0.573859 -1.962306 -0.194666 0.420465 0.719374 2.360828 -3.544254 3.378692 -5.183086 0.672977 1.116404 -10.194169 -0.000008 0.000005 0.000774 0.001395 -0.000217 0.000773 -0.001501 0.000262 -7.577412 9.569521 -0.328528 8.905943 -3.423863 -2.721044 9.857187 -1.105063 -0.491491 -6.111258 0.358028 6.284794 -4.319651 -2.453532 -0.552628 0.564616 0.500343 6.300508 2.377290 -12.075901 -3.376675 5.181846 14.326841 13.337023 11.048041 1.242007 0.538043 -9.442620 -0.350623 -20.006177 -8.711253 -1.821006 2.807662 1.013722 -1.975871 -20.473321 -12.912304 16.945833 3.958510 -11.409636 6.145758 4.201021 0.662167 0.184552 -22.330665 -0.560699 -0.093896 -0.000448 8.666006 -1.921236 32.700869 -16.056776 8.371019 -0.517134 3.986160 -8.024252 31.914558 0.045855 -0.150618 -0.007258 -9.329151 -1.373457 11.539763 0.874536 -0.171994 -0.005895 -2.798496 6.125776 -26.022225 -9.519033 -1.226222 -5.279968 2.791941 6.672744 -25.585585 -0.024228 -0.131617 0.073360 -0.007869 0.000003 -0.000041 +0.737500 78.184600 -35.999300 -79.951351 0.273164 5.743789 -0.002191 -0.000181 0.005291 -3.552008 -1.314895 -9.711939 -10.653744 -1.856628 -0.039722 -4.330061 0.118370 5.462819 7.590831 -0.588072 -1.941236 -0.194688 0.420465 0.719374 2.339841 -3.545492 3.397158 -5.239161 0.678265 1.119936 -10.194163 -0.000007 0.000004 0.000773 0.001399 -0.000222 0.000772 -0.001495 0.000258 -7.570108 9.576309 -0.329584 8.751591 -3.325254 -2.750846 10.120808 -1.135662 -0.501995 -6.202621 0.300383 6.272289 -4.303984 -2.441435 -0.565953 0.563805 0.498414 6.286676 2.406799 -12.048743 -3.384334 5.005121 14.335896 13.334295 11.311644 1.272821 0.547916 -9.609436 -0.387307 -20.032195 -8.674436 -1.829000 2.794844 1.014195 -1.978972 -20.494039 -14.363690 17.963597 7.164469 -11.053163 6.505258 8.364276 0.604977 0.122452 -22.372056 -0.457228 -0.076568 -0.000300 8.665563 -1.920935 32.728842 -16.050162 8.413060 -0.511105 3.989127 -8.027590 31.906146 0.044745 -0.143944 0.012611 -9.336734 -1.407767 11.440488 0.819649 -0.161197 -0.005603 -2.759654 6.094531 -25.956558 -9.519024 -1.226222 -5.286958 2.841752 6.644590 -25.523295 -0.003009 -0.169435 0.084610 -0.007871 0.000003 -0.000039 +0.731400 78.178500 -35.993200 -79.954162 0.301002 5.771786 -0.002180 -0.000181 0.005292 -3.575212 -1.325973 -9.717436 -10.632764 -1.871306 -0.044486 -4.307026 0.097994 5.489564 7.597302 -0.602266 -1.906179 -0.194683 0.420466 0.719374 2.319428 -3.556612 3.405770 -5.295255 0.683545 1.123474 -10.194152 -0.000007 0.000004 0.000776 0.001399 -0.000226 0.000774 -0.001497 0.000266 -7.563222 9.569114 -0.330768 8.597251 -3.226565 -2.780382 10.342791 -1.161465 -0.510732 -6.294000 0.242755 6.259693 -4.316080 -2.425774 -0.580456 0.562994 0.496483 6.272858 2.435268 -12.049564 -3.392623 4.848787 14.351940 13.327804 11.554415 1.301242 0.556890 -9.779467 -0.437397 -20.056415 -8.637610 -1.837002 2.782033 1.014658 -1.982079 -20.514779 -15.738313 18.706782 10.105793 -10.662620 6.841415 12.306972 0.547728 0.060388 -22.413527 -0.353749 -0.059236 -0.000176 8.575688 -1.876671 32.723949 -15.986158 8.378731 -0.527441 3.992103 -8.030915 31.897701 0.044737 -0.143947 0.012597 -9.287180 -1.482494 11.459848 0.764749 -0.150398 -0.005303 -2.745905 6.142758 -26.007805 -9.498158 -1.228563 -5.293499 2.854440 6.662386 -25.591233 -0.021728 -0.118629 0.068800 -0.007869 0.000003 -0.000040 +0.725300 78.172400 -35.993200 -79.958385 0.342754 5.799824 -0.002175 -0.000181 0.005292 -3.575374 -1.326943 -9.724367 -10.632781 -1.887473 -0.063842 -4.283989 0.077627 5.516328 7.582797 -0.615693 -1.871347 -0.194678 0.420466 0.719373 2.319417 -3.556610 3.405768 -5.323347 0.689372 1.126681 -10.194159 -0.000006 0.000004 0.000774 0.001398 -0.000224 0.000776 -0.001502 0.000269 -7.556338 9.561916 -0.331954 8.476172 -3.157455 -2.829481 10.516213 -1.181649 -0.517488 -6.300988 0.242808 6.259714 -4.353475 -2.442121 -0.596033 0.562998 0.496482 6.272846 2.464439 -12.036678 -3.379572 4.703578 14.335911 13.327236 11.797221 1.329701 0.565740 -9.949525 -0.487416 -20.080797 -8.580079 -1.841537 2.769887 1.015126 -1.985187 -20.535527 -16.894312 19.096041 12.408346 -10.166812 7.168267 15.812667 0.531038 0.050196 -22.475356 -0.298559 -0.049994 -0.000122 8.544460 -1.882960 32.764465 -15.957875 8.379017 -0.538557 4.002403 -8.042491 31.923546 0.015732 -0.182381 0.023799 -9.287645 -1.507616 11.387121 0.757875 -0.149045 -0.005264 -2.760729 6.145047 -25.950081 -9.475746 -1.217001 -5.279033 2.845553 6.649936 -25.543687 -0.001768 -0.162942 0.082339 -0.007872 0.000004 -0.000042 +0.719200 78.166300 -35.999300 -79.948711 0.385923 5.806756 -0.002179 -0.000181 0.005291 -3.575869 -1.329851 -9.745151 -10.632797 -1.903642 -0.083198 -4.274867 0.055924 5.543107 7.568318 -0.629128 -1.836518 -0.194669 0.420465 0.719373 2.319440 -3.556610 3.405768 -5.351186 0.682447 1.124144 -10.194156 -0.000006 0.000004 0.000777 0.001398 -0.000215 0.000779 -0.001502 0.000280 -7.535280 9.554320 -0.335378 8.354352 -3.090706 -2.808578 10.710455 -1.204280 -0.524983 -6.413707 0.141876 6.239026 -4.324589 -2.382374 -0.622788 0.561779 0.493587 6.252121 2.537233 -12.004355 -3.357518 4.558408 14.319898 13.326631 11.880453 1.339465 0.568747 -9.996992 -0.505603 -20.084257 -8.561681 -1.824272 2.756492 1.016673 -1.995540 -20.604623 -17.871270 19.217224 14.015470 -9.633803 7.516274 18.913436 0.447088 -0.002779 -22.421773 -0.188185 -0.031508 -0.000041 8.488496 -1.857756 32.698530 -15.915463 8.379431 -0.551735 3.978913 -8.016101 31.836092 0.042541 -0.130889 0.008088 -9.245158 -1.573524 11.410774 0.696111 -0.136897 -0.004909 -2.754508 6.181451 -26.000263 -9.474184 -1.203098 -5.279000 2.856964 6.665940 -25.604793 -0.021732 -0.118629 0.068803 -0.007869 0.000003 -0.000040 +0.713100 78.160200 -35.987100 -79.936218 0.401253 5.813661 -0.002182 -0.000181 0.005290 -3.603954 -1.328019 -9.766583 -10.618815 -1.916816 -0.074271 -4.267833 0.055840 5.557068 7.568311 -0.629110 -1.822528 -0.194673 0.420466 0.719373 2.291451 -3.558253 3.404014 -5.358058 0.675933 1.121354 -10.194156 -0.000006 0.000004 0.000774 0.001397 -0.000220 0.000775 -0.001497 0.000269 -7.513800 9.560697 -0.338662 8.253171 -3.034100 -2.820162 10.856132 -1.221271 -0.530552 -6.449100 0.090767 6.225096 -4.327926 -2.353733 -0.650909 0.560559 0.490693 6.231383 2.653484 -11.952199 -3.347531 4.423871 14.278583 13.301450 11.845774 1.335394 0.567492 -9.949578 -0.517880 -20.090761 -8.543270 -1.807010 2.743078 1.016829 -1.996573 -20.611527 -18.691508 19.098751 15.007618 -9.102171 7.912635 21.605693 0.442105 -0.024484 -22.443751 -0.139896 -0.023420 -0.000022 8.477499 -1.866482 32.705084 -15.873063 8.379856 -0.543930 3.974497 -8.011115 31.837691 0.013540 -0.169321 0.019286 -9.245403 -1.596123 11.366760 0.702976 -0.138246 -0.004947 -2.751925 6.172153 -25.972484 -9.474976 -1.210049 -5.279014 2.851905 6.658827 -25.577648 -0.012994 -0.147278 0.077847 -0.007871 0.000003 -0.000042 +0.707000 78.154100 -35.981000 -79.944586 0.414461 5.820683 -0.002177 -0.000181 0.005291 -3.611015 -1.327801 -9.773669 -10.604844 -1.931496 -0.079250 -4.260796 0.055757 5.571030 7.568306 -0.629092 -1.808540 -0.194674 0.420466 0.719374 2.278315 -3.573900 3.418012 -5.378915 0.669146 1.118727 -10.194150 -0.000007 0.000005 0.000779 0.001398 -0.000217 0.000779 -0.001497 0.000261 -7.513592 9.567695 -0.338596 8.179601 -2.988083 -2.863859 10.953252 -1.232604 -0.534244 -6.456150 0.083899 6.226076 -4.357505 -2.364006 -0.638134 0.560963 0.491656 6.238296 2.725836 -11.926502 -3.346736 4.285078 14.247458 13.286000 11.887379 1.340278 0.568996 -9.969835 -0.542539 -20.094000 -8.522573 -1.803553 2.729746 1.016983 -1.997609 -20.618435 -19.388860 18.792395 15.423974 -8.642553 8.425209 23.779403 0.367970 -0.066157 -22.394770 -0.050215 -0.008401 0.000001 8.441240 -1.843313 32.640105 -15.844765 8.380127 -0.548046 3.962841 -7.997965 31.760796 0.041802 -0.126435 0.021319 -9.224127 -1.671282 11.363599 0.709834 -0.139594 -0.004994 -2.797087 6.258259 -25.982038 -9.440976 -1.220891 -5.278298 2.850439 6.703931 -25.595082 -0.018801 -0.105241 0.108482 -0.007872 0.000003 -0.000040 +0.700900 78.160200 -35.981000 -79.952967 0.427669 5.848724 -0.002185 -0.000181 0.005290 -3.618079 -1.327582 -9.780758 -10.590873 -1.946177 -0.084227 -4.239842 0.057036 5.584977 7.568295 -0.629047 -1.773565 -0.194679 0.420465 0.719373 2.266066 -3.604350 3.417215 -5.399776 0.662360 1.116098 -10.194146 -0.000007 0.000004 0.000777 0.001397 -0.000215 0.000775 -0.001495 0.000268 -7.513806 9.560709 -0.338661 8.167802 -2.955521 -2.848088 10.960180 -1.233411 -0.534509 -6.464031 -0.018830 6.198085 -4.342445 -2.302479 -0.665503 0.556079 0.480084 6.155352 2.740688 -11.913114 -3.336585 4.221562 14.235029 13.287020 12.019202 1.355753 0.573726 -10.085651 -0.575900 -20.115103 -8.490363 -1.784000 2.716763 1.017136 -1.998646 -20.625346 -19.883623 18.078539 14.926364 -8.358624 9.114034 25.121974 0.358611 -0.075738 -22.450009 -0.015719 -0.002624 0.000006 8.425275 -1.846206 32.681335 -15.816637 8.394393 -0.552148 3.973099 -8.009560 31.786601 0.016752 -0.146213 0.041273 -9.224167 -1.673562 11.356983 0.764737 -0.150395 -0.005302 -2.886644 6.314088 -25.999610 -9.388481 -1.254927 -5.277168 2.855694 6.664165 -25.598017 -0.039725 -0.139499 0.106741 -0.007869 0.000003 -0.000040 +0.694700 78.160200 -35.987100 -79.961354 0.440868 5.855761 -0.002178 -0.000181 0.005292 -3.625139 -1.327363 -9.787845 -10.597875 -1.960827 -0.089910 -4.217448 0.043658 5.612136 7.568296 -0.629020 -1.752584 -0.194667 0.420466 0.719372 2.266076 -3.604348 3.417213 -5.399776 0.662359 1.116098 -10.236126 -0.017356 -0.011799 0.000775 0.001400 -0.000224 0.000774 -0.001499 0.000269 -7.514013 9.553720 -0.338727 8.037958 -2.905562 -2.850249 11.161359 -1.256912 -0.542086 -6.520367 -0.061833 6.190007 -4.359655 -2.272024 -0.673185 0.555264 0.478155 6.141516 2.755535 -11.899731 -3.326451 4.158018 14.222614 13.288029 12.102428 1.365528 0.576695 -10.167451 -0.617338 -20.135898 -8.458158 -1.764455 2.703773 1.018824 -2.010035 -20.701361 -20.111823 16.996268 13.773800 -8.247741 9.785878 25.613869 0.349224 -0.085288 -22.505246 0.018780 0.003155 0.000006 8.409329 -1.849112 32.722579 -15.788484 8.408657 -0.556262 3.983368 -8.021141 31.812385 -0.006809 -0.174891 0.034723 -9.252540 -1.736414 11.281845 0.771611 -0.151746 -0.005339 -2.861544 6.365888 -25.940428 -9.388480 -1.254927 -5.277169 2.905527 6.682856 -25.537891 -0.016584 -0.094284 0.119418 -0.007871 0.000004 -0.000040 +0.688600 78.154100 -35.974900 -79.948865 0.456218 5.862722 -0.002180 -0.000181 0.005291 -3.632537 -1.329079 -9.808789 -10.590889 -1.961593 -0.096624 -4.217305 0.042137 5.640074 7.568286 -0.628994 -1.731598 -0.194787 0.429319 0.730204 2.266069 -3.604349 3.417214 -5.448404 0.644522 1.086035 -10.208132 -0.000005 0.000002 0.000778 0.001400 -0.000231 0.000776 -0.001499 0.000268 -7.500039 9.546327 -0.341025 8.087958 -2.896005 -2.863640 11.057283 -1.244754 -0.538171 -6.450825 -0.105965 6.182073 -4.376859 -2.241567 -0.680854 0.554450 0.476227 6.127692 2.770270 -11.886148 -3.330327 4.121689 14.219491 13.284014 12.157912 1.372048 0.578663 -10.242138 -0.628983 -20.139750 -8.442049 -1.733409 2.711262 1.018981 -2.011072 -20.708273 -20.201309 15.674654 12.239698 -8.219112 10.266054 25.555522 0.291177 -0.119189 -22.445323 0.087763 0.014708 0.000001 8.373060 -1.825958 32.657651 -15.760132 8.401928 -0.560404 3.959906 -7.994672 31.747115 0.040328 -0.117687 0.025683 -9.251802 -1.724265 11.381277 0.819646 -0.161197 -0.005605 -2.905796 6.349927 -26.046607 -9.388492 -1.254929 -5.277168 2.864563 6.676635 -25.645555 -0.006042 -0.112379 0.095160 -0.007874 0.000003 -0.000040 +0.682500 78.160200 -35.968800 -79.950296 0.470129 5.869695 -0.002179 -0.000181 0.005292 -3.639939 -1.330794 -9.829745 -10.583901 -1.962362 -0.103340 -4.217261 0.041756 5.647056 7.568276 -0.628967 -1.710615 -0.194917 0.438172 0.741037 2.245685 -3.615451 3.406017 -5.441544 0.651032 1.088827 -10.229128 -0.017356 -0.011798 0.000777 0.001400 -0.000224 0.000776 -0.001496 0.000261 -7.500033 9.546331 -0.341028 8.047876 -2.868947 -2.873570 11.126671 -1.252859 -0.540783 -6.458210 -0.149398 6.174017 -4.394057 -2.211107 -0.688516 0.552813 0.472370 6.100045 2.769708 -11.900023 -3.337639 4.123557 14.217837 13.263906 12.213408 1.378570 0.580629 -10.296433 -0.645497 -20.143404 -8.425941 -1.702365 2.697754 1.019737 -2.016253 -20.742830 -20.162090 14.107865 10.312706 -8.302975 10.625047 25.061248 0.283338 -0.122012 -22.458572 0.108454 0.018172 -0.000005 8.378495 -1.821563 32.657843 -15.731794 8.395202 -0.564540 3.959907 -7.994673 31.747119 0.027260 -0.124310 0.034535 -9.252191 -1.727029 11.330422 0.826507 -0.162546 -0.005640 -2.912721 6.338646 -26.003626 -9.400045 -1.232515 -5.277417 2.856946 6.665969 -25.604801 -0.006038 -0.112378 0.095161 -0.007876 0.000003 -0.000039 +0.676400 78.154100 -35.968800 -79.948860 0.456213 5.876677 -0.002175 -0.000181 0.005290 -3.646989 -1.330568 -9.836819 -10.576907 -1.963126 -0.110057 -4.196347 0.043443 5.654031 7.568272 -0.628938 -1.689630 -0.194926 0.438172 0.741037 2.245679 -3.615451 3.406017 -5.441549 0.651030 1.088828 -10.250126 -0.034704 -0.023604 0.000775 0.001401 -0.000222 0.000776 -0.001498 0.000254 -7.500035 9.546327 -0.341026 8.069561 -2.859616 -2.863532 11.078111 -1.247183 -0.538959 -6.423677 -0.196136 6.145294 -4.411260 -2.180651 -0.696170 0.551181 0.468514 6.072397 2.769266 -11.914102 -3.330938 4.074612 14.184936 13.269334 12.359086 1.395701 0.585762 -10.414109 -0.686434 -20.170688 -8.409818 -1.671323 2.684236 1.020492 -2.021430 -20.777362 -20.012946 12.262844 8.001338 -8.444036 10.562955 23.900492 0.277536 -0.116052 -22.445340 0.129158 0.021641 -0.000016 8.367936 -1.830576 32.636444 -15.724856 8.409267 -0.565563 3.955525 -7.989721 31.726574 0.014923 -0.135383 0.030135 -9.252310 -1.716091 11.319225 0.833369 -0.163897 -0.005677 -2.920258 6.326832 -26.002532 -9.413172 -1.224007 -5.277701 2.855675 6.664192 -25.598014 -0.006048 -0.112377 0.095160 -0.007871 0.000003 -0.000039 +0.682500 78.154100 -35.974900 -79.947428 0.442301 5.883654 -0.002181 -0.000181 0.005291 -3.654062 -1.330341 -9.843919 -10.569903 -1.962386 -0.102864 -4.189242 0.042611 5.681956 7.554294 -0.628472 -1.682796 -0.194914 0.438172 0.741037 2.233705 -3.650868 3.439843 -5.504054 0.626579 1.056037 -10.208136 -0.000006 0.000003 0.000774 0.001396 -0.000224 0.000775 -0.001498 0.000261 -7.500034 9.546328 -0.341026 8.076169 -2.865559 -2.867533 11.064252 -1.245565 -0.538437 -6.389138 -0.239979 6.137383 -4.428459 -2.150187 -0.703814 0.551183 0.468515 6.072398 2.813430 -11.880709 -3.314693 3.998564 14.142743 13.279699 12.366022 1.396515 0.586002 -10.448237 -0.708745 -20.181083 -8.393695 -1.640283 2.691697 1.020640 -2.022468 -20.784300 -19.814959 10.152682 5.347427 -8.625718 10.237068 22.083154 0.269206 -0.121078 -22.465226 0.136054 0.022796 -0.000017 8.356720 -1.839140 32.656979 -15.717913 8.423318 -0.566574 3.958449 -7.993021 31.740265 0.023300 -0.142976 0.025791 -9.251955 -1.724508 11.359145 0.840232 -0.165247 -0.005711 -2.920872 6.326306 -26.044425 -9.426292 -1.215499 -5.277974 2.864556 6.676638 -25.645559 -0.026643 -0.108363 0.095295 -0.007872 0.000003 -0.000039 +0.682500 78.160200 -35.962700 -79.948149 0.449257 5.890657 -0.002185 -0.000181 0.005292 -3.663497 -1.343760 -9.849099 -10.562900 -1.961645 -0.095671 -4.182207 0.042543 5.695924 7.540306 -0.628007 -1.675957 -0.194911 0.438172 0.741037 2.234893 -3.670618 3.439904 -5.511312 0.641439 1.039851 -10.222132 -0.017356 -0.011797 0.000777 0.001399 -0.000220 0.000776 -0.001498 0.000261 -7.500033 9.546326 -0.341026 8.082806 -2.871502 -2.871526 11.050370 -1.243943 -0.537916 -6.375580 -0.283616 6.129420 -4.431761 -2.121540 -0.710936 0.549953 0.465626 6.051658 2.806232 -11.880374 -3.323109 4.160196 14.181701 13.246330 12.130179 1.368786 0.577680 -10.359912 -0.700416 -20.176941 -8.394833 -1.633381 2.698662 1.020794 -2.023502 -20.791188 -19.621265 7.912912 2.593650 -8.781344 9.764113 19.985200 0.261899 -0.121711 -22.471870 0.142953 0.023951 -0.000029 8.367604 -1.830347 32.657416 -15.710799 8.416390 -0.567616 3.958445 -7.993025 31.740261 0.028397 -0.130980 0.014680 -9.251951 -1.724507 11.359141 0.867680 -0.170646 -0.005859 -2.920869 6.326305 -26.044428 -9.439423 -1.206990 -5.278257 2.864556 6.676639 -25.645559 -0.033506 -0.107027 0.095328 -0.007872 0.000003 -0.000041 +0.676400 78.154100 -35.962700 -79.948864 0.456214 5.897646 -0.002181 -0.000181 0.005291 -3.672921 -1.357178 -9.854273 -10.555901 -1.962412 -0.102387 -4.176559 0.056377 5.710648 7.554283 -0.628452 -1.668805 -0.194917 0.438172 0.741037 2.234898 -3.670618 3.439904 -5.511317 0.641438 1.039852 -10.236134 -0.034705 -0.023600 0.000774 0.001396 -0.000219 0.000774 -0.001500 0.000268 -7.500036 9.546330 -0.341026 8.090138 -2.866579 -2.866710 11.036501 -1.242323 -0.537394 -6.361821 -0.306475 6.118536 -4.435070 -2.092886 -0.718050 0.548725 0.462736 6.030925 2.799032 -11.880017 -3.331522 4.043535 14.146556 13.262438 12.372947 1.397331 0.586246 -10.513016 -0.738931 -20.196888 -8.370658 -1.608091 2.685354 1.021246 -2.026612 -20.811936 -19.452748 5.560614 -0.283136 -8.938686 9.140659 17.595759 0.254560 -0.122336 -22.478501 0.149855 0.025108 -0.000028 8.358824 -1.819463 32.656883 -15.703628 8.409455 -0.568662 3.958440 -7.993030 31.740272 0.011638 -0.115793 0.023360 -9.251950 -1.724505 11.359150 0.881402 -0.173346 -0.005932 -2.928416 6.314496 -26.043330 -9.452552 -1.198481 -5.278533 2.864573 6.676630 -25.645555 -0.040372 -0.105688 0.095382 -0.007870 0.000003 -0.000040 +0.682500 78.154100 -35.962700 -79.947429 0.442301 5.904636 -0.002180 -0.000181 0.005291 -3.677949 -1.345241 -9.877133 -10.548911 -1.963177 -0.109101 -4.170922 0.070212 5.725383 7.554279 -0.628426 -1.647821 -0.180922 0.438353 0.740930 2.236339 -3.695326 3.464707 -5.559706 0.608670 1.026026 -10.208137 -0.000005 0.000002 0.000776 0.001397 -0.000217 0.000776 -0.001500 0.000275 -7.500033 9.546330 -0.341027 8.097502 -2.861658 -2.861898 11.001820 -1.238275 -0.536084 -6.327080 -0.329556 6.107782 -4.452238 -2.062418 -0.725663 0.547494 0.459845 6.010184 2.791832 -11.879668 -3.339935 4.035551 14.148459 13.258512 12.421514 1.403044 0.587944 -10.558911 -0.750286 -20.201493 -8.360306 -1.585102 2.671657 1.021704 -2.029720 -20.832666 -19.258085 3.096722 -3.239724 -9.040591 8.318171 14.891855 0.247238 -0.122967 -22.485157 0.156750 0.026261 -0.000029 8.350021 -1.808585 32.656340 -15.696644 8.416522 -0.569689 3.958452 -7.993016 31.740258 0.019636 -0.121164 0.025635 -9.252050 -1.729068 11.345920 0.895135 -0.176047 -0.006000 -2.935963 6.302698 -26.042267 -9.465677 -1.189973 -5.278802 2.864569 6.676638 -25.645573 -0.043498 -0.084872 0.088577 -0.007874 0.000004 -0.000038 +0.682500 78.160200 -35.962700 -79.945981 0.428383 5.911621 -0.002184 -0.000181 0.005292 -3.685002 -1.345011 -9.884228 -10.555911 -1.963917 -0.116295 -4.163953 0.070909 5.725368 7.554279 -0.628425 -1.647821 -0.167159 0.456243 0.762484 2.202266 -3.712206 3.447630 -5.566473 0.595794 1.020355 -10.208137 -0.000005 0.000003 0.000776 0.001396 -0.000222 0.000777 -0.001499 0.000256 -7.464588 9.545311 -0.346604 8.131699 -2.875079 -2.868664 10.876943 -1.223700 -0.531348 -6.257599 -0.373788 6.100173 -4.450422 -2.048548 -0.718605 0.547084 0.458883 6.003269 2.857046 -11.861225 -3.305777 3.963961 14.092786 13.274295 12.393774 1.399782 0.586968 -10.570787 -0.769802 -20.205680 -8.331516 -1.544871 2.686429 1.021851 -2.030753 -20.839573 -19.100962 0.615054 -6.225380 -9.045881 7.324930 11.976374 0.258605 -0.104750 -22.425524 0.163635 0.027415 -0.000028 8.364212 -1.825596 32.594250 -15.689643 8.423582 -0.570711 3.945315 -7.978168 31.678677 0.024340 -0.106946 0.021135 -9.251910 -1.722213 11.365763 0.908860 -0.178747 -0.006068 -2.943505 6.290891 -26.041187 -9.478795 -1.181465 -5.279070 2.864575 6.676628 -25.645554 -0.046620 -0.064056 0.081773 -0.007871 0.000003 -0.000039 +0.676400 78.148000 -35.962700 -79.944545 0.414469 5.904610 -0.002182 -0.000181 0.005292 -3.692069 -1.344779 -9.891329 -10.562905 -1.963149 -0.109578 -4.156996 0.071606 5.725371 7.554725 -0.614416 -1.626851 -0.153116 0.452001 0.756957 2.202266 -3.712204 3.447630 -5.566470 0.595793 1.020354 -10.208132 -0.011574 -0.007863 0.000776 0.001397 -0.000215 0.000776 -0.001498 0.000269 -7.464587 9.545309 -0.346604 8.165902 -2.888505 -2.875429 10.779833 -1.212367 -0.527643 -6.188110 -0.418025 6.092608 -4.469426 -2.031951 -0.712291 0.546673 0.457917 5.996355 2.864318 -11.854259 -3.318226 4.191221 14.139023 13.235263 11.998375 1.353307 0.572985 -10.410052 -0.759538 -20.217249 -8.341866 -1.525320 2.700143 1.022001 -2.031789 -20.846478 -19.046321 -1.817637 -9.157946 -8.979027 6.276179 9.023293 0.264404 -0.110711 -22.438751 0.156740 0.026259 -0.000024 8.363994 -1.825440 32.608242 -15.696763 8.430507 -0.569671 3.948222 -7.981465 31.692348 0.029051 -0.092729 0.016638 -9.251673 -1.708508 11.405441 0.922581 -0.181447 -0.006142 -2.940551 6.296079 -26.097550 -9.491932 -1.172956 -5.279351 2.873460 6.689081 -25.693129 -0.053488 -0.062716 0.081824 -0.007872 0.000003 -0.000040 +0.682500 78.148000 -35.956600 -79.964573 0.415208 5.901146 -0.002183 -0.000181 0.005290 -3.687350 -1.347615 -9.890534 -10.545998 -1.949767 -0.108807 -4.166076 0.078528 5.745277 7.559558 -0.608923 -1.628834 -0.162781 0.456184 0.763746 2.195015 -3.732534 3.458238 -5.580295 0.579925 0.997654 -10.216143 -0.000006 -0.000008 0.000774 0.001394 -0.000215 0.000778 -0.001501 0.000266 -7.464271 9.548454 -0.348139 8.162776 -2.880765 -2.874342 10.800326 -1.214072 -0.529684 -6.189893 -0.430655 6.080149 -4.482102 -1.996083 -0.718094 0.546175 0.443860 5.981102 2.870437 -11.855324 -3.308405 4.114161 14.111960 13.249627 12.140066 1.369952 0.578031 -10.505029 -0.790148 -20.210118 -8.320402 -1.490829 2.694019 1.031370 -2.021490 -20.849064 -19.106433 -4.217863 -12.059435 -8.861042 5.150232 6.028298 0.249586 -0.101202 -22.428502 0.153453 0.025709 -0.000028 8.369270 -1.821804 32.604547 -15.691653 8.432306 -0.567160 3.945451 -7.988535 31.688820 0.037676 -0.088390 0.015527 -9.315669 -1.685681 11.358888 1.001917 -0.197053 -0.006530 -2.934798 6.254643 -26.052768 -9.507011 -1.172626 -5.279767 2.862731 6.678059 -25.640947 -0.017085 -0.102333 0.093364 -0.007870 0.000003 -0.000041 +0.682500 78.148000 -35.956600 -79.964572 0.415204 5.901105 -0.002185 -0.000181 0.005291 -3.687695 -1.349553 -9.904401 -10.545993 -1.949765 -0.108807 -4.166079 0.078528 5.745283 7.559560 -0.608896 -1.607851 -0.162772 0.456184 0.763746 2.195026 -3.732530 3.458236 -5.580293 0.579927 0.997655 -10.216150 -0.011573 -0.007872 0.000774 0.001395 -0.000219 0.000777 -0.001500 0.000268 -7.464270 9.548458 -0.348140 8.162766 -2.880763 -2.874340 10.758689 -1.209215 -0.528097 -6.155222 -0.458742 6.084297 -4.479374 -1.975279 -0.717995 0.545359 0.441931 5.967279 2.870436 -11.855317 -3.308404 4.036882 14.074035 13.254754 12.244092 1.382178 0.581710 -10.545842 -0.780345 -20.210670 -8.320414 -1.490831 2.694017 1.031665 -2.023561 -20.862896 -19.224667 -6.430502 -14.764931 -8.618434 3.962806 3.070439 0.249579 -0.101206 -22.428507 0.153449 0.025708 -0.000028 8.369269 -1.821802 32.604553 -15.691666 8.432312 -0.567157 3.945448 -7.988534 31.688810 0.037666 -0.088392 0.015526 -9.315760 -1.672452 11.354319 0.953877 -0.187602 -0.006297 -2.880592 6.195845 -26.044688 -9.551786 -1.132419 -5.280663 2.865264 6.681615 -25.654542 0.008490 -0.080380 0.084100 -0.007871 0.000003 -0.000041 +0.682500 78.148000 -35.956600 -79.962412 0.394336 5.901088 -0.002181 -0.000181 0.005292 -3.688029 -1.351490 -9.918253 -10.546007 -1.949767 -0.108807 -4.166004 0.077767 5.759249 7.559558 -0.608896 -1.607851 -0.148777 0.456371 0.763634 2.181632 -3.743231 3.447455 -5.579934 0.560792 0.989039 -10.216134 -0.000007 -0.000007 0.000776 0.001398 -0.000229 0.000775 -0.001498 0.000266 -7.464271 9.548457 -0.348139 8.197693 -2.883324 -2.872289 10.717077 -1.204361 -0.526499 -6.120584 -0.489738 6.067679 -4.497470 -1.951747 -0.718617 0.544537 0.440004 5.953461 2.884717 -11.855792 -3.305590 4.097830 14.073972 13.245384 12.133121 1.369134 0.577787 -10.512287 -0.790403 -20.224067 -8.326161 -1.456333 2.693869 1.031966 -2.025633 -20.876709 -19.419741 -8.430291 -17.249339 -8.398629 2.764056 0.238634 0.253602 -0.083623 -22.375527 0.153441 0.025707 -0.000027 8.370275 -1.822486 32.541661 -15.705808 8.432186 -0.565082 3.932321 -7.973667 31.627218 0.048167 -0.066491 0.008771 -9.315295 -1.656218 11.422740 0.933291 -0.183554 -0.006194 -2.809745 6.124791 -26.115411 -9.596543 -1.092212 -5.281525 2.880517 6.702937 -25.736061 0.032619 -0.065132 0.054993 -0.007875 0.000004 -0.000039 +0.682500 78.148000 -35.956600 -79.961695 0.387379 5.901077 -0.002178 -0.000181 0.005292 -3.688033 -1.351489 -9.918254 -10.545993 -1.949767 -0.108806 -4.168030 0.097853 5.774370 7.559557 -0.608896 -1.607851 -0.134797 0.456557 0.763524 2.181642 -3.743233 3.447455 -5.579935 0.560792 0.989038 -10.216150 -0.011573 -0.007874 0.000775 0.001399 -0.000225 0.000776 -0.001497 0.000264 -7.464267 9.548452 -0.348139 8.230057 -2.920739 -2.871572 10.640781 -1.195466 -0.523561 -6.085300 -0.461450 6.071026 -4.506231 -1.964711 -0.718918 0.544396 0.467716 5.949609 2.899003 -11.856302 -3.302781 4.118015 14.060011 13.243450 12.098420 1.365057 0.576550 -10.517602 -0.812491 -20.235088 -8.308903 -1.432191 2.694305 1.032265 -2.027705 -20.890530 -19.676020 -10.206902 -19.505813 -8.221660 1.578911 -2.417798 0.252099 -0.090215 -22.395401 0.153439 0.025706 -0.000027 8.380961 -1.813564 32.556063 -15.719947 8.432044 -0.563023 3.935233 -7.976974 31.640896 0.058686 -0.044588 0.002016 -9.294617 -1.587472 11.429027 0.933291 -0.183553 -0.006198 -2.841699 6.061956 -26.117740 -9.623569 -1.082143 -5.282041 2.830460 6.660010 -25.736455 -0.020057 -0.115699 0.053686 -0.007873 0.000004 -0.000039 +0.682500 78.148000 -35.956600 -79.960977 0.380422 5.901102 -0.002180 -0.000181 0.005292 -3.688026 -1.351489 -9.918248 -10.545969 -1.935857 -0.110313 -4.168028 0.097852 5.774365 7.560205 -0.587905 -1.593882 -0.141793 0.456464 0.763579 2.181625 -3.743233 3.447458 -5.579759 0.550273 0.961289 -10.216144 -0.000006 -0.000008 0.000773 0.001395 -0.000217 0.000775 -0.001497 0.000268 -7.450084 9.548048 -0.350372 8.236681 -2.925620 -2.865725 10.613023 -1.192232 -0.522494 -6.050728 -0.498410 6.062306 -4.508624 -1.929122 -0.719000 0.544537 0.440003 5.953457 2.899495 -11.842315 -3.302479 4.133949 14.056173 13.251299 12.063744 1.360982 0.575317 -10.522918 -0.834581 -20.246098 -8.291623 -1.408046 2.694732 1.032120 -2.026672 -20.883616 -19.962008 -11.771210 -21.515285 -8.095776 0.422000 -4.889975 0.290120 -0.049676 -22.492986 0.112060 0.018776 -0.000008 8.412142 -1.830877 32.662648 -15.712879 8.432111 -0.564052 3.958597 -8.003384 31.750421 0.035146 -0.115671 0.024531 -9.295403 -1.610803 11.318665 0.912699 -0.179503 -0.006092 -2.822807 6.077316 -26.008279 -9.629745 -1.074413 -5.282162 2.860142 6.674552 -25.627346 -0.029817 -0.093336 0.069045 -0.007867 0.000004 -0.000041 +0.682500 78.148000 -35.956600 -79.960256 0.373461 5.901100 -0.002178 -0.000181 0.005292 -3.688031 -1.351490 -9.918254 -10.545939 -1.921950 -0.111819 -4.168034 0.097852 5.774368 7.560215 -0.587905 -1.593883 -0.148773 0.456371 0.763634 2.181638 -3.743235 3.447458 -5.579766 0.550272 0.961290 -10.216133 -0.000006 -0.000007 0.000773 0.001396 -0.000217 0.000776 -0.001500 0.000264 -7.435915 9.547643 -0.352606 8.243312 -2.930504 -2.859883 10.564471 -1.186577 -0.520615 -6.015937 -0.514596 6.050698 -4.513746 -1.914341 -0.719172 0.543304 0.437117 5.932722 2.899494 -11.842309 -3.302477 4.102395 14.036109 13.267797 12.126186 1.368320 0.577543 -10.534438 -0.822687 -20.233375 -8.305443 -1.410344 2.694393 1.031963 -2.025632 -20.876705 -20.244035 -12.937071 -23.058159 -8.006910 -0.647528 -7.019024 0.283305 -0.048107 -22.492976 0.112060 0.018776 -0.000010 8.406693 -1.835268 32.662446 -15.705807 8.432175 -0.565090 3.958585 -8.003382 31.750397 0.040953 -0.107981 0.022296 -9.294912 -1.603465 11.382736 0.926433 -0.182204 -0.006158 -2.821566 6.066875 -26.071262 -9.635922 -1.066682 -5.282269 2.871585 6.690542 -25.688481 -0.041527 -0.079902 0.057965 -0.007873 0.000004 -0.000041 +0.682500 78.148000 -35.956600 -79.959536 0.366506 5.901070 -0.002177 -0.000181 0.005293 -3.688029 -1.351489 -9.918250 -10.545955 -1.928906 -0.111067 -4.168035 0.097852 5.774370 7.560212 -0.587905 -1.593883 -0.134797 0.456557 0.763523 2.153644 -3.744892 3.445608 -5.558538 0.537231 0.939718 -10.216139 -0.000005 -0.000008 0.000777 0.001399 -0.000219 0.000775 -0.001494 0.000258 -7.442991 9.547843 -0.351482 8.277849 -2.937429 -2.852373 10.515890 -1.180917 -0.518735 -6.002110 -0.528610 6.052764 -4.518856 -1.899562 -0.719342 0.542068 0.434230 5.911975 2.899495 -11.842311 -3.302478 4.107986 14.042668 13.261399 12.070691 1.361800 0.575571 -10.522466 -0.832693 -20.232246 -8.301975 -1.388495 2.694477 1.032264 -2.027705 -20.890523 -20.450874 -13.692144 -24.054173 -7.975197 -1.567716 -8.715832 0.276490 -0.046528 -22.492974 0.112053 0.018775 -0.000012 8.401256 -1.839664 32.662224 -15.720092 8.446030 -0.562992 3.958588 -8.003386 31.750408 0.046747 -0.100295 0.020043 -9.330255 -1.595197 11.342137 0.967591 -0.190300 -0.006367 -2.830096 6.040036 -26.027920 -9.642103 -1.058954 -5.282388 2.862682 6.678106 -25.640930 -0.018306 -0.106980 0.058017 -0.007869 0.000004 -0.000038 +0.682500 78.148000 -35.956600 -79.958816 0.359549 5.915069 -0.002185 -0.000181 0.005292 -3.688370 -1.353428 -9.932116 -10.545940 -1.921951 -0.111819 -4.170141 0.118699 5.775517 7.560214 -0.587905 -1.593883 -0.120924 0.465598 0.774243 2.160652 -3.744476 3.446068 -5.537366 0.524179 0.918154 -10.216131 -0.000007 -0.000006 0.000775 0.001395 -0.000214 0.000777 -0.001498 0.000268 -7.450092 9.548055 -0.350365 8.311680 -2.955218 -2.853670 10.467348 -1.175263 -0.516850 -5.988272 -0.542621 6.054830 -4.523980 -1.884782 -0.719506 0.542480 0.435194 5.918893 2.913781 -11.842796 -3.299668 4.184583 14.042171 13.244706 11.931947 1.345508 0.570598 -10.464816 -0.832315 -20.233353 -8.298536 -1.366651 2.694559 1.032563 -2.029779 -20.904356 -20.564836 -14.052027 -24.569208 -7.966302 -2.351700 -10.024296 0.272701 -0.031776 -22.453274 0.112058 0.018777 -0.000010 8.412916 -1.831411 32.613733 -15.734352 8.459887 -0.560893 3.949819 -7.993490 31.709358 0.052549 -0.092608 0.017802 -9.330359 -1.573079 11.341900 0.981330 -0.193003 -0.006434 -2.820393 6.042194 -26.029130 -9.648265 -1.051224 -5.282499 2.865232 6.681659 -25.654530 -0.020941 -0.083928 0.057828 -0.007867 0.000003 -0.000039 +0.682500 78.148000 -35.956600 -79.958098 0.352593 5.915081 -0.002181 -0.000181 0.005291 -3.688707 -1.355366 -9.945975 -10.545923 -1.914994 -0.112573 -4.170139 0.118699 5.775517 7.560215 -0.587905 -1.593883 -0.128059 0.474356 0.785132 2.167035 -3.734181 3.436610 -5.537410 0.527687 0.927401 -10.216141 -0.000005 -0.000008 0.000772 0.001395 -0.000209 0.000775 -0.001498 0.000271 -7.435913 9.547636 -0.352598 8.317595 -2.970968 -2.856635 10.418786 -1.169615 -0.514954 -5.960456 -0.556792 6.057036 -4.529099 -1.870006 -0.719678 0.542067 0.434229 5.911984 2.928065 -11.843282 -3.296852 4.180173 14.031392 13.256265 11.931952 1.345509 0.570602 -10.466430 -0.839051 -20.232417 -8.291630 -1.365503 2.694726 1.032267 -2.027708 -20.890519 -20.584604 -14.123487 -24.646840 -7.961999 -2.963027 -10.935262 0.265891 -0.030205 -22.453275 0.112056 0.018777 -0.000012 8.432598 -1.833511 32.614700 -15.727194 8.452958 -0.561948 3.949826 -7.993486 31.709348 0.058353 -0.084922 0.015553 -9.344309 -1.570851 11.348247 0.995060 -0.195704 -0.006497 -2.829531 6.014829 -26.027679 -9.675306 -1.041159 -5.269012 2.863947 6.679889 -25.647739 -0.031056 -0.099833 0.071331 -0.007868 0.000003 -0.000041 +0.682500 78.148000 -35.956600 -79.957376 0.345634 5.915052 -0.002178 -0.000181 0.005291 -3.688370 -1.353428 -9.932116 -10.545933 -1.921949 -0.111820 -4.170143 0.118699 5.775514 7.560215 -0.587905 -1.593883 -0.128061 0.474356 0.785132 2.138490 -3.725951 3.424849 -5.516487 0.531534 0.936458 -10.188164 -0.000005 -0.000008 0.000776 0.001396 -0.000214 0.000776 -0.001495 0.000264 -7.435914 9.547638 -0.352599 8.338176 -2.976868 -2.849943 10.384088 -1.165572 -0.513603 -5.932427 -0.552123 6.042488 -4.522159 -1.870912 -0.719446 0.541657 0.433266 5.905068 2.920922 -11.843039 -3.298257 4.192578 14.040253 13.248636 11.890334 1.340624 0.569105 -10.454457 -0.849056 -20.231256 -8.298524 -1.366651 2.708552 1.032417 -2.028744 -20.897433 -20.443087 -13.680379 -24.058342 -7.953317 -3.336830 -11.248395 0.319090 -0.017273 -22.424664 0.112055 0.018777 -0.000011 8.387117 -1.888457 32.599096 -15.720075 8.446033 -0.562994 3.902003 -8.034957 31.702658 0.035154 -0.115669 0.024538 -9.358244 -1.568620 11.354574 1.022510 -0.201106 -0.006627 -2.827356 6.005172 -26.027788 -9.681475 -1.033428 -5.269120 2.862685 6.678106 -25.640931 -0.031059 -0.099832 0.071328 -0.007871 0.000004 -0.000041 +0.682500 78.148000 -35.956600 -79.956653 0.338675 5.915050 -0.002185 -0.000181 0.005290 -3.688540 -1.354398 -9.939049 -10.545926 -1.914995 -0.112573 -4.170142 0.118698 5.775516 7.560214 -0.587905 -1.593884 -0.128061 0.474356 0.785131 2.110797 -3.732548 3.427971 -5.509335 0.522400 0.939901 -10.160183 0.015719 -0.023152 0.000776 0.001397 -0.000221 0.000777 -0.001497 0.000273 -7.435913 9.547635 -0.352598 8.358768 -2.982769 -2.843249 10.349413 -1.161537 -0.512250 -5.918535 -0.561150 6.029735 -4.515219 -1.871823 -0.719227 0.541244 0.432302 5.898152 2.913781 -11.842800 -3.299662 4.207340 14.040659 13.251326 11.848718 1.335739 0.567605 -10.442466 -0.859066 -20.230119 -8.308881 -1.347103 2.722296 1.032567 -2.029780 -20.904337 -20.166864 -12.776303 -22.897494 -7.933222 -3.506408 -11.038052 0.321056 -0.008759 -22.442412 0.056855 0.009530 0.000004 8.431994 -1.843664 32.586802 -15.734287 8.452889 -0.560906 3.949830 -7.993486 31.709351 0.037661 -0.088394 0.015516 -9.358217 -1.566335 11.361192 1.036234 -0.203804 -0.006698 -2.835470 6.018580 -26.027023 -9.687649 -1.025701 -5.269232 2.865224 6.681658 -25.654520 -0.027302 -0.080358 0.064481 -0.007869 0.000003 -0.000040 +0.682500 78.148000 -35.956600 -79.955932 0.331716 5.915035 -0.002180 -0.000181 0.005292 -3.688705 -1.355367 -9.945979 -10.545909 -1.908041 -0.113325 -4.170139 0.118698 5.775516 7.560641 -0.573921 -1.593896 -0.106965 0.465788 0.774129 2.110781 -3.732552 3.427975 -5.509339 0.522399 0.939900 -10.160177 0.023582 -0.034718 0.000774 0.001398 -0.000224 0.000776 -0.001499 0.000262 -7.435911 9.547635 -0.352599 8.380099 -2.979920 -2.847407 10.300852 -1.155886 -0.510344 -5.904615 -0.567270 6.037774 -4.508281 -1.872731 -0.718999 0.540833 0.431343 5.891243 2.928560 -11.829309 -3.296548 4.222111 14.041051 13.254010 11.807094 1.330859 0.566104 -10.398414 -0.855409 -20.231370 -8.319230 -1.327555 2.715059 1.032267 -2.027706 -20.890519 -19.858852 -11.643478 -21.427289 -7.921454 -3.612725 -10.587530 0.318559 -0.019611 -22.453395 0.056865 0.009532 0.000006 8.432613 -1.833524 32.614724 -15.748499 8.459753 -0.558817 3.949828 -7.993484 31.709348 0.044561 -0.087237 0.015526 -9.357987 -1.554917 11.394252 1.049963 -0.206506 -0.006755 -2.826476 6.020113 -26.077090 -9.693819 -1.017973 -5.269339 2.872844 6.692324 -25.695279 -0.023562 -0.060879 0.057639 -0.007869 0.000003 -0.000039 +0.682500 78.148000 -35.956600 -79.955217 0.324759 5.915027 -0.002178 -0.000181 0.005291 -3.688879 -1.356334 -9.952907 -10.545893 -1.901088 -0.114078 -4.170139 0.118698 5.775517 7.547099 -0.559504 -1.594053 -0.085672 0.443934 0.746884 2.108470 -3.693032 3.408070 -5.453122 0.506406 0.908776 -10.202144 0.000001 -0.000002 0.000775 0.001397 -0.000214 0.000778 -0.001498 0.000263 -7.435913 9.547637 -0.352599 8.401424 -2.977072 -2.851566 10.252307 -1.150241 -0.508440 -5.876707 -0.573553 6.045938 -4.513408 -1.857952 -0.719168 0.540421 0.430381 5.884335 2.943339 -11.815805 -3.293439 4.236873 14.041436 13.256689 11.765472 1.325977 0.564589 -10.354365 -0.851759 -20.232654 -8.326131 -1.328704 2.707899 1.032262 -2.027704 -20.890523 -19.525814 -10.268265 -19.667636 -7.901987 -3.682050 -9.912093 0.318583 -0.019468 -22.431279 0.056865 0.009532 0.000005 8.447287 -1.840332 32.587468 -15.741482 8.466813 -0.559843 3.945452 -7.988534 31.688816 0.044564 -0.087236 0.015525 -9.357994 -1.554914 11.394255 1.049968 -0.206508 -0.006754 -2.828090 6.004561 -26.076696 -9.701555 -1.024146 -5.269481 2.874113 6.694107 -25.702089 -0.024811 -0.067374 0.059924 -0.007871 0.000003 -0.000041 +0.682500 78.148000 -35.956600 -79.954491 0.317803 5.915019 -0.002178 -0.000181 0.005291 -3.688537 -1.354397 -9.939044 -10.545886 -1.894134 -0.114832 -4.171544 0.132595 5.776283 7.532897 -0.566060 -1.594187 -0.064694 0.444207 0.746722 2.017488 -3.698407 3.421933 -5.334441 0.522609 0.875821 -10.202166 0.000001 -0.000003 0.000776 0.001399 -0.000210 0.000773 -0.001497 0.000266 -7.421734 9.547233 -0.354830 8.440817 -3.016048 -2.860203 10.182921 -1.142175 -0.505706 -5.848165 -0.524419 6.046368 -4.524883 -1.891719 -0.719538 0.541021 0.487725 5.890466 2.935956 -11.822549 -3.294990 4.257991 14.026666 13.244738 11.723858 1.321098 0.563085 -10.330718 -0.843198 -20.234258 -8.333031 -1.329854 2.721730 1.032271 -2.027706 -20.890521 -19.186461 -8.635727 -17.605349 -7.902729 -3.707912 -9.003771 0.305414 -0.014281 -22.446792 0.056870 0.009533 0.000002 8.452509 -1.835792 32.601671 -15.748480 8.459749 -0.558822 3.948364 -7.991832 31.702487 0.044552 -0.087238 0.015528 -9.357990 -1.554915 11.394250 1.049960 -0.206506 -0.006759 -2.841573 5.996504 -26.074976 -9.709271 -1.030320 -5.269619 2.875395 6.695876 -25.708878 -0.026053 -0.073868 0.062201 -0.007868 0.000003 -0.000040 +0.682500 78.148000 -35.956600 -79.953771 0.310845 5.915011 -0.002179 -0.000180 0.005292 -3.688542 -1.354396 -9.939043 -10.545897 -1.901089 -0.114079 -4.172955 0.146493 5.777053 7.518701 -0.572615 -1.594322 -0.064696 0.444208 0.746722 2.023913 -3.688103 3.402575 -5.313453 0.522931 0.875628 -10.202147 0.000001 -0.000003 0.000775 0.001400 -0.000227 0.000775 -0.001499 0.000280 -7.407560 9.546807 -0.357063 8.433445 -3.018849 -2.845369 10.175977 -1.141366 -0.505432 -5.834510 -0.554224 6.036511 -4.507368 -1.865796 -0.718964 0.540835 0.431339 5.891246 2.949990 -11.830017 -3.292335 4.272738 14.027052 13.247417 11.668361 1.314591 0.561061 -10.279866 -0.841184 -20.235457 -8.339931 -1.331006 2.735562 1.032265 -2.027706 -20.890526 -18.868017 -6.744147 -15.265661 -7.892519 -3.662918 -7.845963 0.293272 -0.004699 -22.449041 0.056860 0.009531 0.000010 8.441397 -1.844421 32.615250 -15.755503 8.452689 -0.557790 3.951285 -7.995135 31.716192 0.063074 -0.070703 0.011053 -9.357999 -1.554916 11.394249 1.049964 -0.206507 -0.006756 -2.847504 6.000260 -26.074312 -9.714681 -1.015640 -5.269715 2.871578 6.690554 -25.688507 -0.026051 -0.073865 0.062205 -0.007872 0.000003 -0.000040 +0.682500 78.148000 -35.956600 -79.953049 0.303888 5.915024 -0.002184 -0.000181 0.005290 -3.688541 -1.354397 -9.939043 -10.545905 -1.908043 -0.113325 -4.172250 0.139545 5.776669 7.518476 -0.579606 -1.594315 -0.064701 0.444208 0.746721 2.030359 -3.677800 3.383214 -5.292482 0.523251 0.875438 -10.202157 0.000003 -0.000003 0.000777 0.001397 -0.000226 0.000776 -0.001498 0.000268 -7.393379 9.546412 -0.359294 8.447426 -3.020931 -2.854347 10.134366 -1.136533 -0.503786 -5.820532 -0.554388 6.036651 -4.493488 -1.867613 -0.718513 0.540423 0.430380 5.884331 2.964405 -11.823304 -3.303386 4.287498 14.027443 13.250109 11.612871 1.308089 0.559037 -10.233888 -0.859374 -20.233814 -8.346842 -1.332160 2.728402 1.031816 -2.024597 -20.869798 -18.628234 -4.776686 -12.864161 -7.878526 -3.580565 -6.583859 0.294747 0.001757 -22.451295 0.056865 0.009531 0.000006 8.447061 -1.840183 32.601497 -15.762642 8.459615 -0.556741 3.949820 -7.993487 31.709348 0.067773 -0.056490 0.006539 -9.357989 -1.554917 11.394248 1.070557 -0.210558 -0.006852 -2.853436 6.004011 -26.073670 -9.706166 -1.002516 -5.269558 2.872849 6.692325 -25.695284 -0.042898 -0.050363 0.055502 -0.007868 0.000003 -0.000039 +0.682500 78.148000 -35.956600 -79.953771 0.310848 5.915031 -0.002181 -0.000180 0.005292 -3.702325 -1.351982 -9.939374 -10.545903 -1.901089 -0.114079 -4.171546 0.132595 5.776284 7.518915 -0.565623 -1.594329 -0.043721 0.444481 0.746559 1.946368 -3.682727 3.397557 -5.187827 0.542044 0.836194 -10.202143 0.000001 -0.000003 0.000778 0.001399 -0.000236 0.000777 -0.001502 0.000268 -7.379196 9.545996 -0.361525 8.461402 -3.023009 -2.863331 10.092737 -1.131694 -0.502138 -5.785554 -0.554794 6.036989 -4.500436 -1.866704 -0.704750 0.540007 0.429417 5.877421 2.978825 -11.816594 -3.314437 4.299914 14.036329 13.242489 11.557374 1.301585 0.556999 -10.184653 -0.864093 -20.234034 -8.353744 -1.333311 2.721251 1.031822 -2.024597 -20.869788 -18.456887 -2.721438 -10.388602 -7.861445 -3.449351 -5.209391 0.296233 0.008214 -22.453542 0.056862 0.009532 0.000008 8.452511 -1.835792 32.601698 -15.769776 8.466543 -0.555684 3.948370 -7.991833 31.702487 0.074672 -0.055334 0.006545 -9.358000 -1.554915 11.394258 1.077409 -0.211906 -0.006887 -2.859374 6.007770 -26.073023 -9.699991 -1.010246 -5.269460 2.874121 6.694105 -25.702086 -0.042898 -0.050363 0.055502 -0.007871 0.000003 -0.000039 +0.682500 78.135800 -35.956600 -79.954493 0.317807 5.915066 -0.002181 -0.000181 0.005292 -3.716109 -1.349565 -9.939684 -10.545891 -1.894135 -0.114833 -4.172253 0.139545 5.776665 7.491392 -0.550769 -1.594624 -0.022735 0.444753 0.746395 1.952803 -3.672428 3.378200 -5.159847 0.542451 0.835931 -10.202149 0.000000 -0.000003 0.000775 0.001399 -0.000226 0.000776 -0.001495 0.000264 -7.365019 9.545588 -0.363755 8.474261 -3.038211 -2.856025 10.051113 -1.126860 -0.500486 -5.750579 -0.555202 6.037323 -4.493496 -1.867614 -0.690539 0.539598 0.428454 5.870506 2.993413 -11.810200 -3.304474 4.312290 14.045190 13.234861 11.515743 1.296711 0.555469 -10.134972 -0.866925 -20.220391 -8.360642 -1.334463 2.742071 1.031816 -2.024597 -20.869800 -18.391393 -0.616465 -7.887996 -7.827451 -3.239357 -3.716921 0.349856 0.022886 -22.484703 0.015483 0.002602 0.000007 8.462907 -1.871346 32.644527 -15.776907 8.473464 -0.554631 3.960042 -8.005035 31.757245 0.035147 -0.115673 0.024530 -9.407312 -1.491074 11.385994 1.084280 -0.213257 -0.006912 -2.816745 5.931071 -26.077107 -9.714674 -1.015642 -5.269716 2.908975 6.635118 -25.693254 -0.018802 -0.109215 0.051409 -0.007868 0.000003 -0.000040 +0.682500 78.111400 -35.956600 -79.953050 0.303891 5.915043 -0.002184 -0.000181 0.005291 -3.702322 -1.351982 -9.939369 -10.545865 -1.887180 -0.115585 -4.172952 0.146494 5.777050 7.476971 -0.564317 -1.594751 -0.001754 0.445027 0.746233 1.938501 -3.668308 3.382225 -5.152865 0.542553 0.835865 -10.174183 0.011795 -0.017361 0.000778 0.001398 -0.000229 0.000779 -0.001500 0.000262 -7.364600 9.559576 -0.363619 8.487156 -3.053412 -2.848720 10.030302 -1.124443 -0.499656 -5.743593 -0.555284 6.037404 -4.486550 -1.868521 -0.697307 0.540426 0.430380 5.884333 2.986574 -11.803067 -3.298719 4.409750 14.069112 13.227844 11.328448 1.274787 0.548544 -10.031212 -0.854241 -20.209845 -8.367551 -1.335618 2.741913 1.031514 -2.022525 -20.855967 -18.421997 1.447836 -5.424000 -7.793854 -2.926185 -2.151474 0.349857 0.022892 -22.484696 0.015474 0.002600 0.000003 8.462910 -1.871344 32.644561 -15.784048 8.480388 -0.553584 3.960053 -8.005045 31.757286 0.047846 -0.106827 0.022292 -9.407799 -1.516205 11.313262 1.139181 -0.224060 -0.007153 -2.878746 5.963628 -25.993217 -9.727017 -1.000184 -5.269939 2.860105 6.674527 -25.627351 -0.018802 -0.109215 0.051407 -0.007868 0.000003 -0.000039 +0.682500 78.148000 -35.956600 -79.953048 0.303888 5.915037 -0.002182 -0.000181 0.005290 -3.702326 -1.351982 -9.939372 -10.545889 -1.894135 -0.114833 -4.173653 0.153442 5.777436 7.462982 -0.563880 -1.594891 0.019362 0.434472 0.754926 1.944076 -3.643203 3.367769 -5.104013 0.551871 0.816262 -10.202141 0.000002 -0.000004 0.000776 0.001398 -0.000217 0.000775 -0.001498 0.000268 -7.364188 9.573553 -0.363490 8.500767 -3.059864 -2.852263 10.009489 -1.122026 -0.498827 -5.722360 -0.534745 6.034684 -4.479615 -1.869424 -0.690085 0.540426 0.430381 5.884332 2.993851 -11.796114 -3.311179 4.384945 14.051374 13.243115 11.356208 1.278034 0.549581 -10.005837 -0.868453 -20.215396 -8.390550 -1.325278 2.741378 1.031222 -2.020454 -20.842145 -18.516843 3.407127 -3.039636 -7.718836 -2.567826 -0.551725 0.349856 0.022892 -22.484698 0.015472 0.002601 0.000005 8.462901 -1.871344 32.644524 -15.791182 8.487309 -0.552527 3.960045 -8.005040 31.757265 0.060552 -0.097981 0.020068 -9.407483 -1.500211 11.359546 1.146033 -0.225407 -0.007188 -2.883130 5.957196 -26.034581 -9.727015 -1.000185 -5.269935 2.867737 6.685191 -25.668128 -0.018811 -0.109213 0.051411 -0.007870 0.000003 -0.000039 +0.682500 78.148000 -35.944400 -79.953051 0.303891 5.915036 -0.002181 -0.000181 0.005292 -3.702323 -1.351982 -9.939369 -10.545902 -1.901087 -0.114079 -4.172950 0.146494 5.777050 7.449007 -0.563444 -1.595035 0.040524 0.423920 0.763621 1.944089 -3.643206 3.367771 -5.104010 0.551872 0.816264 -10.181178 0.015728 -0.023145 0.000773 0.001395 -0.000217 0.000775 -0.001501 0.000264 -7.364393 9.566559 -0.363556 8.514357 -3.066313 -2.855806 9.988686 -1.119610 -0.498001 -5.701141 -0.514212 6.031986 -4.488370 -1.882390 -0.683368 0.540421 0.430380 5.884336 3.000746 -11.803356 -3.309932 4.404131 14.062570 13.234250 11.300711 1.271544 0.547516 -9.946470 -0.890840 -20.220445 -8.413563 -1.314944 2.754836 1.030919 -2.018379 -20.828319 -18.693958 5.293366 -0.759723 -7.654227 -2.119718 1.032406 0.348847 0.018507 -22.497945 0.015483 0.002602 0.000004 8.473468 -1.862326 32.665919 -15.798195 8.480256 -0.551496 3.965896 -8.011629 31.784630 0.073246 -0.089138 0.017824 -9.407480 -1.500214 11.359538 1.152902 -0.226759 -0.007217 -2.886904 5.951299 -26.034099 -9.727018 -1.000182 -5.269939 2.869003 6.686971 -25.674925 -0.018809 -0.109214 0.051410 -0.007869 0.000003 -0.000039 +0.682500 78.148000 -35.932200 -79.953046 0.303886 5.915024 -0.002184 -0.000181 0.005291 -3.702325 -1.351982 -9.939372 -10.545911 -1.908043 -0.113326 -4.193122 0.137433 5.776719 7.435023 -0.563008 -1.595175 0.061338 0.435027 0.754611 2.038927 -3.583195 3.319448 -5.166960 0.550975 0.816870 -10.202150 0.000001 -0.000004 0.000776 0.001399 -0.000226 0.000777 -0.001501 0.000273 -7.364188 9.573553 -0.363490 8.507020 -3.071238 -2.860649 10.023373 -1.123639 -0.499382 -5.700861 -0.490525 6.049851 -4.497122 -1.895357 -0.676671 0.540422 0.430380 5.884333 3.007639 -11.810585 -3.308675 4.551932 14.100169 13.188382 11.092593 1.247213 0.539725 -9.854459 -0.867208 -20.204082 -8.412389 -1.321839 2.768853 0.977004 -2.005233 -20.840427 -18.913444 6.953148 1.265132 -7.584388 -1.559642 2.582759 0.394649 0.030319 -22.542356 -0.039717 -0.006643 0.000009 8.501283 -1.874834 32.709441 -15.826557 8.486974 -0.533324 3.976144 -8.023167 31.832564 0.035156 -0.115672 0.024534 -9.407487 -1.500213 11.359541 1.159776 -0.228112 -0.007246 -2.883130 5.957198 -26.034606 -9.727018 -1.000183 -5.269941 2.870280 6.688752 -25.681725 -0.018813 -0.109214 0.051411 -0.007871 0.000003 -0.000039 +0.682500 78.148000 -35.919900 -79.953051 0.303891 5.915036 -0.002181 -0.000181 0.005291 -3.674758 -1.356811 -9.938718 -10.566882 -1.894094 -0.115526 -4.214702 0.142271 5.777146 7.421040 -0.562573 -1.595318 0.110292 0.435671 0.754240 2.133785 -3.523268 3.290813 -5.250538 0.524899 0.821796 -10.202166 0.000000 -0.000005 0.000774 0.001398 -0.000224 0.000773 -0.001495 0.000263 -7.363982 9.580556 -0.363423 8.561468 -3.097065 -2.874805 9.953989 -1.115584 -0.496612 -5.658647 -0.469253 6.054229 -4.505876 -1.908327 -0.669967 0.540421 0.430381 5.884334 2.993107 -11.817102 -3.311636 4.511416 14.082889 13.211048 11.134238 1.252078 0.541287 -9.776302 -0.901218 -20.207866 -8.471073 -1.310405 2.781494 1.031213 -2.020460 -20.842157 -19.143012 8.339751 2.983338 -7.550239 -0.880242 4.061633 0.396712 0.039259 -22.493722 -0.039702 -0.006641 0.000009 8.496503 -1.879682 32.667244 -15.840763 8.493821 -0.517237 3.967356 -8.013276 31.791460 0.061645 -0.104510 0.022324 -9.407480 -1.500214 11.359537 1.166636 -0.229462 -0.007267 -2.879361 5.963104 -26.035126 -9.747874 -0.997852 -5.270300 2.871537 6.690523 -25.688499 -0.018809 -0.109213 0.051410 -0.007869 0.000003 -0.000039 +0.682500 78.148000 -35.907700 -79.950897 0.283020 5.873077 -0.002182 -0.000181 0.005291 -3.647189 -1.361640 -9.938063 -10.587873 -1.891792 -0.095354 -4.236284 0.147106 5.777577 7.421040 -0.562590 -1.609305 0.159264 0.436316 0.753868 2.214659 -3.464178 3.261218 -5.334114 0.498818 0.826686 -10.202150 0.000000 -0.000002 0.000775 0.001398 -0.000212 0.000775 -0.001501 0.000278 -7.392129 9.588343 -0.358880 8.593484 -3.138851 -2.868538 9.947052 -1.114777 -0.496340 -5.637662 -0.468522 6.061326 -4.511902 -1.900489 -0.663175 0.540423 0.430383 5.884335 2.921441 -11.821646 -3.325814 4.647557 14.125698 13.201367 11.085669 1.246404 0.539465 -9.759357 -0.920532 -20.212589 -8.509045 -1.295499 2.773635 1.030918 -2.018386 -20.828327 -19.366086 9.459811 4.386398 -7.554845 -0.107398 5.443749 0.450408 0.054199 -22.480681 -0.101800 -0.017040 -0.000008 8.520244 -1.886984 32.689487 -15.854983 8.500677 -0.529126 3.974670 -8.021515 31.825683 0.036254 -0.122201 0.026790 -9.407198 -1.484225 11.405829 1.173489 -0.230809 -0.007300 -2.875589 5.969001 -26.035636 -9.757933 -1.024877 -5.270480 2.872813 6.692301 -25.695301 -0.018806 -0.109214 0.051408 -0.007868 0.000003 -0.000039 +0.682500 78.148000 -35.895500 -79.934837 0.263570 5.830986 -0.002180 -0.000181 0.005292 -3.639280 -1.357032 -9.896323 -10.608862 -1.889501 -0.075186 -4.257864 0.151943 5.778013 7.421045 -0.562608 -1.623295 0.278026 0.448698 0.744098 2.225655 -3.409046 3.227309 -5.445483 0.460817 0.857277 -10.202152 0.000000 -0.000004 0.000774 0.001398 -0.000215 0.000773 -0.001497 0.000271 -7.420276 9.596162 -0.354324 8.751270 -3.191961 -2.873895 9.745885 -1.091444 -0.488262 -5.574236 -0.426698 6.062941 -4.509463 -1.936071 -0.656098 0.513581 0.468019 5.902125 2.870446 -11.847892 -3.336261 4.744841 14.128680 13.196034 11.037110 1.240730 0.537630 -9.742410 -0.939850 -20.217293 -8.526319 -1.277120 2.787233 0.980130 -2.020388 -20.837995 -19.557186 10.327328 5.477668 -7.608155 0.754228 6.745679 0.446593 0.068820 -22.463073 -0.108700 -0.018197 -0.000011 8.530794 -1.877958 32.710876 -15.883052 8.479390 -0.524979 3.981988 -8.029757 31.859933 0.075435 -0.102195 0.022351 -9.406642 -1.452242 11.498398 1.180355 -0.232161 -0.007327 -2.883850 5.956587 -26.083490 -9.767994 -1.051905 -5.270650 2.874675 6.660290 -25.733180 -0.022241 -0.124833 0.005126 -0.007871 0.000004 -0.000041 +0.682500 78.148000 -35.871100 -79.920924 0.264984 5.768008 -0.002182 -0.000181 0.005289 -3.603807 -1.357216 -9.853933 -10.629848 -1.887218 -0.055012 -4.279444 0.156780 5.778455 7.449447 -0.549511 -1.623029 0.305848 0.459889 0.735024 2.313653 -3.349658 3.168301 -5.556824 0.422757 0.887790 -10.202150 0.000001 -0.000003 0.000777 0.001399 -0.000229 0.000777 -0.001498 0.000263 -7.469725 9.604602 -0.346405 8.707519 -3.213940 -2.878974 9.884631 -1.107534 -0.493838 -5.595207 -0.425495 6.069712 -4.541465 -1.910755 -0.650172 0.541670 0.433272 5.905070 2.740280 -11.892684 -3.341686 4.833651 14.151881 13.210201 11.196656 1.259374 0.543636 -9.826143 -0.988813 -20.244614 -8.564290 -1.262220 2.786394 1.031215 -2.020465 -20.842134 -19.651445 10.748839 6.003068 -7.725994 1.755278 7.870142 0.545177 0.091861 -22.419269 -0.212163 -0.035525 -0.000060 8.567759 -1.901542 32.733955 -15.911337 8.479113 -0.520806 3.989321 -8.037989 31.894166 0.044237 -0.127576 0.029050 -9.406940 -1.470522 11.445499 1.187211 -0.233509 -0.007363 -2.867038 5.981700 -25.966866 -9.778064 -1.078929 -5.284831 2.861354 6.676312 -25.634170 -0.022103 -0.126450 0.064863 -0.007868 0.000003 -0.000039 +0.682500 78.148000 -35.834500 -79.907004 0.266379 5.705006 -0.002181 -0.000181 0.005292 -3.564779 -1.336906 -9.814413 -10.650830 -1.871029 -0.036343 -4.299626 0.147717 5.778128 7.477856 -0.536415 -1.622769 0.417633 0.472145 0.725263 2.296440 -3.291120 3.127779 -5.626507 0.404425 0.926561 -10.202172 0.000002 -0.000004 0.000774 0.001397 -0.000217 0.000772 -0.001496 0.000258 -7.519751 9.592036 -0.338673 8.940726 -3.292324 -2.877045 9.586335 -1.072955 -0.481797 -5.476056 -0.405056 6.074593 -4.556238 -1.915893 -0.643672 0.541668 0.433273 5.905063 2.652954 -11.938967 -3.338724 4.910550 14.147933 13.208567 11.224394 1.262619 0.544669 -9.856595 -0.995732 -20.243211 -8.581564 -1.243843 2.786021 1.031361 -2.021499 -20.849050 -19.701336 10.933544 6.229363 -7.871810 2.817481 8.871784 0.608201 0.116483 -22.351055 -0.281152 -0.047078 -0.000109 8.552802 -1.905141 32.712255 -15.918048 8.444072 -0.519822 3.987853 -8.036337 31.887308 0.045340 -0.134105 0.031312 -9.406338 -1.433965 11.551283 1.194071 -0.234858 -0.007388 -2.864091 5.986896 -26.023221 -9.788143 -1.105953 -5.299017 2.833225 6.674755 -25.688150 -0.027274 -0.150794 0.014243 -0.007874 0.000004 -0.000040 +0.682500 78.148000 -35.816200 -79.891007 0.246880 5.641914 -0.002182 -0.000180 0.005292 -3.529303 -1.337039 -9.772034 -10.671816 -1.854850 -0.017668 -4.319869 0.139420 5.763822 7.505825 -0.537321 -1.636487 0.417506 0.482974 0.716409 2.370228 -3.227697 3.092506 -5.667961 0.373756 0.959370 -10.202140 0.000001 -0.000003 0.000774 0.001398 -0.000220 0.000774 -0.001499 0.000268 -7.569676 9.579672 -0.344967 8.965372 -3.339033 -2.875544 9.627955 -1.077773 -0.483490 -5.489811 -0.383155 6.078511 -4.571024 -1.921032 -0.637174 0.541665 0.433273 5.905066 2.595347 -11.951057 -3.343374 4.947155 14.147613 13.227840 11.217454 1.261802 0.544402 -9.780452 -1.067941 -20.262743 -8.666722 -1.201402 2.784199 1.031522 -2.022538 -20.855959 -19.701337 10.933541 6.229363 -8.078850 3.923520 9.805766 0.670152 0.136461 -22.340365 -0.350140 -0.058632 -0.000171 8.631687 -1.902957 32.772064 -15.988988 8.464324 -0.509393 4.002522 -8.052791 31.955798 0.046438 -0.140633 0.033570 -9.385025 -1.413235 11.611141 1.187215 -0.233509 -0.007360 -2.860217 5.992889 -26.016751 -9.798215 -1.132974 -5.299213 2.809535 6.678487 -25.696229 -0.029006 -0.159520 0.009915 -0.007868 0.000003 -0.000040 +0.682500 78.148000 -35.785700 -79.888958 0.225999 5.579001 -0.002181 -0.000181 0.005292 -3.507621 -1.334777 -9.729978 -10.713782 -1.836423 0.021201 -4.342227 0.151973 5.750673 7.554779 -0.538909 -1.650006 0.508272 0.494933 0.706782 2.263713 -3.203629 3.076595 -5.619010 0.374575 0.959050 -10.202154 0.000001 -0.000003 0.000773 0.001398 -0.000222 0.000776 -0.001499 0.000257 -7.640449 9.581907 -0.347768 8.990061 -3.385750 -2.874021 9.669579 -1.082596 -0.485177 -5.482798 -0.382262 6.085488 -4.602126 -1.888792 -0.631218 0.541667 0.433271 5.905064 2.537742 -11.963172 -3.348038 5.030858 14.145984 13.224952 11.120339 1.250453 0.540767 -9.695523 -1.103675 -20.266162 -8.721988 -1.168134 2.804046 1.031667 -2.023574 -20.862883 -19.701349 10.933544 6.229364 -8.290981 4.959823 10.609840 0.735095 0.169671 -22.289976 -0.446721 -0.074807 -0.000282 8.626364 -1.907435 32.764858 -15.988665 8.436339 -0.509438 4.006921 -8.057723 31.976316 0.048270 -0.151612 0.022584 -9.363424 -1.418933 11.680147 1.118587 -0.220008 -0.007061 -2.790582 6.023638 -26.018453 -9.810640 -1.180847 -5.299463 2.872802 6.692283 -25.695310 -0.026342 -0.148157 0.065095 -0.007870 0.000003 -0.000040 +0.682500 78.148000 -35.761200 -79.888957 0.225997 5.516026 -0.002179 -0.000181 0.005293 -3.485928 -1.332501 -9.687923 -10.741804 -1.834176 0.041169 -4.364470 0.163387 5.758481 7.604161 -0.526523 -1.663538 0.480167 0.505420 0.698174 2.351334 -3.134590 3.007360 -5.639170 0.326377 1.014344 -10.202149 0.000000 -0.000002 0.000775 0.001397 -0.000209 0.000778 -0.001502 0.000262 -7.697173 9.583538 -0.338803 9.224379 -3.447776 -2.858193 9.336584 -1.044051 -0.471575 -5.349940 -0.385649 6.072535 -4.622947 -1.886099 -0.624906 0.541665 0.433272 5.905064 2.493654 -11.996736 -3.350342 5.189288 14.169817 13.208327 10.905303 1.225343 0.532641 -9.596897 -1.082702 -20.256231 -8.736946 -1.163558 2.803738 1.013424 -1.980970 -20.856136 -19.688705 10.817935 6.038820 -8.488994 5.990406 11.427782 0.794154 0.177123 -22.230536 -0.543299 -0.090983 -0.000420 8.705209 -1.915742 32.761856 -16.059615 8.456586 -0.499023 4.008385 -8.059368 31.983167 0.050119 -0.162590 0.011605 -9.342139 -1.409333 11.729065 1.118588 -0.220007 -0.007062 -2.788882 6.039280 -26.011879 -9.821474 -1.214825 -5.299682 2.843467 6.700206 -25.702656 -0.027585 -0.154651 0.067378 -0.007872 0.000003 -0.000041 +0.682500 78.148000 -35.742900 -79.875031 0.227339 5.474011 -0.002190 -0.000181 0.005289 -3.461930 -1.316554 -9.647790 -10.769787 -1.831943 0.061137 -4.386779 0.175563 5.752315 7.632590 -0.513468 -1.677279 0.424390 0.491465 0.682410 2.371048 -3.108798 2.993629 -5.569310 0.331129 1.023191 -10.202170 0.000001 -0.000003 0.000775 0.001399 -0.000219 0.000775 -0.001498 0.000269 -7.733237 9.563570 -0.333410 9.165188 -3.488364 -2.862413 9.475336 -1.060105 -0.477268 -5.398880 -0.384144 6.079125 -4.641962 -1.869530 -0.618536 0.541666 0.433271 5.905064 2.450191 -12.016534 -3.338344 5.184645 14.138095 13.221662 10.933051 1.228582 0.533694 -9.600533 -1.127569 -20.271257 -8.771495 -1.126814 2.803046 1.036460 -2.030999 -20.854420 -19.580394 10.388955 5.462391 -8.691715 6.977782 12.031003 0.855543 0.195034 -22.226530 -0.605385 -0.101380 -0.000528 8.700017 -1.909782 32.810477 -16.052220 8.428682 -0.500103 4.020141 -8.072509 32.037945 0.050819 -0.166899 0.020478 -9.356281 -1.393978 11.730874 1.084272 -0.213256 -0.006914 -2.743507 6.044707 -25.975401 -9.832350 -1.248793 -5.313906 2.867726 6.685174 -25.668126 -0.015105 -0.163824 0.069581 -0.007872 0.000003 -0.000039 +0.682500 78.148000 -35.718500 -79.859112 0.207776 5.431984 -0.002188 -0.000181 0.005290 -3.438584 -1.304475 -9.635373 -10.776807 -1.808828 0.079517 -4.386120 0.168993 5.744954 7.660554 -0.514402 -1.691010 0.445372 0.491716 0.682232 2.256856 -3.070050 2.952825 -5.450277 0.325311 1.057273 -10.202146 0.000000 -0.000002 0.000775 0.001399 -0.000219 0.000776 -0.001498 0.000259 -7.769295 9.543600 -0.328022 9.329653 -3.545263 -2.851059 9.232527 -1.032022 -0.467277 -5.335622 -0.356152 6.082587 -4.635923 -1.877366 -0.611341 0.499650 0.461145 5.904016 2.435312 -12.037304 -3.320645 5.227588 14.122601 13.226287 10.870627 1.221295 0.531324 -9.564902 -1.129044 -20.271542 -8.802587 -1.110771 2.823423 1.036606 -2.032032 -20.861317 -19.446872 9.777256 4.665643 -8.901431 7.949620 12.525519 0.860044 0.214967 -22.144824 -0.626080 -0.104845 -0.000566 8.769590 -1.917399 32.772026 -16.109040 8.449058 -0.491768 4.012789 -8.064295 32.003702 0.103449 -0.142350 0.022733 -9.320702 -1.372533 11.835191 1.091137 -0.214607 -0.006945 -2.756311 6.051411 -26.036917 -9.840877 -1.261911 -5.328088 2.832460 6.686084 -25.736696 -0.033531 -0.183247 0.025650 -0.007874 0.000004 -0.000040 +0.694700 78.129700 -35.700200 -79.853728 0.201734 5.418039 -0.002180 -0.000181 0.005292 -3.449321 -1.303732 -9.610220 -10.777769 -1.798431 0.086276 -4.401708 0.176056 5.732241 7.657714 -0.508376 -1.678542 0.391405 0.484123 0.652262 2.279715 -3.045080 2.950164 -5.375120 0.329066 1.061855 -10.194140 -0.000011 -0.000013 0.000776 0.001397 -0.000222 0.000778 -0.001499 0.000268 -7.750055 9.536670 -0.344985 9.295419 -3.545155 -2.842141 9.281397 -1.035670 -0.469972 -5.336899 -0.366236 6.072592 -4.660022 -1.855539 -0.614280 0.540545 0.433268 5.898595 2.446784 -12.037773 -3.344992 5.226782 14.102596 13.240561 10.854287 1.219390 0.530697 -9.551700 -1.117153 -20.267406 -8.806848 -1.105845 2.824469 1.033765 -2.027477 -20.852366 -19.288746 8.981045 3.637520 -9.068977 8.898557 12.890774 0.951419 0.223321 -22.189983 -0.735110 -0.123105 -0.000786 8.820313 -1.922796 32.843842 -16.146347 8.463638 -0.493287 4.019353 -8.073066 32.080125 0.053307 -0.168136 0.014725 -9.320388 -1.376400 11.797320 1.045023 -0.205535 -0.006734 -2.697477 6.054632 -25.965316 -9.853882 -1.279995 -5.331539 2.869108 6.690210 -25.684438 -0.017206 -0.165948 0.066211 -0.007871 0.000003 -0.000040 +0.694700 78.129700 -35.700200 -79.853730 0.201734 5.418039 -0.002179 -0.000181 0.005292 -3.448998 -1.301794 -9.596373 -10.791758 -1.798455 0.085838 -4.380947 0.179288 5.711233 7.706652 -0.510033 -1.713067 0.279624 0.472011 0.662048 2.209290 -3.038736 2.936496 -5.221733 0.357440 1.072421 -10.194147 -0.000012 -0.000012 0.000774 0.001397 -0.000220 0.000775 -0.001500 0.000264 -7.785492 9.537683 -0.339409 9.343255 -3.561828 -2.822423 9.218962 -1.028455 -0.467386 -5.322902 -0.366389 6.072682 -4.660022 -1.855539 -0.614283 0.540543 0.433270 5.898597 2.425079 -12.051429 -3.321564 5.271094 14.103787 13.248584 10.771030 1.209675 0.527517 -9.524797 -1.095141 -20.270770 -8.806862 -1.105847 2.824473 1.033765 -2.027478 -20.852366 -19.102168 8.007928 2.417126 -9.212008 9.789832 13.109631 0.952415 0.227730 -22.176738 -0.748917 -0.125417 -0.000812 8.820307 -1.922800 32.843812 -16.146364 8.463647 -0.493287 4.019348 -8.073060 32.080094 0.087788 -0.162352 0.014814 -9.320384 -1.376401 11.797317 1.045019 -0.205534 -0.006736 -2.697479 6.054630 -25.965295 -9.867795 -1.278423 -5.331848 2.869101 6.690215 -25.684443 -0.017212 -0.165947 0.066207 -0.007872 0.000003 -0.000040 +0.694700 78.129700 -35.700200 -79.853730 0.201734 5.418039 -0.002178 -0.000181 0.005292 -3.449162 -1.302763 -9.603295 -10.784800 -1.784538 0.084547 -4.360176 0.182513 5.690215 7.713655 -0.510285 -1.726995 0.188824 0.460123 0.671639 2.159029 -3.016517 2.938776 -5.103327 0.385184 1.083138 -10.194147 -0.000012 -0.000013 0.000778 0.001402 -0.000229 0.000775 -0.001501 0.000273 -7.757750 9.515907 -0.344064 9.370115 -3.576968 -2.804175 9.135703 -1.018838 -0.463928 -5.308926 -0.366544 6.072775 -4.660024 -1.855540 -0.614286 0.540541 0.433267 5.898599 2.446518 -12.052162 -3.317267 5.197579 14.074050 13.267378 10.833483 1.216963 0.529898 -9.551396 -1.056237 -20.247423 -8.804533 -1.119641 2.824519 1.033320 -2.024369 -20.831638 -18.935187 6.940624 1.081580 -9.286508 10.535847 13.129014 0.950495 0.219207 -22.158985 -0.762708 -0.127726 -0.000844 8.855026 -1.931816 32.796676 -16.160489 8.463488 -0.491214 4.013469 -8.066500 32.052725 0.101590 -0.160038 0.014860 -9.320287 -1.367255 11.823769 1.045026 -0.205535 -0.006737 -2.698193 6.054015 -26.014186 -9.881700 -1.276853 -5.332160 2.878001 6.702649 -25.732003 0.003397 -0.169973 0.066092 -0.007871 0.000003 -0.000040 +0.694700 78.129700 -35.700200 -79.853729 0.201734 5.467025 -0.002176 -0.000181 0.005292 -3.470021 -1.300231 -9.610693 -10.777817 -1.770622 0.083256 -4.353324 0.184348 5.669245 7.720647 -0.510537 -1.740917 0.097992 0.450212 0.661529 2.165288 -3.001358 2.953959 -5.075736 0.405486 1.107187 -10.194152 -0.000011 -0.000012 0.000775 0.001397 -0.000220 0.000777 -0.001497 0.000266 -7.729609 9.508099 -0.348580 9.301654 -3.551261 -2.801309 9.198149 -1.026050 -0.466522 -5.371715 -0.351995 6.070438 -4.632256 -1.859122 -0.613382 0.540544 0.433270 5.898596 2.467963 -12.052891 -3.312970 5.239496 14.083734 13.265114 10.722486 1.204017 0.525653 -9.530416 -1.028803 -20.223248 -8.767717 -1.127620 2.825239 1.032867 -2.021261 -20.810885 -18.793663 5.832129 -0.279364 -9.325209 11.193941 13.032792 0.934340 0.211139 -22.214150 -0.776503 -0.130036 -0.000867 8.875406 -1.923794 32.818601 -16.174882 8.484335 -0.489082 4.017875 -8.071428 32.073281 0.113193 -0.144664 0.010377 -9.320534 -1.387816 11.764272 1.045028 -0.205536 -0.006733 -2.697994 6.054189 -26.000203 -9.871602 -1.249836 -5.331936 2.875462 6.699096 -25.718422 0.027751 -0.154526 0.059135 -0.007873 0.000003 -0.000039 +0.694700 78.129700 -35.700200 -79.874612 0.199731 5.516103 -0.002185 -0.000181 0.005293 -3.493853 -1.315226 -9.643908 -10.770810 -1.773625 0.055656 -4.347745 0.198937 5.669992 7.706680 -0.510083 -1.755037 0.007171 0.440318 0.651403 2.026898 -3.038146 2.966342 -4.908549 0.442836 1.098301 -10.194144 -0.000011 -0.000014 0.000775 0.001398 -0.000224 0.000775 -0.001499 0.000262 -7.701586 9.500108 -0.339081 9.351994 -3.534098 -2.790054 9.080217 -1.012430 -0.461615 -5.364571 -0.338218 6.068546 -4.608078 -1.890455 -0.612591 0.540544 0.433268 5.898599 2.504445 -12.033128 -3.305354 5.145633 14.047020 13.287599 10.826547 1.216156 0.529643 -9.585145 -0.987144 -20.228080 -8.746942 -1.166677 2.825659 1.032716 -2.020225 -20.803995 -18.658595 4.688011 -1.663850 -9.304745 11.763244 12.811423 0.978086 0.182598 -22.289376 -0.831690 -0.139279 -0.001001 8.904595 -1.926619 32.841045 -16.189270 8.505154 -0.472977 4.022291 -8.076352 32.093823 0.051108 -0.155073 0.010215 -9.279091 -1.388100 11.698577 1.058744 -0.208233 -0.006804 -2.761961 6.045144 -25.978452 -9.875426 -1.221251 -5.318034 2.836681 6.705883 -25.704647 -0.026955 -0.143594 0.081564 -0.007871 0.000003 -0.000041 +0.694700 78.129700 -35.712400 -79.881575 0.199045 5.592981 -0.002179 -0.000181 0.005293 -3.517701 -1.330206 -9.677118 -10.742825 -1.776619 0.028704 -4.321282 0.215602 5.670662 7.692694 -0.509623 -1.769153 -0.062775 0.439523 0.651939 2.012391 -3.028991 2.975464 -4.936963 0.464932 1.116388 -10.194151 -0.000011 -0.000013 0.000772 0.001397 -0.000221 0.000770 -0.001496 0.000261 -7.659384 9.491703 -0.331798 9.200371 -3.491530 -2.784160 9.267510 -1.034065 -0.469397 -5.469491 -0.337056 6.067928 -4.581210 -1.900974 -0.597714 0.540546 0.433268 5.898598 2.540811 -12.013171 -3.311764 5.178581 14.083774 13.274474 10.701676 1.201593 0.524863 -9.571506 -0.930435 -20.214809 -8.705463 -1.202241 2.826515 1.032567 -2.019190 -20.797088 -18.552269 3.532020 -3.087466 -9.224670 12.150491 12.373503 0.966832 0.164638 -22.304693 -0.817900 -0.136969 -0.000966 8.889193 -1.940446 32.784457 -16.168270 8.526371 -0.462093 4.009060 -8.061575 32.032190 0.051110 -0.155075 0.010214 -9.272246 -1.399451 11.665627 1.072463 -0.210933 -0.006866 -2.767826 6.023235 -26.012431 -9.879245 -1.192664 -5.304120 2.847403 6.708804 -25.732569 -0.027711 -0.147856 0.090464 -0.007875 0.000003 -0.000041 +0.694700 78.141900 -35.736800 -79.888538 0.198362 5.669960 -0.002180 -0.000181 0.005293 -3.538709 -1.328565 -9.740906 -10.714835 -1.779626 0.001755 -4.292863 0.212552 5.649225 7.678719 -0.509161 -1.783269 -0.223678 0.440108 0.678273 1.931221 -3.087659 2.995764 -4.853811 0.506413 1.095276 -10.194138 -0.000011 -0.000015 0.000775 0.001397 -0.000215 0.000774 -0.001498 0.000256 -7.616580 9.497573 -0.345393 9.209490 -3.460482 -2.767043 9.184281 -1.024450 -0.465947 -5.469481 -0.337056 6.067920 -4.568223 -1.909698 -0.583294 0.540545 0.433268 5.898599 2.591474 -11.993702 -3.315323 5.055376 14.067140 13.289822 10.826546 1.216152 0.529642 -9.650849 -0.901276 -20.196294 -8.666311 -1.224012 2.827343 1.032416 -2.018154 -20.790174 -18.488446 2.376467 -4.487048 -9.064610 12.289113 11.665518 0.951961 0.130883 -22.432698 -0.804097 -0.134658 -0.000934 8.904938 -1.926847 32.820087 -16.168504 8.547351 -0.469049 4.016404 -8.069795 32.066444 0.048176 -0.137565 0.018951 -9.265880 -1.406974 11.579548 1.065614 -0.209586 -0.006830 -2.773292 6.001685 -26.018513 -9.880725 -1.143228 -5.304151 2.853043 6.704606 -25.733272 -0.023490 -0.126144 0.090234 -0.007869 0.000003 -0.000041 +0.694700 78.148000 -35.742900 -79.896890 0.211584 5.774943 -0.002184 -0.000180 0.005290 -3.559724 -1.326900 -9.804698 -10.686841 -1.782647 -0.025196 -4.264330 0.208356 5.648737 7.664732 -0.508671 -1.776403 -0.251471 0.424518 0.681921 1.875249 -3.090560 3.002605 -4.980069 0.523745 1.120649 -10.194137 -0.000012 -0.000012 0.000773 0.001396 -0.000212 0.000774 -0.001499 0.000269 -7.573784 9.503444 -0.358991 9.156751 -3.411814 -2.770517 9.205076 -1.026855 -0.466810 -5.511605 -0.350444 6.069610 -4.555229 -1.918422 -0.596851 0.540548 0.433269 5.898597 2.642120 -11.974228 -3.318913 5.095079 14.106221 13.275454 10.694739 1.200784 0.524594 -9.650845 -0.841298 -20.183241 -8.627158 -1.245781 2.828187 1.032259 -2.017117 -20.783260 -18.448727 1.262505 -5.848739 -8.867582 12.253288 10.798392 0.917135 0.104331 -22.509822 -0.790302 -0.132347 -0.000910 8.899393 -1.931181 32.826839 -16.140470 8.568646 -0.480222 4.013464 -8.066501 32.052722 0.045239 -0.120058 0.027668 -9.259538 -1.414500 11.493470 1.058733 -0.208232 -0.006801 -2.796577 5.991381 -26.022618 -9.882194 -1.093793 -5.304179 2.866740 6.711026 -25.730588 -0.019250 -0.104438 0.089992 -0.007871 0.000003 -0.000039 +0.694700 78.148000 -35.761200 -79.905270 0.224792 5.879871 -0.002188 -0.000181 0.005291 -3.584289 -1.345683 -9.865630 -10.658882 -1.808809 -0.070736 -4.251783 0.223633 5.649457 7.650275 -0.522163 -1.769525 -0.363307 0.418766 0.677327 1.758627 -3.141259 3.050559 -5.002254 0.585201 1.102694 -10.194149 -0.000010 -0.000012 0.000773 0.001398 -0.000226 0.000774 -0.001497 0.000275 -7.509905 9.508393 -0.354914 9.105101 -3.346855 -2.760710 9.225899 -1.029259 -0.467671 -5.553721 -0.363833 6.071283 -4.514489 -1.930729 -0.609472 0.540547 0.433269 5.898600 2.692895 -11.954966 -3.308506 4.958274 14.084963 13.293344 10.826540 1.216153 0.529638 -9.739276 -0.820101 -20.184510 -8.588024 -1.267559 2.808059 1.032111 -2.016080 -20.776336 -18.433408 0.162113 -7.160971 -8.645373 12.075033 9.799472 0.882284 0.077836 -22.586978 -0.790295 -0.132347 -0.000904 8.935143 -1.930367 32.779652 -16.147940 8.603536 -0.458128 4.006123 -8.058294 32.018516 0.043043 -0.106999 0.023150 -9.253298 -1.428898 11.387543 1.072474 -0.210935 -0.006860 -2.819856 5.981080 -26.026723 -9.883669 -1.044357 -5.290218 2.902967 6.700665 -25.730733 -0.018752 -0.102208 0.096604 -0.007872 0.000003 -0.000040 +0.694700 78.141900 -35.779600 -79.913673 0.237982 5.984814 -0.002181 -0.000181 0.005291 -3.609373 -1.367344 -9.947360 -10.644905 -1.821060 -0.118220 -4.237866 0.225011 5.649403 7.635808 -0.535657 -1.762650 -0.349437 0.427785 0.688055 1.606268 -3.179053 3.081602 -5.142775 0.616635 1.096516 -10.194147 -0.000012 -0.000014 0.000772 0.001396 -0.000220 0.000775 -0.001503 0.000271 -7.446443 9.499355 -0.350973 9.053440 -3.281898 -2.750840 9.246714 -1.031665 -0.468537 -5.595844 -0.377223 6.072948 -4.473738 -1.943037 -0.601095 0.540541 0.433270 5.898601 2.830368 -11.910617 -3.280507 4.916514 14.096182 13.293859 10.625350 1.192696 0.521914 -9.632184 -0.763414 -20.166011 -8.546551 -1.303137 2.808995 1.031969 -2.015046 -20.769437 -18.444960 -0.854006 -8.376292 -8.390536 11.673574 8.636481 0.842877 0.032032 -22.657373 -0.790307 -0.132347 -0.000905 8.960005 -1.938394 32.731988 -16.141260 8.638591 -0.452133 4.007667 -8.060026 31.981128 0.040856 -0.093938 0.018640 -9.282192 -1.465782 11.259151 1.196012 -0.235241 -0.007393 -2.948942 6.013444 -25.983783 -9.846583 -1.027399 -5.275565 2.870374 6.691977 -25.691266 -0.017245 -0.093684 0.078819 -0.007870 0.000003 -0.000040 +0.682500 78.154100 -35.797900 -79.919892 0.230291 6.089760 -0.002181 -0.000181 0.005290 -3.644670 -1.366078 -10.032281 -10.630938 -1.831059 -0.144836 -4.209948 0.227007 5.663269 7.621827 -0.535173 -1.755789 -0.426332 0.424872 0.708311 1.559662 -3.226135 3.103662 -5.318278 0.647417 1.090800 -10.194139 -0.000011 -0.000014 0.000774 0.001397 -0.000222 0.000775 -0.001501 0.000266 -7.404048 9.491230 -0.364706 8.987777 -3.215963 -2.741829 9.267514 -1.034068 -0.469394 -5.638227 -0.414296 6.056723 -4.453805 -1.952657 -0.593424 0.539308 0.430379 5.877861 2.939009 -11.864872 -3.286295 4.844791 14.089105 13.275606 10.507436 1.178959 0.517357 -9.587597 -0.727355 -20.143526 -8.505084 -1.338715 2.809944 1.031503 -2.011936 -20.748703 -18.460787 -1.766257 -9.477161 -8.141899 11.094825 7.354932 0.806408 -0.000967 -22.754430 -0.776505 -0.130036 -0.000874 8.975180 -1.934943 32.739699 -16.134623 8.673649 -0.446129 4.029496 -8.052793 31.966528 0.038668 -0.080878 0.014125 -9.310658 -1.479783 11.196874 1.285225 -0.252794 -0.007746 -3.050046 6.051309 -26.021153 -9.854316 -1.033574 -5.282691 2.875459 6.699082 -25.718439 -0.014261 -0.078468 0.080866 -0.007870 0.000003 -0.000040 +0.682500 78.154100 -35.816200 -79.941507 0.235003 6.194772 -0.002182 -0.000181 0.005292 -3.679620 -1.362830 -10.103350 -10.595975 -1.841127 -0.170784 -4.182033 0.229010 5.677129 7.607847 -0.534689 -1.748931 -0.384183 0.410135 0.711443 1.415906 -3.293329 3.134914 -5.507752 0.677949 1.085343 -10.194142 -0.000010 -0.000014 0.000778 0.001397 -0.000215 0.000779 -0.001497 0.000269 -7.361045 9.504078 -0.378233 8.923216 -3.136899 -2.749007 9.302201 -1.038081 -0.470831 -5.680627 -0.451359 6.040468 -4.433894 -1.962276 -0.606733 0.538071 0.427496 5.857122 3.004466 -11.831986 -3.279886 4.793887 14.106492 13.267048 10.500495 1.178153 0.517086 -9.631994 -0.702501 -20.146019 -8.455629 -1.337487 2.797115 1.031356 -2.010904 -20.741799 -18.508233 -2.561869 -10.440543 -7.913751 10.384658 6.025496 0.769875 -0.033891 -22.851496 -0.762710 -0.127726 -0.000842 8.990346 -1.931499 32.747397 -16.127702 8.687717 -0.440184 4.051326 -8.045551 31.951888 0.038661 -0.080879 0.014122 -9.304406 -1.505143 11.102132 1.285224 -0.252794 -0.007745 -3.061352 6.033593 -26.019561 -9.803239 -0.954830 -5.267815 2.910090 6.698227 -25.716171 -0.011270 -0.063253 0.082913 -0.007870 0.000004 -0.000041 +0.682500 78.154100 -35.834500 -79.963126 0.239673 6.285821 -0.002182 -0.000180 0.005290 -3.697572 -1.383683 -10.171074 -10.561036 -1.853475 -0.217585 -4.154121 0.231020 5.690988 7.579880 -0.533734 -1.742205 -0.447087 0.404930 0.706475 1.376344 -3.340112 3.186968 -5.710849 0.689123 1.071501 -10.194139 -0.000010 -0.000015 0.000778 0.001400 -0.000215 0.000778 -0.001501 0.000269 -7.318212 9.516615 -0.370762 8.878575 -3.075616 -2.768016 9.336893 -1.042091 -0.472261 -5.722824 -0.471653 6.043028 -4.400083 -1.973696 -0.619559 0.538486 0.428455 5.864036 3.069899 -11.799075 -3.273510 4.797308 14.142414 13.248549 10.445004 1.171694 0.514926 -9.690006 -0.674392 -20.148645 -8.390038 -1.347745 2.784659 1.031811 -2.014011 -20.762547 -18.550358 -3.263492 -11.288672 -7.707746 9.568538 4.674452 0.734335 -0.062369 -22.935331 -0.748909 -0.125415 -0.000810 9.005969 -1.928353 32.727186 -16.106810 8.715927 -0.436348 4.053678 -8.037637 31.938934 0.037550 -0.074207 0.033990 -9.298199 -1.530520 11.007407 1.285223 -0.252793 -0.007746 -3.072653 6.015878 -26.017982 -9.804000 -0.898440 -5.253843 2.936653 6.686760 -25.717293 -0.008288 -0.048036 0.084955 -0.007871 0.000004 -0.000041 +0.682500 78.154100 -35.852800 -79.963895 0.246623 6.376741 -0.002178 -0.000181 0.005291 -3.715537 -1.404515 -10.238790 -10.547094 -1.865762 -0.265057 -4.147088 0.230953 5.704934 7.551910 -0.532768 -1.721489 -0.391298 0.418907 0.722320 1.245858 -3.391957 3.233589 -5.913950 0.700340 1.057699 -10.194145 -0.000011 -0.000015 0.000777 0.001397 -0.000224 0.000776 -0.001496 0.000251 -7.275809 9.515191 -0.363425 8.832854 -3.027450 -2.770703 9.371581 -1.046104 -0.473686 -5.765057 -0.493882 6.031732 -4.364479 -1.971245 -0.618339 0.537655 0.426532 5.850213 3.113181 -11.786404 -3.271814 4.694425 14.132818 13.260312 10.569863 1.186232 0.519773 -9.791696 -0.678576 -20.145984 -8.340586 -1.346541 2.771833 1.032260 -2.017120 -20.783258 -18.596713 -3.801113 -11.948402 -7.548810 8.624507 3.299036 0.715522 -0.080911 -22.979447 -0.673026 -0.112708 -0.000655 9.005477 -1.938572 32.692274 -16.142771 8.764477 -0.437876 3.982686 -8.031975 31.886885 0.021162 -0.061248 0.036073 -9.305855 -1.522569 10.923134 1.360719 -0.267647 -0.008025 -3.154070 5.992719 -26.008001 -9.804751 -0.842054 -5.239861 2.875456 6.699083 -25.718444 -0.007802 -0.045803 0.091571 -0.007870 0.000003 -0.000041 +0.682500 78.154100 -35.871100 -79.964678 0.253576 6.446685 -0.002180 -0.000181 0.005292 -3.729827 -1.404883 -10.309374 -10.533216 -1.888953 -0.283205 -4.140051 0.230888 5.718872 7.523488 -0.545795 -1.700765 -0.419296 0.418555 0.722525 1.228453 -3.457356 3.267102 -6.117045 0.711609 1.043938 -10.194136 -0.000010 -0.000015 0.000775 0.001399 -0.000222 0.000774 -0.001499 0.000276 -7.233227 9.514047 -0.377107 8.870990 -2.985272 -2.768238 9.267518 -1.034070 -0.469397 -5.779476 -0.530290 6.022591 -4.328875 -1.968787 -0.617113 0.536831 0.424610 5.836391 3.156457 -11.773761 -3.270129 4.734188 14.171849 13.245870 10.465818 1.174118 0.515739 -9.817297 -0.665334 -20.147257 -8.291136 -1.345347 2.759006 1.032709 -2.020227 -20.804012 -18.624828 -4.130961 -12.342866 -7.450301 7.572809 1.982068 0.691412 -0.121352 -23.089803 -0.666114 -0.111550 -0.000637 8.960120 -1.938441 32.725007 -16.086074 8.758142 -0.439522 3.991485 -8.041841 31.927934 0.004794 -0.048285 0.038174 -9.313546 -1.534446 10.845692 1.360721 -0.267648 -0.008026 -3.169344 5.968924 -26.019882 -9.807834 -0.806521 -5.246900 2.890761 6.696002 -25.718165 -0.007317 -0.043571 0.098181 -0.007873 0.000003 -0.000041 +0.682500 78.154100 -35.889400 -79.965465 0.260523 6.495633 -0.002184 -0.000181 0.005292 -3.743239 -1.400398 -10.345314 -10.519340 -1.912147 -0.301346 -4.133014 0.230826 5.732812 7.516017 -0.559518 -1.679834 -0.363333 0.419259 0.722115 1.139739 -3.502033 3.291308 -6.320144 0.722928 1.030217 -10.194137 -0.000010 -0.000015 0.000778 0.001398 -0.000212 0.000777 -0.001496 0.000268 -7.190617 9.512907 -0.390780 8.692550 -2.927616 -2.778832 9.524202 -1.063766 -0.479940 -5.891831 -0.565519 6.012509 -4.307162 -1.964543 -0.616367 0.536005 0.422685 5.822554 3.199729 -11.761108 -3.268456 4.638074 14.164580 13.256449 10.583754 1.187850 0.520309 -9.905832 -0.674645 -20.158258 -8.243995 -1.330358 2.767104 1.032713 -2.020227 -20.804010 -18.644945 -4.286871 -12.538802 -7.402595 6.456749 0.723580 0.672008 -0.142033 -23.140563 -0.659227 -0.110396 -0.000624 8.954668 -1.942839 32.724796 -16.079153 8.772213 -0.433581 3.991484 -8.041839 31.927934 -0.008276 -0.054910 0.047036 -9.321093 -1.541739 10.781481 1.381305 -0.271697 -0.008100 -3.207952 5.960458 -26.001210 -9.797007 -0.772538 -5.239755 2.880964 6.706137 -25.701409 -0.003300 -0.022065 0.075830 -0.007871 0.000003 -0.000041 +0.682500 78.154100 -35.907700 -79.966260 0.267478 6.544595 -0.002184 -0.000181 0.005291 -3.760381 -1.416344 -10.378398 -10.505361 -1.914484 -0.321741 -4.125910 0.230004 5.760725 7.495275 -0.551819 -1.659068 -0.307385 0.422427 0.746805 1.072021 -3.545539 3.316737 -6.502166 0.728908 1.029015 -10.194144 -0.000011 -0.000014 0.000775 0.001399 -0.000226 0.000776 -0.001496 0.000264 -7.168786 9.533155 -0.386917 8.793557 -2.889939 -2.772706 9.336897 -1.042091 -0.472262 -5.843311 -0.602684 6.003996 -4.285448 -1.960299 -0.629613 0.535176 0.420762 5.808732 3.243484 -11.734475 -3.266497 4.693097 14.185685 13.221193 10.472759 1.174924 0.516005 -9.914703 -0.681639 -20.171251 -8.210659 -1.317677 2.774871 1.033171 -2.023335 -20.824724 -18.644975 -4.286870 -12.538807 -7.379434 5.281381 -0.521677 0.650991 -0.169264 -23.211175 -0.652330 -0.109242 -0.000614 8.961848 -1.918538 32.745887 -16.072258 8.786289 -0.427643 3.994055 -8.013010 31.934877 0.014493 -0.021633 0.088890 -9.328863 -1.555869 10.697433 1.388174 -0.273048 -0.008126 -3.214763 5.949265 -25.951304 -9.786172 -0.738556 -5.232619 2.866078 6.709170 -25.657501 -0.000638 -0.010702 0.131002 -0.007870 0.000003 -0.000038 +0.682500 78.154100 -35.926000 -79.978559 0.251981 6.558642 -0.002182 -0.000180 0.005290 -3.775031 -1.418656 -10.413384 -10.491375 -1.916825 -0.342139 -4.118797 0.229185 5.788629 7.474514 -0.544127 -1.638297 -0.342172 0.406714 0.750496 1.081258 -3.584669 3.346964 -6.634992 0.723023 1.021449 -10.194144 -0.000010 -0.000015 0.000774 0.001397 -0.000219 0.000777 -0.001498 0.000264 -7.147375 9.539421 -0.383190 8.676937 -2.853062 -2.792564 9.524210 -1.063762 -0.479946 -5.920699 -0.638309 5.994141 -4.261924 -1.942188 -0.642800 0.534352 0.418838 5.794908 3.258676 -11.706888 -3.270122 4.621601 14.175284 13.218264 10.569871 1.186234 0.519776 -9.982833 -0.695803 -20.182044 -8.177307 -1.304997 2.754646 1.033620 -2.026445 -20.845478 -18.635591 -4.179892 -12.403687 -7.435939 4.124761 -1.592419 0.641148 -0.150466 -23.142757 -0.645419 -0.108083 -0.000605 8.954521 -1.953279 32.668948 -16.065185 8.786372 -0.421731 3.978271 -8.027024 31.866289 0.014484 -0.021634 0.088891 -9.321414 -1.546547 10.746136 1.395038 -0.274399 -0.008143 -3.223317 5.936571 -26.020106 -9.779225 -0.739327 -5.225540 2.876732 6.700850 -25.725231 -0.005800 -0.035048 0.080397 -0.007869 0.000003 -0.000040 +0.682500 78.154100 -35.944400 -79.992460 0.250387 6.551732 -0.002181 -0.000181 0.005289 -3.775027 -1.418657 -10.413383 -10.491370 -1.915320 -0.328230 -4.111841 0.229890 5.788606 7.474292 -0.551127 -1.645285 -0.321303 0.413871 0.780862 1.091113 -3.633674 3.387117 -6.767813 0.717156 1.013868 -10.194146 -0.000009 -0.000014 0.000777 0.001400 -0.000224 0.000777 -0.001498 0.000269 -7.168489 9.546935 -0.372776 8.761134 -2.855773 -2.802935 9.385459 -1.047709 -0.474258 -5.879184 -0.675400 5.985608 -4.238399 -1.924074 -0.635012 0.533523 0.416916 5.781082 3.272829 -11.714558 -3.253486 4.675983 14.193762 13.208217 10.465813 1.174114 0.515733 -9.969341 -0.729525 -20.191859 -8.169294 -1.268196 2.754825 1.034069 -2.029551 -20.866195 -18.617431 -3.898195 -12.060091 -7.512426 2.985623 -2.565473 0.626530 -0.151422 -23.133936 -0.638529 -0.106930 -0.000589 8.949189 -1.957747 32.661722 -16.058115 8.786458 -0.429802 3.978290 -8.027033 31.866350 0.014491 -0.021634 0.088890 -9.314355 -1.550915 10.755154 1.388175 -0.273050 -0.008117 -3.230847 5.924765 -26.019063 -9.772265 -0.740100 -5.218446 2.877999 6.702623 -25.732003 -0.003295 -0.022067 0.075830 -0.007872 0.000003 -0.000039 +0.694700 78.129700 -35.700200 -79.978561 0.251978 6.544667 -0.002181 -0.000181 0.005290 -3.775026 -1.418657 -10.413381 -10.491366 -1.915318 -0.328230 -4.118689 0.228044 5.809589 7.460083 -0.557630 -1.610446 -0.279552 0.431666 0.757430 1.065445 -3.674841 3.415106 -6.837462 0.699664 0.999739 -10.194144 -0.000011 -0.000013 0.000774 0.001398 -0.000217 0.000776 -0.001501 0.000264 -7.146948 9.553394 -0.383064 8.761503 -2.852454 -2.818195 9.399320 -1.049311 -0.474828 -5.893377 -0.691017 5.973525 -4.214880 -1.905962 -0.627239 0.532697 0.414991 5.767254 3.287117 -11.707635 -3.278577 4.696345 14.200703 13.204463 10.431126 1.170077 0.514382 -9.983054 -0.756720 -20.201994 -8.161256 -1.231392 2.755004 1.034509 -2.032657 -20.886915 -18.585168 -3.540191 -11.623364 -7.604197 1.902302 -3.423097 0.630186 -0.136355 -23.131808 -0.659227 -0.110396 -0.000624 8.954743 -1.953433 32.654940 -16.079331 8.786215 -0.433550 3.978280 -8.027027 31.866330 0.017116 -0.037198 0.042549 -9.321254 -1.535364 10.757081 1.381306 -0.271698 -0.008100 -3.227084 5.930669 -26.019578 -9.765314 -0.740873 -5.232347 2.879282 6.704398 -25.738811 -0.003298 -0.022066 0.075832 -0.007874 0.000004 -0.000039 +0.694700 78.129700 -35.700200 -79.964663 0.253573 6.516660 -0.002184 -0.000181 0.005291 -3.775024 -1.418658 -10.413383 -10.491449 -1.929227 -0.326724 -4.125531 0.226193 5.830568 7.446320 -0.550183 -1.596604 -0.279493 0.427239 0.752015 1.136854 -3.695404 3.434557 -6.907805 0.722692 0.980842 -10.250100 -0.050447 -0.000495 0.000775 0.001399 -0.000222 0.000778 -0.001501 0.000269 -7.153759 9.560683 -0.388885 8.775845 -2.850152 -2.832643 9.385456 -1.047707 -0.474260 -5.907571 -0.706628 5.961435 -4.212186 -1.885151 -0.634137 0.531869 0.413070 5.753439 3.301640 -11.701119 -3.275651 4.641992 14.182221 13.214501 10.507433 1.178959 0.517355 -10.010391 -0.780645 -20.212348 -8.150920 -1.208386 2.755218 1.034513 -2.032660 -20.886935 -18.556560 -3.114264 -11.113585 -7.708009 0.869913 -4.195125 0.635431 -0.114716 -23.109829 -0.679918 -0.113861 -0.000662 8.960072 -1.948960 32.662135 -16.086246 8.772131 -0.439490 3.978275 -8.027024 31.866323 0.030913 -0.034877 0.042557 -9.327911 -1.523907 10.790014 1.374440 -0.270347 -0.008078 -3.223315 5.936574 -26.020108 -9.758357 -0.741644 -5.232257 2.880547 6.706179 -25.745606 -0.023885 -0.018045 0.075992 -0.007868 0.000003 -0.000040 +0.694700 78.129700 -35.700200 -79.970028 0.238877 6.488657 -0.002182 -0.000180 0.005291 -3.760731 -1.418281 -10.392256 -10.491509 -1.941626 -0.311311 -4.132446 0.225102 5.837576 7.460504 -0.543608 -1.582484 -0.265664 0.440705 0.768157 1.113580 -3.776098 3.472520 -6.956429 0.701468 0.941578 -10.208134 -0.000009 -0.000021 0.000775 0.001401 -0.000220 0.000773 -0.001497 0.000266 -7.160576 9.567988 -0.394706 8.760800 -2.863327 -2.827011 9.434005 -1.053325 -0.476258 -5.921720 -0.719331 5.970121 -4.212176 -1.885150 -0.641130 0.532284 0.414032 5.760339 3.287610 -11.693653 -3.278275 4.700576 14.190561 13.194676 10.417253 1.168462 0.513839 -9.971191 -0.797187 -20.210851 -8.154387 -1.187690 2.755145 1.034810 -2.034731 -20.900736 -18.518347 -2.616019 -10.505873 -7.801678 -0.053568 -4.796639 0.635988 -0.112395 -23.081076 -0.679923 -0.113862 -0.000662 8.965404 -1.944489 32.669392 -16.093162 8.758066 -0.445434 3.984136 -8.033614 31.893715 0.042517 -0.019498 0.038047 -9.334555 -1.512456 10.822942 1.346997 -0.264947 -0.007971 -3.207672 5.934982 -26.021930 -9.751407 -0.742420 -5.232172 2.881822 6.707949 -25.752397 -0.023902 -0.018044 0.075995 -0.007874 0.000004 -0.000038 +0.694700 78.129700 -35.700200 -79.975395 0.224191 6.460698 -0.002185 -0.000180 0.005291 -3.746433 -1.417898 -10.371110 -10.512426 -1.926098 -0.299616 -4.139365 0.224010 5.844584 7.474703 -0.537030 -1.568365 -0.251896 0.456149 0.764609 1.203073 -3.745958 3.443850 -7.046121 0.626590 0.986302 -10.208127 -0.000009 -0.000020 0.000775 0.001399 -0.000210 0.000776 -0.001499 0.000271 -7.188798 9.575716 -0.383158 8.815582 -2.881554 -2.817288 9.371586 -1.046103 -0.473686 -5.872943 -0.734782 5.965751 -4.209478 -1.864343 -0.634051 0.531871 0.413068 5.753434 3.272839 -11.707144 -3.281349 4.721935 14.172348 13.197872 10.396432 1.166040 0.513029 -9.957265 -0.829029 -20.206770 -8.161326 -1.146300 2.755008 1.035106 -2.036801 -20.914548 -18.498743 -2.030528 -9.802482 -7.885675 -0.777681 -5.136867 0.684056 -0.092117 -23.076769 -0.742001 -0.124258 -0.000799 8.987889 -1.961471 32.705681 -16.114404 8.757816 -0.428211 3.989987 -8.040195 31.921067 0.019320 -0.050256 0.047053 -9.354789 -1.484950 10.901912 1.353847 -0.266295 -0.008007 -3.180214 5.900139 -26.066672 -9.746002 -0.757096 -5.232100 2.900224 6.674614 -25.796786 -0.010982 -0.059399 0.029790 -0.007867 0.000003 -0.000038 +0.694700 78.129700 -35.700200 -79.961501 0.225761 6.418706 -0.002179 -0.000181 0.005290 -3.732146 -1.417511 -10.349988 -10.533340 -1.910577 -0.287914 -4.160205 0.221493 5.851646 7.474915 -0.530020 -1.554383 -0.188967 0.458953 0.744423 1.119377 -3.755931 3.472936 -7.031952 0.616948 0.974029 -10.208154 -0.000008 -0.000020 0.000774 0.001398 -0.000208 0.000771 -0.001498 0.000269 -7.217416 9.569461 -0.371743 8.856434 -2.901950 -2.837873 9.336904 -1.042089 -0.472264 -5.859151 -0.749786 5.960940 -4.206788 -1.843531 -0.626970 0.531452 0.412107 5.746525 3.258070 -11.720652 -3.284429 4.790894 14.170313 13.192304 10.299314 1.154742 0.509224 -9.910002 -0.871870 -20.222973 -8.168258 -1.104909 2.754874 1.035412 -2.038878 -20.928388 -18.482058 -1.418354 -9.076988 -7.960340 -1.363693 -5.310423 0.686664 -0.081293 -23.065762 -0.755802 -0.126569 -0.000828 8.988589 -1.951406 32.726578 -16.135456 8.743586 -0.432000 3.995866 -8.046772 31.948469 0.038900 -0.040246 0.044813 -9.355298 -1.503219 10.849018 1.360713 -0.267646 -0.008028 -3.179597 5.900665 -26.024771 -9.761455 -0.769460 -5.183343 2.874172 6.697291 -25.711626 -0.008786 -0.050273 0.078354 -0.007876 0.000004 -0.000039 +0.694700 78.129700 -35.700200 -79.947595 0.227319 6.376689 -0.002178 -0.000181 0.005290 -3.717841 -1.417120 -10.328855 -10.540358 -1.915990 -0.273483 -4.181046 0.218972 5.858713 7.474697 -0.537021 -1.561370 -0.188972 0.458953 0.744424 1.210065 -3.745542 3.464094 -7.115480 0.591267 0.994680 -10.208134 -0.000009 -0.000021 0.000771 0.001400 -0.000217 0.000775 -0.001500 0.000266 -7.245856 9.563487 -0.381344 8.896190 -2.935481 -2.842156 9.302201 -1.038078 -0.470827 -5.845358 -0.764789 5.956142 -4.204092 -1.822721 -0.619887 0.531037 0.411145 5.739609 3.243303 -11.734155 -3.287509 4.809160 14.182300 13.193433 10.264636 1.150709 0.507869 -9.879911 -0.896347 -20.241337 -8.193582 -1.080782 2.768381 1.035703 -2.040949 -20.942207 -18.471270 -0.792768 -8.313260 -8.010634 -1.827762 -5.344177 0.731656 -0.073720 -23.034851 -0.817888 -0.136967 -0.000966 9.006905 -1.963083 32.748609 -16.156519 8.729342 -0.435797 4.001736 -8.053344 31.975845 0.020415 -0.056787 0.049308 -9.354613 -1.478102 10.921748 1.353859 -0.266298 -0.008001 -3.189570 5.923987 -26.002933 -9.735175 -0.786444 -5.238943 2.867190 6.688467 -25.743946 -0.008782 -0.050275 0.078355 -0.007872 0.000003 -0.000040 +0.694700 78.129700 -35.700200 -79.953002 0.212638 6.334711 -0.002179 -0.000181 0.005292 -3.703546 -1.416725 -10.307730 -10.547386 -1.921402 -0.259058 -4.201880 0.216448 5.865769 7.502462 -0.544879 -1.568088 -0.202966 0.458771 0.744535 1.211231 -3.765298 3.474047 -7.094284 0.578876 0.988720 -10.208136 -0.000009 -0.000019 0.000777 0.001399 -0.000219 0.000778 -0.001500 0.000275 -7.274428 9.557327 -0.376943 9.047689 -2.977133 -2.839696 9.101028 -1.014834 -0.462480 -5.795928 -0.729826 5.958865 -4.180824 -1.860995 -0.626136 0.495663 0.445065 5.730204 3.214866 -11.733392 -3.279068 4.861201 14.184926 13.190082 10.188330 1.141837 0.504859 -9.828754 -0.922913 -20.238614 -8.218902 -1.056661 2.781889 1.035704 -2.040947 -20.942197 -18.466700 -0.151133 -7.536250 -8.040216 -2.073194 -5.143442 0.729022 -0.054687 -23.004007 -0.831670 -0.139273 -0.001005 9.023330 -1.949951 32.742267 -16.156351 8.715354 -0.442815 4.003209 -8.054992 31.982702 0.046912 -0.045612 0.047080 -9.354368 -1.468962 10.948205 1.326396 -0.260893 -0.007902 -3.169862 5.928573 -25.984316 -9.729776 -0.801122 -5.238869 2.880540 6.706168 -25.745609 -0.008781 -0.050276 0.078353 -0.007869 0.000003 -0.000042 +0.694700 78.129700 -35.700200 -79.944511 0.199509 6.292754 -0.002178 -0.000181 0.005292 -3.686774 -1.402694 -10.288503 -10.568304 -1.905896 -0.247354 -4.201956 0.217208 5.851799 7.530854 -0.531766 -1.574823 -0.133017 0.459680 0.743975 1.209469 -3.735666 3.464062 -7.156687 0.547794 1.021862 -10.208133 -0.000009 -0.000021 0.000774 0.001398 -0.000214 0.000772 -0.001496 0.000269 -7.302577 9.565139 -0.372404 8.989649 -3.003553 -2.849869 9.218954 -1.028454 -0.467388 -5.831073 -0.742258 5.967283 -4.183280 -1.825414 -0.619221 0.530209 0.402289 5.726744 3.185935 -11.746619 -3.270927 4.917484 14.177433 13.176966 10.132828 1.135389 0.502664 -9.803354 -0.877158 -20.231145 -8.202793 -1.068143 2.768209 1.030063 -1.982128 -20.951332 -18.470857 0.490502 -6.759272 -8.042469 -2.179788 -4.789791 0.783441 -0.037723 -22.940030 -0.900672 -0.150830 -0.001175 9.052969 -1.953118 32.736834 -16.177581 8.715109 -0.432606 4.001727 -8.053351 31.975858 0.021512 -0.063316 0.051557 -9.353952 -1.452968 10.994495 1.333270 -0.262246 -0.007931 -3.150764 5.932625 -26.007590 -9.724369 -0.815801 -5.238792 2.850406 6.689804 -25.759522 -0.008786 -0.050274 0.078351 -0.007872 0.000003 -0.000040 +0.694700 78.129700 -35.700200 -79.936029 0.186366 6.250769 -0.002180 -0.000181 0.005292 -3.669669 -1.386722 -10.255445 -10.589238 -1.890391 -0.235644 -4.217370 0.230441 5.838656 7.538284 -0.518008 -1.581766 -0.147156 0.470329 0.735236 1.210046 -3.745552 3.473986 -7.121839 0.554796 1.024396 -10.208143 -0.000009 -0.000021 0.000775 0.001398 -0.000217 0.000776 -0.001499 0.000273 -7.330723 9.572952 -0.367864 9.037111 -3.026732 -2.844844 9.170402 -1.022844 -0.465369 -5.810285 -0.757351 5.962569 -4.189323 -1.817580 -0.612417 0.530627 0.403253 5.733661 3.098904 -11.785915 -3.274577 4.965559 14.186777 13.198602 10.216069 1.145063 0.505957 -9.874876 -0.935178 -20.250276 -8.216636 -1.027911 2.774951 1.037535 -2.034265 -20.943098 -18.472057 1.109123 -6.000213 -8.038070 -2.212616 -4.383058 0.788124 -0.018120 -22.902543 -0.914464 -0.153139 -0.001217 9.053078 -1.953198 32.729816 -16.198808 8.714855 -0.422393 4.000268 -8.051702 31.969004 0.048748 -0.056593 0.036094 -9.353770 -1.446114 11.014331 1.244056 -0.244693 -0.007588 -3.053648 5.888695 -25.983489 -9.767635 -0.825059 -5.239413 2.883088 6.709713 -25.759200 0.017691 -0.060100 0.064928 -0.007871 0.000003 -0.000041 +0.694700 78.141900 -35.681900 -79.929839 0.194080 6.208793 -0.002184 -0.000180 0.005291 -3.656245 -1.391185 -10.219503 -10.610220 -1.888801 -0.222425 -4.232670 0.242533 5.846464 7.545270 -0.518233 -1.588694 -0.161159 0.472129 0.715667 1.210644 -3.755431 3.483907 -7.086989 0.561799 1.026927 -10.208118 -0.000009 -0.000021 0.000778 0.001401 -0.000214 0.000776 -0.001503 0.000281 -7.359491 9.559799 -0.363524 9.174280 -3.072814 -2.847405 8.990032 -1.002023 -0.457840 -5.774665 -0.708350 5.963167 -4.164250 -1.841971 -0.604617 0.503054 0.445973 5.736661 3.011858 -11.825194 -3.278286 5.034011 14.203063 13.216460 10.327054 1.157967 0.510314 -9.992716 -0.946378 -20.275075 -8.191355 -1.009483 2.782392 1.037828 -2.036339 -20.956911 -18.483042 1.709877 -5.274050 -8.029369 -2.189432 -3.910317 0.842376 -0.001657 -22.927041 -0.983452 -0.164692 -0.001403 9.087152 -1.951278 32.787486 -16.220038 8.714611 -0.426176 4.016433 -8.069773 32.044328 0.024111 -0.078734 0.027341 -9.311637 -1.412890 11.025726 1.120516 -0.220387 -0.007072 -2.975330 5.815260 -25.956679 -9.807035 -0.799560 -5.239973 2.895633 6.703092 -25.767425 -0.013254 -0.072176 0.056470 -0.007868 0.000003 -0.000041 +0.694700 78.141900 -35.675800 -79.922123 0.187882 6.194705 -0.002187 -0.000181 0.005289 -3.643355 -1.398546 -10.204368 -10.610218 -1.887292 -0.208519 -4.245839 0.233779 5.853122 7.573249 -0.519114 -1.595428 -0.105036 0.458555 0.708808 1.222005 -3.710126 3.440179 -7.107308 0.525696 1.072405 -10.208134 -0.000010 -0.000021 0.000775 0.001395 -0.000202 0.000779 -0.001501 0.000274 -7.388275 9.546651 -0.359188 9.131277 -3.083947 -2.843569 9.080218 -1.012431 -0.461615 -5.809806 -0.720784 5.971589 -4.161564 -1.821160 -0.597540 0.531463 0.405177 5.747485 2.975600 -11.837864 -3.292614 5.025356 14.202380 13.237784 10.368696 1.162811 0.511943 -9.980435 -0.984971 -20.270028 -8.230493 -0.987686 2.788707 1.038122 -2.038411 -20.970737 -18.507717 2.238203 -4.580511 -8.015801 -2.086627 -3.380521 0.844462 0.007121 -22.900554 -0.997241 -0.167001 -0.001444 9.092587 -1.946873 32.787705 -16.241010 8.693373 -0.429992 4.017893 -8.071427 32.051192 0.057115 -0.064189 0.031739 -9.311357 -1.401469 11.058797 1.099933 -0.216337 -0.006982 -2.938209 5.808275 -25.967891 -9.821709 -0.804963 -5.240180 2.885630 6.713270 -25.772778 -0.009876 -0.090966 0.047770 -0.007871 0.000004 -0.000041 +0.694700 78.141900 -35.669700 -79.928326 0.180174 6.180782 -0.002181 -0.000181 0.005293 -3.626778 -1.385455 -10.192071 -10.624202 -1.885735 -0.195071 -4.260581 0.240443 5.832611 7.601212 -0.519997 -1.602163 -0.126017 0.457306 0.718818 1.235101 -3.694492 3.445995 -7.079504 0.536106 1.084268 -10.208134 -0.000011 -0.000020 0.000774 0.001399 -0.000226 0.000774 -0.001494 0.000252 -7.402457 9.547065 -0.356956 9.172115 -3.101180 -2.834510 9.031654 -1.006827 -0.459585 -5.795827 -0.721932 5.964834 -4.160669 -1.814223 -0.590523 0.530634 0.403256 5.733665 2.967903 -11.851497 -3.301326 5.093123 14.204629 13.227032 10.250755 1.149097 0.507322 -9.921163 -0.977895 -20.271930 -8.239689 -0.975046 2.795541 1.037830 -2.036334 -20.956902 -18.544121 2.691240 -3.949006 -7.998695 -1.900880 -2.834399 0.902037 0.007341 -22.860843 -1.073133 -0.179709 -0.001672 9.120398 -1.969851 32.768362 -16.262325 8.700110 -0.433762 4.016424 -8.069775 32.044321 0.024446 -0.080824 0.042833 -9.311092 -1.390054 11.091850 1.093060 -0.214985 -0.006960 -2.924851 5.816259 -25.976534 -9.822488 -0.811915 -5.240188 2.886898 6.715045 -25.779579 -0.009875 -0.090966 0.047767 -0.007872 0.000003 -0.000040 +0.694700 78.141900 -35.663600 -79.934526 0.172464 6.166782 -0.002182 -0.000181 0.005291 -3.612660 -1.385993 -10.177883 -10.638148 -1.870274 -0.183124 -4.261290 0.247392 5.833001 7.594219 -0.519787 -1.609222 -0.133085 0.464611 0.694763 1.234225 -3.679679 3.450892 -7.051728 0.546521 1.096126 -10.208134 -0.000010 -0.000021 0.000773 0.001398 -0.000217 0.000774 -0.001498 0.000280 -7.388081 9.546939 -0.380201 9.212930 -3.118397 -2.825433 8.983094 -1.001220 -0.457547 -5.781849 -0.723082 5.958089 -4.159780 -1.807285 -0.583497 0.530633 0.403257 5.733665 2.974490 -11.865616 -3.307231 5.113311 14.190667 13.225063 10.202196 1.143450 0.505411 -9.905933 -0.974442 -20.272611 -8.235123 -0.960092 2.802612 1.037833 -2.036338 -20.956909 -18.569688 3.059438 -3.359943 -7.981412 -1.669474 -2.255831 0.899829 0.028280 -22.867607 -1.086929 -0.182018 -0.001717 9.141804 -1.952004 32.790195 -16.262409 8.707108 -0.419767 4.019362 -8.073062 32.058032 0.056381 -0.059734 0.044988 -9.289571 -1.367207 11.158326 1.086192 -0.213634 -0.006922 -2.946772 5.795596 -26.036727 -9.823269 -0.818866 -5.240200 2.871633 6.695646 -25.837400 -0.012822 -0.104353 0.008094 -0.007869 0.000003 -0.000040 +0.688600 78.172400 -35.883300 -79.925664 0.170039 6.158634 -0.002182 -0.000181 0.005292 -3.616029 -1.391044 -10.182735 -10.619223 -1.862128 -0.193104 -4.270063 0.247397 5.828831 7.578649 -0.507165 -1.596229 -0.137309 0.460852 0.674214 1.222190 -3.686479 3.455317 -7.041888 0.539970 1.093747 -10.195437 0.021539 0.017068 0.000774 0.001397 -0.000212 0.000775 -0.001499 0.000261 -7.375549 9.546747 -0.388033 9.255265 -3.159548 -2.823173 8.924689 -0.996073 -0.451673 -5.787667 -0.683776 5.975616 -4.157082 -1.839187 -0.597128 0.541517 0.447379 5.728085 3.002283 -11.852246 -3.299913 5.108299 14.180011 13.235646 10.156906 1.138186 0.503617 -9.832965 -0.960951 -20.257013 -8.274343 -0.982190 2.786311 1.037110 -2.040096 -20.962243 -18.612723 3.392809 -2.837922 -7.963550 -1.395735 -1.674947 0.948271 0.027762 -22.860602 -1.146870 -0.192056 -0.001913 9.169827 -1.966441 32.799409 -16.284096 8.708437 -0.416934 4.016344 -8.071947 32.079752 0.026896 -0.079505 0.036051 -9.295059 -1.385149 11.095548 1.066601 -0.209780 -0.006837 -2.922344 5.810120 -25.975303 -9.838677 -0.818570 -5.240893 2.885013 6.713049 -25.771345 -0.004036 -0.072831 0.050402 -0.007871 0.000003 -0.000040 +0.688600 78.172400 -35.883300 -79.925664 0.170039 6.158641 -0.002181 -0.000181 0.005291 -3.616026 -1.391043 -10.182729 -10.640219 -1.862056 -0.193785 -4.249188 0.249526 5.828747 7.641581 -0.509193 -1.630627 -0.228127 0.448945 0.683787 1.192179 -3.653545 3.418783 -6.951127 0.550032 1.142633 -10.195422 -0.001598 0.001338 0.000776 0.001400 -0.000222 0.000777 -0.001501 0.000267 -7.418510 9.534019 -0.381475 9.255273 -3.159549 -2.823174 8.910816 -0.994473 -0.451090 -5.815648 -0.683419 5.975292 -4.134480 -1.827996 -0.596408 0.541578 0.405812 5.733861 2.966797 -11.851456 -3.278931 5.135471 14.189257 13.230636 10.115304 1.133353 0.501969 -9.894174 -0.946198 -20.258029 -8.212255 -0.971762 2.787376 1.037105 -2.040098 -20.962252 -18.627558 3.680926 -2.406017 -7.955497 -1.059800 -1.074012 0.948274 0.027766 -22.860597 -1.146869 -0.192056 -0.001914 9.170275 -1.966744 32.771422 -16.284083 8.708434 -0.416937 4.011932 -8.067014 32.059180 0.054482 -0.074868 0.036091 -9.295068 -1.385143 11.095540 1.066611 -0.209781 -0.006833 -2.922338 5.810122 -25.975300 -9.838682 -0.818571 -5.240894 2.885026 6.713054 -25.771376 -0.004039 -0.072830 0.050401 -0.007869 0.000003 -0.000041 +0.688600 78.172400 -35.883300 -79.925665 0.170044 6.186623 -0.002179 -0.000181 0.005292 -3.616036 -1.391042 -10.182734 -10.640214 -1.862056 -0.193785 -4.228425 0.252794 5.807706 7.648578 -0.509425 -1.637557 -0.269953 0.437612 0.692964 1.162439 -3.625581 3.426793 -6.909288 0.557244 1.145103 -10.195411 -0.001599 0.001337 0.000772 0.001399 -0.000231 0.000777 -0.001496 0.000264 -7.404881 9.519417 -0.369825 9.255970 -3.148681 -2.814361 8.896941 -0.992876 -0.450506 -5.843626 -0.683065 5.974947 -4.113665 -1.830681 -0.595746 0.541579 0.405810 5.733858 2.981081 -11.851935 -3.276119 5.053937 14.161480 13.245656 10.212413 1.144638 0.505815 -9.955371 -0.931447 -20.259039 -8.198460 -0.969445 2.787606 1.036814 -2.038025 -20.948417 -18.646461 3.913549 -2.092924 -7.936267 -0.676840 -0.490862 0.946716 0.021182 -22.880475 -1.167563 -0.195520 -0.001986 9.205249 -1.965421 32.773191 -16.305321 8.708175 -0.413728 4.011931 -8.067014 32.059177 0.082079 -0.070226 0.036126 -9.294891 -1.378290 11.115370 1.080319 -0.212479 -0.006896 -2.922955 5.809598 -26.017210 -9.838673 -0.818572 -5.240895 2.895219 6.727245 -25.825712 0.016554 -0.076862 0.050255 -0.007870 0.000003 -0.000039 +0.688600 78.172400 -35.883300 -79.925664 0.170038 6.214607 -0.002187 -0.000180 0.005292 -3.616557 -1.393946 -10.203525 -10.640210 -1.862055 -0.193784 -4.228467 0.253175 5.800728 7.655582 -0.509658 -1.644489 -0.332964 0.442268 0.689020 1.196526 -3.608704 3.424037 -6.881452 0.564180 1.147701 -10.195407 -0.001599 0.001339 0.000776 0.001397 -0.000222 0.000780 -0.001496 0.000269 -7.390833 9.518820 -0.358043 9.151877 -3.130248 -2.812174 9.007949 -1.005674 -0.455165 -5.899758 -0.696206 5.976214 -4.092841 -1.833361 -0.595084 0.541574 0.405811 5.733857 2.995367 -11.852408 -3.273299 5.101488 14.177689 13.236901 10.087543 1.130125 0.500871 -9.933212 -0.899166 -20.249680 -8.170857 -0.964809 2.788072 1.036518 -2.035953 -20.934612 -18.668101 4.098710 -1.864692 -7.920764 -0.256313 0.075844 0.943582 0.008020 -22.920194 -1.167561 -0.195520 -0.001986 9.239868 -1.963864 32.795898 -16.312664 8.729077 -0.412613 4.016344 -8.071946 32.079749 0.072987 -0.058328 0.031606 -9.295263 -1.394280 11.069080 1.094051 -0.215179 -0.006958 -2.922649 5.809860 -25.996258 -9.836350 -0.797715 -5.240861 2.891392 6.721921 -25.805326 0.023406 -0.078201 0.050210 -0.007869 0.000003 -0.000040 +0.688600 78.172400 -35.883300 -79.946525 0.167765 6.242648 -0.002180 -0.000180 0.005290 -3.637744 -1.393129 -10.224819 -10.619225 -1.865145 -0.220920 -4.229920 0.267451 5.794518 7.662562 -0.509891 -1.651419 -0.395993 0.446928 0.685081 1.104704 -3.599252 3.413277 -6.756202 0.598603 1.160787 -10.195427 -0.001599 0.001339 0.000772 0.001397 -0.000217 0.000772 -0.001498 0.000273 -7.376523 9.518595 -0.374274 9.222477 -3.124416 -2.798950 8.855321 -0.988077 -0.448753 -5.871980 -0.712357 5.964642 -4.072018 -1.836042 -0.594411 0.541577 0.405812 5.733858 3.023939 -11.853361 -3.267671 4.986003 14.138324 13.258152 10.226279 1.146250 0.506355 -10.009184 -0.886004 -20.236034 -8.139785 -0.980867 2.788595 1.036664 -2.036985 -20.941493 -18.678117 4.227029 -1.711614 -7.930417 0.180472 0.619646 0.989627 -0.009929 -22.940083 -1.229648 -0.205918 -0.002202 9.253434 -1.980380 32.775762 -16.319998 8.749968 -0.411499 4.013403 -8.068660 32.066051 0.025804 -0.072972 0.033805 -9.274805 -1.414868 11.009929 1.107782 -0.217881 -0.007018 -2.975787 5.843827 -25.969554 -9.801590 -0.801585 -5.240375 2.910946 6.724102 -25.781264 -0.006503 -0.051418 0.109948 -0.007871 0.000003 -0.000040 +0.688600 78.184600 -35.901600 -79.953479 0.167000 6.291640 -0.002185 -0.000181 0.005291 -3.658921 -1.392304 -10.246109 -10.598248 -1.866738 -0.234148 -4.203530 0.284552 5.788168 7.669556 -0.510125 -1.658349 -0.458765 0.431911 0.679158 1.117812 -3.583608 3.409169 -6.728363 0.605548 1.163364 -10.195416 -0.001598 0.001338 0.000774 0.001398 -0.000219 0.000774 -0.001498 0.000263 -7.348163 9.517768 -0.378727 9.098140 -3.093645 -2.789211 9.007949 -1.005675 -0.455163 -5.963120 -0.726965 5.951581 -4.051188 -1.838724 -0.593746 0.541579 0.405808 5.733858 3.052999 -11.840340 -3.261741 5.036109 14.166966 13.257918 10.080599 1.129321 0.500592 -9.999003 -0.843710 -20.227827 -8.094910 -0.994606 2.789373 1.036812 -2.038023 -20.948438 -18.690492 4.283776 -1.636319 -7.944158 0.622017 1.132650 0.984794 -0.000094 -23.002059 -1.222741 -0.204761 -0.002176 9.237824 -1.983536 32.796028 -16.312995 8.757055 -0.412564 4.004107 -8.100442 32.073626 0.025800 -0.072971 0.033803 -9.275329 -1.408982 10.941272 1.203852 -0.236784 -0.007427 -3.105579 5.901194 -25.934122 -9.766829 -0.805455 -5.239892 2.878652 6.704158 -25.737372 -0.043278 -0.055887 0.077152 -0.007868 0.000003 -0.000039 +0.688600 78.190700 -35.919900 -79.960431 0.166230 6.340620 -0.002183 -0.000181 0.005291 -3.666683 -1.395896 -10.280919 -10.598258 -1.868244 -0.248054 -4.175018 0.280804 5.780664 7.676549 -0.510360 -1.665278 -0.493563 0.417230 0.673013 1.033585 -3.583609 3.408799 -6.637580 0.613769 1.165269 -10.195418 -0.001600 0.001339 0.000772 0.001398 -0.000224 0.000777 -0.001500 0.000269 -7.319818 9.516937 -0.383173 9.169413 -3.076906 -2.767223 8.841449 -0.986478 -0.448168 -5.935322 -0.741182 5.953873 -4.030365 -1.841407 -0.593080 0.540743 0.403891 5.720032 3.161698 -11.794756 -3.253661 4.861654 14.101612 13.285439 10.087554 1.130130 0.500870 -9.954836 -0.809591 -20.219172 -8.077630 -1.012981 2.789673 1.036369 -2.034913 -20.927691 -18.690493 4.283776 -1.636324 -7.939682 1.032991 1.520289 0.970187 -0.030921 -23.035021 -1.215852 -0.203606 -0.002151 9.233751 -1.978332 32.774745 -16.306015 8.764126 -0.413627 3.996904 -8.071337 32.059282 0.025797 -0.072971 0.033804 -9.304071 -1.442887 10.863737 1.203850 -0.236783 -0.007427 -3.089629 5.899892 -25.914988 -9.749837 -0.779199 -5.239657 2.919944 6.723407 -25.707194 -0.005524 -0.046951 0.123176 -0.007874 0.000003 -0.000042 +0.688600 78.190700 -35.938300 -79.967379 0.165455 6.389620 -0.002185 -0.000181 0.005290 -3.674443 -1.399485 -10.315739 -10.577266 -1.869846 -0.261281 -4.167282 0.273800 5.794216 7.683538 -0.510567 -1.651226 -0.528530 0.415827 0.683108 1.032408 -3.563855 3.398855 -6.651713 0.619865 1.168292 -10.195408 -0.001599 0.001340 0.000774 0.001399 -0.000217 0.000778 -0.001498 0.000271 -7.291448 9.516098 -0.387623 9.003864 -3.034443 -2.770812 9.056506 -1.011274 -0.457192 -6.047414 -0.753572 5.954346 -4.006864 -1.823278 -0.592323 0.539915 0.401964 5.706207 3.248961 -11.748449 -3.249859 4.819462 14.095351 13.272541 9.934927 1.112410 0.494794 -9.890247 -0.780368 -20.210219 -8.039663 -1.027880 2.790351 1.036216 -2.033878 -20.920793 -18.672317 4.187472 -1.763119 -7.939290 1.483818 1.936424 0.960215 -0.042444 -23.074776 -1.229650 -0.205917 -0.002203 9.258864 -1.975980 32.776008 -16.299022 8.771216 -0.400706 4.011925 -8.067019 32.059173 0.011257 -0.070844 0.047030 -9.303895 -1.442647 10.885867 1.251899 -0.246237 -0.007620 -3.133212 5.884426 -25.979652 -9.732822 -0.752941 -5.239430 2.886299 6.714822 -25.778152 -0.003462 -0.034375 0.074376 -0.007871 0.000004 -0.000040 +0.688600 78.184600 -35.956600 -79.974333 0.164671 6.438588 -0.002183 -0.000181 0.005293 -3.695975 -1.400558 -10.350890 -10.556283 -1.872962 -0.288412 -4.160953 0.280694 5.808535 7.676544 -0.510326 -1.637299 -0.563492 0.414421 0.693204 0.927482 -3.570018 3.402151 -6.582495 0.658270 1.153492 -10.195413 -0.001599 0.001338 0.000773 0.001398 -0.000214 0.000773 -0.001495 0.000256 -7.263527 9.501289 -0.392209 9.089803 -3.009935 -2.758898 8.855320 -0.988077 -0.448754 -6.019663 -0.770703 5.935877 -3.973055 -1.834682 -0.591246 0.539081 0.400046 5.692380 3.306564 -11.736336 -3.238403 4.756897 14.082120 13.263345 9.921056 1.110798 0.494237 -9.918971 -0.750110 -20.199683 -8.001687 -1.042777 2.791035 1.036070 -2.032839 -20.913870 -18.654343 4.091125 -1.889870 -7.960690 1.873714 2.293049 0.923997 -0.073107 -23.187369 -1.215854 -0.203607 -0.002153 9.265678 -1.951449 32.818017 -16.292199 8.792278 -0.387754 4.019482 -8.054365 32.091203 0.011851 -0.032305 0.093238 -9.304550 -1.441327 10.803994 1.251891 -0.246233 -0.007623 -3.157654 5.858894 -25.955470 -9.743637 -0.723588 -5.239562 2.877668 6.738012 -25.750493 -0.001288 -0.025243 0.122930 -0.007866 0.000003 -0.000037 +0.688600 78.196800 -35.974900 -79.981282 0.163884 6.508552 -0.002181 -0.000181 0.005291 -3.717507 -1.401618 -10.386041 -10.535308 -1.876086 -0.315545 -4.133865 0.290852 5.801797 7.669555 -0.510111 -1.644360 -0.598475 0.414989 0.683614 0.919604 -3.555612 3.396724 -6.631464 0.657284 1.154052 -10.195419 -0.001599 0.001339 0.000774 0.001399 -0.000226 0.000777 -0.001495 0.000269 -7.235599 9.486484 -0.396776 8.910303 -2.966496 -2.763139 9.091188 -1.015279 -0.458644 -6.139033 -0.803745 5.939077 -3.935667 -1.818337 -0.590054 0.539082 0.400044 5.692380 3.342744 -11.723535 -3.231145 4.767195 14.096074 13.260607 9.858614 1.103557 0.491732 -9.981672 -0.711702 -20.189520 -7.925806 -1.030026 2.792417 1.036363 -2.034916 -20.927698 -18.651727 3.963015 -2.042399 -7.982805 2.229335 2.565283 0.914523 -0.082404 -23.220493 -1.202059 -0.201298 -0.002105 9.263972 -1.971349 32.797182 -16.285379 8.813346 -0.395791 4.013411 -8.068663 32.066041 0.000672 -0.050199 0.046881 -9.304790 -1.437237 10.772981 1.251890 -0.246234 -0.007620 -3.175290 5.844563 -25.981247 -9.731263 -0.675695 -5.218436 2.886290 6.714830 -25.778162 -0.000978 -0.021388 0.069804 -0.007872 0.000003 -0.000041 +0.688600 78.202900 -35.993200 -80.002128 0.161498 6.578579 -0.002184 -0.000181 0.005288 -3.742087 -1.419186 -10.440089 -10.514337 -1.879222 -0.342677 -4.106696 0.300250 5.809032 7.662551 -0.509878 -1.637427 -0.584486 0.416143 0.673670 0.862774 -3.544066 3.388233 -6.715379 0.655592 1.155015 -10.195414 -0.001599 0.001339 0.000779 0.001397 -0.000217 0.000778 -0.001501 0.000276 -7.192633 9.499188 -0.403302 9.003236 -2.942479 -2.750908 8.890009 -0.992075 -0.450215 -6.104568 -0.841758 5.923643 -3.900960 -1.822805 -0.588952 0.538249 0.398123 5.678563 3.378915 -11.710703 -3.223891 4.621289 14.056651 13.286349 10.032044 1.123684 0.498662 -10.111024 -0.711158 -20.201101 -7.870614 -1.020759 2.772413 1.036666 -2.036990 -20.941519 -18.651310 3.786600 -2.235110 -7.981652 2.507823 2.729381 0.865181 -0.107460 -23.326481 -1.188256 -0.198986 -0.002051 9.281642 -1.937995 32.839679 -16.257165 8.820690 -0.407106 4.038260 -8.043718 32.107104 0.011479 -0.030081 0.099857 -9.305479 -1.449138 10.695666 1.265620 -0.248936 -0.007675 -3.192210 5.830844 -25.958124 -9.718908 -0.627804 -5.211298 2.890216 6.731386 -25.758720 0.001684 -0.010024 0.124978 -0.007870 0.000003 -0.000040 +0.688600 78.202900 -36.011500 -80.024581 0.172977 6.627544 -0.002178 -0.000180 0.005291 -3.766669 -1.436730 -10.494130 -10.493378 -1.882368 -0.369806 -4.100405 0.307527 5.816366 7.669549 -0.510093 -1.630371 -0.668514 0.422011 0.704799 0.810555 -3.611530 3.389835 -6.709189 0.695592 1.134536 -10.195417 -0.001600 0.001340 0.000774 0.001398 -0.000219 0.000772 -0.001500 0.000276 -7.150104 9.497922 -0.409964 8.811881 -2.868643 -2.758783 9.146699 -1.021685 -0.460951 -6.230990 -0.877560 5.905807 -3.876570 -1.797735 -0.588183 0.537415 0.396201 5.664729 3.429252 -11.698156 -3.227884 4.587270 14.069369 13.275557 10.018168 1.122071 0.498112 -10.170637 -0.689728 -20.202798 -7.813105 -1.025303 2.766447 1.036959 -2.039059 -20.955328 -18.622962 3.622480 -2.445737 -7.977992 2.720513 2.829149 0.864106 -0.111842 -23.339740 -1.174463 -0.196676 -0.002009 9.254123 -1.970334 32.796676 -16.228950 8.828034 -0.397456 4.009617 -8.074990 32.050017 -0.006585 -0.049139 0.053499 -9.305766 -1.447332 10.658038 1.279339 -0.251636 -0.007724 -3.209734 5.816597 -25.976876 -9.708900 -0.600764 -5.204196 2.887571 6.716600 -25.784948 0.001994 -0.006168 0.071853 -0.007869 0.000003 -0.000039 +0.688600 78.196800 -36.048100 -80.026200 0.186873 6.676557 -0.002178 -0.000181 0.005290 -3.766295 -1.434755 -10.529720 -10.472379 -1.884012 -0.383025 -4.092000 0.293958 5.822549 7.676536 -0.510305 -1.623312 -0.654394 0.411354 0.713552 0.754023 -3.604924 3.386246 -6.821092 0.693375 1.135890 -10.195423 -0.001598 0.001339 0.000775 0.001399 -0.000224 0.000777 -0.001497 0.000268 -7.128975 9.497099 -0.399282 8.905542 -2.836940 -2.767405 8.938559 -0.997673 -0.452255 -6.189546 -0.915688 5.890516 -3.840980 -1.795270 -0.608050 0.536585 0.394279 5.650896 3.479588 -11.685599 -3.231886 4.526071 14.072825 13.269731 10.052875 1.126103 0.499499 -10.260673 -0.675238 -20.202899 -7.755593 -1.029852 2.760481 1.036959 -2.039061 -20.955345 -18.610433 3.432054 -2.677711 -7.986224 2.886190 2.862014 0.812692 -0.145027 -23.383808 -1.160666 -0.194366 -0.001962 9.285928 -1.953875 32.784071 -16.221967 8.835116 -0.384534 4.033322 -8.027650 32.037839 0.006688 -0.001744 0.097448 -9.306500 -1.459228 10.580734 1.293073 -0.254337 -0.007781 -3.222291 5.783576 -25.954014 -9.698844 -0.573729 -5.197096 2.905518 6.728298 -25.758469 0.004675 0.005190 0.127020 -0.007869 0.000003 -0.000038 +0.688600 78.209000 -36.066400 -80.025387 0.179932 6.725559 -0.002177 -0.000181 0.005291 -3.786563 -1.428941 -10.565840 -10.465400 -1.885567 -0.396704 -4.064046 0.295661 5.843354 7.662116 -0.523812 -1.595450 -0.640471 0.416942 0.709023 0.663930 -3.625086 3.405229 -6.877263 0.703759 1.111062 -10.195431 -0.001599 0.001338 0.000775 0.001399 -0.000229 0.000772 -0.001497 0.000259 -7.107836 9.496264 -0.388606 8.712440 -2.786014 -2.757657 9.188311 -1.026489 -0.462679 -6.315942 -0.948538 5.893303 -3.803591 -1.778935 -0.606884 0.535756 0.392360 5.637080 3.516227 -11.658804 -3.224371 4.468454 14.063568 13.279364 10.087552 1.130127 0.500867 -10.350713 -0.660749 -20.202981 -7.687746 -1.011401 2.754697 1.036962 -2.039058 -20.955329 -18.598709 3.241582 -2.909598 -7.990052 2.963321 2.814207 0.805877 -0.143489 -23.405936 -1.146870 -0.192056 -0.001911 9.258168 -1.986044 32.755064 -16.215176 8.856193 -0.392579 4.006079 -8.060483 32.009668 -0.011370 -0.020799 0.051111 -9.306617 -1.452859 10.556325 1.293068 -0.254336 -0.007779 -3.235567 5.749942 -25.980084 -9.686516 -0.525828 -5.189990 2.887561 6.716604 -25.784944 0.003255 0.000322 0.069566 -0.007873 0.000003 -0.000039 +0.688600 78.215100 -36.090900 -80.045399 0.170515 6.774549 -0.002181 -0.000181 0.005291 -3.811015 -1.445465 -10.612970 -10.458526 -1.902538 -0.422786 -4.056970 0.295234 5.864269 7.647693 -0.537325 -1.567592 -0.598561 0.422875 0.704290 0.622533 -3.637412 3.392679 -6.968229 0.704873 1.105805 -10.195419 -0.001597 0.001338 0.000775 0.001398 -0.000220 0.000775 -0.001501 0.000269 -7.065243 9.495122 -0.402265 8.805719 -2.758677 -2.760985 9.001021 -1.004873 -0.454874 -6.274508 -0.986676 5.878065 -3.766198 -1.762602 -0.605728 0.534919 0.390439 5.623254 3.646828 -11.600056 -3.198212 4.376488 14.025205 13.281726 9.948798 1.114021 0.495354 -10.311864 -0.648704 -20.205436 -7.619908 -0.992958 2.748893 1.036963 -2.039062 -20.955338 -18.587757 3.051060 -3.141403 -7.991997 3.003082 2.722412 0.758578 -0.159767 -23.507626 -1.133068 -0.189746 -0.001866 9.267042 -1.941833 32.797008 -16.187118 8.877521 -0.403890 4.029507 -8.033922 32.043914 0.006317 0.000482 0.104073 -9.307316 -1.462470 10.485633 1.293075 -0.254337 -0.007778 -3.258429 5.739968 -25.956324 -9.675725 -0.491837 -5.182894 2.890215 6.731386 -25.758721 0.005431 0.009451 0.118122 -0.007869 0.000003 -0.000038 +0.688600 78.215100 -36.121400 -80.054000 0.183578 6.823546 -0.002183 -0.000181 0.005291 -3.812282 -1.452231 -10.661472 -10.430648 -1.919674 -0.448168 -4.049905 0.294808 5.885189 7.634130 -0.522905 -1.560743 -0.661375 0.411266 0.713601 0.679088 -3.644008 3.386407 -7.045213 0.706259 1.100372 -10.195413 -0.001599 0.001339 0.000774 0.001397 -0.000226 0.000776 -0.001498 0.000269 -7.043905 9.494575 -0.412600 8.641598 -2.696614 -2.765671 9.236880 -1.032096 -0.464687 -6.393968 -1.022482 5.860026 -3.749634 -1.743584 -0.619214 0.534092 0.388517 5.609423 3.690006 -11.587252 -3.203673 4.323275 14.026733 13.279771 9.969620 1.116436 0.496176 -10.389910 -0.644214 -20.204376 -7.552070 -0.974521 2.743064 1.036960 -2.039060 -20.955331 -18.575707 2.892672 -3.346341 -7.978801 3.020749 2.613568 0.749147 -0.168743 -23.496549 -1.098575 -0.183969 -0.001749 9.243915 -1.979587 32.754305 -16.158800 8.877867 -0.401266 3.996377 -8.060194 31.988412 -0.011744 -0.018578 0.057724 -9.321115 -1.446807 10.487438 1.293065 -0.254336 -0.007780 -3.270418 5.721625 -26.003686 -9.664939 -0.457843 -5.175808 2.892670 6.723705 -25.812144 0.005743 0.013307 0.064997 -0.007870 0.000003 -0.000040 +0.688600 78.209000 -36.133600 -80.062612 0.196628 6.872494 -0.002189 -0.000181 0.005291 -3.813014 -1.456098 -10.689194 -10.416681 -1.921293 -0.461610 -4.042943 0.295526 5.885154 7.633915 -0.529888 -1.553742 -0.633384 0.409644 0.733086 0.596550 -3.673645 3.415684 -7.059538 0.723218 1.062281 -10.195407 -0.001596 0.001339 0.000776 0.001396 -0.000210 0.000776 -0.001497 0.000263 -7.022578 9.494031 -0.422932 8.726510 -2.688415 -2.767471 9.070373 -1.012877 -0.457772 -6.359552 -1.060542 5.844719 -3.720975 -1.740240 -0.632330 0.533255 0.386596 5.595597 3.733178 -11.574446 -3.209152 4.270077 14.028263 13.277810 9.990419 1.118850 0.497009 -10.467961 -0.639725 -20.203312 -7.511818 -0.960703 2.736748 1.038581 -2.050462 -21.031353 -18.564350 2.731536 -3.526137 -7.965553 3.038391 2.504719 0.709266 -0.184065 -23.525260 -1.091674 -0.182814 -0.001736 9.250615 -1.965491 32.740478 -16.151726 8.877954 -0.395370 4.009542 -8.022155 31.974745 -0.002412 0.010148 0.092935 -9.335954 -1.460822 10.403269 1.293073 -0.254338 -0.007778 -3.280990 5.704521 -25.953296 -9.654156 -0.423845 -5.168726 2.898713 6.719456 -25.768647 0.007430 0.020205 0.106947 -0.007870 0.000003 -0.000040 +0.688600 78.221200 -36.151900 -80.067882 0.181905 6.900532 -0.002182 -0.000181 0.005289 -3.834367 -1.456066 -10.717433 -10.402695 -1.922914 -0.475052 -4.035911 0.295483 5.899083 7.633693 -0.536843 -1.525758 -0.605639 0.429684 0.734859 0.575267 -3.669949 3.419260 -7.122302 0.712174 1.050948 -10.195410 -0.001599 0.001338 0.000775 0.001399 -0.000224 0.000772 -0.001501 0.000278 -7.001018 9.507193 -0.412121 8.582325 -2.642022 -2.764373 9.278493 -1.036904 -0.466413 -6.464985 -1.092639 5.854516 -3.689618 -1.716086 -0.631380 0.532422 0.384679 5.581778 3.762187 -11.561378 -3.203369 4.232821 14.025960 13.283698 10.011240 1.121267 0.497836 -10.526287 -0.642950 -20.222816 -7.471570 -0.946890 2.730424 1.038729 -2.051499 -21.038267 -18.551429 2.602526 -3.679086 -7.964125 3.005047 2.394890 0.709271 -0.184069 -23.525262 -1.084779 -0.181658 -0.001710 9.224675 -1.977818 32.725321 -16.144644 8.878038 -0.389463 3.987563 -8.050324 31.947339 -0.009643 0.010923 0.055324 -9.328709 -1.454059 10.423225 1.293071 -0.254336 -0.007779 -3.292986 5.686182 -26.000674 -9.645676 -0.410705 -5.175668 2.892667 6.723701 -25.812130 0.007470 0.022033 0.069326 -0.007870 0.000003 -0.000040 +0.688600 78.221200 -36.176300 -80.074827 0.181065 6.928528 -0.002183 -0.000181 0.005291 -3.835099 -1.459930 -10.745142 -10.388703 -1.924540 -0.488488 -4.028876 0.295443 5.913018 7.619918 -0.529400 -1.497919 -0.577586 0.424628 0.739077 0.555163 -3.685980 3.403103 -7.164089 0.701527 1.039341 -10.195413 -0.001598 0.001339 0.000776 0.001397 -0.000217 0.000778 -0.001498 0.000275 -6.979444 9.520338 -0.401313 8.653227 -2.632821 -2.767016 9.153626 -1.022486 -0.461241 -6.444554 -1.130491 5.838975 -3.660061 -1.705805 -0.630499 0.531587 0.382759 5.567954 3.791198 -11.548317 -3.197593 4.201946 14.008476 13.274949 10.032044 1.123683 0.498664 -10.587854 -0.659627 -20.240414 -7.410607 -0.929625 2.724429 1.038873 -2.052533 -21.045158 -18.549612 2.522621 -3.791172 -7.962753 2.971696 2.285063 0.707639 -0.190633 -23.545115 -1.077870 -0.180502 -0.001689 9.233687 -1.988842 32.711890 -16.137575 8.878135 -0.397557 3.986097 -8.048676 31.940471 -0.015437 0.003233 0.057586 -9.322201 -1.467852 10.383674 1.293071 -0.254338 -0.007777 -3.296445 5.680541 -25.979208 -9.637199 -0.397566 -5.182611 2.884496 6.724345 -25.797814 0.009968 0.035017 0.064756 -0.007872 0.000003 -0.000039 +0.688600 78.227300 -36.182400 -80.081767 0.180219 6.928528 -0.002187 -0.000180 0.005292 -3.835289 -1.460896 -10.752081 -10.388733 -1.926047 -0.502398 -4.021839 0.295404 5.926953 7.606140 -0.521997 -1.498060 -0.577536 0.419214 0.743503 0.535612 -3.711896 3.396865 -7.205870 0.690883 1.027729 -10.195406 -0.001598 0.001339 0.000774 0.001399 -0.000217 0.000773 -0.001498 0.000263 -6.979547 9.513552 -0.415391 8.535569 -2.610146 -2.779908 9.347869 -1.044926 -0.469269 -6.542819 -1.150756 5.832998 -3.630509 -1.695525 -0.629626 0.530751 0.380836 5.554122 3.820197 -11.535263 -3.191838 4.171061 13.991002 13.266172 10.073674 1.128517 0.500329 -10.648747 -0.673470 -20.237249 -7.373828 -0.895126 2.718022 1.039020 -2.053569 -21.052071 -18.546305 2.467692 -3.845990 -7.959679 2.893684 2.237775 0.705992 -0.197187 -23.565001 -1.091669 -0.182812 -0.001733 9.233700 -1.988838 32.711886 -16.130486 8.878215 -0.405641 3.984625 -8.047034 31.933627 -0.021238 -0.004460 0.059830 -9.336421 -1.454924 10.334631 1.293071 -0.254338 -0.007778 -3.299899 5.674900 -25.957779 -9.628709 -0.384428 -5.168554 2.876297 6.725005 -25.783501 0.009180 0.028926 0.111275 -0.007871 0.000003 -0.000040 +0.688600 78.239500 -36.188500 -80.074823 0.181063 6.928509 -0.002182 -0.000181 0.005292 -3.835468 -1.461861 -10.759003 -10.388841 -1.939200 -0.493939 -4.014809 0.295365 5.940884 7.606334 -0.514977 -1.477083 -0.556631 0.424900 0.738923 0.515770 -3.732905 3.425222 -7.226897 0.692113 0.990350 -10.195417 -0.001598 0.001339 0.000773 0.001397 -0.000219 0.000773 -0.001499 0.000271 -6.979753 9.506563 -0.415460 8.599507 -2.600469 -2.782971 9.257692 -1.034505 -0.465552 -6.543150 -1.172505 5.828976 -3.600953 -1.685244 -0.628750 0.529914 0.378916 5.540302 3.849205 -11.522190 -3.186077 4.133811 13.988699 13.272035 10.115303 1.133355 0.501972 -10.709638 -0.687317 -20.234090 -7.337021 -0.860627 2.711588 1.040475 -2.063939 -21.121190 -18.546286 2.467692 -3.845991 -7.955833 2.791232 2.044103 0.677645 -0.195171 -23.644684 -1.084779 -0.181658 -0.001712 9.229914 -1.962749 32.802369 -16.123411 8.878304 -0.399742 3.985939 -8.048495 32.028915 -0.004661 0.023352 0.110546 -9.350156 -1.443556 10.345321 1.279351 -0.251638 -0.007726 -3.303660 5.668987 -25.957280 -9.620222 -0.371288 -5.168499 2.868130 6.725657 -25.769221 0.006236 0.015538 0.071617 -0.007872 0.000003 -0.000039 +0.688600 78.233400 -36.194600 -80.067882 0.181905 6.928461 -0.002186 -0.000180 0.005293 -3.835656 -1.462829 -10.765939 -10.388950 -1.952353 -0.485482 -4.028643 0.293154 5.954920 7.606136 -0.521942 -1.456092 -0.535704 0.430584 0.734339 0.516654 -3.747722 3.430215 -7.247756 0.684741 0.972105 -10.195415 -0.001598 0.001339 0.000778 0.001400 -0.000224 0.000779 -0.001499 0.000276 -6.979109 9.527544 -0.415256 8.495830 -2.578763 -2.795053 9.451938 -1.056957 -0.473549 -6.641427 -1.192752 5.822925 -3.592218 -1.672271 -0.628497 0.529910 0.378920 5.540299 3.878214 -11.509119 -3.180319 4.103184 13.967808 13.278451 10.156910 1.138188 0.503617 -10.771443 -0.704919 -20.258686 -7.300217 -0.826133 2.705133 1.040617 -2.064976 -21.128121 -18.546276 2.467691 -3.845989 -7.952829 2.705062 1.948047 0.674813 -0.177744 -23.531972 -1.105473 -0.185124 -0.001776 9.253715 -1.991129 32.691959 -16.116338 8.878391 -0.393837 3.984632 -8.047036 31.933648 0.017942 0.015591 0.055314 -9.342944 -1.432468 10.356389 1.265619 -0.248936 -0.007667 -3.307418 5.663087 -25.956787 -9.614809 -0.385957 -5.168468 2.888847 6.718382 -25.791757 0.006238 0.015539 0.071618 -0.007868 0.000003 -0.000040 +0.688600 78.233400 -36.200700 -80.060936 0.182750 6.928461 -0.002181 -0.000181 0.005291 -3.835837 -1.463795 -10.772870 -10.388895 -1.944649 -0.479281 -4.042478 0.290942 5.968959 7.605929 -0.528934 -1.456084 -0.542881 0.444762 0.740799 0.516963 -3.752655 3.425284 -7.240547 0.672105 0.966275 -10.195418 -0.030519 -0.018324 0.000779 0.001399 -0.000214 0.000777 -0.001496 0.000271 -6.979109 9.527536 -0.415257 8.559753 -2.569101 -2.798145 9.382570 -1.048937 -0.470700 -6.655747 -1.214282 5.818606 -3.569605 -1.661090 -0.627843 0.529913 0.378916 5.540303 3.870850 -11.515883 -3.181830 4.086136 13.951576 13.282417 10.198546 1.143028 0.505263 -10.832573 -0.719681 -20.262487 -7.287557 -0.816935 2.698322 1.041482 -2.071195 -21.169551 -18.546282 2.467691 -3.845989 -7.949966 2.618886 1.852001 0.669051 -0.171949 -23.562998 -1.126161 -0.188588 -0.001851 9.273764 -1.982911 32.734832 -16.109242 8.878475 -0.401920 3.993439 -8.056907 31.974735 0.037534 0.025608 0.053054 -9.335835 -1.434602 10.372013 1.251889 -0.246233 -0.007623 -3.284266 5.673326 -25.959526 -9.609389 -0.400629 -5.168425 2.892668 6.723706 -25.812140 0.006234 0.015539 0.071616 -0.007872 0.000003 -0.000040 +0.688600 78.239500 -36.188500 -80.051466 0.162760 6.907443 -0.002179 -0.000181 0.005291 -3.836022 -1.464761 -10.779794 -10.388833 -1.938447 -0.486984 -4.042401 0.290182 5.982930 7.606135 -0.521942 -1.456092 -0.549864 0.442694 0.760537 0.518411 -3.777353 3.440197 -7.233057 0.642568 0.929830 -10.195420 -0.001598 0.001338 0.000775 0.001398 -0.000219 0.000772 -0.001497 0.000266 -6.979111 9.527536 -0.415256 8.468956 -2.561514 -2.793150 9.555994 -1.068998 -0.477797 -6.754015 -1.234514 5.812477 -3.546979 -1.649912 -0.627186 0.529918 0.378918 5.540294 3.914233 -11.496082 -3.187223 3.960532 13.898160 13.305882 10.344226 1.159965 0.510993 -10.934493 -0.724599 -20.266802 -7.245006 -0.774396 2.712901 1.041916 -2.074308 -21.190298 -18.546298 2.467693 -3.845989 -7.947250 2.532705 1.755964 0.726546 -0.172698 -23.567312 -1.215850 -0.203606 -0.002151 9.307369 -1.991220 32.757618 -16.123399 8.878305 -0.406730 4.002254 -8.066758 32.015818 -0.001647 0.005576 0.057578 -9.328741 -1.436741 10.387643 1.217581 -0.239484 -0.007484 -3.261110 5.683569 -25.962295 -9.603968 -0.415298 -5.168387 2.892667 6.723709 -25.812144 0.033707 0.010172 0.071375 -0.007872 0.000003 -0.000038 +0.688600 78.251700 -36.188500 -80.043685 0.156657 6.886457 -0.002179 -0.000181 0.005292 -3.835467 -1.461863 -10.759008 -10.402778 -1.932127 -0.495161 -4.042322 0.289422 5.996893 7.606330 -0.514932 -1.442111 -0.535984 0.451735 0.771259 0.582573 -3.793360 3.434563 -7.274384 0.603626 0.913054 -10.195423 -0.001599 0.001339 0.000777 0.001399 -0.000222 0.000776 -0.001499 0.000268 -6.979110 9.527535 -0.415257 8.516783 -2.580269 -2.793919 9.549055 -1.068192 -0.477517 -6.795998 -1.234829 5.804648 -3.524360 -1.638728 -0.626537 0.529076 0.376998 5.526474 3.936388 -11.475905 -3.175696 4.038458 13.914379 13.292734 10.198553 1.143029 0.505261 -10.892310 -0.728651 -20.274194 -7.233506 -0.758298 2.706064 1.042347 -2.077418 -21.211033 -18.546286 2.467691 -3.845989 -7.944687 2.446520 1.659940 0.731405 -0.153291 -23.551971 -1.243439 -0.208226 -0.002254 9.323790 -1.978079 32.751321 -16.137568 8.878139 -0.411537 4.002248 -8.066760 32.015812 0.031739 0.017915 0.055311 -9.342514 -1.425383 10.398358 1.183269 -0.232734 -0.007340 -3.237954 5.693804 -25.965048 -9.597015 -0.416065 -5.168333 2.892677 6.723702 -25.812140 0.047410 0.007497 0.071269 -0.007867 0.000003 -0.000041 +0.688600 78.245600 -36.182400 -80.035900 0.150553 6.865440 -0.002178 -0.000181 0.005291 -3.835283 -1.460896 -10.752080 -10.416875 -1.943656 -0.473271 -4.063186 0.287229 5.996992 7.606518 -0.507922 -1.428128 -0.535942 0.447308 0.765843 0.583726 -3.813106 3.424738 -7.253401 0.603323 0.897204 -10.195414 -0.001597 0.001340 0.000775 0.001398 -0.000215 0.000775 -0.001498 0.000266 -6.993283 9.527945 -0.413036 8.508727 -2.595010 -2.797674 9.632291 -1.077829 -0.480898 -6.879936 -1.232545 5.809767 -3.501758 -1.627549 -0.625895 0.529074 0.376999 5.526479 3.957496 -11.483459 -3.178764 3.964597 13.867127 13.297875 10.316471 1.156738 0.509902 -10.989505 -0.743797 -20.291367 -7.203598 -0.724956 2.699457 1.042780 -2.080531 -21.231751 -18.546286 2.467692 -3.845989 -7.941888 2.348144 1.580988 0.792729 -0.138698 -23.510003 -1.340013 -0.224395 -0.002616 9.362242 -1.992119 32.746420 -16.137567 8.878127 -0.397556 4.002254 -8.066757 32.015805 -0.000549 -0.000953 0.059828 -9.286307 -1.414910 10.410235 1.100916 -0.216531 -0.006990 -3.214390 5.704399 -25.939877 -9.578440 -0.439218 -5.168191 2.892671 6.723706 -25.812144 0.006238 0.015538 0.071613 -0.007875 0.000004 -0.000039 +0.688600 78.251700 -36.170200 -80.028119 0.144447 6.844451 -0.002179 -0.000181 0.005291 -3.835109 -1.459928 -10.745144 -10.430862 -1.942784 -0.466789 -4.085521 0.298929 5.997871 7.606713 -0.500913 -1.414148 -0.535866 0.442882 0.760427 0.585500 -3.842743 3.444612 -7.218419 0.603230 0.881210 -10.195415 -0.001597 0.001339 0.000775 0.001397 -0.000219 0.000775 -0.001495 0.000261 -6.993286 9.527953 -0.413037 8.417589 -2.592859 -2.797132 9.826540 -1.100342 -0.488745 -6.998829 -1.229724 5.814126 -3.479137 -1.616370 -0.625252 0.529081 0.376998 5.526474 3.950075 -11.490124 -3.187277 3.956566 13.823820 13.312693 10.385823 1.164803 0.512613 -11.052727 -0.767132 -20.308125 -7.187490 -0.693914 2.692663 1.043209 -2.083640 -21.252475 -18.546294 2.467691 -3.845990 -7.939917 2.274961 1.502876 0.786525 -0.134673 -23.481280 -1.381417 -0.231328 -0.002782 9.387471 -1.989859 32.740672 -16.137560 8.878131 -0.404548 4.002252 -8.066756 32.015808 0.038634 0.019078 0.055310 -9.286064 -1.403729 10.421176 1.066598 -0.209779 -0.006835 -3.191137 5.714741 -25.935661 -9.559885 -0.462373 -5.168050 2.892671 6.723704 -25.812137 0.017469 -0.000126 0.076063 -0.007871 0.000004 -0.000039 +0.688600 78.257800 -36.170200 -80.020347 0.138331 6.823432 -0.002178 -0.000181 0.005290 -3.834369 -1.456066 -10.717435 -10.444844 -1.941919 -0.460305 -4.093938 0.312090 5.998678 7.606522 -0.507923 -1.428128 -0.536134 0.462565 0.762407 0.607679 -3.861250 3.455988 -7.162077 0.577932 0.853518 -10.195410 -0.001598 0.001338 0.000776 0.001397 -0.000219 0.000777 -0.001497 0.000263 -7.028726 9.529016 -0.407461 8.500314 -2.614124 -2.795989 9.805722 -1.097924 -0.487909 -7.040795 -1.228108 5.820163 -3.456527 -1.605191 -0.624618 0.529077 0.376999 5.526481 3.979135 -11.477153 -3.174533 3.866130 13.777734 13.335006 10.496840 1.177728 0.516942 -11.130784 -0.762502 -20.307247 -7.157588 -0.660574 2.707006 1.043634 -2.086751 -21.273225 -18.546293 2.467691 -3.845987 -7.938346 2.213160 1.432909 0.859164 -0.132446 -23.509994 -1.498692 -0.250963 -0.003274 9.420511 -1.997768 32.798401 -16.137568 8.878140 -0.411545 4.019881 -8.086460 32.097969 0.006346 0.000208 0.059818 -9.250830 -1.401626 10.450486 0.984251 -0.193579 -0.006447 -3.167884 5.725081 -25.931460 -9.541322 -0.485526 -5.167903 2.896500 6.729026 -25.832528 0.001242 -0.010431 0.080742 -0.007870 0.000003 -0.000040 +0.688600 78.264000 -36.158000 -80.012570 0.132218 6.781472 -0.002178 -0.000181 0.005290 -3.819892 -1.454796 -10.689355 -10.458826 -1.941053 -0.453825 -4.100162 0.304412 5.998330 7.606325 -0.514932 -1.442110 -0.557365 0.481967 0.764558 0.712661 -3.854987 3.453225 -7.175460 0.537221 0.858428 -10.195417 -0.001599 0.001340 0.000773 0.001398 -0.000227 0.000775 -0.001497 0.000259 -7.042913 9.529439 -0.405228 8.464319 -2.626859 -2.801270 9.965287 -1.116427 -0.494305 -7.180255 -1.197274 5.820254 -3.408859 -1.618411 -0.623275 0.530746 0.380837 5.554120 3.972517 -11.463051 -3.168597 3.927255 13.774339 13.341157 10.441349 1.171266 0.514785 -11.122351 -0.757413 -20.308092 -7.150690 -0.659426 2.700086 1.044060 -2.089863 -21.293957 -18.546288 2.467692 -3.845992 -7.937246 2.168432 1.375154 0.854549 -0.122010 -23.483481 -1.540085 -0.257893 -0.003455 9.456609 -1.986666 32.793132 -16.137299 8.857146 -0.404594 4.021364 -8.088099 32.104843 0.039737 0.012550 0.057574 -9.250572 -1.399108 10.479213 0.943070 -0.185477 -0.006245 -3.144633 5.735422 -25.927250 -9.543628 -0.506383 -5.181903 2.900322 6.734344 -25.852900 0.023094 -0.007961 0.078294 -0.007872 0.000003 -0.000041 +0.688600 78.270100 -36.151900 -80.004804 0.126093 6.739496 -0.002178 -0.000181 0.005291 -3.805406 -1.453522 -10.661286 -10.458717 -1.926391 -0.448375 -4.127258 0.294544 5.998085 7.606524 -0.507932 -1.435124 -0.557245 0.472127 0.763569 0.734808 -3.873495 3.464612 -7.098365 0.528482 0.845590 -10.195408 -0.001600 0.001340 0.000776 0.001397 -0.000215 0.000778 -0.001500 0.000269 -7.057091 9.529868 -0.402997 8.484208 -2.643610 -2.803509 10.055475 -1.126897 -0.497897 -7.291741 -1.166878 5.821010 -3.361169 -1.631630 -0.621926 0.531164 0.381799 5.561041 4.000873 -11.471042 -3.156302 3.812138 13.710424 13.378497 10.600885 1.189847 0.520981 -11.224054 -0.761313 -20.305562 -7.120776 -0.626087 2.693428 1.044482 -2.092973 -21.314679 -18.546300 2.467692 -3.845988 -7.937236 2.168433 1.375155 0.935613 -0.114885 -23.492333 -1.671149 -0.279834 -0.004071 9.505168 -1.991308 32.837593 -16.151540 8.863968 -0.395400 4.034615 -8.102856 32.166472 0.007442 -0.006322 0.062076 -9.208338 -1.397041 10.508633 0.853859 -0.167926 -0.005788 -3.106345 5.769404 -25.925052 -9.525063 -0.529544 -5.195726 2.904157 6.739664 -25.873300 0.003731 0.002555 0.076180 -0.007873 0.000003 -0.000042 +0.688600 78.276200 -36.151900 -79.976195 0.122421 6.711414 -0.002184 -0.000181 0.005292 -3.790934 -1.452242 -10.633232 -10.458597 -1.910224 -0.429014 -4.155889 0.299331 5.984645 7.606729 -0.500958 -1.449120 -0.493931 0.445405 0.740414 0.720522 -3.869429 3.498262 -7.021307 0.519726 0.832767 -10.195415 -0.001599 0.001339 0.000776 0.001400 -0.000224 0.000776 -0.001497 0.000258 -7.071272 9.530278 -0.400772 8.390894 -2.669827 -2.790161 10.319076 -1.157527 -0.508300 -7.466126 -1.131674 5.848266 -3.341240 -1.641252 -0.600369 0.532837 0.385640 5.588689 4.014858 -11.478374 -3.160731 3.854641 13.677524 13.370014 10.545399 1.183381 0.518821 -11.213990 -0.749493 -20.307366 -7.108112 -0.616889 2.707556 1.044910 -2.096089 -21.335426 -18.546288 2.467692 -3.845991 -7.935764 2.105824 1.330401 0.933232 -0.095416 -23.395141 -1.719441 -0.287918 -0.004311 9.535709 -1.995053 32.776244 -16.151277 8.842985 -0.409432 4.024306 -8.091386 32.118534 0.047725 0.007182 0.059821 -9.207991 -1.381297 10.532821 0.798960 -0.157128 -0.005492 -3.079337 5.785662 -25.921386 -9.506522 -0.552705 -5.188553 2.904151 6.739662 -25.873283 0.021838 -0.014450 0.080577 -0.007871 0.000003 -0.000041 +0.688600 78.282300 -36.139700 -79.961487 0.117107 6.683417 -0.002187 -0.000181 0.005291 -3.790209 -1.448376 -10.605510 -10.479464 -1.893901 -0.410351 -4.184528 0.304123 5.971205 7.592952 -0.493583 -1.463242 -0.494006 0.450820 0.735987 0.734788 -3.873518 3.504171 -6.944226 0.510951 0.819953 -10.195426 -0.001599 0.001340 0.000777 0.001398 -0.000221 0.000777 -0.001499 0.000266 -7.085448 9.530697 -0.398545 8.465221 -2.708068 -2.767567 10.339892 -1.159944 -0.509118 -7.563617 -1.100574 5.856345 -3.300495 -1.653553 -0.578219 0.534509 0.389478 5.616335 4.008130 -11.464081 -3.168809 3.823030 13.636491 13.388043 10.670255 1.197926 0.523642 -11.290416 -0.738128 -20.307406 -7.095464 -0.607690 2.721678 1.045327 -2.099197 -21.356151 -18.546288 2.467692 -3.845989 -7.935762 2.105824 1.330401 1.013174 -0.092725 -23.439394 -1.850528 -0.309862 -0.004995 9.580297 -1.984062 32.855303 -16.151348 8.849982 -0.409416 4.044934 -8.114325 32.214416 0.008542 -0.012853 0.064324 -9.165372 -1.367771 10.595275 0.702874 -0.138226 -0.004950 -3.033332 5.805902 -25.947931 -9.489483 -0.589771 -5.181389 2.910544 6.748523 -25.907263 -0.001249 -0.023417 0.085310 -0.007871 0.000003 -0.000039 +0.707000 78.282300 -36.133600 -79.943607 0.107557 6.642057 -0.002186 -0.000181 0.005289 -3.778685 -1.438682 -10.577868 -10.489679 -1.896936 -0.398437 -4.209143 0.302032 5.945581 7.573660 -0.494685 -1.474562 -0.501604 0.452963 0.733550 0.772342 -3.873510 3.493322 -6.899824 0.482905 0.821036 -10.216131 -0.000007 -0.000007 0.000776 0.001399 -0.000224 0.000776 -0.001497 0.000263 -7.092103 9.544249 -0.396233 8.392585 -2.725836 -2.774207 10.557248 -1.184736 -0.519964 -7.756143 -1.057133 5.879063 -3.259262 -1.671196 -0.575444 0.526504 0.382195 5.632583 4.044346 -11.455123 -3.152850 3.732814 13.556497 13.430180 10.810693 1.214303 0.529035 -11.373794 -0.731549 -20.315144 -7.072019 -0.588137 2.712619 1.045779 -2.091931 -21.361480 -18.541542 2.468678 -3.849776 -7.929164 2.106616 1.327197 1.021198 -0.078160 -23.400435 -1.905423 -0.319050 -0.005300 9.610491 -1.990577 32.864743 -16.152530 8.835341 -0.411233 4.044247 -8.105759 32.232025 0.047974 -0.002997 0.047652 -9.166479 -1.360828 10.615790 0.656934 -0.129190 -0.004672 -2.990116 5.819185 -25.927051 -9.480945 -0.614534 -5.197067 2.907404 6.743847 -25.900972 0.021949 -0.033460 0.084177 -0.007872 0.000003 -0.000040 +0.707000 78.282300 -36.133600 -79.943603 0.107554 6.600072 -0.002179 -0.000181 0.005291 -3.777784 -1.433850 -10.543232 -10.489674 -1.895427 -0.384528 -4.230094 0.300620 5.931725 7.573665 -0.494712 -1.495544 -0.480616 0.453232 0.733385 0.772339 -3.873507 3.493322 -6.899821 0.482903 0.821036 -10.160187 -0.000006 -0.000009 0.000778 0.001399 -0.000217 0.000776 -0.001497 0.000256 -7.134629 9.545505 -0.389535 8.459953 -2.764629 -2.761772 10.647424 -1.195242 -0.523450 -7.881229 -0.997014 5.889844 -3.213368 -1.698248 -0.574098 0.528173 0.386038 5.660232 4.044344 -11.455115 -3.152851 3.772526 13.526112 13.451903 10.838435 1.217541 0.530097 -11.448571 -0.713444 -20.316078 -7.030636 -0.581240 2.713044 1.046201 -2.095043 -21.382220 -18.541534 2.468678 -3.849775 -7.929171 2.106616 1.327197 1.090278 -0.060983 -23.389525 -2.036489 -0.340987 -0.006055 9.663918 -2.000899 32.881572 -16.152533 8.835338 -0.411234 4.053101 -8.115587 32.273132 0.008781 -0.023024 0.052142 -9.124006 -1.345197 10.662731 0.553996 -0.108944 -0.004038 -2.967768 5.854472 -25.944094 -9.450036 -0.653136 -5.196724 2.913800 6.752710 -25.934969 -0.005505 -0.028105 0.084384 -0.007869 0.000004 -0.000038 +0.707000 78.294500 -36.133600 -79.914209 0.096863 6.558074 -0.002180 -0.000181 0.005291 -3.756245 -1.432848 -10.508057 -10.510515 -1.872924 -0.373567 -4.251043 0.299215 5.917862 7.545704 -0.493910 -1.516778 -0.459640 0.453501 0.733220 0.785168 -3.852904 3.474428 -6.843678 0.470946 0.814825 -10.202137 -0.000007 -0.000008 0.000775 0.001397 -0.000217 0.000776 -0.001500 0.000280 -7.134628 9.545510 -0.389535 8.345694 -2.790464 -2.759647 10.959588 -1.231656 -0.535384 -8.118221 -0.935336 5.898871 -3.146630 -1.727962 -0.551119 0.529835 0.389882 5.687883 3.949765 -11.508107 -3.171705 3.880263 13.536672 13.475378 11.004929 1.236973 0.536417 -11.609830 -0.695780 -20.315132 -7.009936 -0.577791 2.713253 1.046614 -2.098154 -21.402953 -18.541527 2.468677 -3.849774 -7.929190 2.106615 1.327196 1.093541 -0.047851 -23.349782 -2.084787 -0.349070 -0.006348 9.695463 -1.984243 32.883000 -16.152279 8.814361 -0.411277 4.056062 -8.118861 32.286840 0.049077 -0.009524 0.049907 -9.123516 -1.329214 10.709020 0.485385 -0.095447 -0.003602 -2.903626 5.863735 -25.951654 -9.437655 -0.668580 -5.196580 2.916369 6.756255 -25.948577 0.020995 -0.037933 0.070944 -0.007870 0.000003 -0.000040 +0.707000 78.300600 -36.133600 -79.884818 0.086151 6.516070 -0.002184 -0.000181 0.005289 -3.734708 -1.431834 -10.472893 -10.517372 -1.850508 -0.362141 -4.292980 0.296804 5.883157 7.517746 -0.493098 -1.538011 -0.459635 0.453501 0.733220 0.797422 -3.822419 3.445604 -6.829511 0.458392 0.808969 -10.202163 -0.000006 -0.000008 0.000775 0.001398 -0.000226 0.000775 -0.001500 0.000269 -7.134629 9.545508 -0.389536 8.392090 -2.827749 -2.748338 11.008143 -1.237324 -0.537222 -8.236295 -0.872473 5.930819 -3.093766 -1.755879 -0.528527 0.531495 0.393724 5.715545 3.949764 -11.508102 -3.171705 3.717091 13.435943 13.532083 11.379517 1.280762 0.550443 -11.819075 -0.697967 -20.331668 -6.970835 -0.557092 2.713638 1.046759 -2.099190 -21.409856 -18.541551 2.468677 -3.849774 -7.929175 2.106616 1.327197 1.159494 -0.043173 -23.290148 -2.208970 -0.369853 -0.007123 9.733152 -2.008193 32.864176 -16.152274 8.814357 -0.411282 4.056053 -8.118869 32.286854 0.009898 -0.029552 0.054402 -9.060412 -1.325096 10.723194 0.313825 -0.061707 -0.002431 -2.806584 5.819802 -25.934411 -9.453083 -0.680946 -5.196763 2.918923 6.759796 -25.962154 -0.007458 -0.037025 0.057934 -0.007875 0.000003 -0.000041 +0.707000 78.300600 -36.133600 -79.883237 0.072256 6.488090 -0.002179 -0.000180 0.005292 -3.733820 -1.426996 -10.438239 -10.524352 -1.848957 -0.348457 -4.321003 0.295846 5.848371 7.503764 -0.492701 -1.559118 -0.431639 0.453858 0.732998 0.788088 -3.783302 3.405447 -6.815430 0.451572 0.790360 -10.202164 -0.000006 -0.000009 0.000778 0.001398 -0.000220 0.000777 -0.001497 0.000259 -7.170077 9.546541 -0.383957 8.396628 -2.862050 -2.739445 11.223190 -1.262455 -0.545306 -8.438325 -0.808565 5.961661 -3.040889 -1.783767 -0.505909 0.534808 0.401418 5.770841 3.971171 -11.508785 -3.167614 3.729798 13.396241 13.558524 11.372586 1.279948 0.550187 -11.818905 -0.667506 -20.321708 -6.963943 -0.555943 2.713712 1.046901 -2.100229 -21.416760 -18.541522 2.468677 -3.849776 -7.929174 2.106614 1.327196 1.155918 -0.028359 -23.250420 -2.264151 -0.379088 -0.007481 9.748438 -2.004790 32.864890 -16.152093 8.800367 -0.411303 4.056074 -8.118859 32.286840 0.043285 -0.017212 0.052167 -9.059442 -1.304065 10.826944 0.203997 -0.040110 -0.001624 -2.692982 5.763538 -26.002790 -9.467005 -0.679409 -5.196931 2.935583 6.782802 -26.050522 0.032740 -0.049546 0.044399 -0.007874 0.000003 -0.000041 +0.707000 78.282300 -36.133600 -79.867757 0.059933 6.460124 -0.002184 -0.000181 0.005293 -3.732569 -1.420227 -10.389741 -10.531347 -1.847408 -0.334775 -4.349026 0.294904 5.813596 7.489799 -0.492322 -1.601211 -0.403670 0.454215 0.732777 0.792785 -3.743360 3.366227 -6.822342 0.444462 0.771915 -10.202153 -0.000005 -0.000008 0.000773 0.001399 -0.000224 0.000775 -0.001499 0.000266 -7.170075 9.546543 -0.383958 8.309600 -2.898675 -2.725027 11.500659 -1.294926 -0.555595 -8.661205 -0.730641 5.990539 -2.988005 -1.811644 -0.497256 0.537295 0.407183 5.812322 3.964037 -11.508570 -3.168978 3.762790 13.363574 13.581496 11.407263 1.284011 0.551471 -11.818734 -0.637047 -20.311728 -6.968533 -0.570891 2.713660 1.046764 -2.099193 -21.409865 -18.541542 2.468678 -3.849776 -7.929175 2.106615 1.327196 1.225437 -0.009132 -23.277179 -2.374531 -0.397556 -0.008229 9.796760 -2.009223 32.923414 -16.151924 8.786381 -0.411333 4.073807 -8.138479 32.369059 0.017882 -0.034921 0.056658 -8.996602 -1.291418 10.801172 0.073605 -0.014470 -0.000612 -2.645636 5.784888 -25.938531 -9.455401 -0.701805 -5.196786 2.927891 6.772185 -26.009736 -0.007948 -0.039254 0.051324 -0.007867 0.000003 -0.000038 +0.707000 78.300600 -36.133600 -79.854640 0.068451 6.432098 -0.002178 -0.000181 0.005291 -3.703805 -1.418488 -10.340551 -10.538162 -1.818045 -0.324103 -4.390886 0.291804 5.792844 7.475820 -0.491932 -1.643300 -0.347714 0.454931 0.732333 0.774277 -3.665107 3.305734 -6.829157 0.431615 0.766223 -10.202159 -0.000005 -0.000009 0.000776 0.001399 -0.000217 0.000778 -0.001497 0.000261 -7.170078 9.546543 -0.383957 8.355334 -2.944677 -2.702774 11.535335 -1.298987 -0.556870 -8.758238 -0.657260 6.000451 -2.937763 -1.860330 -0.488650 0.539770 0.412957 5.853800 3.999703 -11.509683 -3.162160 3.677332 13.303585 13.608483 11.532133 1.298632 0.556077 -11.876201 -0.606892 -20.300432 -6.952429 -0.582386 2.734802 1.046621 -2.098153 -21.402942 -18.541546 2.468678 -3.849774 -7.929176 2.106615 1.327196 1.221324 0.003486 -23.244069 -2.422827 -0.405639 -0.008567 9.828306 -1.992534 32.924821 -16.151748 8.772393 -0.411359 4.075285 -8.140120 32.375937 0.045142 -0.028191 0.041183 -8.996276 -1.280001 10.834247 0.018706 -0.003675 -0.000173 -2.610490 5.787748 -25.935625 -9.443807 -0.724199 -5.210628 2.930452 6.775727 -26.023326 0.006270 -0.039708 0.057830 -0.007870 0.000003 -0.000040 +0.707000 78.337200 -36.133600 -79.839181 0.056109 6.390080 -0.002184 -0.000181 0.005291 -3.689157 -1.416158 -10.305557 -10.545121 -1.809544 -0.311165 -4.432760 0.288716 5.772106 7.462294 -0.477527 -1.664421 -0.291643 0.446787 0.721062 0.776813 -3.585655 3.246615 -6.856966 0.418484 0.760689 -10.202156 -0.000007 -0.000008 0.000777 0.001399 -0.000224 0.000774 -0.001502 0.000268 -7.198013 9.561369 -0.379351 8.359159 -2.987724 -2.683011 11.694873 -1.317685 -0.562707 -8.918205 -0.580247 6.030590 -2.915269 -1.905480 -0.466928 0.542247 0.418730 5.895276 3.992568 -11.509470 -3.163527 3.780937 13.288653 13.605196 11.407263 1.284010 0.551466 -11.794737 -0.567582 -20.293486 -6.970817 -0.599645 2.755603 1.046486 -2.097120 -21.396044 -18.541527 2.468678 -3.849776 -7.929182 2.106616 1.327197 1.281968 0.015928 -23.253090 -2.533212 -0.424108 -0.009366 9.861706 -2.000575 32.961591 -16.151744 8.772392 -0.411355 4.087123 -8.153170 32.430694 0.020476 -0.050339 0.032424 -8.967987 -1.268722 10.867704 -0.056802 0.011171 0.000450 -2.593176 5.801830 -25.930808 -9.411365 -0.748912 -5.224207 2.933021 6.779261 -26.036922 -0.010951 -0.054466 0.049277 -0.007871 0.000003 -0.000039 +0.707000 78.282300 -36.133600 -79.823725 0.043759 6.348144 -0.002186 -0.000180 0.005292 -3.672042 -1.400191 -10.272489 -10.552080 -1.801050 -0.298229 -4.446898 0.289598 5.730270 7.448764 -0.463117 -1.685537 -0.235587 0.438631 0.709799 0.744481 -3.508141 3.185310 -6.884888 0.413977 0.736015 -10.202155 -0.000007 -0.000008 0.000776 0.001398 -0.000227 0.000774 -0.001502 0.000269 -7.198012 9.561369 -0.379352 8.327374 -3.039202 -2.674194 11.833619 -1.333955 -0.567738 -9.050244 -0.503642 6.061215 -2.877124 -1.938504 -0.444662 0.543899 0.422578 5.922923 4.006836 -11.509917 -3.160798 3.716051 13.232287 13.643859 11.518259 1.297006 0.555563 -11.816592 -0.538927 -20.282766 -6.968503 -0.613441 2.755622 1.045918 -2.092967 -21.368397 -18.541535 2.468677 -3.849775 -7.929171 2.106615 1.327196 1.276280 0.022104 -23.217720 -2.588394 -0.433341 -0.009783 9.884384 -1.973038 32.962425 -16.137271 8.744591 -0.434549 4.090100 -8.156441 32.444440 0.061116 -0.038932 0.045702 -8.967656 -1.257298 10.900757 -0.104829 0.020613 0.000858 -2.564589 5.833644 -25.927507 -9.392810 -0.772082 -5.216954 2.935586 6.782800 -26.050519 0.000272 -0.070135 0.053743 -0.007873 0.000003 -0.000040 +0.707000 78.282300 -36.133600 -79.809821 0.045303 6.327106 -0.002186 -0.000180 0.005290 -3.654919 -1.384213 -10.239403 -10.558953 -1.778643 -0.286798 -4.476347 0.302996 5.689274 7.434333 -0.476698 -1.734602 -0.179692 0.443753 0.714784 0.752872 -3.403606 3.101837 -6.912794 0.409480 0.711340 -10.202172 -0.000005 -0.000008 0.000775 0.001399 -0.000224 0.000773 -0.001499 0.000276 -7.198012 9.561373 -0.379351 8.359178 -3.086313 -2.672358 11.847481 -1.335582 -0.568238 -9.105385 -0.429879 6.078779 -2.838959 -1.971512 -0.422382 0.545540 0.426431 5.950582 4.006838 -11.509920 -3.160797 3.786221 13.223132 13.659806 11.407261 1.284009 0.551462 -11.727431 -0.497446 -20.248135 -6.993794 -0.631859 2.755348 1.045359 -2.088822 -21.340776 -18.541534 2.468678 -3.849775 -7.929166 2.106615 1.327196 1.370917 -0.003137 -23.202240 -2.767769 -0.463348 -0.011186 9.945012 -1.914544 32.964815 -16.151084 8.716446 -0.453434 4.097504 -8.164602 32.478687 0.018987 -0.041453 0.058918 -8.946370 -1.245958 10.934107 -0.173455 0.034105 0.001462 -2.529446 5.836506 -25.924646 -9.374255 -0.795252 -5.209710 2.938153 6.786341 -26.064120 -0.012183 -0.060962 0.051554 -0.007871 0.000003 -0.000041 +0.707000 78.294500 -36.133600 -79.795918 0.046843 6.306156 -0.002182 -0.000181 0.005290 -3.641517 -1.388671 -10.203477 -10.565838 -1.756239 -0.275361 -4.505796 0.316415 5.648295 7.420595 -0.469277 -1.769703 -0.095803 0.449230 0.719547 0.733470 -3.300550 3.016697 -6.940731 0.404994 0.686662 -10.202171 -0.000007 -0.000008 0.000778 0.001399 -0.000219 0.000774 -0.001496 0.000264 -7.212187 9.561782 -0.377117 8.391032 -3.133432 -2.670499 11.861359 -1.337209 -0.568742 -9.160551 -0.356133 6.096417 -2.835507 -2.000142 -0.415265 0.547183 0.430281 5.978227 4.006837 -11.509923 -3.160799 3.785259 13.203041 13.671587 11.379514 1.280764 0.550448 -11.659376 -0.453839 -20.234552 -7.019082 -0.650281 2.776051 1.044789 -2.084670 -21.313114 -18.491745 2.069511 -3.989979 -7.861254 2.202378 1.168492 1.368319 0.015751 -23.193533 -2.816061 -0.471425 -0.011578 9.962277 -1.891430 32.965450 -16.143678 8.688547 -0.454555 4.098986 -8.166228 32.485534 0.046945 -0.039030 0.052310 -8.953242 -1.241369 10.947232 -0.214635 0.042201 0.001821 -2.506399 5.846672 -25.934452 -9.355717 -0.818420 -5.216449 2.938150 6.786341 -26.064116 -0.012194 -0.060960 0.051556 -0.007872 0.000004 -0.000041 +0.707000 78.300600 -36.133600 -79.794382 0.032937 6.285148 -0.002183 -0.000181 0.005291 -3.628091 -1.393122 -10.167539 -10.572798 -1.747747 -0.262420 -4.512215 0.310299 5.620010 7.420848 -0.462332 -1.804681 -0.032755 0.441160 0.708227 0.734434 -3.181558 2.917933 -6.968321 0.372775 0.672493 -10.202161 -0.000006 -0.000006 0.000774 0.001398 -0.000224 0.000777 -0.001502 0.000280 -7.212186 9.561782 -0.377117 8.422464 -3.182790 -2.643518 11.826675 -1.333140 -0.567491 -9.138953 -0.297060 6.116495 -2.833801 -2.042658 -0.408209 0.548946 0.413348 6.008759 3.977836 -11.523001 -3.166551 3.865263 13.211320 13.669801 11.275479 1.268591 0.546574 -11.536929 -0.423305 -20.220596 -7.060406 -0.699778 2.796545 1.043659 -2.076372 -21.257821 -18.332388 1.354366 -4.179783 -7.632747 2.349330 0.814611 1.364181 0.028367 -23.160403 -2.843647 -0.476039 -0.011810 9.997239 -1.889989 32.967144 -16.136276 8.660656 -0.455669 4.100473 -8.167861 32.492402 0.074909 -0.036609 0.045707 -8.959888 -1.227646 10.986822 -0.255816 0.050296 0.002193 -2.483338 5.856832 -25.944245 -9.334862 -0.820734 -5.223144 2.942006 6.791644 -26.084510 -0.012200 -0.060959 0.051550 -0.007871 0.000003 -0.000041 +0.719200 78.300600 -36.133600 -79.792856 0.019036 6.264209 -0.002184 -0.000181 0.005289 -3.626003 -1.381466 -10.133851 -10.579739 -1.739252 -0.249477 -4.518638 0.304187 5.591726 7.421097 -0.455387 -1.839660 0.030312 0.433079 0.696917 0.721627 -3.063260 2.818408 -7.010033 0.349018 0.639267 -10.202159 -0.000006 -0.000008 0.000774 0.001399 -0.000220 0.000773 -0.001499 0.000273 -7.212184 9.561776 -0.377117 8.453276 -3.243008 -2.625316 11.743433 -1.323375 -0.564475 -9.117227 -0.224130 6.134612 -2.832073 -2.085167 -0.387162 0.550459 0.437986 6.033532 3.970232 -11.536740 -3.168212 3.871367 13.211110 13.693913 11.199167 1.259669 0.543723 -11.413803 -0.389890 -20.185907 -7.087933 -0.746970 2.817182 1.042509 -2.068077 -21.202558 -18.090871 0.643176 -4.360075 -7.291159 2.479910 0.478182 1.423749 0.036503 -23.182704 -2.926433 -0.489887 -0.012503 10.015153 -1.901284 33.017093 -16.129304 8.667724 -0.456714 4.110855 -8.179267 32.540343 0.019358 -0.043675 0.052292 -8.938163 -1.197990 11.073047 -0.242093 0.047599 0.002069 -2.513572 5.849375 -26.017587 -9.327913 -0.821505 -5.230044 2.895839 6.778728 -26.164894 -0.016131 -0.078808 -0.001337 -0.007872 0.000003 -0.000040 +0.725300 78.294500 -36.133600 -79.791331 0.005128 6.243184 -0.002180 -0.000181 0.005292 -3.623925 -1.369806 -10.100159 -10.586704 -1.730761 -0.236533 -4.541131 0.318717 5.543717 7.420607 -0.469412 -1.874620 0.093353 0.424984 0.685615 0.729340 -2.929111 2.705175 -7.051936 0.344416 0.614645 -10.202166 -0.000005 -0.000009 0.000776 0.001398 -0.000220 0.000778 -0.001497 0.000261 -7.212184 9.561777 -0.377117 8.484081 -3.303219 -2.607089 11.660200 -1.313619 -0.561445 -9.060556 -0.151533 6.152815 -2.830338 -2.127678 -0.366118 0.552092 0.441840 6.061178 3.963335 -11.529538 -3.169432 3.976216 13.233929 13.692440 10.928626 1.228067 0.533526 -11.202629 -0.349002 -20.154616 -7.139635 -0.776971 2.837477 1.041363 -2.059781 -21.147263 -17.751838 -0.054783 -4.465329 -6.815617 2.577567 0.155504 1.420213 0.051572 -23.098737 -2.947132 -0.493347 -0.012680 10.017159 -1.892120 32.954126 -16.122060 8.653825 -0.457811 4.098988 -8.166229 32.485541 0.025880 -0.040288 0.058919 -8.938558 -1.213975 11.026761 -0.303849 0.059737 0.002637 -2.460273 5.866973 -25.954065 -9.323283 -0.843132 -5.222983 2.941796 6.791661 -26.106614 -0.016139 -0.078807 -0.001339 -0.007874 0.000004 -0.000039 +0.725300 78.306700 -36.145800 -79.792090 0.012081 6.222186 -0.002181 -0.000181 0.005292 -3.594294 -1.363045 -10.065803 -10.607616 -1.708308 -0.225509 -4.563620 0.333265 5.495725 7.434604 -0.469985 -1.923466 0.156519 0.408018 0.663495 0.736873 -2.785088 2.582031 -7.072789 0.331435 0.609025 -10.202149 -0.000007 -0.000009 0.000773 0.001398 -0.000220 0.000778 -0.001499 0.000257 -7.212185 9.561780 -0.377117 8.549884 -3.365807 -2.586492 11.507590 -1.295736 -0.555854 -8.975929 -0.076260 6.191787 -2.849444 -2.167592 -0.380823 0.553728 0.445695 6.088834 3.876210 -11.575952 -3.172878 4.162386 13.302648 13.690691 10.762134 1.208642 0.527175 -11.018681 -0.301501 -20.123636 -7.233765 -0.849635 2.857127 1.040196 -2.051485 -21.091971 -17.237835 -0.029442 -4.247280 -6.143118 2.465998 0.225156 1.414970 0.059658 -23.100980 -2.967831 -0.496810 -0.012861 10.017926 -1.882125 32.968073 -16.128978 8.639754 -0.456777 4.101950 -8.169492 32.499242 0.033158 -0.041349 0.052306 -8.938103 -1.195711 11.079659 -0.310715 0.061087 0.002701 -2.451186 5.868607 -25.997112 -9.316321 -0.843905 -5.215880 2.949504 6.802258 -26.147383 -0.012679 -0.063192 0.044945 -0.007873 0.000004 -0.000038 +0.719200 78.306700 -36.151900 -79.791332 0.005129 6.222200 -0.002178 -0.000181 0.005291 -3.565181 -1.359178 -10.052254 -10.628523 -1.685860 -0.214482 -4.583973 0.325832 5.467510 7.448587 -0.470570 -1.972305 0.219664 0.391027 0.641394 0.771883 -2.620092 2.440412 -7.093690 0.324203 0.590646 -10.202162 -0.000008 -0.000009 0.000771 0.001398 -0.000217 0.000772 -0.001498 0.000266 -7.212185 9.561779 -0.377118 8.616390 -3.419630 -2.576682 11.354978 -1.277873 -0.550215 -8.891102 0.024827 6.212892 -2.868537 -2.207502 -0.339583 0.555365 0.449549 6.116489 3.876090 -11.583167 -3.159022 4.038104 13.262439 13.741278 10.880061 1.222397 0.531679 -10.964176 -0.284023 -20.113382 -7.263572 -0.883062 2.877654 1.038746 -2.041119 -21.022860 -16.643475 0.143414 -3.904694 -5.386333 2.335902 0.381331 1.409728 0.067733 -23.103238 -2.960929 -0.495655 -0.012800 10.018920 -1.872287 32.968025 -16.135883 8.625690 -0.455741 4.101950 -8.169490 32.499239 0.038216 -0.029357 0.041175 -8.938156 -1.197993 11.073034 -0.317578 0.062436 0.002768 -2.441177 5.871037 -25.977342 -9.309372 -0.844677 -5.222770 2.946931 6.798732 -26.133810 -0.010172 -0.050210 0.040380 -0.007871 0.000004 -0.000038 +0.737500 78.294500 -36.151900 -79.790570 -0.001828 6.222210 -0.002182 -0.000181 0.005290 -3.538495 -1.368940 -10.036792 -10.628497 -1.679659 -0.222188 -4.604417 0.319171 5.425341 7.462590 -0.471168 -2.021150 0.268957 0.360572 0.603164 0.806653 -2.440364 2.313526 -7.128417 0.297702 0.563724 -10.202164 -0.000007 -0.000008 0.000774 0.001398 -0.000214 0.000776 -0.001501 0.000271 -7.212185 9.561779 -0.377117 8.695195 -3.499444 -2.568202 11.174616 -1.256779 -0.543483 -8.771349 0.125650 6.233815 -2.889327 -2.261305 -0.326406 0.558212 0.456298 6.164873 3.774737 -11.621835 -3.186166 4.379507 13.385847 13.713072 10.415287 1.168234 0.513770 -10.610262 -0.216874 -20.068882 -7.390960 -0.968539 2.896578 1.037262 -2.030757 -20.953786 -15.986218 0.445388 -3.457323 -4.559128 2.205933 0.637263 1.407667 0.088966 -23.065773 -2.954025 -0.494501 -0.012740 10.020369 -1.862743 32.940005 -16.142788 8.611611 -0.454699 4.096021 -8.162962 32.471826 0.043306 -0.017359 0.030041 -8.965812 -1.133423 11.109610 -0.324447 0.063787 0.002825 -2.430716 5.822424 -26.005933 -9.302427 -0.845449 -5.229660 2.962798 6.750451 -26.160183 -0.017399 -0.085297 0.000949 -0.007868 0.000003 -0.000040 +0.737500 78.306700 -36.164100 -79.789813 -0.008780 6.222212 -0.002186 -0.000181 0.005293 -3.511456 -1.376753 -10.007454 -10.628468 -1.673459 -0.229894 -4.626838 0.333384 5.384323 7.455615 -0.470958 -2.070171 0.297267 0.329869 0.565086 0.862156 -2.240122 2.147834 -7.163124 0.271219 0.536784 -10.202169 -0.000007 -0.000009 0.000775 0.001397 -0.000217 0.000778 -0.001502 0.000269 -7.212190 9.561781 -0.377117 8.774700 -3.568372 -2.550801 10.994256 -1.235703 -0.536698 -8.651746 0.212667 6.256470 -2.910117 -2.315115 -0.313250 0.560255 0.461120 6.199434 3.774446 -11.628722 -3.193320 4.275159 13.335202 13.746913 10.484649 1.176308 0.516465 -10.518096 -0.192054 -20.046663 -7.434558 -1.004336 2.916817 1.035482 -2.018319 -20.870843 -15.254254 0.887057 -2.863623 -3.647376 2.085788 1.006483 1.433678 0.107305 -23.125713 -2.981628 -0.499117 -0.012985 10.033523 -1.868407 33.010636 -16.135554 8.597709 -0.469767 4.110851 -8.179268 32.540339 0.021547 -0.056732 0.056803 -8.973171 -1.156021 11.065521 -0.283259 0.055690 0.002449 -2.465631 5.845503 -25.953185 -9.295477 -0.846222 -5.236563 2.943068 6.793423 -26.113403 -0.011447 -0.056696 0.042663 -0.007873 0.000003 -0.000040 +0.743600 78.306700 -36.170200 -79.789054 -0.015733 6.222202 -0.002184 -0.000181 0.005290 -3.479602 -1.357277 -9.981947 -10.656434 -1.664888 -0.217552 -4.649242 0.347614 5.343313 7.469598 -0.471578 -2.119012 0.325369 0.315390 0.513741 0.918203 -2.040040 1.981970 -7.183937 0.250623 0.497012 -10.202173 -0.000007 -0.000008 0.000773 0.001396 -0.000209 0.000775 -0.001497 0.000259 -7.212186 9.561776 -0.377117 8.875200 -3.638686 -2.531806 10.779218 -1.210607 -0.528514 -8.511171 0.301524 6.292699 -2.958683 -2.365490 -0.301244 0.562282 0.465942 6.233998 3.658480 -11.681191 -3.202612 4.670697 13.477561 13.708977 9.971310 1.116634 0.496242 -10.120228 -0.120686 -20.004548 -7.581408 -1.100322 2.935107 1.033679 -2.005888 -20.787918 -14.441731 1.540711 -2.078727 -2.652629 2.059656 1.580372 1.435234 0.113737 -23.127943 -2.974729 -0.497964 -0.012927 10.025648 -1.847735 33.010058 -16.128322 8.583798 -0.484839 4.109380 -8.177642 32.533516 0.018605 -0.039225 0.065532 -8.979616 -1.139791 11.133863 -0.262681 0.051645 0.002261 -2.466657 5.844623 -26.023019 -9.309374 -0.844676 -5.222772 2.954633 6.809328 -26.174589 -0.036377 -0.038340 0.038299 -0.007874 0.000004 -0.000040 +0.755800 78.294500 -36.182400 -79.788298 -0.022685 6.222218 -0.002183 -0.000181 0.005289 -3.437069 -1.357730 -9.981927 -10.670344 -1.642469 -0.206306 -4.685567 0.360562 5.302397 7.483590 -0.472213 -2.167856 0.332528 0.297743 0.492040 1.002355 -1.824380 1.802041 -7.204730 0.230041 0.457231 -10.202176 -0.000007 -0.000008 0.000773 0.001399 -0.000227 0.000774 -0.001499 0.000269 -7.212190 9.561781 -0.377116 8.994394 -3.745252 -2.512496 10.487861 -1.176652 -0.517274 -8.307522 0.417741 6.324416 -3.007225 -2.415888 -0.268294 0.564316 0.470770 6.268560 3.586023 -11.714025 -3.203215 4.620608 13.463409 13.747205 10.096170 1.131130 0.501208 -10.017896 -0.113405 -19.987442 -7.672061 -1.151283 2.954300 1.031861 -1.993461 -20.704991 -13.588409 2.648372 -1.437299 -1.626083 2.688906 2.843564 1.439990 0.133322 -23.090491 -2.967831 -0.496811 -0.012864 10.002317 -1.840856 32.959891 -16.142303 8.569651 -0.475762 4.097504 -8.164601 32.478690 0.017151 -0.030616 0.047776 -9.022076 -1.102872 11.068801 -0.187182 0.036804 0.001575 -2.492081 5.804072 -25.956604 -9.323279 -0.843132 -5.222980 2.940495 6.789888 -26.099799 -0.013950 -0.069679 0.047226 -0.007871 0.000003 -0.000040 +0.755800 78.306700 -36.200700 -79.808406 -0.031911 6.222188 -0.002185 -0.000181 0.005292 -3.394514 -1.358184 -9.981896 -10.684259 -1.623062 -0.222869 -4.721887 0.373534 5.261483 7.498159 -0.458881 -2.216713 0.339763 0.266813 0.454099 1.087170 -1.608986 1.621814 -7.225551 0.209474 0.417443 -10.202153 -0.000006 -0.000008 0.000775 0.001397 -0.000220 0.000777 -0.001496 0.000264 -7.212183 9.561776 -0.377117 9.113619 -3.851772 -2.492959 10.161815 -1.138724 -0.504491 -8.075958 0.533889 6.355477 -3.055742 -2.466304 -0.249374 0.566349 0.475594 6.303117 3.513455 -11.746675 -3.217872 4.881198 13.558395 13.731845 9.673014 1.082040 0.484256 -9.631678 -0.060246 -19.942920 -7.814314 -1.232414 2.986320 1.029563 -1.977925 -20.601317 -12.737494 4.147010 -0.924062 -0.612805 3.833813 4.637189 1.438455 0.127025 -23.066117 -2.960926 -0.495655 -0.012798 9.987382 -1.844512 32.938208 -16.142314 8.569648 -0.468766 4.091582 -8.158070 32.451284 -0.005740 -0.021039 0.043258 -9.022100 -1.096258 11.066515 -0.166589 0.032754 0.001400 -2.495839 5.798158 -25.956066 -9.321735 -0.829230 -5.222953 2.941779 6.791655 -26.106598 -0.030765 -0.046177 0.040532 -0.007870 0.000003 -0.000040 +0.761900 78.306700 -36.206800 -79.826224 -0.062005 6.222142 -0.002181 -0.000181 0.005290 -3.324064 -1.361541 -9.967346 -10.712175 -1.602091 -0.225910 -4.779092 0.384619 5.220712 7.512744 -0.445560 -2.265573 0.255704 0.281408 0.451061 1.264448 -1.421173 1.414094 -7.246263 0.169791 0.369031 -10.202173 -0.000006 -0.000008 0.000777 0.001399 -0.000232 0.000776 -0.001499 0.000264 -7.212185 9.561779 -0.377118 9.281881 -3.961498 -2.469443 9.766409 -1.092829 -0.488703 -7.788475 0.647863 6.371641 -3.134611 -2.534168 -0.231834 0.568371 0.480419 6.337680 3.295859 -11.837507 -3.261961 5.149234 13.690744 13.741684 9.548140 1.067578 0.479171 -9.413846 -0.050545 -19.922767 -7.970318 -1.315994 3.017825 1.027230 -1.962395 -20.497654 -11.864932 6.260163 -0.678186 0.303667 5.795205 7.294774 1.382840 0.194534 -23.150342 -2.857458 -0.478350 -0.011923 9.968898 -1.866798 33.014498 -16.128162 8.569808 -0.484859 4.103437 -8.171112 32.506083 0.021559 -0.056728 0.056809 -9.021631 -1.069094 11.123746 -0.132281 0.026010 0.001093 -2.518437 5.802609 -26.023489 -9.320187 -0.815325 -5.222933 2.952064 6.805795 -26.160989 -0.047605 -0.022666 0.033840 -0.007871 0.000003 -0.000040 +0.774100 78.294500 -36.225100 -79.830138 -0.090575 6.243143 -0.002186 -0.000180 0.005290 -3.239836 -1.367301 -9.952486 -10.740164 -1.601980 -0.226692 -4.836283 0.395743 5.179952 7.554684 -0.447441 -2.314197 0.255820 0.265678 0.409715 1.357973 -1.221035 1.258207 -7.267051 0.135868 0.307851 -10.202179 -0.000007 -0.000008 0.000774 0.001400 -0.000220 0.000774 -0.001501 0.000266 -7.297257 9.564258 -0.363703 9.512153 -4.091624 -2.453844 9.405655 -1.051051 -0.474023 -7.501028 0.763890 6.401097 -3.248206 -2.597800 -0.215931 0.570396 0.485247 6.372241 3.194266 -11.883324 -3.268726 5.394414 13.786015 13.732518 9.152704 1.021853 0.462892 -8.983623 -0.023548 -19.890469 -8.150536 -1.382544 3.048548 1.024878 -1.946872 -20.394007 -11.042257 8.983358 -0.666033 1.036990 8.409734 10.753583 1.378693 0.207144 -23.117231 -2.816054 -0.471424 -0.011580 9.952314 -1.890375 32.971990 -16.114178 8.583959 -0.479954 4.090093 -8.156442 32.444430 -0.032233 -0.032216 0.045492 -9.106440 -1.019368 11.009529 -0.015608 0.003072 0.000115 -2.562144 5.732952 -25.919634 -9.332558 -0.799879 -5.223108 2.930220 6.775745 -26.045415 -0.012682 -0.063192 0.044953 -0.007873 0.000003 -0.000040 +0.780200 78.300600 -36.243400 -79.836332 -0.098287 6.264145 -0.002181 -0.000181 0.005292 -3.138902 -1.358894 -9.967869 -10.789141 -1.601786 -0.228054 -4.935274 0.403133 5.139489 7.596625 -0.449357 -2.362819 0.256018 0.239116 0.377222 1.452134 -1.021156 1.072331 -7.273889 0.102035 0.246627 -10.202163 -0.000007 -0.000009 0.000776 0.001399 -0.000219 0.000775 -0.001496 0.000257 -7.297261 9.564253 -0.363702 9.623597 -4.213892 -2.447368 9.044917 -1.009368 -0.459082 -7.185586 0.893771 6.427590 -3.339256 -2.650123 -0.199118 0.572408 0.490078 6.406807 3.092658 -11.929123 -3.275566 5.673515 13.893074 13.716873 8.729520 0.973051 0.445121 -8.519372 -0.004276 -19.858379 -8.351411 -1.452768 3.078554 1.022489 -1.931352 -20.290359 -10.308471 12.045419 -0.679310 1.568524 11.089277 14.497618 1.312695 0.261429 -23.181339 -2.726378 -0.456424 -0.010850 9.916587 -1.891306 33.019245 -16.099804 8.563120 -0.475108 4.096018 -8.162970 32.471826 0.020447 -0.050202 0.054550 -9.105804 -1.007464 11.086835 0.018709 -0.003675 -0.000170 -2.585048 5.737122 -26.008010 -9.344907 -0.784431 -5.223274 2.945639 6.796959 -26.127005 -0.039495 -0.017517 0.031508 -0.007870 0.000003 -0.000041 +0.780200 78.300600 -36.261800 -79.840994 -0.119912 6.285128 -0.002180 -0.000181 0.005290 -3.037981 -1.350511 -9.983262 -10.838052 -1.580728 -0.231667 -5.034254 0.410592 5.099043 7.639502 -0.430344 -2.411465 0.256184 0.212555 0.344730 1.547201 -0.841360 0.905923 -7.245782 0.068340 0.185349 -10.202184 -0.000006 -0.000008 0.000776 0.001399 -0.000222 0.000774 -0.001501 0.000271 -7.367548 9.587282 -0.352305 9.992399 -4.378135 -2.421400 8.455215 -0.941439 -0.434088 -6.744267 1.023208 6.451262 -3.485892 -2.695708 -0.184972 0.573034 0.505864 6.418703 2.969585 -11.974204 -3.286761 5.952817 14.000105 13.700718 8.306315 0.924375 0.426990 -8.055120 0.015252 -19.826407 -8.552245 -1.523094 3.108304 1.020074 -1.915833 -20.186696 -9.649216 15.251430 -0.663258 1.849780 13.902435 18.548521 1.308011 0.271842 -23.154843 -2.726380 -0.456423 -0.010853 9.914911 -1.866739 32.969911 -16.106641 8.542066 -0.488082 4.084167 -8.149912 32.417014 -0.004647 -0.027570 0.045516 -9.183591 -0.944474 10.968200 0.128501 -0.025263 -0.001049 -2.624967 5.673361 -25.904715 -9.341043 -0.749671 -5.223225 2.923814 6.766899 -26.011437 -0.012694 -0.063188 0.044945 -0.007874 0.000003 -0.000040 +0.792400 78.294500 -36.280100 -79.866498 -0.143834 6.306055 -0.002181 -0.000181 0.005292 -2.911890 -1.360649 -9.996110 -10.886939 -1.559667 -0.235263 -5.133160 0.417350 5.072571 7.682404 -0.411370 -2.460130 0.256315 0.185993 0.312237 1.642807 -0.661844 0.739226 -7.189704 0.021933 0.118326 -10.202171 -0.000006 -0.000009 0.000774 0.001397 -0.000222 0.000773 -0.001499 0.000269 -7.367537 9.587274 -0.352304 10.109306 -4.525852 -2.416131 8.073653 -0.897619 -0.417549 -6.400929 1.155221 6.489638 -3.597752 -2.745546 -0.169300 0.574862 0.524551 6.451349 2.845805 -12.032885 -3.319385 6.232242 14.107021 13.683984 7.862297 0.873454 0.407590 -7.563635 0.028697 -19.794592 -8.766836 -1.595949 3.151432 1.017636 -1.900323 -20.083051 -9.113049 18.575242 -0.530737 1.741838 16.927241 23.185185 1.306007 0.293205 -23.095253 -2.726374 -0.456424 -0.010850 9.913960 -1.842613 32.878656 -16.099323 8.521156 -0.503150 4.061981 -8.125410 32.314277 -0.029728 -0.004932 0.036486 -9.182829 -0.928004 11.058728 0.169679 -0.033359 -0.001368 -2.646006 5.667624 -26.014225 -9.337177 -0.714914 -5.223177 2.943070 6.793424 -26.113406 -0.039211 -0.015487 0.015998 -0.007869 0.000003 -0.000039 +0.798500 78.306700 -36.298400 -79.878096 -0.166229 6.327016 -0.002184 -0.000181 0.005289 -2.785796 -1.370814 -10.008905 -10.935838 -1.540854 -0.259703 -5.234533 0.451978 5.047681 7.724325 -0.413392 -2.508776 0.235362 0.180988 0.262105 1.759923 -0.492264 0.612026 -7.098684 -0.024489 0.051349 -10.202160 -0.000006 -0.000008 0.000777 0.001398 -0.000215 0.000773 -0.001492 0.000256 -7.444930 9.610496 -0.339756 10.483108 -4.723043 -2.369148 7.463105 -0.827746 -0.390479 -5.938725 1.287046 6.524691 -3.765235 -2.788684 -0.156398 0.576974 0.522455 6.486862 2.722086 -12.091728 -3.338134 6.490783 14.183314 13.697500 7.446023 0.825851 0.389024 -7.102550 0.035256 -19.760890 -8.986193 -1.641405 3.194196 1.011720 -1.898234 -19.977584 -8.783768 21.766628 -0.029593 1.256733 19.796625 27.939838 1.258741 0.365412 -23.203737 -2.726382 -0.456424 -0.010849 9.952887 -1.835795 32.971393 -16.092023 8.500249 -0.518216 4.132116 -8.160973 32.388545 0.017863 -0.034767 0.078766 -9.267713 -0.856290 10.922377 0.286350 -0.056304 -0.002230 -2.701348 5.605607 -25.895264 -9.348772 -0.692513 -5.223312 2.918686 6.759816 -25.984242 -0.013420 -0.065629 0.016223 -0.007871 0.000003 -0.000041 +0.798500 78.306700 -36.335000 -79.887369 -0.209487 6.347928 -0.002181 -0.000181 0.005291 -2.680374 -1.377360 -10.022200 -10.970739 -1.520587 -0.269845 -5.335896 0.486649 5.022856 7.767266 -0.394490 -2.557448 0.214470 0.163188 0.240506 1.849721 -0.352867 0.474375 -6.986779 -0.071009 -0.015536 -10.202179 -0.000007 -0.000009 0.000774 0.001398 -0.000219 0.000775 -0.001499 0.000273 -7.444922 9.610493 -0.339757 10.577603 -4.891175 -2.337991 7.123148 -0.788965 -0.375084 -5.602495 1.416546 6.540886 -3.884039 -2.837737 -0.141245 0.577879 0.517462 6.501647 2.627683 -12.130548 -3.350779 6.728758 14.235048 13.701027 7.057484 0.781548 0.371406 -6.668722 0.048400 -19.727263 -9.164179 -1.679742 3.224012 1.005802 -1.896161 -19.872119 -8.711817 24.735807 1.007474 0.641367 22.050562 32.685710 1.256606 0.356645 -23.230226 -2.671188 -0.447192 -0.010417 9.897916 -1.790543 32.961291 -16.084718 8.479328 -0.512305 4.073788 -8.138507 32.369052 -0.014117 -0.013447 0.047621 -9.267156 -0.842345 10.984163 0.327537 -0.064404 -0.002527 -2.721862 5.600290 -25.969831 -9.360362 -0.670114 -5.223455 2.931508 6.777510 -26.052222 -0.042794 0.003106 0.002599 -0.007872 0.000003 -0.000040 +0.816800 78.294500 -36.371600 -79.898165 -0.238842 6.389897 -0.002179 -0.000181 0.005288 -2.572546 -1.370291 -10.037389 -11.005620 -1.500308 -0.279975 -5.435469 0.501270 4.982944 7.824172 -0.376301 -2.606039 0.193556 0.145396 0.218901 1.953922 -0.233377 0.356371 -6.874888 -0.100732 -0.051729 -10.202180 -0.000006 -0.000008 0.000774 0.001398 -0.000221 0.000775 -0.001497 0.000269 -7.607219 9.643080 -0.313595 10.992963 -5.106849 -2.297752 6.713786 -0.742392 -0.356241 -5.315280 1.546275 6.557594 -4.024776 -2.834862 -0.127224 0.578580 0.526321 6.514517 2.533264 -12.169356 -3.363481 6.939659 14.277354 13.709394 6.703624 0.741303 0.355091 -6.262161 0.068093 -19.693725 -9.339727 -1.731951 3.253759 1.004985 -1.873946 -19.769356 -8.919710 27.504912 2.726160 0.433029 23.227347 37.607397 1.205891 0.414291 -23.274407 -2.664291 -0.446038 -0.010366 9.924134 -1.778346 32.955396 -16.049013 8.444728 -0.524550 4.115753 -8.142931 32.357410 0.016759 -0.028239 0.076517 -9.365480 -0.758861 10.903041 0.457920 -0.090046 -0.003421 -2.764044 5.520345 -25.915170 -9.348788 -0.629172 -5.209334 2.917400 6.758044 -25.977441 -0.009909 -0.048185 0.024869 -0.007869 0.000003 -0.000040 +0.822900 78.306700 -36.408300 -79.908947 -0.268205 6.431816 -0.002182 -0.000181 0.005290 -2.478494 -1.360812 -10.052927 -11.040512 -1.480025 -0.290094 -5.508366 0.532293 4.943597 7.867149 -0.357473 -2.654741 0.172659 0.118759 0.186457 2.037436 -0.129038 0.252910 -6.714036 -0.124859 -0.100528 -10.202146 -0.000006 -0.000009 0.000776 0.001397 -0.000215 0.000774 -0.001496 0.000257 -7.628485 9.643685 -0.310205 11.073681 -5.273992 -2.267330 6.443189 -0.711682 -0.343603 -5.028092 1.679045 6.594423 -4.133249 -2.857036 -0.111630 0.580478 0.538081 6.548118 2.438818 -12.208144 -3.376257 7.123503 14.310204 13.722659 6.377517 0.704305 0.339833 -5.889691 0.095873 -19.660312 -9.487665 -1.779380 3.284199 1.004785 -1.855867 -19.694273 -9.612340 30.118686 5.492496 1.018658 23.045842 42.666583 1.200679 0.422390 -23.276612 -2.636688 -0.441419 -0.010149 9.872593 -1.748334 32.945653 -16.034656 8.423888 -0.533655 4.061979 -8.125413 32.314287 -0.030469 -0.000489 0.049735 -9.421770 -0.701877 10.831366 0.554007 -0.108945 -0.004046 -2.815126 5.478776 -25.874046 -9.337211 -0.588231 -5.195228 2.907162 6.743877 -25.923073 -0.010407 -0.050416 0.018261 -0.007871 0.000004 -0.000038 +0.829000 78.306700 -36.444900 -79.917342 -0.318434 6.473697 -0.002187 -0.000181 0.005290 -2.402367 -1.372289 -10.086726 -11.075400 -1.459739 -0.300198 -5.581188 0.562597 4.918264 7.910123 -0.338680 -2.703459 0.151699 0.113800 0.136300 2.121211 -0.059474 0.183915 -6.553196 -0.149124 -0.149261 -10.202163 -0.000005 -0.000008 0.000777 0.001401 -0.000222 0.000775 -0.001499 0.000263 -7.649766 9.644286 -0.306819 11.300550 -5.467677 -2.199940 5.922790 -0.652790 -0.318891 -4.629051 1.774210 6.611369 -4.240059 -2.865349 -0.095973 0.581570 0.547912 6.567886 2.365804 -12.247664 -3.384737 7.293737 14.296508 13.741879 6.051413 0.667396 0.324372 -5.531483 0.155561 -19.631036 -9.614931 -1.823231 3.315171 1.000718 -1.848130 -19.596619 -9.956645 31.595000 7.635345 2.466482 22.356848 48.183365 1.141683 0.504753 -23.342936 -2.629796 -0.440268 -0.010097 9.902903 -1.741330 32.961004 -15.992015 8.403323 -0.546888 4.114301 -8.141352 32.328412 0.008387 -0.020648 0.080879 -9.491706 -0.635624 10.786157 0.650087 -0.127843 -0.004633 -2.866585 5.436832 -25.860858 -9.352658 -0.600595 -5.202380 2.902056 6.736785 -25.895889 -0.010893 -0.052647 0.011642 -0.007871 0.000003 -0.000038 +0.835100 78.306700 -36.481500 -79.925706 -0.368659 6.515650 -0.002181 -0.000181 0.005293 -2.326246 -1.383809 -10.120506 -11.089133 -1.411741 -0.312771 -5.641251 0.608045 4.893606 7.939146 -0.319212 -2.752272 0.151756 0.087238 0.103808 2.170054 0.009920 0.114782 -6.392436 -0.184974 -0.172396 -10.202177 -0.000006 -0.000008 0.000777 0.001399 -0.000224 0.000777 -0.001495 0.000259 -7.642679 9.644082 -0.307944 11.463959 -5.668165 -2.147239 5.464823 -0.601153 -0.296703 -4.264984 1.883393 6.626781 -4.346860 -2.873694 -0.080335 0.583460 0.559675 6.601484 2.292774 -12.287182 -3.393268 7.455088 14.306501 13.765562 5.725281 0.630573 0.308699 -5.173300 0.215438 -19.602105 -9.742163 -1.867165 3.360031 0.996620 -1.840402 -19.498978 -10.199198 32.583332 9.610806 4.375238 21.632001 53.792463 1.104682 0.559159 -23.387094 -2.622906 -0.439115 -0.010047 9.904670 -1.721502 32.974862 -15.949390 8.382757 -0.560100 4.121083 -8.138366 32.313895 0.006903 -0.011897 0.085240 -9.561280 -0.557916 10.774098 0.787340 -0.154842 -0.005431 -2.918450 5.394536 -25.875694 -9.356565 -0.508681 -5.195423 2.900774 6.735014 -25.889089 -0.008878 -0.041896 0.000461 -0.007870 0.000003 -0.000040 +0.847300 78.337200 -36.524200 -79.944156 -0.431990 6.559502 -0.002179 -0.000181 0.005291 -2.266083 -1.378721 -10.148095 -11.112448 -1.377685 -0.342221 -5.705125 0.653355 4.845902 7.962056 -0.296762 -2.803390 0.129784 0.055960 0.041792 2.202074 0.058359 0.092976 -6.233269 -0.183324 -0.178705 -10.216159 0.000006 -0.000000 0.000777 0.001399 -0.000217 0.000776 -0.001499 0.000266 -7.637281 9.649861 -0.316479 11.637220 -5.848951 -2.099285 4.991270 -0.549254 -0.272860 -3.892825 1.994994 6.649083 -4.448208 -2.874627 -0.054495 0.584262 0.551797 6.647301 2.090610 -12.356067 -3.429077 7.687906 14.359233 13.775701 5.601537 0.616621 0.302689 -4.961514 0.246788 -19.578336 -9.874589 -1.907681 3.400765 0.985372 -1.822411 -19.416372 -10.580267 33.611976 11.675294 6.470661 21.130792 59.338320 1.074160 0.624210 -23.426193 -2.620651 -0.438738 -0.010028 9.896777 -1.707284 32.968353 -15.898855 8.342836 -0.568988 4.121947 -8.131154 32.303363 0.005853 -0.005364 0.083258 -9.648130 -0.467802 10.744621 0.915679 -0.180088 -0.006102 -2.976443 5.325403 -25.883495 -9.358547 -0.518557 -5.189846 2.903817 6.743185 -25.880229 -0.009135 -0.049972 0.002233 -0.007873 0.000004 -0.000038 +0.847300 78.337200 -36.573100 -79.950831 -0.496137 6.615357 -0.002178 -0.000181 0.005291 -2.198255 -1.396877 -10.188005 -11.126195 -1.337383 -0.360974 -5.758187 0.699852 4.814276 8.005461 -0.271108 -2.859154 0.129798 0.024971 0.003886 2.237053 0.102929 0.048473 -6.079383 -0.183804 -0.178211 -10.216154 0.000006 -0.000000 0.000776 0.001399 -0.000222 0.000774 -0.001496 0.000261 -7.637284 9.649863 -0.316480 11.808982 -6.034304 -2.041269 4.512446 -0.495663 -0.248795 -3.514778 2.111324 6.661604 -4.548065 -2.883873 -0.038528 0.586259 0.556638 6.681864 2.017733 -12.388437 -3.444596 7.856028 14.371673 13.797928 5.233765 0.575248 0.284677 -4.558751 0.314050 -19.531413 -10.006185 -1.966802 3.438280 0.982546 -1.805903 -19.305832 -11.100064 34.626942 13.810938 8.374311 20.812631 64.729348 1.037746 0.680708 -23.485814 -2.599942 -0.435273 -0.009869 9.883507 -1.691037 32.967585 -15.856238 8.322257 -0.575157 4.121947 -8.131152 32.303359 0.005866 -0.005361 0.083268 -9.739040 -0.377349 10.661842 1.066659 -0.209792 -0.006832 -3.044661 5.269795 -25.840521 -9.347036 -0.414273 -5.189751 2.889782 6.723678 -25.805493 -0.005371 -0.030499 -0.004611 -0.007872 0.000004 -0.000039 +0.847300 78.337200 -36.615800 -79.954963 -0.581121 6.748275 -0.002184 -0.000181 0.005290 -2.148816 -1.398685 -10.286708 -11.139937 -1.299337 -0.400580 -5.811229 0.746380 4.782693 8.034912 -0.244745 -2.915006 0.129808 0.004813 -0.042875 2.223085 0.122730 0.028725 -5.925496 -0.184282 -0.177717 -10.216150 0.000006 -0.000001 0.000776 0.001398 -0.000222 0.000775 -0.001493 0.000258 -7.637280 9.649859 -0.316480 11.983626 -6.174778 -1.982300 4.012791 -0.439958 -0.223196 -3.136726 2.227733 6.673359 -4.627034 -2.895625 -0.021523 0.584658 0.552763 6.654213 1.944832 -12.420778 -3.460162 8.039870 14.446627 13.807363 4.782719 0.524663 0.262222 -4.117330 0.394149 -19.488118 -10.134031 -2.046661 3.475778 0.979682 -1.789396 -19.195258 -11.698249 35.493819 15.805944 4.969708 19.957394 68.973654 1.002938 0.743410 -23.591907 -2.593050 -0.434119 -0.009819 9.870800 -1.675148 32.931860 -15.778473 8.322968 -0.586421 4.113079 -8.121331 32.262238 0.002538 0.014221 0.076495 -9.829773 -0.273527 10.574687 1.265683 -0.248948 -0.007674 -3.144497 5.191179 -25.863978 -9.372579 -0.327005 -5.189916 2.888512 6.721897 -25.798675 -0.001585 -0.011032 -0.011466 -0.007870 0.000003 -0.000041 +0.865700 78.337200 -36.652400 -79.958858 -0.666130 6.923065 -0.002177 -0.000181 0.005290 -2.102575 -1.418081 -10.411198 -11.153828 -1.284400 -0.458782 -5.837468 0.808415 4.765538 8.064389 -0.218411 -2.970872 0.129807 -0.002065 -0.073391 2.209112 0.152416 0.018882 -5.771626 -0.184758 -0.177221 -10.216156 0.000006 0.000000 0.000778 0.001399 -0.000229 0.000776 -0.001498 0.000271 -7.637283 9.649859 -0.316479 12.123884 -6.302180 -1.918179 3.513109 -0.384476 -0.197125 -2.772681 2.346208 6.698744 -4.710145 -2.942139 -0.004769 0.587057 0.558571 6.695678 1.893385 -12.453891 -3.471329 8.223754 14.521576 13.816540 4.310827 0.471932 0.238304 -3.672897 0.488078 -19.447492 -10.241160 -2.122871 3.513845 0.976433 -1.770837 -19.070875 -12.266744 36.226852 17.573544 2.453676 18.978632 73.020931 0.934324 0.814712 -23.697505 -2.586156 -0.432967 -0.009761 9.880525 -1.686598 32.876467 -15.700715 8.323666 -0.597678 4.087782 -8.114276 32.192276 -0.001517 0.038253 0.082977 -9.948917 -0.159209 10.388161 1.485280 -0.292156 -0.008439 -3.268692 5.112698 -25.822070 -9.396600 -0.225841 -5.162059 2.875777 6.704142 -25.730726 0.002186 0.008440 -0.018302 -0.007870 0.000003 -0.000042 +0.865700 78.337200 -36.707300 -79.962473 -0.751142 7.132858 -0.002180 -0.000181 0.005292 -2.070843 -1.438911 -10.563729 -11.167694 -1.269449 -0.516981 -5.863688 0.870459 4.748405 8.093900 -0.192106 -3.026751 0.234675 -0.025339 -0.090598 2.062218 0.162377 0.009308 -5.617679 -0.166088 -0.168137 -10.216144 0.000007 0.000000 0.000775 0.001397 -0.000222 0.000776 -0.001497 0.000259 -7.616006 9.649267 -0.319865 12.266597 -6.391230 -1.867584 3.013416 -0.329227 -0.170563 -2.408657 2.464841 6.723391 -4.765400 -2.991954 0.013351 0.589443 0.564383 6.737146 1.842468 -12.473013 -3.482201 8.391640 14.642064 13.814234 3.838921 0.419403 0.213952 -3.228112 0.584265 -19.393714 -10.343257 -2.226682 3.551933 0.973138 -1.752283 -18.946489 -12.816201 36.824798 19.128097 1.025098 18.102254 76.789413 0.855906 0.846888 -23.922039 -2.579253 -0.431811 -0.009710 9.880308 -1.686449 32.890441 -15.602056 8.359506 -0.611987 4.078711 -8.125222 32.197642 -0.005581 0.062286 0.089458 -10.067689 -0.044491 10.201873 1.718627 -0.338072 -0.009075 -3.404464 5.016044 -25.806895 -9.419152 -0.110780 -5.148133 2.865586 6.689938 -25.676373 0.005958 0.027913 -0.025165 -0.007870 0.000003 -0.000041 +0.871800 78.337200 -36.750100 -79.965774 -0.836171 7.342641 -0.002185 -0.000180 0.005291 -2.039190 -1.459826 -10.716276 -11.160430 -1.240778 -0.576222 -5.875940 0.933666 4.731081 8.108270 -0.185986 -3.082663 0.227666 -0.039597 -0.097007 2.013280 0.172306 -0.000463 -5.477747 -0.155941 -0.139995 -10.216140 0.000006 0.000000 0.000774 0.001398 -0.000222 0.000774 -0.001495 0.000258 -7.595333 9.627678 -0.323445 12.381301 -6.478616 -1.820153 2.541450 -0.277261 -0.145038 -2.086643 2.567784 6.737252 -4.817379 -3.014008 0.031619 0.591832 0.570190 6.778619 1.791544 -12.492136 -3.493094 8.559635 14.762552 13.811594 3.366999 0.367077 0.189165 -2.803886 0.685470 -19.340502 -10.445277 -2.330544 3.575855 0.969806 -1.733738 -18.822116 -13.220808 37.249584 20.279409 -1.499328 17.904082 78.490020 0.783788 0.903334 -24.073801 -2.572357 -0.430658 -0.009662 9.881312 -1.687126 32.827549 -15.503409 8.395327 -0.626357 4.074534 -8.099530 32.130637 -0.009630 0.086321 0.095943 -10.165087 0.070235 10.015643 1.951946 -0.383985 -0.009525 -3.558336 4.930293 -25.811232 -9.462578 0.006564 -5.134187 2.859246 6.681046 -25.642414 0.009745 0.047381 -0.032022 -0.007873 0.000004 -0.000043 +0.884000 78.318900 -36.798900 -79.968800 -0.921208 7.517448 -0.002181 -0.000182 0.005291 -2.048080 -1.469106 -10.842142 -11.153157 -1.212115 -0.635469 -5.872564 0.977909 4.698399 8.123461 -0.165916 -3.138597 0.220653 -0.053854 -0.103416 1.964297 0.157483 0.014472 -5.316882 -0.159196 -0.133176 -10.216156 0.000006 0.000000 0.000772 0.001397 -0.000224 0.000774 -0.001500 0.000266 -7.574259 9.620085 -0.326891 12.467375 -6.573136 -1.765135 2.118053 -0.230824 -0.121774 -1.785639 2.670791 6.751497 -4.848487 -3.038521 0.029975 0.594211 0.576004 6.820088 1.740614 -12.511245 -3.504005 8.673407 14.822175 13.822711 2.957519 0.321837 0.167314 -2.414288 0.792760 -19.301449 -10.505980 -2.426928 3.601316 0.968120 -1.724467 -18.759912 -13.399340 37.389258 20.793464 -6.890534 18.872499 76.370763 0.710052 0.953057 -24.311667 -2.489568 -0.416807 -0.009048 9.826681 -1.675959 32.887900 -15.404469 8.403143 -0.640806 4.035499 -8.098192 32.178141 -0.025235 0.094681 0.062717 -10.262074 0.168157 9.887308 2.185295 -0.429904 -0.009790 -3.693502 4.874146 -25.818009 -9.478231 0.120855 -5.120175 2.856697 6.677502 -25.628849 0.013524 0.066852 -0.038876 -0.007868 0.000003 -0.000040 +0.884000 78.312800 -36.835500 -79.971583 -1.006254 7.650328 -0.002183 -0.000181 0.005289 -2.056247 -1.474502 -10.940283 -11.145827 -1.183456 -0.694711 -5.869172 1.022150 4.665718 8.138655 -0.145830 -3.173550 0.318579 -0.046660 -0.127440 1.796416 0.142679 0.029629 -5.156021 -0.162432 -0.126346 -10.216166 0.000006 0.000000 0.000772 0.001395 -0.000215 0.000771 -0.001496 0.000264 -7.553205 9.612505 -0.330332 12.525963 -6.655202 -1.704610 1.743236 -0.189862 -0.100901 -1.519632 2.759991 6.768831 -4.879578 -3.063036 0.042307 0.591417 0.590973 6.775745 1.718428 -12.531602 -3.494944 8.746454 14.867517 13.841671 2.610489 0.283628 0.148546 -2.072536 0.910979 -19.262459 -10.570400 -2.502691 3.626523 0.963967 -1.701811 -18.607889 -13.062814 36.936277 20.567387 -8.694840 19.050630 75.245892 0.637813 1.008188 -24.403569 -2.482669 -0.415653 -0.008996 9.847032 -1.678433 32.846875 -15.319682 8.410828 -0.639216 4.073219 -8.077039 32.121563 -0.042710 0.114166 0.062597 -10.358633 0.270850 9.772350 2.398053 -0.471772 -0.009862 -3.810840 4.806837 -25.826550 -9.498455 0.193422 -5.106136 2.859643 6.681019 -25.598224 0.017316 0.086317 -0.045730 -0.007868 0.000003 -0.000040 +0.890100 78.306700 -36.872100 -79.978881 -1.056651 7.769087 -0.002178 -0.000181 0.005286 -2.068372 -1.500282 -11.035575 -11.138441 -1.151791 -0.726148 -5.844826 1.068091 4.632652 8.139898 -0.124928 -3.208548 0.304573 -0.055481 -0.138284 1.719449 0.117924 0.054466 -4.974111 -0.140161 -0.108003 -10.216145 0.000006 0.000000 0.000780 0.001398 -0.000219 0.000779 -0.001497 0.000256 -7.532130 9.604895 -0.333773 12.584653 -6.737205 -1.643995 1.410052 -0.153564 -0.082120 -1.281648 2.849238 6.787127 -4.889807 -3.090012 0.055749 0.593409 0.595815 6.810297 1.697064 -12.531025 -3.485415 8.803499 14.895639 13.854730 2.312029 0.250857 0.132213 -1.767208 0.994949 -19.217652 -10.607240 -2.573448 3.673857 0.962438 -1.693579 -18.552604 -12.352408 35.929151 19.811430 -9.035601 18.992658 74.226289 0.584803 1.053679 -24.508985 -2.379192 -0.398338 -0.008266 9.767273 -1.680152 32.843303 -15.234897 8.418519 -0.637640 4.025222 -8.086735 32.108108 -0.037294 0.124080 0.066960 -10.455373 0.351844 9.679911 2.590215 -0.509589 -0.009795 -3.913223 4.763214 -25.836960 -9.504789 0.264473 -5.106114 2.862607 6.684534 -25.567621 0.021109 0.105785 -0.052592 -0.007871 0.000003 -0.000043 +0.902300 78.300600 -36.908800 -79.986078 -1.107064 7.873882 -0.002181 -0.000182 0.005289 -2.076952 -1.507624 -11.098133 -11.131306 -1.140989 -0.755327 -5.820403 1.113255 4.613532 8.141159 -0.104027 -3.243545 0.381502 -0.064530 -0.149034 1.551588 0.093090 0.079376 -4.792258 -0.136982 -0.098314 -10.216150 0.000005 0.000000 0.000775 0.001397 -0.000222 0.000775 -0.001495 0.000252 -7.511067 9.597311 -0.337208 12.614823 -6.828597 -1.595677 1.118505 -0.121895 -0.065513 -1.071664 2.935573 6.785685 -4.898396 -3.103085 0.069272 0.595389 0.600657 6.844852 1.675523 -12.530129 -3.496905 8.840175 14.916640 13.871779 2.055214 0.222725 0.118030 -1.496699 1.083837 -19.193455 -10.644015 -2.644225 3.700161 0.958780 -1.674026 -18.421316 -11.070144 33.870112 18.305488 -9.130877 18.544116 72.239988 0.518344 1.102900 -24.614112 -2.372295 -0.397185 -0.008211 9.793401 -1.667938 32.844310 -15.150106 8.426195 -0.657052 4.071795 -8.075449 32.092590 -0.031867 0.133998 0.071312 -10.552394 0.423883 9.561156 2.782370 -0.547401 -0.009596 -4.014668 4.720348 -25.784599 -9.512617 0.321612 -5.106062 2.845931 6.661408 -25.501403 0.021109 0.105784 -0.052595 -0.007873 0.000003 -0.000043 +0.896200 78.294500 -36.945400 -79.990304 -1.178266 7.964711 -0.002180 -0.000181 0.005289 -2.071786 -1.517661 -11.160319 -11.123983 -1.116287 -0.786015 -5.816875 1.156730 4.594793 8.156392 -0.083989 -3.292505 0.374507 -0.060083 -0.143624 1.439684 0.053370 0.118983 -4.596380 -0.133793 -0.088602 -10.216140 0.000006 -0.000001 0.000773 0.001395 -0.000212 0.000775 -0.001497 0.000259 -7.490008 9.589717 -0.340636 12.645609 -6.911214 -1.558135 0.875540 -0.095568 -0.051547 -0.896651 2.994153 6.789657 -4.906980 -3.116163 0.082795 0.597365 0.605505 6.879411 1.653162 -12.550179 -3.508880 8.856493 14.930483 13.892821 1.846986 0.199966 0.106437 -1.270202 1.168385 -19.166882 -10.680775 -2.715021 3.726418 0.957618 -1.667853 -18.379843 -9.680465 30.929070 16.583346 -9.395989 17.986526 69.326966 0.455508 1.165277 -24.679487 -2.255009 -0.377559 -0.007421 9.703124 -1.678687 32.819370 -15.079302 8.412759 -0.674412 4.014910 -8.075228 32.060160 -0.040236 0.141587 0.075696 -10.627861 0.504645 9.468623 2.940231 -0.578464 -0.009348 -4.116586 4.676981 -25.767246 -9.527305 0.316178 -5.105989 2.834330 6.645397 -25.462360 0.021097 0.105787 -0.052589 -0.007870 0.000004 -0.000042 +0.902300 78.288400 -36.963700 -79.996367 -1.235626 8.034517 -0.002184 -0.000180 0.005289 -2.066644 -1.527698 -11.222495 -11.116638 -1.091585 -0.816705 -5.813349 1.200203 4.576072 8.170788 -0.077906 -3.327459 0.423486 -0.055777 -0.138159 1.264874 0.013462 0.158509 -4.400548 -0.130572 -0.078901 -10.216138 0.000006 0.000000 0.000773 0.001398 -0.000219 0.000774 -0.001498 0.000266 -7.468923 9.582104 -0.344072 12.655765 -6.981866 -1.514440 0.674223 -0.073800 -0.039897 -0.756672 3.055627 6.816095 -4.915556 -3.129252 0.096317 0.598554 0.608411 6.900146 1.652828 -12.557077 -3.516053 8.852412 14.937137 13.917876 1.687339 0.182545 0.097492 -1.082371 1.240284 -19.136843 -10.695065 -2.753230 3.753707 0.954886 -1.653456 -18.283120 -8.881152 27.940432 15.496195 -9.579549 17.352514 66.220562 0.412994 1.222235 -24.745248 -2.248121 -0.376405 -0.007381 9.719305 -1.665378 32.826972 -15.008489 8.399289 -0.691755 4.062971 -8.065613 32.051479 -0.047867 0.144727 0.066843 -10.702949 0.583689 9.413806 3.098082 -0.609525 -0.009010 -4.203762 4.657097 -25.765605 -9.531355 0.408087 -5.105963 2.834541 6.645374 -25.440255 0.023629 0.118765 -0.057163 -0.007872 0.000003 -0.000045 +0.908400 78.282300 -36.988100 -80.002368 -1.292994 8.083385 -0.002184 -0.000180 0.005287 -2.087992 -1.527471 -11.250776 -11.123235 -1.063672 -0.819842 -5.793628 1.216939 4.555469 8.171228 -0.070971 -3.362440 0.388521 -0.051267 -0.132777 1.174018 -0.026360 0.197975 -4.204671 -0.114552 -0.063489 -10.216138 0.000006 0.000000 0.000774 0.001396 -0.000215 0.000774 -0.001494 0.000256 -7.447867 9.574510 -0.347495 12.666041 -7.052524 -1.470725 0.493732 -0.054318 -0.029387 -0.616707 3.115208 6.828526 -4.921704 -3.121495 0.109970 0.599737 0.611320 6.920888 1.652663 -12.564288 -3.502202 8.843802 14.915458 13.941052 1.548503 0.167414 0.089675 -0.894580 1.312288 -19.107099 -10.709328 -2.791445 3.781001 0.953707 -1.647285 -18.241661 -8.361557 24.860101 14.642778 -9.718787 16.692754 62.953526 0.371715 1.283578 -24.797727 -2.144629 -0.359086 -0.006711 9.634232 -1.671550 32.816207 -14.937683 8.385818 -0.695094 4.009033 -8.068645 32.032764 -0.055490 0.147869 0.057988 -10.764139 0.653720 9.376637 3.228471 -0.635180 -0.008664 -4.267167 4.622332 -25.766122 -9.532104 0.401132 -5.105954 2.834743 6.645359 -25.418161 0.026165 0.131741 -0.061738 -0.007871 0.000004 -0.000040 +0.914500 78.276200 -37.018600 -80.011300 -1.329586 8.111163 -0.002179 -0.000182 0.005289 -2.088766 -1.531328 -11.278501 -11.115849 -1.035960 -0.822723 -5.775062 1.248355 4.521675 8.171679 -0.064035 -3.397426 0.423510 -0.046920 -0.127332 1.013238 -0.061463 0.212558 -4.022786 -0.098466 -0.048160 -10.216146 0.000006 0.000000 0.000772 0.001397 -0.000221 0.000772 -0.001496 0.000256 -7.426806 9.566908 -0.350917 12.676330 -7.123158 -1.426986 0.334056 -0.037113 -0.020032 -0.511791 3.188597 6.840770 -4.929463 -3.127634 0.109546 0.600923 0.614230 6.941620 1.638067 -12.570726 -3.505352 8.821614 14.888972 13.966882 1.444383 0.156078 0.083789 -0.751208 1.377949 -19.088413 -10.734796 -2.845979 3.793744 0.952525 -1.641117 -18.200181 -8.136261 21.678314 13.977878 -9.792698 16.023310 59.498352 0.374205 1.292691 -24.704965 -2.137729 -0.357931 -0.006665 9.588981 -1.648012 32.694995 -14.881012 8.372235 -0.696360 3.982626 -8.039059 31.909551 -0.105284 0.190916 0.033476 -10.825043 0.728345 9.352757 3.338295 -0.656791 -0.008326 -4.259802 4.634084 -25.773956 -9.567627 0.397967 -5.105710 2.834954 6.645337 -25.396076 0.026163 0.131743 -0.061739 -0.007873 0.000004 -0.000043 +0.920600 78.270100 -37.030900 -80.020213 -1.366180 8.117967 -0.002179 -0.000180 0.005290 -2.088577 -1.530363 -11.271566 -11.108444 -1.008247 -0.825607 -5.756477 1.279758 4.487879 8.173004 -0.043111 -3.411441 0.374551 -0.042387 -0.121956 0.943440 -0.106224 0.237106 -3.854919 -0.101468 -0.041490 -10.216139 0.000006 0.000000 0.000777 0.001399 -0.000226 0.000776 -0.001497 0.000257 -7.405742 9.559307 -0.354339 12.686022 -7.210120 -1.396482 0.202153 -0.022920 -0.012275 -0.406860 3.248152 6.854838 -4.916361 -3.136197 0.110265 0.602102 0.617140 6.962355 1.623470 -12.577183 -3.508514 8.751995 14.845676 14.001997 1.416611 0.153062 0.082212 -0.628347 1.448159 -19.069405 -10.760237 -2.900512 3.806447 0.946948 -1.641282 -18.108536 -8.236552 18.487080 13.453331 -9.730452 15.310591 55.883088 0.303137 1.377762 -24.820955 -2.041150 -0.341767 -0.006082 9.557570 -1.643640 32.812485 -14.824222 8.337663 -0.718595 4.004627 -8.063724 32.012236 -0.051168 0.164313 0.060078 -10.823934 0.742506 9.436652 3.386342 -0.666242 -0.008169 -4.358143 4.636564 -25.827580 -9.512141 0.455244 -5.106126 2.841065 6.654270 -25.452131 -0.019857 0.188024 -0.077154 -0.007872 0.000004 -0.000039 +0.926700 78.264000 -37.043100 -80.029131 -1.402779 8.096723 -0.002179 -0.000181 0.005290 -2.088385 -1.529399 -11.264644 -11.101050 -0.980538 -0.828493 -5.757084 1.287483 4.474306 8.174323 -0.022188 -3.425458 0.325595 -0.037857 -0.116574 0.873570 -0.136200 0.276455 -3.708029 -0.104437 -0.034847 -10.216159 0.000006 -0.000000 0.000777 0.001397 -0.000214 0.000776 -0.001497 0.000263 -7.384677 9.551700 -0.357757 12.668063 -7.286987 -1.380579 0.098017 -0.011727 -0.006123 -0.336952 3.305692 6.856945 -4.924123 -3.142339 0.123827 0.603281 0.620052 6.983093 1.637521 -12.584713 -3.505673 8.756968 14.828802 14.022512 1.291663 0.139477 0.075120 -0.489459 1.493621 -19.048037 -10.770162 -2.923707 3.819936 0.945752 -1.635115 -18.067066 -8.623852 15.342931 12.981434 -9.524329 14.547681 52.179736 0.304723 1.410053 -24.728297 -2.020459 -0.338304 -0.005954 9.529166 -1.641309 32.741226 -14.767520 8.317051 -0.740801 3.987017 -8.043998 31.930083 -0.083869 0.190091 0.042276 -10.919846 0.818103 9.413597 3.516740 -0.691897 -0.007697 -4.395571 4.603117 -25.781637 -9.505947 0.447534 -5.106180 2.825701 6.632900 -25.392721 0.026160 0.131743 -0.061741 -0.007870 0.000003 -0.000041 +0.932800 78.257900 -37.055300 -80.038071 -1.439372 8.075527 -0.002179 -0.000181 0.005290 -2.101340 -1.522812 -11.237281 -11.093616 -0.950562 -0.810523 -5.757685 1.295208 4.460736 8.173884 -0.029213 -3.460421 0.360585 -0.033501 -0.111139 0.726736 -0.156656 0.305646 -3.575148 -0.094618 -0.022496 -10.216135 0.000006 0.000001 0.000777 0.001399 -0.000224 0.000776 -0.001496 0.000258 -7.363612 9.544079 -0.361177 12.651039 -7.342101 -1.347029 0.014705 -0.002783 -0.001191 -0.266989 3.342456 6.861891 -4.930274 -3.134586 0.137476 0.604467 0.622959 7.003826 1.638067 -12.570729 -3.505354 8.673857 14.780634 14.060176 1.298612 0.140233 0.075511 -0.398840 1.547688 -19.039362 -10.780068 -2.946902 3.847408 0.944551 -1.628948 -18.025605 -9.185951 12.303327 12.481201 -9.226610 13.738937 48.484723 0.258992 1.481790 -24.776177 -1.930770 -0.323293 -0.005436 9.473407 -1.639829 32.808684 -14.710841 8.296428 -0.748989 4.000214 -8.058799 31.991698 -0.049324 0.153331 0.049082 -10.918898 0.842729 9.442069 3.551051 -0.698649 -0.007563 -4.421634 4.627568 -25.786471 -9.499752 0.439823 -5.106225 2.820440 6.625780 -25.387634 -0.009948 0.165843 -0.070438 -0.007874 0.000004 -0.000044 +0.938900 78.251800 -37.067500 -80.049958 -1.455182 8.054230 -0.002181 -0.000181 0.005289 -2.114300 -1.516230 -11.209922 -11.086494 -0.941447 -0.790298 -5.730463 1.306244 4.425583 8.174340 -0.022260 -3.481413 0.311633 -0.037375 -0.071799 0.663940 -0.191591 0.320224 -3.456238 -0.084767 -0.010190 -10.216146 0.000006 0.000000 0.000769 0.001396 -0.000215 0.000771 -0.001498 0.000263 -7.356315 9.550880 -0.362216 12.634053 -7.397228 -1.313489 -0.068601 0.006160 0.003755 -0.197028 3.379223 6.866803 -4.936426 -3.126831 0.137146 0.602499 0.618110 6.969262 1.637791 -12.577712 -3.505518 8.614076 14.754704 14.077137 1.270842 0.137214 0.073931 -0.298991 1.578482 -19.028093 -10.808050 -2.987718 3.873937 0.943347 -1.622787 -17.984143 -9.922110 9.359161 11.958212 -8.835751 12.850110 44.797309 0.258791 1.507702 -24.681222 -1.903171 -0.318672 -0.005283 9.436191 -1.626638 32.736936 -14.682351 8.261634 -0.753095 3.984084 -8.040711 31.916398 -0.074029 0.173747 0.033519 -10.987412 0.897659 9.425403 3.653994 -0.718900 -0.007134 -4.447837 4.611858 -25.741801 -9.493558 0.432113 -5.106271 2.818342 6.622175 -25.329881 0.024901 0.125254 -0.059457 -0.007873 0.000004 -0.000040 +0.945000 78.245700 -37.055300 -80.047995 -1.469036 8.033290 -0.002184 -0.000180 0.005287 -2.107054 -1.515659 -11.195876 -11.079416 -0.934591 -0.790937 -5.724086 1.314509 4.411849 8.174790 -0.015307 -3.502406 0.283651 -0.019637 -0.050152 0.601176 -0.226543 0.334765 -3.358306 -0.085433 -0.025672 -10.216162 0.000006 -0.000000 0.000772 0.001395 -0.000212 0.000776 -0.001499 0.000268 -7.349023 9.557666 -0.363269 12.617823 -7.439208 -1.296196 -0.124140 0.012115 0.007062 -0.127064 3.416000 6.871659 -4.928658 -3.120687 0.137569 0.602892 0.619078 6.976175 1.637516 -12.584716 -3.505684 8.554364 14.728780 14.094076 1.243078 0.134195 0.072345 -0.199155 1.609296 -19.016876 -10.822242 -3.025960 3.880181 0.942136 -1.616623 -17.942678 -10.904209 6.660421 11.104683 -8.363102 12.010460 41.111499 0.223047 1.562941 -24.724784 -1.827293 -0.305971 -0.004874 9.396637 -1.611864 32.811990 -14.653838 8.226834 -0.757178 3.997284 -8.055498 31.977976 -0.041325 0.147965 0.051317 -10.986318 0.911822 9.509287 3.681457 -0.724305 -0.007012 -4.452865 4.630616 -25.783547 -9.490402 0.396589 -5.106299 2.824644 6.631100 -25.363846 -0.000006 0.143657 -0.063734 -0.007872 0.000003 -0.000042 +0.951100 78.251800 -37.055300 -80.046049 -1.482891 7.984382 -0.002183 -0.000181 0.005288 -2.099813 -1.515087 -11.181850 -11.086298 -0.926034 -0.777893 -5.717703 1.322771 4.398121 8.175251 -0.008354 -3.523399 0.332627 -0.001963 -0.028480 0.447341 -0.242252 0.368646 -3.260387 -0.086126 -0.041153 -10.216147 0.000006 0.000000 0.000778 0.001398 -0.000220 0.000777 -0.001499 0.000261 -7.342350 9.543481 -0.364518 12.580011 -7.491121 -1.290679 -0.117201 0.011370 0.006652 -0.113250 3.482264 6.889818 -4.925731 -3.156236 0.137731 0.575499 0.649275 6.995032 1.652385 -12.571266 -3.502363 8.460780 14.690757 14.117514 1.312488 0.141739 0.076304 -0.160848 1.653551 -19.003951 -10.840311 -3.043582 3.886230 0.914583 -1.609877 -17.938186 -12.043498 4.245220 10.007254 -7.873145 11.234613 37.424580 0.227229 1.578310 -24.656426 -1.792794 -0.300197 -0.004690 9.371959 -1.614528 32.782924 -14.625450 8.206016 -0.775220 3.989945 -8.047286 31.943767 -0.064593 0.159761 0.053492 -11.027480 0.941722 9.507775 3.750088 -0.737805 -0.006705 -4.471601 4.626743 -25.739734 -9.485716 0.374969 -5.106323 2.815823 6.618608 -25.316311 0.023631 0.118767 -0.057160 -0.007867 0.000003 -0.000041 +0.945000 78.251800 -37.049200 -80.057974 -1.498677 7.935166 -0.002183 -0.000182 0.005292 -2.112396 -1.506590 -11.140621 -11.093167 -0.917480 -0.764849 -5.711320 1.331033 4.384385 8.175695 -0.001374 -3.523406 0.304628 0.029031 0.009434 0.384549 -0.272316 0.388085 -3.183445 -0.092562 -0.043903 -10.216155 0.000006 0.000000 0.000778 0.001400 -0.000222 0.000777 -0.001498 0.000261 -7.321500 9.528887 -0.367996 12.577899 -7.533746 -1.271449 -0.193569 0.019555 0.011202 -0.043200 3.490390 6.891533 -4.937229 -3.133781 0.137100 0.596936 0.628814 6.996439 1.666709 -12.571802 -3.499366 8.428180 14.674453 14.129160 1.263897 0.136462 0.073529 -0.077641 1.673844 -18.990441 -10.858368 -3.061203 3.906248 0.927444 -1.608627 -17.909350 -13.286622 2.191172 8.627091 -7.428035 10.539824 33.769736 0.202739 1.621719 -24.638273 -1.716915 -0.287495 -0.004300 9.337573 -1.605731 32.809278 -14.582934 8.185280 -0.795274 3.994354 -8.052222 31.964315 -0.039848 0.139211 0.046950 -11.026973 0.955179 9.525319 3.763816 -0.740506 -0.006636 -4.475724 4.646297 -25.718603 -9.481035 0.353351 -5.106353 2.812050 6.613250 -25.295928 0.003055 0.122834 -0.056949 -0.007871 0.000004 -0.000042 +0.951100 78.245700 -37.037000 -80.069901 -1.514464 7.899836 -0.002181 -0.000181 0.005288 -2.124992 -1.498103 -11.099412 -11.085855 -0.895205 -0.753088 -5.690978 1.340361 4.370330 8.175245 -0.008354 -3.523397 0.276657 0.049175 0.056212 0.321681 -0.282592 0.387731 -3.106545 -0.118141 -0.055245 -10.216142 0.000006 0.000000 0.000777 0.001399 -0.000220 0.000776 -0.001500 0.000269 -7.300025 9.535249 -0.371276 12.505315 -7.573210 -1.262085 -0.138026 0.013603 0.007886 -0.022320 3.532989 6.891358 -4.952760 -3.146068 0.150239 0.618340 0.644929 7.006873 1.681031 -12.572328 -3.496365 8.273741 14.614597 14.164181 1.423550 0.153815 0.082606 -0.040513 1.679942 -18.993458 -10.886305 -3.102045 3.925727 0.971007 -1.601581 -17.893743 -14.614370 0.425041 7.159319 -6.988479 9.869050 30.136308 0.201814 1.645171 -24.594188 -1.675521 -0.280565 -0.004093 9.303647 -1.597237 32.807748 -14.554554 8.164451 -0.799312 3.991417 -8.048930 31.950617 -0.054747 0.143418 0.044735 -11.053179 0.994488 9.616243 3.777537 -0.743205 -0.006575 -4.445205 4.642640 -25.770430 -9.476358 0.331733 -5.106376 2.857988 6.593101 -25.334840 0.021148 0.107610 -0.090217 -0.007871 0.000003 -0.000041 +0.951100 78.233400 -37.037000 -80.071817 -1.500607 7.850806 -0.002181 -0.000181 0.005287 -2.117553 -1.496552 -11.078432 -11.078768 -0.886836 -0.739825 -5.669571 1.335756 4.355478 8.174791 -0.015352 -3.537376 0.248632 0.069292 0.103001 0.272868 -0.312591 0.407206 -3.029623 -0.135136 -0.085695 -10.216142 0.000006 0.000000 0.000779 0.001397 -0.000222 0.000779 -0.001499 0.000256 -7.299817 9.542246 -0.371214 12.518260 -7.598929 -1.262527 -0.200513 0.020299 0.011618 0.019725 3.534096 6.895693 -4.951149 -3.132170 0.164317 0.598511 0.632691 7.024088 1.681031 -12.572328 -3.496365 8.295125 14.600125 14.151933 1.340256 0.144759 0.077881 -0.003368 1.686033 -18.996499 -10.872540 -3.099454 3.926470 0.926634 -1.604529 -17.881705 -16.000418 -0.497447 5.667385 -6.526897 9.217211 26.701950 0.178854 1.667555 -24.569273 -1.599633 -0.267863 -0.003724 9.269264 -1.588448 32.834120 -14.526054 8.122633 -0.803350 3.994356 -8.052218 31.964309 -0.038752 0.132682 0.049207 -11.053708 0.976706 9.607605 3.818722 -0.751307 -0.006370 -4.480052 4.665668 -25.711431 -9.473208 0.296209 -5.127385 2.809517 6.609666 -25.282324 0.011719 0.094160 -0.047942 -0.007869 0.000003 -0.000042 +0.945000 78.239500 -37.030800 -80.073727 -1.486746 7.801829 -0.002180 -0.000180 0.005291 -2.109556 -1.492105 -11.036685 -11.071661 -0.878466 -0.726562 -5.669103 1.329553 4.341116 8.174346 -0.022350 -3.551358 0.220623 0.091372 0.130118 0.224001 -0.327750 0.411835 -2.952667 -0.132384 -0.091892 -10.216158 0.000006 0.000000 0.000775 0.001397 -0.000221 0.000775 -0.001500 0.000268 -7.300028 9.535247 -0.371278 12.482551 -7.606123 -1.256662 -0.179681 0.018068 0.010375 0.019721 3.535064 6.902616 -4.949551 -3.118279 0.150412 0.598053 0.616898 7.012178 1.681030 -12.572329 -3.496365 8.106929 14.528092 14.193161 1.576256 0.170438 0.091241 -0.032193 1.685223 -18.994674 -10.893193 -3.103341 3.925358 0.923698 -1.618068 -17.879851 -17.329194 -0.524807 3.775543 -6.068411 8.657481 23.569970 0.185255 1.691370 -24.518759 -1.558233 -0.260930 -0.003539 9.224465 -1.588793 32.832173 -14.497676 8.101806 -0.807351 3.992883 -8.050576 31.957472 -0.050346 0.117302 0.053746 -11.052721 0.975846 9.733690 3.818727 -0.751308 -0.006374 -4.463926 4.678830 -25.783100 -9.470033 0.260682 -5.127394 2.833452 6.619217 -25.351676 0.003142 0.088625 -0.089825 -0.007875 0.000004 -0.000043 +0.957200 78.239500 -37.018600 -80.073728 -1.486742 7.752884 -0.002181 -0.000181 0.005289 -2.131679 -1.495896 -10.993731 -11.085525 -0.868323 -0.699712 -5.668550 1.322208 4.347707 8.174793 -0.015352 -3.537376 0.269567 0.100341 0.140867 0.112256 -0.353236 0.425917 -2.896694 -0.129605 -0.098142 -10.216149 0.000006 0.000001 0.000771 0.001398 -0.000219 0.000771 -0.001498 0.000266 -7.286051 9.527850 -0.373564 12.355170 -7.609217 -1.263713 0.000825 -0.001287 -0.000369 -0.008441 3.570572 6.906453 -4.950349 -3.125220 0.150372 0.598116 0.631719 7.017166 1.702515 -12.573125 -3.491865 8.135256 14.533572 14.193153 1.486033 0.160615 0.086149 0.018618 1.688335 -18.998111 -10.886311 -3.102045 3.939716 0.926636 -1.604529 -17.881698 -18.572492 0.052873 1.641857 -5.599833 8.153277 20.656601 0.156031 1.690454 -24.455902 -1.482352 -0.248226 -0.003204 9.170839 -1.578282 32.829694 -14.469312 8.080967 -0.825335 3.991417 -8.048927 31.950604 -0.036549 0.119625 0.053715 -11.053082 0.975371 9.689450 3.818721 -0.751306 -0.006374 -4.457256 4.701560 -25.686098 -9.466895 0.225157 -5.127413 2.807007 6.606102 -25.268763 0.014775 0.073338 -0.041155 -0.007874 0.000004 -0.000041 +0.963300 78.233400 -37.018600 -80.073731 -1.486746 7.682908 -0.002185 -0.000181 0.005287 -2.133190 -1.503701 -10.950263 -11.085649 -0.879217 -0.670389 -5.654037 1.315926 4.353980 8.175241 -0.008354 -3.523397 0.241566 0.109123 0.151748 0.084432 -0.378169 0.440539 -2.840772 -0.145973 -0.112999 -10.216135 0.000006 0.000000 0.000772 0.001397 -0.000217 0.000772 -0.001496 0.000256 -7.272096 9.520452 -0.375859 12.403180 -7.641954 -1.263589 -0.096370 0.009136 0.005408 0.033687 3.550910 6.913668 -4.948741 -3.111326 0.150459 0.598511 0.632690 7.024091 1.723996 -12.573918 -3.487371 7.924361 14.462572 14.227731 1.777568 0.192389 0.102556 -0.057134 1.669379 -18.991052 -10.896183 -3.125262 3.953170 0.926635 -1.604527 -17.881695 -19.654457 0.761932 -0.481625 -5.094710 7.553808 17.867999 0.154530 1.712001 -24.374155 -1.440964 -0.241298 -0.003026 9.130691 -1.584191 32.814046 -14.440879 8.046128 -0.843315 3.985552 -8.042348 31.923232 -0.047040 0.097715 0.060502 -11.052568 0.961055 9.797989 3.818725 -0.751308 -0.006373 -4.452735 4.722430 -25.735755 -9.463738 0.189630 -5.127427 2.796513 6.616235 -25.318343 0.013845 0.070702 -0.091998 -0.007870 0.000004 -0.000041 +0.963300 78.233400 -37.012500 -80.077454 -1.459018 7.612855 -0.002184 -0.000181 0.005289 -2.129445 -1.484309 -10.910578 -11.085645 -0.878462 -0.663434 -5.639583 1.310403 4.346282 8.174343 -0.022323 -3.530375 0.213569 0.115920 0.182318 0.056615 -0.403111 0.455148 -2.784811 -0.143215 -0.119236 -10.216158 0.000006 0.000000 0.000774 0.001395 -0.000212 0.000776 -0.001501 0.000274 -7.271879 9.527449 -0.375789 12.367226 -7.654594 -1.262167 -0.033875 0.002436 0.001695 0.005657 3.548876 6.901553 -4.947127 -3.097430 0.150543 0.598116 0.631720 7.017176 1.731704 -12.560212 -3.485553 7.891375 14.432123 14.210568 1.777567 0.192387 0.102558 0.023977 1.680076 -18.997302 -10.933585 -3.153670 3.937133 0.926635 -1.604529 -17.881695 -20.506690 1.011318 -2.262239 -4.549583 6.694717 15.136942 0.125854 1.713050 -24.326801 -1.365067 -0.228591 -0.002715 9.088731 -1.554860 32.825899 -14.412462 8.011290 -0.847275 3.987017 -8.043992 31.930076 -0.026709 0.103279 0.044968 -11.052782 0.956492 9.784773 3.791259 -0.745903 -0.006507 -4.422699 4.729949 -25.668834 -9.458306 0.174962 -5.141422 2.804494 6.602530 -25.255181 0.010492 0.051640 -0.040907 -0.007872 0.000004 -0.000045 +0.957200 78.239500 -37.000300 -80.081149 -1.431282 7.542838 -0.002181 -0.000181 0.005290 -2.129636 -1.485314 -10.868043 -11.085599 -0.875448 -0.635618 -5.639074 1.303820 4.338907 8.173430 -0.036273 -3.523359 0.185595 0.109424 0.196643 0.028909 -0.437962 0.479629 -2.756855 -0.146143 -0.112786 -10.216150 0.000006 -0.000001 0.000777 0.001397 -0.000212 0.000777 -0.001496 0.000256 -7.271670 9.534427 -0.375724 12.218486 -7.662166 -1.276743 0.209096 -0.023664 -0.012685 -0.071471 3.560530 6.890537 -4.947130 -3.097431 0.150540 0.597724 0.630749 7.010263 1.739409 -12.546498 -3.483734 7.806943 14.391333 14.227305 1.923335 0.208306 0.110701 -0.097846 1.646927 -19.006801 -10.885026 -3.108926 3.946776 0.927244 -1.607608 -17.902423 -21.197830 0.432740 -3.345795 -4.066571 5.333230 12.464441 0.098907 1.720595 -24.259642 -1.358179 -0.227437 -0.002691 9.104792 -1.541480 32.840417 -14.405231 7.976344 -0.848282 4.042451 -8.042758 31.933494 -0.024863 0.092301 0.033972 -11.052102 0.929430 9.942102 3.791267 -0.745905 -0.006508 -4.424725 4.754000 -25.759859 -9.455167 0.139435 -5.155421 2.781827 6.632287 -25.351876 0.010817 0.055493 -0.094033 -0.007870 0.000004 -0.000038 +0.969400 78.233400 -37.006400 -80.082057 -1.424348 7.472871 -0.002182 -0.000180 0.005288 -2.143207 -1.481756 -10.812007 -11.085569 -0.872434 -0.607803 -5.637000 1.276344 4.330347 8.159925 -0.028379 -3.516388 0.157581 0.124586 0.193259 0.001172 -0.472824 0.504092 -2.714900 -0.149094 -0.106300 -10.216149 0.000006 -0.000001 0.000772 0.001397 -0.000221 0.000773 -0.001497 0.000252 -7.271469 9.541428 -0.375661 12.281217 -7.679207 -1.261326 0.132733 -0.015454 -0.008181 -0.050358 3.533864 6.900034 -4.944721 -3.076586 0.150673 0.597330 0.629780 7.003355 1.746296 -12.553759 -3.482402 7.722598 14.350480 14.243937 2.069095 0.224245 0.118803 -0.153706 1.620689 -19.021127 -10.879438 -3.100752 3.954074 0.927851 -1.610688 -17.923149 -21.767890 -0.504298 -4.083156 -3.655631 3.733492 9.886327 0.095676 1.735880 -24.153466 -1.254694 -0.210109 -0.002291 9.005813 -1.541432 32.808206 -14.376816 7.941503 -0.852222 3.984125 -8.040732 31.894258 -0.024144 0.087995 0.042849 -11.052367 0.907557 9.964461 3.715772 -0.731055 -0.006856 -4.358392 4.779777 -25.710695 -9.431182 0.101617 -5.155472 2.815822 6.618581 -25.316315 0.013025 0.064616 -0.045477 -0.007872 0.000004 -0.000042 +0.975500 78.233400 -37.000300 -80.082961 -1.417413 7.374913 -0.002184 -0.000180 0.005288 -2.154189 -1.464608 -10.757884 -11.085535 -0.869419 -0.579989 -5.635906 1.262033 4.336538 8.146406 -0.020486 -3.509409 0.150548 0.128989 0.198692 0.001441 -0.507465 0.528795 -2.672926 -0.152040 -0.099812 -10.216150 0.000006 0.000000 0.000775 0.001397 -0.000222 0.000776 -0.001497 0.000275 -7.271675 9.534434 -0.375725 12.245588 -7.689575 -1.285007 0.229937 -0.025908 -0.013911 -0.113326 3.504970 6.900850 -4.928380 -3.057347 0.151548 0.596942 0.628810 6.996436 1.767509 -12.561532 -3.478065 7.644849 14.294579 14.245778 2.214853 0.240204 0.126867 -0.230080 1.598942 -19.034914 -10.873849 -3.092580 3.961373 0.928052 -1.611719 -17.930082 -22.155677 -1.465339 -4.785635 -3.359429 2.022459 7.485411 0.090715 1.744609 -24.067102 -1.247804 -0.208957 -0.002266 9.007863 -1.521755 32.808093 -14.348423 7.906655 -0.877117 4.026900 -8.035882 31.884822 -0.023418 0.083688 0.051715 -11.051950 0.893005 10.050872 3.715771 -0.731054 -0.006862 -4.368782 4.802783 -25.709986 -9.407192 0.063798 -5.155513 2.765449 6.633442 -25.323270 0.011279 0.055895 -0.049809 -0.007872 0.000003 -0.000039 +0.975500 78.239500 -36.994200 -80.086524 -1.389664 7.276899 -0.002185 -0.000180 0.005289 -2.150707 -1.446208 -10.675685 -11.085510 -0.866405 -0.552172 -5.634825 1.247725 4.342737 8.145509 -0.034437 -3.502402 0.143606 0.120112 0.187875 -0.012433 -0.522445 0.553378 -2.658935 -0.154935 -0.093397 -10.216156 0.000006 0.000000 0.000775 0.001398 -0.000217 0.000774 -0.001495 0.000271 -7.271882 9.527445 -0.375790 12.096646 -7.703573 -1.313933 0.514556 -0.056564 -0.030601 -0.225565 3.538259 6.895970 -4.913668 -3.052006 0.152330 0.597724 0.630749 7.010257 1.789531 -12.548339 -3.473257 7.553639 14.233821 14.250054 2.360618 0.256186 0.134888 -0.306466 1.577210 -19.048732 -10.852832 -3.053021 3.948514 0.928255 -1.612742 -17.936978 -22.355020 -2.385682 -5.443318 -3.188963 0.297139 5.261760 0.082332 1.740243 -24.020339 -1.165013 -0.195092 -0.001979 8.923829 -1.507592 32.860341 -14.348272 7.871679 -0.884134 3.992933 -8.050616 31.935352 -0.021569 0.072715 0.040740 -11.051508 0.878449 10.137288 3.612826 -0.710802 -0.007309 -4.272034 4.824858 -25.719765 -9.386255 -0.001831 -5.155521 2.818338 6.622145 -25.329895 0.009507 0.047178 -0.054131 -0.007871 0.000003 -0.000040 +0.969400 78.227300 -36.988100 -80.090043 -1.361905 7.164921 -0.002188 -0.000180 0.005290 -2.149797 -1.441417 -10.591565 -11.085484 -0.863391 -0.524358 -5.633737 1.233415 4.348932 8.144605 -0.048388 -3.495388 0.136653 0.111236 0.177059 -0.026296 -0.537432 0.577958 -2.644908 -0.132952 -0.091127 -10.216159 0.000006 -0.000000 0.000774 0.001397 -0.000219 0.000775 -0.001498 0.000268 -7.271676 9.534435 -0.375725 12.166231 -7.727488 -1.311711 0.465964 -0.051326 -0.027758 -0.239438 3.495676 6.895705 -4.910448 -3.024217 0.152497 0.597331 0.629780 7.003352 1.797235 -12.534629 -3.471445 7.462467 14.173030 14.254199 2.527192 0.274473 0.144007 -0.409282 1.532917 -19.058005 -10.831801 -3.013466 3.935637 0.929061 -1.616852 -17.964617 -22.426393 -3.258304 -6.048515 -3.185185 -1.302972 3.113966 0.079629 1.757682 -23.907549 -1.158114 -0.193939 -0.001951 8.920420 -1.492332 32.860047 -14.348081 7.822713 -0.891150 4.017694 -8.046690 31.934440 -0.019708 0.061740 0.029750 -11.050862 0.868468 10.236940 3.551049 -0.698648 -0.007561 -4.272030 4.824852 -25.719759 -9.345297 -0.013366 -5.155519 2.819588 6.623928 -25.336660 0.005221 0.025480 -0.053883 -0.007874 0.000003 -0.000039 +0.981600 78.227300 -36.982000 -80.076866 -1.355215 7.052133 -0.002182 -0.000181 0.005291 -2.152886 -1.430272 -10.519568 -11.102665 -0.864440 -0.483945 -5.631173 1.221736 4.351581 8.136408 -0.040211 -3.473669 0.118444 0.106298 0.174374 -0.034077 -0.558798 0.586728 -2.627743 -0.122559 -0.082876 -10.216147 0.000006 0.000000 0.000775 0.001396 -0.000209 0.000777 -0.001498 0.000254 -7.293735 9.532231 -0.384730 12.037004 -7.727130 -1.329859 0.735310 -0.078209 -0.041939 -0.362057 3.502668 6.899287 -4.890682 -3.015431 0.137165 0.600730 0.624735 7.001074 1.810885 -12.537487 -3.480328 7.385800 14.124076 14.276956 2.701880 0.293680 0.153514 -0.516279 1.507525 -19.060128 -10.819427 -2.999576 3.948537 0.931837 -1.621172 -17.992559 -22.482836 -4.085838 -6.605772 -3.316071 -2.825269 1.042974 0.062493 1.769542 -23.778834 -1.146871 -0.192055 -0.001914 8.910519 -1.475776 32.839488 -14.342419 7.778842 -0.902320 4.038755 -8.035415 31.909725 -0.009874 0.040622 0.042366 -11.038634 0.841201 10.340461 3.481382 -0.684942 -0.007828 -4.171101 4.875656 -25.710142 -9.353370 -0.104413 -5.187148 2.820254 6.631478 -25.364602 0.001919 0.013714 -0.042772 -0.007872 0.000003 -0.000040 +0.981600 78.227300 -36.982000 -80.078573 -1.341333 6.947170 -0.002180 -0.000181 0.005290 -2.151100 -1.420598 -10.450271 -11.102625 -0.860671 -0.449176 -5.643532 1.199783 4.350693 8.136406 -0.040193 -3.459682 0.118446 0.106297 0.174371 -0.054935 -0.573852 0.601335 -2.627738 -0.122560 -0.082876 -10.216147 0.000006 0.000000 0.000777 0.001398 -0.000219 0.000776 -0.001498 0.000264 -7.293736 9.532236 -0.384731 12.085734 -7.745727 -1.336055 0.749184 -0.079708 -0.042747 -0.417999 3.467832 6.907519 -4.887452 -2.987635 0.137334 0.600732 0.624734 7.001075 1.810891 -12.537472 -3.480320 7.300191 14.069921 14.274566 2.875394 0.312789 0.162895 -0.631296 1.473015 -19.070155 -10.797125 -2.966896 3.949698 0.931840 -1.621173 -17.992568 -22.520122 -4.863021 -7.119779 -3.560217 -4.249158 -0.950904 0.064288 1.776666 -23.670545 -1.084780 -0.181660 -0.001713 8.826359 -1.472054 32.835947 -14.328132 7.729927 -0.904256 3.989225 -8.043251 31.911559 -0.009877 0.040621 0.042372 -11.038027 0.824617 10.442377 3.419610 -0.672789 -0.008056 -4.171096 4.875650 -25.710120 -9.297751 -0.110555 -5.187037 2.820250 6.631475 -25.364592 0.001909 0.013718 -0.042777 -0.007873 0.000003 -0.000040 +0.981600 78.227300 -36.969800 -80.059414 -1.324921 6.842714 -0.002180 -0.000180 0.005290 -2.163084 -1.408397 -10.381309 -11.102587 -0.856904 -0.414408 -5.655892 1.177832 4.349798 8.122448 -0.039285 -3.445707 0.097518 0.088529 0.152744 -0.054787 -0.588700 0.616160 -2.613717 -0.103444 -0.074236 -10.216135 0.000007 -0.000000 0.000775 0.001398 -0.000214 0.000775 -0.001498 0.000264 -7.293736 9.532236 -0.384733 11.958816 -7.739870 -1.354226 1.026867 -0.109760 -0.058770 -0.558164 3.472334 6.901193 -4.859629 -2.990858 0.138787 0.600728 0.624736 7.001083 1.839531 -12.538523 -3.474344 7.219639 13.998885 14.292620 3.048898 0.331920 0.172221 -0.746308 1.438520 -19.080272 -10.774789 -2.934206 3.950844 0.934448 -1.634529 -18.082400 -22.550421 -5.535109 -7.563674 -3.981434 -5.529681 -2.786733 0.066520 1.785546 -23.622004 -1.077877 -0.180503 -0.001691 8.813124 -1.445266 32.898088 -14.313852 7.681015 -0.927154 4.009235 -8.055126 31.958694 -0.006575 0.021034 0.049131 -11.009643 0.800853 10.523841 3.344117 -0.657935 -0.008314 -4.064976 4.925527 -25.693387 -9.316219 -0.214073 -5.187088 2.820249 6.631475 -25.364591 -0.001873 -0.005753 -0.035923 -0.007874 0.000003 -0.000039 +0.981600 78.227300 -36.957600 -80.042711 -1.287717 6.738145 -0.002178 -0.000181 0.005293 -2.175079 -1.396211 -10.312350 -11.116550 -0.853039 -0.379845 -5.654305 1.156939 4.348618 8.107593 -0.052342 -3.431713 0.076550 0.079622 0.141945 -0.054640 -0.603549 0.630988 -2.599733 -0.092938 -0.046464 -10.216163 0.000006 -0.000000 0.000775 0.001398 -0.000226 0.000777 -0.001499 0.000275 -7.322344 9.532676 -0.352254 12.022126 -7.750374 -1.369213 1.061576 -0.113520 -0.060761 -0.628113 3.435525 6.896388 -4.828575 -2.966284 0.140401 0.600729 0.624737 7.001074 1.846862 -12.539094 -3.451829 7.156627 13.964465 14.294982 3.236287 0.352616 0.182226 -0.881831 1.408552 -19.089935 -10.752459 -2.901523 3.930998 0.935044 -1.637612 -18.103124 -22.527350 -6.092878 -7.928951 -4.531375 -6.639554 -4.459572 0.065567 1.781735 -23.546753 -1.070986 -0.179349 -0.001668 8.800537 -1.418938 32.918264 -14.320814 7.653020 -0.933217 4.023376 -8.060398 31.978403 -0.003271 0.001448 0.055898 -10.995230 0.777277 10.605629 3.268622 -0.643082 -0.008552 -4.061242 4.931445 -25.693795 -9.260596 -0.220213 -5.186880 2.822768 6.635041 -25.378155 -0.006636 -0.029685 -0.042293 -0.007869 0.000003 -0.000038 +0.981600 78.227300 -36.945400 -80.039841 -1.252170 6.654285 -0.002181 -0.000181 0.005292 -2.173325 -1.386535 -10.243062 -11.130664 -0.871547 -0.356930 -5.652712 1.136046 4.347447 8.092756 -0.065404 -3.417726 0.083607 0.057502 0.114861 -0.068678 -0.598744 0.625890 -2.585733 -0.099327 -0.049312 -10.216137 -0.011791 0.017353 0.000778 0.001397 -0.000210 0.000779 -0.001498 0.000269 -7.321535 9.553941 -0.373070 11.881830 -7.729571 -1.395800 1.394784 -0.149695 -0.079780 -0.810292 3.432979 6.893450 -4.813852 -2.960946 0.141159 0.600733 0.624735 7.001076 1.854387 -12.525072 -3.471034 7.093618 13.930069 14.297318 3.402861 0.371045 0.191065 -1.021814 1.358300 -19.096661 -10.730122 -2.868847 3.925131 0.935638 -1.640695 -18.123876 -22.496106 -6.571027 -8.225894 -5.162662 -7.649903 -6.010339 0.064601 1.777922 -23.471476 -1.064080 -0.178194 -0.001644 8.785275 -1.422346 32.917677 -14.327778 7.625015 -0.939289 4.033105 -8.060746 31.977580 -0.003267 0.001448 0.055893 -10.980772 0.753718 10.687428 3.172521 -0.624172 -0.008818 -3.949562 4.977248 -25.705637 -9.283747 -0.302101 -5.207970 2.825296 6.638610 -25.391756 -0.007630 -0.034145 -0.055515 -0.007869 0.000003 -0.000038 +0.981600 78.227300 -36.933200 -80.035301 -1.230526 6.570440 -0.002183 -0.000181 0.005291 -2.172280 -1.380726 -10.201485 -11.144751 -0.890063 -0.334023 -5.673115 1.127492 4.347462 8.105829 -0.080225 -3.403700 0.062620 0.057460 0.114882 -0.068581 -0.608660 0.655559 -2.571730 -0.080204 -0.040676 -10.216153 0.000006 0.000000 0.000776 0.001398 -0.000222 0.000775 -0.001498 0.000263 -7.342990 9.554246 -0.348707 11.939041 -7.720147 -1.413807 1.429484 -0.153466 -0.081755 -0.887246 3.396154 6.889018 -4.799130 -2.955608 0.127932 0.600730 0.624736 7.001078 1.862257 -12.511676 -3.448207 7.044111 13.900529 14.297183 3.569417 0.389495 0.199848 -1.162221 1.306191 -19.117361 -10.707772 -2.836169 3.919244 0.936242 -1.643779 -18.144589 -22.420933 -6.977339 -8.479740 -5.859446 -8.541689 -7.451455 0.060487 1.761236 -23.391615 -1.057176 -0.177037 -0.001628 8.770005 -1.425767 32.917103 -14.334760 7.597013 -0.945350 4.033959 -8.051131 31.979892 -0.002514 -0.002999 0.042655 -10.966482 0.723332 10.749385 3.090176 -0.607969 -0.009027 -3.955510 4.980964 -25.705098 -9.228116 -0.308262 -5.207671 2.827823 6.642173 -25.405327 -0.007134 -0.031914 -0.048902 -0.007873 0.000004 -0.000038 +0.981600 78.227300 -36.921000 -80.016839 -1.207282 6.514883 -0.002187 -0.000180 0.005289 -2.171236 -1.374921 -10.159917 -11.158741 -0.887725 -0.313376 -5.679483 1.118853 4.368153 8.105832 -0.080235 -3.410696 0.041644 0.046586 0.123755 -0.068588 -0.608660 0.655559 -2.571734 -0.080204 -0.040677 -10.202165 -0.003925 0.005785 0.000777 0.001398 -0.000224 0.000775 -0.001495 0.000261 -7.364452 9.554560 -0.324347 11.841827 -7.687041 -1.440677 1.721022 -0.185219 -0.098190 -1.055357 3.379823 6.887027 -4.784404 -2.950277 0.114701 0.600731 0.624735 7.001075 1.869057 -12.526213 -3.426013 7.028310 13.883173 14.291000 3.708217 0.404888 0.207131 -1.298177 1.274430 -19.141200 -10.688020 -2.789750 3.913222 0.939005 -1.658173 -18.241333 -22.294209 -7.223404 -8.587832 -6.623351 -9.234559 -8.615708 0.059973 1.759189 -23.376104 -1.029585 -0.172416 -0.001544 8.740587 -1.412330 32.971724 -14.327625 7.569059 -0.953294 4.018631 -8.076209 32.026433 0.019720 -0.050830 0.045218 -10.952660 0.712058 10.738163 3.021550 -0.594466 -0.009181 -3.858936 4.988713 -25.624027 -9.256675 -0.375472 -5.207843 2.818983 6.629685 -25.357777 0.009459 -0.093505 -0.021946 -0.007874 0.000005 -0.000040 +0.981600 78.227300 -36.908800 -79.999941 -1.170162 6.459317 -0.002179 -0.000181 0.005290 -2.183972 -1.366649 -10.118663 -11.151837 -0.906361 -0.290147 -5.684229 1.089321 4.387667 8.077889 -0.078411 -3.347790 0.069650 0.032877 0.062705 -0.082686 -0.598930 0.665300 -2.557741 -0.073197 -0.022160 -10.202182 0.000007 0.000001 0.000775 0.001399 -0.000229 0.000774 -0.001499 0.000271 -7.363660 9.569162 -0.366230 11.900506 -7.648195 -1.461712 1.776566 -0.191278 -0.101309 -1.146310 3.336035 6.884329 -4.748809 -2.947367 0.123526 0.600731 0.624736 7.001077 1.897622 -12.519654 -3.461923 7.016930 13.855770 14.275010 3.819257 0.417219 0.212928 -1.416632 1.224677 -19.163556 -10.654510 -2.740751 3.893855 0.939595 -1.661252 -18.262044 -22.104478 -7.288897 -8.530770 -7.416788 -9.787503 -9.542637 0.071593 1.718487 -23.245685 -1.043394 -0.174729 -0.001582 8.722124 -1.411156 32.893990 -14.320561 7.562087 -0.961220 3.999511 -8.054799 31.959538 0.007663 -0.021428 0.049428 -10.910059 0.644631 10.864136 2.897998 -0.570155 -0.009431 -3.795371 5.038001 -25.715085 -9.238899 -0.405590 -5.207721 2.837911 6.656439 -25.459660 -0.011410 -0.053616 -0.048677 -0.007873 0.000003 -0.000041 +0.981600 78.227300 -36.982000 -79.983004 -1.133057 6.403697 -0.002180 -0.000181 0.005291 -2.199659 -1.374924 -10.096294 -11.165928 -0.926398 -0.281158 -5.702934 1.058715 4.407441 8.077894 -0.078411 -3.347792 0.055677 0.022029 0.071565 -0.082698 -0.598930 0.665301 -2.557730 -0.073197 -0.022160 -10.202175 0.003940 -0.005784 0.000776 0.001400 -0.000214 0.000776 -0.001498 0.000271 -7.391795 9.583639 -0.340611 11.846436 -7.603898 -1.498708 2.005617 -0.216297 -0.114091 -1.286359 3.312874 6.881483 -4.734090 -2.942032 0.131280 0.599551 0.621827 6.980345 1.898116 -12.513083 -3.433742 7.039339 13.858054 14.266507 3.930300 0.429560 0.218703 -1.534475 1.177781 -19.165262 -10.620962 -2.691759 3.874462 0.940180 -1.664338 -18.282784 -21.872052 -7.211773 -8.272966 -8.203272 -10.237615 -10.280055 0.071014 1.716161 -23.274419 -1.057166 -0.177034 -0.001624 8.736168 -1.406908 32.971481 -14.334648 7.555054 -0.945376 4.011218 -8.067895 32.036408 0.028061 -0.058279 0.062969 -10.910306 0.635492 10.837693 2.829382 -0.556652 -0.009535 -3.754827 5.022628 -25.642077 -9.221134 -0.435711 -5.221580 2.829090 6.643958 -25.412135 0.005933 -0.110946 -0.030597 -0.007871 0.000004 -0.000040 +0.981600 78.227300 -36.963700 -79.966043 -1.095970 6.369028 -0.002187 -0.000181 0.005292 -2.201559 -1.385656 -10.073594 -11.180012 -0.946438 -0.272171 -5.723322 1.050138 4.407428 8.076598 -0.099354 -3.347765 0.118653 0.011281 0.080401 -0.180635 -0.600001 0.664214 -2.529750 -0.054071 -0.013516 -10.202184 0.000007 0.000001 0.000773 0.001396 -0.000212 0.000775 -0.001496 0.000268 -7.420548 9.577164 -0.315181 11.898101 -7.564766 -1.520812 2.075025 -0.223887 -0.117947 -1.377328 3.276024 6.877710 -4.719368 -2.936700 0.118040 0.599550 0.621826 6.980344 1.898081 -12.520474 -3.405873 7.061780 13.860318 14.257998 3.999698 0.437276 0.222303 -1.652731 1.129011 -19.180858 -10.608051 -2.646644 3.854076 0.940773 -1.667426 -18.303529 -21.579252 -6.955640 -7.836316 -9.015406 -10.591972 -10.805616 0.078895 1.660006 -23.212400 -1.043375 -0.174726 -0.001579 8.693700 -1.387896 32.948556 -14.348732 7.548011 -0.950520 3.972300 -8.066613 32.017615 0.010654 -0.039069 0.018576 -10.853757 0.574439 10.939046 2.698984 -0.530992 -0.009701 -3.682776 5.058818 -25.712860 -9.217276 -0.464290 -5.235539 2.845514 6.667121 -25.500414 -0.013940 -0.066594 -0.044113 -0.007870 0.000003 -0.000040 +0.981600 78.227300 -36.951500 -79.946725 -1.079743 6.334431 -0.002181 -0.000181 0.005292 -2.198631 -1.369114 -10.054725 -11.194105 -0.966482 -0.263191 -5.743566 1.039650 4.442338 8.041248 -0.104115 -3.284876 0.153611 0.012815 0.015926 -0.194596 -0.600153 0.664058 -2.522766 -0.054073 -0.013509 -10.202181 0.003939 -0.005784 0.000773 0.001397 -0.000208 0.000774 -0.001494 0.000259 -7.412675 9.591536 -0.358196 11.886341 -7.522514 -1.551815 2.241618 -0.242126 -0.127162 -1.503323 3.239071 6.875862 -4.704646 -2.931368 0.104805 0.599553 0.621826 6.980343 1.919370 -12.513432 -3.457287 7.169560 13.881725 14.225242 3.958059 0.432646 0.220140 -1.750516 1.075737 -19.197020 -10.574495 -2.597675 3.848622 0.943691 -1.682851 -18.407155 -21.213480 -6.387693 -7.029410 -9.782250 -10.806468 -10.959237 0.069952 1.652907 -23.238607 -1.105461 -0.185121 -0.001775 8.751756 -1.393172 33.013904 -14.362848 7.540991 -0.955664 4.025952 -8.084344 32.082778 0.036073 -0.063644 0.065235 -10.853844 0.558935 10.937016 2.623482 -0.516134 -0.009769 -3.642947 5.042805 -25.688773 -9.210307 -0.465065 -5.221494 2.842977 6.663560 -25.486825 0.005934 -0.110945 -0.030600 -0.007869 0.000003 -0.000040 +0.981600 78.227300 -36.945400 -79.928946 -1.049626 6.299813 -0.002180 -0.000181 0.005290 -2.213102 -1.370588 -10.033310 -11.208085 -0.965664 -0.256469 -5.741378 1.011418 4.447758 8.040829 -0.111097 -3.284868 0.132623 0.001977 0.024783 -0.209017 -0.560722 0.644153 -2.515752 -0.059815 -0.000746 -10.202183 0.000007 0.000001 0.000772 0.001399 -0.000222 0.000774 -0.001498 0.000263 -7.448295 9.592248 -0.331576 11.930981 -7.483071 -1.574966 2.317967 -0.250493 -0.131365 -1.580275 3.202268 6.871165 -4.689919 -2.926037 0.112550 0.598762 0.619888 6.966526 1.919796 -12.506747 -3.436120 7.142428 13.854502 14.216573 4.138485 0.452722 0.229468 -1.886292 1.045102 -19.214458 -10.572770 -2.568889 3.841704 0.944659 -1.687998 -18.441714 -20.840507 -5.670136 -6.050154 -10.487734 -10.817259 -10.797179 0.086807 1.603867 -23.150315 -1.167551 -0.195519 -0.001982 8.763594 -1.384996 32.951349 -14.376918 7.533950 -0.946822 4.015670 -8.072849 32.034854 0.016764 -0.033328 0.053943 -10.797638 0.501803 10.985334 2.499962 -0.491827 -0.009841 -3.597788 5.088431 -25.714950 -9.205677 -0.486692 -5.228447 2.851850 6.676030 -25.534404 -0.015205 -0.073082 -0.041830 -0.007872 0.000003 -0.000041 +0.981600 78.227300 -36.933200 -79.911152 -1.019515 6.286125 -0.002183 -0.000180 0.005288 -2.227580 -1.372068 -10.011906 -11.222154 -0.985709 -0.247494 -5.761087 0.994335 4.475266 8.012468 -0.116345 -3.249952 0.146608 -0.000471 -0.000317 -0.209019 -0.560723 0.644153 -2.515757 -0.059815 -0.000746 -10.202178 0.007871 -0.011569 0.000772 0.001401 -0.000232 0.000775 -0.001498 0.000268 -7.448122 9.592556 -0.352590 11.975645 -7.443647 -1.598148 2.394310 -0.258868 -0.135556 -1.657231 3.165471 6.866431 -4.676823 -2.934603 0.120215 0.597974 0.617945 6.952705 1.919895 -12.499460 -3.456976 7.279490 13.897973 14.187558 4.027450 0.440366 0.223731 -1.926464 0.993287 -19.233697 -10.559819 -2.523781 3.814302 0.945625 -1.693142 -18.476263 -20.457485 -4.848501 -4.964732 -11.130619 -10.656054 -10.362415 0.083611 1.590718 -23.189966 -1.181354 -0.197831 -0.002032 8.786815 -1.391797 33.008300 -14.391063 7.547893 -0.937968 4.028901 -8.087623 32.096480 0.036069 -0.063646 0.065230 -10.797742 0.490621 10.974378 2.431318 -0.478319 -0.009863 -3.557963 5.072422 -25.690891 -9.199495 -0.494417 -5.235385 2.849313 6.672463 -25.520795 0.004670 -0.117434 -0.028314 -0.007872 0.000003 -0.000040 +0.981600 78.227300 -36.914900 -79.893350 -0.989416 6.272407 -0.002188 -0.000181 0.005291 -2.239643 -1.359913 -9.992412 -11.222252 -1.005818 -0.238277 -5.780893 0.978388 4.481822 8.012050 -0.123318 -3.242947 0.132618 -0.006876 0.013951 -0.209269 -0.535973 0.619442 -2.494779 -0.059816 -0.000724 -10.202184 0.000007 0.000000 0.000775 0.001399 -0.000222 0.000776 -0.001498 0.000261 -7.483695 9.593370 -0.332972 12.005630 -7.412282 -1.612479 2.470656 -0.267247 -0.139740 -1.734180 3.128686 6.861651 -4.684590 -2.940738 0.105826 0.597184 0.616008 6.938879 1.919532 -12.513753 -3.436277 7.328936 13.909920 14.174191 4.076027 0.445769 0.226246 -2.009311 0.975222 -19.234352 -10.544304 -2.492435 3.787006 0.946586 -1.698288 -18.510810 -20.085373 -3.940992 -3.783738 -11.711122 -10.308847 -9.676135 0.107812 1.542093 -23.117351 -1.250334 -0.209379 -0.002277 8.811927 -1.399867 32.946452 -14.426398 7.561778 -0.926330 4.018608 -8.076140 32.048562 0.017862 -0.039857 0.056195 -10.741604 0.437852 11.013889 2.321521 -0.456713 -0.009849 -3.510583 5.108409 -25.717228 -9.193311 -0.502141 -5.228336 2.859457 6.686706 -25.575167 -0.015210 -0.073082 -0.041831 -0.007869 0.000004 -0.000040 +0.981600 78.227300 -36.890500 -79.874019 -0.973214 6.258752 -0.002181 -0.000180 0.005290 -2.231709 -1.355276 -10.000112 -11.222282 -1.012017 -0.230570 -5.786743 0.963536 4.488142 7.990683 -0.129013 -3.215016 0.146615 -0.004898 -0.005732 -0.230350 -0.526284 0.609349 -2.473791 -0.059816 -0.000703 -10.202163 0.000006 -0.000000 0.000773 0.001397 -0.000220 0.000773 -0.001498 0.000268 -7.483153 9.607544 -0.346848 12.092035 -7.383800 -1.619092 2.456777 -0.265723 -0.138977 -1.776113 3.091998 6.854923 -4.678432 -2.948493 0.106149 0.596397 0.614067 6.925052 1.919295 -12.513345 -3.464307 7.445855 13.946052 14.148694 3.999692 0.437274 0.222301 -2.037527 0.945018 -19.235985 -10.556309 -2.466206 3.779486 0.947164 -1.701375 -18.531550 -19.729483 -2.966902 -2.560493 -12.211906 -9.721382 -8.683586 0.098840 1.534836 -23.165727 -1.277932 -0.214001 -0.002376 8.835043 -1.406593 33.010444 -14.461723 7.575639 -0.928666 4.031846 -8.090909 32.110188 0.042961 -0.062482 0.065237 -10.741834 0.422103 10.989710 2.266615 -0.445907 -0.009834 -3.492328 5.097620 -25.690986 -9.187130 -0.509865 -5.221291 2.856918 6.683140 -25.561546 0.005932 -0.110945 -0.030598 -0.007870 0.000004 -0.000038 +0.969400 78.239500 -36.982000 -79.854686 -0.957027 6.245089 -0.002185 -0.000181 0.005292 -2.226202 -1.364278 -10.005926 -11.222317 -1.020478 -0.243726 -5.792534 0.947919 4.508425 7.969308 -0.134732 -3.201073 0.146624 -0.004899 -0.005732 -0.230331 -0.526284 0.609348 -2.473784 -0.059815 -0.000702 -10.202180 0.007871 -0.011568 0.000776 0.001399 -0.000234 0.000779 -0.001500 0.000273 -7.496936 9.621947 -0.344465 12.115847 -7.338949 -1.650640 2.540074 -0.274870 -0.143534 -1.839133 3.082974 6.845428 -4.672290 -2.956254 0.106461 0.596791 0.615040 6.931959 1.919296 -12.513337 -3.464307 7.562788 13.982129 14.123107 3.944177 0.431101 0.219420 -2.079821 0.915965 -19.251219 -10.547658 -2.436145 3.772869 0.947738 -1.704463 -18.552290 -19.410334 -2.036967 -1.369886 -12.674572 -9.010819 -7.606905 0.089879 1.527589 -23.214095 -1.305520 -0.218619 -0.002484 8.874729 -1.400231 33.053946 -14.482924 7.589570 -0.932866 4.045104 -8.105664 32.171830 0.068045 -0.085109 0.074285 -10.741880 0.413210 10.985387 2.211715 -0.435104 -0.009799 -3.474378 5.086564 -25.685685 -9.180964 -0.517588 -5.214242 2.858188 6.684930 -25.568381 0.027077 -0.148804 -0.019358 -0.007870 0.000003 -0.000040 +0.963300 78.239500 -36.963700 -79.835344 -0.940834 6.259411 -0.002178 -0.000180 0.005290 -2.241010 -1.367701 -9.998369 -11.236327 -1.027372 -0.243220 -5.799974 0.953188 4.529881 7.968905 -0.141697 -3.187077 0.146619 -0.004899 -0.005732 -0.251545 -0.501740 0.584436 -2.452812 -0.059816 -0.000680 -10.202154 0.000007 0.000001 0.000774 0.001397 -0.000221 0.000776 -0.001496 0.000259 -7.511123 9.622348 -0.342218 12.252863 -7.289037 -1.658075 2.435953 -0.263437 -0.137836 -1.817977 3.025669 6.838195 -4.692349 -2.946880 0.105427 0.631284 0.577983 6.913605 1.919296 -12.513335 -3.464307 7.679763 14.018162 14.097441 3.853956 0.421071 0.214738 -2.084967 0.892846 -19.269004 -10.566531 -2.411186 3.744094 0.948312 -1.707550 -18.573002 -19.124810 -1.134546 -0.231914 -13.097294 -8.169959 -6.431924 0.153866 1.464950 -23.111497 -1.409007 -0.235947 -0.002894 8.916780 -1.395465 32.950649 -14.518254 7.603437 -0.914211 4.024487 -8.082709 32.075955 0.017874 -0.039854 0.056197 -10.678508 0.360681 11.046956 2.122512 -0.417550 -0.009735 -3.427698 5.121916 -25.760928 -9.172472 -0.504456 -5.221161 2.874684 6.708042 -25.656670 -0.016462 -0.079575 -0.039548 -0.007869 0.000003 -0.000041 +0.963300 78.239500 -36.957600 -79.816010 -0.924641 6.273707 -0.002181 -0.000181 0.005291 -2.255827 -1.371125 -9.990825 -11.250345 -1.034266 -0.242718 -5.827315 0.944016 4.529951 7.954519 -0.147838 -3.173117 0.146622 -0.004898 -0.005732 -0.251540 -0.501740 0.584436 -2.452820 -0.059817 -0.000680 -10.202183 0.007872 -0.011567 0.000777 0.001399 -0.000226 0.000775 -0.001495 0.000256 -7.525302 9.622754 -0.339964 12.254947 -7.249749 -1.662036 2.540072 -0.274871 -0.143535 -1.909053 3.033342 6.848964 -4.682488 -2.983237 0.105942 0.596160 0.606176 6.919096 1.919296 -12.513337 -3.464307 7.853322 14.064983 14.072149 3.673513 0.401038 0.205315 -2.067876 0.905216 -19.257350 -10.571628 -2.383676 3.715901 0.988610 -1.688064 -18.573591 -18.877531 -0.272530 0.835771 -13.482146 -7.143674 -5.102818 0.144445 1.455771 -23.122233 -1.436594 -0.240567 -0.003010 8.930148 -1.411793 32.944372 -14.553584 7.617302 -0.895539 4.025960 -8.084340 32.082788 0.047658 -0.048264 0.060725 -10.686054 0.346750 10.985292 2.095044 -0.412145 -0.009707 -3.412873 5.105451 -25.713280 -9.184815 -0.489010 -5.228261 2.867062 6.697377 -25.615911 -0.004012 -0.088771 -0.037362 -0.007871 0.000004 -0.000040 +0.951100 78.239500 -36.963700 -79.809055 -0.923871 6.287802 -0.002184 -0.000180 0.005291 -2.240154 -1.362818 -10.013179 -11.243375 -1.041249 -0.241838 -5.840712 0.935948 4.529781 7.940973 -0.140042 -3.180157 0.146617 -0.004899 -0.005732 -0.272689 -0.482137 0.564474 -2.424831 -0.059816 -0.000651 -10.202172 0.000007 0.000001 0.000774 0.001398 -0.000222 0.000775 -0.001498 0.000268 -7.539491 9.623161 -0.337710 12.432897 -7.227132 -1.666408 2.380430 -0.257345 -0.134791 -1.894903 2.975054 6.835200 -4.667764 -2.977904 0.106703 0.602808 0.583554 6.907683 1.919296 -12.513335 -3.464307 7.939045 14.080437 14.062768 3.652687 0.398727 0.204223 -2.111693 0.869418 -19.271637 -10.576704 -2.356159 3.708689 0.957246 -1.705387 -18.594043 -18.664945 0.512786 1.832739 -13.815611 -5.875107 -3.602555 0.134385 1.444003 -23.205937 -1.464182 -0.245185 -0.003119 8.969516 -1.405248 33.008832 -14.588929 7.631163 -0.897838 4.040692 -8.100750 32.151306 0.077445 -0.056671 0.065263 -10.693220 0.346526 10.963267 2.067601 -0.406744 -0.009676 -3.410657 5.095811 -25.713408 -9.197172 -0.473561 -5.221375 2.868331 6.699155 -25.622707 0.008448 -0.097966 -0.035166 -0.007871 0.000003 -0.000038 +0.945000 78.239500 -36.951500 -79.802101 -0.923105 6.322901 -0.002180 -0.000181 0.005289 -2.240668 -1.365723 -10.033972 -11.236428 -1.049742 -0.254867 -5.854109 0.927881 4.529616 7.927419 -0.132246 -3.187200 0.146614 -0.004898 -0.005732 -0.272703 -0.482138 0.564474 -2.424832 -0.059817 -0.000650 -10.202169 0.007872 -0.011568 0.000777 0.001398 -0.000222 0.000779 -0.001498 0.000263 -7.553657 9.623553 -0.335454 12.427790 -7.195036 -1.695396 2.491498 -0.269535 -0.140874 -1.964978 2.989710 6.843826 -4.684930 -3.004076 0.105808 0.609732 0.605398 6.911226 1.918763 -12.527322 -3.464621 8.207316 14.160848 14.019914 3.347331 0.364898 0.188122 -2.074331 0.876277 -19.267233 -10.554252 -2.323570 3.702616 0.914961 -1.704119 -18.603726 -18.496576 1.213365 2.691405 -14.100981 -4.370136 -1.946072 0.209735 1.398554 -23.176690 -1.588367 -0.265975 -0.003679 9.024055 -1.416220 32.955209 -14.624349 7.665993 -0.886141 4.031842 -8.090904 32.110174 0.009864 -0.034488 0.053936 -10.644826 0.299369 10.912253 2.074466 -0.408096 -0.009681 -3.461576 5.119965 -25.680456 -9.195645 -0.459656 -5.214369 2.816265 6.735034 -25.609463 -0.012759 -0.061934 -0.008768 -0.007871 0.000004 -0.000038 +0.945000 78.239500 -36.921000 -79.795149 -0.922333 6.357978 -0.002186 -0.000180 0.005289 -2.241182 -1.368628 -10.054745 -11.243476 -1.058171 -0.268150 -5.869074 0.939556 4.551581 7.913033 -0.138388 -3.173238 0.146622 -0.004899 -0.005733 -0.272694 -0.482137 0.564474 -2.424826 -0.059816 -0.000652 -10.202171 0.015736 -0.023137 0.000774 0.001399 -0.000224 0.000775 -0.001496 0.000263 -7.567847 9.623969 -0.333206 12.627567 -7.157272 -1.683876 2.276323 -0.245929 -0.129068 -1.943846 2.938360 6.828731 -4.664059 -3.006507 0.106906 0.574333 0.589130 6.901742 1.896747 -12.540504 -3.469420 8.324459 14.196675 13.993855 3.264045 0.355685 0.183706 -2.089283 0.873504 -19.259103 -10.559320 -2.296053 3.681429 0.920417 -1.713407 -18.609091 -18.354270 1.823992 3.472637 -14.379399 -2.904019 -0.397247 0.208126 1.391977 -23.196504 -1.622851 -0.271748 -0.003843 9.043068 -1.428283 32.935138 -14.659789 7.700829 -0.874405 4.030373 -8.089268 32.103334 0.037454 -0.029841 0.053946 -10.651616 0.312853 10.929870 2.012690 -0.395938 -0.009610 -3.401390 5.097655 -25.742344 -9.194087 -0.445753 -5.207355 2.867888 6.699183 -25.666888 -0.004585 -0.054971 -0.048721 -0.007871 0.000003 -0.000040 +0.981600 78.227300 -36.982000 -79.788199 -0.921559 6.393055 -0.002185 -0.000181 0.005291 -2.241699 -1.371534 -10.075545 -11.250506 -1.066598 -0.281432 -5.882997 0.938064 4.558791 7.898654 -0.144533 -3.159279 0.146624 -0.004898 -0.005731 -0.293874 -0.457577 0.539577 -2.375865 -0.059818 -0.000600 -10.202180 0.000007 0.000000 0.000778 0.001399 -0.000222 0.000774 -0.001494 0.000264 -7.582024 9.624378 -0.330954 12.609133 -7.108124 -1.701467 2.387379 -0.258107 -0.135175 -1.992913 2.953077 6.836255 -4.681201 -3.032674 0.106004 0.595375 0.604239 6.905282 1.889846 -12.533276 -3.470765 8.488994 14.249237 13.958957 3.104420 0.338050 0.175195 -2.077561 0.861808 -19.272174 -10.560574 -2.289171 3.660393 0.930539 -1.702445 -18.617246 -18.249497 2.358179 4.126583 -14.653753 -1.461747 1.061204 0.251422 1.362842 -23.250526 -1.712529 -0.286762 -0.004273 9.091069 -1.442960 32.951233 -14.695236 7.735652 -0.862649 4.036267 -8.095832 32.130753 0.009119 -0.030044 0.067180 -10.638121 0.301139 10.874523 2.012691 -0.395938 -0.009612 -3.426291 5.097318 -25.711810 -9.206458 -0.430310 -5.200457 2.841528 6.710598 -25.643665 0.002236 -0.058152 -0.011151 -0.007867 0.000003 -0.000038 +0.963300 78.227300 -36.982000 -79.781242 -0.920775 6.428163 -0.002181 -0.000181 0.005290 -2.242214 -1.374439 -10.096331 -11.257545 -1.075025 -0.294715 -5.882958 0.937682 4.565771 7.884285 -0.150706 -3.166306 0.146614 -0.004899 -0.005732 -0.293881 -0.457577 0.539578 -2.375859 -0.059817 -0.000600 -10.202146 0.003940 -0.005784 0.000776 0.001398 -0.000226 0.000776 -0.001498 0.000261 -7.595809 9.638768 -0.328565 12.814610 -7.095835 -1.691721 2.151378 -0.232243 -0.122173 -1.964783 2.901738 6.820810 -4.660329 -3.035104 0.107104 0.546010 0.587785 6.896763 1.882419 -12.539998 -3.472413 8.632624 14.291958 13.952916 2.944791 0.320437 0.166633 -2.038680 0.875426 -19.268739 -10.575608 -2.284817 3.638806 0.958011 -1.709519 -18.621700 -18.184709 2.706736 4.564602 -14.849745 -0.411652 2.000041 0.242488 1.355748 -23.276779 -1.753927 -0.293692 -0.004488 9.130656 -1.447103 32.938936 -14.730592 7.749487 -0.850894 4.036253 -8.095822 32.130706 0.035957 -0.020941 0.080433 -10.623968 0.294708 10.898736 1.985241 -0.390536 -0.009578 -3.405049 5.065983 -25.783544 -9.216510 -0.394011 -5.193533 2.876789 6.711611 -25.714469 0.009644 -0.055447 -0.042215 -0.007873 0.000004 -0.000039 +0.957200 78.227300 -36.982000 -79.774295 -0.919993 6.477212 -0.002185 -0.000180 0.005291 -2.242735 -1.377343 -10.117127 -11.243593 -1.083560 -0.307610 -5.882938 0.937302 4.572754 7.891680 -0.144142 -3.173289 0.146629 -0.004898 -0.005733 -0.293869 -0.457577 0.539578 -2.375860 -0.059815 -0.000599 -10.202174 0.007872 -0.011568 0.000772 0.001400 -0.000231 0.000772 -0.001495 0.000263 -7.609579 9.653149 -0.326175 12.781295 -7.060145 -1.704742 2.234674 -0.241366 -0.126775 -1.978817 2.915564 6.819583 -4.684443 -3.060465 0.105823 0.593790 0.600348 6.877638 1.874985 -12.546722 -3.474071 8.805229 14.363502 13.919848 2.750452 0.299024 0.156146 -2.007346 0.855246 -19.260333 -10.568153 -2.247896 3.639096 0.898972 -1.718709 -18.630765 -18.163657 2.793703 4.680085 -14.949341 0.188465 2.310232 0.285203 1.324359 -23.337373 -1.836706 -0.307548 -0.004920 9.169809 -1.450940 32.954621 -14.766048 7.784297 -0.839105 4.042150 -8.102384 32.158108 0.006537 -0.014764 0.069294 -10.624885 0.280286 10.792733 1.985241 -0.390538 -0.009575 -3.429334 5.066188 -25.711110 -9.226585 -0.357713 -5.186607 2.849699 6.709972 -25.657968 0.009647 -0.055449 -0.042216 -0.007870 0.000004 -0.000040 +0.963300 78.227300 -36.982000 -79.767349 -0.919199 6.526266 -0.002182 -0.000181 0.005291 -2.243251 -1.380248 -10.137911 -11.243651 -1.092021 -0.320767 -5.882909 0.936919 4.579740 7.885104 -0.136732 -3.159328 0.146626 -0.004898 -0.005732 -0.293969 -0.447694 0.549477 -2.375867 -0.059817 -0.000600 -10.202178 0.011804 -0.017354 0.000770 0.001399 -0.000222 0.000773 -0.001497 0.000268 -7.623974 9.646553 -0.323981 12.973191 -7.036241 -1.688196 1.977864 -0.213262 -0.112544 -1.894690 2.874171 6.821153 -4.684443 -3.060466 0.105826 0.593794 0.600346 6.877635 1.867555 -12.553455 -3.475729 8.930471 14.418191 13.895452 2.625526 0.285279 0.149364 -2.014379 0.855819 -19.267159 -10.556906 -2.231613 3.639543 0.957818 -1.708488 -18.614781 -18.163650 2.793701 4.680085 -14.983079 0.506903 2.272104 0.280347 1.304655 -23.396864 -1.871200 -0.313321 -0.005112 9.208957 -1.454771 32.970225 -14.801527 7.819094 -0.827295 4.043618 -8.104025 32.164959 0.032296 0.000721 0.058166 -10.624708 0.280527 10.814850 1.964647 -0.386485 -0.009541 -3.419979 5.042298 -25.781739 -9.224284 -0.336857 -5.193585 2.878064 6.713386 -25.721266 -0.004075 -0.052739 -0.042109 -0.007868 0.000004 -0.000039 +0.945000 78.227300 -36.982000 -79.760396 -0.918397 6.575372 -0.002180 -0.000181 0.005292 -2.243772 -1.383152 -10.158697 -11.243682 -1.098973 -0.320013 -5.882933 0.937301 4.572755 7.878522 -0.129340 -3.159351 0.146619 -0.013752 -0.016562 -0.315257 -0.413245 0.534494 -2.333908 -0.059818 -0.000556 -10.202161 0.000006 0.000000 0.000775 0.001398 -0.000224 0.000777 -0.001497 0.000266 -7.617078 9.639357 -0.325173 12.953948 -7.001295 -1.699343 2.040330 -0.220092 -0.116020 -1.915699 2.874129 6.822209 -4.687684 -3.088259 0.105647 0.593796 0.600348 6.877634 1.860122 -12.560177 -3.477390 9.082664 14.464891 13.852400 2.445063 0.265453 0.139512 -1.970612 0.859263 -19.276688 -10.573193 -2.220372 3.624918 0.957440 -1.706425 -18.600950 -18.145721 2.567186 4.362035 -14.980263 0.618384 2.007780 0.325169 1.281943 -23.430978 -1.953989 -0.327178 -0.005571 9.261828 -1.475148 32.958651 -14.858187 7.853773 -0.812581 4.045090 -8.105674 32.171834 0.005053 -0.006014 0.073662 -10.625653 0.266104 10.708839 1.964655 -0.386486 -0.009538 -3.438425 5.038692 -25.716834 -9.221974 -0.316000 -5.200570 2.849701 6.709972 -25.657978 -0.004078 -0.052739 -0.042115 -0.007869 0.000003 -0.000039 +0.938900 78.239500 -36.982000 -79.753441 -0.917594 6.603456 -0.002181 -0.000181 0.005294 -2.244292 -1.386054 -10.179477 -11.243644 -1.092020 -0.320765 -5.882961 0.937681 4.565771 7.870728 -0.142897 -3.159354 0.146626 -0.013753 -0.016562 -0.336135 -0.423308 0.524428 -2.319908 -0.059817 -0.000541 -10.202161 0.007871 -0.011569 0.000774 0.001399 -0.000231 0.000774 -0.001497 0.000264 -7.624380 9.632577 -0.324121 13.138043 -6.993350 -1.697145 1.762685 -0.189765 -0.100531 -1.810569 2.828884 6.795086 -4.707747 -3.078877 0.104568 0.592610 0.597439 6.856901 1.852689 -12.566905 -3.479044 9.233289 14.509731 13.844495 2.243772 0.243373 0.128455 -1.857721 0.851278 -19.259549 -10.617034 -2.214164 3.609233 0.957441 -1.706427 -18.600950 -18.155915 2.117152 3.742362 -14.937187 0.582923 1.517042 0.315647 1.272686 -23.463865 -1.988473 -0.332951 -0.005773 9.284939 -1.492396 32.959836 -14.893617 7.874568 -0.800727 4.046574 -8.107304 32.178688 0.030784 0.009621 0.084642 -10.625398 0.268630 10.737561 1.964648 -0.386485 -0.009546 -3.434917 5.018608 -25.779886 -9.240530 -0.292837 -5.186683 2.878068 6.713387 -25.721277 -0.000275 -0.033275 -0.048963 -0.007869 0.000004 -0.000039 +0.945000 78.239500 -36.982000 -79.746498 -0.916790 6.631559 -0.002177 -0.000181 0.005292 -2.258592 -1.386484 -10.200608 -11.243623 -1.087327 -0.342380 -5.882902 0.936919 4.579737 7.877709 -0.143306 -3.159335 0.146622 -0.013752 -0.016563 -0.336144 -0.423309 0.524428 -2.319921 -0.059818 -0.000541 -10.202157 0.015736 -0.023137 0.000771 0.001399 -0.000227 0.000773 -0.001496 0.000263 -7.631074 9.646759 -0.322855 13.111748 -6.958032 -1.709194 1.804335 -0.194308 -0.102859 -1.810561 2.821956 6.796057 -4.731057 -3.097296 0.103312 0.592212 0.596471 6.849996 1.845256 -12.573618 -3.480702 9.353171 14.557667 13.826185 2.084140 0.225891 0.119641 -1.827394 0.858722 -19.261927 -10.610160 -2.212910 3.595514 0.957437 -1.706427 -18.600963 -18.163510 1.527055 2.941497 -14.893026 0.481992 0.936928 0.359375 1.245545 -23.511171 -2.071272 -0.346809 -0.006255 9.324317 -1.496376 32.961513 -14.929016 7.895352 -0.788877 4.050991 -8.112223 32.199233 0.002854 0.007045 0.069153 -10.611977 0.261198 10.673313 1.964653 -0.386486 -0.009541 -3.440553 5.022593 -25.758380 -9.259087 -0.269680 -5.172778 2.864242 6.718221 -25.706240 -0.000287 -0.033272 -0.048957 -0.007871 0.000003 -0.000040 +0.926700 78.239500 -36.982000 -79.739546 -0.915979 6.680643 -0.002184 -0.000181 0.005291 -2.272887 -1.386908 -10.221726 -11.243605 -1.082634 -0.363994 -5.884021 0.950843 4.580524 7.884692 -0.143715 -3.159316 0.146622 -0.013752 -0.016562 -0.336148 -0.423309 0.524428 -2.319914 -0.059819 -0.000541 -10.223145 0.023611 -0.034699 0.000777 0.001399 -0.000219 0.000778 -0.001497 0.000268 -7.638157 9.646959 -0.321729 13.282504 -6.933037 -1.695724 1.540565 -0.165555 -0.088028 -1.705458 2.785536 6.781902 -4.730245 -3.090351 0.103356 0.591813 0.595502 6.843084 1.838369 -12.566377 -3.482042 9.473058 14.605588 13.807805 1.924487 0.208431 0.110763 -1.797069 0.866157 -19.264323 -10.603276 -2.211654 3.581787 0.957433 -1.706424 -18.600956 -18.191671 0.889172 2.055856 -14.821519 0.341071 0.328261 0.355540 1.230225 -23.557440 -2.091956 -0.350270 -0.006385 9.363694 -1.500350 32.963224 -14.978649 7.930043 -0.775053 4.055428 -8.117137 32.219788 0.028985 0.020456 0.073519 -10.598004 0.272026 10.661960 1.964649 -0.386485 -0.009542 -3.454374 5.014116 -25.784830 -9.255258 -0.234918 -5.179757 2.879336 6.715164 -25.728061 -0.000285 -0.033272 -0.048959 -0.007871 0.000004 -0.000038 +0.920600 78.239500 -36.982000 -79.732601 -0.915164 6.708709 -0.002182 -0.000181 0.005293 -2.266526 -1.391053 -10.242346 -11.243673 -1.095789 -0.355535 -5.885141 0.964768 4.581308 7.891677 -0.144124 -3.159297 0.146617 -0.013753 -0.016563 -0.336156 -0.423309 0.524429 -2.319902 -0.059818 -0.000541 -10.223128 0.031476 -0.046267 0.000774 0.001400 -0.000226 0.000773 -0.001495 0.000264 -7.645248 9.647162 -0.320599 13.254908 -6.922795 -1.710182 1.568328 -0.168578 -0.089600 -1.698450 2.776683 6.768685 -4.752744 -3.101814 0.102145 0.591420 0.594533 6.836163 1.817156 -12.558597 -3.486380 9.597345 14.643348 13.779458 1.764833 0.190997 0.101842 -1.701861 0.875327 -19.255789 -10.647111 -2.205414 3.566112 0.957440 -1.706424 -18.600955 -18.228489 0.198135 1.125153 -14.751535 0.170920 -0.300519 0.408189 1.210078 -23.578416 -2.174745 -0.364125 -0.006904 9.405501 -1.529430 32.965324 -15.028294 7.964722 -0.761193 4.055424 -8.117128 32.219768 -0.000107 0.024546 0.077889 -10.605647 0.262473 10.591374 1.964657 -0.386487 -0.009543 -3.455191 4.999177 -25.735610 -9.252961 -0.214061 -5.186744 2.866074 6.708691 -25.686576 -0.000285 -0.033272 -0.048961 -0.007870 0.000004 -0.000039 +0.926700 78.239500 -36.982000 -79.744861 -0.930694 6.736499 -0.002181 -0.000181 0.005290 -2.260164 -1.395201 -10.262960 -11.243650 -1.089589 -0.363242 -5.884581 0.957805 4.580911 7.884687 -0.143715 -3.159314 0.167596 -0.013759 -0.016558 -0.371386 -0.388947 0.489564 -2.319912 -0.073210 -0.021911 -10.202166 0.000009 0.000002 0.000776 0.001399 -0.000226 0.000776 -0.001498 0.000264 -7.631061 9.646764 -0.322857 13.403241 -6.921790 -1.701942 1.332319 -0.142902 -0.076227 -1.593375 2.749091 6.767497 -4.773612 -3.099387 0.115001 0.591021 0.593565 6.829256 1.809454 -12.572307 -3.488196 9.615543 14.634609 13.782202 1.723191 0.186455 0.099506 -1.665791 0.876385 -19.243459 -10.677138 -2.196651 3.550967 0.957054 -1.704367 -18.587132 -18.276820 -0.474275 0.172499 -14.683559 -0.016229 -0.906305 0.406545 1.203512 -23.598256 -2.188540 -0.366434 -0.006994 9.429605 -1.536839 32.966407 -15.077871 7.985394 -0.747324 4.055417 -8.117136 32.219782 0.026768 0.033512 0.069003 -10.612504 0.256166 10.615874 1.964650 -0.386486 -0.009543 -3.457431 4.982992 -25.784130 -9.271508 -0.190903 -5.172822 2.879333 6.715160 -25.728056 -0.000282 -0.033272 -0.048961 -0.007870 0.000003 -0.000040 +0.908400 78.239500 -36.982000 -79.757106 -0.946229 6.764305 -0.002181 -0.000182 0.005290 -2.253278 -1.396449 -10.262806 -11.243597 -1.083389 -0.370948 -5.885138 0.964768 4.581305 7.877709 -0.143306 -3.159335 0.160609 -0.013756 -0.016559 -0.371419 -0.383996 0.484621 -2.333909 -0.073840 -0.037556 -10.202177 0.000009 0.000002 0.000774 0.001399 -0.000224 0.000774 -0.001495 0.000266 -7.638147 9.646957 -0.321730 13.375666 -6.911553 -1.716395 1.353138 -0.145167 -0.077412 -1.579360 2.742179 6.767794 -4.780568 -3.098580 0.114628 0.590626 0.592596 6.822346 1.801747 -12.586014 -3.490008 9.810197 14.687644 13.750994 1.431655 0.154692 0.083060 -1.575906 0.893869 -19.235848 -10.672780 -2.181642 3.558130 0.956670 -1.702305 -18.573298 -18.335424 -1.085935 -0.667046 -14.617486 -0.206453 -1.436249 0.455621 1.197873 -23.623657 -2.243742 -0.375673 -0.007349 9.453716 -1.544242 32.967534 -15.127435 8.006061 -0.733428 4.059846 -8.122039 32.240310 0.001748 0.013575 0.066898 -10.619780 0.258032 10.578326 1.998961 -0.393236 -0.009596 -3.476583 4.978775 -25.768180 -9.291614 -0.181654 -5.158900 2.881160 6.705637 -25.708397 0.002235 -0.020293 -0.053524 -0.007871 0.000004 -0.000040 +0.871800 78.257900 -36.823300 -79.753588 -0.939022 6.775827 -0.002181 -0.000181 0.005291 -2.260138 -1.392921 -10.257105 -11.239854 -1.085554 -0.368755 -5.887246 0.968537 4.578676 7.887108 -0.132978 -3.169627 0.170209 -0.016885 -0.021459 -0.391105 -0.370858 0.479010 -2.341706 -0.081527 -0.031933 -10.194160 -0.000009 -0.000015 0.000774 0.001399 -0.000226 0.000773 -0.001495 0.000261 -7.628659 9.638551 -0.329078 13.429834 -6.911747 -1.696063 1.266816 -0.136482 -0.071571 -1.514397 2.725815 6.757249 -4.798324 -3.094276 0.114236 0.589871 0.589287 6.803045 1.807778 -12.571287 -3.481757 9.785107 14.677283 13.761324 1.480732 0.160035 0.085843 -1.581362 0.883301 -19.256426 -10.690811 -2.185938 3.546938 0.954348 -1.706255 -18.583210 -18.362390 -1.595081 -1.368310 -14.578788 -0.368991 -1.884991 0.453725 1.197202 -23.643079 -2.252203 -0.377088 -0.007405 9.479637 -1.552733 32.974965 -15.156400 8.024886 -0.735135 4.051524 -8.116463 32.254899 0.027926 0.031345 0.078371 -10.614392 0.253373 10.561905 2.015246 -0.396441 -0.009615 -3.484841 4.982574 -25.770715 -9.294217 -0.168151 -5.164432 2.876645 6.707767 -25.708673 0.007436 -0.014324 -0.052993 -0.007872 0.000004 -0.000039 +0.871800 78.257900 -36.823300 -79.774431 -0.941505 6.775492 -0.002188 -0.000181 0.005291 -2.260137 -1.392920 -10.257106 -11.225876 -1.085644 -0.368492 -5.887243 0.968535 4.578677 7.887109 -0.132978 -3.169628 0.184192 -0.016891 -0.021455 -0.391116 -0.370859 0.479011 -2.341686 -0.081526 -0.031932 -10.215146 -0.000010 -0.000015 0.000779 0.001399 -0.000215 0.000775 -0.001496 0.000269 -7.628649 9.638555 -0.329078 13.563521 -6.918721 -1.678831 1.030799 -0.110884 -0.058069 -1.416342 2.705121 6.755507 -4.798331 -3.094274 0.114235 0.589873 0.589286 6.803044 1.807778 -12.571293 -3.481756 9.923341 14.716314 13.745389 1.265555 0.136639 0.073622 -1.513462 0.898563 -19.247502 -10.690810 -2.185938 3.546940 0.953778 -1.703166 -18.562480 -18.408366 -1.979497 -1.901119 -14.527367 -0.496253 -2.214677 0.513687 1.177446 -23.657585 -2.252203 -0.377089 -0.007401 9.457957 -1.570433 32.974234 -15.213119 8.052488 -0.727207 4.002030 -8.124604 32.256706 -0.006560 0.025521 0.078392 -10.594097 0.232599 10.502147 2.015245 -0.396441 -0.009610 -3.484036 4.983286 -25.714824 -9.294212 -0.168151 -5.164436 2.883829 6.716575 -25.654272 0.011382 0.003521 -0.000104 -0.007871 0.000003 -0.000040 +0.871800 78.257900 -36.823300 -79.795267 -0.943980 6.796150 -0.002180 -0.000181 0.005291 -2.239836 -1.398597 -10.270472 -11.211873 -1.085734 -0.368225 -5.887240 0.968536 4.578677 7.887111 -0.132978 -3.169627 0.198177 -0.016896 -0.021450 -0.412106 -0.371021 0.478861 -2.341690 -0.081526 -0.031932 -10.208151 -0.000010 -0.000014 0.000775 0.001399 -0.000224 0.000774 -0.001498 0.000266 -7.628641 9.638543 -0.329081 13.507219 -6.915786 -1.686088 1.100208 -0.118402 -0.062055 -1.430348 2.705111 6.756168 -4.819209 -3.091854 0.113110 0.589077 0.587351 6.789224 1.807778 -12.571290 -3.481758 9.905411 14.700734 13.759589 1.293318 0.139656 0.075209 -1.514547 0.893692 -19.232664 -10.690810 -2.185937 3.546940 0.953777 -1.703167 -18.562487 -18.428796 -2.160491 -2.153653 -14.508840 -0.558081 -2.369785 0.505792 1.174784 -23.670673 -2.272888 -0.380550 -0.007541 9.522446 -1.571958 32.977048 -15.269808 8.080078 -0.719248 4.051527 -8.116463 32.254909 0.021016 0.030178 0.078373 -10.593721 0.244021 10.535196 2.015248 -0.396442 -0.009611 -3.454910 4.964156 -25.759497 -9.315077 -0.165857 -5.164493 2.940128 6.721563 -25.685708 0.011384 0.003520 -0.000097 -0.007870 0.000003 -0.000039 +0.859500 78.257900 -36.823300 -79.802218 -0.944812 6.816999 -0.002186 -0.000181 0.005292 -2.219537 -1.404273 -10.283814 -11.211786 -1.071827 -0.369734 -5.887241 0.968536 4.578676 7.887110 -0.132978 -3.169628 0.212153 -0.016902 -0.021446 -0.412092 -0.371020 0.478861 -2.341691 -0.081526 -0.031932 -10.215135 -0.000010 -0.000014 0.000772 0.001397 -0.000222 0.000774 -0.001498 0.000263 -7.607374 9.637933 -0.332461 13.528328 -6.916889 -1.683367 1.037739 -0.111633 -0.058472 -1.381333 2.705153 6.753857 -4.840081 -3.089430 0.111985 0.588284 0.585414 6.775396 1.807608 -12.570977 -3.502774 9.928238 14.699414 13.765922 1.251670 0.135131 0.072836 -1.484432 0.900196 -19.242012 -10.711466 -2.189686 3.546151 0.953778 -1.703167 -18.562484 -18.428790 -2.160489 -2.153653 -14.521078 -0.515239 -2.296737 0.502315 1.189608 -23.630863 -2.259104 -0.378243 -0.007450 9.536720 -1.588890 32.914904 -15.298126 8.086880 -0.715262 4.039724 -8.103373 32.200131 0.048613 0.034838 0.078360 -10.593547 0.248587 10.548410 2.118183 -0.416697 -0.009728 -3.521751 4.963808 -25.794701 -9.333634 -0.142704 -5.164553 2.876640 6.707796 -25.708678 0.007942 -0.012097 -0.046387 -0.007872 0.000003 -0.000040 +0.853400 78.257900 -36.823300 -79.809161 -0.945640 6.816880 -0.002186 -0.000181 0.005292 -2.219186 -1.402338 -10.269956 -11.211694 -1.057919 -0.371238 -5.887244 0.968536 4.578676 7.887111 -0.132978 -3.169627 0.205181 -0.014921 -0.041133 -0.412191 -0.356171 0.464034 -2.341688 -0.081527 -0.031932 -10.208129 -0.000010 -0.000014 0.000776 0.001397 -0.000220 0.000775 -0.001493 0.000263 -7.600145 9.637937 -0.347590 13.549428 -6.917985 -1.680646 0.996080 -0.107118 -0.056075 -1.360323 2.705171 6.752864 -4.840078 -3.089430 0.111985 0.588681 0.586382 6.782306 1.807548 -12.570879 -3.509785 9.951707 14.700679 13.747024 1.210011 0.130607 0.070457 -1.454326 0.906701 -19.251342 -10.718367 -2.190939 3.545891 0.953778 -1.703165 -18.562475 -18.425914 -2.081814 -2.051391 -14.531362 -0.420412 -2.212293 0.585793 1.177269 -23.694577 -2.259097 -0.378241 -0.007450 9.504185 -1.604909 32.976590 -15.340663 8.107580 -0.709269 3.998239 -8.130876 32.262812 -0.006572 0.025517 0.078384 -10.593856 0.239454 10.521970 2.152495 -0.423449 -0.009764 -3.531026 4.961964 -25.765779 -9.338302 -0.121082 -5.164557 2.872822 6.702464 -25.688282 0.007918 -0.012093 -0.046380 -0.007872 0.000003 -0.000041 +0.853400 78.257800 -36.823300 -79.830003 -0.948133 6.816535 -0.002188 -0.000180 0.005290 -2.219189 -1.402336 -10.269955 -11.211705 -1.057920 -0.371238 -5.888360 0.982461 4.579462 7.887111 -0.132978 -3.169627 0.198177 -0.012939 -0.060819 -0.412194 -0.356170 0.464034 -2.341692 -0.081526 -0.031932 -10.201150 -0.000010 -0.000014 0.000774 0.001397 -0.000215 0.000769 -0.001497 0.000264 -7.592939 9.637922 -0.362729 13.569709 -6.932228 -1.661684 0.954430 -0.102611 -0.053679 -1.339304 2.691336 6.753817 -4.840078 -3.089426 0.111984 0.589080 0.587351 6.789222 1.807488 -12.570782 -3.516792 9.944935 14.677402 13.750072 1.203070 0.129854 0.070067 -1.450891 0.922116 -19.239483 -10.725248 -2.192188 3.545627 0.953394 -1.701106 -18.548654 -18.420986 -1.938729 -1.895275 -14.603800 -0.294828 -1.927390 0.577892 1.174613 -23.707655 -2.293588 -0.384014 -0.007679 9.555392 -1.590183 32.978670 -15.383217 8.128262 -0.703261 4.053005 -8.118073 32.261777 0.014134 0.029016 0.078378 -10.593868 0.239452 10.521978 2.186824 -0.430206 -0.009788 -3.540800 4.959677 -25.771738 -9.346023 -0.127269 -5.164578 2.871545 6.700686 -25.681479 0.007925 -0.012093 -0.046380 -0.007869 0.000003 -0.000041 +0.871800 78.257900 -36.823300 -79.850837 -0.950616 6.816248 -0.002183 -0.000181 0.005290 -2.198529 -1.406080 -10.269457 -11.190713 -1.058056 -0.370855 -5.889533 0.997148 4.566275 7.887929 -0.119014 -3.169648 0.219156 -0.013947 -0.050971 -0.412189 -0.356171 0.464035 -2.341687 -0.081526 -0.031932 -10.222156 -0.000011 -0.000015 0.000772 0.001398 -0.000222 0.000775 -0.001496 0.000259 -7.585843 9.637725 -0.363858 13.561650 -6.952561 -1.670443 0.954432 -0.102610 -0.053677 -1.374310 2.677450 6.757396 -4.819211 -3.091855 0.113109 0.589477 0.588318 6.796135 1.807430 -12.570676 -3.523802 9.931630 14.669231 13.767874 1.196133 0.129101 0.069666 -1.450472 0.924009 -19.225628 -10.732123 -2.193435 3.545365 0.953016 -1.699051 -18.534837 -18.416190 -1.785832 -1.685438 -14.675623 -0.128975 -1.639067 0.575534 1.193822 -23.654627 -2.272889 -0.380550 -0.007539 9.569545 -1.607042 32.923510 -15.404402 8.128104 -0.686281 4.041191 -8.104974 32.206968 0.034811 0.032507 0.078363 -10.593866 0.239452 10.521977 2.221126 -0.436956 -0.009812 -3.550583 4.957391 -25.777730 -9.353735 -0.133456 -5.164593 2.870275 6.698912 -25.674705 0.007924 -0.012093 -0.046376 -0.007871 0.000004 -0.000040 +0.871800 78.257900 -36.823300 -79.857783 -0.951449 6.816107 -0.002180 -0.000181 0.005290 -2.191651 -1.407328 -10.269293 -11.190703 -1.058056 -0.370852 -5.889037 0.990947 4.551921 7.888740 -0.105048 -3.169659 0.219144 -0.014936 -0.041129 -0.433195 -0.356327 0.463892 -2.341691 -0.094282 -0.037674 -10.208142 -0.000010 -0.000014 0.000770 0.001397 -0.000220 0.000774 -0.001499 0.000259 -7.578753 9.637512 -0.364989 13.554092 -6.962020 -1.670362 0.954431 -0.102610 -0.053684 -1.430333 2.691251 6.758069 -4.784419 -3.095892 0.114986 0.589872 0.589287 6.803046 1.807372 -12.570574 -3.530807 9.935033 14.680879 13.766357 1.189181 0.128347 0.069268 -1.450683 0.923062 -19.232563 -10.718370 -2.190940 3.545890 0.953206 -1.700078 -18.541739 -18.411967 -1.632912 -1.475630 -14.727068 0.044099 -1.361902 0.580664 1.185541 -23.674621 -2.252195 -0.377087 -0.007403 9.569325 -1.606894 32.937498 -15.425600 8.127942 -0.669289 4.045609 -8.109889 32.227517 0.053316 0.049062 0.073848 -10.593871 0.239456 10.521976 2.241716 -0.441007 -0.009819 -3.560159 4.955280 -25.769752 -9.359150 -0.118788 -5.164601 2.869019 6.697134 -25.667921 0.007930 -0.012096 -0.046379 -0.007871 0.000003 -0.000041 +0.871800 78.257900 -36.823300 -79.864734 -0.952280 6.829967 -0.002180 -0.000181 0.005291 -2.184766 -1.408572 -10.269118 -11.190707 -1.058056 -0.370853 -5.888453 0.983604 4.558511 7.887932 -0.119014 -3.169644 0.219150 -0.012959 -0.060814 -0.433188 -0.356326 0.463892 -2.341692 -0.094282 -0.037674 -10.208150 -0.000010 -0.000015 0.000777 0.001398 -0.000222 0.000777 -0.001495 0.000252 -7.571657 9.637312 -0.366110 13.462073 -6.967081 -1.681233 1.127974 -0.121413 -0.063642 -1.514375 2.705026 6.760091 -4.749631 -3.099936 0.116865 0.590268 0.590257 6.809957 1.807316 -12.570479 -3.537814 9.947400 14.668955 13.760344 1.182244 0.127592 0.068869 -1.437234 0.919081 -19.239699 -10.718373 -2.190940 3.545886 0.953395 -1.701107 -18.548642 -18.408999 -1.511261 -1.337536 -14.780258 0.170589 -1.152066 0.636591 1.178421 -23.655879 -2.259091 -0.378241 -0.007452 9.542431 -1.629144 32.922540 -15.446900 8.141770 -0.673277 4.000633 -8.122995 32.205653 -0.006565 0.025521 0.078389 -10.593868 0.239452 10.521977 2.262312 -0.445061 -0.009828 -3.569736 4.953171 -25.761771 -9.366108 -0.118023 -5.164620 2.870275 6.698910 -25.674696 0.007927 -0.012095 -0.046376 -0.007868 0.000004 -0.000038 +0.871800 78.257900 -36.811100 -79.871678 -0.953114 6.843842 -0.002182 -0.000181 0.005289 -2.177872 -1.409820 -10.268938 -11.190707 -1.058055 -0.370852 -5.889101 0.991710 4.537956 7.908875 -0.120315 -3.218557 0.198180 -0.012470 -0.016034 -0.433183 -0.356326 0.463892 -2.341694 -0.094282 -0.037674 -10.208150 -0.000010 -0.000014 0.000775 0.001397 -0.000221 0.000777 -0.001498 0.000264 -7.614515 9.638032 -0.324327 13.518409 -6.971075 -1.683756 1.044672 -0.112384 -0.058866 -1.514369 2.698096 6.761063 -4.742675 -3.100741 0.131233 0.590667 0.591225 6.816870 1.807776 -12.571295 -3.481764 9.932863 14.665015 13.773008 1.175302 0.126838 0.068475 -1.437024 0.920025 -19.232795 -10.718367 -2.190939 3.545894 0.953013 -1.699049 -18.534845 -18.406959 -1.421814 -1.226365 -14.834387 0.269249 -0.987649 0.631619 1.158733 -23.715382 -2.293576 -0.384013 -0.007674 9.573956 -1.601927 32.986610 -15.454071 8.155698 -0.679257 4.054470 -8.119696 32.268631 -0.006565 0.025521 0.078394 -10.593868 0.239453 10.521979 2.255456 -0.443712 -0.009825 -3.579723 4.950709 -25.781729 -9.373059 -0.117257 -5.164634 2.871550 6.700688 -25.681492 0.007942 -0.012098 -0.046383 -0.007871 0.000003 -0.000041 +0.871800 78.257900 -36.786700 -79.871673 -0.953117 6.843857 -0.002184 -0.000180 0.005291 -2.177873 -1.409820 -10.268939 -11.190703 -1.058055 -0.370851 -5.889096 0.991710 4.537952 7.908888 -0.120316 -3.218556 0.177204 -0.003613 -0.005207 -0.369845 -0.410258 0.449473 -2.481563 -0.067048 -0.064020 -10.208132 -0.000010 -0.000015 0.000776 0.001398 -0.000222 0.000775 -0.001495 0.000256 -7.614521 9.638034 -0.324325 13.497237 -6.967860 -1.666836 1.086325 -0.116899 -0.061260 -1.542400 2.711926 6.760451 -4.735710 -3.101549 0.117619 0.590267 0.590256 6.809959 1.807778 -12.571293 -3.481763 9.928236 14.678495 13.767649 1.189178 0.128347 0.069272 -1.436812 0.920972 -19.225871 -10.718365 -2.190939 3.545889 0.953013 -1.699052 -18.534844 -18.406981 -1.421814 -1.226367 -14.826896 0.300050 -0.922650 0.631616 1.158736 -23.715375 -2.293578 -0.384013 -0.007678 9.573956 -1.601930 32.986610 -15.461086 8.148656 -0.685249 4.063412 -8.129599 32.265486 -0.006563 0.025521 0.078393 -10.593875 0.239455 10.521982 2.262308 -0.445060 -0.009830 -3.524139 4.907458 -25.793742 -9.428665 -0.111139 -5.164741 2.872821 6.702459 -25.688270 0.007941 -0.012097 -0.046382 -0.007869 0.000004 -0.000042 diff --git a/data/gradio_target_bvh/animo/wisent_male_attackfence.bvh b/data/gradio_target_bvh/animo/wisent_male_attackfence.bvh new file mode 100644 index 0000000000000000000000000000000000000000..69fa8f140f13c9bcc682b167324ea395b0772ab9 --- /dev/null +++ b/data/gradio_target_bvh/animo/wisent_male_attackfence.bvh @@ -0,0 +1,437 @@ +HIERARCHY +ROOT def_c_root_joint +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT def_c_hips_joint + { + OFFSET 0.000000 -3.647700 9.956900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine1_joint + { + OFFSET -0.000000 -11.897300 -1.977500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine2_joint + { + OFFSET 0.000000 -19.899600 0.320200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_spine3_joint + { + OFFSET -0.000100 -32.343400 0.908100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_chest_joint + { + OFFSET -0.000100 -42.786000 5.439800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck1_joint + { + OFFSET -0.000100 -35.355800 -1.485100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_neck2_joint + { + OFFSET -0.000100 -30.561900 2.680700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_head_joint + { + OFFSET -0.000100 -29.273200 10.151100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_jaw_joint + { + OFFSET -0.000100 -2.391800 -19.608600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000029 -25.229114 -22.596514 + } + } + JOINT def_eye_joint.L + { + OFFSET 14.275600 -14.796500 -10.673100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.002100 0.004800 -0.014600 + } + } + JOINT def_eye_joint.R + { + OFFSET -14.275600 -14.796300 -10.672700 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -4.817300 -3.017000 -1.676600 + } + } + } + } + } + JOINT def_clavicle_joint.L + { + OFFSET 13.330800 -4.189800 19.136500 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.L + { + OFFSET 11.153800 -17.124900 -42.109000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.L + { + OFFSET -4.148400 11.390300 -24.679200 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.L + { + OFFSET -4.349100 -1.663400 -44.955100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.L + { + OFFSET -1.348600 4.920300 -29.350500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.593033 -5.132400 -12.821033 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.L + { + OFFSET -2.174500 -0.831700 -22.477600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.304700 -0.499000 -13.486500 + } + } + } + } + } + JOINT def_clavicle_joint.R + { + OFFSET -13.330800 -4.189800 19.136100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegUpr_joint.R + { + OFFSET -11.153700 -17.124900 -42.109000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontLegLwr_joint.R + { + OFFSET 4.148400 11.390300 -24.678800 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontHorselink_joint.R + { + OFFSET 4.349100 -1.663500 -44.955100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_frontFoot_joint.R + { + OFFSET 1.348600 4.920300 -29.350500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.593067 -5.132400 -12.821033 + } + } + } + JOINT def_frontLegLwrAllTwist_joint.R + { + OFFSET 2.174500 -0.831700 -22.477500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.304700 -0.499000 -13.486500 + } + } + } + } + } + } + } + } + } + JOINT def_c_tail1_joint + { + OFFSET 1.060100 20.088900 29.780900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_c_tail2_joint + { + OFFSET -0.000000 16.097700 -8.972500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 13.449300 -7.496400 + } + } + } + JOINT def_rearLegUpr_joint.L + { + OFFSET 18.177000 4.277800 4.838100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.L + { + OFFSET 1.165200 -0.685600 -41.370900 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.L + { + OFFSET -3.210700 16.542100 -43.789100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.L + { + OFFSET 1.046800 -7.451900 -40.269100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.457967 -3.614067 -8.855800 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.L + { + OFFSET -1.605400 8.271100 -21.894600 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.963200 4.962600 -13.136700 + } + } + } + JOINT def_rearLegUprAllTwist_joint.L + { + OFFSET 0.582600 -0.342800 -20.685500 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.349600 -0.205700 -12.411300 + } + } + } + JOINT def_rearLegUpr_joint.R + { + OFFSET -18.177000 4.277800 4.837700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearLegLwr_joint.R + { + OFFSET -1.165200 -0.685600 -41.370000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearHorselink_joint.R + { + OFFSET 3.210700 16.542100 -43.789600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT def_rearFoot_joint.R + { + OFFSET -1.046800 -7.452000 -40.269100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.457967 -3.614067 -8.855800 + } + } + } + JOINT def_rearLegLwrAllTwist_joint.R + { + OFFSET 1.605400 8.271100 -21.894800 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.963200 4.962700 -13.136900 + } + } + } + JOINT def_rearLegUprAllTwist_joint.R + { + OFFSET -0.582600 -0.342800 -20.685000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.349600 -0.205700 -12.411000 + } + } + } + JOINT def_c_anus_joint + { + OFFSET -0.000000 31.979200 6.907400 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.526200 -1.668600 -3.245100 + } + } + } +} +MOTION +Frames: 178 +Frame Time: 0.033333 +0.000000 120.130833 0.000000 -90.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 +-1.577400 127.022500 -67.571700 -91.034469 0.092020 1.978540 -0.000000 0.000000 0.005543 -2.728367 0.000895 -0.080295 1.982401 0.025555 -0.791152 2.564210 -0.078526 -1.567539 -1.839175 -0.071397 -1.557925 -3.878507 0.065905 0.440956 10.549100 0.624920 -1.104122 4.819583 -1.390959 -3.694034 -3.170583 -0.271519 -0.332929 7.699762 12.955465 -15.248368 4.946996 -4.881178 -9.105767 0.002038 0.000134 0.003652 -3.352331 -0.293457 -1.009848 3.753735 2.164743 15.552925 -3.906173 0.956385 0.374488 4.034899 -2.837562 -9.545670 0.000003 0.000005 0.000001 0.006988 -0.001984 -0.000886 2.092687 3.507245 0.881591 7.212488 -6.427912 -23.755828 -7.421955 -1.792039 -0.765967 -1.358834 1.101173 12.115044 -0.000009 -0.000005 -0.000004 -13.820079 0.382936 -1.937618 -22.455608 -0.064156 0.032940 1.092216 -0.496378 13.084709 4.910844 1.267473 0.063110 -2.363869 -0.599435 -0.064428 -2.543744 -0.290903 0.016108 -0.005170 0.031711 -0.083523 0.000008 -0.000002 -0.000009 -10.095709 -0.331577 -12.849713 5.378908 -1.388452 -0.063438 -2.588895 0.656317 0.072676 8.030439 3.388908 -0.215559 -0.005486 -0.033063 0.087089 0.000001 -0.000004 -0.000003 0.009981 -0.008330 0.010775 +-1.669000 127.217800 -67.159000 -91.001174 0.142138 1.901532 -0.000000 0.000000 0.005542 -2.434592 0.003092 0.059565 2.001102 -0.153345 -0.674158 2.370872 -0.245034 -1.475760 -2.031203 -0.187148 -1.514430 -3.878732 0.103743 0.233968 10.242348 0.681895 -1.081345 3.991191 -1.298463 -3.600708 -3.149590 -0.271641 -0.332832 7.625201 12.875969 -15.077690 4.920319 -4.868109 -9.042386 -0.072622 -0.136383 0.039279 -2.971690 0.512312 -0.752472 3.812142 2.161902 14.997535 -4.136571 1.011919 0.398580 3.883617 -3.102939 -9.567508 0.000007 -0.000002 -0.000002 -0.067738 0.004908 0.016098 0.586986 3.848329 0.973097 2.639706 -4.719081 -25.290756 6.575859 1.663311 0.481430 -4.389444 -1.635427 11.079036 -0.000008 -0.000004 -0.000001 -14.102867 0.298024 -1.947353 -21.611246 -0.859106 -1.340430 1.163230 -0.632851 13.088955 4.585796 1.183457 0.062286 -1.284503 -0.332161 -0.077312 -3.341457 -0.371891 0.032483 -0.005148 0.031715 -0.083524 0.000007 -0.000002 -0.000001 -9.481928 -0.669957 -12.804131 4.396987 -1.134655 -0.061586 -2.114249 0.534784 0.056635 7.835176 3.380255 -0.204032 -0.004527 -0.028124 0.074023 -0.000000 -0.000004 0.000000 0.009973 -0.008335 0.010791 +-1.644600 127.175100 -66.428900 -90.940729 0.221061 1.782466 0.000001 0.000000 0.005542 -2.308690 0.003944 0.101519 2.062178 -0.331856 -0.528960 2.268673 -0.421798 -1.277304 -2.244122 -0.305255 -1.408520 -3.591958 0.119386 -0.224403 9.632426 0.610331 -0.927455 2.797489 -1.101608 -3.247101 -3.065649 -0.272128 -0.332435 7.398192 12.608760 -14.411489 4.881683 -4.872091 -8.772039 -0.257346 -0.498806 0.113165 -2.239171 1.621391 -0.364445 3.815464 2.157690 14.209800 -4.305990 1.052689 0.416443 3.493702 -3.391877 -9.603566 0.000007 0.000001 -0.000008 -0.237557 0.020509 0.054732 -2.624385 3.717825 0.922042 -1.433000 -1.669128 -26.693913 23.438129 6.076228 0.823486 -3.834893 -5.147622 10.441012 -0.000006 -0.000003 -0.000001 -14.429102 0.171782 -1.933594 -20.711990 -1.738807 -2.810215 0.187018 -1.368058 13.160606 6.096026 1.573791 0.062046 -0.136616 -0.052416 -0.117110 -4.974481 -0.627819 0.039231 -0.006585 0.039111 -0.103099 0.000008 -0.000003 0.000005 -9.406718 -0.666556 -12.700652 4.789734 -1.236166 -0.062854 -2.304144 0.583162 0.061560 7.525091 3.302918 -0.185966 -0.005007 -0.030595 0.080559 -0.000001 -0.000004 0.000001 0.009971 -0.008329 0.010781 +-1.553000 127.022500 -65.381300 -90.927175 0.235473 1.726394 -0.000000 0.000000 0.005543 -2.161805 0.002382 -0.003395 2.151757 -0.497260 -0.411732 2.182066 -0.554868 -1.007075 -2.477154 -0.397776 -1.246045 -3.004113 0.148191 -0.867835 8.930621 0.450562 -0.684383 1.556331 -0.855946 -2.681116 -2.981649 -0.259587 -0.315584 7.050117 12.210472 -13.498287 4.802561 -4.863056 -8.397439 -0.522590 -1.011855 0.224022 -1.209802 2.875350 0.119401 3.789937 2.143231 13.250375 -4.427989 1.082011 0.429375 2.910007 -3.647772 -9.653403 0.000007 0.000002 -0.000002 -0.488939 0.043361 0.112003 -9.053996 3.302915 1.144525 -3.836235 2.354662 -27.751132 39.844998 10.247699 -0.088285 2.128413 -7.474157 11.469506 -0.000009 -0.000006 0.000002 -14.722978 0.174172 -1.888540 -19.770881 -2.618975 -4.303376 -0.483893 -1.945730 13.202861 7.484600 1.932487 0.052745 0.831588 0.196331 -0.161002 -6.558803 -0.809629 0.061320 -0.008010 0.046509 -0.122678 0.000006 -0.000003 -0.000004 -9.530153 -0.373799 -12.630879 5.974867 -1.542479 -0.062442 -2.873677 0.729427 0.084143 7.082606 3.174774 -0.146975 -0.005486 -0.033063 0.087084 -0.000001 -0.000004 -0.000007 0.009982 -0.008329 0.010775 +-1.443100 126.869900 -64.127300 -91.041446 0.084953 1.845657 -0.000000 0.000000 0.005542 -1.805099 -0.003279 -0.297129 2.291182 -0.566948 -0.366524 2.006584 -0.594973 -0.679067 -2.764482 -0.422443 -1.025351 -2.220321 0.158344 -1.595608 8.278407 0.272147 -0.401481 0.753914 -0.617512 -1.987894 -2.869663 -0.247172 -0.298632 6.624914 11.689328 -12.391956 4.710380 -4.822003 -7.905000 -0.820410 -1.600034 0.352854 0.069805 4.107792 0.662910 3.710776 2.150077 12.155733 -4.461882 1.090150 0.432984 2.118605 -3.867767 -9.719258 0.000006 0.000001 -0.000000 -0.801492 0.071446 0.183338 -16.808513 2.570782 1.384544 0.561459 5.703376 -28.747389 40.905146 10.503884 -0.187976 20.381775 -5.599952 14.203130 -0.000010 -0.000004 0.000001 -14.890880 0.381606 -2.000104 -18.794843 -3.436074 -5.703430 -0.218350 -2.008390 13.066947 7.816561 2.018187 0.049231 1.514732 0.374313 -0.201334 -7.683603 -0.831323 0.087181 -0.009421 0.053913 -0.142261 0.000006 -0.000002 -0.000003 -9.493451 0.147454 -12.714127 7.390521 -1.908198 -0.053646 -3.558735 0.903997 0.107655 6.504250 3.046338 -0.101604 -0.007853 -0.045395 0.119719 -0.000000 -0.000005 0.000001 0.009970 -0.008331 0.010799 +-1.730000 126.943200 -62.571800 -91.391613 -0.865776 2.346902 -0.000000 0.000000 0.005543 -0.881862 -0.013639 -0.527798 2.495925 -0.320732 -0.511844 1.554813 -0.331222 -0.588695 -3.167027 -0.227193 -0.851691 -1.318337 0.133598 -2.321740 7.773932 0.089858 -0.121102 0.766773 -0.412252 -1.284259 -2.757759 -0.245689 -0.273014 6.143162 11.052713 -11.117995 4.577080 -4.769289 -7.308242 -1.120290 -2.183805 0.491154 1.532109 5.172864 1.205900 3.562466 2.143241 11.000259 -4.353435 1.064093 0.421466 1.114207 -3.957999 -9.801795 0.000006 0.000001 -0.000000 -1.148054 0.102124 0.262603 -23.744878 1.781295 1.625622 5.247712 8.459254 -29.958767 38.945561 10.028710 -0.007476 37.636046 -1.981982 15.027629 -0.000007 -0.000003 -0.000002 -14.787974 1.449508 -2.278395 -17.795643 -4.157660 -6.900146 -3.450313 -2.603806 9.972552 14.167065 3.648509 -0.113303 -1.233638 -0.547699 2.127016 -0.889018 1.107517 0.098820 0.152234 -0.715567 1.902051 0.000007 -0.000001 -0.000007 -8.999436 1.213370 -13.095840 8.725249 -2.252622 -0.037069 -4.203142 1.068218 0.133307 5.724953 3.152657 -0.066459 -0.010220 -0.057731 0.152367 -0.000002 -0.000005 -0.000003 0.009976 -0.008328 0.010783 +-2.578400 127.230000 -60.794100 -91.980440 -2.756812 3.146763 0.000001 0.000000 0.005542 0.601156 -0.004898 -0.478944 2.762167 0.303371 -0.851297 0.835096 0.285522 -0.856609 -3.657263 0.224735 -0.777005 -0.304451 0.103033 -2.936188 7.340348 -0.134755 0.149156 1.217009 -0.268434 -0.697070 -2.624855 -0.244249 -0.247310 5.637506 10.315991 -9.739376 4.428364 -4.707600 -6.608098 -1.392374 -2.707179 0.610214 3.109780 5.929432 1.701353 3.339315 2.145157 9.874970 -4.062030 0.993962 0.390767 -0.100342 -3.904235 -9.857081 0.000006 0.000006 0.000003 -1.521855 0.134670 0.348297 -28.519469 1.315212 2.121552 7.847350 9.704672 -30.685748 36.243296 9.362308 0.214333 48.112925 0.304047 13.894503 -0.000006 -0.000006 -0.000002 -14.398811 3.495579 -2.635082 -16.657329 -3.899767 -6.355307 -7.574971 -3.210407 10.135774 20.886058 5.337458 -0.480216 -7.105046 -1.388413 -2.668353 7.738537 1.376012 -0.009875 -0.155365 0.905989 -2.387704 0.000007 -0.000002 -0.000003 -8.107215 2.871230 -13.724339 10.128185 -2.614003 -0.011010 -4.881621 1.240497 0.160860 4.745040 3.600404 -0.015743 -0.011159 -0.062663 0.165413 -0.000000 -0.000004 0.000001 0.009971 -0.008332 0.010792 +-3.701600 127.486400 -58.794200 -92.659525 -4.936511 3.961693 -0.000000 0.000001 0.005542 2.308012 0.006579 -0.325439 3.090514 1.034562 -1.267687 0.037108 1.014499 -1.276789 -4.230998 0.760921 -0.693851 0.997427 0.082206 -3.462554 6.935776 -0.361268 0.417833 1.805809 -0.080357 -0.062474 -2.491866 -0.223099 -0.219337 5.105647 9.518392 -8.271657 4.246858 -4.644229 -5.818486 -1.643331 -3.209530 0.724651 4.813135 6.452054 2.161943 3.116252 2.151451 8.749667 -3.770653 0.923677 0.360418 -1.389686 -3.708425 -9.914690 0.000006 0.000002 -0.000003 -1.895705 0.166649 0.434201 -31.743813 1.179545 2.876354 7.538888 9.798488 -30.114833 36.236947 9.360726 0.214819 46.943849 -0.579300 12.944021 -0.000009 0.000000 -0.000006 -13.862885 5.823324 -2.972056 -15.518151 -3.219830 -5.139483 -10.440107 -3.604558 10.931311 24.753622 6.283081 -0.780163 -13.919955 -0.574803 -11.776658 18.705515 1.326434 0.015726 -0.402396 3.981179 -10.402648 0.000007 -0.000001 0.000002 -7.088617 4.714892 -14.435569 11.775937 -3.037277 0.030884 -5.682526 1.442475 0.191040 3.632997 4.174191 0.073644 -0.013051 -0.072537 0.191523 -0.000002 -0.000002 -0.000004 0.009976 -0.008329 0.010772 +-4.818600 127.449800 -56.572000 -93.278817 -6.742939 4.549335 -0.000000 -0.000001 0.005543 3.783875 -0.002922 -0.122553 3.448403 1.624357 -1.635679 -0.605709 1.599507 -1.672822 -4.820715 1.210593 -0.567078 2.493915 0.028713 -3.790705 6.531688 -0.529933 0.686593 2.476613 0.082955 0.532760 -2.344895 -0.201933 -0.191361 4.608218 8.657167 -6.775987 4.038155 -4.594407 -4.934830 -1.893428 -3.712395 0.836949 6.557332 6.769672 2.584008 3.172917 2.155016 7.588994 -4.123017 1.008658 0.397160 -2.292021 -3.458062 -9.992075 0.000007 0.000004 -0.000005 -2.242406 0.195803 0.514039 -34.550628 1.091397 3.621253 6.148185 9.388546 -28.312425 38.006205 9.798459 0.073225 38.031928 -3.141664 11.808604 -0.000001 -0.000005 0.000001 -13.384653 7.743380 -3.206559 -14.480074 -2.090535 -3.278904 -13.478554 -3.175311 10.665587 24.661400 6.260808 -0.772276 -16.337090 1.269133 -17.654077 27.212782 2.179378 -0.012809 -0.321934 6.095003 -15.909450 0.000012 -0.000001 0.000005 -6.253927 6.313719 -14.997040 13.899867 -3.580413 0.102827 -6.707378 1.702567 0.246718 2.443204 4.690295 0.179585 -0.014922 -0.082404 0.217635 -0.000001 -0.000004 -0.000001 0.009977 -0.008331 0.010781 +-5.648700 126.845500 -54.207000 -93.696874 -7.513365 4.707247 -0.000000 0.000000 0.005543 4.448363 -0.005056 0.164345 3.770619 1.861532 -1.827345 -0.808509 1.832757 -1.878913 -5.280990 1.400785 -0.331726 4.082199 -0.017522 -3.901561 6.149308 -0.700587 0.910155 3.300302 0.220654 0.944091 -2.197942 -0.180694 -0.163438 4.152994 7.764288 -5.280028 3.822639 -4.545787 -3.962749 -2.143132 -4.189798 0.936593 8.382960 6.945811 2.973769 3.350086 2.127002 6.386137 -4.766918 1.163318 0.465634 -3.074359 -3.135152 -10.079031 0.000006 0.000002 -0.000004 -2.548352 0.221128 0.584631 -36.426382 0.953702 4.197392 5.158387 8.487286 -26.365591 37.718535 9.727643 0.097168 28.756100 -4.823425 9.406772 -0.000004 -0.000004 0.000005 -13.210703 8.561085 -3.243241 -13.576013 -0.500109 -0.822649 -16.118777 -2.159250 9.892842 20.903326 5.341729 -0.481414 -13.389890 2.343128 -19.164862 29.230081 3.129047 -0.159404 -0.254410 6.756397 -17.644626 0.000011 -0.000006 -0.000001 -5.989569 7.238545 -15.170506 16.705673 -4.292336 0.228616 -8.077546 2.024323 0.315864 1.253584 4.968363 0.272753 -0.018663 -0.102154 0.269847 -0.000003 -0.000004 -0.000009 0.009987 -0.008336 0.010788 +-6.149200 125.343900 -51.651500 -93.942220 -7.455911 4.570399 0.000002 0.000003 0.005542 3.979673 0.004368 0.478949 4.049910 1.837333 -1.877918 -0.347957 1.785289 -1.924622 -5.462941 1.388428 -0.019809 5.846393 -0.056607 -3.999036 5.782057 -0.898933 1.141871 4.200082 0.356727 1.342343 -2.050972 -0.150694 -0.124610 3.720661 6.864484 -3.807247 3.594507 -4.523983 -2.919074 -2.396363 -4.705450 1.071126 10.428398 7.104921 3.392441 3.533320 2.089615 5.105427 -5.458499 1.328506 0.541080 -4.014530 -2.782751 -10.169535 0.000008 0.000002 -0.000008 -2.793146 0.241122 0.641201 -36.567088 0.621549 4.356718 6.296985 6.699781 -23.982983 30.476082 7.903691 0.580241 21.632468 -3.859791 5.494213 -0.000004 -0.000004 -0.000001 -13.278835 8.484635 -3.204505 -12.848436 0.787122 1.067794 -18.528066 -1.899076 9.502484 17.422670 4.473042 -0.266343 -9.217143 3.019575 -20.002948 26.979548 3.448283 -0.111421 -0.206927 7.131858 -18.633738 0.000005 -0.000003 -0.000007 -6.736707 7.997840 -14.935735 21.397577 -5.463808 0.516223 -10.366019 2.574347 0.462035 0.019941 5.031918 0.373270 -0.024263 -0.131768 0.348166 -0.000002 -0.000004 -0.000003 0.009982 -0.008325 0.010781 +-6.399500 123.317500 -48.858000 -94.184142 -7.257048 4.308586 0.000000 -0.000003 0.005542 2.895442 0.004151 0.758686 4.285917 1.774466 -1.855817 0.489807 1.711739 -1.866806 -5.399837 1.338397 0.340619 7.645641 -0.097518 -4.060391 5.438045 -1.166913 1.366723 5.218437 0.481329 1.626666 -1.904036 -0.120594 -0.085858 3.379134 5.985753 -2.401086 3.348187 -4.516028 -1.808361 -2.649702 -5.169840 1.182417 12.733348 7.234186 3.827342 3.649193 2.056270 3.783894 -5.973979 1.450999 0.598595 -5.338456 -2.430899 -10.243744 0.000003 0.000002 -0.000005 -2.949524 0.253755 0.677390 -34.215710 0.683014 4.194876 8.168588 5.086880 -22.636493 20.983203 5.431719 0.854954 14.496252 -1.852852 3.143970 -0.000002 -0.000004 -0.000001 -13.377096 8.244505 -3.069618 -12.252611 1.402048 1.889601 -20.654408 -1.726841 9.405908 14.130896 3.639297 -0.111866 -4.719529 3.448926 -20.409474 23.108504 3.427515 0.039623 -0.183117 7.302657 -19.084795 0.000011 -0.000001 0.000001 -7.787148 8.920923 -14.462780 26.982404 -6.816849 0.981723 -13.093133 3.221773 0.645563 -1.317203 4.971521 0.454889 -0.029790 -0.161410 0.426492 -0.000005 -0.000003 0.000000 0.009976 -0.008329 0.010781 +-6.344600 121.284900 -45.874000 -94.405345 -6.928969 3.770682 -0.000000 0.000001 0.005543 1.601080 0.016266 1.024249 4.422669 1.669407 -1.710158 1.424854 1.612140 -1.673409 -5.140257 1.261749 0.716450 9.404338 -0.117683 -4.066356 5.097247 -1.522609 1.575358 6.350260 0.544255 1.728426 -1.736133 -0.090419 -0.047145 3.095464 5.150504 -1.075124 3.106353 -4.544974 -0.655033 -2.837623 -5.557535 1.261347 15.188558 7.282097 4.259048 3.823350 1.994748 2.455908 -6.638891 1.608160 0.674386 -6.801114 -2.101368 -10.350548 0.000007 0.000006 -0.000003 -3.010739 0.258675 0.691563 -30.605439 1.483764 4.175934 8.550276 3.987889 -22.907399 14.819383 3.809905 0.811518 13.021475 -1.314800 3.156541 0.000001 0.000000 -0.000005 -13.518735 7.822844 -2.683046 -11.775924 1.997319 2.609487 -21.904625 -1.275022 9.703218 9.498507 2.451900 0.023810 -0.099885 3.979234 -20.549471 20.204149 3.327633 0.166430 -0.173881 7.366409 -19.253345 0.000006 -0.000001 0.000001 -8.473493 9.592025 -13.707464 31.857805 -7.951125 1.493688 -15.472887 3.791841 0.841157 -2.718620 4.729727 0.517433 -0.035295 -0.191044 0.504808 -0.000001 -0.000005 0.000003 0.009981 -0.008331 0.010769 +-5.911200 119.819900 -42.699500 -94.629021 -6.479386 2.842266 -0.000001 -0.000002 0.005543 0.579450 0.027387 1.220025 4.440951 1.571052 -1.456025 2.116031 1.543726 -1.312336 -4.831050 1.182904 1.210378 11.164112 -0.122699 -4.059229 4.763698 -2.078100 1.828203 7.482500 0.592582 1.787914 -1.582243 -0.060125 -0.008539 2.870453 4.385935 0.165099 2.869763 -4.622643 0.514541 -2.933975 -5.753113 1.296175 17.587780 6.802483 4.521943 4.120780 1.926112 1.491908 -7.514542 1.813689 0.776934 -8.230117 -1.590819 -10.410579 0.000007 0.000004 -0.000002 -2.997125 0.257579 0.688413 -26.627100 1.911647 4.109207 6.085164 3.172493 -23.226021 13.954797 3.582882 0.791449 12.390915 -1.079463 2.930891 -0.000006 -0.000002 -0.000003 -13.706541 7.193582 -1.903495 -11.443447 2.777482 3.546816 -23.055526 -2.885152 9.269786 14.418128 3.712440 -0.123434 -1.542614 3.388090 -19.973235 16.441457 2.649023 0.388292 -0.208645 7.119203 -18.600340 0.000009 -0.000004 -0.000004 -8.288659 9.809764 -12.633649 34.747238 -8.599038 1.841771 -16.893250 4.126817 0.980935 -4.107992 4.256652 0.521360 -0.038473 -0.208340 0.550494 -0.000001 -0.000004 -0.000003 0.009984 -0.008331 0.010785 +-5.062700 119.026400 -39.175800 -94.812152 -5.898057 1.311564 -0.000000 0.000000 0.005542 -0.008209 0.025240 1.527912 4.384208 1.535693 -1.012628 2.472585 1.524305 -0.812590 -4.585485 1.159073 1.757150 12.854188 -0.121113 -4.038264 4.504874 -2.890669 2.169756 8.397387 0.653331 1.870151 -1.442357 -0.029728 0.029974 2.718671 3.772606 1.142382 2.666932 -4.699865 1.536617 -1.473951 -5.573867 1.784841 17.870638 5.583249 4.278643 4.080616 1.913998 1.145968 -7.500968 1.810518 0.775322 -9.722443 -0.884066 -10.323885 0.000006 0.000002 -0.000006 -2.949532 0.253762 0.677389 -21.691310 2.156973 4.102997 2.940904 1.954803 -23.732262 12.097690 3.096320 0.736745 12.306058 -0.380641 2.689350 -0.000009 -0.000005 0.000001 -13.951780 6.283284 -0.571700 -11.160577 3.674072 4.627325 -23.616416 -4.564444 9.119791 20.549966 5.254247 -0.457184 -6.481764 2.820492 -19.006581 16.320090 2.272961 0.437303 -0.252879 6.769357 -17.678734 0.000006 0.000000 -0.000001 -7.259985 9.589741 -11.030377 35.618880 -8.790614 1.953105 -17.318131 4.220048 1.018443 -5.484114 3.525080 0.453852 -0.039389 -0.213276 0.563550 -0.000001 -0.000003 -0.000001 0.009984 -0.008327 0.010777 +-3.921300 118.550300 -35.223500 -94.977640 -5.220504 -0.663025 -0.000000 0.000001 0.005543 -0.400152 0.027455 1.975579 4.264362 1.463349 -0.398650 2.654495 1.521331 -0.217930 -4.324954 1.116297 2.323855 14.544258 -0.118909 -4.017355 4.288849 -3.776002 2.535196 9.312172 0.715384 1.951404 -1.302482 0.000762 0.068414 2.623919 3.237699 2.111408 2.510297 -4.875999 2.618050 -3.026008 -5.758413 1.279536 20.058783 4.107017 4.270577 -0.531546 2.920139 0.871931 3.302537 -0.828092 -0.265538 -7.492238 0.215906 -8.400829 0.000009 0.000004 -0.000003 -2.813537 0.242776 0.645920 -16.149390 2.387791 4.164909 -0.944471 0.598148 -24.374978 10.511017 2.682126 0.677527 11.919110 0.402787 2.476954 -0.000008 -0.000003 -0.000003 -14.191844 5.150521 1.172072 -11.058594 4.384951 5.445731 -22.173471 -5.600167 9.404208 24.283894 6.169488 -0.740355 -11.773907 2.493686 -17.867415 17.223715 2.025283 0.398243 -0.293950 6.393854 -16.692462 0.000008 0.000000 -0.000009 -5.681087 9.218204 -8.973012 35.364821 -8.734968 1.920354 -17.196861 4.183837 1.006412 -6.949996 2.600012 0.308331 -0.038956 -0.210805 0.557024 -0.000000 -0.000004 -0.000007 0.009977 -0.008332 0.010774 +-2.621200 118.391600 -30.890300 -95.138067 -4.474027 -2.726147 -0.000000 0.000000 0.005543 -0.617395 0.033914 2.465142 4.047404 1.392257 0.308495 2.647555 1.485286 0.386158 -4.021748 1.069262 2.756581 16.106786 -0.135060 -3.994050 4.123640 -4.726757 2.923895 10.224799 0.837593 2.100963 -1.148683 0.044406 0.123216 2.601351 2.811530 3.004601 2.410183 -5.131804 3.707056 -4.580139 -5.929245 0.769223 19.740032 4.096314 4.220264 -9.300761 4.881736 1.587029 24.372909 -6.320970 -0.804246 3.266000 0.239300 -6.360673 0.000006 0.000004 -0.000004 -2.527967 0.219454 0.579924 -10.880773 2.368194 4.116766 -3.867400 -0.614855 -24.721805 8.127584 2.063397 0.567101 11.587958 1.070403 2.422610 -0.000008 -0.000005 -0.000006 -14.392192 3.905078 2.990810 -11.074093 4.714632 5.781841 -20.073159 -6.189736 9.896172 26.761291 6.764294 -0.960799 -15.769039 2.124322 -16.733376 17.770013 1.607210 0.389760 -0.329536 6.005178 -15.674401 0.000010 -0.000001 -0.000008 -3.352073 8.737071 -6.844810 33.772232 -8.382578 1.720674 -16.408747 4.011110 0.935709 -8.529509 1.552582 0.085737 -0.037582 -0.203398 0.537444 0.000000 -0.000004 -0.000005 0.009976 -0.008327 0.010785 +-1.296600 118.611400 -26.223800 -95.272129 -3.708620 -4.526400 -0.000000 0.000000 0.005542 -0.736704 0.040097 2.751847 3.655815 1.370499 0.941195 2.472834 1.467967 0.991923 -3.508845 1.039050 3.087815 17.480720 -0.140256 -3.998780 4.015706 -5.708942 3.326488 11.003535 0.975703 2.326653 -0.994900 0.088196 0.177901 2.626352 2.524285 3.791871 2.394849 -5.464223 4.735678 -4.580135 -5.929248 0.769224 14.784083 4.032828 3.426892 -13.820640 5.259121 4.048486 35.494789 -9.175623 -0.270168 13.520352 -0.511778 -6.608025 0.000008 0.000003 -0.000003 -2.018067 0.176991 0.462360 -6.863884 1.643814 3.709644 -5.848733 -1.143369 -24.493675 8.080281 2.051165 0.564646 9.109819 1.016345 2.465111 -0.000007 -0.000006 0.000004 -14.494980 2.697405 4.553609 -11.510912 4.668409 5.656967 -17.279865 -6.194220 10.306204 27.762441 7.001521 -1.057131 -18.656450 1.779220 -15.540852 18.158818 1.155175 0.389218 -0.358139 5.615944 -14.657306 0.000011 -0.000002 -0.000002 -0.041779 8.165338 -5.053190 30.517487 -7.644186 1.343377 -14.816458 3.643315 0.796717 -10.236959 0.466940 -0.219947 -0.033929 -0.183637 0.485230 -0.000004 -0.000004 -0.000008 0.009974 -0.008323 0.010782 +-0.088100 119.197300 -21.271600 -95.367066 -2.962775 -5.700008 -0.000000 0.000000 0.005542 -0.519587 0.038747 2.486047 3.214469 1.394188 1.363774 2.052707 1.477005 1.649029 -2.969514 1.042604 3.384922 18.510019 -0.160611 -3.972534 3.934107 -6.558184 3.684302 11.417637 1.117438 2.543638 -0.862125 0.122429 0.186587 2.721172 2.396741 4.422451 2.483646 -5.856272 5.631741 -4.580132 -5.929247 0.769222 9.518308 3.797623 2.454113 -15.602010 4.542543 7.379110 40.237580 -10.342817 0.124627 26.469003 -3.200006 -7.591824 0.000002 0.000005 -0.000002 -1.100486 0.097932 0.251718 -4.418871 0.413428 3.013624 -4.897804 -1.399365 -23.479508 5.547810 1.399625 0.418749 7.453749 0.902426 2.693070 -0.000005 -0.000004 0.000000 -14.529040 1.650914 5.534698 -12.437185 4.285793 5.146479 -13.947290 -5.591418 10.290843 27.249374 6.880185 -1.007241 -20.340484 1.486909 -14.311575 18.388201 0.711680 0.366323 -0.379772 5.226267 -13.641080 0.000007 -0.000003 0.000003 4.564174 7.384454 -4.007229 25.114187 -6.370024 0.811371 -12.177076 3.015486 0.590417 -12.103347 -0.554232 -0.585153 -0.028414 -0.153999 0.406916 -0.000002 -0.000004 -0.000014 0.009983 -0.008329 0.010785 +1.181500 120.253300 -16.128900 -95.459145 -1.997310 -5.871952 -0.000001 0.000000 0.005543 0.481899 0.016133 1.234188 2.907146 1.369245 1.504621 1.123829 1.413557 2.550545 -2.896480 0.994488 3.633451 18.993989 -0.157865 -3.883087 3.950572 -7.225963 3.917914 11.729216 1.196319 2.647375 -0.743320 0.156640 0.195226 2.857293 2.468756 4.861919 2.684355 -6.303978 6.302230 -4.566483 -5.927806 0.773717 4.541419 3.781189 1.499894 -19.259076 3.486040 11.514315 49.963701 -12.595154 1.229123 33.772027 -6.004739 -8.087315 0.000008 0.000001 0.000003 0.176848 -0.017751 -0.039465 -3.051062 -0.719303 2.269683 -3.013903 -1.448403 -22.144392 2.750611 0.688594 0.224460 6.033582 0.554937 2.953330 -0.000013 -0.000008 0.000002 -14.488844 0.658981 5.565842 -13.656977 4.178388 5.009986 -10.193510 -4.562361 9.433330 25.162523 6.381660 -0.815586 -20.721918 1.299101 -13.036113 18.514508 0.181581 0.374160 -0.394323 4.841286 -12.638655 0.000013 -0.000001 -0.000006 2.325879 8.131731 -2.833320 31.874140 -7.954834 1.495555 -17.941090 4.318896 1.199830 4.969832 -5.222299 0.084058 -0.048425 -0.262702 0.694070 -0.000003 -0.000005 -0.000001 0.009975 -0.008327 0.010786 +2.597600 121.522900 -10.843400 -95.525576 -0.725916 -5.208995 -0.000000 0.000000 0.005542 2.195720 -0.011011 -0.829363 2.830802 1.344340 1.437102 -0.234901 1.273398 3.669705 -3.465899 0.910686 3.759957 18.807399 -0.116665 -3.556070 4.120882 -8.027366 4.162879 12.330529 1.217484 2.594419 -0.645435 0.168862 0.221233 3.028874 2.630196 5.172576 2.945936 -6.790084 6.921174 -4.552854 -5.926365 0.778217 -0.324126 3.755013 0.501011 -23.403401 1.876082 15.680665 61.435544 -14.936329 2.997487 36.515588 -8.584476 -7.957040 0.000020 0.000000 -0.000003 1.562209 -0.150585 -0.352425 -2.005246 -1.774647 1.433705 1.452609 -1.572494 -20.312216 -5.174775 -1.260857 -0.509906 7.669376 0.592106 3.382013 -0.000007 -0.000002 -0.000003 -14.411822 -0.432143 4.709794 -14.863801 4.318945 5.200008 -6.352277 -3.568537 7.840776 22.307915 5.687751 -0.583070 -20.162927 1.166798 -11.785979 18.461030 -0.508955 0.417809 -0.402051 4.461140 -11.649950 0.000006 -0.000002 -0.000001 -5.480426 8.702060 -2.323704 41.652440 -10.062982 2.801271 -26.990357 6.164190 2.502660 28.499185 -9.103531 2.860824 -0.081727 -0.450690 1.189981 -0.000001 -0.000004 0.000000 0.009986 -0.008326 0.010780 +3.903900 122.646000 -5.383300 -95.592698 0.542494 -3.921971 0.000001 0.000000 0.005544 4.021113 -0.049976 -3.186739 2.852411 1.317971 1.227434 -1.636155 1.059192 4.770013 -4.240412 0.855101 3.722684 18.146879 -0.028220 -2.985569 4.307032 -8.800634 4.403305 13.101824 1.195868 2.478869 -0.547607 0.188893 0.223221 3.196198 2.798712 5.463155 3.209478 -7.243010 7.485749 -4.368723 -5.906830 0.838886 -5.421673 3.639236 -0.640227 -25.721147 0.076029 19.175987 68.570789 -16.184844 4.319593 37.380403 -10.849362 -7.537331 0.000004 0.000004 0.000003 3.062206 -0.302987 -0.687737 -1.642213 -2.635199 0.688623 5.434287 -1.420110 -18.564553 -11.613059 -2.752254 -1.297480 8.950744 0.358452 3.676524 -0.000007 -0.000002 -0.000001 -14.367586 -1.375738 3.202830 -15.676425 3.983619 4.715419 -2.801794 -2.833600 5.718169 19.629680 5.025616 -0.396599 -19.091178 1.045800 -10.613729 18.092466 -1.196358 0.470123 -0.403235 4.088446 -10.681361 0.000008 -0.000002 -0.000001 -11.009503 7.959700 -3.330199 42.494620 -10.232656 2.930073 -31.622396 6.876670 3.494782 33.627436 -8.901512 3.187824 -0.111347 -0.626565 1.653188 -0.000003 -0.000003 -0.000010 0.009983 -0.008339 0.010781 +4.801100 123.274700 0.251500 -95.634340 1.462353 -2.228517 -0.000000 0.000000 0.005543 5.464452 -0.088871 -5.423188 2.935464 1.366830 0.916279 -2.759683 0.900432 5.621404 -5.019096 0.865669 3.484841 17.149521 0.056340 -2.314587 4.496886 -9.573115 4.646801 13.999040 1.172939 2.301023 -0.477744 0.208814 0.225273 3.340476 2.956098 5.754600 3.472385 -7.683963 7.995619 -3.973261 -5.864195 0.968985 -10.959738 3.213373 -1.990293 -25.778782 -1.654343 22.417497 69.561208 -16.344337 4.515065 36.025040 -12.994673 -7.928461 -0.000002 0.000005 0.000002 4.669821 -0.476118 -1.042765 -1.426587 -3.269073 0.071653 6.589680 -1.026452 -17.133289 -11.613053 -2.752255 -1.297482 6.681188 -0.885807 3.698429 -0.000008 -0.000005 0.000001 -14.367276 -1.909292 1.369863 -15.247646 2.910449 3.234888 0.014945 -2.474771 3.253056 18.105800 4.644687 -0.304381 -17.952623 0.881613 -9.577899 17.225641 -1.763598 0.526494 -0.398535 3.735896 -9.765410 0.000005 -0.000003 -0.000002 -15.444647 7.389564 -4.840784 40.498534 -9.827242 2.628851 -33.122531 6.878675 4.183340 35.150838 -8.223707 2.987575 -0.140340 -0.807641 2.129361 0.000001 -0.000003 0.000007 0.009976 -0.008337 0.010790 +5.014800 123.042800 6.124300 -95.649040 1.742535 -0.346449 0.000001 0.000000 0.005543 6.047359 -0.111208 -7.204988 3.051551 1.595227 0.522051 -3.281361 0.982383 6.021839 -5.637744 1.023480 3.069093 15.934293 0.130173 -1.725464 4.670058 -10.273565 4.864599 14.979387 1.169945 2.187917 -0.407879 0.228742 0.227301 3.481646 3.118294 6.032625 3.728834 -8.094080 8.470842 -3.496152 -5.811561 1.125593 -15.984485 2.443205 -3.352858 -23.706229 -2.850467 25.403396 64.450423 -15.484734 3.537035 30.235636 -14.511195 -10.495808 0.000007 0.000006 -0.000005 6.120521 -0.640938 -1.359062 -0.809949 -3.714935 -0.618920 7.770309 -0.595019 -15.552752 -11.613062 -2.752254 -1.297487 4.173857 -2.276671 3.591596 -0.000006 -0.000002 0.000003 -14.431333 -1.771063 -0.495306 -13.995426 1.047332 0.808116 1.573922 -2.456038 0.563741 18.855226 4.832376 -0.348467 -17.252499 0.584921 -8.751081 15.691198 -2.062020 0.554053 -0.389484 3.418591 -8.941084 0.000006 -0.000002 -0.000013 -20.139796 7.794054 -6.281297 38.465460 -9.402957 2.336660 -30.717372 6.187621 4.463512 34.994536 -7.290306 2.567394 -0.168919 -0.996404 2.625040 0.000004 -0.000005 -0.000003 0.009972 -0.008324 0.010780 +4.752300 121.602200 12.092300 -95.398095 1.073292 1.382159 0.000001 0.000000 0.005543 5.085452 -0.132779 -8.462027 3.125642 2.109238 0.120379 -2.896043 1.528519 6.083481 -5.887327 1.395850 2.593445 14.410603 0.196018 -1.175771 4.835586 -10.854935 5.041619 16.106530 1.170445 2.071833 -0.337962 0.237703 0.237991 3.612058 3.263120 6.307046 3.990761 -8.495291 8.928877 -3.087359 -5.765414 1.259464 -20.555442 1.331095 -4.683258 -18.360785 -2.506593 27.222494 50.067677 -12.618036 1.242977 12.503006 -10.992078 -17.333692 0.000005 0.000001 0.000001 6.710019 -0.710238 -1.486435 -3.155874 -5.048693 -3.313342 15.085463 1.817568 -12.449447 -11.613054 -2.752253 -1.297491 -0.586301 -4.730383 3.038752 -0.000006 -0.000002 -0.000004 -13.814814 -0.739517 -1.912765 -11.261116 -1.224379 -1.692593 1.435935 -2.289116 -2.045542 22.338979 5.695369 -0.585413 -17.164660 0.145850 -8.164213 13.308240 -2.217503 0.585833 -0.378329 3.151637 -8.247400 0.000007 -0.000003 -0.000001 -24.777329 8.844868 -7.181022 34.785412 -8.607470 1.846576 -25.584787 4.992197 4.596650 31.993460 -5.802861 1.748930 -0.199614 -1.212792 3.192371 0.000000 -0.000004 -0.000003 0.009989 -0.008335 0.010777 +4.422700 119.429300 18.028700 -94.751047 -0.351951 2.805102 -0.000000 0.000000 0.005544 2.862016 -0.145577 -9.187584 3.091261 2.714934 -0.238052 -1.825166 2.321671 5.883819 -5.806193 1.815463 2.020583 12.578133 0.223023 -0.733330 5.030298 -10.873449 5.083171 17.431995 1.299251 2.149688 -0.268043 0.246675 0.248665 3.739418 3.412618 6.568142 4.272681 -8.876603 9.384466 -2.923878 -5.746689 1.312918 -20.992909 0.350600 -4.972226 -11.149157 0.085586 23.220140 30.532534 -7.918173 -0.577393 4.749726 -4.968567 -17.579618 0.000010 0.000000 -0.000001 9.763942 -1.090216 -2.135034 -5.558562 -4.806019 -3.774322 17.711546 2.782183 -10.659090 -11.613058 -2.752255 -1.297484 -3.294056 -6.030022 2.561512 -0.000010 -0.000004 0.000003 -11.954853 0.875198 -2.889737 -9.452735 -2.716500 -3.393579 0.478388 -1.558280 -4.300964 26.540278 6.711675 -0.940090 -16.635243 -0.200121 -7.721797 10.049916 -2.437164 0.609255 -0.367033 2.937507 -7.690773 0.000006 -0.000003 -0.000004 -28.881329 10.242169 -7.416832 29.830653 -7.485415 1.269126 -19.226878 3.593899 4.716372 27.892703 -4.228770 0.945943 -0.226599 -1.417004 3.727040 0.000008 -0.000004 -0.000011 0.009976 -0.008322 0.010774 +4.026000 116.871700 23.933200 -93.886641 -2.157479 4.006325 -0.000000 0.000000 0.005543 -0.319123 -0.146229 -9.311608 2.870336 3.161376 -0.582085 -0.212269 3.092693 5.335196 -5.220397 2.133245 1.347936 10.618922 0.173701 -0.488560 5.189213 -10.006003 4.853736 18.845530 1.666401 2.547783 -0.198150 0.255663 0.259334 3.878281 3.556945 6.824241 4.557962 -9.255688 9.842424 -2.930689 -5.747478 1.310692 -17.418555 0.037536 -4.161649 -5.379084 1.408627 18.729762 22.534304 -5.839200 -0.838327 -2.578215 -0.941341 -14.766913 0.000004 0.000004 -0.000005 7.437620 -0.797577 -1.642706 -2.867019 -4.010945 -4.792254 19.868342 3.384710 -16.258212 -10.939196 -2.600711 -1.207385 4.987136 -7.816127 10.369375 -0.000010 -0.000004 0.000002 -8.506469 2.675434 -3.741021 -9.873652 -2.893714 -3.743768 -0.734206 -0.504271 -6.174186 30.565909 7.655350 -1.348674 -15.145489 -0.324229 -7.426150 5.847774 -2.793250 0.619943 -0.357621 2.783651 -7.290682 0.000006 -0.000003 0.000007 -32.494188 11.765316 -7.138382 25.356743 -6.428383 0.832662 -13.779476 2.446065 4.880171 24.495700 -2.812344 0.335005 -0.245437 -1.569075 4.124755 -0.000001 -0.000002 -0.000002 0.009990 -0.008332 0.010779 +3.604800 114.247100 29.694900 -92.962143 -3.986158 5.021294 -0.000000 0.000000 0.005544 -4.010934 -0.135488 -8.768373 2.438039 3.325858 -0.876968 1.713687 3.598806 4.361280 -4.179138 2.245604 0.542034 8.582489 0.054303 -0.332167 5.328640 -8.139615 4.337457 20.349570 2.273645 3.228588 -0.128320 0.281115 0.256962 4.016523 3.701903 7.080040 4.846619 -9.632492 10.302802 -2.937499 -5.748248 1.308459 -15.515646 1.476196 -2.796022 2.760117 1.923778 18.049362 10.523972 -2.685501 -0.678072 -0.013440 -1.972055 -15.495877 0.000009 0.000000 -0.000001 2.373768 -0.231944 -0.534311 -1.400166 -2.840834 -5.660519 13.698540 6.087449 -23.207548 12.778638 3.274532 0.758638 8.484925 -7.984766 19.267472 -0.000008 -0.000005 -0.000001 -4.265943 4.318678 -4.674700 -10.815563 -2.871135 -3.827462 -2.298175 0.565147 -7.572361 34.086776 8.452666 -1.759338 -11.535668 -0.227233 -7.319616 0.071154 -3.400212 0.570564 -0.350161 2.672463 -7.001460 0.000007 -0.000001 -0.000001 -36.530372 13.568480 -6.379623 24.538664 -6.231142 0.761839 -12.025785 2.097414 5.002992 23.707160 -1.792642 -0.063566 -0.253146 -1.633930 4.294251 -0.000000 -0.000005 -0.000001 0.009985 -0.008329 0.010785 +3.159200 111.897100 35.345500 -92.156831 -5.476574 5.871194 -0.000001 0.000000 0.005544 -7.335602 -0.120955 -7.816222 1.990170 3.360808 -1.131500 3.468083 3.838783 3.173880 -3.178095 2.219013 -0.317282 6.588437 -0.067292 -0.131276 5.504823 -6.048040 3.742934 21.826261 2.999957 3.981646 -0.072465 0.306499 0.254631 4.122527 3.843737 7.319967 5.135564 -10.020645 10.804640 -2.519068 -5.608098 1.446975 -11.302984 4.233242 -0.510206 6.136845 0.903091 12.282194 0.527753 -0.131221 -0.045613 2.812975 -2.830811 -11.931013 0.000011 0.000004 -0.000009 -2.724258 0.235509 0.625279 -5.780349 -1.433903 -5.209486 5.872647 10.068676 -23.966389 40.543979 10.416850 -0.153481 14.113024 -5.073965 21.258026 -0.000008 -0.000003 -0.000005 0.137148 5.468013 -5.736474 -12.067617 -2.547540 -3.575511 -2.956607 1.422641 -8.533357 35.742527 8.817650 -1.969135 -6.663945 0.023743 -7.361253 -6.274934 -4.075774 0.391740 -0.345271 2.603903 -6.823060 0.000008 -0.000002 0.000001 -41.342005 17.297408 -4.633501 37.839084 -9.270012 2.249666 -18.534719 3.573509 5.558874 22.141318 -1.664476 -0.043990 -0.253434 -1.636430 4.300782 -0.000005 -0.000003 -0.000006 0.009970 -0.008332 0.010779 +2.213100 110.401600 45.202300 -91.530654 -5.980355 6.213479 -0.000000 0.000000 0.005543 -9.561823 -0.097816 -6.139418 1.647808 3.076187 -1.286017 4.674990 3.497098 1.623359 -2.551907 1.940266 -1.240473 4.734912 -0.271029 0.190231 5.677830 -3.902326 3.136524 23.043810 3.715871 4.675777 -0.016516 0.309946 0.269643 4.207055 3.963606 7.528425 5.398483 -10.347893 11.240088 -1.823832 -5.370580 1.679540 -7.553242 6.106189 1.748677 9.259023 0.515558 4.481724 -1.996115 0.492128 0.183296 -1.341993 -2.987716 -6.011821 0.000004 0.000005 -0.000007 -5.166538 0.422233 1.193739 -12.886006 0.054489 -3.897649 4.276933 12.943729 -24.265840 52.171492 13.074782 -1.532208 22.990714 -1.200341 22.112449 -0.000006 -0.000003 -0.000002 4.778443 5.483523 -6.437539 -13.304222 -1.930849 -2.984946 -1.042669 0.226837 -7.710982 36.868371 9.061959 -2.117740 -4.430386 -0.148248 -8.260740 -5.660573 -2.341812 0.479130 -0.359373 2.811016 -7.361855 0.000006 0.000001 -0.000009 -42.555446 19.311159 -3.699348 48.838469 -11.442666 3.977085 -23.945648 4.714895 6.145207 20.791463 -1.976467 0.098841 -0.251968 -1.623949 4.268178 -0.000010 -0.000003 -0.000002 0.009979 -0.008328 0.010775 +0.388000 111.115800 56.186100 -91.126520 -5.089156 5.301169 -0.000000 0.000000 0.005543 -9.412733 -0.051135 -3.252971 1.505030 2.291908 -1.152267 4.498764 2.382149 -0.299256 -2.758076 1.352292 -2.099598 3.142032 -0.513077 0.768436 5.792417 -1.577948 2.263847 23.833409 3.948764 4.811651 0.039379 0.324374 0.275965 4.315684 4.072683 7.727108 5.648931 -10.658980 11.678514 -1.544304 -5.181850 1.777114 7.678472 5.676747 0.261939 -4.460895 4.433661 0.792559 2.739879 -0.685888 -0.223657 -7.061177 -4.296066 -1.600891 0.000005 0.000003 0.000008 -4.581459 0.379732 1.056874 -23.592904 0.548949 -1.782299 3.716475 16.101765 -26.136098 60.444497 14.749626 -2.826566 23.853095 1.194372 22.962119 -0.000005 -0.000002 -0.000001 9.389713 4.221883 -5.745583 -14.422091 -1.193904 -2.254444 4.521906 -2.015329 -5.332365 32.676533 8.136669 -1.589004 -5.009274 -0.446362 -8.537664 -5.618800 0.248898 0.378978 -0.362903 2.867775 -7.509467 0.000008 -0.000002 -0.000001 -39.619421 18.069281 -4.099121 52.849668 -12.141787 4.704807 -25.490531 5.054141 6.351573 18.379839 -2.000082 0.137949 -0.251096 -1.616467 4.248626 -0.000003 -0.000005 0.000003 0.009973 -0.008326 0.010789 +-2.181700 113.471900 68.296800 -90.805125 -3.045816 3.057251 -0.000000 0.000000 0.005543 -7.531581 0.013307 0.991554 1.675580 1.174246 -0.734258 3.293510 0.928450 -2.558221 -3.896971 0.590032 -2.793446 1.811951 -0.816783 1.599104 5.815474 0.697501 1.156296 24.058129 3.413443 4.127498 0.137275 0.330330 0.271070 4.397254 4.177298 7.901340 5.902058 -10.968187 12.118798 -0.713097 -4.985736 2.042069 26.733388 3.430820 -2.762510 -21.008424 8.005978 0.336999 1.737249 -0.433593 -0.145585 -7.752248 -6.402235 0.262337 0.000007 0.000001 0.000005 -3.527127 0.299580 0.811320 -33.243316 0.353416 0.283910 4.647478 17.946768 -28.406425 61.018909 14.858214 -2.925243 24.684768 3.078087 23.318947 -0.000011 -0.000002 0.000002 14.277669 2.300052 -3.343420 -14.564870 -0.292415 -1.316952 -3.788554 -6.274368 -1.582054 43.479225 10.428434 -3.083771 -15.753000 -2.756957 -8.133739 -1.960335 3.487645 0.291653 -0.336371 2.485955 -6.516097 0.000005 -0.000004 0.000001 -33.522599 13.899456 -4.867008 50.717843 -11.776848 4.312018 -23.199342 4.670374 6.139016 14.396333 -1.605435 0.072431 -0.251679 -1.621457 4.261656 -0.000003 -0.000005 -0.000004 0.009987 -0.008331 0.010781 +-4.452300 115.522800 81.216900 -90.590124 -0.618321 0.590141 -0.000000 0.000000 0.005543 -6.021406 0.072323 4.797045 2.269918 0.066677 -0.393357 2.589029 -0.273100 -4.304175 -5.183653 -0.069770 -2.734643 0.729195 -1.149537 2.488800 5.745798 2.499613 0.070222 23.741616 2.409367 2.945180 0.216399 0.340027 0.268020 4.471253 4.273943 8.077056 6.122761 -11.254420 12.544015 -0.770759 -5.022605 2.027685 28.940594 2.982847 -0.184069 -14.806569 6.251615 2.679362 -2.225161 0.548156 0.205419 -6.961839 -3.585772 -5.320684 0.000008 0.000003 -0.000002 -2.457794 0.215299 0.564784 -37.860063 0.122149 1.596432 8.759558 15.094266 -27.913947 46.128420 11.732589 -0.747738 26.646185 2.154294 21.509224 -0.000002 -0.000006 0.000001 20.693895 0.549792 -0.351585 -13.308841 0.959692 0.129837 -17.164445 -12.318732 1.830095 57.872739 12.939931 -5.681141 -28.303382 -5.314673 -7.896342 4.988903 5.962925 -0.199471 -0.288738 1.959116 -5.143123 0.000008 -0.000005 -0.000006 -26.476858 9.256952 -4.850901 46.520176 -11.014816 3.579145 -19.240090 3.966409 5.811850 9.765867 -1.363927 0.030927 -0.252671 -1.629612 4.282907 0.000001 -0.000005 0.000001 0.009977 -0.008327 0.010787 +-6.130900 115.968400 94.787900 -90.430264 1.786339 -1.874326 -0.000000 0.000001 0.005542 -6.216592 0.119746 7.748685 3.271741 -1.154968 -0.118740 3.287703 -1.474233 -5.368747 -6.090993 -0.679772 -2.004637 0.072220 -1.739070 3.251799 5.655076 4.699466 -1.183540 23.105483 1.336142 1.671115 0.307334 0.340454 0.267481 4.548827 4.350250 8.206081 6.329023 -11.493220 12.915747 -0.919897 -5.101798 1.981214 35.453121 1.608142 1.005810 -13.887500 6.036765 11.257081 -2.915856 0.716529 0.273449 -6.654363 -0.405974 -15.518470 0.000009 0.000003 -0.000009 -1.383758 0.124370 0.317634 -37.208180 0.452335 2.244210 12.497775 10.773935 -24.645249 28.364903 7.359797 0.676900 23.694734 -0.195449 17.653848 -0.000014 -0.000005 -0.000004 27.332132 -0.486108 2.903872 -11.589304 1.268258 0.433673 -27.514681 -17.527999 3.586604 65.419040 13.967435 -7.267568 -35.991873 -6.590778 -8.078691 13.602259 6.553053 -0.964787 -0.263711 1.726841 -4.536829 0.000010 -0.000004 0.000001 -19.724743 5.280044 -3.594029 43.035687 -10.340588 3.014119 -15.109915 3.234356 5.551119 5.092861 -1.455754 -0.000088 -0.253259 -1.634604 4.295947 -0.000000 -0.000004 0.000003 0.009981 -0.008333 0.010782 +-7.363900 115.486200 109.073100 -90.358636 3.765120 -4.545522 -0.000000 0.000000 0.005542 -7.391577 0.160906 10.460929 4.449708 -2.365591 0.336390 4.594011 -2.545921 -6.085378 -6.825431 -1.171239 -1.169869 -0.359821 -3.006191 2.676911 5.662437 7.065637 -2.220154 22.679628 1.026042 1.300747 0.398256 0.340877 0.266940 4.591519 4.416282 8.318784 6.490548 -11.675940 13.206355 -1.089510 -5.183441 1.928068 30.792863 0.632539 3.785710 2.885023 3.422832 12.785320 -11.608152 2.751154 1.296808 -5.007657 3.581433 -21.056935 0.000006 0.000004 -0.000002 -0.412015 0.038068 0.095466 -31.497619 1.578881 2.323098 18.436439 6.900996 -21.804846 3.316003 0.831498 0.266503 22.605249 -0.997834 14.023004 -0.000004 -0.000002 -0.000007 34.217591 -0.271041 6.266483 -9.601182 1.022892 0.095307 -37.583362 -20.897942 4.931551 62.322956 13.571527 -6.600689 -37.433333 -5.847271 -10.531945 27.110139 5.556992 -1.623919 -0.331592 2.426934 -6.362290 0.000007 0.000003 -0.000005 -12.389398 2.099372 -1.091312 38.576082 -9.426332 2.352170 -10.113971 2.307526 5.303362 0.836145 -1.836486 -0.038440 -0.253854 -1.639593 4.308983 0.000001 -0.000005 0.000001 0.009988 -0.008335 0.010781 +-7.791200 114.485100 123.961500 -90.340980 4.576457 -6.858263 -0.000000 -0.000001 0.005544 -9.047182 0.187868 12.287141 5.409433 -3.129547 0.760981 6.003262 -3.127239 -6.264626 -7.282389 -1.354255 -0.193729 -0.741527 -4.471417 0.919663 5.816264 8.811174 -2.723131 22.895175 1.569220 1.959352 0.468214 0.341203 0.266523 4.611072 4.463655 8.387325 6.596801 -11.801223 13.406059 -1.361199 -5.277653 1.842198 24.092376 -0.074665 6.571920 5.660135 0.434643 8.199091 8.652470 -2.199250 -0.593638 -3.341421 3.847883 -18.392861 0.000007 0.000005 -0.000003 0.002382 0.000132 0.001139 -20.358607 3.083343 1.487340 16.140625 4.869023 -19.127854 -3.489859 -0.855781 -0.331523 13.671713 -3.860536 11.258464 -0.000009 -0.000003 -0.000005 40.775720 1.384102 8.554952 -7.544368 0.926679 -0.070014 -41.086286 -19.652928 8.299042 41.116513 9.953965 -2.720600 -28.533281 -2.520876 -13.648746 39.654682 4.922758 -1.776848 -0.403011 4.060786 -10.609318 0.000007 -0.000003 -0.000001 -4.588112 0.836605 1.994001 32.357949 -8.064643 1.551602 -2.768763 0.921019 5.126202 -1.948581 -2.732651 0.005713 -0.254436 -1.644584 4.322027 -0.000000 -0.000004 -0.000006 0.009975 -0.008327 0.010786 +-6.484900 113.288800 139.643500 -91.700883 4.265581 -8.736228 -0.000000 0.000000 0.005545 -9.695095 0.194061 12.497586 6.218065 -3.291809 1.252062 7.092345 -3.012929 -5.438070 -7.332108 -1.252240 1.034588 -0.983974 -5.836979 -0.638540 6.121980 9.685709 -2.858425 23.935039 2.333975 2.807423 0.538157 0.341527 0.266106 4.634660 4.477550 8.414954 6.639059 -11.846620 13.475648 -1.676378 -5.408202 1.738895 12.697646 0.331306 8.097170 6.886772 -2.016227 7.158847 27.871012 -7.231948 -0.696612 13.513688 -1.564050 -19.028970 0.000003 0.000004 -0.000003 0.158623 -0.014359 -0.034352 -7.508259 4.386671 0.519734 10.962161 2.785450 -15.508872 -2.922322 -0.718100 -0.274113 -4.323781 -6.697633 5.970000 -0.000009 -0.000006 -0.000002 47.925119 4.136881 9.510764 -6.297980 3.824634 3.120650 -35.589479 -15.853718 11.462187 22.771419 5.801296 -0.618469 -20.170167 0.195303 -15.231096 42.101791 4.655127 -1.824619 -0.382086 5.174189 -13.505234 0.000004 -0.000004 -0.000001 -1.028796 1.722410 5.299150 38.367932 -9.382330 2.323030 -9.841978 2.282244 4.581974 5.664233 -5.395226 0.540401 -0.226425 -1.415181 3.722214 -0.000002 -0.000005 0.000000 0.009973 -0.008329 0.010787 +-3.787000 111.958100 156.055700 -94.682674 3.695689 -10.211574 -0.000002 0.000000 0.005540 -9.042896 0.175605 11.197471 7.123066 -3.065248 1.786380 8.017022 -2.437374 -3.791220 -7.142588 -1.038973 2.433269 -0.734930 -6.649644 -0.947056 6.372209 9.433969 -2.757681 25.067325 2.539019 2.936321 0.587116 0.341754 0.265815 4.634653 4.477557 8.414947 6.639050 -11.846621 13.475634 -1.991867 -5.538205 1.634855 -1.163274 1.407600 8.487360 6.193562 -4.349520 7.975893 48.933268 -12.366971 1.094083 14.494570 -2.683396 -19.664232 0.000008 0.000003 -0.000004 0.355595 -0.032770 -0.079043 6.564173 4.822576 -0.856070 8.774896 1.278053 -11.385349 -11.609266 -2.751406 -1.296971 -7.878822 -5.199594 2.157732 -0.000008 -0.000002 -0.000008 56.064607 6.934993 9.111828 -5.870710 4.727668 4.110097 -32.185217 -16.158884 10.489701 36.206546 8.918729 -2.029797 -27.010229 -1.642234 -14.654376 32.576444 2.516940 -0.901798 -0.400786 4.548732 -11.877532 0.000001 -0.000004 -0.000003 -6.550963 3.446269 7.243023 53.557347 -12.259536 4.838121 -25.856120 5.425421 4.948787 25.099992 -9.074325 2.734887 -0.195996 -1.186080 3.122325 -0.000001 -0.000003 -0.000009 0.009986 -0.008335 0.010781 +-1.174600 111.042500 173.134400 -97.646184 3.049287 -10.820204 0.000001 0.000001 0.005540 -7.909414 0.146817 9.358766 7.890807 -2.551650 2.006222 8.652537 -1.680329 -2.218731 -7.016144 -0.779607 3.594014 0.394716 -7.000019 -0.558373 6.456376 8.492898 -2.460620 25.675591 2.429858 2.743643 0.608105 0.341851 0.265690 4.634665 4.477557 8.414951 6.639049 -11.846612 13.475641 -2.363008 -5.641647 1.499221 -14.791688 2.900849 7.770242 7.388584 -6.920851 10.182887 58.860651 -14.444820 2.560165 20.318025 -5.539600 -20.051946 0.000004 0.000004 -0.000004 0.980422 -0.092173 -0.220411 17.645666 4.220271 -2.482619 6.774437 0.963147 -7.931569 -11.609266 -2.751406 -1.296970 -16.215786 -5.057615 -0.709965 -0.000009 -0.000006 -0.000002 63.358037 8.827447 7.849225 -5.936677 4.230749 3.447441 -26.018579 -13.224173 8.461447 46.073673 10.930490 -3.504486 -31.526859 -3.999287 -11.404107 21.963815 -0.139198 -0.308462 -0.377434 3.134376 -8.202399 0.000011 -0.000003 0.000001 -6.457006 6.078660 8.058958 58.375598 -13.014914 5.782588 -33.633392 6.743159 5.692850 29.332114 -11.066207 3.806377 -0.193236 -1.166175 3.070152 -0.000001 -0.000002 0.000000 0.009979 -0.008335 0.010787 +1.376900 110.780100 190.165600 -100.706236 2.117824 -10.802354 0.000001 0.000000 0.005542 -5.623673 0.117721 7.302833 8.674592 -1.710032 1.886534 8.580954 -0.679996 -0.802876 -7.132316 -0.426462 4.511040 1.768710 -7.238506 0.285845 6.627643 7.314699 -2.144559 26.523197 2.118784 2.326467 0.629075 0.341949 0.265565 4.634664 4.477547 8.414954 6.639062 -11.846618 13.475646 -2.935482 -5.762053 1.310673 -28.951799 4.781695 6.000845 8.824751 -9.435345 13.715717 61.958941 -15.033665 3.089071 28.980458 -8.930578 -19.703241 -0.000000 0.000005 0.000001 2.854030 -0.279584 -0.640526 14.997886 2.113549 -5.019517 9.662471 3.463809 -7.235394 36.504154 9.427165 0.194305 -13.220956 -9.434831 0.979275 -0.000010 -0.000003 -0.000006 69.297419 9.894229 6.060064 -6.537534 4.045845 3.177149 -18.863859 -8.655976 6.988477 51.640598 11.936686 -4.480388 -32.236191 -5.642326 -8.106018 14.678567 -2.369439 -0.148750 -0.288704 1.958931 -5.142635 0.000006 -0.000002 -0.000004 -4.544975 9.310916 8.182875 60.102420 -13.265452 6.135829 -39.417828 7.619027 6.329883 30.720343 -12.934266 4.536142 -0.191501 -1.153733 3.037549 0.000001 -0.000004 -0.000004 0.009971 -0.008319 0.010776 +3.836700 110.963200 207.276200 -103.709234 1.032245 -10.337209 0.000000 -0.000001 0.005546 0.772936 0.081248 5.214965 7.956375 -0.112011 1.437787 5.442890 0.635051 0.553270 -4.210909 0.315630 5.031941 4.014387 -7.462827 1.072982 6.553557 5.458675 -1.536003 25.831989 1.682013 1.890749 0.244236 0.368441 0.281218 4.634654 4.477562 8.414942 6.639058 -11.846622 13.475650 -4.353356 -5.906211 0.840094 -36.457525 4.539967 -2.143659 -7.338813 -2.013080 11.893818 65.970830 -15.749844 3.819905 28.256067 3.089488 -12.947729 0.000013 0.000003 -0.000002 8.393975 -0.913606 -1.845749 -13.874325 -0.268986 -5.964026 17.542217 8.856206 -6.343075 129.232165 18.784634 -18.904662 10.828999 -12.347438 7.512038 -0.000006 -0.000002 -0.000001 73.671889 10.148512 4.119975 -8.659586 3.805544 2.979495 -10.081134 -2.951463 5.324929 51.906508 11.982220 -4.529377 -28.843325 -6.268751 -4.394791 7.897887 -4.390941 -0.175225 -0.155794 0.909216 -2.396027 0.000009 -0.000002 -0.000007 -2.533160 12.684425 7.554972 60.387758 -13.305798 6.194909 -44.216039 8.258851 6.906387 31.418044 -14.687915 4.982869 -0.189752 -1.141300 3.004944 -0.000003 -0.000007 0.000005 0.009970 -0.008330 0.010777 +4.972100 111.591900 224.466000 -105.116864 -0.161809 -8.742268 0.000001 0.000001 0.005542 1.703633 0.052621 3.002007 9.709978 1.100840 0.780673 7.454284 1.897937 1.260147 -3.774758 1.023280 5.143783 6.281999 -7.558339 1.536913 6.292600 3.225936 -0.687747 24.248710 1.495649 1.783555 -0.315429 0.382927 0.306837 4.634661 4.477550 8.414953 6.639053 -11.846622 13.475647 -5.349378 -6.009578 0.511277 -32.506373 0.963689 -7.731060 -4.594877 2.628646 12.422362 18.746540 -4.843180 -0.859452 18.609562 2.459384 -4.512155 0.000012 0.000001 -0.000000 -0.322485 0.029937 0.075063 -20.623019 -2.892683 -9.853496 23.238571 16.009267 -17.066872 156.948280 15.025014 -24.799230 26.725369 -1.171077 21.116092 -0.000009 -0.000002 -0.000008 75.619094 8.966568 2.141383 -12.036100 1.857914 0.830797 -0.628466 1.363392 3.087031 47.002589 11.105251 -3.660530 -21.779173 -5.266979 -2.166280 0.814487 -5.684758 -0.339877 -0.077436 0.426802 -1.126867 0.000009 -0.000002 -0.000003 -2.309694 14.893827 5.004691 59.542830 -13.185451 6.020542 -48.324944 8.785446 7.393455 33.401787 -15.397360 5.267243 -0.188013 -1.128855 2.972348 0.000001 -0.000005 0.000002 0.009971 -0.008329 0.010780 +4.080900 112.739400 242.354300 -104.831784 -1.720052 -4.326291 0.000001 -0.000001 0.005543 0.168703 -0.005071 -0.169297 11.265291 2.282601 -0.957170 9.648560 2.789293 1.400173 -4.390092 1.476244 4.938347 9.412772 -7.650047 1.981902 5.912211 1.286575 0.134341 22.383372 1.585464 2.025992 -0.826043 0.384494 0.315744 4.634662 4.477549 8.414951 6.639053 -11.846624 13.475639 -0.362429 -5.434485 2.140089 -31.384654 -2.314225 -8.016574 -0.185631 2.180682 13.993471 5.697420 -1.437926 -0.428191 21.318673 1.238382 -9.067839 0.000002 0.000005 -0.000005 -10.466681 0.744304 2.451481 -18.119172 -3.668585 -10.963716 35.873393 16.433947 -35.020234 59.595518 14.587218 -2.682722 44.770411 17.556052 28.904117 -0.000008 -0.000005 0.000002 74.936396 5.044617 -0.450829 -15.291141 -0.494933 -2.015667 3.345842 1.612251 -0.877931 44.608406 10.649433 -3.264107 -11.577873 -3.021179 -2.635361 3.644794 -4.054177 0.494806 -0.129199 0.737646 -1.945239 0.000005 -0.000003 -0.000005 -12.952315 15.500052 -0.478724 58.315458 -13.005994 5.770419 -51.202742 9.232586 7.611140 42.914273 -12.675324 5.790367 -0.178804 -1.064198 2.802794 0.000002 -0.000004 0.000000 0.009987 -0.008327 0.010780 +1.773600 114.430200 261.417200 -103.915376 -3.323747 1.745168 -0.000003 0.000000 0.005543 -1.033773 -0.055722 -3.449781 12.116972 3.541404 -3.199127 10.381479 3.338743 1.065612 -4.687157 1.860124 4.247935 12.388847 -7.738712 2.412356 5.960781 -0.395036 0.791831 22.443926 1.654141 2.114605 -1.427610 0.385472 0.325275 4.634660 4.477554 8.414946 6.639056 -11.846617 13.475646 -0.362427 -5.434490 2.140094 -22.259201 -5.081464 -6.281262 -0.902254 2.429411 9.860970 5.790415 -1.461746 -0.433987 14.836952 3.758995 -7.681115 0.000003 0.000005 -0.000005 -5.854792 0.472019 1.356388 -28.939699 -3.810359 -7.222419 27.538592 16.529819 -27.861677 107.350213 19.594443 -13.408791 31.942978 5.839432 25.999711 -0.000008 -0.000006 -0.000002 72.472064 -0.230570 -3.553348 -16.800542 -1.971776 -4.020658 7.778183 0.418191 -6.492698 39.113314 9.539379 -2.428131 -2.517884 -1.235134 -4.209535 12.320568 -0.240291 0.673302 -0.210317 1.293064 -3.402485 0.000009 -0.000002 -0.000001 -22.179397 15.816871 -3.943201 48.112034 -11.310430 3.850538 -39.024586 7.957626 4.962931 41.164751 -8.757564 3.726812 -0.139715 -0.803343 2.117996 -0.000001 -0.000003 -0.000006 0.009981 -0.008328 0.010778 +-1.205100 116.426200 281.210100 -102.825874 -4.189784 5.969082 0.000001 0.000000 0.005543 -1.028572 -0.063366 -4.259868 11.966936 4.014978 -4.671703 9.836671 3.382526 -0.073941 -4.018553 2.154067 3.259823 15.411220 -7.859815 2.788836 6.013419 -1.424851 1.172580 22.626544 1.639234 2.072679 -2.029177 0.386347 0.334816 4.634662 4.477554 8.414950 6.639052 -11.846612 13.475639 2.119861 -5.049882 2.913706 -16.051090 -6.922229 -5.143270 2.549272 2.129184 3.892485 -4.581550 1.118878 0.445739 14.559023 3.743983 -4.099798 0.000004 0.000004 0.000003 -2.235801 0.196892 0.513567 -37.957192 -4.629166 -3.204699 22.135140 15.411623 -31.433699 115.803959 19.518261 -15.565101 23.739420 2.056695 25.627001 -0.000010 -0.000003 -0.000006 67.972601 -3.605967 -6.782976 -15.082934 -3.152795 -5.654762 5.809659 -2.103204 -11.115253 52.814195 12.135845 -4.698158 -25.823699 -5.431064 -7.166127 27.146698 5.148109 -1.387452 -0.263286 1.723006 -4.526809 0.000007 -0.000003 -0.000007 -24.261966 14.712316 -4.216193 32.363943 -8.065999 1.552295 -19.593588 4.608831 1.632894 29.659557 -5.745638 1.561904 -0.068501 -0.374634 0.989386 0.000003 -0.000005 -0.000006 0.009977 -0.008329 0.010777 +-4.287500 118.495400 301.257100 -102.042457 -3.672660 8.047914 -0.000000 0.000000 0.005541 -0.524156 -0.045531 -2.866787 11.642875 3.448415 -5.319719 9.052762 2.807319 -1.594847 -3.502459 2.068901 2.156016 18.320466 -7.979533 3.049373 6.085225 -1.514165 1.168904 23.056656 1.551834 1.927459 -2.560813 0.389465 0.369038 4.634662 4.477556 8.414949 6.639055 -11.846616 13.475634 7.568166 -4.159877 4.586812 -13.334619 -7.921759 -4.681793 -0.741809 2.889118 -0.833836 2.084605 -0.520832 -0.173137 3.914345 5.035319 0.039553 0.000007 0.000003 -0.000002 0.002082 0.000156 0.001209 -41.900386 -4.555352 0.898109 17.912658 12.355050 -37.266093 100.421184 19.433276 -11.647487 15.718108 -0.541319 24.513800 -0.000008 -0.000007 0.000005 61.889813 -5.102991 -8.694684 -11.242828 -4.239155 -7.154648 8.611124 -5.545653 -13.313955 55.805750 12.622204 -5.271051 -44.582820 -7.105219 -10.630774 37.102428 9.517734 -3.812758 -0.299206 2.063874 -5.416338 0.000008 -0.000002 -0.000005 -21.209416 12.992951 -4.477723 29.256173 -7.351866 1.208495 -12.127466 3.118216 0.075531 17.502291 -3.853119 0.596271 0.004859 0.020545 -0.054877 -0.000000 -0.000005 -0.000001 0.009968 -0.008331 0.010793 +-6.814600 120.546300 321.065900 -101.591604 -2.386641 9.677179 0.000000 -0.000001 0.005546 0.392065 -0.031571 -1.494509 11.045241 1.914031 -5.646163 7.814121 1.336260 -2.839884 -3.319114 1.322382 1.185843 20.516811 -8.220729 3.198658 6.412025 0.129486 0.433660 24.652784 1.318088 1.539616 -2.938455 0.380344 0.385741 4.634664 4.477557 8.414948 6.639056 -11.846617 13.475637 12.988133 -3.176633 6.194515 -9.099123 -6.484816 -3.460135 -2.154789 3.535790 -4.655287 4.872043 -1.226958 -0.374986 -6.054812 4.001074 2.383866 0.000005 0.000005 -0.000003 0.228190 -0.020849 -0.050135 -33.520963 -0.767391 3.760609 12.125743 6.996218 -38.813240 71.507511 16.647591 -4.907100 6.919835 -4.465990 23.213062 -0.000015 -0.000002 -0.000005 54.752282 -6.443236 -10.826296 -7.393938 -4.721157 -7.476300 4.430869 -8.886409 -14.457412 53.511380 12.251952 -4.829421 -40.814205 -6.024306 -11.594338 31.951072 10.373807 -3.552273 -0.342375 2.565552 -6.723111 0.000008 -0.000004 -0.000003 -13.158791 10.112003 -6.423200 32.215697 -8.032412 1.535021 -13.545077 3.637806 -0.959526 7.509989 -3.021335 0.197268 0.074967 0.365175 -0.969030 -0.000002 -0.000004 -0.000009 0.009980 -0.008329 0.010775 +-7.858300 122.414100 340.097000 -101.450251 -1.660385 10.329161 -0.000000 0.000000 0.005542 1.573421 -0.015669 -0.737844 10.204477 0.813649 -5.719017 6.387388 0.319737 -3.429672 -3.274442 0.762065 0.683360 20.962887 -8.962965 -0.463063 7.106653 1.720918 0.427225 27.719542 3.055659 3.215062 -3.085461 0.394670 0.383546 4.634665 4.477556 8.414955 6.639051 -11.846620 13.475634 15.439238 -2.695201 6.912947 1.384885 -4.110415 -0.763126 -1.618924 3.311331 -7.285753 2.010154 -0.502119 -0.167281 -7.448711 1.021179 1.061908 0.000006 0.000006 -0.000005 0.264060 -0.024191 -0.058281 -12.406187 4.359093 3.517250 2.405294 1.791660 -34.899179 43.681583 11.164256 -0.471471 6.901180 -6.757889 20.826884 -0.000006 0.000000 -0.000006 45.688139 -6.482184 -14.803433 -5.376240 -7.294800 -11.467665 0.154437 -10.259855 -13.865241 46.987959 11.102523 -3.658052 -31.576624 -4.437185 -12.221191 21.770832 9.245691 -2.085703 -0.380002 3.188530 -8.343119 0.000006 -0.000002 -0.000003 -1.433835 6.089815 -7.489497 26.436466 -6.686921 0.930436 -10.721473 3.060320 -1.795312 -1.814219 -2.717892 -0.236249 0.129470 0.615538 -1.635345 -0.000001 -0.000004 0.000002 0.009976 -0.008330 0.010782 +-7.309000 121.864700 358.286900 -101.761929 -1.951415 9.637371 0.000003 0.000000 0.005544 4.951296 -0.016799 -0.855362 7.704488 0.910040 -5.432306 3.634985 0.550421 -3.109642 -1.912601 0.990132 0.795345 21.925833 -9.043147 -0.396090 7.660832 1.530193 0.405052 30.410611 3.031438 2.902313 -0.189203 0.379524 0.300403 4.634669 4.477554 8.414947 6.639061 -11.846616 13.475628 11.505898 -3.460006 5.761451 11.704000 -4.988165 1.027034 -3.426755 3.861462 -4.311288 7.161610 -1.814058 -0.515058 -0.379952 2.269610 -2.390758 0.000005 0.000003 0.000000 -7.309516 0.567451 1.699535 10.223253 2.855666 -1.498383 7.171254 0.443241 -26.680963 7.969742 2.022592 0.558876 2.142272 -10.881510 15.815744 -0.000008 -0.000004 -0.000008 35.331776 -4.684303 -19.382125 -5.010449 -11.699316 -18.954895 0.709687 -9.981262 -11.543825 37.996366 9.303496 -2.271380 -20.554401 -2.814882 -12.652230 7.598019 6.343558 -0.208979 -0.398900 3.757054 -9.820244 0.000009 0.000000 -0.000007 9.368004 4.317811 -6.533193 23.819158 -6.056741 0.701871 -13.872589 3.983605 -1.584110 -2.407332 -4.959105 -0.640713 0.125648 0.598377 -1.589618 -0.000001 -0.000004 0.000003 0.009978 -0.008330 0.010783 +-6.051600 120.418100 375.841800 -102.524714 -2.652294 8.050362 0.000003 0.000000 0.005540 7.677501 -0.047372 -3.210590 5.394270 1.547354 -3.009047 1.484559 1.245251 -0.927857 -0.430533 1.250366 -0.058322 22.848269 -8.790078 -0.317067 8.177132 0.879857 0.577018 33.004003 2.977500 2.605507 -0.189229 0.386157 0.286238 4.634658 4.477557 8.414950 6.639045 -11.846614 13.475637 0.773180 -5.277538 2.509665 20.479660 -3.474738 2.745235 -7.353666 3.556834 6.255912 17.793124 -4.592178 -0.854346 23.575839 -2.651467 -11.619373 0.000008 0.000004 -0.000007 -2.116287 0.186894 0.486025 13.389520 2.794790 -2.019738 6.930354 0.832663 -20.412777 7.969749 2.022595 0.558881 -5.806241 -12.661550 10.449299 -0.000011 -0.000006 -0.000005 23.734228 -2.079366 -23.512265 -4.573686 -15.268832 -16.930709 11.771760 -8.851047 -8.370830 22.434383 5.718762 -0.592637 -8.309511 -0.744250 -12.502901 -8.349309 2.607610 1.194682 -0.403319 4.122393 -10.769403 0.000008 -0.000003 -0.000001 18.005333 5.108544 -4.165198 27.084422 -6.841065 0.991436 -23.761123 6.474118 -0.427722 3.891259 -9.313198 -0.720106 0.092286 0.446245 -1.184583 -0.000002 -0.000005 -0.000003 0.009983 -0.008329 0.010778 +-4.653800 117.653100 383.698700 -104.856716 -3.708082 6.266314 -0.000001 0.000000 0.005542 1.268371 -0.058372 -3.592241 11.431770 2.856938 -2.553708 6.513362 2.063637 0.057735 -3.768233 1.560321 0.195788 24.354149 -6.149918 -1.015883 8.462218 -3.616832 2.228873 34.918994 2.290371 1.877681 0.741226 0.353549 0.255988 4.634656 4.477559 8.414924 6.639051 -11.846611 13.475623 -2.926101 -5.740141 1.300474 -2.338443 -2.391582 -1.206510 -15.120560 0.947828 18.869770 38.588663 -9.941413 -0.023651 15.158862 -3.658905 -16.992025 0.000009 0.000001 0.000003 2.895013 -0.283827 -0.649651 10.881283 2.506755 -1.658240 6.616758 1.096314 -15.913881 7.969742 2.022593 0.558882 -8.133296 -11.694601 6.706938 -0.000007 -0.000006 0.000002 14.884550 0.183386 -25.810452 -6.641821 -14.512752 -28.822719 19.474664 -5.766667 -11.694118 18.624478 4.774655 -0.334627 -5.551633 -0.739403 -7.194827 -18.732270 -0.199607 1.563165 -0.329756 2.404265 -6.303253 0.000008 -0.000001 0.000004 18.432036 9.607684 -1.814174 38.399081 -9.388919 2.327374 -34.191333 8.297796 1.913861 9.890275 -12.901865 -0.133374 0.003427 0.013142 -0.035287 -0.000002 -0.000002 0.000002 0.009981 -0.008330 0.010778 +-3.707700 112.122900 388.936600 -108.961706 -4.893657 4.955933 0.000002 0.000000 0.005541 -1.724830 -0.055169 -3.790323 12.152849 3.605550 -3.053117 10.078713 2.998388 0.521948 -1.053112 1.959754 1.478147 25.862918 -3.490955 -1.711356 8.566469 -7.712475 3.766964 35.473817 1.570842 1.251453 2.693136 0.275895 0.160654 4.634671 4.477558 8.414953 6.639060 -11.846620 13.475645 -2.926097 -5.740144 1.300477 -17.101998 -0.758278 -4.240400 -4.604492 1.707505 17.382143 16.398053 -4.224995 -0.839334 14.401908 -1.930886 -13.849553 0.000005 0.000004 -0.000003 7.170312 -0.763450 -1.584651 5.979455 1.307121 -0.960749 6.139512 1.329477 -13.474596 7.969746 2.022596 0.558876 -2.008167 -8.846853 5.625492 -0.000009 -0.000005 -0.000002 11.988733 1.795026 -25.430184 -8.280131 -18.402242 -34.250971 20.731813 -5.164737 -11.883307 29.923083 7.506848 -1.279016 -11.011409 -2.040287 -7.513790 -21.617357 -0.968046 1.606071 -0.327748 2.379779 -6.239502 0.000007 0.000000 -0.000006 9.105043 18.635835 0.079457 47.027761 -11.109940 3.664792 -25.521705 5.242178 4.876864 -6.538582 -11.295117 -2.246710 -0.199442 -1.211140 3.187988 0.000001 -0.000004 -0.000007 0.009974 -0.008335 0.010793 +-3.823600 109.516600 393.063400 -113.149224 -5.841767 4.187325 -0.000001 0.000001 0.005543 -1.418430 -0.041792 -2.724541 13.097807 3.613713 -3.173194 11.681581 3.167503 -0.012037 0.519003 2.088124 1.418538 27.033230 -3.013005 -1.737031 8.509039 -7.895658 3.838770 35.245760 1.575059 1.277449 4.001287 0.220204 0.103310 4.634665 4.477551 8.414956 6.639063 -11.846618 13.475637 -2.926099 -5.740144 1.300474 -14.838414 -0.430317 -3.620684 2.145450 2.053639 17.694064 0.338339 -0.084072 -0.029381 14.284413 -2.505799 -16.052538 0.000011 0.000002 -0.000008 7.770151 -0.836354 -1.713021 2.166480 1.431713 -0.185756 0.293890 1.428463 -13.254731 21.216873 5.493151 0.853155 3.020978 -8.885836 4.778942 -0.000008 -0.000003 -0.000004 13.391375 2.725101 -25.083124 -9.742444 -21.149042 -37.471285 25.068625 -4.943841 -12.246285 33.411096 8.301840 -1.676762 -12.699279 -2.422607 -7.656083 -23.598809 -1.173939 1.740876 -0.326962 2.370321 -6.214863 0.000007 0.000000 -0.000005 12.923216 21.000940 -0.430833 49.217592 -11.511007 4.043767 -21.611320 4.252932 6.970721 -16.520640 -9.129974 -3.448046 -0.284074 -1.912218 5.020837 -0.000002 -0.000004 -0.000004 0.009972 -0.008329 0.010784 +-4.720900 107.593800 395.460200 -115.744896 -6.295504 3.699780 -0.000001 0.000000 0.005543 -2.357827 -0.011246 -0.924322 13.025431 2.981987 -3.028184 13.330818 2.820420 -1.096768 2.615243 1.942984 0.922990 29.472020 -2.765357 -1.857994 8.064106 -7.350896 3.613405 33.131567 1.709980 1.492710 4.295085 0.201071 0.099936 4.634664 4.477555 8.414948 6.639043 -11.846619 13.475652 -2.926104 -5.740144 1.300474 -14.508370 1.334202 -3.211815 2.161051 2.089613 16.878845 0.147562 -0.036643 -0.012870 14.052707 -3.150966 -15.212590 0.000010 0.000000 -0.000002 1.267211 -0.119962 -0.285088 6.245685 2.298112 -0.832307 -3.009716 1.349364 -13.050507 29.250599 7.588515 0.638807 10.814443 -9.582832 4.432091 -0.000006 -0.000002 0.000001 16.636575 3.032894 -24.831061 -10.751948 -21.730769 -38.107162 27.406322 -5.288037 -12.661572 36.168741 8.910513 -2.024829 -14.023541 -2.721287 -7.778172 -24.923236 -0.946513 2.000128 -0.326573 2.365867 -6.203260 0.000008 -0.000001 0.000001 14.832700 21.316269 0.311560 53.034039 -12.172626 4.739397 -23.497085 4.620347 7.175681 -17.781450 -8.598714 -3.574500 -0.282779 -1.899999 4.988961 -0.000001 -0.000004 -0.000006 0.009990 -0.008332 0.010776 +-5.599900 106.568400 395.428400 -116.889366 -6.439081 3.464770 0.000001 0.000000 0.005542 -2.822016 0.006511 0.540191 12.386331 2.454370 -2.635244 14.305428 2.367086 -2.056762 3.785871 1.774792 0.288533 32.262938 -2.686799 -2.011946 7.495954 -6.944270 3.466476 30.342695 1.891638 1.826279 4.302083 0.203378 0.080261 4.634660 4.477558 8.414937 6.639061 -11.846623 13.475646 -2.926098 -5.740143 1.300475 -14.263500 2.759817 -2.872990 1.823219 2.125430 15.135470 0.592544 -0.147362 -0.051122 13.837024 -3.541711 -13.429493 0.000011 0.000001 -0.000005 -0.391271 0.036192 0.090737 2.543664 3.629858 0.144337 -5.965616 1.375179 -13.520576 36.523627 9.432001 0.192807 17.958610 -10.164583 4.435944 -0.000009 -0.000007 -0.000001 19.585935 3.196240 -24.080903 -11.913908 -22.204887 -38.254305 27.220228 -5.709163 -12.990473 38.837709 9.481487 -2.389032 -15.313988 -3.013341 -7.906086 -25.135098 -0.535769 2.225168 -0.326199 2.361415 -6.191667 0.000007 0.000000 0.000001 14.722268 21.404811 0.741312 55.788732 -12.619516 5.267721 -25.080841 4.918740 7.341894 -17.652260 -8.269043 -3.487719 -0.281487 -1.887786 4.957084 -0.000001 -0.000003 -0.000004 0.009984 -0.008327 0.010777 +-6.118700 106.153300 393.539500 -117.812609 -6.516541 3.294482 -0.000002 0.000000 0.005542 -1.299827 0.020755 1.263265 12.270796 2.279541 -2.229512 13.889654 2.146415 -2.578366 3.100143 1.738946 -0.238803 33.523856 -2.681277 -2.320237 7.231657 -7.218014 3.651609 28.838274 2.141979 2.173368 4.106197 0.220421 0.102932 4.634662 4.477550 8.414948 6.639051 -11.846618 13.475646 -2.926101 -5.740148 1.300475 -13.771503 3.145347 -2.678671 1.315115 2.184790 13.032788 1.375516 -0.342927 -0.116356 13.799164 -3.452759 -11.398262 0.000002 0.000004 -0.000002 0.001577 0.000198 0.001329 -4.803761 4.379112 1.817566 -4.909230 1.434513 -14.148384 34.268470 8.867945 0.356256 12.168150 -10.152392 2.584611 -0.000015 -0.000006 -0.000006 23.314888 3.235733 -22.823410 -12.973891 -22.007686 -37.374532 25.621781 -5.945462 -13.207282 42.064611 10.146284 -2.863995 -16.874951 -3.354982 -8.067625 -24.381168 -0.070895 2.338040 -0.325819 2.356958 -6.180061 0.000008 -0.000002 -0.000006 13.697434 21.644344 1.150092 58.140701 -12.979997 5.735117 -26.898033 5.224818 7.535140 -16.233237 -8.306675 -3.257294 -0.280189 -1.875569 4.925197 0.000001 -0.000005 -0.000001 0.009977 -0.008329 0.010785 +-6.509400 105.860400 391.476200 -118.458938 -6.506124 3.183070 -0.000010 -0.000001 0.005543 0.222777 0.026456 1.755600 12.228073 2.148979 -1.877213 13.104022 1.994729 -2.931897 2.148224 1.708518 -0.695640 33.607300 -2.683039 -2.313944 7.397547 -7.362892 3.714369 29.556216 2.128636 2.107336 3.770432 0.237105 0.126218 4.634662 4.477556 8.414941 6.639053 -11.846616 13.475648 -2.926104 -5.740146 1.300476 -12.992445 3.495880 -2.415833 0.525938 2.282007 11.155085 2.888244 -0.723343 -0.234833 13.277919 -3.304538 -9.633262 0.000009 0.000002 -0.000003 0.001580 0.000190 0.001331 -1.035066 5.060933 1.131814 0.228153 1.232779 -12.012044 21.931444 5.680920 0.846089 1.403629 -10.451266 -0.053803 -0.000006 -0.000005 0.000004 27.604450 2.994577 -21.519991 -14.331111 -21.735856 -36.612874 23.843810 -6.178008 -13.355746 44.932888 10.712231 -3.316726 -18.259095 -3.646317 -8.235631 -23.524425 0.356344 2.402810 -0.325450 2.352503 -6.168460 0.000006 -0.000001 -0.000007 12.878924 21.737205 1.370406 59.837655 -13.227745 6.081192 -29.027597 5.525005 7.731952 -14.337704 -8.500804 -3.052313 -0.279687 -1.870842 4.912871 0.000002 -0.000005 -0.000008 0.009983 -0.008332 0.010773 +-6.771800 105.689400 390.222200 -118.741612 -6.439786 3.113082 -0.000007 0.000000 0.005543 1.066809 0.031090 2.059050 12.348860 2.077765 -1.721768 12.393713 1.957725 -3.106498 1.301548 1.713839 -0.909462 33.585280 -2.694061 -2.227132 7.580371 -7.546217 3.793560 30.303251 2.083834 2.003044 3.385721 0.240574 0.133310 4.634665 4.477556 8.414957 6.639065 -11.846619 13.475652 -2.926094 -5.740144 1.300476 -12.323359 3.644029 -2.229468 0.917392 2.307330 10.151816 1.751339 -0.437127 -0.146725 14.293147 -3.652275 -8.895141 0.000012 0.000003 -0.000002 0.001579 0.000197 0.001326 -0.048823 4.977457 0.912139 2.308289 1.314185 -11.625027 16.826733 4.337801 0.844883 4.174954 -10.488322 0.123652 -0.000008 -0.000004 -0.000008 32.265920 2.539890 -20.142696 -15.846442 -21.244369 -35.711296 22.725255 -6.394871 -13.395710 46.564388 11.023142 -3.586569 -19.050154 -3.812202 -8.351251 -23.008522 0.618769 2.437346 -0.325075 2.348051 -6.156869 0.000009 0.000002 -0.000009 13.105148 21.553907 1.231528 60.242788 -13.285336 6.164866 -31.371916 5.805503 7.920485 -12.361240 -8.804542 -2.945925 -0.279193 -1.866121 4.900545 0.000002 0.000000 -0.000005 0.009977 -0.008332 0.010775 +-6.942700 105.817600 389.000100 -118.787890 -6.311467 3.069805 -0.000006 0.000000 0.005543 1.799328 0.021738 1.733146 12.474676 2.162580 -1.983752 11.218987 2.158400 -2.677352 0.763290 1.766933 -0.254838 33.505934 -2.747681 -1.373734 7.779754 -7.976161 3.739637 30.886378 1.391840 1.310601 2.882069 0.260966 0.162946 4.634662 4.477557 8.414938 6.639049 -11.846611 13.475630 -2.926098 -5.740147 1.300476 -14.013493 4.194741 -1.292443 -1.687254 1.761723 10.452562 15.746895 -4.053708 -0.829263 12.096897 -2.483965 -9.322531 0.000007 0.000003 -0.000004 0.001576 0.000198 0.001328 0.508690 4.424902 0.697644 2.763987 1.308597 -11.809955 15.795079 4.066383 0.830055 5.016152 -9.951067 0.205565 -0.000008 -0.000004 0.000000 37.305803 1.939921 -18.668305 -17.395186 -20.406421 -34.429836 21.737002 -6.586161 -13.310475 47.428226 11.184429 -3.732966 -19.469772 -3.889450 -8.446126 -22.441604 0.822164 2.441162 -0.326377 2.363625 -6.197419 0.000004 -0.000002 -0.000008 15.774585 20.769697 0.207593 58.154676 -12.982081 5.737928 -36.278809 6.273758 8.270742 -8.021844 -9.716021 -2.872366 -0.278690 -1.861398 4.888222 -0.000000 0.000000 0.000000 0.009980 -0.008333 0.010782 +-7.022100 106.098400 387.111300 -118.787473 -6.131615 3.017754 -0.000001 0.000001 0.005543 2.965526 -0.001757 0.575057 12.342004 2.432452 -2.457606 9.652924 2.447086 -1.519617 0.223583 1.860966 1.340838 33.168222 -2.802338 -0.581688 8.038674 -8.666121 3.706146 31.645824 0.344058 0.315098 2.210496 0.291599 0.184943 4.634664 4.477554 8.414953 6.639054 -11.846615 13.475647 -2.926109 -5.740143 1.300475 -16.251255 4.847175 0.804594 -1.729597 0.361731 9.784080 31.245540 -8.100755 -0.540020 11.702848 -1.659342 -10.779712 0.000009 0.000001 -0.000005 0.001584 0.000195 0.001329 1.091995 3.389900 0.396244 2.958018 1.294904 -12.545732 15.574341 4.008334 0.826246 5.307815 -9.128325 0.235522 -0.000007 -0.000005 0.000002 42.760498 1.271773 -17.066575 -18.849840 -19.113026 -32.430916 20.265917 -6.758201 -13.142291 48.517385 11.384431 -3.920944 -19.994267 -3.978511 -8.560528 -21.542111 1.051744 2.395432 -0.327679 2.379194 -6.237965 0.000007 -0.000001 -0.000009 19.838935 19.517991 -1.326186 53.929108 -12.320707 4.908728 -42.636018 6.807413 8.724980 -1.626160 -11.158930 -2.643902 -0.278185 -1.856678 4.875897 -0.000003 -0.000002 -0.000001 0.009973 -0.008328 0.010787 +-6.942700 106.135000 382.698700 -118.250695 -5.693460 2.818096 0.000003 0.000000 0.005542 4.319818 -0.013738 -1.080076 11.609755 2.735458 -2.721982 8.310703 2.648449 -0.020604 -0.639679 1.903287 3.444066 32.495506 -2.783869 -0.577860 8.307014 -9.484711 3.796336 32.703547 -0.581522 -0.505756 1.461930 0.321701 0.207708 4.634659 4.477552 8.414950 6.639059 -11.846620 13.475642 -2.476647 -5.687953 1.447123 -16.911338 4.789719 3.587876 1.220631 -1.270954 7.603815 42.456630 -10.874848 0.342401 11.854372 -1.446102 -12.722178 0.000009 0.000002 -0.000005 0.001582 0.000204 0.001326 1.537342 2.126246 0.072769 2.914739 1.283169 -13.627292 15.934642 4.103088 0.832349 5.258344 -8.166986 0.237685 -0.000008 -0.000004 -0.000007 48.042355 0.612593 -15.094310 -20.220229 -17.433602 -29.730444 16.104363 -7.020795 -12.740706 51.795261 11.963201 -4.508854 -21.582027 -4.312231 -8.797868 -19.537621 1.449279 2.257689 -0.327317 2.374743 -6.226370 0.000008 0.000001 -0.000007 19.440522 18.957340 -1.642098 52.144912 -12.022829 4.573467 -47.012506 7.180923 9.107101 4.213419 -12.391265 -2.009484 -0.277684 -1.851952 4.863568 -0.000001 -0.000003 -0.000004 0.009971 -0.008322 0.010780 +-6.539900 106.367000 377.127400 -116.825741 -4.739859 2.000131 -0.000001 0.000000 0.005541 5.142234 -0.036394 -2.273331 10.590486 2.740271 -2.633029 7.035942 2.630072 1.458732 -1.553470 1.830118 5.601400 31.612882 -2.749319 -0.585083 8.587762 -10.249229 3.873960 33.809542 -1.593424 -1.358744 0.741379 0.349198 0.250330 4.634666 4.477556 8.414955 6.639045 -11.846608 13.475637 -1.243429 -5.530439 1.867569 -16.954509 3.797104 6.390124 6.969376 -3.298382 4.912355 49.465053 -12.485068 1.163251 14.429299 -2.494050 -14.867681 0.000010 0.000004 -0.000010 0.001585 0.000199 0.001328 1.558403 0.934904 -0.148924 2.988392 1.283994 -14.849941 15.990883 4.117880 0.833244 5.631743 -7.126832 0.275986 -0.000006 -0.000002 -0.000002 52.608576 0.362189 -12.253272 -21.578625 -15.553242 -26.562674 10.944360 -7.443077 -11.369693 54.670002 12.441205 -5.050612 -22.965838 -4.576124 -9.018791 -17.044710 1.679150 1.990695 -0.327566 2.377796 -6.234326 0.000010 -0.000001 0.000002 15.270616 19.435778 -0.381042 54.974424 -12.490149 5.109351 -50.057712 7.176799 10.028333 10.630626 -13.920170 -0.713766 -0.293770 -2.007150 5.268476 -0.000000 -0.000003 -0.000003 0.009981 -0.008335 0.010787 +-5.801300 107.075000 372.667200 -114.628714 -3.379239 0.473295 -0.000001 0.000001 0.005543 5.083484 -0.038965 -2.564405 9.679703 2.486578 -2.201363 5.929379 2.414053 2.731448 -2.293044 1.644957 7.299059 30.555439 -2.691868 -0.601749 8.855795 -10.811149 3.896871 34.905637 -2.508068 -2.059356 0.132696 0.376688 0.292596 4.634663 4.477556 8.414948 6.639056 -11.846623 13.475643 0.570879 -5.294538 2.451015 -15.575232 1.909236 8.175052 14.211810 -5.470430 2.992364 49.146797 -12.414483 1.121733 18.448216 -4.713936 -16.790589 0.000006 0.000003 -0.000001 0.001586 0.000201 0.001325 0.959096 0.101252 -0.179664 2.870976 1.290355 -16.049512 16.439053 4.235783 0.839886 6.187805 -6.302265 0.329620 -0.000007 -0.000002 -0.000001 56.471000 0.841199 -8.703556 -22.991827 -13.615791 -23.177485 7.010475 -8.015477 -8.981140 55.210905 12.527968 -5.155154 -23.227248 -4.623554 -9.125889 -15.154576 1.476864 1.690763 -0.328864 2.393366 -6.274875 0.000009 -0.000002 -0.000001 11.919431 20.145976 1.523061 59.539012 -13.184905 6.019754 -53.405464 6.758491 11.610046 18.487280 -16.039202 1.230529 -0.324572 -2.340100 6.136238 -0.000005 -0.000005 -0.000012 0.009970 -0.008327 0.010771 +-4.897900 107.807500 368.349900 -111.895364 -1.985433 -1.396596 -0.000003 0.000000 0.005543 4.311023 -0.034477 -2.002131 8.738103 2.044565 -1.454052 5.216110 2.113487 3.472759 -2.788476 1.393246 8.108796 29.344023 -2.632408 -0.624487 9.071371 -11.022150 3.885146 35.977823 -3.120113 -2.460545 -0.189070 0.375039 0.294710 4.634662 4.477547 8.414955 6.639054 -11.846609 13.475635 2.765095 -4.989959 3.133913 -12.399157 -0.144596 8.614533 20.745282 -7.239277 2.825942 40.974790 -10.520640 0.194673 22.083545 -7.158679 -18.469084 0.000007 0.000003 -0.000005 0.001583 0.000198 0.001328 -0.442298 -0.097794 0.074599 3.430666 1.282546 -16.968478 15.123777 3.889892 0.817773 8.443731 -5.534121 0.501900 -0.000008 -0.000005 -0.000002 59.671353 2.066046 -5.027696 -24.498287 -11.738241 -19.829569 3.020252 -8.761114 -6.296993 55.278405 12.538724 -5.168256 -23.260984 -4.613090 -9.205019 -13.426987 1.126049 1.403635 -0.330747 2.416459 -6.334997 0.000010 -0.000001 -0.000005 9.242752 20.591043 3.722831 63.240052 -13.692565 6.796021 -55.810490 6.218895 13.033516 24.996233 -17.791195 3.149365 -0.349462 -2.660958 6.971453 0.000001 -0.000002 -0.000008 0.009967 -0.008328 0.010785 +-3.903000 108.710800 363.794700 -108.905050 -0.781197 -3.434229 -0.000000 0.000000 0.005542 3.381510 -0.018191 -0.848649 7.764754 1.521556 -0.519124 4.610449 1.741129 3.782295 -3.132306 1.118806 8.186447 28.020762 -2.563988 -0.645940 9.200053 -10.806350 3.742574 36.822899 -3.499102 -2.673787 -0.381317 0.374935 0.299350 4.635957 4.476144 8.411091 6.634634 -11.845616 13.470988 6.299074 -4.467692 4.161220 -14.930594 -0.925370 7.993921 25.628924 -8.598757 4.013274 31.131278 -8.071533 -0.546160 29.210783 -10.410912 -19.211106 0.000005 0.000002 -0.000001 0.006985 -0.001979 -0.000892 -2.804249 0.563875 0.703514 2.538078 1.344353 -17.947960 -2.033773 -0.501347 -0.186932 9.314872 -5.765356 0.652617 -0.000005 -0.000004 0.000003 62.328406 3.981507 -1.604831 -26.057943 -10.025038 -16.769906 -1.000365 -9.574161 -3.566756 54.848181 12.469900 -5.084961 -23.053649 -4.564302 -9.256167 -11.615758 0.767960 1.153006 -0.332702 2.438470 -6.392438 0.000009 0.000001 -0.000007 7.392871 20.105096 5.748300 62.697797 -13.621381 6.680302 -55.532187 5.827136 13.437356 27.210847 -18.510129 3.903159 -0.360177 -2.824197 7.396063 -0.000002 -0.000005 -0.000006 0.009973 -0.008317 0.010770 +-2.914200 109.760700 359.159900 -105.969809 0.065121 -5.424134 -0.000000 0.000000 0.005543 1.961693 0.007239 0.340256 7.197481 1.050352 0.381550 4.678968 1.455812 4.000487 -3.936060 0.809639 8.107885 26.600245 -2.486093 -0.643780 9.228082 -10.353722 3.465664 37.287741 -3.894439 -2.925208 -0.556192 0.374021 0.300494 4.635952 4.476134 8.411101 6.634627 -11.845620 13.470987 10.944808 -3.668701 5.489627 -20.624521 -0.881531 7.031886 29.396656 -9.654373 4.731550 26.626548 -6.908881 -0.741314 17.143589 -6.349009 -21.737287 0.000009 0.000004 -0.000008 0.006988 -0.001987 -0.000887 -5.375286 1.540174 1.441415 1.372839 1.452027 -18.941134 1.038194 0.258553 0.088565 9.960128 -6.169800 0.824624 -0.000008 -0.000004 -0.000006 64.539106 6.284308 1.333045 -27.499965 -8.105857 -13.417569 -4.875088 -10.316994 -1.057495 54.014741 12.334738 -4.925056 -22.647210 -4.469628 -9.286219 -9.746915 0.468850 0.936949 -0.335295 2.471025 -6.477188 0.000007 0.000000 -0.000004 2.885067 18.845397 8.213742 60.262575 -13.288139 6.168964 -46.081466 5.547559 12.416525 18.298102 -16.679242 2.129662 -0.360813 -2.834219 7.422126 0.000002 -0.000001 -0.000001 0.009980 -0.008337 0.010791 +-2.023000 110.828900 354.509300 -103.397069 0.475185 -7.061264 0.000001 0.000000 0.005542 0.849211 0.021182 1.368442 6.824455 0.695962 1.152767 4.716647 1.222221 4.142388 -4.790624 0.557212 7.902547 25.137827 -2.405137 -0.606601 9.197581 -9.706426 3.087371 37.477900 -4.277311 -3.193044 -0.731059 0.373104 0.301634 4.635955 4.476141 8.411100 6.634627 -11.845619 13.470991 16.423962 -2.519786 7.115667 -13.398586 -3.315968 3.520782 23.233843 -4.062503 -10.198307 13.206591 -3.386656 -0.771320 -13.716470 5.058091 -6.154935 0.000003 0.000004 0.000002 0.006988 -0.001992 -0.000885 -8.159956 2.776552 2.282207 1.535099 1.452454 -19.853657 0.862763 0.214749 0.073927 12.788486 -6.142865 1.128004 -0.000006 -0.000004 -0.000002 66.482029 8.585697 3.720886 -28.757876 -5.676122 -9.168979 -8.458503 -10.883153 0.948871 52.949378 12.158486 -4.723502 -22.135953 -4.366590 -9.310935 -7.780759 0.300137 0.762859 -0.337842 2.503582 -6.561941 0.000006 -0.000002 -0.000006 -2.371292 17.088601 10.241613 55.432203 -12.563155 5.198154 -28.556746 4.581860 10.558099 1.883574 -12.549816 -0.289451 -0.357141 -2.776560 7.272166 -0.000002 -0.000005 -0.000003 0.009982 -0.008331 0.010790 +-1.376000 111.378300 350.334800 -101.364665 0.523459 -8.016606 -0.000000 0.000000 0.005544 -0.263775 0.033592 1.997877 6.704979 0.434966 1.685990 4.966797 1.063326 4.244486 -5.569288 0.365538 7.597214 23.647397 -2.321693 -0.526669 9.122433 -8.922698 2.631944 37.483624 -4.659471 -3.484715 -0.905960 0.380842 0.313761 4.635963 4.476143 8.411100 6.634631 -11.845618 13.470992 13.138085 -3.189007 6.257500 6.454674 -5.871503 1.868896 4.241832 4.089240 -23.476535 9.008161 -2.291445 -0.610906 -17.688353 -0.015572 9.157937 0.000001 0.000003 0.000003 0.006988 -0.001985 -0.000888 -11.019107 4.152859 3.177278 1.642339 1.461488 -20.685467 0.809060 0.201344 0.069416 15.617861 -6.156655 1.445164 -0.000008 -0.000004 -0.000003 68.199261 10.519370 5.625305 -29.993615 -2.861470 -4.243356 -11.950782 -11.323215 2.080902 52.674463 12.112377 -4.672024 -22.000430 -4.315006 -9.353613 -5.956849 0.281370 0.648672 -0.339372 2.523620 -6.614099 0.000010 -0.000004 -0.000008 -2.019370 15.308199 10.668899 46.709458 -11.050381 3.610990 -16.329557 3.264279 8.891243 -10.583184 -9.104476 -1.684304 -0.345051 -2.601133 6.815789 0.000001 -0.000005 -0.000009 0.009978 -0.008328 0.010784 +-1.076900 111.408800 346.715900 -99.812568 0.401967 -8.127256 -0.000000 0.000000 0.005543 -1.600229 0.022519 2.123874 6.893831 0.217174 1.943098 5.538343 0.925290 4.313893 -6.268032 0.206100 7.219800 22.178099 -2.226596 -0.444819 9.029916 -8.073238 2.152072 37.398141 -5.009042 -3.751845 -1.080885 0.388545 0.325906 4.635951 4.476142 8.411095 6.634624 -11.845621 13.470998 12.033962 -3.403751 5.957336 11.648699 -5.590795 1.116261 0.392627 3.826806 -22.545959 0.720909 -0.179356 -0.062001 -20.743018 -2.812486 7.959721 -0.000000 0.000008 0.000005 0.006988 -0.001987 -0.000886 -13.858311 5.520111 4.058487 0.916240 1.580992 -21.433549 2.722634 0.681533 0.222342 17.245278 -6.447348 1.756725 -0.000008 -0.000006 0.000001 69.517051 11.856111 7.344888 -31.351832 0.209383 1.140344 -15.427292 -11.703501 2.168778 53.259705 12.210231 -4.781878 -22.286301 -4.368270 -9.456490 -4.285795 0.433628 0.568290 -0.340907 2.543656 -6.666257 -0.000004 -0.000003 -0.000006 -1.345020 13.091418 12.228695 41.645552 -10.061588 2.800226 -13.939244 2.994046 5.796651 -19.184166 -6.625826 -2.791182 -0.264478 -1.733169 4.553443 -0.000003 -0.000006 0.000005 0.009978 -0.008331 0.010785 +-1.046400 111.189000 343.192200 -98.755882 0.223513 -7.272755 0.000001 0.000000 0.005544 -2.958025 0.025868 1.585010 7.332676 0.068717 1.869604 6.288575 0.839065 4.398066 -6.898503 0.060832 6.819403 20.771958 -2.104076 -0.332389 8.921057 -6.872083 1.468275 37.306155 -5.619375 -4.212333 -1.255737 0.383217 0.321599 4.635949 4.476141 8.411099 6.634625 -11.845618 13.470987 9.953601 -3.805812 5.345487 13.319093 -4.052615 1.491831 0.246832 3.508478 -22.675215 -1.549608 0.382640 0.140827 -19.546538 -3.673198 7.456775 0.000004 0.000002 0.000002 0.006985 -0.001986 -0.000888 -16.606746 6.813131 4.919667 1.238407 1.573841 -21.986987 2.026862 0.506317 0.168579 20.353071 -6.295221 2.066696 -0.000010 -0.000003 -0.000002 70.276206 12.451670 9.141425 -32.923394 3.359700 6.778417 -18.998419 -11.854280 1.202131 54.283038 12.378511 -4.976317 -22.780423 -4.457905 -9.567838 -2.463604 0.745211 0.479583 -0.341283 2.548673 -6.679294 0.000007 -0.000002 -0.000006 -4.915162 13.151630 11.566456 44.076638 -10.545821 3.178633 -15.106522 3.252963 5.915787 -17.736394 -6.824232 -2.570403 -0.264753 -1.735670 4.559962 -0.000001 -0.000005 -0.000008 0.009975 -0.008327 0.010785 +-1.412600 111.140200 339.255800 -98.001303 0.040201 -5.504984 0.000004 0.000000 0.005542 -4.028112 0.010304 0.556888 7.768310 0.007055 1.465554 6.914124 0.733204 4.401953 -7.435288 -0.046613 6.390536 19.344726 -1.990076 -0.294459 8.850545 -5.868813 0.941496 37.233024 -5.931363 -4.456409 -1.416625 0.386644 0.328167 4.635954 4.476141 8.411097 6.634619 -11.845618 13.471003 9.157282 -4.111461 4.769816 12.460927 -2.188028 1.703466 1.769620 2.409616 -22.736919 -5.741673 1.395863 0.572550 -16.820891 -4.734785 6.819997 -0.000000 0.000003 0.000000 0.006987 -0.001988 -0.000886 -19.333474 8.042798 5.759878 1.334552 1.574713 -22.446548 1.939373 0.484336 0.161674 23.055305 -6.223193 2.370573 -0.000008 -0.000004 -0.000003 70.270018 13.052863 11.037795 -34.795043 6.736709 13.050743 -22.618516 -11.666866 -0.639675 54.812859 12.464219 -5.078147 -23.032171 -4.500597 -9.670691 -0.260611 1.315233 0.390999 -0.342218 2.561197 -6.711893 -0.000004 -0.000001 -0.000001 -7.869580 13.278309 9.782777 46.150922 -10.945115 3.517353 -16.098013 3.463000 6.072411 -16.129625 -6.795938 -2.265691 -0.266690 -1.753142 4.605597 0.000002 -0.000002 -0.000003 0.009978 -0.008331 0.010783 +-2.328200 111.579700 334.906800 -97.289465 -0.112267 -3.168294 -0.000000 0.000000 0.005543 -4.916427 -0.007368 -0.527145 7.950484 -0.007164 0.829297 7.337257 0.609612 4.176958 -7.734497 -0.142500 5.897323 17.882595 -1.862924 -0.255934 8.769193 -4.957721 0.446974 37.096547 -6.224602 -4.691482 -1.577517 0.390056 0.334743 4.635958 4.476138 8.411098 6.634628 -11.845612 13.470982 8.366913 -4.313238 4.428290 11.074025 -0.588029 1.787120 1.225739 2.829287 -22.448573 -3.874461 0.948737 0.371195 -16.197741 -4.757722 6.938583 0.000008 0.000007 0.000001 0.006982 -0.001988 -0.000889 -21.798928 8.948782 6.508614 0.546007 1.717691 -22.830802 3.913125 0.982886 0.309401 24.280161 -6.349165 2.625816 -0.000007 -0.000004 0.000002 69.427616 14.221884 12.930099 -37.004992 10.333129 20.177478 -25.934788 -11.146423 -2.935327 53.937082 12.322022 -4.910246 -22.610409 -4.408110 -9.664623 2.218450 2.204280 0.244886 -0.343910 2.583737 -6.770554 -0.000002 -0.000003 -0.000004 -10.220202 13.356882 7.086997 47.165325 -11.135587 3.688157 -16.582350 3.559029 6.218354 -14.307614 -6.472392 -1.885023 -0.270305 -1.785602 4.690354 0.000002 -0.000005 -0.000008 0.009982 -0.008332 0.010778 +-3.628300 112.141200 330.589400 -96.627529 -0.231408 -0.445240 0.000001 0.000000 0.005543 -5.770222 -0.023050 -1.632185 8.055574 -0.028754 0.032259 7.700361 0.429679 3.783681 -7.913665 -0.250097 5.360891 16.420499 -1.738380 -0.235103 8.695561 -4.003758 -0.030658 36.896808 -6.498598 -4.918137 -1.738441 0.393446 0.341329 4.635957 4.476141 8.411100 6.634626 -11.845618 13.470984 7.595047 -4.449635 4.176861 9.594169 0.897108 1.834472 1.451013 2.626968 -22.305291 -4.820488 1.176148 0.471410 -12.026843 -4.868964 7.005848 0.000008 0.000007 0.000004 0.006986 -0.001990 -0.000886 -24.134989 9.815745 7.192531 1.202987 1.642913 -23.020680 2.305192 0.576327 0.190339 27.534024 -5.884832 2.792912 -0.000004 -0.000004 -0.000002 67.966632 15.517210 14.713739 -39.576992 13.839040 27.713084 -28.907864 -10.353529 -5.500679 52.272766 12.044544 -4.597190 -21.807237 -4.238739 -9.611536 4.721752 3.296973 0.026779 -0.345553 2.606285 -6.829232 0.000008 -0.000001 -0.000006 -12.132278 13.496448 3.858720 47.676356 -11.230318 3.775455 -16.821501 3.593719 6.402111 -12.496598 -5.926400 -1.498290 -0.275227 -1.830550 4.807706 -0.000002 -0.000005 -0.000002 0.009985 -0.008333 0.010774 +-5.166500 112.763800 326.272200 -96.024334 -0.270045 2.460247 -0.000000 0.000000 0.005543 -6.519850 -0.040240 -2.737180 8.139318 -0.054287 -0.855649 8.000069 0.228947 3.280958 -8.079899 -0.354771 4.824199 14.958447 -1.612296 -0.183201 8.594951 -3.049058 -0.508729 36.637114 -6.717206 -5.148172 -1.871343 0.396983 0.347733 4.635961 4.476146 8.411093 6.634614 -11.845608 13.470977 6.830448 -4.543653 4.020260 8.065335 2.259681 1.849750 1.342957 2.636895 -22.076104 -4.987128 1.216026 0.489435 -7.595033 -4.726607 7.242705 0.000007 0.000002 0.000002 0.006984 -0.001994 -0.000885 -25.349342 10.601082 7.615202 -3.203705 2.608188 -25.206897 13.446796 3.449627 0.778050 25.754360 -6.336606 5.136208 -0.000006 -0.000002 0.000000 66.232495 16.535371 16.254932 -42.382338 16.991964 35.233022 -31.434378 -9.337447 -8.099420 49.894791 11.631924 -4.164001 -20.650648 -4.001518 -9.521735 7.191076 4.476726 -0.280565 -0.347715 2.636356 -6.907477 0.000003 -0.000001 -0.000004 -13.700222 13.689578 0.350829 47.767167 -11.247062 3.791061 -16.861142 3.587598 6.579928 -10.725211 -5.267377 -1.134379 -0.281123 -1.885497 4.951118 -0.000000 -0.000006 0.000002 0.009972 -0.008330 0.010786 +-6.784000 113.349800 322.002400 -95.498875 -0.262237 5.365607 -0.000002 0.000000 0.005542 -7.150884 -0.048907 -3.758321 8.209126 -0.060831 -1.779094 8.249389 0.015840 2.723920 -8.259383 -0.479891 4.286194 13.496179 -1.527309 -0.097039 8.501959 -2.119986 -0.975628 36.378486 -6.912478 -5.352172 -2.004213 0.391845 0.343162 4.635958 4.476141 8.411100 6.634628 -11.845618 13.470997 6.065476 -4.635593 3.862409 6.598182 3.482448 1.836747 0.898973 2.869735 -21.697009 -4.279324 1.046278 0.413631 -3.524459 -4.342893 7.588616 0.000008 0.000000 0.000000 0.006982 -0.001986 -0.000886 -24.609115 11.197321 7.532284 -9.948048 5.085145 -29.660902 31.357890 8.129471 0.533899 22.889931 -5.519487 9.821378 -0.000005 -0.000001 -0.000005 64.691030 16.878892 17.420908 -45.178976 19.612186 42.173205 -33.514222 -8.202457 -10.557116 46.984222 11.101822 -3.657415 -19.245970 -3.701605 -9.397579 9.602536 5.663745 -0.654647 -0.349837 2.666419 -6.985706 0.000007 0.000001 -0.000004 -15.111807 13.988718 -3.152307 47.689863 -11.232810 3.777781 -16.819918 3.556659 6.792550 -8.968621 -4.574704 -0.841499 -0.287638 -1.947961 5.114093 0.000000 -0.000002 -0.000006 0.009972 -0.008323 0.010778 +-8.322200 113.948000 317.732700 -95.069193 -0.204674 8.031429 0.000001 0.000000 0.005543 -7.671810 -0.074778 -4.709243 8.279682 -0.046338 -2.661183 8.466588 -0.152359 2.161492 -8.469218 -0.586812 3.804335 11.963899 -1.444457 -0.010551 8.443626 -1.230429 -1.426273 36.166893 -7.052894 -5.481481 -2.137093 0.386715 0.338579 4.635964 4.476143 8.411091 6.634623 -11.845615 13.470982 5.299301 -4.712457 3.698058 5.134115 4.551417 1.781548 1.116702 2.638784 -21.271123 -5.490028 1.336016 0.544571 1.575121 -4.162064 7.816152 0.000006 0.000006 0.000002 -1.175263 0.104515 0.268833 -20.495559 11.626860 6.616766 -12.225870 7.219807 -34.415851 39.080345 10.061621 -0.019360 25.238375 -1.719244 14.414129 -0.000005 -0.000004 -0.000003 63.302815 16.967471 18.390602 -47.936706 21.779274 48.761441 -34.985674 -7.030371 -12.673857 43.428037 10.418326 -3.075694 -17.523489 -3.336859 -9.232165 11.956232 6.755858 -1.098188 -0.351586 2.691487 -7.050916 0.000002 -0.000003 -0.000009 -16.392734 14.336702 -6.429011 47.325370 -11.165338 3.715407 -16.646457 3.509484 6.999638 -7.193385 -3.929079 -0.588698 -0.294965 -2.020444 5.303159 -0.000004 -0.000002 -0.000008 0.009980 -0.008325 0.010775 +-9.628400 114.588900 313.463000 -94.771139 -0.121106 10.297524 0.000001 0.000000 0.005538 -8.066249 -0.087775 -5.527507 8.400964 -0.004808 -3.446179 8.667134 -0.290936 1.630752 -8.709374 -0.668572 3.385860 10.480531 -1.405783 0.082483 8.354402 -0.420240 -1.789232 35.825257 -7.070561 -5.572630 -2.270030 0.394593 0.350460 4.635955 4.476142 8.411092 6.634619 -11.845613 13.470986 4.492235 -4.793357 3.520005 3.782000 5.447136 1.727205 1.024308 2.611904 -20.657566 -5.683859 1.382125 0.566088 5.553469 -3.858736 8.064971 0.000006 0.000002 0.000003 -3.350927 0.285754 0.770411 -13.756117 11.575789 5.032173 -10.866590 7.837525 -38.123964 37.218992 9.604332 0.137901 29.884591 2.752794 17.618471 -0.000011 -0.000002 -0.000002 61.805494 17.372038 19.385479 -50.728556 23.690274 55.307064 -35.960041 -5.971132 -14.397540 40.147732 9.754844 -2.577360 -16.769590 -3.072886 -9.050016 15.666053 8.068226 -1.765935 -0.351576 2.691486 -7.050906 0.000008 -0.000003 -0.000001 -17.554913 14.742106 -9.257474 46.632068 -11.035855 3.597944 -16.310939 3.404506 7.221865 -5.349901 -3.406681 -0.391537 -0.302060 -2.092951 5.492212 0.000002 -0.000005 0.000002 0.009971 -0.008329 0.010788 +-10.544000 115.217600 309.193300 -94.606526 -0.053022 11.961368 -0.000000 0.000000 0.005547 -8.349203 -0.104440 -6.177832 8.575120 0.085563 -4.064915 8.864920 -0.366727 1.219090 -8.986733 -0.719970 3.065971 9.109103 -1.371981 0.144327 8.236745 0.242049 -2.069609 35.255579 -6.959390 -5.597527 -2.382006 0.402576 0.362212 4.635954 4.476143 8.411093 6.634620 -11.845613 13.470975 3.631438 -4.892868 3.329068 2.519839 6.102694 1.617570 0.966611 2.607290 -19.866333 -5.701358 1.386282 0.568047 8.561947 -3.554109 8.258379 0.000006 0.000002 0.000004 -4.527732 0.375757 1.044327 -7.881615 10.743679 3.567432 -9.110034 7.304124 -39.055261 32.988806 8.544618 0.439016 31.159395 4.248834 19.029781 0.000004 -0.000005 0.000004 60.427469 17.964905 20.308789 -53.297848 25.182450 61.402403 -36.613082 -5.154587 -15.718311 38.263505 9.360212 -2.308452 -17.869815 -3.062457 -8.858352 21.165643 9.618547 -2.773240 -0.348611 2.648882 -6.940077 0.000009 0.000003 -0.000002 -18.729180 15.173489 -11.396748 45.729616 -10.865074 3.447405 -15.877652 3.289489 7.440935 -3.416821 -3.084465 -0.244850 -0.310301 -2.180481 5.720376 0.000002 -0.000005 0.000002 0.009981 -0.008329 0.010780 +-10.898000 115.773000 304.923600 -94.606580 0.011474 12.820618 -0.000000 0.000000 0.005545 -8.468950 -0.105290 -6.625533 8.857250 0.200744 -4.461291 9.019393 -0.396431 0.963386 -9.349660 -0.745166 2.879045 7.898591 -1.341389 0.182880 8.117549 0.790824 -2.272111 34.632969 -6.740457 -5.548500 -2.493883 0.397535 0.357506 4.635962 4.476145 8.411094 6.634627 -11.845618 13.470993 2.112226 -5.113868 2.854656 2.085549 6.604245 1.645486 0.696496 2.759209 -18.783413 -4.796673 1.170442 0.468843 10.109668 -3.164431 8.333603 0.000007 -0.000001 -0.000004 -2.711645 0.234491 0.622360 -4.975485 9.577685 2.572117 -8.200361 6.260662 -37.322001 33.652223 8.712518 0.397024 23.289347 1.315299 19.334423 -0.000006 -0.000003 -0.000002 59.415351 18.632302 21.089560 -55.378767 26.205978 66.580752 -36.324141 -5.198630 -17.097195 41.953764 10.123929 -2.847063 -22.830517 -3.736861 -8.926748 25.473302 11.046327 -3.599609 -0.342220 2.561193 -6.711883 0.000007 0.000001 -0.000007 -19.996748 15.609209 -12.617284 44.709421 -10.669011 3.280445 -15.390711 3.149384 7.662881 -1.360031 -3.012912 -0.119197 -0.318203 -2.268048 5.948540 -0.000001 -0.000005 -0.000005 0.009974 -0.008329 0.010778 +-10.690500 116.218600 300.653900 -94.741338 0.066992 12.777555 -0.000001 0.000000 0.005538 -8.476986 -0.113655 -6.765307 9.228925 0.287005 -4.592069 9.173503 -0.408997 0.846509 -9.768268 -0.777631 2.816988 6.946965 -1.312992 0.200175 7.979758 1.356870 -2.426845 33.942905 -6.340757 -5.349224 -2.577797 0.392677 0.352599 4.635960 4.476139 8.411109 6.634626 -11.845614 13.470981 0.359779 -5.353008 2.300376 2.187603 6.905737 1.737049 0.328941 2.976771 -17.509526 -3.519760 0.863017 0.334577 10.875162 -2.705054 8.224416 0.000006 0.000002 0.000000 1.393242 -0.133971 -0.314421 -3.952180 8.706207 1.768560 -5.095243 3.733798 -34.497885 33.953823 8.788650 0.377280 10.681254 -3.179362 18.527477 -0.000009 -0.000004 -0.000002 59.005881 19.166327 21.618367 -56.624604 26.787580 70.340819 -33.119608 -6.351249 -18.566401 49.725140 11.601774 -4.133744 -30.583193 -4.843409 -9.344355 26.404798 12.080056 -3.743819 -0.332700 2.438469 -6.392439 0.000013 0.000004 -0.000004 -21.440230 15.952841 -12.851380 43.571990 -10.446720 3.098416 -14.840628 3.004358 7.883882 0.834403 -3.201775 -0.004964 -0.325744 -2.355641 6.176719 -0.000001 -0.000002 -0.000003 0.009991 -0.008334 0.010771 +-10.098400 116.572600 296.320700 -94.968229 0.153164 12.063397 -0.000001 0.000000 0.005543 -8.433505 -0.103337 -6.681520 9.654702 0.346647 -4.513074 9.306701 -0.428734 0.843191 -10.202412 -0.779263 2.839925 6.226326 -1.314255 0.197595 7.808865 1.938502 -2.539606 33.090685 -5.772948 -5.018260 -2.661681 0.385517 0.367333 4.635967 4.476140 8.411099 6.634629 -11.845614 13.471001 -0.975388 -5.531065 1.854656 1.612084 6.933609 1.626665 -0.128243 3.233381 -15.883388 -1.878046 0.463212 0.171988 11.393451 -2.043265 7.957613 0.000006 0.000004 0.000000 5.735590 -0.596409 -1.275532 -2.985508 8.242188 0.894526 1.896773 -0.401018 -30.540761 26.879547 6.974657 0.732780 -0.405014 -6.688604 16.459002 -0.000006 -0.000003 0.000000 58.208730 19.100991 20.704322 -56.478107 26.865140 72.420223 -25.983091 -7.972365 -19.275904 54.308501 12.382653 -4.981193 -36.223000 -5.545400 -9.636522 23.993338 12.291001 -3.073291 -0.324636 2.340833 -6.138186 0.000006 -0.000003 -0.000008 -22.967425 16.107234 -12.394128 42.213264 -10.176196 2.886769 -14.194032 2.837569 8.105902 3.134344 -3.571923 0.126195 -0.332951 -2.443272 6.404905 -0.000004 -0.000004 -0.000001 0.009985 -0.008332 0.010778 +-9.170700 116.822900 291.971700 -95.275953 0.262234 10.811348 0.000001 0.000000 0.005541 -8.361909 -0.092937 -6.401888 10.106948 0.389143 -4.266236 9.488526 -0.424061 0.914812 -10.608477 -0.782858 2.933110 5.624645 -1.315094 0.197727 7.624441 2.510404 -2.616809 32.150663 -5.131500 -4.600842 -2.745645 0.389314 0.373389 4.635956 4.476138 8.411104 6.634622 -11.845619 13.471002 -1.733607 -5.630202 1.593093 0.158106 6.776783 1.278778 0.761270 2.716027 -14.163969 -3.927435 0.961513 0.376706 14.196939 -1.902257 7.457945 0.000005 0.000003 -0.000004 10.462193 -1.181984 -2.280553 -2.927254 8.046259 0.271371 10.145286 -4.379124 -25.739942 17.025300 4.390059 0.847176 -10.239742 -8.429697 13.829779 -0.000009 -0.000003 -0.000008 56.395465 18.524817 18.427152 -55.337216 26.649083 73.245548 -17.537313 -9.185230 -18.515338 53.685161 12.280631 -4.862360 -37.291074 -5.620468 -9.427670 19.155250 11.294836 -1.901335 -0.319894 2.285773 -5.994762 0.000007 0.000000 -0.000004 -24.492268 16.020210 -11.423549 40.537063 -9.835172 2.634523 -13.388871 2.631295 8.301938 5.519494 -4.089035 0.280828 -0.339800 -2.530929 6.633080 -0.000004 -0.000001 -0.000003 0.009970 -0.008325 0.010780 +-7.998700 116.987700 287.606800 -95.648868 0.402633 9.147577 0.000001 0.000000 0.005545 -8.291611 -0.093539 -5.968158 10.556731 0.403187 -3.878788 9.711669 -0.382660 1.045569 -10.923654 -0.783640 3.055476 5.022959 -1.318838 0.162999 7.436897 3.003296 -2.664624 31.172584 -4.485417 -4.165382 -2.794647 0.393329 0.379207 4.635955 4.476140 8.411106 6.634615 -11.845618 13.470983 -1.735125 -5.628633 1.596919 -2.516428 6.437150 0.627167 1.784487 2.213294 -12.123649 -6.162155 1.495570 0.619863 17.341746 -1.745640 6.849853 0.000007 0.000003 0.000003 15.426121 -1.885342 -3.282624 -4.670602 7.906731 0.142230 17.504270 -7.081290 -21.025545 7.247175 1.836103 0.519825 -17.549913 -8.331238 11.837783 -0.000013 -0.000006 -0.000004 54.464311 17.840587 16.336460 -54.390781 26.493833 73.395205 -11.573457 -9.456566 -16.752166 51.033654 11.831877 -4.369352 -33.976803 -5.218510 -8.779915 13.188855 9.276352 -0.813853 -0.316365 2.245734 -5.890449 0.000007 -0.000001 -0.000007 -25.923787 15.672101 -10.106184 38.448153 -9.399300 2.334233 -12.383204 2.383513 8.479543 7.972497 -4.704296 0.492151 -0.346304 -2.618609 6.861261 -0.000005 -0.000004 0.000003 0.009971 -0.008326 0.010782 +-6.655800 117.067100 283.146600 -96.068638 0.568501 7.205449 -0.000001 0.000000 0.005544 -8.248983 -0.088968 -5.422591 11.004426 0.389183 -3.371483 10.011016 -0.307018 1.207724 -11.113113 -0.778252 3.179567 4.365246 -1.301437 0.125211 7.224480 3.411693 -2.657643 30.159469 -3.889190 -3.775533 -2.843565 0.388669 0.374055 4.635955 4.476146 8.411089 6.634608 -11.845607 13.470981 -1.736634 -5.627058 1.600746 -5.278712 6.050968 -0.076540 2.211974 2.068040 -9.836741 -6.634275 1.607073 0.673863 19.305142 -1.427485 6.134723 0.000006 0.000003 0.000000 18.198317 -2.315787 -3.815636 -6.793793 7.512505 0.217979 26.513609 -8.391508 -16.546567 -11.617596 -2.753268 -1.298107 -13.623666 -5.771818 11.916943 -0.000012 -0.000002 -0.000005 52.269464 17.268547 14.839484 -52.977307 26.073776 71.447358 -7.666487 -9.122275 -14.559506 48.081977 11.304931 -3.845345 -27.894826 -4.435787 -7.942326 6.670243 6.781633 -0.043929 -0.312298 2.200699 -5.773102 0.000012 0.000001 -0.000005 -27.153619 15.047993 -8.611676 35.866368 -8.844669 1.985242 -11.149749 2.081608 8.621443 10.471748 -5.389327 0.735297 -0.352453 -2.706319 7.089455 -0.000009 0.000000 -0.000002 0.009981 -0.008329 0.010781 +-5.221400 117.006000 278.702300 -96.588146 0.751708 5.111706 0.000002 0.000000 0.005542 -8.303788 -0.073793 -4.786241 11.361506 0.386270 -2.793574 10.441784 -0.174462 1.398404 -11.067479 -0.717962 3.308595 3.735581 -1.302734 0.110905 6.999798 3.559945 -2.588168 29.064186 -3.441535 -3.459383 -2.892498 0.384014 0.368900 4.635955 4.476138 8.411102 6.634621 -11.845619 13.470995 -1.734651 -5.630497 1.592327 -8.348123 5.500311 -0.901298 2.763642 1.927104 -7.360790 -7.255876 1.753150 0.746324 21.394970 -1.165804 5.300574 0.000004 0.000005 -0.000002 18.494371 -2.363301 -3.871356 -1.562268 3.474138 -0.882696 16.191605 -3.753047 -14.979903 -11.617601 -2.753273 -1.298092 -14.163659 -5.004648 9.792633 -0.000008 -0.000003 -0.000002 49.187122 16.515362 13.511488 -50.077236 24.807040 66.185865 -4.599382 -8.526308 -12.071539 44.609437 10.649634 -3.264268 -20.750755 -3.373450 -7.164345 0.193906 4.148242 0.382441 -0.308143 2.155674 -5.655766 0.000003 -0.000004 -0.000008 -28.111788 14.199010 -7.058940 32.850761 -8.175951 1.609625 -9.702437 1.727281 8.731391 12.991315 -6.100504 1.052775 -0.357782 -2.786526 7.298095 0.000000 -0.000008 -0.000003 0.009979 -0.008331 0.010787 +-3.774800 116.804600 274.210400 -97.199275 0.960870 3.000234 -0.000002 0.000000 0.005542 -8.414532 -0.054339 -4.114965 11.669729 0.390388 -2.173389 10.989699 0.011145 1.581880 -10.819622 -0.642572 3.363097 3.133886 -1.303823 0.097223 6.741285 3.583646 -2.472670 27.922773 -3.037399 -3.185993 -2.899497 0.379630 0.363460 4.635958 4.476145 8.411106 6.634628 -11.845611 13.470977 -1.732667 -5.633950 1.583909 -11.403325 4.976545 -1.731984 4.776830 1.337528 -5.020828 -11.604961 2.750442 1.296379 25.581102 -1.746320 4.462108 0.000007 0.000003 -0.000010 18.534261 -2.369726 -3.878848 2.364696 -0.967579 -0.653918 6.183513 1.265206 -13.404379 -11.617593 -2.753271 -1.298092 -11.338765 -3.846208 7.761412 -0.000013 -0.000005 0.000002 45.603729 15.468498 12.378136 -46.244745 22.651545 58.553190 -1.138274 -7.762681 -9.386650 40.255666 9.777156 -2.593155 -14.143620 -2.275497 -6.628331 -5.597116 1.694759 0.486746 -0.305318 2.125663 -5.577538 0.000005 -0.000002 -0.000001 -28.703918 13.164779 -5.573715 29.372839 -7.379039 1.220706 -8.034362 1.319961 8.813295 15.518285 -6.797074 1.401870 -0.362500 -2.861740 7.493696 -0.000007 -0.000002 -0.000013 0.009973 -0.008335 0.010777 +-2.395300 116.371200 269.670800 -97.823520 1.191113 0.996251 -0.000000 0.000000 0.005542 -8.470549 -0.053503 -3.422424 11.935312 0.378670 -1.538328 11.537044 0.198499 1.763573 -10.483229 -0.524230 3.356654 2.560166 -1.286730 0.047567 6.479412 3.527538 -2.329516 26.750468 -2.662338 -2.903646 -2.906527 0.388263 0.374481 4.635955 4.476147 8.411086 6.634625 -11.845609 13.470980 -1.730697 -5.637400 1.575497 -14.624357 4.454994 -2.616558 5.282913 1.408003 -2.403030 -11.604965 2.750438 1.296380 26.122928 -1.849646 3.473020 0.000010 0.000004 -0.000006 17.529122 -2.209481 -3.688817 0.138679 -1.600739 -0.323203 6.039022 1.341382 -11.978133 -11.617596 -2.753270 -1.298093 -8.634870 -2.465105 6.688934 -0.000012 -0.000002 0.000000 41.963183 14.032315 11.390920 -42.149613 19.594599 49.512919 3.720969 -6.785150 -6.609050 34.956321 8.645170 -1.868207 -9.737405 -1.388824 -6.337435 -10.081773 -0.247716 0.412241 -0.304375 2.115657 -5.551464 0.000009 -0.000001 -0.000001 -29.073639 12.048364 -4.236442 25.617903 -6.491109 0.855874 -6.233579 0.894981 8.866061 18.044296 -7.447657 1.780356 -0.366383 -2.926935 7.663216 -0.000001 -0.000002 0.000003 0.009971 -0.008322 0.010776 +-1.150100 116.029400 265.115400 -98.439795 1.392821 -0.774698 -0.000001 0.000000 0.005543 -8.378800 -0.040628 -2.751070 12.200964 0.369259 -0.924191 11.986720 0.362369 1.883382 -10.202831 -0.405063 3.244235 2.021439 -1.269130 -0.001133 6.224796 3.291824 -2.125537 25.618694 -2.295177 -2.611972 -2.913518 0.388217 0.374528 4.635962 4.476138 8.411104 6.634626 -11.845614 13.471010 -1.728708 -5.640845 1.567076 -17.841065 4.083755 -3.480308 5.978147 1.521886 0.189620 -11.604956 2.750441 1.296375 25.147049 -2.194543 2.404484 0.000014 0.000003 -0.000005 15.551767 -1.904278 -3.307215 -0.546732 -2.278053 -0.305114 5.879168 1.435741 -10.406020 -11.617596 -2.753272 -1.298098 -6.441518 -1.330152 5.384641 -0.000012 -0.000005 -0.000007 38.694586 12.227091 10.422781 -38.257174 15.792068 39.869088 6.939006 -5.712766 -4.201043 31.428480 7.853236 -1.444757 -11.724450 -1.496441 -6.248021 -13.105661 -1.627109 0.231644 -0.304139 2.113155 -5.544938 0.000009 -0.000001 -0.000002 -28.619428 10.722629 -3.250399 20.628973 -5.273818 0.462558 -3.842979 0.299260 8.877106 20.484538 -8.001869 2.152647 -0.369387 -2.979605 7.800155 -0.000005 -0.000006 -0.000005 0.009984 -0.008332 0.010783 +-0.118600 115.791300 260.544200 -99.113646 1.592656 -2.262135 0.000001 0.000000 0.005543 -8.126470 -0.033972 -2.107595 12.522409 0.339176 -0.372646 12.360731 0.479962 1.930731 -9.990977 -0.308751 3.067084 1.552696 -1.265052 -0.046950 5.974793 3.161160 -1.937205 24.514247 -1.906942 -2.244718 -2.906514 0.388263 0.374481 4.635956 4.476144 8.411092 6.620508 -11.822723 13.445559 -1.726742 -5.644302 1.558665 -21.077928 3.837572 -4.321304 6.735886 1.675253 2.800194 -11.604963 2.750441 1.296375 23.622580 -2.663810 1.256739 0.000011 0.000003 -0.000002 12.687442 -1.486363 -2.736982 0.165808 -2.983076 -0.588983 5.714897 1.526755 -8.812651 -11.617590 -2.753273 -1.298092 -4.748718 -0.430255 4.019857 -0.000009 -0.000003 -0.000001 36.220428 10.165892 9.406336 -34.971088 11.518942 30.398915 8.528496 -4.868233 -2.325819 29.569091 7.424702 -1.241365 -14.475438 -1.811866 -6.218025 -14.349985 -2.401119 0.033092 -0.303905 2.110656 -5.538422 0.000007 -0.000003 -0.000003 -27.059785 9.143988 -2.638835 13.918536 -3.585173 0.103547 -0.633358 -0.499950 8.852179 22.835851 -8.425767 2.504862 -0.371444 -3.017227 7.897955 -0.000006 -0.000005 -0.000002 0.009983 -0.008338 0.010773 +0.748200 116.114900 255.830000 -100.043285 1.779685 -3.516028 0.000005 0.000000 0.005543 -7.139315 -0.020964 -1.527196 12.942126 0.351305 0.093277 12.357364 0.579692 1.939225 -9.891320 -0.204952 2.889646 1.160943 -1.232821 -0.093409 5.724425 3.003247 -1.740311 23.406544 -1.556891 -1.908008 -2.899533 0.388309 0.374434 4.622873 4.463705 8.388534 6.606397 -11.799825 13.420132 -1.724755 -5.647749 1.550256 -24.492350 3.665453 -5.209320 7.449179 1.872563 5.462085 -11.604955 2.750439 1.296378 22.572351 -3.166304 0.071284 0.000011 0.000002 -0.000002 7.802064 -0.842077 -1.720582 3.987215 -4.037137 -1.595269 5.536816 1.606030 -7.078708 -11.617587 -2.753269 -1.298096 -4.227473 0.317913 2.755645 -0.000010 -0.000004 -0.000003 35.227852 8.036009 8.314493 -32.433700 7.235682 21.634966 5.934546 -4.920847 -1.049601 32.522110 8.101787 -1.570818 -15.922240 -2.137396 -6.348095 -12.163875 -2.485438 -0.028549 -0.303637 2.108157 -5.531903 0.000007 0.000000 0.000004 -22.215132 6.752033 -2.544257 1.882264 -0.485113 -0.037015 5.126274 -1.937518 8.805214 25.045716 -8.721019 2.808622 -0.371997 -3.027257 7.924032 0.000005 -0.000005 -0.000007 0.009985 -0.008340 0.010782 +1.505000 117.183000 250.973100 -101.299281 1.979862 -4.497223 0.000001 0.000000 0.005544 -5.180300 -0.023582 -1.086349 13.438422 0.420262 0.465921 11.801575 0.663201 1.974540 -9.993921 -0.112271 2.732447 0.804352 -1.121302 -0.117576 5.471453 2.731880 -1.527350 22.428241 -1.275200 -1.631745 -2.892544 0.388355 0.374386 4.609797 4.451274 8.365979 6.583534 -11.781848 13.375793 -1.719287 -5.656225 1.529595 -27.849599 3.507745 -6.088466 7.972109 2.057252 8.069479 -11.604969 2.750444 1.296374 22.849460 -3.687078 -1.107107 0.000011 0.000002 0.000002 3.361800 -0.334489 -0.754247 7.068049 -5.085053 -2.418521 5.408910 1.662495 -5.762244 -11.617587 -2.753270 -1.298093 -3.437009 0.995507 1.733672 -0.000010 -0.000006 -0.000005 36.159284 6.039305 7.114778 -30.622303 3.309732 14.158594 4.537365 -4.870319 0.095839 33.198264 8.254109 -1.651114 -16.251616 -2.204502 -6.390206 -9.732642 -2.477865 -0.064110 -0.304591 2.118162 -5.557978 0.000006 -0.000002 -0.000001 -20.500241 6.372194 -0.226903 1.996580 -0.514610 -0.038754 2.743186 -1.542741 7.299432 28.355153 -9.720770 3.481314 -0.340188 -2.535922 6.646072 0.000007 -0.000004 -0.000003 0.009974 -0.008323 0.010777 +2.097100 118.666300 246.036700 -102.555295 2.163718 -5.208423 -0.000000 0.000000 0.005542 -2.815632 -0.022391 -0.785182 13.891895 0.537541 0.731868 10.943194 0.791407 2.007667 -10.222946 -0.006348 2.625093 0.462086 -0.955297 -0.243715 5.293070 2.603021 -1.391319 21.635749 -1.072788 -1.398461 -2.885553 0.388400 0.374337 4.596700 4.438839 8.343415 6.544904 -11.750208 13.332064 -3.376075 -5.854011 0.965478 -28.580592 3.414911 -6.293125 3.963795 2.412687 13.419256 -0.785668 0.194508 0.070117 18.939455 -3.455092 -4.688409 0.000001 0.000005 -0.000003 0.884938 -0.084689 -0.199811 7.051130 -5.823686 -2.573845 5.357601 1.678421 -5.282854 -11.617591 -2.753269 -1.298096 -1.445457 1.619987 1.031966 -0.000005 -0.000002 -0.000008 39.143053 4.323310 5.747056 -29.376162 0.200925 8.479986 3.724959 -4.753538 1.020406 32.365903 8.066449 -1.552528 -15.846467 -2.110456 -6.388136 -7.158051 -2.369478 -0.047092 -0.305553 2.128164 -5.584063 0.000007 -0.000002 -0.000005 -23.984023 7.953037 5.232077 20.398730 -5.216745 0.446975 -11.654537 2.037093 4.285650 32.777159 -11.753874 4.741241 -0.226730 -1.418761 3.731572 -0.000001 -0.000001 -0.000004 0.009975 -0.008330 0.010776 +2.487800 120.216700 240.925800 -103.548029 2.300118 -5.639557 -0.000000 0.000000 0.005542 -0.632912 -0.011921 -0.631221 14.183487 0.693441 0.899403 10.007576 0.921326 2.085515 -10.486650 0.095961 2.574086 0.246614 -0.716797 -0.422359 5.140734 2.675120 -1.400630 20.985669 -1.043471 -1.394370 -2.878555 0.388443 0.374291 4.583605 4.426413 8.320857 6.508032 -11.709255 13.262370 -1.934639 -5.708876 1.394876 -33.368514 2.896248 -7.596712 -0.803143 1.738103 20.931904 11.505312 -2.941496 -0.715994 22.619585 -4.934807 -9.398192 0.000009 0.000002 0.000003 0.002812 -0.001597 0.000060 4.725191 -6.317144 -2.216749 5.371507 1.672292 -5.691353 -11.617586 -2.753270 -1.298092 1.379097 2.163009 0.737166 -0.000008 -0.000004 -0.000003 43.457352 2.795885 4.081804 -28.363655 -2.242391 4.209873 2.919360 -4.652375 1.660426 30.736575 7.694628 -1.367445 -15.050812 -1.924337 -6.359937 -4.520100 -2.153494 0.000115 -0.306488 2.138166 -5.610135 0.000005 -0.000004 -0.000002 -22.940148 8.031374 10.900015 35.833160 -8.837427 1.980918 -25.860595 6.238901 1.557157 36.098820 -14.183125 6.037207 -0.032154 -0.174621 0.461350 0.000002 -0.000004 0.000002 0.009977 -0.008329 0.010779 +2.640400 121.504600 235.640200 -103.943173 2.360759 -5.785479 -0.000000 0.000000 0.005543 0.696177 -0.008314 -0.477348 14.244177 0.825264 1.069863 9.323422 1.059317 2.161201 -10.616668 0.187383 2.431468 0.132193 -0.264081 -0.716132 5.023550 2.749965 -1.486664 20.491655 -1.201136 -1.607904 -2.871552 0.388491 0.374243 4.570514 4.413992 8.298309 6.471236 -11.668273 13.192685 -3.389121 -5.888893 0.875852 -29.958634 0.565567 -7.154801 -8.117177 -0.511941 27.239211 27.950299 -7.252484 -0.693524 41.063791 -10.816129 -12.215331 0.000007 0.000003 -0.000003 0.002806 -0.001604 0.000063 1.131153 -6.517084 -1.518258 5.451529 1.612626 -6.789306 -11.617581 -2.753269 -1.298094 4.663879 2.498978 0.639864 -0.000007 -0.000002 0.000001 47.608440 1.195140 2.057914 -27.366232 -4.457510 0.493841 1.525400 -4.647895 1.944190 29.109867 7.317755 -1.193274 -14.255369 -1.737853 -6.334349 -1.907202 -1.818589 0.061770 -0.307915 2.153169 -5.649243 0.000006 -0.000004 -0.000007 -17.492867 7.404251 15.027514 44.708629 -10.668855 3.280320 -35.894277 9.852071 -0.149561 36.344618 -16.355979 6.554624 0.169646 0.790930 -2.103338 -0.000001 -0.000004 -0.000004 0.009977 -0.008331 0.010789 +2.292500 121.986800 230.497600 -103.529004 2.425577 -5.440196 -0.000000 0.000000 0.005543 0.325494 -0.002619 -0.274566 14.272179 0.824735 1.279409 9.384604 1.107566 2.133052 -10.325647 0.263327 2.061992 0.024070 0.383575 -1.194550 4.904621 2.756117 -1.600438 19.993355 -1.463007 -2.016587 -2.864552 0.388538 0.374195 4.557397 4.401583 8.275706 6.434474 -11.627240 13.123055 -6.104482 -6.182719 -0.086457 -17.790490 -0.337313 -4.327359 -11.344359 -2.038964 30.683638 33.410960 -8.651525 -0.412537 44.841473 -17.198551 -14.522901 0.000009 0.000004 -0.000008 0.002819 -0.001600 0.000061 -2.782735 -6.438655 -0.647040 5.565676 1.531937 -8.277743 -11.617587 -2.753274 -1.298092 8.054759 2.561632 0.487172 -0.000007 -0.000004 0.000004 51.339284 -0.742904 -0.291400 -26.400126 -6.437451 -2.728007 -1.372066 -5.183382 1.512278 29.069756 7.308393 -1.189113 -14.236577 -1.718137 -6.384900 0.547565 -1.277752 0.134173 -0.309295 2.168181 -5.688363 -0.000002 -0.000004 -0.000003 -11.162789 7.118071 16.423965 47.599913 -11.216199 3.762342 -39.756714 11.453479 -0.725713 32.208901 -17.366468 5.583432 0.265271 1.185637 -3.160364 0.000002 -0.000005 -0.000007 0.009979 -0.008331 0.010787 +1.346300 121.724300 225.640600 -102.494149 2.609479 -4.507501 -0.000001 0.000000 0.005542 -1.542107 0.006293 -0.099628 14.429260 0.693724 1.463039 10.122539 1.027144 1.998930 -9.626579 0.287071 1.512646 -0.035190 1.084944 -1.698164 4.785759 2.764042 -1.773942 19.431024 -1.861803 -2.601676 -2.857561 0.388583 0.374148 4.556595 4.383751 8.248241 6.396885 -11.590793 13.066461 -7.566138 -6.335632 -0.606321 -6.503712 -0.541210 -1.737320 -13.289374 -2.170164 30.413340 35.210489 -9.104488 -0.290716 42.634785 -19.462221 -16.217191 0.000006 0.000003 -0.000003 0.002813 -0.001597 0.000059 -7.190414 -6.094349 0.429156 5.713066 1.440472 -10.178209 -11.617592 -2.753271 -1.298096 11.624813 2.414631 0.329191 -0.000007 -0.000005 0.000002 54.691309 -3.169931 -2.793580 -25.480132 -8.223805 -5.485477 -5.609784 -6.256799 0.246744 30.684802 7.682721 -1.361746 -15.019658 -1.887984 -6.507590 2.814687 -0.495049 0.175316 -0.311369 2.190698 -5.747033 0.000008 -0.000002 -0.000001 -6.244061 6.966019 15.951371 47.154407 -11.133552 3.686301 -35.618538 10.416430 -1.344886 22.229185 -16.521510 3.151827 0.264444 1.182394 -3.151656 0.000001 -0.000004 -0.000003 0.009978 -0.008329 0.010785 +0.003500 120.882000 220.831300 -101.153194 2.892290 -3.201136 -0.000001 0.000000 0.005543 -4.411705 -0.002134 0.057855 14.678964 0.481724 1.606948 11.364857 0.842657 1.781831 -8.666768 0.271328 0.890777 -0.078795 1.839032 -2.200073 4.689256 2.745755 -1.967407 19.021384 -2.307430 -3.302286 -2.832654 0.375193 0.366773 4.547884 4.366377 8.212616 6.356596 -11.533176 12.999689 -7.491561 -6.331509 -0.586639 1.690143 -0.291937 0.058367 -15.481988 -0.638996 24.202485 37.509609 -9.676121 -0.114356 35.957442 -14.560087 -15.717151 0.000005 0.000002 0.000002 0.006990 -0.001984 -0.000889 -11.749357 -5.607284 1.602346 4.914251 1.297578 -12.357429 -9.193259 -2.202909 -0.982156 13.763510 1.848700 0.165773 -0.000010 -0.000005 -0.000002 57.557137 -5.879938 -5.212096 -24.643685 -9.834865 -7.845909 -10.817966 -7.518994 -1.652665 33.389520 8.297004 -1.674147 -16.335138 -2.166639 -6.676085 5.077423 0.477534 0.179830 -0.313272 2.210423 -5.798485 0.000009 -0.000005 -0.000001 -1.049701 6.322281 14.975907 42.879439 -10.309505 2.989741 -25.278778 7.664246 -2.613801 9.266492 -14.269101 0.520507 0.269054 1.201174 -3.202260 -0.000001 -0.000004 -0.000004 0.009976 -0.008328 0.010775 +-1.540800 119.636800 215.894900 -99.799122 3.240430 -1.706622 -0.000000 0.000000 0.005543 -7.699598 -0.007212 0.197539 14.916672 0.245909 1.689218 12.869624 0.594805 1.524956 -7.596030 0.223885 0.274605 -0.122490 2.619131 -2.695601 4.665941 2.682332 -2.151324 18.928216 -2.778428 -3.984348 -2.832660 0.375193 0.366773 4.531625 4.347846 8.189019 6.323992 -11.480249 12.942786 -6.860861 -6.292618 -0.408253 9.179573 -0.044003 1.563300 -14.900252 2.603546 13.165588 33.580243 -8.694328 -0.401690 30.427192 -6.429745 -11.348399 0.000010 0.000002 -0.000002 0.006979 -0.001984 -0.000886 -16.252500 -5.001583 2.823243 6.064780 1.198103 -14.507697 -11.608350 -2.751202 -1.296850 18.733597 2.056014 0.094358 -0.000008 -0.000006 0.000004 59.857367 -8.672452 -7.382611 -23.903867 -11.302778 -9.839191 -16.477205 -8.671022 -3.900211 36.461944 8.974132 -2.063537 -17.849629 -2.489731 -6.875418 7.457341 1.566543 0.109378 -0.314618 2.225436 -5.837593 0.000005 -0.000001 -0.000000 5.786042 5.151572 13.445311 33.397409 -8.298765 1.675107 -12.678849 4.139379 -3.592614 -2.240328 -11.531046 -1.241867 0.282656 1.254739 -3.346165 -0.000001 -0.000001 0.000003 0.009989 -0.008330 0.010783 +-3.091200 118.190200 210.625200 -98.762568 3.614644 -0.236661 -0.000000 0.000000 0.005543 -10.752425 0.004963 0.274355 15.041299 0.053938 1.701380 14.394175 0.345678 1.309142 -6.595779 0.161031 -0.221487 -0.180511 3.403115 -3.161913 4.767152 2.581634 -2.285290 19.317874 -3.203716 -4.545380 -2.811681 0.375327 0.366636 4.515375 4.329337 8.165400 6.276935 -11.441535 12.877118 -5.198641 -6.180179 0.061108 15.111823 -0.337087 2.524109 -9.203244 4.701360 0.043619 19.123584 -4.942436 -0.860308 29.299582 -0.542763 -3.549164 0.000006 0.000004 0.000005 0.006981 -0.001983 -0.000888 -20.362361 -4.519513 3.943372 5.040167 1.125306 -16.670456 -8.717409 -2.093236 -0.922848 20.363282 1.649343 -0.014284 -0.000007 -0.000002 -0.000009 61.514378 -11.289894 -9.187536 -23.319634 -12.650064 -11.529714 -21.967022 -9.492278 -6.157110 39.199241 9.557389 -2.440394 -19.187557 -2.761212 -7.061250 10.101004 2.705527 -0.038148 -0.315977 2.240442 -5.876709 0.000008 -0.000003 -0.000001 14.051844 3.497625 11.679171 21.196118 -5.414089 0.501906 -3.320851 1.548148 -3.970708 -8.733068 -9.604544 -2.034575 0.307763 1.352036 -3.607852 -0.000003 -0.000002 -0.000001 0.009985 -0.008328 0.010781 +-4.440100 116.774100 204.911200 -98.351189 3.939199 1.016206 0.000001 -0.000001 0.005542 -12.896306 0.017998 0.351641 14.898241 -0.076787 1.683913 15.706964 0.138637 1.171332 -5.777712 0.115330 -0.610182 -0.267262 4.193274 -3.583722 5.026542 2.411375 -2.330013 20.393147 -3.550235 -4.822762 -2.790706 0.375461 0.366497 4.499102 4.310810 8.141777 6.229918 -11.402747 12.811477 6.199319 -4.789108 3.663483 8.248830 -2.293297 0.932731 -4.060763 4.443761 -10.864511 6.192282 -1.564789 -0.458615 10.916485 0.444696 4.944029 0.000006 0.000002 0.000003 0.006986 -0.001984 -0.000889 -23.870121 -4.133835 4.895823 4.043414 1.130250 -18.574409 -5.948588 -1.444972 -0.595754 21.831136 1.407392 -0.144351 -0.000010 -0.000005 0.000001 62.481607 -13.492499 -10.594785 -22.928593 -13.897838 -12.951434 -26.617766 -9.904375 -8.042491 40.860077 9.901514 -2.682362 -20.002484 -2.922438 -7.194808 13.069911 3.815457 -0.277038 -0.317299 2.255463 -5.915839 -0.000000 -0.000002 -0.000002 13.509848 1.971385 10.106086 20.129206 -5.149848 0.429036 -2.785582 1.430047 -3.989600 -15.715825 -6.803726 -2.887717 0.310294 1.361762 -3.634026 -0.000001 -0.000004 -0.000001 0.009984 -0.008329 0.010785 +-5.551000 115.834100 199.006600 -99.188726 4.058890 1.760095 0.000003 0.000000 0.005543 -13.200305 0.011431 0.855727 14.644139 -0.235260 1.799406 16.353626 -0.027878 0.932493 -5.259912 0.125789 -1.037570 -0.373042 4.934683 -3.942174 5.456562 2.127682 -2.239796 22.234861 -3.730988 -4.738013 -2.797688 0.375416 0.366541 4.489105 4.304569 8.120223 6.213141 -11.363532 12.753945 8.276730 -4.465702 4.272057 9.129618 -3.024754 0.952956 2.887313 1.354061 -16.370420 -11.600924 2.749539 1.295823 -1.648366 -5.346470 7.006802 0.000003 0.000004 0.000002 0.006989 -0.001993 -0.000886 -26.593454 -3.849710 5.642272 3.089572 1.204042 -20.105089 -3.333178 -0.817835 -0.315540 23.088782 1.267914 -0.264629 -0.000008 -0.000002 -0.000002 63.083258 -14.885882 -11.560127 -22.785586 -15.084060 -14.164915 -28.918416 -10.029536 -9.012558 40.305681 9.787489 -2.600493 -19.728474 -2.860466 -7.220318 16.193069 4.802041 -0.581724 -0.318638 2.270472 -5.954936 -0.000000 -0.000005 -0.000004 12.345761 1.017551 9.023400 20.827287 -5.322917 0.476160 -3.129484 1.505530 -3.972825 -21.685941 -4.202745 -3.174015 0.308389 1.354465 -3.614386 -0.000003 -0.000005 -0.000004 0.009980 -0.008333 0.010781 +-6.655800 114.619400 193.038500 -101.426760 4.042601 2.666828 0.000002 -0.000001 0.005542 -12.259448 0.025917 1.345448 14.452588 -0.372531 1.865052 16.705854 -0.204861 0.667242 -4.895850 0.137377 -1.506631 -0.487306 5.503964 -4.192027 6.105017 1.862738 -2.038202 25.111139 -3.727640 -4.277213 -2.776712 0.375548 0.366409 4.479101 4.298320 8.098664 6.195054 -11.331251 12.715955 9.041322 -4.358238 4.451822 4.979593 -2.722416 0.222028 2.816206 1.367262 -16.332342 -11.600931 2.749535 1.295831 2.578536 -5.096273 7.337100 -0.000001 0.000003 -0.000004 0.006990 -0.001978 -0.000888 -28.520572 -3.670001 6.161089 0.549334 1.532251 -21.388937 3.061841 0.767202 0.247780 21.831528 0.622626 -0.404758 -0.000002 -0.000004 -0.000002 62.198571 -15.857396 -12.114773 -22.561677 -15.169961 -15.091544 -29.857970 -10.005386 -9.905397 39.370003 9.593118 -2.464812 -19.272412 -2.735228 -7.284392 19.557068 5.813924 -0.986352 -0.322333 2.313020 -6.065763 0.000007 0.000000 -0.000002 6.574422 1.186128 7.932005 31.076261 -7.772621 1.405166 -8.027015 2.731402 -3.663407 -18.999411 -4.120686 -2.723401 0.276460 1.230395 -3.280749 -0.000001 -0.000005 -0.000002 0.009975 -0.008329 0.010790 +-7.754500 112.403700 187.007000 -105.821047 3.869908 3.670175 -0.000002 0.000000 0.005543 -10.156598 0.030292 1.793321 14.724194 -0.543641 1.935253 16.945375 -0.384516 0.402513 -4.547174 0.097507 -1.977627 -0.522397 5.997347 -3.972077 6.884344 1.509934 -1.807153 28.662479 -3.798788 -3.829381 -2.755715 0.375685 0.366269 4.469091 4.292061 8.077113 6.148622 -11.290018 12.643939 9.767265 -4.238329 4.658745 1.478664 -2.077729 -0.340813 1.382591 2.162120 -16.307608 11.968292 -3.062484 -0.732359 4.802907 -4.473218 7.829617 0.000004 0.000003 0.000000 0.006986 -0.001993 -0.000885 -31.586104 -3.454727 6.349901 -2.069179 3.689515 -29.934851 15.483781 3.984524 0.824616 25.953985 2.635461 5.767292 -0.000006 -0.000004 -0.000003 60.174397 -16.158491 -12.163436 -22.248059 -14.477296 -15.163836 -29.703605 -10.542982 -10.036508 39.628129 9.646979 -2.501926 -19.385624 -2.539018 -8.393683 23.389139 6.881958 -1.528570 -0.349543 2.661135 -6.971978 0.000008 -0.000002 -0.000004 2.260345 1.782095 6.770099 42.301093 -10.193846 2.900253 -13.391916 4.015198 -3.061226 -16.012842 -4.029464 -2.290463 0.230794 1.047606 -2.790246 -0.000001 -0.000005 -0.000006 0.009974 -0.008323 0.010783 +-8.950900 109.620300 181.404000 -110.771748 3.587968 4.724148 -0.000002 0.000001 0.005544 -8.214631 0.044050 2.198989 15.108778 -0.741585 1.910492 17.464140 -0.655383 0.089391 -3.996225 0.044599 -2.385698 -0.560074 6.516984 -3.213195 7.647529 1.047433 -1.597561 32.312430 -4.045384 -3.591985 -2.734699 0.367140 0.355160 4.458813 4.255879 8.046548 6.102260 -11.248745 12.571960 10.412909 -4.121698 4.860216 -1.670971 -1.318888 -0.849656 0.380266 2.707502 -16.284749 28.290736 -7.340617 -0.679940 7.577900 -4.015713 8.237061 0.000006 0.000004 0.000001 0.006995 -0.001987 -0.000887 -37.077357 -3.879336 5.915686 -1.879383 9.003134 -40.333223 31.030840 8.045836 0.551496 32.789761 9.598637 11.976518 -0.000007 -0.000002 -0.000007 57.043961 -15.914631 -11.956439 -21.910709 -13.273762 -14.641006 -29.275195 -11.707072 -9.343759 40.518280 9.831314 -2.631758 -19.779695 -2.181806 -10.609552 27.210963 7.971412 -2.197670 -0.387240 3.353438 -8.771797 0.000004 0.000000 -0.000006 -0.903634 2.574267 5.498733 52.745234 -12.124263 4.685251 -18.346383 5.128111 -2.242025 -13.057369 -3.799265 -1.889359 0.179237 0.832640 -2.214946 0.000001 -0.000002 -0.000003 0.009981 -0.008329 0.010778 +-10.049600 106.678200 176.150200 -115.770860 3.175770 5.739184 -0.000002 0.000000 0.005542 -6.600602 0.038955 2.444083 15.435719 -0.895013 1.807803 18.219321 -0.915457 -0.219859 -3.201171 -0.025492 -2.730326 -0.496571 6.953110 -2.311521 8.177567 0.437084 -1.360382 34.969541 -4.411377 -3.567132 -2.713648 0.358592 0.344052 4.454803 4.231943 8.018034 6.065692 -11.197983 12.505867 10.924561 -4.018738 5.040495 -4.477761 -0.399737 -1.263363 -0.462878 3.165003 -16.185612 42.502928 -10.885840 0.347170 10.368941 -3.677898 8.605391 0.000007 0.000004 -0.000006 0.006979 -0.001981 -0.000888 -43.656325 -4.459797 4.174531 9.115067 12.197110 -45.485611 27.919080 7.244396 0.694724 48.768715 16.367138 14.429604 -0.000008 -0.000007 0.000003 53.619724 -15.166584 -11.641129 -21.621906 -11.789539 -13.769196 -28.510051 -13.014607 -8.180998 41.089513 9.948451 -2.716568 -19.988123 -1.701749 -13.236870 30.960018 8.951614 -2.924447 -0.403719 4.182262 -10.925115 0.000003 -0.000002 -0.000006 -3.274769 3.622416 4.211285 61.949823 -13.521366 6.521763 -22.712464 6.060289 -1.293906 -10.077071 -3.527110 -1.534900 0.127099 0.604912 -1.607195 -0.000005 -0.000006 -0.000003 0.009961 -0.008325 0.010785 +-10.830900 104.157400 170.912300 -120.124627 2.640305 6.631785 -0.000001 0.000000 0.005542 -5.301792 0.040918 2.444305 15.668912 -0.969643 1.645954 18.959751 -1.122141 -0.413626 -2.420682 -0.103332 -2.969119 -0.284662 7.227641 -0.761431 8.332267 -0.125966 -1.329579 35.764520 -5.279038 -4.152594 -2.692689 0.363059 0.349404 4.428626 4.222208 7.977339 6.030149 -11.142583 12.426862 11.267702 -3.945130 5.169666 -7.371075 0.630654 -1.698743 -1.075586 3.495917 -15.976299 54.106778 -13.484385 1.812954 13.472678 -3.302233 8.954428 0.000009 0.000001 -0.000004 0.006984 -0.001987 -0.000889 -47.843829 -4.963655 1.373714 19.573570 16.557296 -48.685838 28.984966 7.519996 0.650611 59.232411 21.701350 17.597532 -0.000009 -0.000005 -0.000001 50.749839 -14.085482 -11.276148 -21.427171 -10.278736 -12.782139 -27.111230 -14.547007 -5.631950 39.868313 9.696933 -2.536679 -19.244215 -0.794773 -16.857803 34.550396 9.710681 -3.635959 -0.371577 5.392672 -14.074816 0.000007 0.000000 -0.000003 -5.340050 4.969308 3.008487 69.155146 -14.396253 8.098773 -26.122487 6.723203 -0.286253 -6.952320 -3.330929 -1.240943 0.077376 0.376644 -0.999664 -0.000008 -0.000003 -0.000004 0.009974 -0.008326 0.010778 +-11.105600 102.027100 165.658500 -123.712315 2.040649 7.354854 -0.000001 0.000000 0.005544 -4.219420 0.024359 2.081129 15.828868 -0.931118 1.374746 19.302019 -1.197565 -0.425631 -1.983103 -0.173949 -2.998067 0.046595 7.309636 0.987147 8.198142 -0.458726 -1.487601 34.972754 -6.286875 -5.081535 -2.657752 0.367609 0.354671 4.414729 4.207022 7.931765 5.964193 -11.077935 12.343129 11.394500 -3.919135 5.213887 -9.306865 1.787115 -1.905731 -1.390509 3.647382 -15.910512 62.364695 -15.108512 3.160666 16.631063 -3.080685 9.253183 0.000008 0.000002 -0.000008 0.006974 -0.001990 -0.000888 -43.533269 -4.597426 -1.441972 20.736062 20.664775 -46.969473 39.402316 10.140103 -0.048074 52.115467 21.069520 23.418354 -0.000011 -0.000008 0.000001 49.299694 -12.963133 -10.861481 -21.314107 -9.017399 -11.917714 -25.094743 -15.737464 -2.068013 36.924112 9.073974 -2.125216 -17.590174 0.383412 -20.828619 37.911098 10.153708 -4.172248 -0.249753 6.797210 -17.751990 0.000002 -0.000009 0.000001 -7.404678 6.642525 2.079243 74.658769 -14.927985 9.368923 -28.744694 7.178591 0.742551 -3.699264 -3.356416 -1.011157 0.032075 0.157709 -0.418473 -0.000003 -0.000005 -0.000004 0.009982 -0.008334 0.010779 +-10.122900 100.128800 160.880900 -125.865557 1.377805 7.574734 -0.000004 0.000000 0.005542 -4.173630 0.019280 1.095120 16.139966 -0.752382 1.031611 19.358506 -1.081663 -0.065576 -2.001215 -0.256837 -2.672619 0.674583 7.308542 2.727920 7.674259 -0.425888 -1.867910 32.257884 -7.123550 -6.330314 -2.622724 0.359143 0.343478 4.385024 4.161274 7.881012 5.887191 -10.978482 12.201918 9.925376 -4.169084 4.774578 -10.664196 3.633028 -1.841481 0.784027 2.725272 -6.610742 63.947673 -15.395366 3.445062 18.526818 -5.677250 0.727362 0.000009 0.000005 0.000000 1.202325 -0.115343 -0.271420 -32.943645 -3.607327 -3.289032 15.302911 20.720212 -41.378717 47.618351 12.071941 -0.927828 37.584745 14.163779 27.913684 -0.000005 -0.000004 -0.000005 49.082617 -11.463054 -9.971012 -21.303095 -7.939709 -10.936498 -23.486900 -15.038376 0.456473 33.424470 8.304837 -1.678379 -15.758486 1.175473 -22.628152 40.731027 10.025853 -4.264921 -0.151149 7.518972 -19.657144 0.000008 0.000000 -0.000007 -10.000489 8.925506 2.143938 78.814434 -15.248780 10.357921 -30.729830 7.479765 1.762859 -0.727668 -4.059531 -0.817618 -0.011008 -0.061671 0.162551 -0.000002 -0.000003 0.000001 0.009982 -0.008329 0.010782 +-8.487000 98.303700 156.230300 -126.937278 0.813835 7.401203 0.000003 0.000001 0.005543 -4.911254 0.003220 -0.093570 16.361344 -0.579604 0.595585 19.036471 -0.990454 0.318817 -2.532452 -0.402375 -2.178664 1.385357 7.240474 4.389353 6.946743 0.148048 -2.407312 28.712988 -7.465851 -7.496396 -2.608690 0.350552 0.332416 4.352808 4.119576 7.817221 5.810451 -10.878835 12.060893 6.425011 -4.733152 3.677879 -8.390624 5.708386 -0.864613 0.909155 2.481912 5.851094 72.017556 -16.724809 5.011495 19.084443 -9.033511 -9.969642 0.000003 0.000005 0.000002 4.195345 -0.423978 -0.938460 -21.652379 -2.255563 -4.093898 10.677533 17.228467 -35.459969 45.773582 11.651012 -0.706165 28.139001 6.583174 28.361181 -0.000007 -0.000004 -0.000001 48.652817 -9.545296 -8.488320 -21.264559 -6.826239 -9.600066 -31.283878 -13.710702 -2.142175 41.424059 10.016632 -2.766770 -11.258825 -0.944522 -20.854919 38.146757 8.866019 -3.271328 -0.265192 6.664659 -17.403433 0.000014 -0.000003 -0.000005 -13.310905 11.383740 2.957389 82.077188 -15.451148 11.148836 -32.284914 7.666443 2.798388 2.190464 -5.154080 -0.560092 -0.050540 -0.274062 0.723835 0.000008 -0.000005 -0.000004 0.009971 -0.008329 0.010788 +-6.704700 97.412600 150.770100 -126.347819 0.374758 7.201026 -0.000000 0.000000 0.005541 -6.062130 -0.021568 -1.450041 16.297379 -0.386480 0.008834 18.217452 -0.930779 0.663264 -3.482829 -0.571503 -1.586066 1.991136 7.113584 5.698872 6.031072 0.941737 -2.881252 24.544882 -7.165154 -8.315512 -2.594689 0.350635 0.332329 4.338873 4.104425 7.771623 5.751113 -10.813850 11.964274 2.228748 -5.339970 2.354907 -2.468210 7.539135 2.652629 -0.736418 1.616780 9.314110 98.451692 -19.350841 11.151530 17.082049 -9.671107 -13.045104 0.000004 0.000002 0.000001 8.081171 -0.876495 -1.780034 -10.885827 -0.472773 -3.916013 7.363753 12.381042 -30.189183 36.973955 9.543695 0.157487 21.904681 0.051393 25.855973 -0.000007 0.000000 0.000000 47.545985 -7.585347 -6.915337 -21.089488 -5.709216 -8.112925 -41.584138 -12.384029 -6.078828 55.630979 12.594643 -5.236902 -9.602377 -2.952943 -17.832838 34.078676 7.552036 -2.092588 -0.371705 5.390252 -14.068516 0.000009 0.000000 0.000000 -17.417712 13.731009 3.691824 82.714745 -15.485565 11.304637 -32.588762 7.626462 3.687449 5.449632 -6.326140 -0.188724 -0.086714 -0.479400 1.265418 0.000002 -0.000003 -0.000005 0.009974 -0.008329 0.010778 +-5.343500 97.601800 143.992600 -124.213599 0.041047 7.355927 -0.000002 0.000000 0.005542 -7.214369 -0.047608 -2.897497 15.837424 -0.147659 -0.825617 17.020703 -0.899289 0.849686 -4.718162 -0.745407 -0.971616 2.844568 6.955670 6.529136 4.908577 1.449327 -3.080145 19.685230 -6.381806 -8.817893 -2.559661 0.339865 0.340794 4.300941 4.060692 7.693762 5.645988 -10.697538 11.799532 -1.290242 -5.800337 1.227748 3.354850 8.677189 7.817295 3.072206 -0.609378 8.672159 119.106041 -19.407185 16.400789 13.602207 -9.112947 -14.944053 0.000009 0.000001 -0.000002 11.960556 -1.384953 -2.589137 -1.087215 1.637093 -3.242059 6.158384 7.567622 -25.682450 22.348136 5.790333 0.840885 18.151457 -4.228341 21.617477 -0.000009 -0.000004 -0.000003 45.712578 -6.010216 -5.810453 -20.629196 -4.621916 -6.663262 -45.699727 -12.159052 -7.929255 67.260377 14.185542 -7.673798 -17.024284 -3.698540 -16.648065 34.050320 6.618146 -1.278067 -0.397878 4.711788 -12.301736 0.000007 -0.000002 -0.000006 -21.962554 15.776094 3.509774 80.317984 -15.347476 10.720994 -31.440139 7.326187 4.394500 9.147596 -7.143304 0.257560 -0.120932 -0.685072 1.806884 -0.000001 -0.000004 -0.000003 0.009973 -0.008328 0.010784 +-4.940700 100.128800 135.532500 -120.414992 -0.084844 8.129040 -0.000000 -0.000001 0.005543 -7.583223 -0.065106 -4.268086 15.079270 0.044668 -1.831848 14.790168 -0.997255 0.792960 -6.335715 -0.870529 -0.391359 2.653156 6.834128 6.785566 3.878260 1.305845 -2.853854 15.478636 -5.337982 -8.641793 -2.524616 0.329104 0.349269 4.262964 4.017023 7.615881 5.541253 -10.580934 11.635073 -2.776564 -5.988448 0.752061 7.107707 8.461278 11.215053 9.415654 -2.547346 6.885531 119.154849 -19.405203 16.413097 14.619240 -8.743714 -16.063370 0.000007 0.000004 -0.000005 14.948532 -1.813866 -3.188795 4.124783 3.440183 -1.986028 4.644039 4.100151 -21.825458 9.914373 2.526816 0.652298 1.685963 -9.495180 15.407351 -0.000005 -0.000002 0.000001 42.923426 -4.949346 -5.195746 -20.100828 -3.626451 -5.382025 -45.873852 -12.308964 -8.655723 72.783220 14.760348 -8.930524 -24.994809 -3.889495 -15.728295 34.849141 5.476599 -0.467227 -0.403703 4.243872 -11.085219 0.000003 -0.000002 -0.000003 -25.365253 16.939118 1.390429 72.322961 -14.717036 8.823783 -27.635541 6.539847 4.755582 13.039477 -7.250351 0.587499 -0.153223 -0.891060 2.348257 -0.000000 -0.000004 0.000000 0.009975 -0.008335 0.010781 +-4.775900 104.749400 126.580500 -115.350286 0.014718 9.190568 -0.000001 -0.000001 0.005543 -7.532946 -0.093946 -5.932318 14.386793 0.401701 -2.839020 11.992164 -1.053004 0.977251 -7.923737 -0.899552 0.303991 1.214339 6.705904 6.789994 2.880038 -0.625122 -1.956342 11.513926 -4.255097 -8.086336 -2.510622 0.325995 0.333877 4.224900 3.973396 7.537970 5.446762 -10.454773 11.476656 -0.967634 -5.774717 1.329187 7.471503 7.263561 11.787566 13.851161 -3.412610 5.848909 111.252136 -19.596567 14.405376 16.676962 -8.165018 -17.073117 0.000007 0.000003 -0.000005 16.142539 -1.994062 -3.422280 6.646236 4.469136 -0.811554 2.952932 1.800657 -18.394236 0.187109 0.046472 0.016286 -9.718050 -9.425588 10.001051 -0.000008 -0.000004 -0.000004 39.472360 -4.110711 -4.800519 -19.490560 -2.714192 -4.129378 -42.906091 -11.815307 -9.066819 73.297178 14.807690 -9.050120 -31.892554 -4.078790 -13.704868 34.920643 4.314923 0.071897 -0.395746 3.612686 -9.445333 0.000013 -0.000003 0.000002 -26.550026 17.046445 -2.063386 58.933153 -13.096992 5.895821 -21.286175 5.192117 4.864950 16.248392 -7.113359 0.766554 -0.188499 -1.132158 2.980844 -0.000002 -0.000003 -0.000003 0.009973 -0.008329 0.010784 +-4.769700 110.456600 117.437900 -109.610309 0.416310 10.338743 0.000001 0.000000 0.005542 -7.103077 -0.123697 -7.778465 14.066758 0.809009 -3.707227 9.533135 -1.266013 1.300985 -9.371645 -0.923409 0.966762 -0.376794 6.608479 6.804952 1.701259 -3.335041 -0.817102 6.776791 -3.054591 -7.190542 -2.496613 0.322884 0.318487 4.186800 3.929816 7.460033 5.342512 -10.318923 11.319246 2.388704 -5.360741 2.406884 5.163956 5.888828 11.105492 14.215715 -3.424414 5.543457 109.106623 -19.603314 13.857358 11.192038 -5.250848 -17.991765 0.000006 0.000004 -0.000002 13.238299 -1.564477 -2.848190 8.266859 4.304855 0.238056 -0.441943 0.189071 -15.883668 -4.520261 -1.104171 -0.439212 -4.509318 -5.470703 7.359097 -0.000008 -0.000002 -0.000002 35.839922 -3.590585 -4.662125 -18.317044 -1.734144 -2.706015 -38.527533 -8.324746 -11.744947 69.927053 14.478082 -8.273826 -35.850113 -5.419370 -7.792613 33.616016 3.693021 0.099679 -0.294881 2.017442 -5.295401 0.000002 0.000000 -0.000008 -25.355718 15.612219 -6.422407 40.731205 -9.875076 2.663232 -12.643763 3.204153 4.914830 18.858690 -6.908642 0.840198 -0.225263 -1.406030 3.698107 -0.000006 -0.000002 -0.000002 0.009974 -0.008329 0.010781 +-4.830800 116.218600 108.358900 -103.770071 1.104183 11.361023 0.000002 -0.000001 0.005542 -6.346598 -0.151851 -9.540736 14.189820 1.063609 -4.325381 7.802545 -1.756505 1.566052 -10.760928 -1.073507 1.476593 -1.384340 6.496203 6.757828 0.619430 -5.825566 0.280613 2.311437 -1.943688 -5.767852 -2.461552 0.308913 0.311659 4.142219 3.874126 7.379972 5.238684 -10.182775 11.162139 4.185102 -5.105424 2.992971 2.540524 5.193155 10.373212 10.638086 -2.847790 5.442794 117.958159 -19.450963 16.111011 -3.471952 0.392371 -17.322307 0.000008 0.000004 -0.000004 6.847193 -0.726537 -1.515983 12.905903 3.947644 1.061478 -7.541352 -1.363329 -16.388923 -2.546911 -0.626697 -0.236876 -1.708620 -3.084822 6.478827 -0.000009 -0.000003 -0.000002 32.527512 -3.478025 -4.843667 -16.123565 -0.546653 -0.911519 -33.913839 -5.858262 -14.442206 64.196251 13.815408 -7.001686 -35.197239 -6.446342 -3.122492 30.375118 3.872732 -0.169633 -0.138385 0.794349 -2.094436 0.000006 -0.000003 -0.000009 -20.830175 11.641645 -11.210960 15.992739 -4.112132 0.193344 -0.832855 0.307024 5.141597 21.072805 -6.740115 0.858318 -0.258607 -1.680337 4.415275 0.000003 -0.000003 -0.000007 0.009979 -0.008333 0.010785 +-4.836900 120.936900 99.565500 -98.420451 1.952566 12.018484 -0.000000 0.000000 0.005541 -5.841874 -0.172398 -11.009253 14.458172 1.175022 -4.614222 6.901487 -2.303341 1.825884 -11.999486 -1.323350 1.868788 -1.421969 6.335157 6.670483 -0.135400 -7.557632 1.108434 -0.894536 -1.195148 -4.292047 -2.426580 0.307960 0.321296 4.097561 3.818494 7.299866 5.140492 -10.069790 10.998491 1.717398 -5.459678 2.209308 8.550468 4.238919 7.810971 7.275451 0.019055 0.284217 108.388292 -19.601255 13.673876 -16.698044 5.095865 -9.098755 0.000004 0.000002 -0.000002 0.438956 -0.042294 -0.098909 10.787363 2.545902 0.848873 -5.853029 -0.920858 -15.278971 -2.511237 -0.618000 -0.233363 1.166692 -2.085534 5.273116 -0.000008 -0.000005 -0.000001 30.520629 -4.050012 -5.740666 -12.798325 1.399676 2.492481 -27.746026 -6.033811 -16.203871 56.538161 12.736528 -5.415063 -30.813668 -5.487475 -2.447142 25.743627 5.057565 -0.573154 -0.132000 0.753746 -1.987714 -0.000002 -0.000003 -0.000006 -15.438318 6.925424 -15.322865 -3.963830 1.015727 0.129896 5.653361 -1.854604 6.755036 27.069732 -7.085877 1.195411 -0.320519 -2.292675 6.012545 -0.000001 -0.000005 -0.000009 0.009973 -0.008323 0.010777 +-4.653800 123.476100 91.184800 -94.081308 2.741847 12.145310 -0.000000 0.000000 0.005542 -6.426741 -0.188565 -12.016060 14.797238 1.289007 -4.590483 6.911508 -2.589586 2.180015 -12.984855 -1.570476 2.220067 -0.286721 6.074269 6.519013 -0.397837 -8.186802 1.465839 -2.028768 -0.923084 -3.519102 -2.412583 0.306888 0.331047 4.059283 3.775075 7.221829 5.041582 -9.961117 10.848053 -0.757005 -5.760386 1.403050 13.776201 2.543338 4.211449 2.700858 2.412447 -6.632053 92.141185 -18.978444 9.585975 -17.665425 2.611150 0.660476 0.000006 0.000003 0.000002 -2.479166 0.215433 0.568659 4.337049 1.852483 1.325950 -5.262747 -0.285824 -14.860938 1.848496 0.461510 0.154455 2.562219 -2.041444 3.877573 -0.000009 -0.000006 0.000001 28.278122 -4.652450 -6.628410 -8.801780 3.223358 5.683468 -18.339743 -5.972952 -19.297646 46.138396 10.942754 -3.515268 -24.508770 -4.044558 -1.647446 20.948040 6.125166 -0.662930 -0.122746 0.695796 -1.835333 0.000009 0.000000 -0.000003 -21.815708 10.276810 -15.732519 12.393602 -3.195547 0.049725 -9.556142 0.609624 8.534414 34.603593 -7.326856 1.556625 -0.366525 -2.926558 7.662075 -0.000002 -0.000004 -0.000000 0.009985 -0.008327 0.010769 +-3.188800 123.427300 82.772400 -91.400296 3.233766 11.300306 -0.000000 0.000000 0.005547 -7.992628 -0.197412 -12.547239 15.127945 1.587759 -3.838120 7.885899 -2.279455 2.878487 -13.618864 -1.654880 2.136686 2.182123 5.688857 5.979442 -0.271363 -7.931514 1.454674 -1.507240 -0.943843 -3.448070 -2.398493 0.288468 0.318852 4.018526 3.735760 7.130773 4.942923 -9.824180 10.707649 0.372226 -4.711555 2.161944 5.825476 -0.373502 1.017441 2.947608 2.137399 -9.228570 82.418212 -18.087277 7.277444 -8.429883 1.423681 5.635414 0.000006 0.000005 0.000001 -1.867583 0.164255 0.427732 -5.047209 2.348635 3.001694 -1.307940 0.015795 -15.030224 -4.540121 -1.108938 -0.441333 12.305439 -0.881942 3.005709 -0.000010 -0.000007 -0.000003 22.460367 -4.384152 -6.965261 -4.468343 4.581737 6.354414 -7.102474 -5.913924 -21.138867 34.646579 8.576805 -1.829090 -17.761429 -2.377810 -0.978647 16.458659 5.396839 -0.183015 -0.109267 0.613080 -1.617703 0.000005 -0.000003 -0.000001 -25.340910 13.668445 -13.494930 33.007309 -8.211195 1.628257 -28.759560 3.458492 10.169147 41.119860 -7.708881 2.146959 -0.370080 -2.989257 7.825088 -0.000005 -0.000004 -0.000005 0.009978 -0.008338 0.010788 +-0.344400 121.846400 74.137800 -89.952671 3.459163 9.125585 -0.000000 0.000000 0.005545 -10.058173 -0.194055 -12.316017 15.152356 1.907607 -2.385387 9.642013 -1.383648 3.835351 -13.660512 -1.452126 1.612071 5.192348 5.214974 4.924462 -0.045513 -7.409517 1.364185 -0.532682 -1.005899 -3.429826 -2.363548 0.295291 0.304511 3.977717 3.696502 7.039693 4.845737 -9.682411 10.554548 1.509565 -3.688300 2.947227 -2.230805 -1.974841 -1.092338 3.567115 1.998181 -9.804524 80.579013 -17.876441 6.859361 -5.886946 0.972332 7.835239 0.000006 0.000002 -0.000003 -0.726038 0.064701 0.166106 -13.625423 2.592899 4.595633 -0.583669 0.393394 -15.563508 -3.033391 -0.745092 -0.285245 16.675299 -1.550589 2.121742 -0.000011 -0.000003 -0.000004 13.609544 -3.447941 -6.253709 -0.271006 6.236480 5.922822 2.942312 -5.476993 -19.532316 25.155003 6.379853 -0.814935 -12.636491 -1.085808 -0.557262 12.105820 3.174066 0.441054 -0.095464 0.530420 -1.400062 0.000007 -0.000001 -0.000001 -22.631528 14.814603 -10.595274 46.683660 -11.045545 3.606641 -43.619740 5.038448 11.824304 44.095206 -8.504788 2.858897 -0.365636 -2.911512 7.622954 -0.000002 -0.000004 -0.000003 0.009988 -0.008335 0.010783 +2.908900 119.771100 65.566700 -89.305213 3.486396 6.772414 -0.000000 0.000000 0.005544 -12.278616 -0.187015 -12.084788 14.453997 2.203615 -1.038509 11.782246 -0.207630 5.020567 -12.955333 -1.092749 1.145043 8.226875 4.670486 3.468193 0.344441 -6.643391 1.259531 1.113848 -1.083111 -3.326535 -2.328518 0.285651 0.303185 3.944911 3.635454 6.954728 4.748902 -9.568393 10.391961 0.402947 -4.290265 2.374139 -5.712418 -1.233131 -1.711202 3.060589 2.231196 -3.727014 82.821556 -18.131743 7.370026 -1.219082 1.633365 3.017498 0.000006 0.000004 0.000003 -0.114826 0.009247 0.026806 -19.942083 2.176278 5.687702 -0.008101 0.746880 -16.132605 -1.568368 -0.387248 -0.142598 19.941156 -2.085249 1.475278 -0.000011 -0.000005 -0.000001 5.269528 -2.869804 -5.016566 3.427777 7.789044 5.469672 1.952402 -3.533762 -16.740758 25.042639 6.352791 -0.805131 -12.589966 -1.011722 -0.529862 -1.508628 -1.738102 0.690619 -0.095728 0.532003 -1.404229 0.000008 -0.000002 -0.000001 -16.016696 14.861377 -8.342351 52.304298 -12.049880 4.603048 -50.187277 5.560889 12.755492 41.571530 -9.719361 3.160157 -0.362796 -2.863865 7.499064 -0.000000 -0.000002 -0.000002 0.009987 -0.008333 0.010777 +5.765600 117.872800 57.614500 -89.277863 3.426372 4.435834 -0.000000 0.000000 0.005542 -14.481307 -0.179404 -11.496696 12.998378 2.251968 0.038785 13.990434 1.008306 6.077347 -11.346411 -0.657044 0.773689 10.728585 4.086444 1.769322 0.955290 -5.634977 1.134169 3.658149 -1.145647 -3.024726 -2.314479 0.275900 0.301968 3.912021 3.574457 6.869727 4.652431 -9.454129 10.229626 -1.660058 -5.393716 1.305464 -6.721297 0.207198 -1.636822 6.361541 1.739467 6.008059 75.122163 -17.174243 5.661493 9.621046 -0.676316 -6.639764 0.000006 0.000003 -0.000002 -2.684360 0.232271 0.616052 -20.177338 1.148104 5.322686 0.965762 0.980142 -16.459815 -1.863690 -0.459693 -0.170633 22.002903 -2.144281 1.011436 -0.000016 -0.000004 0.000003 -2.446854 -2.756210 -3.598032 6.100129 9.198864 5.227476 2.184407 -1.793083 -13.939043 22.409731 5.712719 -0.590764 -11.314775 -0.686064 -0.429822 -14.029040 -6.005782 -0.495946 -0.090950 0.503863 -1.330103 0.000008 -0.000003 0.000006 -9.727653 14.409221 -6.342585 52.451960 -12.074860 4.630515 -42.777307 6.071850 14.759212 28.761288 -13.082490 0.723591 -0.373202 -3.046956 7.975073 -0.000001 -0.000004 -0.000004 0.009981 -0.008329 0.010783 +7.407500 116.731300 50.837000 -89.783647 3.320108 2.305659 -0.000000 0.000000 0.005543 -15.940751 -0.160343 -10.083401 11.586519 2.034959 1.077022 15.466694 1.726128 6.550257 -9.552224 -0.224542 0.181879 12.420648 3.511767 -0.036712 1.674944 -4.371726 0.992040 6.655184 -1.107557 -2.480713 -2.300439 0.266150 0.300754 3.854716 3.524948 6.794131 4.554864 -9.318444 10.096831 -2.777281 -5.987124 0.733725 -8.380487 1.241042 -1.801262 6.717237 2.101708 12.948738 75.122163 -17.174244 5.661492 13.882698 -3.287106 -12.816123 0.000007 0.000003 0.000001 -5.256089 0.428625 1.214721 -19.332922 0.068274 4.851422 0.425017 1.131746 -17.156236 0.344757 0.085667 0.029920 22.133059 -2.273923 0.805350 -0.000011 -0.000006 0.000003 -7.901596 -2.969392 -2.107854 7.171539 10.030111 5.201001 -4.320404 -0.930882 -11.814817 30.906220 7.733613 -1.386234 -15.464294 -1.653333 -0.737974 -11.204799 -6.421343 -0.493855 -0.106617 0.597107 -1.575650 0.000007 -0.000002 -0.000007 -2.742592 11.620829 -3.938621 45.178457 -10.759539 3.356782 -25.514498 6.474980 16.868400 10.841289 -15.269465 -4.842039 -0.400735 -3.845321 10.049452 -0.000001 -0.000005 -0.000004 0.009974 -0.008324 0.010791 +7.975200 116.261300 45.027700 -90.677393 2.881015 0.242830 -0.000000 0.000000 0.005543 -16.575098 -0.120468 -7.851998 10.591737 1.804095 2.095732 16.098686 1.991211 6.378392 -8.047070 0.227176 -0.506148 13.029284 2.969745 -1.791942 2.421534 -2.891510 0.802980 9.770789 -0.942774 -1.777144 -2.265479 0.267477 0.290766 3.823034 3.489112 6.701613 4.458784 -9.177942 9.951324 -2.777278 -5.987122 0.733724 -12.787379 2.086316 -2.330636 3.838449 1.880437 15.019567 101.295585 -19.464699 11.868513 16.078206 -5.139500 -13.046589 0.000008 0.000000 -0.000002 -3.895601 0.328110 0.896977 -23.304551 -0.725710 5.715483 -4.641516 1.347433 -18.517200 12.536654 3.211175 0.751096 21.025498 -2.592963 0.484255 0.000002 -0.000003 -0.000002 -9.130314 -2.892932 -0.348234 5.032935 9.298107 3.982256 -8.177029 -0.590067 -9.732769 35.381401 8.738611 -1.922477 -17.654285 -2.156167 -0.916069 -8.684806 -6.315537 -0.315030 -0.114212 0.643307 -1.697239 0.000006 -0.000002 -0.000007 8.297450 7.945815 -2.609954 29.280963 -7.357648 1.211095 -10.374677 5.087446 17.797636 0.118733 -14.173683 -8.499219 -0.390598 -4.963156 12.955597 -0.000002 -0.000006 -0.000001 0.009977 -0.008330 0.010782 +8.359700 115.950000 39.551700 -91.768449 1.973893 -1.899070 -0.000000 -0.000001 0.005544 -16.693865 -0.083804 -5.284753 9.796382 1.732981 3.121913 16.192007 2.169023 6.022420 -7.032479 0.722828 -1.165227 12.188420 2.488611 -3.312470 3.298533 -1.451848 0.613624 13.424270 -0.684492 -1.055130 -2.230506 0.268800 0.280778 3.781422 3.435198 6.605875 4.362730 -9.065232 9.796301 -2.777275 -5.987117 0.733720 -17.867264 4.055026 -1.862402 1.267702 0.733402 15.629143 140.971799 -17.544442 21.619611 17.559998 -6.747617 -11.871740 0.000008 0.000001 0.000001 -1.509043 0.133559 0.345357 -27.230764 -1.231124 6.640305 -9.813735 1.449223 -19.224522 24.716327 6.410766 0.796136 24.137069 -2.657031 -0.053197 -0.000005 -0.000003 0.000001 -9.008274 -2.333517 1.701180 -0.249586 7.388544 0.846771 -10.921961 -0.119740 -7.457454 38.097805 9.325054 -2.285416 -18.983193 -2.466084 -1.040143 -6.222085 -6.034180 -0.108856 -0.118118 0.667204 -1.760115 0.000004 -0.000003 -0.000002 9.836970 8.224634 -1.686343 26.217314 -6.634615 0.910197 -8.924103 4.706578 18.228349 -11.874818 -8.517612 -10.819808 -0.380157 -5.221116 13.627425 -0.000005 -0.000003 -0.000002 0.009993 -0.008341 0.010791 +8.463500 115.730300 34.345500 -92.949725 0.920933 -3.931486 -0.000001 0.000000 0.005542 -16.526075 -0.043373 -2.647596 9.025231 1.731240 4.053597 15.869869 2.292315 5.592173 -6.355886 1.190947 -1.723231 9.847677 2.300297 -4.103013 4.149871 -0.386077 0.236691 16.925327 -0.870435 -1.184685 -2.216469 0.259044 0.279565 3.727598 3.387134 6.514776 4.267320 -8.933582 9.648066 -1.986214 -5.902410 0.994764 -22.503983 5.569661 -0.163068 2.231079 -1.339738 15.434054 176.016051 -10.966836 27.497495 15.508346 -6.822401 -12.128153 0.000007 0.000006 -0.000004 -0.000782 -0.001271 0.000881 -27.448623 -1.615098 6.658926 -12.986967 1.458118 -19.208748 32.171311 8.336937 0.488066 29.511755 -3.262044 0.090116 -0.000009 -0.000002 0.000000 -8.349426 -1.542573 3.711367 -7.060697 5.011890 -2.910125 -13.079650 0.230520 -5.284765 39.850086 9.693144 -2.534026 -19.839727 -2.672916 -1.121477 -3.839344 -5.580829 0.122494 -0.119981 0.678705 -1.790367 0.000009 -0.000002 0.000001 12.138092 8.541917 -0.651393 21.098611 -5.390007 0.495045 -6.461201 4.081881 18.146568 -23.314016 -2.989101 -11.796890 -0.372272 -5.378602 14.037920 -0.000004 -0.000004 -0.000002 0.009976 -0.008329 0.010787 +8.188800 115.510500 29.313900 -94.121328 0.001703 -5.634528 -0.000000 0.000000 0.005543 -16.206523 -0.005302 -0.353267 8.286440 1.664354 4.705555 15.323992 2.265357 5.138400 -5.975817 1.474584 -1.936677 7.314006 2.211003 -4.643852 4.631456 0.488307 -0.260426 18.970273 -1.393022 -1.844974 -2.202430 0.249285 0.278356 3.677252 3.333037 6.443200 4.172291 -8.801680 9.500096 0.016144 -5.658860 1.645192 -26.174263 6.906853 2.580499 4.252901 -3.867746 14.121646 -146.222114 -1.280726 28.268961 9.837009 -5.940298 -12.822065 0.000009 0.000001 -0.000002 -2.842273 0.245108 0.652569 -25.757280 -4.146283 1.624328 -3.467723 4.070764 -15.442725 35.450434 9.164531 0.273381 35.701071 -5.543128 3.278309 -0.000006 -0.000002 -0.000001 -7.933950 -0.820299 5.363427 -13.623509 2.933572 -6.067240 -15.041957 0.235236 -3.499348 41.188551 9.968666 -2.731386 -20.489029 -2.842950 -1.183451 -1.503078 -4.919608 0.347511 -0.121833 0.690206 -1.820623 0.000010 -0.000002 -0.000002 6.158599 10.689975 1.548726 29.770349 -7.471431 1.262708 -10.654501 5.094201 18.366684 -20.980538 -3.473347 -11.491606 -0.383984 -5.134651 13.402166 -0.000004 -0.000003 -0.000008 0.009979 -0.008328 0.010779 +7.438000 115.205300 24.393500 -95.170171 -0.524092 -6.764096 -0.000000 0.000000 0.005542 -15.713417 0.021132 1.311573 7.717782 1.496840 4.969500 14.633470 2.125733 4.702599 -6.008286 1.552781 -1.771566 4.977200 2.147035 -4.930727 4.720577 1.191403 -0.780642 19.329787 -2.060263 -2.754679 -2.174404 0.239595 0.277086 3.643228 3.289334 6.356037 4.077642 -8.669545 9.352412 2.693902 -5.301683 2.504198 -28.147218 7.365017 5.529361 8.294080 -6.262470 12.276225 -121.782427 4.406681 25.425654 4.419285 -5.064478 -13.962315 0.000012 0.000003 -0.000000 -1.421662 0.125996 0.325311 -27.833880 -6.467096 -3.069605 5.685543 7.111975 -11.757802 39.628259 10.195065 -0.068495 35.716118 -7.396263 5.819038 -0.000004 -0.000004 -0.000001 -7.433601 -0.399155 6.509881 -19.118202 1.689804 -7.145576 -17.132119 -0.287173 -2.459682 42.605736 10.254899 -2.947255 -21.179614 -3.021531 -1.248666 0.837450 -4.061733 0.541993 -0.122503 0.694268 -1.831312 0.000002 -0.000003 0.000002 1.285150 11.595594 3.219884 36.339000 -8.947479 2.047270 -13.834359 5.852067 18.477192 -18.640037 -3.739479 -11.100665 -0.392743 -4.898116 12.786318 -0.000002 -0.000004 -0.000006 0.009979 -0.008334 0.010788 +6.211100 114.698700 19.615900 -96.135056 -0.749996 -7.283994 -0.000000 0.000000 0.005543 -15.101584 0.043517 2.563699 7.411128 1.307667 4.939565 13.945592 1.943353 4.158159 -6.400908 1.530894 -1.475354 3.133312 2.095529 -4.631961 4.385133 0.829747 -0.922079 17.896130 -2.629434 -3.763503 -2.146382 0.229906 0.275822 3.609129 3.245684 6.268859 3.983365 -8.537179 9.205021 5.514741 -4.908039 3.403014 -27.526173 6.688085 7.760604 12.692621 -7.983907 10.576225 -111.948129 6.244417 23.661807 -0.328606 -4.262863 -15.387924 0.000009 0.000002 -0.000008 -0.001772 -0.001173 0.001102 -18.346627 -6.311545 -3.776168 1.727759 5.597290 -11.023375 39.209705 10.093175 -0.030839 24.057314 -8.432021 4.247553 -0.000009 -0.000006 0.000003 -6.943982 -0.169929 7.026633 -24.005415 0.570216 -8.310327 -19.387299 -1.188108 -2.202481 44.283484 10.586230 -3.211772 -21.993201 -3.229400 -1.334240 3.161674 -2.984263 0.696047 -0.123150 0.698331 -1.842002 0.000009 -0.000002 -0.000000 -2.795311 11.676501 4.153424 41.753329 -10.083420 2.816562 -16.459257 6.478265 18.506018 -16.321891 -3.721003 -10.678146 -0.398951 -4.661494 12.170679 -0.000002 -0.000004 -0.000003 0.009973 -0.008329 0.010794 +4.788900 114.076200 15.108100 -97.103744 -0.944254 -7.495535 -0.000000 0.000000 0.005544 -14.345243 0.050780 3.670361 7.427946 1.134724 4.819332 13.387313 1.767934 3.510200 -7.000693 1.499410 -1.222172 1.506028 2.140825 -3.862737 3.723832 -0.044473 -0.854449 15.116117 -2.945914 -4.711758 -2.128081 0.242338 0.276265 3.554369 3.189223 6.178640 3.895013 -8.409161 9.041370 7.933676 -4.532619 4.165829 -24.241743 5.356084 8.599305 15.795422 -8.513883 9.593828 51.284540 -12.883640 1.408197 -3.206529 -3.662190 -16.954048 0.000009 0.000001 0.000002 0.006983 -0.001990 -0.000888 -4.231271 -5.316096 -3.347441 -2.323512 3.015986 -10.885218 28.393750 7.367258 0.675714 11.784660 -7.904921 1.764672 -0.000012 -0.000005 -0.000009 -6.419690 0.101605 7.256527 -28.226684 -0.112022 -8.417402 -21.461030 -2.077537 -2.303521 45.729291 10.865021 -3.447348 -22.708035 -3.427941 -1.412409 5.414864 -1.829019 0.782238 -0.124342 0.707236 -1.865536 0.000005 -0.000003 -0.000001 -6.217779 11.457757 4.684313 46.322408 -10.977536 3.546000 -18.654275 6.999847 18.439639 -14.083399 -3.543775 -10.278675 -0.402619 -4.425265 11.556794 -0.000003 -0.000001 0.000001 0.009993 -0.008336 0.010771 +3.440000 113.563400 10.838400 -98.061153 -1.143444 -7.421972 0.000001 0.000000 0.005544 -13.365083 0.073892 4.614488 7.778532 0.971344 4.706323 12.933024 1.618812 2.827223 -7.715128 1.470579 -1.163485 0.170783 2.209306 -3.080613 2.943740 -0.828316 -0.695748 11.931665 -2.859334 -5.207753 -2.100097 0.242472 0.276147 3.500190 3.141548 6.087323 3.806648 -8.271878 8.897220 10.320308 -4.121050 4.892603 -18.052405 3.682616 7.687390 14.660907 -7.025147 9.343274 43.717811 -11.172767 0.475364 -1.873860 -3.981337 -18.250269 0.000007 0.000005 -0.000001 0.006985 -0.001996 -0.000884 6.228473 -4.121165 -2.539577 -1.217757 1.385164 -10.516568 9.003165 2.290152 0.610645 7.097143 -5.785623 0.533426 -0.000009 -0.000004 -0.000001 -5.835989 0.391326 7.206841 -31.618380 -0.479312 -7.395202 -23.152009 -2.783986 -2.633002 46.498528 11.010751 -3.575507 -23.069003 -3.549885 -1.455011 7.601257 -0.703752 0.788595 -0.124345 0.707236 -1.865536 0.000007 -0.000002 -0.000003 -8.958114 11.110343 4.836897 49.799613 -11.615012 4.147018 -20.348233 7.415036 18.284515 -11.900870 -3.318108 -9.917179 -0.403701 -4.204217 10.982274 -0.000002 -0.000003 -0.000000 0.009977 -0.008334 0.010779 +2.390100 113.417000 6.822600 -98.937208 -1.320696 -7.133115 -0.000001 0.000000 0.005542 -12.452839 0.079003 5.265048 8.506943 0.817674 4.609939 13.091786 1.512473 2.209744 -7.883373 1.456970 -1.250918 0.074416 2.243868 -2.742438 1.951336 -1.399309 -0.491081 7.965521 -2.440171 -5.255152 -2.072074 0.233924 0.265061 3.458024 3.088097 5.991354 3.718653 -8.134378 8.753334 12.874921 -3.646124 5.652528 -10.893778 1.903032 5.472944 9.030499 -4.011300 9.973697 34.798868 -9.001285 -0.319843 1.437636 -4.830665 -19.066459 0.000007 0.000001 0.000004 0.006982 -0.001990 -0.000887 6.546049 -3.256974 -1.485899 0.502439 0.964303 -11.249558 -1.009406 -0.249711 -0.090582 7.411128 -4.149776 0.355601 -0.000007 -0.000005 0.000001 -5.274046 0.691274 6.921989 -34.180705 -0.494338 -5.427924 -24.243900 -3.136922 -3.048770 46.050887 10.926166 -3.500692 -22.831278 -3.552170 -1.427679 9.695003 0.256771 0.740791 -0.121155 0.687394 -1.813352 -0.000000 -0.000004 0.000000 -10.959468 10.729171 4.694765 51.842823 -11.971324 4.517625 -21.343740 7.685357 18.012886 -9.825056 -3.174126 -9.631727 -0.402906 -4.015811 10.492722 -0.000001 -0.000004 -0.000004 0.009964 -0.008332 0.010785 +1.614900 113.893100 3.060800 -99.727107 -1.499949 -6.662897 -0.000002 0.000000 0.005541 -11.540119 0.085751 5.551832 9.464169 0.692265 4.435012 13.745399 1.438337 1.711604 -7.365685 1.447704 -1.319944 1.292398 2.214319 -2.778355 0.961070 -1.955864 -0.243250 3.959327 -1.950412 -5.084340 -2.044058 0.225376 0.253974 3.415757 3.034697 5.895348 3.620779 -8.005414 8.604313 14.912883 -3.242192 6.244419 -4.346079 0.168381 2.841368 3.303242 -0.803028 11.406719 22.194928 -5.750107 -0.842912 4.055685 -5.281731 -20.025269 0.000007 0.000005 -0.000001 0.006988 -0.001988 -0.000886 2.357012 -2.639723 -0.402130 1.562812 0.931278 -12.403556 -4.206966 -1.028866 -0.406007 5.987895 -3.391084 0.238865 -0.000009 -0.000006 0.000000 -4.571555 1.007495 6.437716 -35.924794 -0.551977 -3.874564 -24.444164 -3.086162 -3.471896 43.837052 10.498876 -3.140449 -21.735375 -3.374528 -1.313941 11.668407 1.051926 0.662295 -0.115538 0.652677 -1.722028 0.000003 -0.000002 -0.000007 -12.096790 10.306551 4.296352 52.085879 -12.012785 4.562541 -21.461154 7.768712 17.596915 -7.822031 -3.128001 -9.402704 -0.401245 -3.875147 10.127277 -0.000001 -0.000002 -0.000002 0.009982 -0.008327 0.010781 +0.931300 114.894100 -0.447000 -100.494479 -1.688947 -6.054723 0.000001 0.000000 0.005544 -10.437117 0.090269 5.656733 10.516610 0.596646 4.190147 14.468236 1.362151 1.226506 -6.575193 1.432056 -1.416685 3.127340 2.188352 -2.840471 0.057075 -2.505614 0.031424 0.367773 -1.483353 -4.693785 -2.016078 0.225500 0.253864 3.373411 2.981374 5.799312 3.523269 -7.876196 8.455561 15.749346 -3.070051 6.483466 0.475191 -1.090348 0.740602 8.155015 1.165524 7.315637 -11.598225 2.748932 1.295463 11.922105 -5.701699 -17.700951 -0.000001 0.000006 0.000000 0.006986 -0.001989 -0.000887 -4.222543 -1.641155 1.186600 1.114577 0.919595 -14.473345 -2.645820 -0.650808 -0.246623 8.556455 -3.401906 0.367922 -0.000007 -0.000003 -0.000002 -3.769057 1.332337 5.784414 -36.782635 -0.941084 -3.429815 -23.703792 -2.758087 -3.910075 40.085660 9.741995 -2.568297 -19.878361 -3.033710 -1.125745 13.455922 1.752287 0.541602 -0.106961 0.600626 -1.585029 0.000005 -0.000002 0.000001 -12.394681 9.804149 3.679729 50.822642 -11.795147 4.331008 -20.854859 7.711256 17.067301 -5.937470 -3.089086 -9.216546 -0.399458 -3.772165 9.859760 -0.000002 -0.000004 -0.000003 0.009987 -0.008335 0.010784 +0.327000 116.206400 -3.827800 -101.230479 -1.875530 -5.357177 -0.000002 0.000000 0.005542 -9.073582 0.090422 5.607749 11.565249 0.542752 3.875393 14.965407 1.343003 0.774096 -5.868677 1.417237 -1.511127 5.123012 2.152243 -2.907680 -0.536763 -2.981478 0.300841 -2.029297 -1.140168 -4.158134 -2.009098 0.225530 0.253837 3.318934 2.934066 5.707836 3.437700 -7.733480 8.299430 15.428245 -3.136563 6.391974 0.625117 -0.787105 -0.258689 4.528041 1.937615 2.813693 -11.598225 2.748931 1.295469 1.849506 -3.434805 -12.957119 0.000006 0.000001 0.000002 0.006986 -0.001991 -0.000886 -10.363011 -0.774670 2.727588 1.723380 0.884699 -16.202093 -3.604638 -0.883552 -0.343312 11.990120 -2.979389 0.535946 -0.000013 -0.000005 -0.000004 -3.046063 1.638659 5.041113 -36.656184 -1.198999 -3.143017 -22.234733 -2.234658 -4.376243 35.108146 8.678599 -1.887519 -17.430313 -2.543227 -0.899696 15.116259 2.384742 0.404715 -0.096629 0.538681 -1.421934 0.000009 -0.000002 -0.000001 -12.122243 9.257777 2.951393 48.522531 -11.385360 3.921844 -19.735111 7.541053 16.462289 -4.145072 -3.069300 -9.057296 -0.397843 -3.696821 9.664025 -0.000004 -0.000004 -0.000009 0.009984 -0.008323 0.010773 +-0.216200 117.628600 -7.192800 -101.915319 -2.075706 -4.597362 -0.000000 0.000000 0.005544 -7.400818 0.088084 5.446852 12.442516 0.525794 3.498401 14.937292 1.354005 0.364374 -5.589359 1.393580 -1.637662 6.833052 2.149537 -2.965348 -0.624787 -3.383598 0.568561 -2.434446 -0.977668 -3.602048 -1.981040 0.214684 0.262405 3.264397 2.886847 5.616316 3.352568 -7.590545 8.143574 14.323469 -3.361270 6.074595 -2.246984 0.096421 -0.682885 5.113184 1.710462 1.708160 -11.598198 2.748929 1.295467 -2.564291 -2.574385 -11.275106 -0.000002 0.000006 -0.000002 0.006986 -0.001982 -0.000890 -15.243022 -0.158636 3.979175 0.813635 0.919508 -17.537271 -0.947279 -0.234391 -0.084883 12.528114 -3.064250 0.541169 -0.000008 -0.000003 -0.000007 -1.998152 1.962569 4.242835 -35.674290 -1.054138 -2.517843 -20.223480 -1.588553 -4.862491 29.157316 7.328823 -1.198198 -14.495917 -1.949436 -0.647887 16.710958 2.962677 0.253361 -0.084829 0.469340 -1.239264 0.000006 -0.000003 -0.000002 -11.590354 8.673498 2.164656 45.634335 -10.846898 3.431660 -18.333220 7.303659 15.821064 -2.393856 -3.074225 -8.921483 -0.396176 -3.629017 9.487876 0.000001 -0.000003 -0.000003 0.010000 -0.008337 0.010778 +-0.710700 118.855500 -10.541900 -102.615903 -2.248508 -3.840362 -0.000001 0.000000 0.005543 -5.489602 0.081590 5.048126 13.175853 0.566467 2.966616 14.342337 1.426723 0.023815 -5.898524 1.350652 -1.569416 8.060160 2.160715 -2.891636 -0.265511 -3.542950 0.780302 -1.040095 -0.937010 -3.031241 -1.952983 0.190821 0.254524 3.209758 2.839711 5.524733 3.267829 -7.447368 7.987981 11.959578 -3.800466 5.375421 -1.844855 0.868942 -0.435032 5.771761 1.467110 0.356482 -11.598225 2.748931 1.295464 -9.215424 -1.669411 -9.629609 0.000008 0.000004 -0.000007 0.006986 -0.001984 -0.000887 -18.652434 0.129629 4.853353 1.496090 0.853303 -18.177601 -2.250640 -0.554383 -0.207909 14.865056 -2.341185 0.558281 -0.000007 -0.000004 -0.000000 -0.944621 2.257989 3.414255 -34.271874 -0.840032 -1.841993 -17.924358 -0.913231 -5.359014 22.860102 5.822985 -0.625349 -11.408795 -1.291848 -0.429578 18.265852 3.498694 0.088784 -0.072818 0.400037 -1.056573 0.000002 -0.000003 0.000000 -11.057828 8.117418 1.438193 42.839722 -10.301595 2.983557 -16.970373 7.063635 15.187289 -0.713969 -3.086018 -8.817218 -0.393991 -3.551174 9.285642 -0.000000 -0.000006 -0.000003 0.009985 -0.008331 0.010784 +-1.180700 119.704000 -13.764000 -103.314219 -2.430525 -3.085472 0.000003 0.000000 0.005543 -3.811246 0.071762 4.474576 13.741056 0.609690 2.323568 13.705688 1.455119 -0.245665 -6.341367 1.273995 -1.303929 8.993635 2.190440 -2.638762 0.195594 -3.445928 0.940018 0.829901 -0.886429 -2.506827 -1.925007 0.192090 0.244605 3.173085 2.783673 5.426294 3.182223 -7.308500 7.845664 9.442684 -4.255877 4.621000 -0.553943 1.386728 -0.055464 6.004097 1.326514 -0.995369 -11.598225 2.748931 1.295467 -12.076018 -1.516995 -7.836367 0.000003 0.000003 -0.000005 0.006987 -0.001987 -0.000886 -21.305763 0.112478 5.490246 1.722154 0.802938 -18.482922 -2.484620 -0.611508 -0.230755 16.178654 -1.538176 0.446697 -0.000009 -0.000004 -0.000005 0.143353 2.497922 2.618794 -32.559805 -0.723702 -1.421269 -15.661689 -0.307360 -5.881798 16.801801 4.316598 -0.233536 -8.434417 -0.650057 -0.245996 19.780825 3.992890 -0.073147 -0.059258 0.323351 -0.854287 0.000008 -0.000002 -0.000003 -10.767625 7.626489 0.831984 40.637860 -9.855907 2.649424 -15.901584 6.894954 14.614436 0.903635 -3.101350 -8.715922 -0.391040 -3.458275 9.044297 -0.000006 -0.000003 -0.000005 0.009985 -0.008325 0.010775 +-1.626200 120.027500 -16.938500 -103.902396 -2.563265 -2.432606 -0.000000 0.000000 0.005543 -2.772693 0.065470 4.061919 14.050174 0.577444 1.775783 13.320097 1.346097 -0.560475 -6.588401 1.176506 -1.183954 9.639871 2.229815 -2.227214 0.718333 -3.283220 1.050648 2.908122 -0.854116 -2.087127 -1.911006 0.193297 0.234734 3.124315 2.733702 5.332387 3.081418 -7.182322 7.695681 7.411787 -4.598067 3.999402 0.394202 1.923463 0.252193 5.863886 1.287741 -2.235620 -11.598198 2.748926 1.295470 -10.766523 -2.035627 -6.029352 0.000007 0.000001 0.000000 0.006985 -0.001988 -0.000887 -23.381807 0.058446 5.994589 1.648455 0.791922 -18.536292 -2.055071 -0.506558 -0.188988 16.836872 -0.889307 0.304604 -0.000006 -0.000003 -0.000002 1.312853 2.694404 1.873286 -30.650300 -0.801208 -1.434433 -13.879211 0.158726 -6.394746 11.597467 2.991507 -0.025756 -5.898067 -0.081922 -0.114701 21.270741 4.476851 -0.260128 -0.048580 0.264016 -0.697678 0.000007 -0.000002 0.000003 -11.041701 7.242301 0.384657 39.447187 -9.609235 2.475888 -15.314589 6.821345 14.100447 2.467997 -3.116800 -8.645052 -0.386712 -3.340283 8.737735 -0.000004 -0.000004 -0.000011 0.009983 -0.008333 0.010783 +-2.016900 119.765000 -20.017700 -104.354590 -2.665668 -1.774745 -0.000000 0.000000 0.005543 -2.449966 0.062187 3.789149 14.094745 0.483346 1.372201 13.170444 1.133833 -0.910754 -6.688797 1.063051 -1.263854 9.970774 2.279320 -1.711950 1.291384 -3.203117 1.133091 5.152419 -0.859626 -1.838211 -1.896952 0.178043 0.237879 3.075460 2.683819 5.238400 2.998553 -7.036230 7.534338 6.209978 -4.809484 3.633912 0.787840 2.555323 0.474255 5.694337 1.279830 -3.395992 -11.598225 2.748931 1.295469 -8.864511 -2.664851 -4.345685 0.000004 0.000004 0.000001 0.006971 -0.001983 -0.000889 -24.758847 0.058875 6.332028 1.461419 0.762194 -18.349882 -1.388709 -0.343102 -0.125736 17.154532 -0.411340 0.166167 -0.000010 -0.000005 -0.000002 2.437511 2.815388 1.135617 -28.659286 -0.969706 -1.707796 -13.095908 0.458008 -6.916352 8.060152 2.081055 0.046338 -4.176104 0.278853 -0.041257 22.772913 4.907788 -0.459975 -0.040446 0.219537 -0.580213 0.000006 -0.000003 0.000000 -12.049213 7.043736 0.044451 39.547885 -9.630245 2.490362 -15.355387 6.898580 13.677468 3.961104 -3.141217 -8.577543 -0.380761 -3.199741 8.372519 -0.000002 -0.000005 0.000002 0.009980 -0.008327 0.010780 +-2.316000 119.087500 -23.001800 -104.629660 -2.742838 -1.053303 0.000006 0.000000 0.005543 -2.568681 0.055426 3.397510 13.970362 0.406476 0.969409 13.033230 0.902334 -1.195856 -6.894247 0.953037 -1.363067 9.957902 2.324533 -1.125564 1.890085 -3.351785 1.215752 7.491579 -0.959111 -1.852479 -1.868966 0.173819 0.232307 3.016195 2.616149 5.141054 2.916138 -6.889906 7.373243 6.007049 -4.841085 3.570521 0.336138 3.039479 0.483110 5.521989 1.286781 -4.380590 -11.598225 2.748930 1.295469 -6.335727 -3.157744 -2.737355 0.000004 0.000006 -0.000005 0.006990 -0.001983 -0.000890 -25.425873 0.002525 6.492362 1.353405 0.739309 -17.926704 -0.966133 -0.239042 -0.086609 17.473316 0.065850 0.025084 -0.000004 -0.000005 0.000001 3.214202 2.872517 0.334058 -26.696553 -1.134610 -1.982696 -13.173617 0.681049 -7.516902 5.830036 1.505048 0.062835 -3.088018 0.490106 -0.003294 24.284319 5.299322 -0.650385 -0.034989 0.189891 -0.501895 0.000006 -0.000001 -0.000002 -13.605793 6.990416 -0.308840 40.488774 -9.825233 2.627409 -15.797177 7.055862 13.324009 5.388828 -3.199719 -8.540553 -0.373479 -3.051710 7.987767 -0.000004 -0.000003 -0.000009 0.009987 -0.008336 0.010783 +-2.578400 118.214600 -25.954000 -104.714095 -2.776850 -0.253009 0.000001 0.000000 0.005543 -2.988473 0.045862 2.942956 13.684243 0.356828 0.587747 12.874059 0.675500 -1.453451 -7.163166 0.832510 -1.497235 9.608571 2.375636 -0.511430 2.455108 -3.860871 1.306382 9.650104 -1.218088 -2.204723 -1.840964 0.169592 0.226737 2.963723 2.560478 5.045871 2.834171 -6.743365 7.212438 5.966467 -4.847385 3.557833 0.199843 3.475163 0.549221 5.329308 1.273127 -5.256556 -11.598225 2.748932 1.295469 -3.791406 -3.519602 -1.293077 0.000006 0.000004 -0.000007 0.006986 -0.001987 -0.000888 -25.555979 -0.120488 6.503208 1.071756 0.714840 -17.360703 -0.185072 -0.045910 -0.016296 17.485489 0.465556 -0.117017 -0.000005 -0.000003 0.000001 3.592357 2.863336 -0.504863 -24.936782 -1.287412 -2.231995 -13.721824 0.869903 -8.192207 4.169443 1.075846 0.060541 -2.270916 0.630500 0.018797 25.774410 5.659792 -0.848652 -0.030402 0.165192 -0.436625 -0.000000 -0.000003 -0.000004 -15.476645 7.064286 -0.721489 41.785441 -10.089917 2.821445 -16.422041 7.248954 13.042308 6.774089 -3.271410 -8.504328 -0.365675 -2.911248 7.622604 0.000002 -0.000006 0.000000 0.009976 -0.008330 0.010781 +-2.847000 117.347900 -28.826900 -104.602051 -2.776511 0.598762 0.000001 0.000001 0.005543 -3.569023 0.032007 2.488423 13.278730 0.329239 0.206019 12.664905 0.450736 -1.711179 -7.460324 0.714934 -1.666522 8.978583 2.404733 0.221641 2.855618 -4.194382 1.349796 11.156958 -1.464845 -2.542955 -1.812979 0.165363 0.221168 2.911167 2.504884 4.950659 2.751264 -6.601102 7.064882 5.925884 -4.853674 3.545141 0.388832 3.864598 0.673900 5.151738 1.266358 -5.979817 -11.598225 2.748929 1.295468 -1.399311 -3.785439 -0.075511 0.000006 0.000001 -0.000002 0.006990 -0.001990 -0.000886 -25.346531 -0.310515 6.428500 0.749354 0.694165 -16.720720 0.629572 0.156588 0.054252 17.449535 0.830417 -0.258655 -0.000010 -0.000006 -0.000005 3.724657 2.815066 -1.398620 -23.429890 -1.451457 -2.506905 -14.267797 1.065192 -8.865710 2.312615 0.596184 0.043251 -1.358823 0.794873 0.035624 27.190334 5.965158 -1.034025 -0.025796 0.140498 -0.371367 0.000002 -0.000003 0.000001 -17.425327 7.171740 -1.238643 42.958628 -10.325263 3.002091 -16.977434 7.419378 12.816457 8.120066 -3.327704 -8.468828 -0.358416 -2.793407 7.316164 0.000003 -0.000004 -0.000003 0.009979 -0.008330 0.010770 +-3.182700 116.682500 -31.684000 -104.287758 -2.728776 1.502191 0.000003 0.000001 0.005543 -4.177626 0.021805 2.047767 12.768112 0.304818 -0.154336 12.364979 0.264523 -1.973501 -7.756934 0.628354 -1.884085 8.236110 2.434891 1.085208 3.041435 -4.040359 1.303776 11.901112 -1.527552 -2.570418 -1.805963 0.161052 0.215661 2.856268 2.453540 4.842298 2.658287 -6.467092 6.912446 5.898817 -4.857844 3.536665 0.697385 4.224096 0.816404 4.995724 1.267161 -6.487893 -11.598225 2.748930 1.295467 0.724364 -3.980124 0.867568 0.000008 0.000005 -0.000001 0.006980 -0.001981 -0.000889 -24.998595 -0.559754 6.304693 0.526493 0.678798 -16.088500 1.180279 0.294072 0.100330 17.540424 1.194641 -0.402308 -0.000014 -0.000006 -0.000001 3.588064 2.708761 -2.323312 -22.182294 -1.610812 -2.784486 -15.625161 1.231649 -9.184139 2.575251 0.663993 0.046635 -1.476936 0.693045 0.037908 25.389449 5.357154 -0.772413 -0.024405 0.133091 -0.351791 0.000005 -0.000003 0.000003 -19.221906 7.223956 -1.901235 43.526733 -10.437797 3.091274 -17.246272 7.513246 12.630563 9.420113 -3.366249 -8.434904 -0.352964 -2.710688 7.101001 -0.000001 -0.000004 -0.000002 0.009974 -0.008324 0.010781 +-3.640500 116.432300 -34.525200 -103.779784 -2.627352 2.435194 -0.000000 0.000001 0.005543 -4.681463 0.020693 1.697931 12.194505 0.298445 -0.493916 11.932190 0.107184 -2.281455 -8.011891 0.543298 -2.144453 7.444323 2.450275 1.923304 3.060931 -3.655762 1.238417 12.027978 -1.451885 -2.405559 -1.777961 0.156816 0.210098 2.801258 2.402283 4.733890 2.567741 -6.326054 6.740715 5.871755 -4.862031 3.528198 0.887765 4.525294 0.920644 4.901398 1.280117 -6.694394 -11.598198 2.748931 1.295467 2.513971 -4.131609 1.499556 0.000007 0.000003 -0.000005 0.006982 -0.001978 -0.000891 -24.724059 -0.851066 6.192334 0.807073 0.638522 -15.524472 0.513832 0.127755 0.044404 18.368306 1.734535 -0.530542 -0.000005 -0.000003 -0.000003 3.195855 2.572129 -3.259556 -21.191299 -1.711238 -2.975025 -18.316913 1.300840 -9.648598 6.671648 1.722522 0.059245 -3.434701 0.154573 -0.027778 19.570433 3.884394 -0.219146 -0.029947 0.162722 -0.430103 0.000007 -0.000003 -0.000003 -20.621693 7.134532 -2.748717 43.007621 -10.335006 3.009732 -16.983511 7.474292 12.465107 10.670688 -3.356508 -8.445504 -0.350896 -2.680610 7.022761 0.000003 -0.000003 -0.000001 0.009982 -0.008330 0.010777 +-4.312000 117.024400 -37.382200 -102.812689 -2.346798 3.421490 -0.000001 0.000000 0.005543 -5.024543 0.028306 1.452969 11.522340 0.241440 -0.796819 11.238549 -0.068772 -2.621747 -8.218269 0.459907 -2.461526 6.653044 2.439301 2.580249 2.968794 -3.273537 1.166180 11.673708 -1.318761 -2.174718 -1.749977 0.152579 0.204536 2.746164 2.351129 4.625478 2.493463 -6.172171 6.576944 5.858223 -4.864124 3.523967 0.700481 4.769164 0.938358 4.891176 1.285778 -6.524239 -11.598198 2.748927 1.295478 3.897983 -4.266678 1.763523 0.000006 0.000003 0.000008 0.006981 -0.001988 -0.000888 -24.757127 -1.170205 6.151482 0.698777 0.613717 -15.165137 0.800862 0.199300 0.068728 18.768697 2.081137 -0.664934 -0.000009 -0.000002 -0.000004 2.279399 2.291609 -4.232512 -20.471465 -1.768882 -3.045423 -20.909412 1.069792 -10.235571 11.972996 3.087802 -0.036713 -5.990014 -0.534009 -0.131932 13.070456 2.378745 0.149107 -0.037271 0.202240 -0.534529 0.000019 0.000002 0.000003 -21.231909 6.577960 -3.937700 40.186917 -9.762937 2.583102 -15.609318 7.160682 12.289694 11.803583 -3.281428 -8.463851 -0.354484 -2.733241 7.159681 -0.000001 -0.000005 0.000002 0.009982 -0.008329 0.010773 +-5.166500 118.458800 -40.255100 -101.347171 -1.825367 4.447202 -0.000001 0.000000 0.005545 -5.290210 0.020123 1.348175 10.611048 0.123549 -1.021113 10.290454 -0.266301 -2.988396 -8.209361 0.350316 -2.865213 5.862308 2.412875 2.900631 2.881349 -3.109263 1.170324 11.114690 -1.222498 -2.021061 -1.735929 0.137318 0.207691 2.693214 2.295939 4.530062 2.419633 -6.018079 6.413399 5.912349 -4.855754 3.540900 0.185242 5.060225 0.900339 4.926516 1.298650 -6.212203 -11.598198 2.748931 1.295467 4.978377 -4.540351 1.820233 0.000007 0.000004 0.000005 0.006972 -0.001982 -0.000888 -25.038155 -1.429214 6.182330 -0.081820 0.589911 -15.066168 2.737334 0.685244 0.223448 18.346737 2.094543 -0.798599 -0.000003 -0.000007 0.000002 0.810139 1.850569 -5.228365 -20.061860 -1.729549 -2.937778 -22.584234 0.474267 -10.598598 16.296761 4.189046 -0.208115 -8.065178 -1.123919 -0.241437 9.443121 1.519364 0.253521 -0.042260 0.229421 -0.606323 0.000014 -0.000002 -0.000004 -20.944703 5.435739 -5.457688 34.802286 -8.611199 1.848717 -13.001643 6.541022 12.115305 12.791787 -3.153518 -8.492323 -0.363422 -2.873637 7.524810 -0.000005 -0.000004 -0.000006 0.009978 -0.008320 0.010776 +-6.082100 120.326600 -43.080400 -99.713239 -1.227756 5.435110 -0.000000 0.000000 0.005542 -5.527973 0.015017 1.383222 9.545557 0.013729 -1.170121 9.272795 -0.426116 -3.361945 -7.970623 0.231932 -3.360898 5.073411 2.349631 2.823164 2.875541 -3.166303 1.219373 10.646901 -1.112977 -1.843080 -1.721898 0.122058 0.210850 2.629622 2.223083 4.431208 2.332566 -5.869512 6.222973 6.067954 -4.831631 3.589556 -0.578938 5.408434 0.809233 4.956910 1.310404 -5.948765 -11.598225 2.748929 1.295463 6.008664 -4.975536 1.879445 0.000006 0.000002 0.000003 0.006990 -0.001989 -0.000887 -24.164443 -1.058590 6.020311 -1.310606 0.428699 -15.682391 5.301038 1.336509 0.403003 22.247270 1.785681 -0.491943 -0.000009 -0.000005 -0.000001 -0.852739 1.397706 -6.215183 -19.928706 -1.608471 -2.675806 -23.444696 -0.317482 -10.482696 19.318531 4.948067 -0.376948 -9.524029 -1.553124 -0.332998 8.675302 1.211654 0.252832 -0.044530 0.241773 -0.638945 0.000014 0.000001 -0.000001 -19.911007 3.887709 -7.070543 27.719069 -6.991282 1.052875 -9.571453 5.689779 12.024921 13.653671 -3.024303 -8.529823 -0.374783 -3.076789 8.052977 0.000005 -0.000005 -0.000004 0.009972 -0.008322 0.010782 +-6.918300 122.145500 -45.762900 -98.232160 -0.723219 6.355749 -0.000000 0.000000 0.005544 -5.702832 0.012323 1.488166 8.529867 -0.044484 -1.273107 8.356984 -0.502151 -3.747350 -7.623708 0.176541 -3.902594 4.334125 2.273850 2.547658 2.961331 -3.242901 1.318040 10.229202 -0.952910 -1.544090 -1.707908 0.123256 0.200995 2.560358 2.160744 4.299565 2.227749 -5.700005 6.036096 6.223520 -4.807368 3.638136 -1.496666 5.768209 0.691122 4.985168 1.321730 -5.706156 -11.598225 2.748929 1.295464 7.015052 -5.501594 1.924099 0.000007 0.000002 0.000005 0.006981 -0.001982 -0.000888 -21.318508 -0.097329 5.454935 -6.404793 0.287795 -17.405134 16.736781 4.314122 0.843789 25.908514 0.299790 0.705003 -0.000008 -0.000005 0.000002 -2.383487 1.079095 -7.155735 -20.044517 -1.397494 -2.280225 -23.799702 -1.206486 -9.875407 22.071982 5.629828 -0.565399 -10.841299 -1.973773 -0.428644 9.882171 1.338631 0.206990 -0.045428 0.246717 -0.651998 -0.000000 -0.000002 0.000001 -18.326516 2.207406 -8.588354 19.894661 -5.091554 0.413665 -5.798078 4.727804 12.042006 14.450881 -2.909051 -8.572510 -0.385713 -3.315189 8.672525 -0.000004 -0.000004 -0.000005 0.009972 -0.008330 0.010788 +-7.547000 123.482300 -48.254900 -97.222593 -0.504819 7.177961 -0.000001 0.000000 0.005541 -5.723845 0.013223 1.579093 7.741236 0.041365 -1.352003 7.660491 -0.434491 -4.037654 -7.257272 0.200504 -4.440735 3.629919 2.191050 2.123442 3.118277 -3.356994 1.456825 9.860506 -0.756069 -1.140159 -1.693917 0.124451 0.191140 2.493174 2.094394 4.180941 2.143097 -5.506540 5.824523 6.406100 -4.778718 3.695077 -2.629984 6.060757 0.512082 5.016149 1.333945 -5.435766 -11.598198 2.748928 1.295472 8.114293 -6.023353 2.015220 0.000007 0.000003 -0.000005 0.006984 -0.001988 -0.000886 -17.291737 1.194765 4.695723 -9.057621 0.061919 -19.235327 22.566452 5.847637 0.837844 31.996909 0.055125 2.524293 -0.000006 -0.000002 -0.000002 -3.427076 1.033100 -8.011315 -20.356356 -1.140308 -1.758806 -23.816120 -2.089303 -8.808034 25.426228 6.445087 -0.838811 -12.459144 -2.463861 -0.540398 12.214299 1.758880 0.096975 -0.046334 0.251661 -0.665052 0.000002 -0.000005 -0.000006 -16.690932 0.849803 -9.869664 12.907502 -3.327040 0.066707 -2.445948 3.844616 12.207501 15.226127 -2.853409 -8.617471 -0.393849 -3.546158 9.272613 -0.000003 -0.000004 -0.000003 0.009981 -0.008332 0.010779 +-7.956000 124.220800 -50.556400 -96.729486 -0.763849 7.966821 0.000002 0.000000 0.005543 -5.374263 0.023530 1.613944 7.222866 0.303594 -1.434418 7.027338 -0.172333 -4.286980 -6.943784 0.343241 -4.939224 2.975482 2.072784 1.608658 3.347005 -3.521638 1.618644 9.581885 -0.523055 -0.685555 -1.679882 0.109187 0.194302 2.425837 2.028188 4.062239 2.057587 -5.331389 5.606635 6.588674 -4.749890 3.751931 -3.971054 6.221128 0.254395 5.067185 1.343688 -5.097482 -11.598225 2.748930 1.295467 9.367632 -6.467655 2.132324 0.000006 -0.000003 0.000004 0.006995 -0.001992 -0.000885 -12.930399 2.281312 3.859566 -10.123496 -0.336297 -20.732802 25.361310 6.579222 0.779490 32.962476 0.196923 4.297208 0.000004 -0.000002 0.000001 -3.900600 1.417859 -8.807373 -20.844327 -0.834095 -1.153347 -23.259982 -2.825441 -7.362256 29.086958 7.312409 -1.190898 -14.227965 -2.990806 -0.698183 14.764620 2.369443 -0.041872 -0.048577 0.264016 -0.697679 0.000002 -0.000003 -0.000009 -15.497875 0.287148 -10.933632 7.964446 -2.056354 -0.047513 -0.084600 3.199168 12.473109 16.035874 -2.826118 -8.661287 -0.398938 -3.747055 9.794521 -0.000003 -0.000002 0.000000 0.009979 -0.008331 0.010781 +-8.187900 124.629800 -52.667400 -96.518611 -1.333828 8.719108 -0.000000 0.000000 0.005543 -4.835828 0.036227 1.494767 6.987983 0.683361 -1.589820 6.517889 0.230751 -4.424558 -6.830587 0.587565 -5.307544 2.390066 1.957989 1.041340 3.612691 -3.730797 1.799602 9.336248 -0.305984 -0.191084 -1.665824 0.093924 0.197468 2.358391 1.962123 3.943456 1.972777 -5.155905 5.389065 6.730619 -4.727342 3.796081 -5.582073 6.128007 -0.126376 5.122009 1.342918 -4.674979 -11.598225 2.748930 1.295466 10.790919 -6.699342 2.304241 0.000007 0.000000 0.000003 0.760921 -0.072827 -0.171778 -9.551486 3.279545 3.283640 -10.444710 -0.990835 -22.666924 28.208867 7.319429 0.683243 25.410580 -0.000810 6.138062 -0.000010 -0.000008 0.000003 -4.064013 2.073568 -9.541067 -21.440078 -0.512504 -0.541071 -21.872103 -3.458608 -5.697747 32.094543 8.004930 -1.520972 -15.672216 -3.431396 -0.831747 16.604704 3.032716 -0.245536 -0.049021 0.266489 -0.704207 0.000007 -0.000003 -0.000002 -14.687688 0.275809 -11.865350 4.449544 -1.148238 -0.061801 1.582008 2.731644 12.784589 16.833432 -2.832085 -8.684884 -0.401925 -3.925390 10.257799 0.000001 -0.000006 -0.000001 0.009976 -0.008329 0.010778 +-8.242900 124.806800 -54.588000 -96.427370 -1.907172 9.358193 0.000002 -0.000001 0.005545 -4.296625 0.015914 1.187243 6.894787 1.087648 -1.746590 6.137508 0.664783 -4.409418 -6.742933 0.846384 -5.472488 1.880373 1.863972 0.469201 3.908946 -3.990971 2.002051 9.088808 -0.098200 0.273855 -1.651852 0.095118 0.187620 2.288598 1.900378 3.811510 1.877488 -4.957698 5.154899 6.771170 -4.720886 3.808682 -7.212089 5.770138 -0.581707 5.160457 1.350179 -4.215519 -11.598225 2.748933 1.295465 12.248661 -6.715275 2.483235 0.000009 0.000002 -0.000002 2.431069 -0.237782 -0.547115 -6.962419 4.443928 2.955970 -9.338387 -1.982735 -25.090635 28.876735 7.492060 0.655320 16.451124 -0.323079 8.276143 -0.000010 -0.000007 0.000006 -4.094139 2.717817 -10.163014 -22.102238 -0.159985 0.141530 -19.757717 -4.156909 -3.926894 34.248269 8.488558 -1.779336 -16.708910 -3.770067 -0.937034 18.586077 3.929805 -0.531759 -0.048127 0.261545 -0.691154 0.000005 0.000001 0.000004 -14.179458 0.485883 -12.649456 1.881192 -0.484835 -0.036998 2.790547 2.371021 13.102876 17.584346 -2.903119 -8.710261 -0.403359 -4.083634 10.668948 0.000002 -0.000002 0.000003 0.009973 -0.008328 0.010781 +-8.096400 124.849500 -56.429200 -96.333668 -2.168018 9.788194 0.000001 0.000000 0.005542 -3.883769 0.008110 0.711693 6.863111 1.414089 -1.873989 5.854828 1.010141 -4.192541 -6.703391 1.039169 -5.464923 1.460853 1.768505 -0.021797 4.207963 -4.298913 2.193492 8.840056 0.078927 0.672514 -1.637862 0.096311 0.177772 2.218684 1.838791 3.679484 1.791952 -4.769616 4.919366 6.412871 -4.777657 3.697187 -8.283539 5.232017 -0.947323 5.196200 1.368938 -3.826412 -11.598225 2.748928 1.295469 13.480962 -6.576141 2.620593 0.000006 -0.000002 0.000001 4.100125 -0.413610 -0.917483 -4.151220 5.357989 2.561302 -6.447139 -3.294022 -26.627243 24.822132 6.438416 0.793534 10.172582 -0.913351 10.302510 -0.000007 -0.000003 -0.000003 -4.190516 3.046324 -10.600860 -22.796972 0.226328 0.860972 -17.026719 -5.063273 -2.111640 35.349589 8.731634 -1.918397 -17.228039 -3.982483 -0.995167 21.096947 5.072897 -0.957760 -0.045887 0.249188 -0.658520 0.000013 -0.000002 -0.000002 -13.744854 0.473480 -13.268381 -0.565450 0.145447 0.014244 3.938544 2.041396 13.403801 18.293700 -3.085568 -8.687202 -0.403696 -4.226825 11.041030 -0.000002 -0.000001 -0.000008 0.009987 -0.008330 0.010763 +-7.699600 124.391700 -58.079900 -96.233551 -2.008606 9.959698 -0.000000 0.000000 0.005547 -3.960589 -0.009544 0.082374 6.891463 1.636028 -1.915984 5.911230 1.215833 -3.768975 -6.610052 1.135034 -5.280296 1.152629 1.684506 -0.419258 4.530848 -4.647233 2.373540 8.576828 0.212948 0.978826 -1.623826 0.081043 0.180941 2.148622 1.777347 3.547423 1.707209 -4.581171 4.684127 5.601060 -4.903627 3.443399 -8.696078 4.517114 -1.196304 5.239608 1.382004 -3.494350 -11.598225 2.748929 1.295463 14.458471 -6.278274 2.710764 0.000006 0.000001 0.000004 4.859647 -0.497218 -1.084382 -0.159326 5.554830 1.778453 -0.989935 -4.902943 -25.807993 12.513707 3.205166 0.750370 11.233608 -0.960961 11.636148 -0.000006 -0.000002 0.000001 -4.383180 2.932353 -10.812770 -23.497039 0.620694 1.615738 -13.877233 -6.179131 -0.269616 35.671086 8.802044 -1.959863 -17.372135 -4.104369 -1.015239 22.503810 6.088660 -1.379394 -0.043617 0.236834 -0.625891 0.000009 -0.000001 -0.000011 -14.536138 0.715994 -13.615668 -0.607946 0.156380 0.015366 3.944112 2.003134 13.646484 19.005249 -3.402615 -8.632940 -0.403432 -4.314744 11.269524 0.000003 -0.000002 -0.000009 0.009977 -0.008325 0.010781 +-7.125800 123.531100 -59.587800 -96.194149 -1.625354 9.911998 -0.000001 0.000000 0.005544 -4.198428 -0.012986 -0.638135 7.092906 1.797588 -1.912748 6.136442 1.345878 -3.199974 -6.682885 1.184431 -4.962001 0.963033 1.615301 -0.660301 4.821251 -5.029682 2.520134 8.279163 0.285847 1.171244 -1.609788 0.065776 0.184115 2.073353 1.700193 3.426027 1.632510 -4.388848 4.467116 4.394506 -5.064345 3.055820 -8.535698 3.673280 -1.338991 5.277437 1.393547 -3.217807 -11.598225 2.748929 1.295469 15.224826 -5.856176 2.758526 0.000007 0.000002 0.000001 4.100133 -0.413606 -0.917487 4.840975 3.628377 0.364539 4.479291 -5.937147 -23.464604 -0.778702 -0.192788 -0.069501 -7.128814 -3.908377 11.119646 -0.000008 -0.000002 -0.000006 -4.569670 2.590957 -10.821610 -24.202724 1.018028 2.368611 -10.160974 -7.209435 1.581506 34.880642 8.628490 -1.858617 -16.963458 -4.093925 -0.979461 21.212307 6.714285 -1.548163 -0.040457 0.219534 -0.580211 0.000011 -0.000003 -0.000009 -16.329746 1.328164 -13.680349 1.509865 -0.389035 -0.030956 2.923972 2.244846 13.820379 19.705437 -3.811330 -8.546915 -0.403263 -4.344890 11.347879 -0.000000 -0.000003 -0.000003 0.009977 -0.008327 0.010777 +-6.466600 123.073300 -60.921100 -96.157669 -1.221491 9.759067 0.000001 0.000000 0.005539 -3.911802 -0.023749 -1.421453 7.383662 1.907205 -1.911502 6.029992 1.457658 -2.583349 -7.050917 1.233013 -4.547434 0.934141 1.540415 -0.716039 5.148336 -5.568716 2.705369 8.149722 0.332755 1.295952 -1.609810 0.066924 0.174288 1.997918 1.623193 3.304539 1.558540 -4.196223 4.250404 3.106134 -5.247719 2.646653 -8.216272 2.728314 -1.458889 5.284530 1.400070 -2.937328 -11.598225 2.748929 1.295468 15.913989 -5.311287 2.771357 0.000007 0.000001 0.000006 2.498954 -0.244721 -0.562269 6.713330 2.312504 -0.289778 7.169432 -6.395772 -22.693082 -7.656787 -1.846917 -0.793901 -3.479779 -2.497804 11.634851 -0.000009 -0.000005 -0.000006 -4.764351 2.204854 -10.725924 -24.857155 1.398615 3.106859 -6.561734 -7.046488 3.259492 30.193568 7.569438 -1.308122 -14.660002 -3.591596 -0.780365 8.881762 4.518024 -0.390884 -0.034067 0.184954 -0.488848 0.000011 -0.000002 -0.000002 -16.913971 1.300170 -13.599434 1.284545 -0.330928 -0.026979 3.031225 2.208828 13.882728 20.299329 -4.246396 -8.435244 -0.403108 -4.367496 11.406631 0.000001 -0.000003 -0.000003 0.009979 -0.008325 0.010776 +-5.429000 123.177100 -62.270300 -96.128354 -0.769466 9.605656 -0.000000 0.000000 0.005542 -3.233488 -0.040007 -2.666439 7.535225 2.042462 -1.906669 5.600153 1.571917 -1.688993 -7.421428 1.250780 -3.972757 0.989305 1.473151 -0.676481 5.559532 -6.195175 2.934642 8.453745 0.389653 1.418044 -1.609801 0.068071 0.164463 1.933240 1.563852 3.186505 1.474490 -4.011261 4.029263 1.782115 -5.426340 2.222408 -7.574458 1.782908 -1.512050 5.296039 1.399679 -2.748597 -11.598198 2.748928 1.295468 16.355726 -4.750273 2.755869 0.000007 -0.000001 0.000005 0.896744 -0.085821 -0.202477 8.415804 1.065704 -0.882723 8.721997 -6.628664 -22.176270 -11.614398 -2.752554 -1.297662 -1.459721 -1.503349 11.941843 -0.000009 0.000000 -0.000009 -4.980125 1.778300 -10.622662 -25.446618 1.775856 3.791244 -1.286757 -5.614763 4.393015 21.027516 5.372441 -0.490065 -10.174775 -2.542526 -0.449842 -2.925591 1.884911 0.276350 -0.023471 0.128155 -0.338738 0.000007 -0.000002 -0.000001 -17.846547 1.717928 -13.479714 3.185443 -0.821590 -0.053302 0.603179 2.483564 13.757775 22.695909 -5.272428 -8.012477 -0.403594 -4.279576 11.178116 -0.000001 -0.000005 -0.000005 0.009999 -0.008338 0.010783 +-4.208200 123.512800 -63.635300 -96.100899 -0.296850 9.354135 0.000001 0.000000 0.005542 -2.625789 -0.071916 -4.142029 7.540365 2.195017 -1.953129 5.210064 1.661870 -0.644862 -7.625032 1.245496 -3.205990 1.044870 1.436277 -0.611483 6.087657 -6.840694 3.168788 9.051807 0.436709 1.516281 -1.609780 0.058247 0.163316 1.868458 1.504658 3.068383 1.412903 -3.852657 3.803550 0.592473 -5.578280 1.838125 -6.911820 0.768318 -1.566718 5.307550 1.399336 -2.559865 -11.598225 2.748931 1.295473 16.624269 -4.092749 2.694370 0.000006 0.000003 -0.000004 0.000215 -0.001362 0.000654 8.914870 -0.089955 -1.241370 8.709710 -6.637300 -22.103624 -11.604966 -2.750444 -1.296387 -1.457993 -0.886646 12.052384 -0.000009 -0.000003 -0.000006 -5.200037 1.323269 -10.457075 -25.949864 2.152580 4.476543 -1.754031 -5.331209 4.827435 20.810364 5.318734 -0.474987 -10.073564 -2.509174 -0.439081 -2.498343 1.123896 0.155589 -0.023473 0.128156 -0.338740 0.000010 0.000000 0.000000 -19.868954 2.951713 -13.311024 9.316476 -2.405007 -0.027171 -5.548813 3.259404 13.390662 26.985854 -6.572671 -7.156605 -0.402666 -3.990690 10.427472 0.000001 -0.000004 -0.000004 0.009975 -0.008333 0.010794 +-3.060700 124.080400 -64.921000 -96.057730 0.099560 8.724681 -0.000000 0.000000 0.005542 -1.980681 -0.078358 -5.191271 7.467220 2.310402 -1.918435 4.783423 1.725931 0.248219 -7.722763 1.252363 -2.419687 1.072697 1.420648 -0.547620 6.685252 -7.407536 3.391862 9.844764 0.518883 1.624699 -1.609749 0.048422 0.162169 1.827142 1.464178 2.988892 1.372264 -3.689962 3.516300 -0.441891 -5.703777 1.501749 -6.363753 -0.233742 -1.647743 5.322935 1.412436 -2.372050 -11.598198 2.748927 1.295473 16.814020 -3.390184 2.624549 0.000006 0.000002 0.000006 0.000210 -0.001365 0.000654 7.848873 -1.048652 -1.271419 8.739872 -6.629658 -22.242062 -11.595523 -2.748325 -1.295122 -0.948475 -0.074881 12.167169 -0.000008 -0.000002 -0.000007 -5.438562 0.905092 -9.887231 -26.337577 2.514312 5.154970 -1.559196 -4.852078 5.683439 19.510072 4.995818 -0.388995 -9.441588 -2.347978 -0.416630 -2.164757 0.392751 0.076613 -0.022079 0.120747 -0.319148 0.000006 -0.000004 -0.000001 -21.071916 3.751063 -12.945066 14.461527 -3.723482 0.125206 -11.472400 3.892393 12.792610 31.333561 -7.484053 -6.093981 -0.396041 -3.623991 9.474826 -0.000005 -0.000005 -0.000007 0.009982 -0.008327 0.010783 +-2.090100 125.118100 -65.984400 -95.987969 0.349952 7.752132 -0.000001 0.000000 0.005541 -0.934505 -0.085350 -5.597007 7.258583 2.356391 -1.757101 4.041011 1.790392 0.833049 -7.764397 1.262421 -1.788347 1.058328 1.380828 -0.522664 7.285262 -7.740766 3.539644 10.807074 0.550929 1.631447 -1.609710 0.038597 0.161021 1.791526 1.451738 2.880107 1.351963 -3.525543 3.173935 -1.422655 -5.817056 1.180964 -5.750061 -1.057640 -1.669687 5.335551 1.424669 -2.211998 -11.598198 2.748930 1.295472 16.883681 -2.805352 2.546111 0.000006 0.000003 0.000003 0.000212 -0.001366 0.000657 7.043286 -1.944257 -1.338095 8.760530 -6.636857 -22.296843 -11.606512 -2.750791 -1.296598 -0.670022 0.673857 12.276232 -0.000006 -0.000003 0.000001 -5.687525 0.601316 -8.957485 -26.633452 2.826159 5.733641 -0.175538 -3.909576 6.951361 16.000495 4.114099 -0.193712 -7.730599 -1.938442 -0.297732 -1.915930 -0.177715 0.001596 -0.017888 0.098531 -0.260409 0.000008 -0.000002 0.000000 -20.228363 3.641805 -12.660656 15.896289 -4.087719 0.188756 -13.741326 3.936650 11.326848 32.480681 -6.942773 -5.240152 -0.378876 -3.159578 8.268148 -0.000001 -0.000004 -0.000001 0.009979 -0.008339 0.010798 +-1.229500 126.308400 -66.889200 -95.881854 0.514615 6.690472 -0.000000 0.000000 0.005545 0.130654 -0.093500 -5.705990 6.981317 2.350044 -1.558639 3.261342 1.813276 1.226765 -7.727180 1.289678 -1.278186 1.065456 1.329795 -0.475149 7.875320 -7.906379 3.588032 11.748441 0.540811 1.547789 -1.603200 0.042851 0.152208 1.757959 1.490761 2.733985 1.367844 -3.379353 2.812382 -2.289415 -5.932520 0.896608 -5.129338 -1.716006 -1.664994 5.335128 1.425073 -2.001390 -11.608197 2.751167 1.296819 16.861490 -2.282629 2.489816 0.000006 0.000005 -0.000000 0.006986 -0.001990 -0.000887 6.341927 -2.678959 -1.390034 8.753373 -6.636279 -22.293796 -11.608238 -2.751177 -1.296836 -0.472551 1.359195 12.393355 -0.000007 -0.000004 -0.000000 -5.949475 0.356586 -7.918601 -26.832402 3.041555 6.122030 1.803643 -2.658545 8.305407 11.339290 2.925259 -0.018589 -5.472961 -1.378707 -0.185662 -1.734606 -0.672999 -0.034502 -0.012271 0.068542 -0.180994 0.000008 -0.000002 0.000001 -17.798068 3.124040 -12.959395 15.006322 -3.862004 0.148266 -12.348326 3.443508 8.386505 29.473936 -4.634983 -4.332757 -0.328238 -2.383411 6.249078 0.000001 -0.000004 0.000001 0.009981 -0.008329 0.010776 +-0.552000 126.979800 -67.603400 -95.736302 0.600566 5.548927 -0.000000 0.000000 0.005543 0.581185 -0.086366 -5.559197 6.680148 2.347771 -1.406064 2.875328 1.856797 1.429885 -7.460820 1.313791 -0.806969 1.064904 1.258092 -0.412608 8.420051 -7.904805 3.570440 12.540270 0.497485 1.420726 -1.603219 0.042852 0.152209 1.739411 1.581423 2.528757 1.398605 -3.267882 2.439326 -2.773641 -5.983986 0.736726 -5.005918 -2.330169 -1.763466 5.366474 1.435916 -1.682143 -11.608197 2.751170 1.296810 16.936286 -1.740348 2.422494 0.000009 0.000005 0.000003 0.006985 -0.001985 -0.000884 5.604032 -3.294959 -1.398114 8.771027 -6.636347 -22.248230 -11.608233 -2.751178 -1.296830 -0.253593 2.023421 12.470840 -0.000007 -0.000004 -0.000008 -6.245321 0.195660 -6.806107 -26.953976 3.186473 6.353289 3.087704 -1.661648 9.598701 8.214175 2.120795 0.044368 -3.959850 -0.994577 -0.122809 -1.659229 -1.035968 -0.068354 -0.008969 0.051272 -0.135298 0.000007 -0.000002 -0.000008 -15.074559 2.835828 -13.638172 14.279725 -3.677202 0.117811 -9.912952 2.724390 4.669440 24.481295 -1.757608 -2.902503 -0.220197 -1.366708 3.595416 -0.000003 -0.000003 -0.000004 0.009975 -0.008323 0.010785 +-0.094200 127.022500 -68.174800 -95.486951 0.559047 4.385287 -0.000000 0.000000 0.005542 0.272775 -0.078898 -5.146566 6.364964 2.344311 -1.280898 2.957138 1.944784 1.437401 -6.970762 1.340214 -0.403945 1.092413 1.186208 -0.350668 8.889735 -7.722959 3.477571 13.080736 0.423893 1.269672 -1.617161 0.029801 0.135758 1.753252 1.694706 2.280292 1.451037 -3.183942 2.061093 -2.773636 -5.983973 0.736722 -5.883742 -2.842622 -2.056570 1.846262 2.341682 1.373085 -2.569425 0.632192 0.239083 15.135687 -0.051836 0.568254 0.000005 0.000004 -0.000004 0.006992 -0.001993 -0.000885 5.082198 -3.908962 -1.454449 8.779683 -6.628017 -22.085442 -11.608236 -2.751175 -1.296832 -0.250484 2.719122 12.575610 -0.000006 -0.000005 0.000003 -6.638773 0.136342 -5.651223 -27.038178 3.307804 6.533831 3.116665 -1.187065 10.798679 7.649004 1.974932 0.051066 -3.681805 -0.923336 -0.109997 -1.663225 -1.258222 -0.103410 -0.008492 0.048805 -0.128778 0.000007 -0.000002 0.000005 -12.455028 2.577180 -14.149439 13.139339 -3.386296 0.074746 -7.302015 1.920996 1.526737 19.093623 0.434518 -1.298741 -0.084679 -0.467488 1.234248 -0.000003 -0.000004 -0.000006 0.009978 -0.008325 0.010788 +0.180500 126.906500 -68.555800 -95.182648 0.516260 3.249291 0.000001 0.000000 0.005542 -0.267204 -0.072619 -4.552024 6.014176 2.312414 -1.174574 3.172703 2.005236 1.310129 -6.389983 1.358096 -0.066730 1.119830 1.081371 -0.264695 9.251478 -7.389633 3.313367 13.250342 0.342880 1.102125 -1.631133 0.016754 0.119305 1.770320 1.866140 1.990597 1.525014 -3.111384 1.645940 -2.773651 -5.983979 0.736723 -7.148910 -3.337140 -2.431691 -2.285222 2.779424 6.540395 7.762684 -1.969099 -0.547945 15.545159 1.031032 -3.045037 0.000011 0.000002 -0.000003 0.006989 -0.001991 -0.000886 4.706606 -4.467391 -1.516173 8.748782 -6.610366 -21.867563 -11.608235 -2.751176 -1.296834 -0.371722 3.387297 12.687017 -0.000007 -0.000003 -0.000004 -7.094900 0.061200 -4.521139 -27.093803 3.422586 6.638160 2.795900 -0.970626 11.942158 7.801989 2.014424 0.049394 -3.756311 -0.943043 -0.116574 -1.714519 -1.390242 -0.104593 -0.008028 0.046340 -0.122248 0.000007 -0.000002 -0.000001 -9.730427 1.679149 -13.865653 10.046321 -2.592936 -0.012776 -4.842301 1.221939 0.157647 15.032977 1.389283 -0.447993 -0.011120 -0.062134 0.163996 -0.000001 -0.000004 -0.000009 0.009973 -0.008325 0.010781 +0.272100 126.717300 -68.809700 -94.887356 0.641941 2.043229 -0.000002 0.000000 0.005543 -0.869693 -0.064331 -3.684718 5.661267 2.162419 -1.009450 3.446576 1.962536 1.031799 -5.774258 1.313389 0.162045 1.098435 0.976766 -0.177796 9.486329 -6.919354 3.058266 12.979850 0.206113 0.858292 -1.645094 0.003711 0.102849 1.796366 2.075330 1.659490 1.620071 -3.066994 1.225515 -2.773653 -5.983977 0.736721 -8.461419 -3.717525 -2.794450 -4.240264 2.305990 12.509358 12.696020 -3.252893 -0.756108 20.490139 -0.271888 -7.549711 0.000010 0.000005 -0.000009 0.006985 -0.001989 -0.000885 4.363296 -4.872455 -1.557136 8.731717 -6.594729 -21.646886 -11.608239 -2.751175 -1.296832 -0.472551 3.959743 12.770421 -0.000008 -0.000003 -0.000002 -7.560604 -0.186392 -3.341153 -27.103838 3.508340 6.678722 2.280559 -1.130595 13.143048 8.524109 2.200751 0.040092 -4.109254 -1.031424 -0.122464 -1.833603 -1.436270 -0.107530 -0.009442 0.053736 -0.141826 0.000007 -0.000003 -0.000007 -7.431137 0.030393 -12.835816 5.734775 -1.480427 -0.063037 -2.735105 0.694375 0.080365 9.186570 2.667866 -0.243315 -0.006392 -0.037465 0.098721 -0.000000 -0.000003 -0.000007 0.009999 -0.008336 0.010780 +0.162200 126.528100 -68.936700 -94.591692 0.845445 0.899236 -0.000001 0.000000 0.005542 -1.470938 -0.042552 -2.663726 5.307834 1.948839 -0.829675 3.721409 1.836571 0.665522 -5.158214 1.225288 0.305611 1.049263 0.875268 -0.055650 9.631073 -6.439889 2.748541 12.534622 -0.007578 0.468102 -1.659058 -0.009328 0.086389 1.837630 2.328091 1.243174 1.718143 -3.016787 0.785399 -2.753685 -5.942967 0.727620 -9.439492 -4.027807 -3.075862 -5.378647 1.468761 18.524561 15.856240 -4.082466 -0.831096 26.229555 -3.284001 -11.765018 0.000012 0.000003 -0.000006 0.006981 -0.001983 -0.000888 4.071651 -5.102623 -1.553066 8.720484 -6.584503 -21.502045 -11.608242 -2.751178 -1.296835 -0.587324 4.399966 12.855714 -0.000007 -0.000003 0.000002 -8.025758 -0.534239 -2.240915 -27.064520 3.534104 6.656580 1.736302 -1.518586 14.257842 9.395459 2.425359 0.025728 -4.529618 -1.140254 -0.149481 -1.972504 -1.386391 -0.110943 -0.010862 0.061142 -0.161411 0.000008 -0.000001 -0.000003 -8.200731 -0.209506 -11.726929 6.268258 -1.618295 -0.061355 -2.982006 0.764906 0.083611 9.376144 2.736778 -0.254711 -0.006871 -0.039930 0.105249 0.000001 -0.000004 0.000002 0.009980 -0.008331 0.010789 +-0.130800 126.406000 -69.016100 -94.292735 1.057910 0.103860 -0.000000 0.000000 0.005543 -1.932698 -0.037083 -1.670473 4.995945 1.655114 -0.713540 3.912170 1.583541 0.156304 -4.597787 1.075477 0.259945 0.930377 0.775483 0.088317 9.767316 -5.698174 2.278290 11.870978 -0.330258 -0.168203 -1.700998 -0.039748 0.047967 1.945613 2.783408 0.605201 1.917400 -3.062745 0.162709 -2.609001 -5.622366 0.690596 -9.168331 -3.314683 -2.879401 -6.923580 -0.058159 26.809713 20.617674 -5.335592 -0.857267 31.673117 -9.956909 -16.020719 0.000009 0.000002 0.000000 0.006980 -0.001985 -0.000887 3.777768 -4.930226 -1.451417 8.710835 -6.575761 -21.377932 -11.608238 -2.751172 -1.296839 -0.592010 4.671547 12.891071 -0.000009 -0.000004 -0.000006 -8.484230 -0.860227 -1.464047 -26.973845 3.543067 6.547727 1.290230 -1.977670 15.025137 10.050070 2.593904 0.012699 -4.848661 -1.220073 -0.156535 -2.070762 -1.256707 -0.092232 -0.011327 0.063610 -0.167942 0.000007 -0.000002 0.000001 -8.675139 -0.611645 -10.984548 6.415712 -1.656397 -0.060665 -3.057411 0.771746 0.092099 9.468890 2.854881 -0.282672 -0.007331 -0.042397 0.111775 -0.000001 -0.000003 0.000000 0.009977 -0.008335 0.010778 +-0.783900 126.351100 -69.047800 -93.949761 1.267466 -0.196846 -0.000000 0.000000 0.005543 -2.337965 -0.013587 -0.740480 4.684498 1.371727 -0.718238 4.037373 1.313811 -0.468348 -4.114689 0.930988 0.056340 0.622932 0.653961 0.236259 9.952078 -4.965295 1.784364 11.154100 -0.691290 -0.897519 -1.728937 -0.070132 0.009536 2.049305 3.185708 0.032720 2.074068 -3.089346 -0.379494 -2.410734 -5.199036 0.630519 -7.398664 -2.654834 -2.355601 -5.106236 0.714703 24.015493 16.434319 -4.234535 -0.839837 25.813435 -7.053112 -14.614242 0.000009 0.000003 -0.000002 0.006987 -0.001993 -0.000884 3.527282 -4.596058 -1.317349 8.706015 -6.571404 -21.315876 -11.608237 -2.751176 -1.296837 -0.537114 4.777350 12.893538 -0.000005 -0.000002 -0.000002 -9.014753 -1.105691 -1.217343 -26.825976 3.482970 6.373000 0.800070 -2.586409 15.254389 10.562433 2.725690 0.001147 -5.093017 -1.281477 -0.163827 -2.079562 -0.972811 -0.071418 -0.011804 0.066073 -0.174461 0.000008 -0.000002 -0.000006 -8.918094 -1.177652 -10.772717 6.190658 -1.598244 -0.061682 -2.952948 0.748290 0.099160 9.430551 3.129719 -0.304114 -0.006864 -0.039929 0.105240 -0.000001 -0.000003 -0.000001 0.009972 -0.008328 0.010787 +-1.638500 126.308400 -69.031900 -93.584936 1.461436 -0.394409 0.000001 0.000000 0.005543 -2.701619 0.005476 0.371509 4.373468 1.110587 -0.676072 4.124289 1.032563 -1.174878 -3.688289 0.768953 -0.278794 0.119849 0.553249 0.404719 10.144642 -4.300057 1.311762 10.431872 -1.066106 -1.703123 -1.756937 -0.113509 -0.045372 2.150895 3.571431 -0.529694 2.226364 -3.101984 -0.887796 -2.215770 -4.751390 0.573329 -4.716715 -1.926887 -1.621930 0.193268 1.896928 18.351444 4.267485 -1.072939 -0.334124 18.578740 -3.933991 -11.147547 0.000005 0.000005 -0.000004 0.006980 -0.001983 -0.000889 3.199831 -4.034296 -1.111693 8.714048 -6.578667 -21.419292 -11.608236 -2.751173 -1.296836 -0.321692 4.654214 12.854823 -0.000006 -0.000002 0.000000 -9.543939 -1.325319 -1.052290 -26.620334 3.343112 6.114369 0.300897 -3.286020 15.373028 11.074899 2.857375 -0.011582 -5.337387 -1.342850 -0.171395 -2.065929 -0.591354 -0.022277 -0.012273 0.068542 -0.180999 0.000006 -0.000001 -0.000009 -9.126564 -1.816563 -10.667710 5.938511 -1.533086 -0.062538 -2.828842 0.714699 0.078933 9.336962 3.480781 -0.322163 -0.006394 -0.037462 0.098716 -0.000001 -0.000005 -0.000003 0.009971 -0.008332 0.010778 +-2.254900 126.277900 -68.968500 -93.241399 1.549746 -0.480348 -0.000000 0.000000 0.005543 -3.023532 0.015185 1.259772 4.062925 0.870555 -0.621880 4.159492 0.767478 -1.755283 -3.297890 0.606591 -0.661208 -0.452880 0.445805 0.517132 10.328570 -3.651578 0.878574 9.673450 -1.331775 -2.340859 -1.784976 -0.156860 -0.100302 2.264004 3.983649 -1.122712 2.378541 -3.115948 -1.396038 -2.000073 -4.301870 0.520896 -3.060109 -1.370738 -1.154292 5.018770 2.199477 15.053076 -6.879111 1.664707 0.702214 14.374982 -3.507482 -9.254545 0.000004 0.000003 0.000001 0.006993 -0.001987 -0.000888 2.791734 -3.144552 -0.808541 8.749903 -6.595045 -21.608215 -11.608238 -2.751177 -1.296830 0.049671 4.351058 12.769722 -0.000006 -0.000001 -0.000002 -10.091274 -1.409235 -0.989129 -26.347470 3.157865 5.760869 -0.074733 -3.717173 15.390914 11.350075 2.928025 -0.018891 -5.473071 -1.377496 -0.178781 -2.081938 -0.308897 0.005590 -0.012742 0.071010 -0.187514 0.000007 -0.000002 -0.000008 -9.371839 -2.200942 -10.651527 5.862453 -1.513427 -0.062743 -2.792442 0.706738 0.078700 9.224369 3.742966 -0.338513 -0.005918 -0.034997 0.092188 -0.000003 -0.000004 0.000002 0.009975 -0.008329 0.010776 +-2.328200 126.259500 -68.857400 -92.857341 1.455609 -0.476426 -0.000000 0.000000 0.005543 -3.310370 0.014009 1.637506 3.753422 0.701214 -0.528824 4.152222 0.545850 -2.001990 -2.943105 0.467661 -0.978191 -1.060571 0.354319 0.585143 10.481087 -2.946282 0.524751 8.897041 -1.466569 -2.747275 -1.813048 -0.200184 -0.155253 2.414950 4.452580 -1.808627 2.546869 -3.166804 -1.964284 -1.817763 -3.901311 0.475201 -2.514038 -0.920481 -0.943431 5.671929 2.208709 14.990703 -8.314325 1.999929 0.873300 10.067088 -3.122871 -9.550876 0.000006 0.000004 0.000000 0.006988 -0.001993 -0.000883 2.427278 -2.100692 -0.486469 8.790794 -6.592756 -21.825613 -11.608238 -2.751176 -1.296835 0.419982 3.954040 12.686955 -0.000007 -0.000006 0.000000 -10.677293 -1.306774 -0.966459 -26.007298 2.915725 5.294833 -0.302907 -3.629700 15.382358 11.191272 2.887260 -0.014621 -5.398176 -1.360423 -0.185354 -2.153854 -0.238165 0.012229 -0.013214 0.073477 -0.194045 0.000007 -0.000003 -0.000001 -9.780319 -2.107860 -10.656377 6.111501 -1.577788 -0.061992 -2.912195 0.737419 0.077296 9.124889 3.766260 -0.327459 -0.006859 -0.039932 0.105251 -0.000004 -0.000003 -0.000009 0.009977 -0.008329 0.010778 +-2.047400 126.271700 -68.698600 -92.390365 1.228073 -0.431351 -0.000000 0.000000 0.005542 -3.597633 0.027072 1.658254 3.402715 0.588012 -0.423653 4.098546 0.412282 -2.012531 -2.630350 0.359524 -1.215761 -1.668149 0.259797 0.624292 10.581369 -2.177926 0.181320 8.121738 -1.557717 -3.087212 -1.869130 -0.234720 -0.199357 2.619660 5.028963 -2.626172 2.751147 -3.238702 -2.605092 -1.608338 -3.446370 0.414977 -2.248243 -0.465395 -0.795240 5.748629 2.208699 15.027492 -8.479861 2.038292 0.893559 7.557360 -2.974042 -9.680045 0.000007 0.000002 -0.000001 0.006988 -0.001988 -0.000887 2.169294 -1.012079 -0.168603 8.578545 -6.576368 -22.092124 -11.016045 -2.618048 -1.217571 0.365345 3.461569 12.571574 -0.000010 -0.000003 -0.000005 -11.351838 -1.055652 -0.937898 -25.599435 2.594051 4.736980 -0.395950 -3.143159 15.362813 10.605326 2.736723 0.000131 -5.113220 -1.287814 -0.170743 -2.282222 -0.307848 0.018617 -0.011799 0.066076 -0.174466 0.000008 -0.000002 -0.000005 -10.313094 -1.686271 -10.663302 6.509563 -1.680644 -0.060179 -3.106293 0.789111 0.089222 9.023432 3.646891 -0.316368 -0.007808 -0.044863 0.118295 -0.000000 -0.000003 -0.000002 0.009975 -0.008323 0.010786 +-1.571300 126.332800 -68.539900 -91.923639 0.917297 -0.307237 -0.000000 0.000000 0.005543 -3.716386 0.019422 1.378557 2.968455 0.502341 -0.333064 3.864739 0.327625 -1.851194 -2.282776 0.259443 -1.354530 -2.254897 0.184847 0.646680 10.630159 -1.405609 -0.151849 7.361732 -1.612308 -3.355218 -1.953184 -0.269103 -0.243616 2.907264 5.751988 -3.643056 3.005022 -3.343920 -3.341086 -1.311115 -2.816554 0.341119 -2.475449 -0.290462 -0.811354 5.664999 2.215396 15.252250 -8.258180 1.986901 0.866450 7.224625 -3.058222 -9.728201 0.000007 0.000003 -0.000006 0.006987 -0.001984 -0.000889 2.027159 0.014710 0.100818 8.442746 -6.570066 -22.343330 -10.628183 -2.530391 -1.166394 0.328125 3.016229 12.489736 -0.000007 -0.000002 -0.000003 -12.039064 -0.724369 -0.934751 -25.121164 2.217600 4.049643 -0.346753 -2.408072 15.290480 9.680562 2.498785 0.020289 -4.665254 -1.175049 -0.156351 -2.430536 -0.453127 -0.003343 -0.010393 0.058672 -0.154880 0.000007 -0.000003 -0.000013 -10.829117 -1.095440 -10.702508 6.894082 -1.779984 -0.057754 -3.300397 0.840763 0.101329 8.904442 3.445405 -0.283498 -0.007331 -0.042398 0.111770 -0.000004 -0.000004 -0.000003 0.009984 -0.008329 0.010783 +-1.058600 126.442600 -68.381200 -91.477049 0.587058 -0.075326 -0.000000 0.000000 0.005543 -3.688274 0.012672 0.923962 2.534302 0.414966 -0.285083 3.554704 0.256766 -1.592641 -1.976902 0.178053 -1.428812 -2.764831 0.122151 0.639052 10.606086 -0.665932 -0.453393 6.660413 -1.617844 -3.562965 -2.072268 -0.303261 -0.288102 3.316136 6.656580 -4.938443 3.283641 -3.501798 -4.197722 -0.986248 -2.119730 0.244838 -2.745967 -0.237164 -0.861106 5.537765 2.219462 15.461359 -7.941451 1.913279 0.828055 6.885105 -3.098388 -9.777085 0.000008 0.000002 -0.000005 0.006992 -0.001992 -0.000884 1.920131 1.022901 0.355157 8.274930 -6.560410 -22.635930 -10.172414 -2.426910 -1.107004 0.210545 2.574848 12.411560 -0.000007 -0.000005 0.000003 -12.697455 -0.355911 -1.003959 -24.566758 1.771863 3.240884 -0.162671 -1.576364 15.106551 8.518861 2.199400 0.040166 -4.102256 -1.031148 -0.129315 -2.574628 -0.618892 -0.025674 -0.008975 0.051273 -0.135300 0.000007 -0.000003 0.000000 -11.210370 -0.476667 -10.843817 7.136384 -1.842569 -0.055881 -3.413027 0.872250 0.113963 8.781209 3.223330 -0.250809 -0.007819 -0.044861 0.118302 -0.000000 -0.000005 -0.000003 0.009973 -0.008325 0.010783 +-0.930400 126.564700 -68.143100 -91.147315 0.301408 0.467752 -0.000000 0.000000 0.005542 -3.576292 0.007673 0.525303 2.232985 0.322890 -0.385465 3.272289 0.163041 -1.501165 -1.803981 0.099667 -1.502343 -3.226027 0.078030 0.594174 10.584298 -0.065176 -0.728593 5.990733 -1.564094 -3.655009 -2.415076 -0.314496 -0.306406 4.487842 8.805232 -8.066257 3.919592 -3.959721 -5.988108 -0.597878 -1.268821 0.154382 -3.045686 -0.334761 -0.945429 5.061349 2.208004 15.622538 -6.857637 1.659661 0.699713 6.086609 -3.038564 -9.717572 0.000008 0.000002 0.000000 0.006981 -0.001983 -0.000887 1.875831 1.979678 0.581509 7.970120 -6.529858 -22.976808 -9.376864 -2.245085 -1.005272 -0.146997 2.081224 12.314151 -0.000008 -0.000002 0.000000 -13.250699 -0.017462 -1.164513 -23.939021 1.250041 2.306560 0.069731 -0.978926 14.588912 7.384594 1.906668 0.053702 -3.559720 -0.892018 -0.103608 -2.623990 -0.622023 -0.019232 -0.007551 0.043871 -0.115716 0.000007 -0.000003 -0.000007 -11.307014 -0.076297 -11.329514 7.114509 -1.836920 -0.056069 -3.404154 0.868470 0.099766 8.555609 3.158881 -0.240709 -0.008280 -0.047333 0.124825 -0.000001 -0.000004 0.000001 0.009985 -0.008332 0.010778 +-1.241700 126.754000 -67.889100 -90.983697 0.122013 1.271515 -0.000000 0.000000 0.005543 -3.247520 0.004854 0.217542 2.015007 0.192452 -0.611680 2.919421 0.050850 -1.569653 -1.729065 0.022824 -1.554572 -3.631554 0.059743 0.511673 10.604629 0.362992 -0.966190 5.352771 -1.453247 -3.675517 -2.911555 -0.289806 -0.326378 6.500156 11.615031 -12.698511 4.633107 -4.581505 -8.120369 -0.208247 -0.418544 0.058182 -3.326675 -0.515356 -1.040953 4.277096 2.180381 15.723435 -5.069192 1.235644 0.498372 4.887800 -2.869204 -9.614147 0.000006 0.000001 0.000006 0.006988 -0.001987 -0.000889 1.917016 2.818639 0.764928 7.542993 -6.479228 -23.369822 -8.289569 -1.994182 -0.870295 -0.765695 1.567374 12.221935 -0.000008 -0.000004 -0.000001 -13.643566 0.241207 -1.463020 -23.234328 0.641626 1.236612 0.407398 -0.696709 13.783049 6.284437 1.622477 0.061295 -3.017270 -0.752647 -0.079220 -2.573197 -0.454260 -0.011749 -0.006140 0.036468 -0.096140 0.000007 -0.000003 0.000005 -10.967861 -0.034493 -12.117959 6.598184 -1.703540 -0.059678 -3.171214 0.809302 0.086764 8.282812 3.276052 -0.227859 -0.007326 -0.042400 0.111777 -0.000001 -0.000002 -0.000003 0.009980 -0.008335 0.010780 +-1.583500 127.022500 -67.619300 -91.038840 0.092463 1.971062 -0.000000 0.000000 0.005542 -2.729925 0.000478 -0.090209 1.978010 0.026977 -0.788882 2.566018 -0.079206 -1.559033 -1.829614 -0.072317 -1.558725 -3.883418 0.065413 0.441042 10.546438 0.627854 -1.101660 4.817110 -1.388252 -3.696027 -3.177227 -0.266302 -0.345021 7.703103 12.959187 -15.254428 4.944471 -4.877696 -9.105323 -0.002735 0.001833 -0.003079 -3.350555 -0.300758 -0.992183 3.751270 2.167824 15.552725 -3.899072 0.954676 0.373761 4.033955 -2.844930 -9.547461 0.000006 0.000005 -0.000002 0.006985 -0.001987 -0.000885 2.099060 3.506262 0.877239 7.203231 -6.427439 -23.767233 -7.420302 -1.791653 -0.765767 -1.361228 1.109788 12.123936 -0.000008 -0.000003 -0.000001 -13.813959 0.393771 -1.944636 -22.457095 -0.061482 0.027713 1.097781 -0.500752 13.089097 4.920349 1.269928 0.063117 -2.366261 -0.586155 -0.057191 -2.522450 -0.286480 0.016551 -0.004710 0.029070 -0.076551 0.000008 -0.000001 0.000003 -10.099537 -0.334336 -12.846979 5.370770 -1.386350 -0.063441 -2.578479 0.661070 0.076792 8.037370 3.387347 -0.216050 -0.006390 -0.037465 0.098718 -0.000004 -0.000003 -0.000008 0.009978 -0.008327 0.010777 diff --git a/data/gradio_target_bvh/human/amy.bvh b/data/gradio_target_bvh/human/amy.bvh new file mode 100644 index 0000000000000000000000000000000000000000..ea13ae23fc3f5e8ef7f5d26f444e2bede08e6864 --- /dev/null +++ b/data/gradio_target_bvh/human/amy.bvh @@ -0,0 +1,154 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000977 69.771477 -0.854512 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 3.962418 -0.274296 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 14.122192 -0.320012 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 11.399155 -0.365729 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 9.938156 -0.411444 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 8.579109 0.114166 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + JOINT LeftShoulder + { + OFFSET 4.224091 8.888405 -0.424647 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 8.610406 -2.092285 -0.026407 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 18.970837 -0.091499 0.396055 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 19.873541 0.423027 0.845942 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -4.224091 8.888405 -0.398240 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -8.610408 -2.092285 0.026408 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -18.970840 -0.091469 0.308731 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -19.873539 0.423019 0.898699 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 7.557004 -4.826271 0.300536 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.639471 -24.051811 0.537042 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.129702 -33.062748 0.084999 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.092043 -7.483327 10.511639 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -7.557004 -4.826271 0.300536 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.639469 -24.051819 0.712148 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.129704 -33.062740 0.096890 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.092040 -7.483380 10.296503 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } +} +MOTION +Frames: 20 +Frame Time: 0.033333 +0 69.749016 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 69.749016 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ No newline at end of file diff --git a/data/gradio_target_bvh/human/guard.bvh b/data/gradio_target_bvh/human/guard.bvh new file mode 100644 index 0000000000000000000000000000000000000000..c6dd1b6ce60c0f6986037ea962e967db97a8127c --- /dev/null +++ b/data/gradio_target_bvh/human/guard.bvh @@ -0,0 +1,154 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 100.029053 -0.953783 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000001 14.652451 0.432472 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.000000 10.372513 0.047685 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000000 10.084991 0.302715 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.000000 31.685013 0.246450 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.000000 11.408890 1.920896 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + JOINT LeftShoulder + { + OFFSET 10.912857 26.732727 -2.705630 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 13.894782 -9.017105 1.215676 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 32.327591 0.000046 0.000037 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 28.017906 -0.000046 0.489008 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -10.912901 26.732986 -2.705629 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -13.894706 -9.016998 1.215670 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -32.327599 0.000015 0.000040 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -28.017925 -0.000015 0.489024 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 13.025906 -7.138229 0.858406 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.000000 -35.747234 3.351566 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000002 -40.157558 -5.897978 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.000003 -16.996769 16.944315 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -13.025900 -7.138252 0.858406 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.000021 -35.747196 3.351563 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000023 -40.157589 -5.897973 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 0.000006 -16.996881 16.944202 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0 0 0 + } + } + } + } + } +} +MOTION +Frames: 20 +Frame Time: 0.033333 +0 99.996262 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 99.996262 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ No newline at end of file diff --git a/data/gradio_target_bvh/human/mousey.bvh b/data/gradio_target_bvh/human/mousey.bvh new file mode 100755 index 0000000000000000000000000000000000000000..a06a4c90cb643d00e712e0625732557daaf0f3de --- /dev/null +++ b/data/gradio_target_bvh/human/mousey.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 6.876060 0.125662 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 8.022060 0.146603 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 9.168079 0.167547 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 10.314075 0.188489 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 7.643753 -2.377445 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 45.857788 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 4.392187 8.825001 0.174995 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 8.774866 -2.970879 -0.026997 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 8.450586 -0.797432 -0.648343 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 18.458662 0.962311 0.193148 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 8.556145 -0.261200 0.258753 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -4.392150 8.825024 0.141388 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -8.774886 -2.970947 -0.094209 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -8.450586 -0.797386 -0.330665 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -18.458664 0.962341 0.025780 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.158691 -0.528496 0.196552 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 10.205382 -3.823519 0.155145 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.283732 -12.998343 0.567794 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET -1.058953 -10.688869 -2.184322 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.108145 -7.191069 7.560211 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.070226 0.081726 4.490266 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -10.205383 -3.823513 0.005508 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.283728 -12.998341 0.610627 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 1.058956 -10.688892 -1.945833 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.108150 -7.191040 7.372945 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.070229 0.081738 4.479398 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 diff --git a/data/gradio_z/animo/arctic_wolf_female_fightflee.pt b/data/gradio_z/animo/arctic_wolf_female_fightflee.pt new file mode 100644 index 0000000000000000000000000000000000000000..12898cea973395193199e793d686ac78094f43ed --- /dev/null +++ b/data/gradio_z/animo/arctic_wolf_female_fightflee.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:196073c17eca053bf25f8476dfe623bf863da1a8588e742dd11c8faa881edbda +size 166823 diff --git a/data/gradio_z/animo/arctic_wolf_female_fighttaunt.pt b/data/gradio_z/animo/arctic_wolf_female_fighttaunt.pt new file mode 100644 index 0000000000000000000000000000000000000000..742ee084a9bb7dbd64612361d430edfc6e468fac --- /dev/null +++ b/data/gradio_z/animo/arctic_wolf_female_fighttaunt.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e6bd7b17b1972c4c0dc50dbc575c964e66b7b1e63b1c2820e131cb058d3b538 +size 215918 diff --git a/data/gradio_z/animo/dromedary_camel_male_runtostandturnl.pt b/data/gradio_z/animo/dromedary_camel_male_runtostandturnl.pt new file mode 100644 index 0000000000000000000000000000000000000000..967e2ca10991ce9f9f972ca61a2b5f9e7422c985 --- /dev/null +++ b/data/gradio_z/animo/dromedary_camel_male_runtostandturnl.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0a829ca19cbd07904cb24b47499b3c0de1362c5678d70df68ff9b798d4bd331 +size 42399 diff --git a/data/gradio_z/human/000327.pt b/data/gradio_z/human/000327.pt new file mode 100644 index 0000000000000000000000000000000000000000..e352935fd4ae2c904c29c09d86799ff3e1186fb3 --- /dev/null +++ b/data/gradio_z/human/000327.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5193266ad648f7dbf5437c16efd79cc2019331555c5376bffba1f93f1492a252 +size 234189 diff --git a/data/gradio_z/human/000419.pt b/data/gradio_z/human/000419.pt new file mode 100644 index 0000000000000000000000000000000000000000..6f9ad0c82960216e2c3dbf6328eddc1e74ba1988 --- /dev/null +++ b/data/gradio_z/human/000419.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be126944bd100213b2796bf71c41fdcac999a63ca83c66a08dfea56dbae4f4c6 +size 306445 diff --git a/data/gradio_z/human/000708.pt b/data/gradio_z/human/000708.pt new file mode 100644 index 0000000000000000000000000000000000000000..bb2c759253405e1b92e5cde8134916c882623286 --- /dev/null +++ b/data/gradio_z/human/000708.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41a45b196cd96c84bb9e6bfcb1ea3b86eb49e1a83a1a761e39cf8af8529570d7 +size 98829 diff --git a/data/gradio_z/human/000926.pt b/data/gradio_z/human/000926.pt new file mode 100644 index 0000000000000000000000000000000000000000..cd17ffd173881a09f61592deaaf0e877daf7472d --- /dev/null +++ b/data/gradio_z/human/000926.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:191470278e8158c1797e03d74472fed2cde2bf7583d2a5b857dc9fcac22e5cc1 +size 306061 diff --git a/data/test/character/bvh/Erika_Archer.bvh b/data/test/character/bvh/Erika_Archer.bvh new file mode 100755 index 0000000000000000000000000000000000000000..ddbf12fb85fe83dc1cd59a171e13f53b4b1e3490 --- /dev/null +++ b/data/test/character/bvh/Erika_Archer.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 10.181564 0.000003 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 10.096741 -0.856915 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 9.103981 -1.346359 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 16.669510 -2.530871 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.000000 9.620834 1.668046 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000001 17.819687 2.553567 + } + } + } + JOINT LeftShoulder + { + OFFSET 4.570447 10.928711 -2.667416 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 10.581958 -0.532364 -2.243605 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 27.839630 -0.104752 -0.038214 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 28.333683 0.140823 0.242329 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.540894 -0.028336 -0.192544 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -4.569968 10.928986 -2.667449 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -10.593786 -0.552612 -2.180654 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -27.841286 -0.027542 0.100110 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -28.316490 0.000900 -0.107933 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -9.544182 0.054413 -0.043646 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 8.210525 -6.748398 -1.599506 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET -0.000001 -44.355556 0.765899 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000006 -44.422325 -3.432484 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.076090 -8.700683 10.601374 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.053405 -0.005641 9.272216 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.205050 -6.754982 -1.599693 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET 0.000001 -44.373592 0.740382 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000002 -44.408253 -3.354795 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.070210 -8.717638 10.583523 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.092095 0.012767 9.272036 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 +-0.002243 104.253632 1.554243 0.000000 0.000121 -0.003968 -0.000002 -0.000121 0.003968 0.000002 0.000000 0.000000 0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.512200 0.000000 0.000000 -0.000011 0.000023 -0.054486 0.000253 -0.078750 0.270004 0.003939 0.568634 -0.500339 0.049060 -1.646207 0.456377 0.000003 -0.000020 -0.051903 0.000129 -0.206034 -0.004668 0.000106 0.424394 0.058250 -0.062451 0.043518 0.324270 0.011762 -0.000119 0.003982 0.015461 -0.000001 0.000000 -0.027137 -0.000001 -0.000008 -0.000009 0.000000 0.000000 -0.063890 -0.000123 0.003983 0.234204 -0.000002 0.000000 -0.170305 0.000002 -0.000011 -0.000012 0.000000 0.000000 diff --git a/data/test/character/bvh/Ganfaul_M_Aure.bvh b/data/test/character/bvh/Ganfaul_M_Aure.bvh new file mode 100755 index 0000000000000000000000000000000000000000..d4bd38654a72c5b9ea114b42df2fb4563270cf8d --- /dev/null +++ b/data/test/character/bvh/Ganfaul_M_Aure.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET -0.006554 10.822571 -0.430666 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.022024 12.652817 -0.240400 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.025186 14.459457 0.072706 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.028105 16.135422 0.081134 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.011824 6.791046 -0.060768 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.060046 22.830978 3.541824 + } + } + } + JOINT LeftShoulder + { + OFFSET 10.999907 13.261276 -1.487039 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 14.552160 -7.882721 0.227024 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 27.184917 -0.403931 0.751265 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 21.512806 0.162033 0.972100 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 14.649872 -0.134018 -1.185059 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -10.905399 13.261246 -1.487044 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -14.393813 -8.080933 0.046537 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -19.952503 -0.082642 0.205434 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -28.800228 -0.045227 0.765344 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -14.697350 0.032928 0.542521 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 13.280540 -6.012527 -0.531383 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.102040 -52.159027 1.609787 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.114043 -50.747108 -4.804040 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 2.715803 -10.090007 19.353003 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.614182 0.152461 8.981287 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -13.293653 -6.012497 -0.531385 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.149572 -52.129765 1.579081 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.134576 -50.776436 -4.796190 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -2.862581 -10.046436 19.395977 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.687578 0.071777 9.005799 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 +0.006638 120.140877 0.292248 0.000000 0.000008 -0.000276 -0.000001 -0.000008 0.000276 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000037 0.000031 -0.000026 -0.000006 -0.000002 -0.347338 -0.017426 1.582770 1.198857 0.061544 1.003528 -1.281453 -2.887450 -7.230251 0.825454 -0.000002 -0.000010 -0.437524 0.004064 -0.589930 0.200564 0.006557 -0.932346 0.147006 -0.032238 -0.591992 0.218665 -0.077145 -0.000006 -0.120055 0.090862 0.000180 0.000012 -0.013761 -0.000069 0.120277 -0.000023 0.000014 -0.000007 -0.098284 -0.000018 0.158510 0.107995 -0.000337 0.000006 -0.009687 -0.000050 -0.158238 0.000021 0.000010 0.000033 diff --git a/data/test/character/bvh/Lola_B_Styperek.bvh b/data/test/character/bvh/Lola_B_Styperek.bvh new file mode 100755 index 0000000000000000000000000000000000000000..da777169245a3935dbe4acf9d77be6ca364785eb --- /dev/null +++ b/data/test/character/bvh/Lola_B_Styperek.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.001062 10.871696 -0.828475 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.002231 12.683662 -0.966557 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.002550 14.495621 -1.104636 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.002869 16.307541 -1.242715 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 11.176682 5.134540 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 19.355301 1.980896 + } + } + } + JOINT LeftShoulder + { + OFFSET 5.906069 14.347046 -1.215955 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 12.269737 -2.054611 0.053531 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 27.894693 0.000000 -0.000006 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 28.321167 -0.000031 0.494203 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.897095 -0.000031 0.172756 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -5.940464 14.346939 -1.215956 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -12.269637 -2.054565 0.053524 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -27.894707 0.000122 0.000051 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -28.321159 0.000000 0.494392 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -9.897095 0.000046 0.172715 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 12.499884 -6.038857 1.644858 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.000000 -51.639381 -0.252621 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000000 -44.215614 -2.733116 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 4.157143 -11.874953 16.184988 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.338816 0.061662 8.063603 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -12.499883 -6.038780 1.644858 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET 0.000025 -51.639431 -0.252635 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.000026 -44.215633 -2.733104 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -4.157145 -11.874966 16.184988 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.338816 0.061659 8.063605 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 +-0.000009 114.512894 -1.807405 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000010 -0.000005 0.001200 0.000023 0.000085 -0.000142 -0.000026 0.999714 0.000011 -0.000126 0.000108 -0.000016 -0.000009 0.000014 -0.002461 0.000036 0.000008 -0.000117 -0.000007 -0.999998 -0.000002 -0.000177 0.000539 0.000010 -0.109310 -0.000001 0.000021 0.239938 0.000000 0.000000 -0.130629 0.000007 0.000042 0.000002 0.000013 -0.000009 -0.109917 0.000030 0.000039 0.241372 0.000005 -0.000036 -0.131466 0.000045 -0.000061 0.000001 -0.000009 0.000005 diff --git a/data/test/character/bvh/Maria_WProp_J_J_Ong.bvh b/data/test/character/bvh/Maria_WProp_J_J_Ong.bvh new file mode 100755 index 0000000000000000000000000000000000000000..7df43e92f174120e6407e351fd60f0d4d16b3209 --- /dev/null +++ b/data/test/character/bvh/Maria_WProp_J_J_Ong.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.004643 5.245316 0.258835 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 11.044807 -0.697600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000000 8.068939 -1.087719 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.112201 18.919525 -3.736111 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 8.672989 3.319307 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 20.957291 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 6.339180 14.952881 -4.642896 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 8.985144 -1.694656 -0.046341 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 24.573874 -0.000061 0.000015 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 23.096611 -0.000015 0.000004 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 11.447548 0.000061 0.000031 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -6.339182 14.952698 -4.642892 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -8.985174 -1.694000 -0.046340 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -24.573891 -0.000015 0.000009 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -23.096607 -0.001022 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -11.447472 0.001007 0.000031 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 9.688764 -5.685226 -1.688622 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.000000 -43.142513 1.482017 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET -0.000002 -40.591805 -4.288599 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.933320 -15.817711 8.539860 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.564957 -0.013456 13.756601 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -9.688760 -5.685204 -1.688625 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET 0.000000 -43.142559 1.482020 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000000 -40.591808 -4.288606 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.933273 -15.817699 8.539874 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.565129 -0.013462 13.756560 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 +-0.000011 105.251816 1.768382 0.000000 0.000006 0.000024 0.000004 0.000001 -0.000018 0.000007 0.000000 0.000000 -0.000010 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000007 0.001345 -0.000025 0.000005 -0.001448 -0.000009 0.000000 0.000003 0.000466 0.000014 -0.000492 -0.000008 0.000017 0.003609 0.000045 0.000034 -0.001290 -0.000009 0.000014 -0.002500 -0.002237 -0.000055 0.007500 -0.028103 0.000001 -0.000016 0.003267 0.000000 0.000000 0.024827 0.000001 0.000001 0.000003 -0.000005 -0.000001 -0.027452 0.000001 -0.000014 0.002039 0.000000 0.000000 0.025391 0.000004 0.000003 0.000002 -0.000007 -0.000003 diff --git a/data/test/character/bvh/Pirate_By_P._Konstantinov.bvh b/data/test/character/bvh/Pirate_By_P._Konstantinov.bvh new file mode 100755 index 0000000000000000000000000000000000000000..8816b91a5cf7445accae20b3c155a5460e38ca17 --- /dev/null +++ b/data/test/character/bvh/Pirate_By_P._Konstantinov.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET -0.120119 3.010601 -0.234169 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.022496 3.282940 -0.273087 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.045833 5.226402 -0.312062 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.037531 5.671307 -0.849917 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.002181 3.479996 1.197899 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 5.758030 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 2.439662 4.066071 -0.206284 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 2.702375 -1.470566 0.289554 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 7.492003 0.000015 0.000007 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 8.208447 0.000034 0.143282 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 4.581331 0.000008 0.079969 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -2.760113 4.066093 -0.495897 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -2.343794 -1.471077 -0.289583 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -7.502600 -0.000004 0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -8.253345 -0.000004 0.144064 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -4.622690 0.000000 0.080687 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 3.348583 -0.914890 -0.041578 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET -0.000001 -14.224207 0.527977 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000004 -16.074396 -1.453750 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET -0.000002 -5.916809 0.395348 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -0.000182 0.767918 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -3.553708 -0.908726 0.145829 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.000002 -14.247347 0.533956 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000002 -16.085209 -1.614194 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 0.000000 -5.885090 3.202452 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.003086 3.275127 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 +0.103110 37.138741 -0.014373 -0.000918 0.001154 -0.033866 0.000919 -0.001146 0.033872 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000008 -0.000005 -0.005242 0.000091 0.000016 0.005038 -0.000013 1.000000 0.000003 0.000778 0.000072 0.000020 -0.000015 0.000000 -0.005853 0.000039 0.000039 0.005989 -0.000010 -1.000000 -0.000005 0.002443 -0.000041 -0.000036 0.065703 -0.001046 0.036249 -0.163453 -0.000224 -0.000041 0.098666 0.000165 -0.002384 0.000001 -0.000047 0.000006 -0.416243 -0.001323 0.031318 0.864827 0.000260 0.000015 -0.447664 -0.000223 0.002477 0.000061 0.000050 0.000010 diff --git a/data/test/character/bvh/SFU_0007_Walking001_0.bvh b/data/test/character/bvh/SFU_0007_Walking001_0.bvh new file mode 100755 index 0000000000000000000000000000000000000000..2c29c2d59b5971be8b47ea30530672fa372e6070 --- /dev/null +++ b/data/test/character/bvh/SFU_0007_Walking001_0.bvh @@ -0,0 +1,430 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT LeftUpLeg + { + OFFSET 8.488731 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.000000 -42.154627 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000000 -40.987015 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.000000 -4.319168 16.119348 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 7.499985 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.488731 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET 0.000000 -42.154627 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000000 -40.987015 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 0.000000 -4.319168 16.119348 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.000000 7.499985 + } + } + } + } + } + JOINT Spine + { + OFFSET 0.000000 0.100000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 23.515142 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 22.389363 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 17.513173 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 11.499977 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 0.000000 22.389363 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 18.571566 -0.000076 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 27.478838 -0.000102 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 25.894741 -0.000102 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.999980 -0.000025 0.000000 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET 0.000000 22.389363 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -18.571566 -0.000076 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -27.478838 -0.000102 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -25.894741 -0.000102 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -13.699973 -0.000051 0.000000 + } + } + } + } + } + } + } +} +MOTION +Frames: 301 +Frame Time: 0.033333 +0.000000 88.960810 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 +-8.412480 86.916768 15.826232 10.926600 9.361600 -0.619700 -31.195500 14.452300 1.878400 6.115700 0.000000 0.000000 5.716200 4.442300 -1.904500 -15.183900 0.000000 0.000000 1.252300 -18.425000 -0.093000 12.742500 0.000000 0.000000 -20.000700 -2.940500 1.090300 -15.114200 0.000000 0.000000 -6.086800 6.690800 0.679100 1.589600 0.968800 -0.820700 11.137300 1.288900 -2.954600 -14.251700 -10.281900 1.113400 1.196500 14.080600 5.283900 15.065400 -3.292000 -85.170600 -0.000100 -16.997800 0.000000 2.677200 1.477800 4.798200 -14.342200 1.874900 -6.693000 -1.009800 36.492200 70.907400 -0.000500 67.414400 0.000300 8.066700 -2.241100 -5.727100 +-7.531100 86.843362 17.764760 11.371500 9.566100 -0.898900 -30.940600 14.159100 1.487100 7.016100 0.000000 0.000000 4.047200 5.456300 -2.133800 -15.130800 0.000000 0.000000 1.198400 -18.665700 -0.661900 14.496700 0.000000 0.000000 -19.444600 -2.847000 1.861100 -16.753100 0.000000 0.000000 -6.131200 6.795200 0.596400 1.280200 1.067000 -1.127300 10.965400 1.355400 -2.915500 -14.055800 -10.316500 1.359800 1.110100 13.942700 5.590000 15.702900 -2.347500 -85.003700 -0.000100 -15.161900 0.000000 3.334100 1.931300 4.956700 -14.719900 2.246900 -6.651100 -1.791900 36.271900 71.147400 -0.000500 67.771100 0.000300 8.204200 -2.350500 -6.017400 +-6.408928 86.819486 19.932904 11.650700 9.603100 -0.739800 -30.094800 12.892400 0.701600 8.072000 0.000000 0.000000 4.466200 6.838000 -2.345500 -14.956200 0.000000 0.000000 0.779100 -18.846600 -2.018400 17.093900 0.000000 0.000000 -18.621700 -2.466500 3.012800 -19.085200 0.000000 0.000000 -6.240200 6.868800 0.279300 1.262100 1.164400 -1.737200 10.691300 1.416000 -2.712600 -14.007000 -10.190900 1.682600 0.931700 13.714700 5.894700 16.206500 -1.423300 -84.833400 -0.000100 -13.620000 0.000000 3.341700 2.095900 5.356200 -14.844800 2.384600 -6.479600 -2.474100 36.028900 71.543200 -0.000500 67.602700 0.000300 8.741800 -2.587000 -6.206700 +-5.065776 86.853014 22.329394 11.793700 9.454600 -0.137500 -28.422200 12.061200 -0.735900 7.977700 0.000000 0.000000 5.097200 8.704200 0.020600 -14.732500 0.000000 0.000000 -0.205500 -18.557200 -4.138500 20.816400 0.000000 0.000000 -17.312200 -2.091300 3.929700 -22.458500 0.000000 0.000000 -6.395700 6.909000 -0.262500 1.301800 1.271200 -2.619400 10.432400 1.673000 -2.562000 -13.758900 -10.180200 2.259100 0.747600 13.414900 6.187200 16.652000 -0.774800 -84.635000 0.000000 -12.618900 0.000000 3.455400 2.363700 5.570700 -14.835000 2.409100 -6.344500 -2.778800 35.828000 72.267700 -0.000500 66.859500 0.000300 9.509300 -2.708600 -6.393400 +-3.553968 86.947248 24.814022 11.865700 9.844200 0.614400 -27.064600 10.993200 -2.487800 8.803900 0.000000 0.000000 5.309300 9.025800 2.958500 -14.258900 0.000000 0.000000 -1.905200 -18.061100 -6.697000 25.992800 0.000000 0.000000 -14.969900 -1.964300 5.382000 -27.252200 0.000000 0.000000 -6.501700 6.628700 -0.874300 1.272600 1.086000 -3.672500 10.102800 1.918100 -2.254600 -13.188700 -10.022300 2.674900 0.662000 13.180000 6.429500 16.704100 -0.773900 -84.411400 0.000000 -12.154900 0.000000 3.609000 2.529100 5.562600 -14.684700 2.143400 -6.226300 -2.739100 35.809300 73.154300 -0.000500 65.567900 0.000300 10.154600 -2.998500 -6.475300 +-1.976120 87.177626 27.258264 11.735900 10.992400 1.501200 -26.042100 10.414800 -4.432300 11.080300 0.000000 0.000000 3.666200 8.873700 5.058700 -13.939600 0.000000 0.000000 -4.525900 -17.505300 -9.620300 33.025000 0.000000 0.000000 -10.914300 -1.973100 6.415500 -33.523200 0.000000 0.000000 -6.468300 6.153600 -1.625400 1.302600 0.755700 -4.630800 9.842500 2.216800 -2.167000 -12.316600 -10.219500 3.204600 0.566900 12.712100 6.680900 16.031600 -1.559000 -84.262300 0.000000 -11.957100 0.000000 3.657100 2.707700 5.306900 -14.398900 1.823500 -6.364200 -2.077800 35.201600 74.205300 -0.000400 63.956700 0.000300 10.781800 -2.941800 -6.471400 +-0.552704 87.424006 29.699966 11.239400 12.036200 1.743400 -24.385500 11.715900 -5.344200 13.015700 0.000000 0.000000 1.170300 6.767200 6.093600 -13.690200 0.000000 0.000000 -7.164700 -15.615900 -11.433700 41.138100 0.000000 0.000000 -6.117600 -2.608600 6.118700 -35.183000 0.000000 0.000000 -6.367500 5.827400 -2.039100 1.456300 0.550700 -4.961600 9.942200 2.293300 -2.101900 -11.534800 -10.295500 3.337600 0.214600 12.025600 7.135800 15.119500 -2.479200 -84.408200 0.000000 -12.462100 0.000000 3.924700 2.790200 5.163100 -13.870800 1.564000 -6.833000 -1.128600 34.549100 75.411100 -0.000400 61.951300 0.000200 11.320100 -2.767900 -7.100300 +0.809752 87.653114 31.997396 10.783000 12.204000 1.761900 -22.437200 13.003800 -5.812200 13.998600 0.000000 0.000000 -0.926300 5.448800 7.115600 -13.408600 0.000000 0.000000 -10.284900 -11.703600 -12.325100 49.944400 0.000000 0.000000 -2.409800 -3.391500 4.370000 -27.777400 0.000000 0.000000 -6.270600 5.799300 -2.247700 1.482400 0.603700 -4.975600 10.049700 2.547800 -2.095000 -10.588500 -10.047600 3.199000 -0.178900 11.686900 7.357800 13.957100 -3.387600 -84.472900 -0.000100 -13.810200 0.000000 3.095900 2.278700 5.218400 -13.492200 1.252900 -7.085300 0.222800 34.533300 76.194800 -0.000400 59.722700 0.000200 11.007200 -3.087900 -7.022300 +2.118106 87.873078 34.187130 10.339100 12.063000 1.739900 -20.316200 13.760500 -6.223300 14.266200 0.000000 0.000000 -2.426700 4.808100 7.820500 -13.253700 0.000000 0.000000 -13.614700 -7.247600 -12.530200 57.795800 0.000000 0.000000 2.349100 -3.351500 2.326300 -17.695200 0.000000 0.000000 -6.253200 5.682700 -2.420800 1.519300 0.560100 -4.785500 10.237900 3.016700 -2.181700 -9.912100 -9.562800 3.044000 -0.296100 11.768200 7.137800 12.458200 -4.609300 -84.245400 -0.000100 -16.044500 0.000000 2.751800 1.779900 5.189000 -13.073400 0.805400 -6.979600 1.647600 35.304800 76.455600 -0.000300 57.223700 0.000200 9.825100 -2.821800 -6.145800 +3.398774 88.067134 36.380420 9.603100 12.526900 1.906400 -17.616600 12.755900 -7.114900 13.724100 0.000000 0.000000 -3.589400 5.258100 8.348700 -13.089600 0.000000 0.000000 -15.843800 -3.649200 -12.611200 63.101200 0.000000 0.000000 2.325400 -1.383100 2.224700 -17.529000 0.000000 0.000000 -6.143800 5.213900 -2.800400 1.626500 0.233200 -4.463300 10.505800 3.309300 -2.170800 -9.321900 -9.098300 2.951000 -0.148400 11.848800 6.917200 10.362500 -6.493000 -84.095100 -0.000100 -18.098800 0.000000 1.538700 0.871000 5.998400 -12.589000 0.146200 -7.046800 3.066800 36.452900 76.823500 -0.000300 54.563300 0.000200 9.271000 -2.604900 -5.178300 +4.548378 88.281002 38.582092 8.823600 13.445500 1.651200 -14.794000 11.043900 -7.614100 12.640300 0.000000 0.000000 -4.463800 5.774100 8.690900 -12.930500 0.000000 0.000000 -17.581500 -1.446100 -12.180400 65.859000 0.000000 0.000000 -0.425200 -0.771800 1.542400 -17.638500 0.000000 0.000000 -6.139300 4.619400 -2.875400 1.745900 -0.274600 -4.129200 10.881400 3.318300 -2.029500 -8.736800 -8.878300 3.134800 -0.475000 11.484800 6.863200 8.362200 -8.702300 -83.854400 -0.000100 -19.733800 0.000000 1.342500 0.529000 6.289600 -11.846800 -0.558100 -7.070400 4.571500 37.147300 77.386500 -0.000300 51.938300 0.000100 10.137400 -2.933300 -4.952700 +5.629910 88.475566 40.724074 8.117100 14.499800 1.236300 -11.899600 9.780500 -7.810600 11.182000 0.000000 0.000000 -5.059200 5.601200 8.974900 -12.797100 0.000000 0.000000 -19.107300 0.222500 -11.376600 66.313000 0.000000 0.000000 -2.354700 -3.059300 1.148500 -17.347200 0.000000 0.000000 -6.066900 4.074300 -2.854400 1.707300 -0.751100 -3.754200 11.143800 3.096000 -1.827000 -8.112900 -8.983300 3.433300 -1.140700 10.875500 7.129900 6.532800 -10.642300 -83.879100 -0.000100 -21.560200 0.000000 1.315200 0.211400 6.156400 -10.965300 -1.442000 -7.049800 6.313200 37.122400 78.007400 -0.000200 49.543400 0.000100 10.424500 -3.444600 -5.189400 +6.651244 88.620854 42.727118 7.694300 15.543400 0.702200 -9.376700 8.954600 -7.793100 9.787200 0.000000 0.000000 -5.584800 5.055000 9.325700 -12.729600 0.000000 0.000000 -20.679300 1.635000 -10.482800 64.748800 0.000000 0.000000 -4.937900 -5.448600 0.599700 -16.606800 0.000000 0.000000 -6.059100 3.504000 -2.830700 1.605100 -1.270200 -3.229400 11.230400 2.903100 -1.605600 -7.699200 -9.012300 3.458600 -1.548600 10.507900 7.238700 4.397200 -12.410000 -83.881200 -0.000100 -23.766000 0.000000 -0.659900 -0.521700 6.170100 -10.101600 -2.395000 -7.005900 8.105200 36.442400 78.436600 -0.000200 47.140800 0.000100 10.404500 -3.424000 -4.851400 +7.549642 88.694514 44.524930 7.560700 16.572200 -0.027000 -7.738200 8.611200 -7.444600 9.358700 0.000000 0.000000 -6.399000 4.161500 9.732900 -12.856400 0.000000 0.000000 -22.495300 3.344500 -9.260800 61.602300 0.000000 0.000000 -7.446300 -6.074700 -1.009400 -16.488900 0.000000 0.000000 -5.928200 2.963900 -2.722200 1.362400 -1.775200 -2.667100 11.098600 2.739500 -1.340300 -7.491500 -8.931900 3.328500 -1.937600 10.122800 7.206000 2.282400 -14.468000 -83.599400 -0.000100 -26.577500 0.000000 -1.202000 -0.887400 5.997800 -9.625200 -3.661200 -7.031700 9.811100 35.660500 78.862400 -0.000200 44.244400 0.000100 10.166500 -3.278100 -4.734000 +8.357616 88.692228 46.183296 7.640900 17.680000 -0.785800 -6.734400 7.584200 -7.046900 9.430500 0.000000 0.000000 -7.441400 3.930500 10.065600 -12.995400 0.000000 0.000000 -24.353300 5.088700 -8.067700 57.027600 0.000000 0.000000 -8.951900 -5.915600 -0.445100 -16.017400 0.000000 0.000000 -5.793800 2.430800 -2.642600 1.163200 -2.282400 -2.163500 11.051200 2.544100 -0.969900 -7.733600 -8.680800 3.123500 -2.525800 9.589400 7.352600 0.247500 -16.746800 -83.279300 -0.000100 -29.644700 0.000000 -1.115300 -0.922900 5.994300 -8.894700 -4.504600 -7.103600 11.088200 33.582600 79.626800 -0.000200 41.046500 0.000100 9.934600 -3.439500 -4.795400 +9.063736 88.605614 47.743110 7.845000 18.374800 -1.600200 -6.245600 6.788800 -6.489800 10.176200 0.000000 0.000000 -8.946100 3.887400 10.243500 -12.890600 0.000000 0.000000 -26.312400 7.132100 -6.606800 51.405600 0.000000 0.000000 -9.186000 -5.605800 -1.421600 -16.250900 0.000000 0.000000 -5.645000 2.113700 -2.569500 0.973500 -2.583600 -1.569900 10.960700 2.652400 -0.730800 -7.647300 -8.392700 3.006600 -3.058900 8.961000 7.679600 -1.985700 -19.013200 -83.005500 -0.000100 -32.531200 0.000000 -2.110200 -1.573600 5.788900 -8.481000 -5.059300 -7.291600 12.384800 31.201200 80.438500 -0.000200 37.189700 0.000100 10.041100 -3.532700 -5.091500 +9.830562 88.474804 49.359566 8.135500 18.881800 -2.171900 -5.609700 5.357800 -6.265400 10.493800 0.000000 0.000000 -10.226800 4.630200 10.438000 -12.916500 0.000000 0.000000 -27.959700 9.119800 -5.585400 44.799700 0.000000 0.000000 -8.970900 -4.681600 -0.377700 -16.357800 0.000000 0.000000 -5.758000 1.820800 -2.608700 1.020100 -2.875200 -1.101100 10.936800 2.880400 -0.459400 -7.399000 -7.828300 2.712800 -3.570500 8.423200 7.969900 -4.084000 -20.619700 -82.648300 -0.000200 -35.669600 0.000000 -2.824000 -2.128700 5.513200 -8.136400 -5.471500 -7.340000 13.491900 29.343900 80.905300 -0.000100 32.612400 0.000000 8.870600 -3.459500 -4.938300 +10.628630 88.315800 51.031648 8.435900 19.073400 -2.558100 -4.579600 4.228800 -6.222100 10.193400 0.000000 0.000000 -11.245700 5.383100 10.749400 -13.056000 0.000000 0.000000 -29.408900 10.745600 -4.774400 37.700700 0.000000 0.000000 -7.876600 -2.939900 0.503700 -16.554700 0.000000 0.000000 -5.880100 1.585200 -2.661700 0.962400 -3.109200 -0.761400 11.082500 3.385000 -0.405700 -6.920800 -7.251900 2.600600 -4.269000 7.949200 8.322000 -5.699100 -22.003200 -82.116400 -0.000200 -38.754900 -0.000100 -3.782000 -2.745100 4.894800 -7.846700 -5.796000 -7.334400 14.534100 28.322600 80.998500 -0.000100 27.748000 0.000000 9.407400 -3.920300 -4.242700 +11.452606 88.098122 52.792884 8.775400 19.377100 -2.974700 -3.485600 3.494300 -6.119700 9.962200 0.000000 0.000000 -12.380400 5.662100 11.111700 -13.017900 0.000000 0.000000 -30.581900 11.088300 -4.175600 30.327500 0.000000 0.000000 -6.425800 -0.322200 1.284600 -16.917000 0.000000 0.000000 -5.984100 1.229200 -2.722200 0.820900 -3.456700 -0.339400 11.222500 3.854000 -0.338000 -6.351400 -6.622200 2.309800 -4.735300 7.640500 8.743100 -7.263600 -23.071400 -81.599300 -0.000200 -41.705800 -0.000100 -4.576800 -2.881900 4.895400 -7.609200 -6.119000 -7.425600 15.740900 27.910300 80.762000 -0.000100 23.293100 0.000000 9.442600 -4.208900 -3.246100 +12.326874 87.801958 54.691280 9.044800 19.820000 -3.450000 -2.429300 3.168900 -5.869600 10.251100 0.000000 0.000000 -13.741000 5.379300 11.393000 -13.328500 0.000000 0.000000 -31.453200 9.963400 -3.621100 23.082400 0.000000 0.000000 -4.473100 2.985800 3.256800 -17.544000 0.000000 0.000000 -6.027300 0.849600 -2.743700 0.716200 -3.824400 0.252900 11.265600 4.320100 -0.409600 -5.790800 -6.197500 2.067100 -5.095800 7.310700 9.026200 -8.495700 -23.882600 -80.917100 -0.000200 -44.727900 -0.000100 -5.231900 -3.006100 4.837700 -7.339600 -6.421800 -7.647500 17.236900 26.944700 80.338900 -0.000100 19.944500 0.000000 10.749000 -4.867400 -2.793100 +13.263118 87.438484 56.755284 9.194000 20.249300 -3.724800 -1.038600 3.098800 -5.740600 10.392900 0.000000 0.000000 -15.056300 4.870600 11.591600 -13.365200 0.000000 0.000000 -31.980900 8.103200 -3.171700 16.391000 0.000000 0.000000 -2.403200 7.437200 5.672900 -17.661400 0.000000 0.000000 -6.087400 0.541200 -2.838000 0.856200 -4.116600 0.767800 11.234600 4.671900 -0.461700 -5.573900 -5.843200 1.854600 -5.320600 7.120700 9.243400 -9.686300 -24.554700 -80.147200 -0.000200 -47.580000 -0.000100 -5.253200 -2.914600 4.658000 -7.117100 -6.799800 -7.848300 18.795500 25.122900 79.838100 -0.000100 17.602000 0.000000 11.111100 -5.132000 -2.743400 +14.241272 87.031322 58.913268 9.465200 20.791200 -3.953700 0.343200 2.862200 -5.682000 10.449100 0.000000 0.000000 -16.218200 4.490700 11.813000 -13.606200 0.000000 0.000000 -32.454800 5.893100 -2.733800 10.707700 0.000000 0.000000 -2.006300 12.296800 7.889300 -17.907200 0.000000 0.000000 -6.151700 0.148900 -2.883600 0.860400 -4.499200 1.102700 11.220900 4.997200 -0.469400 -5.380400 -5.383700 1.550300 -5.613800 6.976900 9.562700 -10.412400 -25.038200 -79.405600 -0.000300 -49.986600 -0.000100 -5.005600 -2.756000 4.809500 -6.810800 -7.168300 -8.125900 20.016500 23.039500 79.429200 -0.000100 16.110200 0.000000 10.806300 -6.189000 -2.371600 +15.231364 86.590378 61.331348 9.341600 21.283600 -4.220700 2.355000 3.162700 -5.327400 10.398000 0.000000 0.000000 -17.284000 3.612800 12.106000 -13.816000 0.000000 0.000000 -32.380200 3.275200 -1.779300 6.644700 0.000000 0.000000 -2.751600 14.499400 10.765600 -17.718000 0.000000 0.000000 -6.124700 -0.147100 -2.894300 1.112100 -4.779100 1.611500 11.313200 5.204200 -0.474100 -5.181000 -4.991700 1.285200 -5.741200 6.793400 9.796700 -10.918900 -25.236500 -78.759700 -0.000300 -51.850100 -0.000100 -5.022600 -2.608300 4.851100 -6.707800 -7.467100 -8.447600 21.066600 20.952400 79.122400 -0.000100 14.433300 0.000000 11.335500 -5.746300 -2.600600 +16.295878 86.172548 63.896494 9.202900 21.826000 -4.456200 4.203900 3.692400 -4.932800 10.923700 0.000000 0.000000 -18.107100 2.619100 12.175800 -14.196200 0.000000 0.000000 -32.688400 0.520400 -0.856000 5.997200 0.000000 0.000000 -3.404600 14.764700 13.109600 -17.556500 0.000000 0.000000 -6.082500 -0.410200 -2.869200 1.329700 -5.030900 2.093200 11.347600 5.415500 -0.557000 -4.741300 -4.771100 1.267900 -5.858500 6.718100 9.896200 -11.122600 -25.349300 -78.319700 -0.000300 -53.009400 -0.000100 -4.798900 -2.291200 4.880600 -6.693600 -7.643700 -8.632200 22.042000 19.260800 78.660200 -0.000100 13.406300 0.000000 11.848400 -6.088000 -2.478800 +17.461992 85.839554 66.442844 9.541400 22.331700 -4.587500 5.026500 3.800400 -4.817100 12.541200 0.000000 0.000000 -18.448900 2.020000 12.320800 -15.089300 0.000000 0.000000 -33.816400 -0.025900 -0.376200 8.251400 0.000000 0.000000 -3.488400 14.307400 10.544600 -17.323200 0.000000 0.000000 -6.137600 -0.601300 -2.782900 1.115400 -5.231800 2.257600 11.413400 5.568700 -0.596400 -4.312500 -4.610800 1.160200 -5.852500 6.725100 9.825400 -11.029700 -25.191900 -78.154600 -0.000300 -53.482700 -0.000100 -4.633000 -1.934600 4.822600 -6.651300 -7.835900 -8.684500 22.603600 18.724700 78.135000 0.000000 12.352200 0.000000 12.021000 -6.264600 -2.423100 +18.713958 85.608160 69.273166 9.727600 23.372800 -5.024800 5.432800 3.598200 -4.159100 15.564900 0.000000 0.000000 -18.564900 1.299100 12.772100 -16.529200 0.000000 0.000000 -33.806900 1.200700 0.077300 10.705300 0.000000 0.000000 -4.047600 13.136900 9.500300 -17.785300 0.000000 0.000000 -6.254900 -0.959800 -2.450200 1.086300 -5.643500 2.604500 11.453400 5.675800 -0.642500 -3.857100 -4.433600 0.893400 -5.628200 6.701400 9.773600 -10.699300 -24.615500 -78.633000 -0.000300 -53.202000 -0.000100 -4.697800 -1.792400 4.762500 -6.741000 -7.840200 -8.870700 22.900100 18.645200 77.874700 0.000000 11.494700 0.000000 12.234700 -6.529800 -2.469800 +20.052030 85.447124 72.422766 9.832500 24.793900 -5.764900 5.380600 3.582400 -2.917900 19.932300 0.000000 0.000000 -17.958400 0.206500 12.917000 -19.147500 0.000000 0.000000 -32.696100 2.544300 0.618800 12.816400 0.000000 0.000000 -3.566700 12.785000 10.610500 -18.699200 0.000000 0.000000 -6.525500 -1.268300 -1.850200 1.154800 -6.069000 3.029000 11.525100 5.645700 -0.664500 -3.432400 -4.305800 0.575200 -5.595500 6.491800 9.780400 -9.634200 -24.109600 -79.519700 -0.000300 -52.284600 -0.000100 -4.349400 -1.649200 4.917700 -6.742300 -7.797800 -9.085300 22.919100 18.265200 77.943800 0.000000 11.134400 0.000000 12.432100 -6.470700 -2.561000 +21.441410 85.334094 75.716638 10.161000 26.336400 -6.961900 3.954300 3.653200 -1.085800 26.528800 0.000000 0.000000 -16.293500 -1.087000 12.963400 -23.263200 0.000000 0.000000 -31.011400 4.135300 1.459600 13.072800 0.000000 0.000000 0.484200 10.520400 10.929900 -18.292300 0.000000 0.000000 -6.846300 -1.375500 -0.935200 0.932200 -6.350100 3.565600 11.434500 5.592600 -0.706800 -2.770900 -4.253800 0.177500 -5.387500 6.541500 9.588200 -8.546300 -24.249200 -80.611300 -0.000300 -50.649900 -0.000100 -3.779500 -1.426700 4.900900 -6.837600 -7.907900 -9.118300 23.171900 18.050100 77.846400 0.000000 11.622000 0.000000 12.004000 -6.383100 -2.614200 +22.609048 85.356446 79.047848 10.258700 26.826400 -8.856200 1.007400 5.140300 2.154700 35.628400 0.000000 0.000000 -12.882600 -3.365900 11.303900 -28.673700 0.000000 0.000000 -30.588800 3.687800 3.460100 16.313800 0.000000 0.000000 0.186900 9.968700 8.400100 -17.116800 0.000000 0.000000 -6.916200 -0.814400 0.286500 0.573100 -6.024900 4.660900 11.375400 5.539600 -0.584300 -2.194300 -3.982900 -0.429300 -4.949400 6.785300 9.257100 -7.638300 -24.299700 -81.901000 -0.000200 -48.328500 -0.000100 -2.672800 -1.205500 4.287200 -7.001700 -7.942600 -8.826700 22.993700 18.304000 77.667400 0.000000 12.047400 0.000000 11.544800 -6.124400 -2.724400 +23.829518 85.530436 82.143092 9.824600 26.614700 -10.020500 -3.001800 6.253300 5.108000 46.218200 0.000000 0.000000 -7.251600 -5.522200 8.475800 -31.123500 0.000000 0.000000 -29.876100 2.452200 5.195900 19.973100 0.000000 0.000000 -1.793500 10.989200 4.349600 -16.791300 0.000000 0.000000 -6.745100 -0.167600 1.068800 0.612200 -5.589300 5.852200 11.316100 6.057000 -0.605100 -1.694100 -3.279300 -0.999200 -4.363300 7.504400 9.039200 -6.758500 -23.687800 -83.472000 -0.000200 -45.586400 -0.000100 -0.610300 -0.635400 4.288900 -7.242400 -7.124500 -8.526800 21.676900 19.745600 77.645400 0.000000 11.945500 0.000000 11.273200 -5.945100 -2.971100 +25.136856 85.795104 84.829396 9.568000 27.836300 -10.251600 -8.127900 5.255500 6.736400 57.352000 0.000000 0.000000 -1.500600 -6.452700 5.413000 -25.221800 0.000000 0.000000 -27.758300 2.330200 5.421300 20.859600 0.000000 0.000000 -3.995000 9.894700 2.642400 -16.547100 0.000000 0.000000 -6.348200 0.010600 1.212500 0.552400 -5.526900 6.247200 11.448400 6.313500 -0.501600 -1.454100 -2.724300 -1.124800 -3.940600 7.659100 9.192600 -5.784300 -22.562700 -85.297200 -0.000200 -42.059000 -0.000100 1.342700 -0.238700 5.179500 -7.792200 -6.617000 -8.297600 19.622700 21.157200 77.977600 0.000000 12.292900 0.000000 11.852900 -6.353600 -3.146200 +26.492200 86.258146 87.377016 9.384600 30.374100 -10.434600 -13.411300 3.056300 7.839500 66.364900 0.000000 0.000000 6.061600 -6.500800 2.256900 -16.839000 0.000000 0.000000 -24.803000 1.045500 4.896400 20.677000 0.000000 0.000000 -6.118100 8.987300 2.219900 -16.227900 0.000000 0.000000 -6.178900 0.146600 1.290800 0.810700 -5.492100 6.302500 11.846600 5.987800 -0.351100 -1.347600 -2.807000 -0.771500 -3.836400 7.432200 9.127400 -5.244000 -22.368700 -86.739300 -0.000200 -37.064800 -0.000100 2.142300 -0.018300 5.637600 -8.182500 -6.617900 -7.896900 17.237700 21.508500 78.416400 -0.000100 13.743100 0.000000 11.949200 -6.362200 -4.096100 +27.954732 86.799166 89.915238 8.834700 32.626800 -10.292800 -17.806700 2.111200 8.709300 72.412000 0.000000 0.000000 9.485400 -4.984200 2.512000 -16.154600 0.000000 0.000000 -20.923900 0.006900 4.465900 19.069000 0.000000 0.000000 -7.419900 8.226800 2.093400 -16.093200 0.000000 0.000000 -6.091100 0.596700 1.393400 1.208900 -5.163800 6.183500 12.438200 5.701300 -0.396200 -0.936700 -3.095500 -0.293500 -3.719800 7.387200 8.924200 -4.857300 -22.401700 -87.720600 -0.000100 -31.313800 0.000000 2.970100 0.469600 5.432900 -8.305300 -6.381900 -7.802700 14.558700 21.935300 79.165800 -0.000100 15.802600 0.000000 11.797500 -5.952100 -5.200500 +29.591254 87.303610 92.282010 7.738600 34.318600 -9.122200 -20.957900 2.417200 8.788500 75.362300 0.000000 0.000000 6.799700 -3.422900 3.764900 -16.152300 0.000000 0.000000 -16.432400 -0.224000 3.581700 16.636300 0.000000 0.000000 -8.447400 7.481700 2.367000 -15.750500 0.000000 0.000000 -5.662900 1.287200 1.376300 1.488500 -4.618300 5.483500 13.017600 5.676200 -0.597100 -0.274600 -3.132800 -0.050200 -3.365600 7.888900 8.635400 -4.091500 -22.909800 -87.834600 -0.000100 -26.363200 0.000000 4.473300 1.182200 5.012200 -8.604700 -5.410500 -7.859900 12.356200 22.428100 79.822000 -0.000100 18.597000 0.000000 12.046100 -5.760500 -6.479900 +31.199836 87.680292 94.504510 7.450600 36.090900 -8.494500 -24.584800 2.800800 8.968000 75.830500 0.000000 0.000000 4.469000 -3.511700 5.287700 -16.099200 0.000000 0.000000 -12.954400 -2.343900 2.688900 14.826100 0.000000 0.000000 -9.265100 8.092500 1.918200 -15.652300 0.000000 0.000000 -5.624700 1.931900 1.396100 1.500800 -4.054200 4.900500 13.365600 5.811700 -0.880400 0.501200 -3.169100 -0.202700 -2.962900 8.177300 8.203800 -2.416100 -22.871000 -87.245900 -0.000100 -22.832400 0.000000 5.556200 1.713400 5.386700 -9.206700 -4.707800 -8.123400 10.660400 23.650400 79.926400 -0.000100 22.111100 0.000000 11.391900 -5.453900 -6.660900 +32.754062 87.878920 96.536256 7.392400 37.780300 -8.045800 -28.129000 3.563400 9.118100 74.043900 0.000000 0.000000 1.830200 -3.591700 7.069500 -16.309300 0.000000 0.000000 -10.075400 -4.869400 1.901100 13.452100 0.000000 0.000000 -10.224800 9.088300 1.859700 -15.471400 0.000000 0.000000 -5.444700 2.454800 1.361500 1.443200 -3.590300 4.391500 13.537300 6.232100 -1.208100 0.746300 -3.016400 -0.406300 -2.550300 8.951900 7.888200 -0.500800 -21.864800 -86.309000 -0.000100 -20.313700 0.000000 5.643300 1.776700 5.699900 -10.046800 -3.704600 -8.227400 9.459200 25.040700 79.256100 -0.000100 26.091200 0.000000 11.078000 -4.971800 -6.719600 +34.358834 87.953088 98.514408 7.391700 39.352200 -7.663200 -30.925400 4.812000 9.155800 69.803200 0.000000 0.000000 -2.421400 -2.041600 7.166800 -16.061200 0.000000 0.000000 -7.596700 -6.858700 1.290800 12.632000 0.000000 0.000000 -11.439200 9.561400 1.738200 -15.046400 0.000000 0.000000 -5.275700 2.991900 1.296300 1.397700 -3.109800 3.867400 13.764800 6.585500 -1.430400 0.671800 -2.688000 -0.575900 -2.046600 9.689600 7.579400 1.622600 -19.843300 -85.004700 -0.000100 -18.623400 0.000000 5.208300 1.587600 5.172500 -10.739300 -2.931100 -8.290100 8.139900 26.463100 78.156400 -0.000100 29.822000 0.000000 11.105600 -4.616800 -7.123100 +35.981132 87.926672 100.385880 7.604700 40.988500 -7.558600 -33.115900 6.369300 9.005300 63.144700 0.000000 0.000000 -5.289700 0.886300 7.487500 -15.611900 0.000000 0.000000 -5.620300 -7.954700 0.925900 12.379600 0.000000 0.000000 -12.772400 9.005500 1.725200 -14.672400 0.000000 0.000000 -5.178300 3.466000 1.220200 1.408900 -2.680600 3.446100 13.819700 6.838900 -1.594300 0.701800 -2.395000 -0.630000 -1.652100 10.237900 7.384900 3.757500 -17.218600 -83.642300 -0.000100 -17.537400 0.000000 5.037600 1.739200 5.542100 -11.340400 -2.225600 -8.361600 6.809200 27.281900 76.852800 -0.000100 33.270900 0.000000 11.361000 -4.430100 -7.424800 +37.643816 87.839550 102.118922 8.210200 42.675300 -7.797000 -34.833800 8.359000 8.610600 54.601100 0.000000 0.000000 -4.243200 4.044600 7.897100 -15.291500 0.000000 0.000000 -4.224500 -8.736100 0.633300 12.650100 0.000000 0.000000 -14.015700 8.113100 1.443100 -14.657300 0.000000 0.000000 -5.175200 3.774800 1.122600 1.331500 -2.394100 3.100400 13.864800 7.084200 -1.715600 0.815500 -2.103000 -0.662100 -1.372400 10.715800 7.340900 5.708700 -14.294600 -82.454900 -0.000100 -16.549900 0.000000 4.744100 1.794700 5.990400 -12.011400 -1.524600 -8.493000 5.525900 27.694800 75.599100 -0.000200 36.130300 0.000100 11.758500 -4.532800 -7.791800 +39.392098 87.695024 103.841550 8.983500 44.300000 -8.402700 -35.815100 11.054500 8.276500 44.798300 0.000000 0.000000 -2.496400 6.167100 7.961500 -14.999800 0.000000 0.000000 -2.861400 -9.684700 0.591800 12.895000 0.000000 0.000000 -15.006800 7.476700 1.251700 -14.689600 0.000000 0.000000 -5.264200 4.015800 1.040500 1.217400 -2.160100 2.942000 13.978500 7.207100 -1.743300 0.871100 -1.781600 -0.800200 -1.180400 10.942800 7.424600 7.555000 -11.133600 -81.474100 -0.000100 -15.529400 0.000000 5.262100 1.431000 6.510700 -12.623500 -0.862600 -8.647100 4.471700 27.751500 74.380600 -0.000200 38.507300 0.000100 11.908200 -4.390300 -7.817100 +41.316656 87.483188 105.588816 9.748800 45.798800 -9.272100 -36.158300 14.580800 7.955600 34.801100 0.000000 0.000000 -0.847300 6.673300 6.529500 -14.752100 0.000000 0.000000 -1.166400 -10.680500 0.819500 12.793000 0.000000 0.000000 -15.664000 7.166300 1.540800 -14.794700 0.000000 0.000000 -5.520700 4.209200 0.999000 1.296600 -1.963300 2.999000 14.055100 7.270400 -1.727900 0.929500 -1.440000 -0.967700 -1.106700 11.130900 7.507900 9.361800 -8.037800 -80.630700 -0.000100 -14.962300 0.000000 4.604300 1.439800 6.753000 -13.110500 -0.391800 -8.700700 3.560100 27.870400 73.075100 -0.000200 40.339600 0.000100 12.117300 -4.143200 -7.729100 +43.421554 87.195660 107.362244 10.394900 47.144500 -10.295100 -36.107200 19.092500 7.587200 25.431900 0.000000 0.000000 -0.038700 5.931900 5.657400 -14.849300 0.000000 0.000000 0.842100 -11.786600 1.271600 12.535200 0.000000 0.000000 -16.228400 6.998400 1.969700 -15.283200 0.000000 0.000000 -5.763500 4.339700 0.977400 1.414300 -1.820700 3.270300 14.051900 7.421200 -1.798800 1.009800 -1.146600 -1.058700 -1.162400 11.397300 7.698400 11.043200 -5.309100 -80.052000 -0.000100 -14.301000 0.000000 4.706500 1.499700 6.932600 -13.438400 -0.071900 -8.704100 2.884200 28.278300 71.805000 -0.000200 41.825900 0.000100 12.500100 -4.120200 -7.790000 +45.835062 86.871556 109.211364 10.584100 48.300900 -11.013500 -34.946400 23.664400 6.703400 16.517400 0.000000 0.000000 -0.270100 5.718300 4.551800 -14.982800 0.000000 0.000000 3.241300 -12.970300 1.661700 12.428800 0.000000 0.000000 -16.484400 7.097900 2.659100 -16.371500 0.000000 0.000000 -5.954100 4.568000 0.955700 1.614900 -1.581000 3.542300 14.028400 7.469800 -1.844400 1.078400 -0.894900 -1.145400 -1.197900 11.578500 7.781900 12.603300 -2.777500 -79.500300 -0.000100 -13.680800 0.000000 4.033000 1.294000 7.466700 -13.679700 -0.005900 -8.689400 2.703200 28.703100 70.755900 -0.000200 43.111900 0.000100 13.006300 -4.374300 -7.800900 +48.550322 86.517480 111.004350 10.586000 49.153100 -11.339300 -32.819000 26.982800 5.157000 8.854700 0.000000 0.000000 -1.027400 6.084100 3.901900 -14.745500 0.000000 0.000000 5.182300 -13.974100 1.506200 13.351800 0.000000 0.000000 -16.642500 7.596400 3.371800 -18.004600 0.000000 0.000000 -6.228000 4.874100 0.956000 1.904800 -1.266300 3.494300 14.205800 7.577400 -1.957300 0.678500 -0.724400 -1.215700 -1.098800 11.725200 7.694800 13.753100 0.110200 -79.021300 0.000000 -13.063900 0.000000 4.170200 1.244500 8.006200 -13.721300 0.026800 -8.621200 2.729800 28.961700 70.159000 -0.000200 43.999900 0.000100 13.178100 -4.525000 -7.787600 +51.475894 86.156038 112.883696 10.412900 49.547800 -11.590100 -30.609700 27.271500 4.069500 4.296900 0.000000 0.000000 -1.775500 6.212300 3.663100 -14.545000 0.000000 0.000000 6.641100 -13.979400 1.261900 15.345000 0.000000 0.000000 -16.397800 7.656100 3.942300 -20.348100 0.000000 0.000000 -6.447800 5.223900 0.971700 1.943800 -0.903600 3.324400 14.128800 7.907300 -2.124300 0.851500 -0.501100 -1.043200 -1.165000 12.139600 7.709200 14.813100 2.823900 -78.633200 0.000000 -12.351900 0.000000 3.730100 1.001800 8.600800 -13.577400 0.108700 -8.541100 2.834400 29.019600 70.484300 -0.000200 44.264000 0.000100 13.285200 -4.396500 -7.792300 +54.570630 85.782150 114.813080 10.612900 50.061200 -11.933400 -29.769200 24.699800 3.638500 5.896100 0.000000 0.000000 -2.125700 4.963800 1.408000 -14.705100 0.000000 0.000000 7.248600 -14.036300 0.590300 18.557500 0.000000 0.000000 -15.686900 7.920200 4.511800 -23.945200 0.000000 0.000000 -6.660500 5.410400 0.640900 1.572300 -0.650900 3.035900 13.953300 8.173100 -2.110300 1.015700 -0.172800 -0.814500 -1.082900 12.532400 7.749100 15.763500 5.284900 -78.357800 0.000000 -11.971500 0.000000 2.943300 0.512100 9.397700 -13.408500 -0.124700 -8.369600 3.533600 29.633300 71.074500 -0.000200 44.254000 0.000100 13.225100 -4.524900 -7.428700 +58.135774 85.398356 116.506498 11.120200 50.637300 -11.125100 -28.248700 20.493100 1.208600 8.299600 0.000000 0.000000 -1.702300 6.489100 3.744300 -15.259800 0.000000 0.000000 6.219400 -14.949700 -2.350000 23.850300 0.000000 0.000000 -14.445800 9.531100 6.030900 -29.391300 0.000000 0.000000 -7.036500 5.534000 -0.254600 1.131200 -0.369600 1.721700 13.649500 8.416200 -2.000200 1.138300 0.155300 -0.319800 -1.213200 12.702500 7.714400 17.034600 7.919400 -78.175700 0.000000 -12.215500 0.000000 1.823200 0.173200 10.133300 -12.955200 -0.629700 -8.072300 4.701200 30.638500 71.753700 -0.000200 44.162700 0.000100 13.569800 -4.688800 -7.076000 +61.856874 85.133688 117.924072 11.541200 51.261600 -9.566600 -26.738600 14.163100 -1.956900 10.249200 0.000000 0.000000 1.594100 12.628900 5.181500 -14.958000 0.000000 0.000000 3.048000 -15.607100 -6.844500 32.115400 0.000000 0.000000 -11.206600 11.888200 7.088300 -36.848000 0.000000 0.000000 -6.952500 5.618100 -1.181800 0.304400 -0.070800 -0.409200 13.205800 8.783300 -1.961600 1.316300 0.323400 0.427600 -1.305200 13.151600 7.656600 17.991000 8.482700 -77.826400 0.000000 -12.424900 0.000000 -0.775100 -0.614900 10.119700 -12.420300 -1.546800 -7.733600 5.994900 32.070900 72.776800 -0.000200 43.656600 0.000100 14.442600 -4.773600 -6.321700 +65.239646 85.201760 119.051578 12.425500 52.477600 -8.097600 -26.719500 14.447900 -4.753900 15.045800 0.000000 0.000000 1.285100 11.719400 8.442100 -14.052200 0.000000 0.000000 -2.103800 -14.149900 -11.556300 42.755200 0.000000 0.000000 -5.228000 13.190400 7.765300 -40.638200 0.000000 0.000000 -6.709000 5.516800 -2.355600 -0.487600 0.130400 -2.574500 13.015400 9.017900 -1.797600 1.132600 0.552000 0.604800 -1.318900 13.251800 7.732700 17.067600 9.616800 -78.005300 0.000000 -11.710800 0.000000 -0.039500 -0.441400 9.698400 -11.619700 -2.363100 -7.461700 6.681000 32.441400 74.582200 -0.000200 42.413900 0.000100 15.879300 -4.947600 -5.466100 +68.244212 85.457030 120.266460 12.399000 53.728200 -7.708100 -25.349400 17.009500 -5.603700 17.959700 0.000000 0.000000 -0.761600 8.317900 11.645500 -13.783200 0.000000 0.000000 -6.361400 -9.905600 -12.952000 53.463900 0.000000 0.000000 0.176200 12.252500 7.460300 -31.120900 0.000000 0.000000 -6.586700 5.472700 -2.488700 -0.357000 0.216100 -3.354600 13.119200 9.759500 -2.234200 0.845600 0.627800 0.475500 -1.577500 12.907300 7.803900 15.736100 9.306700 -78.822200 0.000000 -11.215800 0.000000 -1.009100 -0.399000 9.752900 -10.906300 -2.717300 -7.991000 6.445300 32.173000 77.470700 -0.000200 39.884100 0.000100 16.311900 -5.158400 -5.061900 +71.095616 85.937090 121.302018 11.909200 54.421200 -7.463300 -22.631500 15.965900 -6.536800 17.593100 0.000000 0.000000 -2.453800 8.721800 12.667600 -13.697600 0.000000 0.000000 -10.600700 -4.714900 -12.941400 62.064900 0.000000 0.000000 7.441800 12.001700 7.487100 -19.023900 0.000000 0.000000 -6.302500 5.473400 -2.313800 -0.431300 0.256800 -3.324700 13.489200 10.761900 -2.589700 1.199700 1.370600 -0.599000 -1.805700 13.083500 7.658900 14.524200 7.429600 -79.992000 0.000000 -11.740300 0.000000 -1.382300 -0.677600 9.498600 -10.632300 -2.757200 -8.439900 6.712800 32.733600 79.550900 -0.000200 36.406600 0.000100 15.403900 -4.828200 -4.108400 +74.031094 86.476332 122.291348 10.688200 55.507600 -6.460700 -19.061900 13.180400 -7.916400 16.211200 0.000000 0.000000 -3.506300 10.284700 13.096300 -13.469700 0.000000 0.000000 -13.717600 -0.181700 -12.717900 67.863600 0.000000 0.000000 8.459200 11.989200 9.460500 -18.864600 0.000000 0.000000 -6.066200 5.217600 -2.402900 -0.109100 0.108200 -2.937700 13.692900 11.535100 -2.550100 2.289900 2.683400 -1.779500 -1.345000 13.520500 7.502400 12.764400 4.060000 -81.453600 -0.000100 -13.387900 0.000000 -0.506200 -0.239100 8.460200 -10.391000 -2.837400 -8.552700 7.516400 34.094200 80.406600 -0.000100 32.936900 0.000000 14.061100 -4.448500 -2.942600 +76.911708 86.956138 123.321572 9.580100 57.662100 -6.125800 -15.526000 9.787800 -8.760200 14.467300 0.000000 0.000000 -4.329400 11.147300 13.364800 -13.428400 0.000000 0.000000 -16.108200 2.474700 -11.890000 70.778500 0.000000 0.000000 4.292400 10.904400 8.481400 -18.723000 0.000000 0.000000 -5.940200 4.615600 -2.348100 0.225200 -0.430800 -2.171000 13.930200 11.846600 -2.262500 3.119200 3.834700 -2.674200 -1.216500 13.337700 7.589900 11.469600 0.737300 -82.979500 -0.000100 -16.357000 0.000000 -0.900300 -0.739800 7.796900 -9.846800 -3.274100 -8.464200 8.928300 35.188500 80.345300 -0.000100 30.451800 0.000000 13.661500 -4.560300 -2.164400 +79.653384 87.276940 124.277374 9.163900 60.304500 -6.462000 -12.453400 7.249500 -9.211400 12.913000 0.000000 0.000000 -5.086800 10.629200 13.672600 -13.424600 0.000000 0.000000 -18.684800 4.231900 -11.088800 71.371800 0.000000 0.000000 1.147100 8.383000 6.748500 -18.081900 0.000000 0.000000 -5.861900 3.999300 -2.303800 0.369400 -1.002200 -1.460700 14.196200 11.900400 -2.041300 3.156400 4.582800 -2.658200 -1.315900 12.918400 7.888200 10.113900 -2.769000 -84.217500 -0.000100 -20.387100 0.000000 0.104500 -0.911600 6.705700 -9.123900 -4.151800 -8.271700 10.711800 35.393800 79.903800 -0.000100 28.836800 0.000000 14.049900 -4.836200 -2.319200 +82.247740 87.438992 125.136910 9.476000 63.253300 -7.472400 -9.872700 6.017600 -9.306300 11.919700 0.000000 0.000000 -6.028400 8.630400 14.315200 -13.335500 0.000000 0.000000 -21.135800 5.623600 -10.246700 69.659300 0.000000 0.000000 -1.124500 4.225500 5.439900 -17.718900 0.000000 0.000000 -5.840400 3.352100 -2.251000 0.511100 -1.622100 -0.774400 14.275400 11.735800 -1.768400 2.747200 5.018800 -2.631400 -1.344000 12.681000 7.898900 8.504800 -7.406600 -84.545100 -0.000100 -25.358700 0.000000 0.007900 -1.377900 6.096800 -8.479900 -5.096000 -8.101800 12.418000 34.101600 79.645900 -0.000100 27.469500 0.000000 14.738400 -4.926600 -2.442900 +84.749894 87.500460 125.861318 10.685000 66.354600 -9.167700 -7.912500 4.487600 -9.373200 11.362500 0.000000 0.000000 -7.015900 6.819000 14.725700 -13.439100 0.000000 0.000000 -23.363200 6.522600 -9.799300 65.668200 0.000000 0.000000 -3.832000 -0.151400 3.654700 -17.262600 0.000000 0.000000 -5.877600 2.840900 -2.200800 0.562300 -2.119200 -0.224200 14.383800 11.166100 -1.385900 2.141000 5.106500 -2.866800 -1.534500 12.209300 7.729500 6.748900 -11.859100 -84.305400 -0.000100 -30.430100 0.000000 -2.048500 -2.303300 6.214200 -7.921500 -6.109800 -7.970500 14.055600 31.825000 79.535300 -0.000100 26.011800 0.000000 14.617900 -4.904900 -2.815300 +87.178896 87.505286 126.600458 12.682200 69.322400 -11.784700 -6.577700 2.374400 -9.087400 11.470900 0.000000 0.000000 -8.289200 5.621800 15.091700 -13.420000 0.000000 0.000000 -24.996300 7.363100 -9.185600 59.344800 0.000000 0.000000 -6.138200 -2.810300 1.612000 -16.220400 0.000000 0.000000 -6.059000 2.426300 -2.074200 0.684700 -2.541900 0.390600 14.426400 10.575800 -1.172000 1.762700 4.888100 -2.841600 -1.822500 11.819100 7.751000 4.423700 -15.440400 -84.176300 -0.000100 -34.756000 0.000000 0.248100 -1.756600 6.983000 -7.587200 -6.577300 -7.942200 15.641400 29.017300 79.871200 -0.000100 24.126200 0.000000 13.541500 -4.810300 -2.842100 +89.554304 87.462868 127.319278 15.496300 71.671700 -15.138400 -5.684500 -0.027200 -8.746200 11.892400 0.000000 0.000000 -9.650800 5.440100 15.455100 -13.364900 0.000000 0.000000 -26.181000 9.008300 -8.256400 51.141100 0.000000 0.000000 -7.300700 -4.954800 1.306300 -15.629100 0.000000 0.000000 -6.166100 2.296200 -1.997500 0.576900 -2.672500 0.981700 14.338400 9.987800 -0.911700 1.601000 4.706100 -2.916900 -2.225000 11.419400 7.882800 2.272000 -18.368200 -84.006000 -0.000200 -39.099500 -0.000100 0.532300 -2.240400 7.316800 -7.313800 -7.020400 -8.015800 17.043200 27.189800 80.209100 -0.000100 21.899300 0.000000 13.195100 -4.983400 -2.212400 +91.971622 87.358474 128.045464 18.825800 73.575200 -18.988500 -4.873600 -2.418500 -8.334000 12.529000 0.000000 0.000000 -11.033600 5.678800 16.028900 -13.507100 0.000000 0.000000 -26.981400 10.334500 -7.409300 41.996200 0.000000 0.000000 -7.623900 -5.646100 1.211400 -15.174100 0.000000 0.000000 -6.325700 2.224100 -1.934500 0.508200 -2.748800 1.563100 14.391900 9.611100 -0.688200 1.101200 4.711900 -3.108600 -2.495300 11.133200 8.066700 0.074900 -20.394700 -83.932900 -0.000200 -43.208400 -0.000100 0.063400 -2.340600 7.216900 -7.120500 -7.193200 -8.098100 18.407500 26.670100 80.416300 -0.000100 19.659400 0.000000 13.268100 -5.344700 -1.585700 +94.433898 87.142828 128.729486 22.644600 75.007500 -23.149900 -4.025400 -4.110700 -7.998100 13.154900 0.000000 0.000000 -12.639400 5.598700 16.402200 -13.558900 0.000000 0.000000 -27.929400 10.785100 -6.822000 33.166700 0.000000 0.000000 -6.788600 -2.840900 1.409600 -15.662000 0.000000 0.000000 -6.504700 2.177900 -1.896100 0.450900 -2.801200 1.984600 14.458200 9.542400 -0.595800 0.318000 4.853600 -3.178400 -2.873200 10.788200 8.250900 -1.664600 -21.714600 -83.721100 -0.000200 -47.089000 -0.000100 -3.280300 -2.989300 6.117500 -6.861700 -7.377000 -8.200100 19.402100 27.387900 80.481700 -0.000100 17.520900 0.000000 13.241300 -5.482400 -1.143700 +97.008950 86.817962 129.407920 26.264600 76.177800 -27.059500 -2.850100 -4.897800 -7.601000 13.812200 0.000000 0.000000 -14.239100 4.845400 16.763000 -13.393000 0.000000 0.000000 -28.931400 9.623400 -6.278700 25.122100 0.000000 0.000000 -5.048100 2.521700 4.136400 -16.584600 0.000000 0.000000 -6.583900 2.055700 -1.876000 0.482100 -2.916900 2.378900 14.377800 9.790300 -0.649300 -0.489700 5.170000 -3.125200 -3.190400 10.595000 8.365900 -3.134300 -22.525700 -83.399800 -0.000300 -50.585800 -0.000100 -3.456600 -3.023700 6.548000 -6.688800 -7.593100 -8.303600 20.208300 27.726700 80.384500 -0.000100 16.151100 0.000000 13.999800 -5.723300 -0.688200 +99.757230 86.414610 130.125216 28.968700 77.495200 -30.112400 -1.154200 -5.101600 -7.036200 14.681700 0.000000 0.000000 -15.960500 3.467800 17.030200 -13.636900 0.000000 0.000000 -29.432200 6.749400 -5.659600 17.954900 0.000000 0.000000 -3.570600 9.333900 8.719200 -16.869700 0.000000 0.000000 -6.482200 1.771500 -1.883100 0.777400 -3.175200 2.831200 14.342200 10.062200 -0.655400 -1.527500 5.691300 -3.268800 -3.472200 10.302200 8.469600 -4.219400 -22.622300 -83.109900 -0.000300 -53.531800 -0.000100 -3.239200 -2.870400 6.976500 -6.521200 -7.750100 -8.352000 20.874700 26.856000 80.163300 -0.000100 15.769900 0.000000 14.530900 -5.831100 -0.773200 +102.619302 85.957664 130.924046 33.006800 78.944200 -34.683600 0.487500 -5.245700 -6.118100 15.838700 0.000000 0.000000 -17.708900 1.985400 17.105100 -13.847400 0.000000 0.000000 -29.476300 4.441000 -4.679700 11.754400 0.000000 0.000000 -2.760100 15.891800 11.786100 -16.439700 0.000000 0.000000 -6.426400 1.360700 -1.884500 1.086000 -3.558800 3.433800 14.402600 10.160700 -0.595200 -2.796300 6.449700 -3.347200 -3.555500 9.914300 8.701300 -5.301200 -22.483800 -83.045300 -0.000300 -55.419600 -0.000200 -2.823100 -2.813500 7.351700 -6.398300 -8.046000 -8.327700 21.535800 25.308800 79.736300 -0.000100 16.382800 0.000000 14.367400 -5.794100 -1.290000 +105.610660 85.531706 131.654550 39.787000 80.590100 -41.847800 1.797600 -5.686800 -5.302700 17.640800 0.000000 0.000000 -18.962600 0.760500 17.095600 -14.525900 0.000000 0.000000 -29.112800 3.566500 -3.880000 7.387700 0.000000 0.000000 -3.393400 20.426000 14.322700 -16.383700 0.000000 0.000000 -6.339800 0.758500 -1.986700 1.250100 -4.117400 4.087300 14.393800 10.212800 -0.486300 -3.524200 7.295800 -3.542100 -3.827100 9.517300 8.842300 -5.913200 -22.357600 -83.091800 -0.000300 -56.099000 -0.000200 -2.712100 -2.770500 7.549400 -6.374900 -8.371700 -8.315300 22.120600 23.770600 79.162600 -0.000100 17.485500 0.000000 13.976200 -5.587000 -1.998200 +108.795566 85.182710 132.269992 48.800600 81.927300 -50.901200 2.686600 -6.052300 -4.860200 20.242300 0.000000 0.000000 -19.353300 -0.214100 17.446000 -16.290700 0.000000 0.000000 -29.105200 2.763200 -3.401200 6.981800 0.000000 0.000000 -4.791500 21.523600 17.065700 -17.365200 0.000000 0.000000 -6.288600 0.312800 -2.024700 1.048300 -4.539400 4.337100 14.379400 10.416100 -0.408800 -3.437000 7.918400 -3.498800 -3.962900 9.085900 9.017600 -6.226400 -22.380400 -83.323200 -0.000300 -55.609400 -0.000200 -2.440100 -2.615900 7.623800 -6.347200 -8.773900 -8.307900 22.591200 22.736500 78.619300 -0.000100 18.695300 0.000000 13.738800 -5.364600 -2.702400 +112.149382 84.919058 132.842254 59.914000 82.735200 -62.363200 2.786600 -6.031800 -4.095300 24.333500 0.000000 0.000000 -19.147500 -1.318800 17.707900 -18.837200 0.000000 0.000000 -29.405500 2.829200 -2.714700 10.386000 0.000000 0.000000 -3.340300 20.688100 15.691800 -18.271600 0.000000 0.000000 -6.421100 -0.042100 -1.611100 0.604100 -4.947000 4.608200 14.514800 10.862900 -0.550500 -3.024700 8.389500 -3.636200 -3.986900 8.835400 8.992100 -5.983600 -22.461800 -83.537600 -0.000300 -54.399900 -0.000200 -1.582600 -2.213700 7.626900 -6.365600 -8.913500 -8.449900 22.909300 22.286300 78.231100 -0.000100 19.968500 0.000000 13.682000 -5.303900 -3.243900 +115.654582 84.660994 133.370574 73.964700 83.147400 -76.802100 1.759800 -5.551500 -3.234200 30.513800 0.000000 0.000000 -17.706700 -2.656800 17.661800 -22.999300 0.000000 0.000000 -29.192300 5.358200 -2.134500 14.190000 0.000000 0.000000 -0.647800 17.178900 15.807200 -18.191700 0.000000 0.000000 -6.656100 -0.344500 -0.997400 0.061600 -5.350600 4.729200 14.460300 11.379600 -0.745400 -2.390100 8.801800 -3.844300 -4.152000 8.845500 9.020500 -5.142100 -22.829300 -83.825700 -0.000300 -52.821600 -0.000100 -0.415800 -1.758200 7.537800 -6.401000 -8.996000 -8.583800 23.060200 22.585400 77.876800 -0.000100 21.234200 0.000000 13.566900 -5.108500 -3.563900 +119.090694 84.650834 134.193534 87.625100 83.285400 -92.483600 -0.760200 -3.383200 0.169000 39.655400 0.000000 0.000000 -14.379400 -5.897100 16.189100 -28.454500 0.000000 0.000000 -29.226200 6.682400 0.279100 18.795600 0.000000 0.000000 -2.870600 13.997000 12.871500 -17.952900 0.000000 0.000000 -6.592700 -0.307300 0.313900 -0.372500 -5.582700 5.813400 14.207500 11.467300 -0.614000 -1.770900 9.272000 -4.745400 -4.035300 8.991200 8.719100 -4.620300 -23.336600 -84.288600 -0.000300 -50.420300 -0.000100 0.925500 -1.341600 7.406100 -6.585700 -9.154700 -8.265400 23.055400 22.933400 77.241500 -0.000100 22.330700 0.000000 12.926500 -4.831600 -3.880300 +122.448828 84.888578 134.816342 102.859900 83.610000 -109.486200 -4.493600 -0.947300 3.936000 50.381000 0.000000 0.000000 -8.137200 -10.124100 13.303800 -31.372000 0.000000 0.000000 -28.109100 5.267800 2.098200 22.446000 0.000000 0.000000 -5.113000 13.537300 9.014000 -17.762000 0.000000 0.000000 -6.358000 -0.173900 0.983700 -0.012300 -5.706500 7.501500 13.899700 11.273700 -0.237400 -1.069900 9.814500 -6.047200 -3.896200 9.197400 8.872100 -4.918700 -23.256400 -86.262000 -0.000200 -46.297800 -0.000100 4.782500 -0.873500 8.262500 -6.653200 -8.574600 -7.997600 22.129600 23.572800 76.770900 -0.000100 22.868400 0.000000 12.545300 -4.757800 -4.375700 +125.411738 85.199220 135.044688 123.976600 82.478300 -130.858800 -9.920300 -0.320200 6.053600 61.159100 0.000000 0.000000 -2.176000 -12.825500 8.495400 -21.677000 0.000000 0.000000 -25.819600 3.397300 1.874500 23.301800 0.000000 0.000000 -7.484600 12.533400 6.892300 -16.620100 0.000000 0.000000 -6.153800 -0.016100 0.758500 -0.039600 -5.654200 8.181800 13.734000 10.829500 -0.072500 -1.112500 9.333100 -5.639500 -4.137800 8.558500 9.551400 -5.070400 -22.906300 -88.763400 -0.000200 -41.582800 -0.000100 6.417000 -0.031700 8.372000 -6.871300 -8.109000 -7.848500 20.749500 24.088700 76.843100 -0.000100 23.231000 0.000000 13.074900 -5.055800 -4.544500 +128.163066 85.658706 135.177276 140.691400 79.965700 -147.852100 -16.088800 -0.157900 8.170300 70.067500 0.000000 0.000000 6.185300 -12.924300 4.978500 -13.807800 0.000000 0.000000 -23.024900 0.605500 1.378100 22.932100 0.000000 0.000000 -9.220100 11.770700 5.835200 -16.537400 0.000000 0.000000 -5.861600 0.161200 0.977600 -0.262600 -5.617100 7.879300 13.451800 10.045000 0.199500 -0.986800 8.272000 -4.692300 -4.293300 8.234600 9.786100 -5.192700 -23.304500 -90.172700 -0.000200 -36.925000 -0.000100 6.004400 0.696000 7.081200 -7.123400 -8.020100 -7.499200 18.926200 24.788800 77.250900 -0.000100 23.471400 0.000000 13.166300 -4.961900 -5.393200 +130.889756 86.205822 135.011668 149.918100 77.904000 -156.588500 -21.099300 1.431200 9.172200 75.837800 0.000000 0.000000 9.857100 -8.209100 5.243400 -13.779700 0.000000 0.000000 -19.771300 -1.015700 0.503600 21.955800 0.000000 0.000000 -10.592500 11.085700 5.425300 -16.076100 0.000000 0.000000 -5.728000 0.908300 1.111000 -0.071100 -4.984300 6.978900 13.745600 9.498300 -0.016700 -1.359300 6.850700 -3.846400 -3.854700 8.175000 9.199400 -5.076100 -23.809100 -90.214200 -0.000100 -32.942400 0.000000 5.676400 0.492100 6.622800 -7.220900 -7.731200 -7.669100 16.264200 25.373300 78.362200 -0.000100 23.767800 0.000000 13.511200 -5.132400 -5.939700 +133.576060 86.711028 134.652004 156.702700 76.107800 -162.712100 -24.992300 3.315300 9.717300 78.553100 0.000000 0.000000 7.562900 -4.173500 7.073500 -14.283700 0.000000 0.000000 -15.981000 -2.547000 -0.321300 20.143400 0.000000 0.000000 -11.555700 10.565900 5.062400 -15.976000 0.000000 0.000000 -5.523700 1.735600 1.346600 0.314100 -4.334800 5.827000 14.031600 9.088000 -0.291000 -1.370400 5.768200 -3.597500 -3.414100 8.562400 8.792500 -4.251800 -23.622700 -89.884800 -0.000100 -29.786200 0.000000 5.836400 0.382700 6.398900 -7.848200 -6.662400 -8.038700 14.548600 26.101600 79.203000 -0.000100 25.204400 0.000000 13.036200 -4.994800 -5.960600 +136.173972 87.106760 134.188962 161.185500 74.137900 -166.586200 -28.465700 4.613800 10.031700 78.291800 0.000000 0.000000 5.490900 -4.144400 7.970000 -14.620400 0.000000 0.000000 -12.426300 -4.216200 -0.979100 18.167000 0.000000 0.000000 -12.201100 10.034200 4.289000 -15.985800 0.000000 0.000000 -5.449500 2.554300 1.460300 0.624400 -3.627400 4.937400 14.405700 8.606800 -0.563600 -1.155500 4.831500 -3.865900 -2.841100 8.951800 8.347800 -2.821500 -22.799400 -89.099600 -0.000100 -27.510900 0.000000 5.997800 0.629400 6.610400 -8.533900 -5.585400 -8.443400 13.418900 27.259700 79.194500 -0.000100 27.711700 0.000000 12.120900 -4.678800 -5.941900 +138.645138 87.331804 133.634988 164.283100 71.808700 -169.056300 -31.499900 5.464800 10.002400 75.464200 0.000000 0.000000 3.340100 -6.273900 7.986000 -14.725500 0.000000 0.000000 -9.276800 -6.631800 -1.692200 16.429600 0.000000 0.000000 -13.020800 10.048500 4.388300 -15.673800 0.000000 0.000000 -5.337000 3.051800 1.415500 0.910500 -3.207900 4.095100 14.548600 8.266900 -0.841700 -0.948500 4.145800 -4.073900 -2.331900 9.746200 8.042400 -1.062400 -21.379900 -88.036800 -0.000100 -25.735900 0.000000 4.855300 0.194500 6.826800 -9.214900 -4.522600 -8.576200 12.539600 28.470700 78.320200 -0.000100 30.937300 0.000000 11.303400 -4.240700 -6.381100 +140.966190 87.372952 133.068568 165.392700 69.259200 -170.030100 -34.589700 6.300500 10.142800 70.675700 0.000000 0.000000 0.181600 -6.222800 7.980400 -14.677900 0.000000 0.000000 -6.906900 -9.562900 -1.945100 15.257100 0.000000 0.000000 -14.144800 10.354900 4.697600 -14.766900 0.000000 0.000000 -5.310300 3.514400 1.357800 0.881000 -2.768900 3.714100 14.537300 7.703100 -0.905800 -0.851800 3.415200 -4.444900 -1.787200 10.252800 7.628200 0.861200 -19.629500 -86.592500 -0.000100 -24.402400 0.000000 3.986500 -0.176400 7.060100 -10.088200 -3.953900 -8.737000 11.928500 29.011600 77.000400 -0.000100 34.542400 0.000000 11.534400 -4.331300 -6.824700 +143.216630 87.287100 132.435600 165.833800 66.802000 -170.516200 -37.043500 7.751000 10.254800 63.497800 0.000000 0.000000 -2.302400 -3.605500 8.750800 -15.138700 0.000000 0.000000 -4.657200 -10.956300 -1.730100 14.031200 0.000000 0.000000 -15.036200 9.305200 4.706600 -14.657800 0.000000 0.000000 -5.379800 3.812500 1.245400 1.023500 -2.484100 3.454100 14.503900 7.330300 -0.932300 -1.181100 3.012200 -4.668200 -1.467400 10.702500 7.451100 2.825700 -17.401300 -85.147700 -0.000100 -23.065700 0.000000 2.934000 -1.259100 7.014900 -10.831200 -3.423200 -8.844200 10.654100 28.856300 75.810900 -0.000200 37.683300 0.000100 12.052600 -4.171200 -6.886600 +145.400014 87.099394 131.677410 165.871500 64.740100 -170.725200 -38.467100 9.854200 10.332600 53.892600 0.000000 0.000000 -2.292200 -0.483600 8.842200 -15.144400 0.000000 0.000000 -2.809600 -11.537500 -1.345200 13.405500 0.000000 0.000000 -15.985700 7.765200 4.751600 -14.734800 0.000000 0.000000 -5.346900 4.080800 1.182800 1.040000 -2.229500 3.181700 14.493800 7.069200 -0.814400 -1.527200 3.006500 -4.919800 -1.190400 11.061000 7.339400 4.980600 -14.916100 -83.656500 -0.000100 -22.201400 0.000000 1.631900 -2.050800 7.321100 -11.622400 -2.822100 -8.870500 9.183000 28.383700 74.809900 -0.000200 40.320000 0.000100 12.283900 -3.863400 -7.306700 +147.608036 86.850982 130.740404 165.746700 62.757800 -170.881300 -38.859200 12.437700 10.149600 42.493700 0.000000 0.000000 -0.356000 2.126600 8.092400 -14.282700 0.000000 0.000000 -1.051200 -12.388900 -0.917600 12.999700 0.000000 0.000000 -16.813900 6.667600 4.701500 -14.530200 0.000000 0.000000 -5.521700 4.109600 1.029300 1.305900 -2.185300 3.133600 14.517200 7.176300 -0.987100 -1.932400 2.961600 -4.698600 -1.060400 11.252600 7.303100 7.086500 -11.825600 -82.464600 -0.000100 -21.444200 0.000000 0.909100 -2.252700 7.215200 -11.768500 -2.372500 -8.743500 6.849500 28.036200 73.800900 -0.000200 42.689700 0.000100 12.171800 -4.008400 -7.555600 +149.872192 86.498430 129.638552 165.354600 60.961500 -171.110900 -38.737800 15.623400 9.914000 30.655100 0.000000 0.000000 0.877600 4.282100 6.633300 -13.870000 0.000000 0.000000 0.835200 -13.460000 -0.178600 12.401400 0.000000 0.000000 -17.382300 5.997500 4.872000 -15.116300 0.000000 0.000000 -5.768700 4.113700 0.921600 1.569500 -2.147900 3.304500 14.406600 7.072900 -0.922500 -2.361300 3.098400 -4.687100 -0.936400 11.441000 7.208200 8.921900 -8.857000 -81.334300 -0.000100 -20.738200 0.000000 1.926100 -2.386200 7.956400 -12.381500 -1.970800 -8.688100 5.131700 27.850600 72.897500 -0.000200 44.778900 0.000100 12.135800 -3.704700 -7.871200 +152.203658 86.094570 128.301242 165.028300 59.418400 -171.590600 -38.252900 19.375000 9.569300 19.714800 0.000000 0.000000 1.254900 4.310000 5.746100 -13.890300 0.000000 0.000000 2.961300 -14.563700 0.670500 11.722100 0.000000 0.000000 -17.602700 5.757800 5.536100 -15.720400 0.000000 0.000000 -5.870400 4.131300 0.848300 1.597300 -2.092600 3.584500 14.298100 7.028900 -0.901200 -2.783500 3.149800 -4.412800 -0.876800 11.639300 7.160900 10.662200 -6.024000 -80.331700 -0.000100 -20.438200 0.000000 1.116000 -2.205000 7.235600 -12.969900 -1.667800 -8.501500 3.934800 27.847300 71.917200 -0.000200 46.849100 0.000100 11.999600 -4.096900 -8.249100 +154.575764 85.691218 126.565152 164.918000 58.501500 -171.981000 -36.944400 22.593600 8.773700 10.589500 0.000000 0.000000 1.262700 3.453900 4.693700 -14.145300 0.000000 0.000000 4.738700 -15.429300 0.854700 12.066500 0.000000 0.000000 -17.683700 5.985300 6.429200 -17.060500 0.000000 0.000000 -5.949300 4.327800 0.828800 1.801100 -1.882300 3.572500 13.953400 7.123100 -0.922700 -3.069500 3.128600 -4.217300 -0.702700 11.840700 7.032700 12.041400 -3.541900 -79.514400 -0.000100 -20.180100 0.000000 0.680700 -2.324200 7.327200 -13.490800 -1.220200 -8.458600 3.035900 27.772000 71.393200 -0.000200 48.360900 0.000100 12.149100 -3.687300 -8.680000 +157.013402 85.379306 124.506990 164.832200 58.044200 -172.073100 -35.187300 22.714000 7.812200 5.604800 0.000000 0.000000 1.001300 3.963500 5.814200 -14.173900 0.000000 0.000000 5.733400 -15.578800 0.353000 13.917200 0.000000 0.000000 -17.436000 6.000100 6.952200 -19.192400 0.000000 0.000000 -5.947300 4.665600 0.640400 1.834300 -1.512600 3.330200 13.695300 7.418100 -1.022000 -3.486200 3.091600 -3.780200 -0.941900 12.201700 7.063800 13.313300 -1.544800 -78.933800 -0.000100 -19.700600 0.000000 0.357200 -2.231600 7.666400 -14.198000 -0.641000 -8.392400 3.063300 27.480500 71.267400 -0.000200 49.709900 0.000100 12.045400 -3.713600 -8.893400 +159.517334 85.163660 122.150632 164.653400 57.753900 -171.677300 -34.317100 20.138100 7.054100 8.018800 0.000000 0.000000 2.273600 5.563500 5.270800 -14.886300 0.000000 0.000000 5.819500 -15.328600 -0.992700 17.225500 0.000000 0.000000 -16.506700 6.280600 7.567300 -22.762100 0.000000 0.000000 -6.029200 5.028700 0.174700 1.763700 -1.087000 2.776000 13.364500 7.663500 -1.029800 -3.661500 3.046200 -3.083600 -0.930400 12.284500 7.112400 14.154500 1.005700 -78.692500 -0.000100 -19.471500 0.000000 0.165000 -2.094600 7.761700 -14.264200 -0.356200 -8.280500 3.060700 27.524500 71.476100 -0.000300 50.481200 0.000100 12.225400 -3.710900 -8.780400 +161.949892 85.136736 119.345202 164.221000 57.016600 -170.056000 -33.248700 15.903300 4.904800 11.170900 0.000000 0.000000 4.278300 8.704200 3.127100 -14.575100 0.000000 0.000000 4.570700 -15.399100 -3.952300 22.034100 0.000000 0.000000 -14.353600 7.235300 8.562500 -28.415600 0.000000 0.000000 -6.345400 5.111600 -0.646600 1.754200 -0.883100 1.334000 12.921200 8.124700 -1.004500 -3.810100 3.041500 -2.188300 -1.022900 12.556700 7.007500 14.602800 3.121000 -78.357400 -0.000100 -19.236800 0.000000 -1.114000 -2.299100 7.793900 -14.260800 -0.371100 -7.947500 3.557500 28.176500 71.837900 -0.000300 50.586000 0.000100 12.817700 -3.830100 -8.635300 +164.125656 85.405468 116.204746 163.866500 55.181200 -167.656900 -32.814500 12.919000 1.461000 15.520000 0.000000 0.000000 3.623800 10.806500 3.291800 -14.787600 0.000000 0.000000 1.526000 -15.734800 -8.195700 28.967800 0.000000 0.000000 -9.842900 8.102900 9.258500 -36.556300 0.000000 0.000000 -6.401700 4.908900 -1.377500 1.214700 -0.947800 -1.382300 12.534500 8.449200 -0.785900 -3.833900 2.976400 -1.433000 -0.989100 12.615900 7.221500 14.168000 3.676000 -78.168000 -0.000100 -18.297700 0.000000 -1.937800 -2.459200 7.905100 -13.921800 -0.873100 -7.710000 4.216800 28.770700 73.009500 -0.000200 49.811000 0.000100 13.880600 -4.067300 -8.427300 +166.365174 85.795612 113.227358 164.659500 53.483800 -167.320700 -31.774100 13.674500 -0.574000 18.970000 0.000000 0.000000 2.156800 8.818600 7.713300 -14.287100 0.000000 0.000000 -1.755100 -13.556400 -10.654000 38.275700 0.000000 0.000000 -3.741100 6.653800 8.744600 -39.903400 0.000000 0.000000 -6.191500 4.951200 -1.707100 0.979000 -0.783200 -2.822100 12.541300 8.773400 -0.959100 -3.931600 2.619800 -1.011400 -1.315900 11.969500 7.744000 13.429800 3.515200 -78.793100 -0.000100 -17.291300 0.000000 -1.439800 -2.191100 7.596800 -13.280900 -1.151900 -8.263700 4.836300 28.564300 75.019400 -0.000200 48.288300 0.000100 14.700500 -4.329200 -7.767500 +168.409874 86.224872 110.529370 165.066200 52.662600 -167.525300 -29.781400 15.648000 -1.531600 20.081800 0.000000 0.000000 0.021700 6.933800 10.142600 -14.072000 0.000000 0.000000 -6.051000 -9.134400 -11.394300 49.050800 0.000000 0.000000 1.256000 4.170200 7.824600 -29.625400 0.000000 0.000000 -5.964200 5.164200 -1.887300 0.742400 -0.469600 -2.903200 12.331700 9.266200 -1.059200 -3.289000 2.901500 -1.519600 -1.572900 11.853200 7.935500 12.264000 2.806700 -79.815700 -0.000100 -17.186400 0.000000 -2.383000 -2.625800 7.690000 -12.937900 -1.114000 -8.621500 5.767100 29.461600 76.151500 -0.000200 45.833500 0.000100 14.984200 -4.422700 -6.590800 +170.308270 86.718902 107.969812 165.735100 51.760700 -167.956000 -27.141800 15.441300 -2.750600 20.054100 0.000000 0.000000 -1.893600 6.546200 11.082400 -13.879500 0.000000 0.000000 -10.739000 -5.035700 -11.500900 58.148700 0.000000 0.000000 8.690600 3.058100 6.021200 -18.050700 0.000000 0.000000 -5.669300 5.074300 -2.310900 0.518200 -0.426200 -2.467600 12.544700 9.943800 -1.289600 -2.977500 3.321900 -1.715400 -1.710600 11.966800 7.972800 11.004300 1.467100 -81.019700 -0.000100 -18.234500 0.000000 -3.080700 -3.130300 7.514200 -12.866200 -1.295900 -8.516400 6.616200 31.840800 76.473900 -0.000200 42.140100 0.000100 14.520800 -4.423500 -4.816800 +172.263816 87.196676 105.420668 166.844300 50.297700 -168.833700 -24.195700 12.974900 -4.237200 19.553900 0.000000 0.000000 -3.509300 7.443000 11.200900 -13.697200 0.000000 0.000000 -14.327300 -1.768000 -11.055000 64.069800 0.000000 0.000000 10.432200 4.600200 6.027300 -17.838900 0.000000 0.000000 -5.695500 4.774400 -2.697500 0.631700 -0.613800 -2.020100 12.896200 10.066600 -1.156600 -2.584900 3.741800 -1.673800 -1.761100 11.689000 8.268400 9.689900 -0.557100 -82.320700 -0.000100 -20.268100 0.000000 -3.228400 -3.484400 7.182600 -12.171200 -1.554300 -8.328800 7.005600 33.709100 76.951000 -0.000200 38.131300 0.000100 14.911900 -4.491300 -3.397800 +174.193708 87.613490 102.790244 168.715300 48.511000 -170.364000 -20.438600 9.957100 -5.768300 18.132700 0.000000 0.000000 -4.770900 8.452600 11.412200 -13.765700 0.000000 0.000000 -17.007300 0.060700 -10.770600 67.466700 0.000000 0.000000 5.650000 5.339500 6.126100 -17.974700 0.000000 0.000000 -5.608600 4.360500 -2.874000 1.098800 -0.891600 -1.576000 13.160800 9.844600 -0.898900 -2.104300 3.947200 -1.636300 -1.833000 11.435700 8.367500 8.044200 -3.827500 -83.229700 -0.000100 -22.683500 0.000000 -3.366800 -3.911700 6.886400 -11.298400 -2.349200 -8.280500 7.158400 35.086300 77.620600 -0.000100 34.258800 0.000000 15.511500 -4.925900 -3.004400 +176.022254 87.958676 100.298504 170.021000 46.612700 -171.662800 -17.044000 8.149300 -6.663300 16.603400 0.000000 0.000000 -5.774300 8.094700 11.875900 -13.733700 0.000000 0.000000 -20.092000 1.161300 -10.294100 68.581300 0.000000 0.000000 2.150900 4.220800 4.788300 -17.107900 0.000000 0.000000 -5.370900 3.978300 -2.847100 0.917800 -1.108600 -1.134800 13.511300 9.556800 -0.789800 -1.641900 3.780600 -1.199400 -1.827300 11.274700 8.256000 6.071400 -7.612900 -83.611100 -0.000100 -25.404800 0.000000 -3.032500 -3.955000 6.487400 -10.680100 -2.993700 -8.136500 8.260400 34.252500 78.487300 -0.000100 31.265700 0.000000 15.692700 -5.333400 -3.330200 +177.828702 88.196674 97.900236 171.094600 44.332500 -172.994200 -13.864100 7.747700 -6.932000 15.356900 0.000000 0.000000 -6.777000 5.950300 12.137400 -13.757400 0.000000 0.000000 -22.937300 1.420600 -9.669700 67.330100 0.000000 0.000000 -0.450800 1.334300 3.613300 -16.978800 0.000000 0.000000 -5.251600 3.425400 -2.768700 0.861700 -1.576100 -0.518500 13.744400 9.116800 -0.693400 -1.376400 3.476200 -0.971600 -2.079200 11.059400 8.164900 4.166800 -10.787200 -83.904800 -0.000100 -28.692700 0.000000 -2.334800 -3.679700 6.487100 -10.004800 -3.702800 -8.077500 9.285800 32.452800 79.415800 -0.000100 28.541700 0.000000 15.066700 -5.034900 -3.576800 +179.547774 88.313260 95.565722 171.819400 41.942900 -174.002500 -11.052800 6.931800 -7.087700 14.200300 0.000000 0.000000 -7.802400 4.049000 12.244700 -13.883100 0.000000 0.000000 -25.480200 1.622300 -9.061200 63.911500 0.000000 0.000000 -3.675800 -1.793000 2.785200 -15.983100 0.000000 0.000000 -5.291200 2.854000 -2.697100 0.982900 -2.109200 -0.007900 13.752700 8.652700 -0.539100 -1.036500 3.139400 -0.785700 -2.049600 10.696700 8.167100 1.800600 -13.221300 -84.337500 -0.000100 -32.145300 0.000000 -2.666000 -3.671700 6.795800 -9.260200 -4.402000 -7.826600 10.475300 30.481400 79.860600 -0.000100 26.288200 0.000000 14.015900 -4.862700 -3.285400 +181.215030 88.329770 93.279214 172.163400 39.982200 -174.608900 -8.545900 5.525300 -7.222400 12.994400 0.000000 0.000000 -8.831800 3.168600 12.329800 -13.889400 0.000000 0.000000 -27.638800 2.615200 -8.299400 58.482400 0.000000 0.000000 -6.329400 -3.448800 1.467700 -15.633300 0.000000 0.000000 -5.279600 2.469700 -2.698700 0.895900 -2.453400 0.457900 13.783900 8.168700 -0.349400 -0.761400 2.756400 -0.779800 -2.542000 10.191400 8.244800 0.025900 -15.248900 -84.615800 -0.000200 -35.684100 0.000000 -3.223400 -4.011200 6.698800 -8.796800 -5.106100 -7.652800 11.913600 29.192200 80.135200 -0.000100 23.966100 0.000000 13.218600 -4.810100 -3.057500 +182.888128 88.248998 90.987118 172.359200 38.431800 -175.061800 -6.389700 3.706800 -7.251600 12.227000 0.000000 0.000000 -10.056300 3.118700 12.689200 -13.911100 0.000000 0.000000 -29.322000 3.884100 -7.410700 51.520100 0.000000 0.000000 -7.586100 -4.444700 1.119100 -15.477900 0.000000 0.000000 -5.370200 2.170900 -2.705800 0.949200 -2.735600 0.889000 13.785300 7.775700 -0.218100 -0.478400 2.429900 -0.790100 -2.908500 9.796700 8.329600 -1.890100 -17.065400 -84.763100 -0.000200 -39.124900 -0.000100 -3.170200 -3.890400 6.569000 -8.324900 -5.587100 -7.601700 13.129500 28.617400 80.452700 -0.000100 21.556900 0.000000 13.051500 -4.832200 -3.000000 +184.573672 88.068150 88.683084 172.324000 37.176000 -175.282100 -4.669000 1.595500 -7.297600 11.993900 0.000000 0.000000 -11.513900 3.877700 12.745000 -13.912800 0.000000 0.000000 -30.676200 4.902600 -6.649100 43.569700 0.000000 0.000000 -7.675300 -4.820600 1.331600 -15.617400 0.000000 0.000000 -5.534700 1.936500 -2.738400 0.988300 -2.961700 1.236600 13.837700 7.496000 -0.116800 -0.431400 2.262000 -0.768100 -3.267500 9.405300 8.496800 -3.638000 -18.648500 -84.798200 -0.000200 -42.390300 -0.000100 -3.394400 -3.936300 6.882800 -7.862200 -5.997200 -7.608300 14.130600 28.598200 80.751800 -0.000100 19.204600 0.000000 12.801800 -4.932200 -2.982200 +186.279028 87.749888 86.319106 172.202800 36.387500 -175.273200 -3.017300 0.076200 -7.430900 12.104600 0.000000 0.000000 -12.979600 4.455800 13.380800 -13.933900 0.000000 0.000000 -31.837700 5.196800 -6.040700 35.396800 0.000000 0.000000 -6.518900 -4.138900 1.524300 -15.571200 0.000000 0.000000 -5.662700 1.822100 -2.791700 0.995400 -3.066500 1.440600 13.922100 7.418100 -0.140500 -0.667700 2.142300 -0.631400 -3.606600 9.054800 8.630600 -5.028400 -19.825200 -84.581900 -0.000200 -45.574100 -0.000100 -3.553000 -4.004600 6.830700 -7.573600 -6.332200 -7.631100 15.118800 28.490800 81.033100 -0.000100 17.145100 0.000000 12.791200 -5.006400 -2.874700 +187.993020 87.326470 83.889596 172.007600 35.850300 -175.055300 -1.375200 -0.634500 -7.617000 12.401900 0.000000 0.000000 -14.496800 4.409900 13.696400 -13.952300 0.000000 0.000000 -32.883700 4.448300 -5.629200 27.514100 0.000000 0.000000 -4.299900 -1.634800 2.615600 -15.252500 0.000000 0.000000 -5.705700 1.664700 -2.828700 0.926700 -3.211300 1.438200 13.947400 7.534100 -0.162400 -1.167700 2.274500 -0.653400 -3.984000 8.808400 8.757300 -5.918600 -20.657800 -84.089000 -0.000200 -48.531700 -0.000100 -4.352300 -4.090700 6.720400 -7.237300 -6.573700 -7.687800 15.886500 28.057000 81.332100 -0.000100 15.738600 0.000000 13.091200 -5.070100 -2.682900 +189.853570 86.837774 81.373472 171.974800 35.327400 -175.143700 0.642800 -0.351200 -7.423400 12.732600 0.000000 0.000000 -16.157900 3.451100 14.189400 -14.125000 0.000000 0.000000 -33.459500 2.228800 -4.969600 20.105000 0.000000 0.000000 -2.306700 2.245800 4.245500 -15.877700 0.000000 0.000000 -5.738700 1.432200 -2.782800 1.081300 -3.428400 1.605300 13.770200 7.868600 -0.180900 -1.724200 2.707000 -0.816000 -4.089300 8.666300 8.831900 -6.797400 -21.184900 -83.573000 -0.000300 -50.905300 -0.000100 -4.831600 -4.178800 6.715200 -7.034800 -6.854000 -7.715200 16.748600 27.368600 81.356200 -0.000100 15.235800 0.000000 15.053500 -5.683200 -2.244600 +191.839342 86.294976 78.716886 172.109100 34.634200 -175.456900 3.061200 0.273600 -6.988000 12.827200 0.000000 0.000000 -17.490200 2.134200 14.502700 -14.340400 0.000000 0.000000 -33.352000 -0.471400 -4.172500 13.359700 0.000000 0.000000 -0.952500 7.161000 6.257200 -16.486600 0.000000 0.000000 -5.732200 1.109200 -2.711200 1.322100 -3.732500 1.938700 13.535700 8.420300 -0.238700 -2.345000 3.262700 -0.867200 -4.307200 8.349700 8.867500 -7.130300 -21.387400 -83.098800 -0.000300 -52.647300 -0.000100 -5.181300 -4.077300 6.986400 -6.785500 -7.108300 -7.737300 17.676000 26.543300 81.139000 -0.000100 15.625900 0.000000 14.773700 -5.519100 -2.505100 +193.910204 85.817202 75.891390 172.334000 33.552500 -175.742100 5.410300 0.706300 -6.496500 13.315100 0.000000 0.000000 -18.279300 0.744900 14.093800 -14.720800 0.000000 0.000000 -32.493100 -1.922600 -3.560300 7.749100 0.000000 0.000000 -0.477500 11.346500 8.707400 -16.295700 0.000000 0.000000 -5.888100 0.623400 -2.749900 1.836800 -4.201400 2.310200 13.481300 9.134500 -0.256500 -3.456400 3.979300 -0.854100 -4.190500 8.057700 8.836200 -7.662500 -21.363500 -82.835600 -0.000300 -53.363400 -0.000100 -4.883800 -3.795800 6.805600 -6.800300 -7.220700 -7.613800 18.882600 25.648400 80.603600 -0.000100 16.812400 0.000000 14.523700 -5.304600 -2.647200 +196.017896 85.425280 72.918828 172.283000 32.050300 -175.747500 6.803700 0.501500 -6.023500 15.128100 0.000000 0.000000 -18.450100 -0.339000 14.011800 -16.354300 0.000000 0.000000 -32.370800 -2.923100 -3.302500 6.847800 0.000000 0.000000 -2.112700 12.609200 9.931600 -16.518900 0.000000 0.000000 -6.042900 0.006200 -2.801500 1.895400 -4.792600 2.572200 13.276200 9.790900 -0.267500 -4.049400 4.680600 -0.655300 -4.208500 7.815500 8.889500 -7.780100 -21.445200 -82.968100 -0.000300 -52.805300 -0.000100 -4.798400 -3.612000 6.770400 -6.888100 -7.787800 -7.756900 19.574400 25.802700 80.141100 -0.000100 17.622300 0.000000 14.398800 -4.883400 -2.901100 +198.214742 85.143086 69.845428 172.033400 30.729000 -176.041900 7.281400 0.542100 -5.060600 18.525900 0.000000 0.000000 -18.098000 -1.358500 14.570900 -18.837000 0.000000 0.000000 -32.796200 -3.362100 -2.795100 10.279100 0.000000 0.000000 -2.427500 12.135800 8.428400 -16.872400 0.000000 0.000000 -6.102800 -0.514800 -2.369100 1.398700 -5.346400 2.808500 13.183500 10.373600 -0.360200 -4.358000 5.141500 -0.397300 -4.211300 7.685700 8.945200 -7.389600 -21.474000 -83.301300 -0.000300 -51.257900 -0.000100 -4.206700 -3.363600 6.248900 -6.888900 -7.959200 -8.066800 19.943500 25.402300 80.076200 -0.000100 18.532000 0.000000 14.424300 -4.601200 -3.465900 +200.558654 84.950808 66.578988 171.558000 29.577900 -176.543100 6.737500 1.311800 -3.598600 23.746900 0.000000 0.000000 -16.900400 -2.677800 14.394100 -21.093400 0.000000 0.000000 -32.608700 -1.478700 -1.889100 14.157300 0.000000 0.000000 -1.843200 10.189900 8.993100 -17.350400 0.000000 0.000000 -6.603700 -0.781600 -1.553500 1.035200 -5.761700 3.024400 13.031100 10.709800 -0.521500 -4.506800 5.123500 -0.231300 -4.111600 7.355500 8.812200 -6.507800 -21.441200 -83.557500 -0.000200 -49.213800 -0.000100 -3.786500 -2.858100 5.969600 -6.961000 -7.860200 -8.391600 20.135500 24.616000 80.271400 -0.000100 19.642000 0.000000 12.213600 -4.339900 -4.211600 +203.077572 84.938362 63.312294 171.226800 28.769700 -177.912700 4.800200 3.077800 -0.828200 31.480300 0.000000 0.000000 -13.572700 -4.848100 13.524500 -27.148600 0.000000 0.000000 -32.098000 1.093000 -0.107800 17.433600 0.000000 0.000000 -0.060600 7.727200 10.494200 -16.912000 0.000000 0.000000 -6.813100 -0.635000 -0.314100 0.375400 -5.825000 3.673100 12.642700 10.724000 -0.544600 -3.999600 4.914100 -0.436900 -4.233900 7.258000 8.381900 -5.299300 -21.865300 -83.836700 -0.000200 -46.426700 -0.000100 -2.904800 -2.404000 5.706500 -7.312800 -7.893100 -8.506600 20.481400 24.581900 80.149600 -0.000100 20.466100 0.000000 10.893800 -3.692900 -4.906700 +205.657450 85.181440 60.111640 171.602700 28.956000 179.897000 1.598800 5.608100 3.087800 41.484700 0.000000 0.000000 -7.499100 -7.860300 10.694000 -32.184900 0.000000 0.000000 -31.413100 0.291000 2.354600 22.116400 0.000000 0.000000 -2.816100 8.299000 6.849900 -16.315100 0.000000 0.000000 -6.737500 -0.111600 0.690200 0.283000 -5.548100 5.341700 12.309200 10.785600 -0.605000 -3.316300 4.668200 -0.980000 -4.050900 7.680400 8.160200 -4.805200 -21.781800 -85.070800 -0.000200 -42.696900 -0.000100 -2.123600 -2.392100 5.702200 -7.471300 -7.441800 -8.552000 19.809100 25.490900 79.769400 -0.000100 20.980100 0.000000 10.603800 -3.557900 -5.005900 +207.787240 85.574378 57.097422 171.971600 28.646500 178.811600 -3.341400 6.077800 5.778200 52.985400 0.000000 0.000000 -1.212000 -9.195800 6.807400 -27.949900 0.000000 0.000000 -29.334100 -0.147700 3.577400 23.789900 0.000000 0.000000 -5.079300 8.113500 3.641400 -16.081900 0.000000 0.000000 -6.389000 0.236800 1.062600 0.047100 -5.373400 6.191000 11.769700 10.649000 -0.448300 -2.459500 4.340400 -1.132900 -3.965900 7.947200 8.594500 -4.236400 -21.064700 -86.853900 -0.000200 -38.810300 -0.000100 0.320700 -0.949600 5.708900 -7.773900 -6.815600 -8.468200 18.453600 26.741000 79.523600 -0.000100 21.769400 0.000000 10.822400 -3.611900 -5.133300 +209.634836 86.098380 54.239414 172.330400 26.719300 178.204000 -9.148800 4.212800 7.479100 63.418800 0.000000 0.000000 6.176300 -8.922400 3.734200 -16.930100 0.000000 0.000000 -26.170900 -1.155600 3.633900 23.302900 0.000000 0.000000 -7.086600 7.357900 2.048300 -15.590100 0.000000 0.000000 -6.192700 0.380900 1.208500 0.106900 -5.351800 6.301900 11.493500 9.864100 -0.070500 -2.387500 3.533400 -1.076200 -3.968800 7.495300 8.850600 -3.750200 -20.837800 -88.045600 -0.000100 -34.633900 0.000000 0.732200 -1.007900 6.099700 -8.219800 -6.775400 -8.151100 16.655700 27.148400 79.452700 -0.000100 23.103400 0.000000 10.611900 -3.437400 -5.772800 +211.320380 86.746080 51.390550 173.004800 24.661800 177.786400 -14.573300 2.728200 8.509100 71.146400 0.000000 0.000000 13.361800 -7.096000 1.971700 -15.935600 0.000000 0.000000 -22.428500 -2.274000 3.331800 22.146700 0.000000 0.000000 -8.732200 6.772800 1.526600 -15.519100 0.000000 0.000000 -5.857400 0.669700 1.288500 0.172600 -5.167800 6.041100 11.736400 9.082500 -0.050300 -2.586100 2.295700 -0.641900 -3.921300 7.334900 8.706100 -3.164600 -21.111800 -88.402000 -0.000100 -30.516200 0.000000 0.410300 -0.974100 5.820700 -8.483500 -6.725700 -8.011000 14.389000 26.938500 79.796600 -0.000100 24.877100 0.000000 11.990200 -3.848800 -5.849700 +212.898482 87.367872 48.408844 174.055500 23.060000 177.544600 -18.650300 2.294700 9.115700 75.803500 0.000000 0.000000 13.102800 -5.005900 2.335300 -15.793100 0.000000 0.000000 -17.800400 -3.079500 2.961500 19.856800 0.000000 0.000000 -9.914300 6.414700 1.522200 -15.456000 0.000000 0.000000 -5.637200 1.185700 1.400800 0.628000 -4.806500 5.388100 12.083400 8.390300 -0.099200 -2.257900 1.134200 -0.372600 -3.541200 7.690600 8.600900 -2.367000 -21.168300 -88.264900 -0.000100 -27.344800 0.000000 1.227700 -1.062200 5.514700 -8.870300 -5.974300 -8.156600 12.346100 26.467000 80.425000 -0.000100 27.361300 0.000000 11.652800 -3.668200 -6.702600 +214.296752 87.863426 45.476668 174.931000 21.754200 177.687700 -22.494000 2.491700 9.386900 77.769700 0.000000 0.000000 10.554900 -4.868600 3.958800 -15.963900 0.000000 0.000000 -13.535800 -4.059700 2.402900 17.704700 0.000000 0.000000 -10.877200 6.435400 1.232100 -15.089800 0.000000 0.000000 -5.391500 1.868600 1.398200 0.856700 -4.243800 4.619400 12.487100 7.824000 -0.356500 -1.764000 0.002000 -0.024700 -3.137900 8.147300 8.448200 -0.896100 -20.259700 -87.745900 -0.000100 -25.298700 0.000000 2.028800 -0.766500 5.640900 -9.527500 -5.170500 -8.388400 10.906700 26.520600 80.505600 -0.000100 30.478300 0.000000 10.728600 -3.112600 -7.017200 +215.548718 88.204040 42.659300 175.486600 20.834500 178.036200 -26.288400 3.331900 9.676600 77.287700 0.000000 0.000000 7.291600 -5.703600 6.167200 -16.070800 0.000000 0.000000 -9.792600 -5.648100 1.777600 15.651200 0.000000 0.000000 -11.687700 7.325500 1.019600 -14.869000 0.000000 0.000000 -5.127300 2.619700 1.303600 0.897800 -3.579500 3.904700 12.856200 7.273900 -0.611100 -1.409600 -0.927600 0.078600 -2.586700 8.972600 8.080400 0.792900 -18.399400 -86.742100 -0.000100 -23.995000 0.000000 2.363700 -0.927900 5.606600 -10.265100 -4.393000 -8.456900 9.744200 27.255800 79.799500 -0.000100 34.038800 0.000000 10.221500 -2.831800 -7.214300 +216.649300 88.377268 39.951914 175.640000 19.922900 178.536200 -29.924000 4.442600 9.788500 74.496500 0.000000 0.000000 3.245000 -5.072800 6.628200 -16.242300 0.000000 0.000000 -6.724900 -7.757200 1.113100 13.956300 0.000000 0.000000 -12.650700 8.597700 1.088000 -14.970800 0.000000 0.000000 -4.973500 3.235100 1.158800 0.897900 -3.008300 3.240400 13.147000 6.808000 -0.803000 -1.322300 -1.570000 0.049000 -1.792600 9.799400 7.551000 2.507300 -16.187700 -85.331200 -0.000100 -23.464600 0.000000 1.237700 -1.143700 5.493200 -10.935500 -3.683500 -8.481000 8.574000 28.229100 78.605500 -0.000200 37.951700 0.000100 9.775100 -2.702500 -7.352900 +217.670126 88.368632 37.312092 175.588600 18.783200 178.948000 -33.066300 5.679200 9.814000 69.237500 0.000000 0.000000 -0.397300 -3.078000 6.994400 -16.130200 0.000000 0.000000 -3.953400 -9.545900 0.732100 12.347800 0.000000 0.000000 -13.715400 9.211300 0.942600 -14.908800 0.000000 0.000000 -4.861600 3.646400 1.040300 0.895000 -2.627800 2.615100 13.360600 6.429800 -0.994000 -1.281300 -2.140700 0.313000 -1.466400 10.492400 7.331700 4.465500 -14.171900 -83.947900 -0.000100 -22.856900 0.000000 -0.010900 -1.470500 5.818900 -11.611900 -3.064200 -8.575200 7.150300 28.951000 77.491100 -0.000200 41.483000 0.000100 9.546900 -2.513200 -7.519700 +218.559126 88.245442 34.742882 175.291000 17.690300 179.262100 -35.398500 7.070900 9.689900 61.375400 0.000000 0.000000 -3.243300 -0.580300 8.115000 -16.124600 0.000000 0.000000 -1.786900 -10.041600 0.626400 11.361100 0.000000 0.000000 -14.832600 8.625700 0.895300 -14.694600 0.000000 0.000000 -4.793300 3.941900 0.959200 0.846700 -2.351500 2.126900 13.509200 6.048800 -1.041700 -1.281900 -2.534900 0.350800 -1.021100 10.923800 7.103300 6.303800 -12.034800 -82.585200 -0.000100 -22.316400 0.000000 -0.961600 -1.685100 5.576200 -12.396200 -2.454100 -8.634700 5.636700 29.330600 76.376000 -0.000200 44.457800 0.000100 9.651100 -2.387300 -7.592600 +219.353892 88.033352 32.081470 174.869400 16.521100 179.484400 -36.521200 8.471300 9.222200 50.859500 0.000000 0.000000 -1.735000 1.973900 7.718900 -15.447800 0.000000 0.000000 0.116900 -10.014200 0.624300 10.809000 0.000000 0.000000 -15.869700 7.538500 0.935200 -14.666100 0.000000 0.000000 -4.925500 4.118200 0.897400 0.941400 -2.183400 1.765300 13.567100 5.678000 -0.986100 -1.155900 -2.737600 0.298700 -0.796000 11.145800 7.015500 7.950200 -9.712800 -81.599400 -0.000100 -21.320900 0.000000 -2.430200 -2.123800 5.947000 -12.905900 -1.953100 -8.601100 3.985500 29.446000 75.214800 -0.000200 46.943800 0.000100 9.438800 -2.420300 -7.838800 +220.068902 87.715090 29.385514 174.266900 15.484500 179.505300 -36.802000 10.384600 8.750300 38.875100 0.000000 0.000000 0.805500 3.822800 7.272700 -15.120600 0.000000 0.000000 1.757500 -10.033100 0.843200 10.456200 0.000000 0.000000 -16.805800 6.563400 1.164400 -14.652400 0.000000 0.000000 -4.981000 4.278400 0.869300 0.758000 -2.024400 1.636200 13.428100 5.414400 -0.930100 -0.791300 -2.918200 0.293600 -0.772800 11.388500 7.030200 9.512300 -7.657700 -80.774300 -0.000100 -20.105500 0.000000 -3.211500 -2.180600 6.160300 -13.510900 -1.550900 -8.580000 2.725200 29.205000 74.227300 -0.000200 49.104700 0.000100 9.229500 -2.600400 -8.145600 +220.713554 87.320882 26.517600 173.606600 14.789100 179.222600 -36.245900 12.904500 8.400500 26.203700 0.000000 0.000000 3.879700 3.706800 4.388900 -14.861800 0.000000 0.000000 3.357800 -10.120900 1.273200 10.287000 0.000000 0.000000 -17.519200 5.974300 1.471900 -15.047500 0.000000 0.000000 -5.184500 4.456200 0.946200 0.616200 -1.847100 1.762500 13.285000 5.254900 -0.781100 -0.655700 -2.852200 0.071800 -0.430500 11.653500 6.943500 10.628300 -5.255600 -80.168300 -0.000100 -19.002000 0.000000 -2.988700 -1.880200 6.258600 -13.911100 -1.182300 -8.481300 1.606300 28.790700 73.364600 -0.000300 50.726300 0.000100 9.256200 -2.610600 -8.371700 +221.301056 86.901782 23.310342 173.317300 14.140800 178.674600 -34.714000 16.192800 7.902800 14.037900 0.000000 0.000000 6.358500 -0.490800 -0.258100 -15.340200 0.000000 0.000000 5.400900 -11.095200 1.684200 10.417300 0.000000 0.000000 -17.923800 6.368000 1.935100 -16.235200 0.000000 0.000000 -5.644100 4.515200 0.945700 1.223800 -1.765000 2.334100 13.200100 5.544500 -0.741100 -1.414700 -2.370500 -0.326200 -0.686400 11.640400 6.823800 12.217600 -2.534200 -79.877000 -0.000100 -18.176100 0.000000 -3.085200 -1.876000 6.439600 -14.069500 -0.894800 -8.438900 0.458500 28.490600 72.666100 -0.000300 51.664100 0.000100 9.315600 -2.467200 -8.621400 +221.669864 86.463124 19.800062 173.378900 14.037400 178.428900 -32.244100 18.067300 6.760000 4.569700 0.000000 0.000000 5.395300 -3.721300 -3.193400 -15.430900 0.000000 0.000000 7.085400 -11.838600 1.293300 11.861700 0.000000 0.000000 -18.313700 7.096100 2.835300 -18.059100 0.000000 0.000000 -5.849000 4.747400 0.972200 1.724200 -1.525800 2.421700 13.277400 6.590900 -0.861500 -2.807000 -1.126600 -0.266300 -0.631800 11.673700 6.781500 13.513400 -0.244300 -79.772600 -0.000100 -17.402300 0.000000 -3.212600 -2.174800 6.706600 -14.275000 -0.704300 -8.423100 -0.258900 28.271700 72.610400 -0.000300 51.797300 0.000100 9.464300 -2.471500 -8.742600 +221.986094 86.052406 16.099790 173.391000 14.062500 178.235700 -31.224500 15.854400 6.095200 3.816600 0.000000 0.000000 0.950900 -2.228800 -1.871700 -15.781100 0.000000 0.000000 8.225700 -11.424700 0.752300 14.281200 0.000000 0.000000 -18.151500 6.957800 3.201600 -20.672000 0.000000 0.000000 -5.923600 4.909200 0.855500 1.832700 -1.341900 2.386800 13.094900 8.199300 -1.023600 -3.887100 0.505900 0.422900 -0.418000 12.154300 6.889900 14.387400 1.747800 -79.828100 -0.000100 -16.742000 0.000000 -3.976800 -2.709300 6.984500 -14.224600 -0.609800 -8.208800 -0.380100 28.478100 72.708100 -0.000300 51.296100 0.000100 9.429100 -2.444600 -9.183400 +222.105728 85.765640 12.155424 173.265800 13.340500 178.946600 -31.048300 12.674500 4.409300 8.576700 0.000000 0.000000 2.039100 0.717200 1.048700 -15.453400 0.000000 0.000000 8.710900 -11.504700 -0.859700 17.588000 0.000000 0.000000 -17.178100 7.016000 3.763500 -24.832400 0.000000 0.000000 -6.100700 4.881100 0.067500 1.746000 -1.245800 1.921300 12.731800 9.354600 -0.978400 -4.463800 1.728500 1.281700 -0.475100 12.284900 6.870000 15.186800 4.130700 -79.831700 -0.000100 -16.483700 0.000000 -4.804600 -3.015300 7.416300 -14.028300 -0.702500 -7.803600 0.770800 28.594000 72.537400 -0.000300 50.710900 0.000100 9.641800 -2.558000 -9.065700 +221.959424 85.593682 7.853426 172.802900 13.113800 -179.600600 -29.852900 8.863700 2.009600 10.911400 0.000000 0.000000 4.036000 3.445300 0.643900 -15.548900 0.000000 0.000000 7.868100 -11.481100 -3.668100 22.398400 0.000000 0.000000 -14.814000 7.748800 4.792200 -31.064500 0.000000 0.000000 -6.567500 5.344800 -0.781500 1.133300 -0.613300 0.783600 12.413700 9.824500 -0.793000 -4.588400 2.081000 2.181400 -0.552700 12.263500 6.815900 15.838800 5.746600 -79.651900 -0.000100 -16.402900 0.000000 -5.700100 -3.389000 7.386400 -13.551700 -1.442000 -7.507600 2.751600 28.914500 72.578600 -0.000200 49.652800 0.000100 10.159200 -2.839300 -8.063500 +221.533720 85.762084 3.710940 172.207300 12.743900 -177.339100 -29.297700 7.205600 -0.816400 14.139800 0.000000 0.000000 5.412200 5.213600 1.075900 -14.784900 0.000000 0.000000 4.523200 -11.308100 -7.785400 30.492400 0.000000 0.000000 -10.021200 8.886300 5.463700 -39.576700 0.000000 0.000000 -6.400600 5.465000 -1.702600 -0.259900 -0.232700 -1.332000 11.750300 10.556600 -0.752300 -3.861200 2.103900 3.201300 -0.529900 12.994400 6.673300 15.534800 6.447100 -79.195200 -0.000100 -15.848800 0.000000 -6.323200 -3.794700 7.239700 -12.935400 -2.051700 -7.039800 4.653100 29.938600 73.299400 -0.000200 47.054700 0.000100 10.847900 -2.953200 -7.325600 +221.133162 86.106508 -0.258572 172.203900 12.026100 -175.411000 -28.650500 9.151100 -3.336900 18.736000 0.000000 0.000000 2.942800 3.304400 6.084900 -14.351100 0.000000 0.000000 0.205300 -9.506100 -11.496800 41.188500 0.000000 0.000000 -4.061400 9.181300 5.069800 -41.108300 0.000000 0.000000 -6.313700 5.608400 -2.334600 -0.504000 0.187200 -3.373100 11.441700 10.849900 -0.780000 -4.098900 1.693400 3.571300 -0.544200 12.576300 6.964100 14.400700 6.655500 -79.601400 -0.000100 -15.377100 0.000000 -6.716400 -3.756700 7.468500 -12.216700 -2.502000 -7.370700 5.477900 29.897300 75.570700 -0.000200 43.370300 0.000100 11.650300 -3.325800 -5.723200 +221.026990 86.477094 -3.696208 172.383900 11.238100 -175.247800 -27.017700 8.456600 -4.577900 20.473900 0.000000 0.000000 0.434200 3.799900 8.365200 -14.157300 0.000000 0.000000 -4.469900 -5.762500 -12.118600 52.589300 0.000000 0.000000 1.205900 7.534000 3.947900 -28.430600 0.000000 0.000000 -6.053100 5.378000 -2.443700 -0.551000 0.057900 -3.649800 11.410800 11.277900 -1.110600 -4.681800 1.722700 2.989100 -0.929700 12.132300 7.126700 13.201400 6.212800 -80.542900 -0.000100 -15.447700 0.000000 -7.174200 -4.060700 7.189800 -11.830200 -2.348000 -8.141900 5.799600 29.900200 78.229900 -0.000200 38.858500 0.000100 11.965400 -3.734000 -4.696000 +220.916246 86.962742 -6.968744 172.594500 11.371300 -175.106200 -24.452900 8.180500 -5.449000 20.413700 0.000000 0.000000 -1.652100 4.422100 9.540200 -13.869800 0.000000 0.000000 -9.552700 -1.485900 -12.035800 61.705900 0.000000 0.000000 10.314400 6.443200 3.807300 -18.956200 0.000000 0.000000 -5.871800 5.322300 -2.609000 -0.543800 0.081600 -3.520200 11.613200 11.803400 -1.304200 -4.690200 2.267500 2.207100 -1.178300 12.117100 7.075000 11.927100 3.977000 -81.441000 -0.000100 -16.601200 0.000000 -7.772900 -4.249500 7.168200 -11.631200 -2.362300 -8.299600 6.291300 31.036200 79.761100 -0.000100 34.033300 0.000000 11.087000 -3.886500 -3.601500 +220.891100 87.480902 -10.201910 173.091200 11.092700 -175.236100 -21.350400 7.372800 -6.155700 19.602400 0.000000 0.000000 -3.211300 4.677900 9.882500 -13.749000 0.000000 0.000000 -13.931300 1.855400 -11.340100 67.895700 0.000000 0.000000 16.680900 6.125900 7.381100 -17.546500 0.000000 0.000000 -5.759200 4.920900 -2.780500 -0.451500 -0.199500 -3.151200 12.069000 12.057700 -1.251900 -4.168400 3.096200 1.620500 -0.860500 12.146200 7.017300 9.704900 1.881500 -82.442100 -0.000100 -18.174700 0.000000 -6.323200 -4.248000 7.210300 -11.299700 -2.554500 -8.103500 7.063800 32.391100 80.610000 -0.000100 29.706900 0.000000 11.267100 -4.019500 -3.255000 +220.903292 87.907368 -13.366496 173.659800 10.040200 -175.638700 -18.075100 5.676400 -6.820300 18.102700 0.000000 0.000000 -4.392200 4.962700 10.171400 -13.787100 0.000000 0.000000 -17.708600 3.232900 -10.633900 71.580100 0.000000 0.000000 12.030800 6.169900 6.802800 -17.697100 0.000000 0.000000 -5.733300 4.212100 -2.909000 -0.287200 -0.808200 -2.535500 12.672400 12.140200 -1.183400 -3.752800 3.755400 1.395300 -1.041200 11.784200 7.101100 8.097000 -1.524900 -83.236400 -0.000100 -20.619500 0.000000 -6.617200 -4.549000 6.896400 -10.599300 -3.083700 -8.081300 7.855200 32.781400 81.361200 -0.000100 26.512200 0.000000 12.171200 -4.416900 -3.405600 +220.977968 88.262968 -16.564356 174.673200 8.512400 -176.282000 -14.187500 4.475800 -7.146000 16.374000 0.000000 0.000000 -5.478000 4.281300 10.474300 -13.680800 0.000000 0.000000 -20.601800 3.667200 -9.720000 72.689200 0.000000 0.000000 4.812100 4.466400 4.760300 -16.232000 0.000000 0.000000 -5.487200 3.403300 -2.821800 0.172200 -1.491700 -2.070900 12.985500 11.928600 -1.057700 -3.204600 4.174700 1.554000 -1.116400 11.474900 7.138000 5.835500 -5.781000 -83.498100 -0.000100 -23.319400 0.000000 -6.689000 -5.018400 6.914400 -9.981500 -3.916000 -7.967500 9.018300 31.281600 82.065000 -0.000100 24.223400 0.000000 12.957800 -4.658000 -3.288800 +221.077536 88.481916 -19.515836 175.153500 7.076800 -176.890500 -11.087600 4.444800 -7.022900 15.100200 0.000000 0.000000 -6.508600 2.555500 10.816500 -13.709700 0.000000 0.000000 -23.965500 3.757300 -8.679900 71.515400 0.000000 0.000000 0.244500 1.042400 2.658000 -16.671200 0.000000 0.000000 -5.339500 2.784300 -2.763900 0.426200 -2.056800 -1.449400 13.300100 11.634000 -0.979800 -3.250300 4.298700 1.682200 -1.357100 11.039800 7.059200 3.638100 -9.911800 -83.391800 -0.000100 -26.875900 0.000000 -7.819600 -5.250200 6.219100 -9.380100 -4.720700 -7.848900 10.866200 28.847000 82.324400 -0.000100 23.220500 0.000000 12.831400 -4.834800 -3.262000 +221.136464 88.569800 -22.313138 175.384900 5.959900 -177.343400 -8.321800 3.729400 -6.965200 13.633100 0.000000 0.000000 -7.534700 1.829000 11.189100 -13.706900 0.000000 0.000000 -27.123200 3.972700 -7.682200 68.001700 0.000000 0.000000 -3.083300 -2.627800 1.533300 -16.460000 0.000000 0.000000 -5.110100 2.321800 -2.713900 0.477800 -2.487800 -0.930700 13.508400 11.283400 -0.812900 -3.415600 4.385400 1.611400 -1.849600 10.571800 7.180900 1.451400 -13.349600 -83.275400 -0.000100 -30.433400 0.000000 -6.855800 -5.239800 6.118800 -8.746400 -5.415600 -7.784400 12.484700 26.846100 82.512800 -0.000100 22.009500 0.000000 11.913400 -4.708600 -3.198900 +221.200726 88.546686 -25.108916 175.439300 4.999000 -177.600200 -5.854900 2.712800 -7.012100 12.356700 0.000000 0.000000 -8.733700 1.609200 10.976600 -13.811400 0.000000 0.000000 -29.645900 4.090900 -6.966500 62.087200 0.000000 0.000000 -5.919800 -4.568400 0.100000 -15.668100 0.000000 0.000000 -5.113700 1.977900 -2.685000 0.715900 -2.835400 -0.573400 13.627100 11.057800 -0.730500 -3.627200 4.424900 1.639000 -2.214500 10.002800 7.365700 -0.795600 -16.268000 -83.044000 -0.000100 -34.231000 0.000000 -5.992100 -5.758700 7.010400 -8.298900 -5.872800 -7.722200 14.084100 25.455600 82.686200 -0.000100 20.595100 0.000000 11.470900 -4.834800 -3.104700 +221.296484 88.417654 -27.853894 175.279000 4.247100 -177.793800 -4.010600 1.856500 -6.989400 11.921900 0.000000 0.000000 -9.961300 1.541300 11.324000 -14.024500 0.000000 0.000000 -31.352800 4.162600 -6.306700 53.945400 0.000000 0.000000 -7.489300 -5.979000 0.497800 -15.142300 0.000000 0.000000 -5.132300 1.697700 -2.644500 0.813900 -3.129100 -0.247000 13.716000 10.942400 -0.705600 -3.908300 4.474700 1.529200 -2.625300 9.594700 7.519100 -2.826600 -18.540600 -82.652600 -0.000200 -38.271300 -0.000100 -5.460900 -6.314300 8.112500 -8.013000 -6.315900 -7.772100 15.359800 25.251800 82.911500 -0.000100 18.633600 0.000000 11.678000 -4.916900 -3.113200 +221.389448 88.168988 -30.635956 174.969800 3.860600 -177.817500 -2.427800 0.912700 -7.129600 11.830800 0.000000 0.000000 -11.320500 1.966300 11.978100 -13.555200 0.000000 0.000000 -32.539400 3.814900 -5.792100 44.672500 0.000000 0.000000 -7.153900 -7.262400 0.489900 -14.070900 0.000000 0.000000 -5.166900 1.530600 -2.653400 0.692400 -3.301900 -0.050300 13.849700 10.862300 -0.638500 -4.176000 4.606000 1.400000 -3.142300 9.174900 7.823200 -4.344500 -19.715400 -82.357800 -0.000200 -42.449300 -0.000100 -4.930900 -6.378100 8.348300 -7.538500 -6.566600 -7.785300 16.334800 25.237000 83.125200 -0.000100 16.747400 0.000000 11.935400 -5.206900 -2.803800 +221.507050 87.802720 -33.527746 174.675900 3.710600 -177.760900 -0.785800 0.501800 -7.258700 11.859800 0.000000 0.000000 -13.112500 2.222700 11.954400 -13.335200 0.000000 0.000000 -33.078200 2.736600 -5.344800 35.012200 0.000000 0.000000 -5.826600 -6.605300 0.065500 -14.292000 0.000000 0.000000 -5.268000 1.443500 -2.653700 0.684900 -3.410300 0.086500 13.837700 10.835800 -0.607100 -4.326000 4.785800 1.248000 -3.404800 9.040200 8.055300 -5.987200 -20.703100 -82.034800 -0.000200 -46.135200 -0.000100 -4.167300 -6.466600 8.945600 -7.325200 -6.752300 -7.841800 17.247000 25.102800 83.364900 -0.000100 15.008500 0.000000 12.461700 -5.667600 -2.523200 +221.615508 87.331042 -36.545266 174.479600 3.499400 -177.590800 1.135000 0.178700 -7.495000 11.761500 0.000000 0.000000 -14.506300 2.136400 12.565800 -13.174700 0.000000 0.000000 -33.251100 0.028100 -5.211200 25.976900 0.000000 0.000000 -3.522000 -3.258900 1.902300 -13.872000 0.000000 0.000000 -5.370700 1.308800 -2.696400 0.790200 -3.555600 0.211100 13.754500 10.856800 -0.637200 -4.480300 4.906900 1.095700 -3.622500 8.843700 8.071100 -7.289000 -21.446000 -81.552200 -0.000200 -49.302000 -0.000100 -3.935300 -6.096400 9.122700 -7.233200 -6.869200 -7.887900 18.110000 23.279200 83.476600 -0.000100 14.086000 0.000000 13.698800 -6.365600 -0.665800 +221.853760 86.827360 -39.772082 174.536400 3.093900 -177.769000 3.482000 0.764900 -7.200400 11.837500 0.000000 0.000000 -15.952500 1.164400 12.732000 -14.191500 0.000000 0.000000 -32.683600 -4.330900 -4.702500 17.756400 0.000000 0.000000 -1.212700 1.009200 4.430000 -14.560100 0.000000 0.000000 -5.501400 1.056900 -2.692700 1.136300 -3.813600 0.620900 13.663700 10.751400 -0.560600 -4.585900 5.115200 0.837000 -3.622800 8.686100 8.063600 -8.490700 -22.281400 -81.174600 -0.000300 -51.631700 -0.000100 -3.167000 -5.393200 9.769000 -7.129900 -7.047200 -7.845000 18.744600 22.013400 83.478600 0.000000 13.115600 0.000000 13.728600 -6.483400 -0.658500 +222.159068 86.340950 -43.128184 174.563000 2.464700 -177.873400 5.494700 1.934500 -6.792000 12.771500 0.000000 0.000000 -17.041600 -0.378100 12.425900 -14.779300 0.000000 0.000000 -31.516300 -7.750500 -4.095000 10.667100 0.000000 0.000000 -0.893100 5.438200 5.981900 -14.837900 0.000000 0.000000 -5.599900 0.755400 -2.852600 1.320000 -4.083900 1.141000 13.624800 10.548900 -0.427500 -4.738800 5.308200 0.571000 -3.884100 8.497900 8.145700 -9.159200 -22.951900 -81.120800 -0.000300 -52.690500 -0.000100 -2.016800 -5.175700 9.940800 -7.083100 -7.412600 -7.748700 19.255000 21.370300 83.297000 0.000000 12.199500 0.000000 13.332300 -6.323300 -1.563400 +222.451930 85.927946 -46.656498 174.566000 1.498900 -177.840000 6.825700 2.054600 -6.449200 14.925900 0.000000 0.000000 -17.600600 -1.201700 12.314100 -16.077700 0.000000 0.000000 -30.011300 -8.496000 -3.715300 5.983600 0.000000 0.000000 -1.976100 7.878200 4.964700 -15.361000 0.000000 0.000000 -5.756000 0.367700 -3.053600 1.360200 -4.429000 1.594400 13.506300 10.379300 -0.317000 -4.484000 5.326900 0.373300 -3.936500 8.321500 8.131900 -9.693300 -23.574800 -81.326000 -0.000300 -52.367800 -0.000100 -1.437400 -4.638600 9.662800 -7.085400 -7.784800 -7.660800 19.629200 20.667100 83.085300 0.000000 11.488800 0.000000 12.889300 -6.010300 -2.399600 +222.708978 85.586316 -50.225960 174.266400 0.981700 -177.933500 7.047700 1.669300 -6.029800 18.547000 0.000000 0.000000 -17.710400 -1.238400 12.091700 -17.698500 0.000000 0.000000 -30.230800 -8.237600 -3.442400 8.213300 0.000000 0.000000 -2.004600 7.857100 5.320200 -15.678400 0.000000 0.000000 -5.832500 0.229600 -2.803400 0.772400 -4.583900 1.784800 13.449200 10.309400 -0.287800 -4.159000 5.219000 0.220100 -3.969900 8.163700 8.172800 -9.555900 -24.093600 -81.667200 -0.000300 -51.101500 -0.000100 -0.736300 -3.673000 8.953000 -7.003400 -7.915100 -7.661600 19.890500 19.720000 83.014100 0.000000 11.344500 0.000000 12.828800 -6.068200 -2.451000 +223.181164 85.310472 -54.146196 174.285900 0.720700 -178.953700 6.933400 2.554900 -4.376900 23.918200 0.000000 0.000000 -17.021700 -2.111700 12.254700 -21.244100 0.000000 0.000000 -29.355400 -7.380200 -2.211900 11.420600 0.000000 0.000000 0.486600 7.073900 4.950900 -17.567600 0.000000 0.000000 -6.375100 0.230100 -1.951400 1.142700 -4.729000 2.364000 13.167200 10.297000 -0.182300 -3.890900 5.222200 -0.225200 -4.090100 8.075300 8.122100 -8.940600 -24.284300 -82.076700 -0.000200 -49.042300 -0.000100 0.776400 -2.599100 8.272000 -7.209100 -7.790300 -7.685200 20.069400 19.517900 82.937000 0.000000 11.453100 0.000000 12.672000 -6.012900 -2.550500 +223.838008 85.155786 -58.117994 174.020200 0.758700 179.343200 5.125200 4.274900 -1.589000 31.742200 0.000000 0.000000 -14.851600 -3.643600 11.073900 -24.516800 0.000000 0.000000 -28.278000 -5.028100 -0.102900 13.811300 0.000000 0.000000 1.957300 4.822500 6.573100 -15.446500 0.000000 0.000000 -6.670000 0.387000 -0.960900 0.577000 -4.707100 3.674200 13.124200 10.318000 -0.252200 -3.589800 5.017400 -0.550600 -3.785300 8.253900 7.866200 -8.001500 -24.611600 -82.594500 -0.000200 -45.969400 -0.000100 2.752600 -1.748700 6.942200 -7.297100 -7.806900 -7.711600 20.295800 19.889000 82.471200 0.000000 11.801200 0.000000 12.525300 -5.923500 -2.464200 +224.658682 85.307932 -62.026800 174.297000 1.587100 176.878200 1.820200 6.630100 2.604600 41.878200 0.000000 0.000000 -9.109000 -5.858000 9.066100 -31.059400 0.000000 0.000000 -27.359500 -4.866200 2.994800 18.051900 0.000000 0.000000 -0.227700 5.110200 2.766600 -15.156000 0.000000 0.000000 -6.537800 0.781600 0.038400 0.291900 -4.503800 5.980700 12.786600 10.361100 -0.142400 -2.710800 5.064800 -1.407100 -3.515400 8.830300 7.497900 -7.053900 -24.574900 -83.667900 -0.000200 -41.584800 -0.000100 4.616700 -0.920800 6.646700 -7.433200 -7.551500 -7.661700 19.781500 20.689500 81.725400 0.000000 11.836600 0.000000 12.283900 -5.807000 -2.485700 +225.212910 85.600032 -65.617090 174.649000 1.931000 175.628500 -3.007000 7.459000 5.664600 53.321600 0.000000 0.000000 -2.477300 -7.117400 5.460200 -29.077000 0.000000 0.000000 -25.474800 -5.095700 4.733400 20.168700 0.000000 0.000000 -2.605500 5.081700 -0.211700 -14.614000 0.000000 0.000000 -6.234400 0.916100 0.344500 0.163700 -4.510800 7.387200 12.348900 10.336000 0.257700 -1.952500 5.331800 -1.987800 -3.558800 9.000800 8.005400 -5.989000 -22.901300 -85.740400 -0.000200 -35.999900 0.000000 6.186000 -0.224100 6.684000 -7.731700 -6.905200 -7.593700 18.414900 21.280900 81.347300 0.000000 11.811100 0.000000 12.518200 -6.040600 -2.476000 +225.596704 86.046564 -68.755768 174.684300 0.765700 174.916400 -9.095800 6.079200 7.833800 64.236500 0.000000 0.000000 3.422900 -6.743900 2.574100 -12.757700 0.000000 0.000000 -22.606400 -6.026500 5.329300 19.480000 0.000000 0.000000 -4.733000 4.782800 -0.302200 -14.041700 0.000000 0.000000 -5.795200 0.769700 0.379500 -0.167400 -4.797600 8.037100 12.253500 10.035500 0.606700 -2.226900 4.960500 -1.785400 -3.022800 8.727400 8.297300 -5.768300 -21.306200 -87.455100 -0.000100 -29.599600 0.000000 5.467000 0.542300 6.834100 -7.902100 -6.697500 -7.252200 16.440600 21.162900 81.044000 0.000000 12.263500 0.000000 12.345500 -6.206000 -2.877100 +225.727514 86.630256 -71.795132 174.816800 -0.960200 174.935600 -14.768400 4.515600 8.566000 71.942000 0.000000 0.000000 9.782800 -4.333800 1.404400 -11.595900 0.000000 0.000000 -19.686200 -8.227700 4.783100 18.851800 0.000000 0.000000 -6.403200 5.662900 -0.672600 -14.093300 0.000000 0.000000 -5.644200 0.762400 0.379200 -0.058200 -4.860100 7.755900 12.439900 9.365200 0.729200 -2.884300 4.123300 -1.167900 -3.131300 8.323700 8.177700 -5.174300 -20.630400 -88.168700 -0.000100 -22.707100 0.000000 5.702000 0.767700 6.058100 -8.306500 -6.594100 -7.088500 14.396100 20.668500 81.177400 0.000000 13.109800 0.000000 11.974600 -6.043500 -3.764200 +225.831908 87.209122 -74.910188 175.450300 -1.884500 175.127300 -18.872500 4.528400 9.188900 76.482700 0.000000 0.000000 8.079100 -1.358700 3.194600 -12.723500 0.000000 0.000000 -15.847000 -8.503800 4.703400 16.998400 0.000000 0.000000 -7.557200 5.482600 -0.663500 -13.826500 0.000000 0.000000 -5.644500 1.405100 0.725800 0.524500 -4.390900 6.627300 12.691700 8.434100 0.964700 -3.238100 3.357000 -0.496000 -3.048100 8.112600 8.365400 -4.180600 -19.814500 -88.252500 -0.000100 -17.691000 0.000000 7.991100 2.568900 4.468000 -8.320100 -6.315600 -6.982100 12.146000 20.472900 81.676700 -0.000100 14.606500 0.000000 11.527800 -6.040500 -4.605100 +225.804984 87.703152 -77.910690 176.142800 -2.195400 175.636400 -22.350700 5.209000 9.556400 77.905100 0.000000 0.000000 5.671200 -0.728400 5.837600 -13.180200 0.000000 0.000000 -11.899400 -8.665700 4.426200 14.642300 0.000000 0.000000 -8.174900 5.750100 -0.759100 -13.757900 0.000000 0.000000 -5.593900 2.224300 0.818400 1.180300 -3.700500 5.806400 12.806200 8.049300 0.657400 -3.242800 2.476700 -0.096500 -2.726000 8.491300 8.173300 -2.326300 -18.885400 -87.625000 -0.000100 -15.085600 0.000000 9.151700 3.943400 4.591000 -9.320900 -5.425400 -7.408200 10.847200 21.006600 82.088800 -0.000100 16.271900 0.000000 10.775000 -5.646800 -4.939400 +225.721672 88.081358 -80.760570 176.376600 -2.369900 176.005400 -25.748600 5.947800 9.998000 76.625400 0.000000 0.000000 3.234400 -1.583800 9.195000 -13.821000 0.000000 0.000000 -8.756700 -8.984700 4.226700 12.679000 0.000000 0.000000 -8.710200 6.083500 -0.936500 -13.827100 0.000000 0.000000 -5.593600 2.990500 0.940000 1.280700 -3.019100 5.229000 13.181000 7.774700 0.230400 -3.381100 1.647100 -0.349700 -2.021600 9.148400 7.621000 0.117200 -17.506500 -86.326000 -0.000100 -14.107700 0.000000 10.148700 3.976100 5.769700 -9.929700 -4.520100 -7.855200 9.550900 22.437700 81.960400 -0.000100 18.358600 0.000000 10.589400 -5.509900 -4.980100 +225.541078 88.267286 -83.389216 176.105400 -2.503600 176.431400 -28.980800 6.826500 10.146000 72.759900 0.000000 0.000000 -1.311900 -1.282500 9.241900 -14.385500 0.000000 0.000000 -6.624700 -10.086400 3.741900 11.606900 0.000000 0.000000 -9.596200 7.141500 -0.472600 -13.792000 0.000000 0.000000 -5.644900 3.688000 1.013500 1.023400 -2.390900 4.541600 13.354300 7.436000 -0.037200 -3.437200 1.299600 -0.861100 -1.445100 9.919300 7.224400 2.874600 -14.953900 -85.017700 -0.000100 -14.354400 0.000000 8.881200 3.352400 6.113500 -10.492800 -3.847500 -8.068800 8.377900 24.686900 81.135200 -0.000100 20.619000 0.000000 10.408300 -5.311100 -5.025200 +225.269044 88.318340 -85.988906 176.065400 -2.718900 176.795200 -31.049700 8.078500 10.127200 66.137600 0.000000 0.000000 -5.525700 0.404700 9.259700 -14.755900 0.000000 0.000000 -4.502400 -11.486000 3.236400 10.896800 0.000000 0.000000 -10.868100 8.311300 -0.120700 -13.461000 0.000000 0.000000 -5.439900 4.178500 0.986800 0.867500 -1.949500 4.109300 13.306900 7.410400 -0.407900 -3.339700 1.278000 -1.485000 -0.876100 11.038800 6.822900 5.552700 -12.539600 -83.776900 -0.000100 -15.193500 0.000000 7.314500 2.927200 6.441500 -9.369500 -3.569400 -7.940100 5.728400 27.144100 79.660400 -0.000100 23.033900 0.000000 10.136000 -5.154500 -5.633000 +224.937320 88.282018 -88.472010 175.830500 -3.349800 176.890300 -32.678500 9.462800 10.157400 57.513200 0.000000 0.000000 -5.028100 2.385600 8.897300 -15.194600 0.000000 0.000000 -2.829400 -12.709700 2.950800 10.646500 0.000000 0.000000 -11.954000 8.855600 -0.052400 -13.752800 0.000000 0.000000 -5.331600 4.457200 0.965000 0.745000 -1.691800 3.929000 13.249500 7.560200 -0.636400 -3.327400 1.446300 -2.361700 -0.474200 11.728300 6.649700 8.014100 -10.281100 -82.987200 -0.000100 -15.810200 0.000000 6.407000 2.470200 6.686800 -8.745600 -3.195300 -7.888600 3.798100 28.450100 78.157400 -0.000100 25.678900 0.000000 10.265600 -5.283800 -6.345700 +224.542858 88.166956 -90.918284 175.573400 -4.189400 176.741000 -33.569500 11.540200 10.164300 47.434700 0.000000 0.000000 -3.869800 4.889000 8.490400 -14.356000 0.000000 0.000000 -1.261000 -13.281200 2.904500 10.561600 0.000000 0.000000 -13.077200 8.626100 0.135700 -14.018100 0.000000 0.000000 -5.438400 4.725900 0.905700 0.971500 -1.427600 4.054600 13.197500 7.555700 -0.688300 -3.475100 1.808100 -3.333700 -0.382300 11.741000 6.618200 10.211400 -7.347700 -82.649900 -0.000100 -16.233200 0.000000 7.044900 2.933600 5.999000 -8.374300 -3.091100 -7.955800 1.865100 29.155300 76.863900 -0.000100 27.787900 0.000000 9.986200 -5.109600 -6.749900 +224.071434 87.990934 -93.410532 175.416500 -5.322000 176.269700 -33.709000 14.095800 9.952400 36.832100 0.000000 0.000000 -3.209600 7.066600 6.942800 -13.909900 0.000000 0.000000 0.568800 -13.645200 3.229800 10.462200 0.000000 0.000000 -13.886600 7.982000 0.224800 -14.459300 0.000000 0.000000 -5.593200 4.726100 0.869800 1.346100 -1.415300 4.491500 13.136400 7.703200 -0.799900 -3.416500 2.230400 -4.127400 -0.308600 11.803700 6.602400 11.883200 -5.596200 -82.653900 -0.000100 -15.543000 0.000000 6.969500 2.838000 6.839200 -9.759300 -2.282900 -8.099000 1.925100 29.221800 75.791500 -0.000100 29.554800 0.000000 10.112000 -4.843600 -6.830300 +223.478852 87.755222 -96.011492 175.241800 -6.563600 175.743300 -33.450100 18.110100 9.476900 26.375300 0.000000 0.000000 -3.596200 7.666500 6.405400 -14.260400 0.000000 0.000000 2.443600 -13.749800 3.602500 10.431600 0.000000 0.000000 -14.600500 7.032000 0.385900 -15.028000 0.000000 0.000000 -5.828700 4.768600 0.763600 1.606400 -1.336900 4.921300 13.178200 7.636300 -0.707000 -3.280100 2.715900 -4.899200 -0.240000 11.671800 6.729300 13.035200 -3.937400 -82.808700 -0.000100 -14.293800 0.000000 7.037900 3.017200 6.873300 -10.923500 -1.972400 -8.117100 2.158600 30.077700 74.627900 -0.000100 31.038100 0.000000 10.618400 -4.435600 -6.809500 +222.698818 87.468202 -98.714052 175.062500 -7.797900 175.147400 -32.957000 23.554200 8.612000 16.846300 0.000000 0.000000 -4.123400 7.807400 5.647600 -14.277400 0.000000 0.000000 4.289100 -14.602700 3.852800 10.714800 0.000000 0.000000 -15.318100 6.908200 1.135000 -15.281800 0.000000 0.000000 -6.131400 4.721500 0.675600 1.819400 -1.326600 5.460700 13.107100 7.688500 -0.692100 -2.758800 3.220400 -5.629300 -0.372400 11.614200 6.785400 14.096500 -2.284500 -83.030400 0.000000 -12.899100 0.000000 5.340600 2.911700 6.256000 -11.327600 -1.790300 -8.155400 1.861800 31.734800 73.638900 -0.000100 32.161000 0.000000 11.376000 -4.317900 -7.444000 +221.723712 87.135716 -101.484684 174.908000 -8.926700 174.630000 -31.957500 28.658100 7.071500 9.008900 0.000000 0.000000 -4.674100 9.362600 6.110400 -14.642200 0.000000 0.000000 5.923300 -15.758600 3.849600 11.549100 0.000000 0.000000 -15.926200 7.206200 1.825100 -16.536900 0.000000 0.000000 -6.302600 4.734300 0.678800 1.815800 -1.276300 5.710500 12.951400 7.926900 -0.810000 -2.239700 3.508500 -6.097600 -0.091000 11.695200 6.519200 14.502100 -0.780800 -82.969800 0.000000 -11.580000 0.000000 5.344500 3.067800 6.342800 -11.519100 -1.689100 -8.041300 1.787600 32.679400 73.001900 -0.000100 33.873100 0.000000 12.952600 -5.187700 -6.690700 +220.577410 86.775290 -104.446070 174.905900 -9.929600 174.346700 -30.482500 31.684200 5.216700 4.410600 0.000000 0.000000 -4.519000 11.573800 5.872800 -14.811900 0.000000 0.000000 7.630700 -17.012200 3.514300 12.632100 0.000000 0.000000 -16.295500 7.625000 2.832600 -17.908500 0.000000 0.000000 -6.546200 4.794100 0.703600 2.064400 -1.195800 5.508500 12.538300 8.353000 -1.000500 -1.708000 3.718200 -6.174300 -0.137400 11.950400 6.193000 14.819800 0.855600 -82.611500 0.000000 -10.568600 0.000000 5.219200 3.293400 6.562500 -11.790400 -1.554800 -7.964400 1.832700 33.525800 73.145200 -0.000100 35.423600 0.000000 13.118900 -5.028700 -6.795700 +219.481146 86.429850 -107.454446 174.789600 -10.861400 173.926400 -30.609900 31.386800 4.718200 6.198700 0.000000 0.000000 -4.587800 13.178800 7.457400 -14.803300 0.000000 0.000000 8.810900 -17.412600 3.297600 14.490500 0.000000 0.000000 -16.157500 7.485100 3.243300 -20.083200 0.000000 0.000000 -6.505500 4.947000 0.516600 1.748200 -1.000900 5.317800 12.158400 8.552300 -0.881900 -1.426200 4.044500 -6.465000 -0.452600 12.175000 6.045300 14.930500 2.153800 -82.190100 0.000000 -9.398600 0.000000 4.311800 3.075200 6.959900 -11.917400 -1.547500 -7.844200 2.185100 34.080200 73.750200 -0.000200 37.155600 0.000100 13.344900 -5.260600 -6.542100 +218.218258 86.125812 -110.747810 174.897100 -11.385100 173.760700 -30.074000 28.775400 4.471200 10.147900 0.000000 0.000000 -5.468400 14.675600 7.163400 -14.867000 0.000000 0.000000 9.830700 -17.317300 2.592300 16.943900 0.000000 0.000000 -15.414300 7.574100 4.005100 -22.125900 0.000000 0.000000 -6.654400 5.256900 0.334500 1.716700 -0.643100 4.573600 11.776100 9.085400 -0.771500 -1.171900 4.315300 -5.944900 -0.573100 12.236600 6.015300 14.669600 3.627700 -81.789100 0.000000 -8.575100 0.000000 3.649500 2.884400 7.564000 -11.641100 -1.552700 -7.501800 2.603100 34.808400 74.654800 -0.000200 38.815100 0.000100 12.763000 -5.321700 -6.714800 +216.697306 85.918802 -114.155728 174.504000 -11.709900 173.712500 -28.676300 25.287900 3.510300 11.872400 0.000000 0.000000 -5.093700 16.965900 7.282200 -14.483700 0.000000 0.000000 9.606300 -17.241900 1.256400 20.469600 0.000000 0.000000 -13.282500 8.110100 4.877900 -27.691400 0.000000 0.000000 -6.861000 5.468600 0.132000 0.808200 -0.373200 3.416200 11.410500 9.722200 -0.743800 -0.392400 4.645400 -4.792100 -0.686600 12.555300 6.045700 14.759100 4.255200 -81.416900 0.000000 -8.359800 0.000000 3.003000 3.011300 7.819400 -11.487200 -1.752900 -7.319300 3.567200 36.156900 75.981700 -0.000200 40.000900 0.000100 13.055800 -4.572400 -5.929100 +214.721948 85.880448 -117.623336 173.917300 -11.911700 174.824200 -25.848100 23.862900 0.913500 11.089400 0.000000 0.000000 -2.200700 18.788300 9.312100 -13.575100 0.000000 0.000000 7.379700 -16.946000 -1.993200 26.322500 0.000000 0.000000 -9.727800 8.798000 5.899500 -35.328300 0.000000 0.000000 -7.110400 5.573500 -0.541500 -0.341900 -0.060800 1.375200 10.984800 10.769700 -0.792000 0.628500 4.484600 -2.967300 -0.614400 12.773500 5.950200 14.659700 5.175800 -81.108100 0.000000 -8.375600 0.000000 2.537500 2.807800 7.842400 -11.089900 -2.275800 -6.868300 4.662200 37.806000 77.111600 -0.000200 40.760500 0.000100 13.646900 -4.264700 -4.580200 +212.512148 86.112350 -120.689624 172.728600 -13.513700 176.876900 -24.589900 25.404300 -2.342300 14.018300 0.000000 0.000000 -3.394000 16.232800 11.128300 -13.694100 0.000000 0.000000 2.136800 -16.173700 -6.624200 35.630100 0.000000 0.000000 -4.243400 8.578100 6.734100 -42.461900 0.000000 0.000000 -7.373000 5.136700 -1.476500 -1.391300 -0.145700 -2.012900 10.539300 11.376800 -0.353600 0.877200 4.458500 -1.675400 -0.653000 12.594500 6.068800 13.585400 4.369900 -80.875600 0.000000 -7.829700 0.000000 1.400900 2.365000 7.710100 -10.694500 -3.308400 -6.198000 5.426800 38.961500 78.538700 -0.000200 40.835900 0.000100 14.237300 -4.224400 -3.880800 +210.608164 86.374986 -123.612402 172.432200 -16.187900 177.618300 -22.889400 26.015300 -4.280400 16.714400 0.000000 0.000000 -4.871300 13.372300 12.867400 -13.703300 0.000000 0.000000 -2.813400 -14.189200 -9.053900 46.808500 0.000000 0.000000 0.877100 7.171700 5.503100 -32.236600 0.000000 0.000000 -7.414100 4.362700 -1.863400 -1.247000 -0.670400 -4.007500 10.521300 11.893800 -0.532900 0.005600 3.844500 -0.560000 -0.807900 11.566500 6.626400 11.529700 3.212000 -81.727500 0.000000 -7.354300 0.000000 1.571900 2.461100 6.942900 -9.883500 -3.621500 -6.843200 5.136800 38.302800 81.316300 -0.000200 40.562500 0.000100 14.956000 -4.849600 -4.051100 +208.666334 86.561422 -126.082552 172.282900 -18.300000 177.679700 -20.147700 25.976700 -6.048200 16.634900 0.000000 0.000000 -6.389300 11.690100 14.266900 -13.357100 0.000000 0.000000 -8.380400 -11.087300 -10.591200 57.128000 0.000000 0.000000 7.562600 6.876500 5.203100 -18.972400 0.000000 0.000000 -6.788100 4.027500 -1.857400 -1.554100 -0.893200 -4.595400 10.484300 12.050700 -0.800000 -0.332000 3.329500 -1.029000 -1.168500 11.073100 6.564800 8.881300 -0.060100 -82.675100 0.000000 -7.109500 0.000000 1.651900 2.439100 6.435800 -7.802900 -4.506200 -7.852300 4.227600 37.441900 82.938500 -0.000200 40.434800 0.000100 14.283200 -4.798300 -3.852200 +206.818484 86.874350 -128.436878 172.171700 -19.584300 177.562600 -17.055600 24.699700 -7.547200 15.146500 0.000000 0.000000 -7.436600 11.542000 14.260800 -13.387900 0.000000 0.000000 -13.460000 -6.388500 -10.791000 64.351200 0.000000 0.000000 13.027000 7.811400 4.811300 -14.230600 0.000000 0.000000 -6.658500 3.819800 -1.772100 -1.398800 -1.078700 -4.746400 10.875000 12.318400 -1.112900 -0.600900 3.473700 -1.316100 -1.079700 11.321100 6.155200 5.344000 -2.628700 -83.558400 0.000000 -7.928800 0.000000 2.189900 1.877800 6.261800 -7.542600 -4.347000 -7.768600 6.064700 37.089100 82.628800 -0.000200 39.803700 0.000100 14.054800 -4.907300 -3.264400 +204.941170 87.187786 -130.779266 171.980500 -21.713800 177.397800 -14.032700 22.130400 -9.116100 13.466400 0.000000 0.000000 -8.024700 11.595200 14.438100 -13.446400 0.000000 0.000000 -17.512400 -2.810500 -10.569700 68.435000 0.000000 0.000000 8.631700 7.576900 4.061300 -15.364100 0.000000 0.000000 -6.782600 3.469300 -2.006500 -1.091100 -1.382000 -4.313900 11.323100 12.162000 -1.297100 -0.381900 3.478900 -1.456500 -1.126800 11.069300 5.843100 2.314500 -5.693500 -84.697200 0.000000 -10.382700 0.000000 2.414700 1.546900 6.616400 -7.656800 -4.728700 -8.146600 8.154100 37.498100 82.231700 -0.000200 38.168800 0.000100 13.743300 -4.660600 -3.837400 +203.141580 87.455248 -133.138164 172.005500 -24.325000 176.995500 -10.840900 19.581300 -10.148000 11.571700 0.000000 0.000000 -8.407000 11.064700 14.483400 -13.534800 0.000000 0.000000 -20.971800 -0.074400 -9.901200 69.775000 0.000000 0.000000 4.441900 4.957600 2.465800 -15.356900 0.000000 0.000000 -6.946800 2.959900 -2.169700 -0.529700 -1.853700 -3.739700 11.654800 11.804500 -1.237700 0.156200 3.418700 -1.171600 -1.591600 10.506300 6.133000 -0.076900 -8.725600 -86.007700 -0.000100 -14.206200 0.000000 1.868500 0.896200 6.363400 -7.437800 -5.003500 -8.347700 10.033300 36.739800 81.883300 -0.000200 36.376500 0.000100 14.699700 -5.669700 -2.759600 +201.349864 87.655146 -135.449818 172.234600 -27.416200 176.227800 -7.009400 15.703500 -10.702900 8.007600 0.000000 0.000000 -8.330100 11.064500 14.359600 -13.510800 0.000000 0.000000 -23.491800 2.286800 -8.707100 68.215400 0.000000 0.000000 0.935900 1.570100 0.874800 -15.503400 0.000000 0.000000 -6.844100 2.260000 -2.296100 0.055800 -2.479000 -2.384400 12.071300 11.340300 -1.387200 0.178700 2.995200 -1.077800 -1.804300 10.227900 6.017100 -2.634200 -12.280400 -86.975400 -0.000100 -18.828400 0.000000 1.337500 -0.005700 5.973800 -7.584100 -5.012200 -8.848100 12.140400 35.225200 81.839500 -0.000100 33.648200 0.000000 14.229500 -5.274200 -2.240000 +199.680830 87.701120 -137.465054 171.880300 -30.395400 175.619500 -4.663900 13.934500 -11.108600 6.748800 0.000000 0.000000 -8.773500 9.673100 14.956600 -13.731900 0.000000 0.000000 -26.302000 5.262200 -7.869900 64.777100 0.000000 0.000000 -6.216100 -1.884400 5.381000 -15.611400 0.000000 0.000000 -6.636000 1.789700 -2.360400 0.254800 -2.908300 -1.985600 12.276600 10.503500 -1.097000 -0.382200 2.556900 -0.758000 -2.401800 9.572100 6.336100 -4.573900 -15.022100 -87.505700 -0.000100 -24.728100 0.000000 1.034000 -0.625200 5.765000 -7.148200 -5.561900 -8.646400 13.472600 34.090600 81.622700 -0.000100 30.434300 0.000000 12.933300 -4.510400 -2.672600 +198.112888 87.633048 -139.489688 171.096500 -33.938100 174.540700 -3.210800 11.565400 -10.921900 6.285500 0.000000 0.000000 -9.527200 8.346800 15.266000 -13.707600 0.000000 0.000000 -28.564700 7.851700 -7.027100 58.853200 0.000000 0.000000 -14.006100 -6.967800 15.892800 -1.019500 0.000000 0.000000 -6.032600 1.164500 -2.465900 -0.356200 -3.468800 -1.374200 12.328600 9.419500 -0.860400 -0.742200 1.681700 -0.397600 -2.396000 9.233500 6.478600 -6.995200 -19.138900 -87.402200 -0.000100 -30.509600 0.000000 1.033700 -1.092600 5.791700 -6.894600 -6.465300 -8.458900 15.195100 32.893900 81.384000 -0.000100 27.380900 0.000000 12.804900 -4.625300 -2.022700 +196.579236 87.496142 -141.607794 170.293800 -37.091100 173.414600 -2.217300 9.449500 -10.351200 6.820900 0.000000 0.000000 -10.891200 7.221900 14.748900 -13.718100 0.000000 0.000000 -30.519900 9.617500 -6.066900 51.727000 0.000000 0.000000 -13.341600 -7.767100 11.540700 -11.127900 0.000000 0.000000 -5.796100 0.820300 -2.681100 -0.324400 -3.810500 -0.630800 12.626200 8.241100 -0.749200 -1.895100 0.410100 0.137900 -2.718000 8.724100 6.805900 -9.387700 -22.609500 -87.233800 -0.000200 -35.568800 0.000000 1.195500 -1.651800 5.637400 -6.634800 -7.027100 -8.220600 16.606700 31.692800 81.447100 -0.000100 24.364200 0.000000 14.296500 -4.973900 -0.924600 +194.970146 87.320120 -143.873982 170.162700 -39.313900 172.853200 -0.338500 8.641600 -9.746900 7.103900 0.000000 0.000000 -12.168200 5.733800 14.292100 -13.559800 0.000000 0.000000 -31.596200 11.347300 -5.010900 43.674500 0.000000 0.000000 -11.761200 -7.851600 10.003600 -13.214100 0.000000 0.000000 -5.217000 0.802600 -2.940600 -0.328500 -3.790500 0.019900 13.082200 7.051700 -0.690200 -3.045000 -0.769700 0.683800 -2.754100 8.491200 7.097700 -11.661200 -25.230900 -86.907100 -0.000200 -40.094400 -0.000100 0.112800 -1.994800 5.824400 -6.338300 -7.119600 -8.062000 18.005500 30.618600 81.829900 -0.000100 21.992500 0.000000 13.822400 -5.115500 -0.747900 +193.186304 87.052150 -146.091148 169.638300 -40.937500 172.314400 1.473400 7.008700 -9.514200 6.608100 0.000000 0.000000 -12.954500 5.622600 14.706500 -13.581600 0.000000 0.000000 -32.853500 11.600800 -4.441000 35.371100 0.000000 0.000000 -9.336600 -5.815200 8.006200 -14.292500 0.000000 0.000000 -5.154800 0.767800 -2.759800 -0.063900 -3.878200 -0.181100 13.058000 6.262800 -0.651900 -3.652000 -1.716600 1.270000 -3.376300 8.521000 7.591700 -12.881500 -26.795100 -86.203200 -0.000200 -44.243600 -0.000100 -0.838200 -2.225300 5.576200 -5.978900 -6.968100 -7.889400 18.861400 30.263300 82.306600 -0.000100 20.624200 0.000000 13.478800 -5.170000 0.152500 +191.303148 86.699344 -148.440648 169.240100 -41.814800 172.031800 3.251100 6.330700 -9.362800 6.704800 0.000000 0.000000 -13.991100 5.528400 15.260600 -13.887400 0.000000 0.000000 -33.835700 10.190200 -3.777400 26.950600 0.000000 0.000000 -7.028300 -3.445600 7.389000 -14.802200 0.000000 0.000000 -5.154900 0.917700 -2.797900 0.156000 -3.753200 -0.207400 13.048100 5.703400 -0.708600 -4.276300 -2.559500 1.890100 -3.630800 8.493400 7.850100 -13.488700 -27.237700 -85.251500 -0.000200 -48.093900 -0.000100 -1.615300 -2.281300 5.479600 -5.721900 -6.798400 -7.406600 19.732400 28.768800 82.071700 -0.000100 21.630000 0.000000 13.708400 -9.280500 5.512200 +189.173104 86.307676 -150.994618 169.589500 -43.208000 172.083800 5.665300 6.016400 -8.877600 7.269700 0.000000 0.000000 -14.912000 4.712700 14.855300 -14.283200 0.000000 0.000000 -33.342000 5.936300 -3.261900 18.471300 0.000000 0.000000 -4.384000 -0.125100 8.692000 -15.133400 0.000000 0.000000 -5.212400 0.738200 -2.639000 1.177100 -4.044700 -0.277100 13.013300 5.317600 -0.663200 -5.221800 -3.275200 2.312000 -3.845000 8.362500 7.902700 -13.468800 -26.914300 -84.091600 -0.000300 -51.221600 -0.000100 -2.902200 -2.648400 5.841000 -5.736200 -6.816000 -7.290100 20.541300 29.454300 82.014800 -0.000100 22.213500 0.000000 12.276800 -8.154500 3.929400 +186.828176 85.903054 -153.801826 169.921300 -44.953700 171.984700 8.136600 6.764400 -7.892600 8.406700 0.000000 0.000000 -15.564000 2.372600 13.917800 -15.380100 0.000000 0.000000 -32.087400 0.221000 -2.536800 11.066500 0.000000 0.000000 -3.110900 4.615500 11.171200 -15.462800 0.000000 0.000000 -5.530200 0.347400 -2.471000 2.168300 -4.537100 -0.108900 13.283600 4.695200 -0.651200 -6.198400 -3.772600 2.479200 -4.142900 7.865700 7.921900 -12.473400 -26.032400 -82.985800 -0.000300 -53.298000 -0.000100 -4.277900 -2.961700 6.173300 -5.796000 -6.931300 -7.382100 20.762600 29.938500 82.188200 -0.000100 22.806200 0.000000 10.421400 -6.925900 1.717600 +184.285890 85.478366 -156.600144 169.906000 -46.701100 171.894200 9.762600 7.366400 -6.988700 10.815300 0.000000 0.000000 -16.027000 0.242100 13.050000 -16.864200 0.000000 0.000000 -30.898900 -4.373700 -1.948000 6.598200 0.000000 0.000000 -4.319700 8.963600 11.077900 -15.859800 0.000000 0.000000 -5.957100 0.036700 -2.307700 2.754900 -4.908300 0.032300 13.188600 4.070000 -0.660600 -6.095700 -4.520900 2.437000 -4.371000 7.696000 7.982700 -11.717500 -25.781500 -82.488500 -0.000300 -53.424300 -0.000100 -5.247000 -3.199900 6.100400 -5.989500 -6.935200 -7.464700 20.337100 28.762000 82.625100 -0.000100 23.534600 0.000000 9.284200 -7.745100 1.406000 +181.636670 85.090254 -159.413956 169.480700 -48.045600 171.396900 10.040800 7.467200 -5.857200 15.022500 0.000000 0.000000 -16.158300 -0.992700 12.841500 -19.382900 0.000000 0.000000 -31.080000 -6.280500 -1.381200 8.895000 0.000000 0.000000 -3.724000 10.438300 7.551300 -16.880200 0.000000 0.000000 -6.285900 0.112500 -1.904100 2.521300 -4.903300 0.272700 13.192000 3.284600 -0.703900 -5.824400 -5.562400 2.239500 -4.467100 7.572900 7.878900 -10.791300 -25.865200 -82.336200 -0.000300 -52.225400 -0.000100 -4.995900 -2.885900 5.636800 -6.210600 -6.788700 -7.446300 19.645200 27.132300 83.081500 -0.000100 24.062300 0.000000 8.576300 -9.292000 1.360100 +178.791108 84.685632 -162.182810 168.852000 -49.397400 170.782600 8.992300 7.032300 -4.679700 21.545100 0.000000 0.000000 -15.942100 -1.736500 12.454700 -19.546500 0.000000 0.000000 -31.238000 -3.110100 -1.315200 13.282100 0.000000 0.000000 -0.971200 8.005800 9.410600 -16.316500 0.000000 0.000000 -6.413400 0.234300 -1.132300 1.657900 -4.924800 0.170500 12.980400 2.588700 -0.765100 -5.194600 -6.587100 1.936200 -4.205200 7.638600 7.812000 -9.583700 -25.748700 -82.501500 -0.000300 -50.409800 -0.000100 -4.401000 -2.638800 5.504300 -6.525300 -6.623300 -7.383500 18.656800 26.581800 83.399200 -0.000100 24.126500 0.000000 7.664500 -10.264600 0.372500 +176.264570 84.536026 -165.318948 168.121600 -50.380400 168.260300 5.672800 7.724000 -0.932800 31.377100 0.000000 0.000000 -13.526000 -3.123400 10.796700 -25.999900 0.000000 0.000000 -31.502400 -0.100300 0.920600 18.134500 0.000000 0.000000 -0.046600 4.494700 8.616800 -15.405200 0.000000 0.000000 -6.594500 0.529900 -0.168800 0.966600 -4.791500 2.014100 12.584500 1.952600 -0.767700 -4.618500 -7.522500 1.195700 -4.119400 7.865500 7.349700 -7.976900 -25.189000 -82.992400 -0.000200 -47.838800 -0.000100 -3.981700 -2.628200 5.665500 -5.795300 -6.604300 -6.992700 16.117200 26.792600 83.064700 -0.000100 23.870400 0.000000 7.130400 -10.461100 -0.684900 +173.740318 84.697570 -168.530016 168.703000 -50.667400 166.142600 1.244200 8.429200 3.714100 43.384500 0.000000 0.000000 -8.194200 -4.170000 7.568000 -26.768100 0.000000 0.000000 -30.813400 -0.277200 4.036300 22.819100 0.000000 0.000000 -2.090700 4.298900 4.145200 -15.096400 0.000000 0.000000 -6.665700 1.087700 0.551400 0.908200 -4.400100 5.059200 12.627500 1.429600 -0.924000 -4.380700 -8.293100 0.535000 -3.458000 8.287200 6.879200 -7.061900 -23.464400 -84.444500 -0.000200 -44.101100 -0.000100 -3.444200 -2.469800 5.828300 -5.886100 -5.874100 -7.085500 13.402700 27.649700 82.717800 -0.000100 22.928500 0.000000 7.042600 -9.818000 -1.420900 +171.313348 85.011006 -171.151804 168.961200 -50.922500 165.391700 -4.731500 7.760900 6.288800 56.210400 0.000000 0.000000 -1.831200 -3.835100 4.062900 -19.412600 0.000000 0.000000 -28.803700 0.833000 5.750000 23.967500 0.000000 0.000000 -4.621700 2.401200 2.025600 -14.650300 0.000000 0.000000 -6.395700 1.704200 1.107300 0.284100 -3.979500 5.744500 12.571200 0.738700 -0.701000 -3.792400 -8.826400 0.790200 -3.323200 8.392400 7.440400 -5.491400 -20.858100 -86.072600 -0.000200 -39.841500 -0.000100 -2.943000 -2.050500 5.960100 -6.690300 -5.526400 -6.949900 8.872600 29.416900 83.053400 -0.000100 20.384700 0.000000 8.289000 -10.868800 1.974100 +168.896792 85.576664 -173.610778 167.944900 -53.411300 163.821600 -11.511800 4.396300 7.942600 66.778200 0.000000 0.000000 6.972100 -2.684000 2.663100 -9.740700 0.000000 0.000000 -25.577000 -2.268500 5.649000 23.200100 0.000000 0.000000 -6.899300 2.884100 1.109700 -14.216700 0.000000 0.000000 -6.774600 1.412600 1.174900 0.440400 -4.387400 6.414900 12.466900 -0.098400 -0.482500 -3.563400 -9.796000 1.160700 -3.001200 8.334000 7.347600 -4.524400 -18.928200 -86.945600 -0.000100 -34.660700 0.000000 -2.833900 -1.886400 6.137800 -7.874800 -5.446600 -6.621400 5.342800 30.464600 82.789000 -0.000100 19.439600 0.000000 9.036100 -9.942400 3.087000 +166.552880 86.200742 -175.781716 168.146900 -54.905000 163.838200 -17.320000 2.586300 8.603400 74.077600 0.000000 0.000000 13.260200 -1.901900 2.544700 -11.335700 0.000000 0.000000 -22.023000 -3.596900 5.579400 21.897900 0.000000 0.000000 -8.180900 3.216400 0.442300 -14.465900 0.000000 0.000000 -6.382900 1.865500 1.324200 0.142400 -4.074000 6.083000 12.834800 -1.138400 -0.148100 -3.829800 -10.776600 1.715600 -3.037400 8.158200 7.588500 -3.565300 -17.529200 -87.476100 -0.000100 -28.564200 0.000000 -1.238100 -1.342100 5.606500 -8.150900 -5.242200 -6.362200 2.982300 30.690100 82.291200 -0.000100 21.825000 0.000000 8.782400 -8.847100 0.679400 +164.008816 86.770464 -177.919126 169.527700 -55.636600 165.488100 -21.363000 2.385200 8.677000 77.835900 0.000000 0.000000 11.133300 -1.503100 2.836600 -12.972400 0.000000 0.000000 -17.892400 -3.418800 5.336200 20.155300 0.000000 0.000000 -9.505400 2.990600 0.214000 -14.318200 0.000000 0.000000 -6.318800 2.586100 1.493500 0.743500 -3.564900 4.855000 13.271000 -1.927000 0.090200 -4.084500 -11.397300 2.278000 -3.327700 7.978300 8.040800 -2.054800 -15.290600 -87.445200 -0.000100 -22.889000 0.000000 1.530000 -0.670200 4.747100 -8.570000 -4.240100 -6.237500 0.707300 30.532100 82.043300 -0.000100 24.608800 0.000000 8.562300 -8.026900 -0.384700 +161.485072 87.224108 -179.974240 170.993200 -56.280000 167.077600 -25.048900 2.170300 8.712600 78.877400 0.000000 0.000000 8.375400 -2.284900 4.673500 -13.693300 0.000000 0.000000 -13.483600 -3.588300 5.220200 17.799400 0.000000 0.000000 -10.338700 3.032300 -0.372600 -14.404700 0.000000 0.000000 -5.842200 3.167500 1.579000 0.818900 -3.145400 4.073800 13.609300 -2.464800 -0.048800 -4.012800 -11.992600 2.626600 -2.881200 8.350100 7.843000 -0.344900 -13.301800 -86.582200 -0.000100 -18.616000 0.000000 2.228800 -0.247700 4.777900 -9.511700 -3.234000 -6.642800 -0.455500 31.501100 81.501600 -0.000100 27.889500 0.000000 8.453200 -6.524800 -2.130000 +159.033464 87.480648 -181.854602 171.687800 -56.790900 168.162300 -28.759100 2.081500 8.468300 77.336900 0.000000 0.000000 5.347100 -3.171200 6.105300 -13.875200 0.000000 0.000000 -9.699100 -3.886600 4.890800 15.480900 0.000000 0.000000 -11.225000 3.289500 -0.638300 -14.618400 0.000000 0.000000 -5.662200 3.638400 1.754300 1.090400 -2.799100 2.996600 13.646500 -2.817300 -0.216900 -4.111500 -12.560700 2.885100 -2.440000 8.883700 7.525500 1.730300 -11.259300 -85.061800 -0.000100 -15.876600 0.000000 2.327400 0.138500 5.256200 -10.413600 -2.427900 -6.920800 -1.756100 32.668700 80.631200 -0.000100 31.340900 0.000000 8.533600 -5.791400 -3.576800 +156.674820 87.539576 -183.580786 171.640800 -57.139600 168.580200 -32.120700 2.283600 8.195400 73.265200 0.000000 0.000000 0.741100 -2.298600 6.631500 -14.542800 0.000000 0.000000 -6.768800 -4.781500 4.502000 13.866900 0.000000 0.000000 -12.527700 4.075000 -0.076300 -14.178800 0.000000 0.000000 -5.519000 4.057600 1.786900 1.156200 -2.446400 2.225900 13.587600 -2.986400 -0.451400 -4.365500 -13.167600 3.139400 -2.085400 9.510800 7.100600 3.941300 -9.078500 -83.455800 -0.000100 -14.096000 0.000000 2.101700 0.476600 5.860300 -11.514600 -1.704400 -7.195000 -2.432100 33.259400 79.354600 -0.000100 35.143000 0.000000 8.525800 -4.950000 -4.789900 +154.459940 87.421720 -185.162190 171.277900 -57.335600 168.515500 -34.995000 3.048300 8.272800 66.534000 0.000000 0.000000 -3.020600 -0.113700 8.060500 -15.295200 0.000000 0.000000 -4.790500 -5.399600 4.324400 13.522900 0.000000 0.000000 -14.194000 4.518500 -0.002300 -13.727500 0.000000 0.000000 -5.304300 4.440200 1.770900 1.290800 -2.112300 1.797000 13.485700 -3.094900 -0.594900 -5.031200 -13.660600 3.339300 -1.468800 10.331700 6.882600 5.281700 -6.858700 -82.349100 0.000000 -12.418500 0.000000 0.918900 -0.234800 6.524300 -12.397000 -1.141100 -7.424700 -3.230300 33.515200 77.863300 -0.000200 38.850000 0.000100 6.386600 -2.457800 -5.219900 +152.001728 87.289386 -186.796934 170.517200 -57.914400 168.178400 -36.272300 3.569700 7.923200 56.747000 0.000000 0.000000 -3.215800 1.823900 7.651400 -14.408800 0.000000 0.000000 -2.408700 -6.055100 4.081800 12.331800 0.000000 0.000000 -15.346100 4.714400 -0.408100 -14.053400 0.000000 0.000000 -5.614400 4.589100 1.580700 1.665400 -1.944600 1.404100 13.709200 -3.466100 -0.569800 -5.637400 -14.057800 3.551100 -1.389400 10.285500 6.731300 7.582900 -3.863900 -81.352500 0.000000 -11.690700 0.000000 4.031700 1.019300 6.926900 -12.737100 -0.745400 -7.189000 -3.703400 33.957900 75.725800 -0.000200 42.478500 0.000100 6.959600 -3.960000 -6.483800 +149.561296 87.013288 -188.309758 169.740600 -58.316000 167.603700 -36.606700 4.620700 7.845400 45.189300 0.000000 0.000000 -1.515700 3.294400 6.608300 -14.022800 0.000000 0.000000 -0.539400 -6.448100 4.029700 12.047100 0.000000 0.000000 -16.682600 4.804700 -0.926700 -13.810000 0.000000 0.000000 -5.648700 4.677900 1.473600 1.875200 -1.847000 1.201000 13.596600 -3.649700 -0.542500 -5.925500 -14.325300 3.678300 -0.975900 10.833800 6.872800 9.060200 -2.048900 -80.844000 0.000000 -10.893700 0.000000 3.476500 0.777800 6.755300 -13.436800 -0.409800 -7.529800 -4.686900 33.566000 75.211700 -0.000200 44.732400 0.000100 8.429700 -3.550600 -7.285000 +146.977608 86.674452 -189.835028 168.538600 -59.026800 166.465100 -36.150200 6.247900 7.605400 32.645500 0.000000 0.000000 -0.285400 3.970500 4.915800 -14.105400 0.000000 0.000000 1.809300 -6.955400 4.238600 10.646000 0.000000 0.000000 -17.080600 4.758200 -1.204900 -14.826900 0.000000 0.000000 -5.932600 4.561800 1.256400 2.056600 -1.903700 1.284700 13.842500 -4.017100 -0.410000 -6.543600 -14.440400 3.882600 -0.777300 10.696400 6.887800 11.113700 0.085200 -80.462300 0.000000 -10.869600 0.000000 3.078800 0.836000 6.774700 -13.733700 -0.238900 -7.494400 -5.219000 33.289500 74.243000 -0.000200 46.755900 0.000100 8.432000 -3.428000 -7.888100 +144.232376 86.267798 -191.351154 167.529700 -59.209100 165.219200 -35.266100 9.531900 7.784200 20.473500 0.000000 0.000000 -0.200900 1.685500 3.867500 -14.494300 0.000000 0.000000 3.854600 -7.559900 4.537300 10.132300 0.000000 0.000000 -17.691600 5.190900 -0.738600 -15.615800 0.000000 0.000000 -6.234600 4.537700 1.156700 2.229400 -1.862700 1.610100 13.673100 -4.154800 -0.365000 -6.540100 -14.604500 4.014200 -0.719600 10.933000 6.766700 12.789100 2.208200 -80.153800 0.000000 -10.741000 0.000000 2.710400 0.707100 6.807200 -13.947200 -0.181200 -7.449700 -5.649400 33.200500 73.706000 -0.000200 48.211600 0.000100 8.731800 -3.290000 -8.025400 +141.274038 85.853524 -192.770760 166.988900 -59.022600 164.474200 -34.181700 13.362000 7.611100 10.600800 0.000000 0.000000 -0.391200 -0.058900 2.985600 -14.476800 0.000000 0.000000 5.287800 -8.580500 4.400700 11.290400 0.000000 0.000000 -18.599100 6.464000 -0.366500 -16.756200 0.000000 0.000000 -6.306400 4.677500 1.144000 2.175400 -1.702300 1.724000 13.442600 -4.076100 -0.462100 -6.376600 -14.849200 4.268100 -0.506900 11.503800 6.744500 13.719200 3.701100 -80.008600 0.000000 -10.220200 0.000000 2.786300 0.863500 7.261500 -13.997700 -0.268500 -7.412000 -5.741700 33.205000 73.657900 -0.000200 49.204900 0.000100 9.178800 -3.290900 -8.249100 +137.978134 85.504782 -194.153536 167.199000 -58.710400 164.718200 -32.400900 14.875100 6.823300 4.763600 0.000000 0.000000 -0.700100 0.987600 3.608600 -14.775400 0.000000 0.000000 6.771900 -8.877800 3.734900 12.994400 0.000000 0.000000 -18.757400 6.946800 0.415300 -18.287700 0.000000 0.000000 -6.587700 4.849000 1.040900 2.632900 -1.463100 1.613600 13.478200 -3.856400 -0.655400 -6.644700 -15.166600 4.661100 -0.546200 11.478400 6.466200 14.871500 5.494900 -79.908200 0.000000 -10.015800 0.000000 2.947500 1.072200 8.310400 -13.867600 -0.170500 -7.241400 -5.500400 33.019800 73.958100 -0.000200 49.494300 0.000100 9.507500 -3.220800 -8.021400 +134.482332 85.206332 -195.531232 167.562500 -58.625400 165.333000 -32.058000 14.598800 6.306400 7.449200 0.000000 0.000000 -0.457700 3.107400 3.469500 -14.728800 0.000000 0.000000 7.713900 -8.925800 2.642500 16.008800 0.000000 0.000000 -18.460500 7.363900 0.538600 -21.530600 0.000000 0.000000 -6.732000 4.914900 0.794900 2.987700 -1.324100 1.123100 13.247100 -3.753800 -0.591900 -6.497500 -15.491300 4.979400 -0.571400 11.626300 6.502200 15.159800 7.193300 -79.938600 0.000000 -9.490800 0.000000 3.105000 1.066100 8.450700 -13.731400 -0.195800 -6.984400 -4.630200 33.092700 74.625900 -0.000200 49.217100 0.000100 9.669300 -3.229700 -7.964400 +130.704844 84.996782 -196.777356 166.998900 -58.742600 165.746200 -31.647600 12.741800 4.891700 11.648700 0.000000 0.000000 -0.065400 5.205400 4.399200 -14.787900 0.000000 0.000000 7.518100 -9.023600 0.699800 20.262100 0.000000 0.000000 -17.219900 7.769000 0.802000 -26.546800 0.000000 0.000000 -7.108100 4.936500 0.250900 2.878400 -1.169000 0.213000 12.937700 -3.742700 -0.441400 -5.871800 -16.013100 5.486000 -0.565600 11.703600 6.430300 15.156800 8.092500 -79.843000 0.000000 -9.067200 0.000000 2.943500 1.078300 8.726200 -13.227000 -0.640000 -6.666600 -3.237900 33.737900 75.258600 -0.000200 48.253400 0.000100 9.918300 -3.215000 -7.713400 +126.655830 84.940394 -197.862698 166.314800 -58.385800 166.714600 -30.236000 10.490500 2.881400 13.479200 0.000000 0.000000 3.364800 6.594700 2.043000 -14.681100 0.000000 0.000000 5.870500 -8.878200 -2.387500 26.401900 0.000000 0.000000 -14.436600 8.625700 1.456900 -33.647800 0.000000 0.000000 -7.473000 5.200700 -0.390000 2.389500 -0.713500 -1.366800 12.583600 -3.761300 -0.295900 -4.905000 -16.733400 6.656300 -0.409300 11.922300 6.271100 14.617800 8.323600 -79.622200 0.000000 -8.765400 0.000000 2.649600 0.990800 8.835200 -12.595200 -1.245700 -6.153100 -1.224000 34.677200 75.903000 -0.000200 46.618400 0.000100 10.861200 -3.401000 -7.003500 +122.591322 85.098636 -198.678800 165.453300 -58.626300 168.297000 -29.573000 10.887800 0.113400 17.461900 0.000000 0.000000 2.419000 6.873500 4.056400 -14.470700 0.000000 0.000000 2.149400 -8.699500 -6.645900 35.626900 0.000000 0.000000 -9.012400 9.801000 1.841000 -41.891100 0.000000 0.000000 -7.497200 5.173500 -1.324800 1.747400 -0.441200 -3.495400 12.038000 -3.777300 -0.032400 -3.626200 -17.630000 7.830100 -0.225300 12.081700 6.249900 13.330200 7.205300 -79.659000 0.000000 -8.145900 0.000000 1.926100 0.585700 9.113100 -12.014600 -1.577200 -5.998100 0.774400 35.107400 77.425300 -0.000200 43.941600 0.000100 12.254200 -3.714500 -6.081700 +118.867682 85.364574 -199.458326 165.110500 -59.593400 169.687700 -28.219700 11.888700 -2.385400 20.556100 0.000000 0.000000 0.253900 5.989600 7.714400 -14.059200 0.000000 0.000000 -2.633100 -7.142400 -9.835800 47.119100 0.000000 0.000000 -2.706700 9.862900 1.876500 -40.493200 0.000000 0.000000 -7.162000 4.915800 -2.151300 1.442300 -0.329900 -4.732900 11.718800 -3.952200 0.012400 -2.989900 -18.714900 8.509100 -0.290000 11.608500 6.399800 11.337200 5.957900 -80.364700 0.000000 -7.651300 0.000000 1.609700 0.506200 8.727800 -11.441400 -1.833500 -6.741600 1.863800 34.948100 80.086600 -0.000200 39.793300 0.000100 12.493800 -3.819300 -6.023000 +115.600480 85.715094 -200.252838 164.770600 -60.182400 170.001700 -26.050200 11.037800 -4.065500 21.061400 0.000000 0.000000 -2.239400 6.897000 8.258000 -13.679800 0.000000 0.000000 -8.150400 -3.781400 -10.903800 58.391200 0.000000 0.000000 2.736200 8.853500 2.238400 -20.891500 0.000000 0.000000 -6.643600 4.592100 -2.601500 0.924200 -0.397400 -4.769100 11.613400 -4.013200 -0.163400 -2.951200 -19.279100 8.284000 -0.556500 11.461200 6.229400 9.093800 4.003800 -81.245400 0.000000 -7.987500 0.000000 1.366200 0.645700 8.254200 -11.058600 -1.977700 -7.496700 2.468100 34.692600 82.687700 -0.000100 34.576400 0.000000 10.950000 -3.284600 -5.673000 +112.492790 86.220554 -201.078592 165.000200 -59.984400 170.513300 -23.232000 10.677800 -5.070900 20.260100 0.000000 0.000000 -3.957200 7.448300 9.054700 -13.659200 0.000000 0.000000 -13.481400 0.637200 -10.508500 66.504000 0.000000 0.000000 9.759600 6.926800 4.415900 -15.506900 0.000000 0.000000 -6.373800 4.432400 -2.885200 0.772800 -0.392900 -4.518600 11.822300 -3.890400 -0.209500 -2.854900 -19.210200 7.869900 -1.135800 11.280900 6.198900 6.581800 2.562800 -82.389500 0.000000 -8.680400 0.000000 1.763400 0.416000 8.142300 -10.614300 -2.094500 -7.311700 3.167500 34.451400 84.034400 -0.000100 29.408900 0.000000 10.607500 -3.795900 -4.273400 +109.490002 86.728046 -201.995278 165.079700 -60.532000 170.451800 -20.589600 9.815000 -5.761000 19.680400 0.000000 0.000000 -5.533300 7.698700 9.377300 -13.234500 0.000000 0.000000 -18.282200 2.759100 -9.749100 71.677500 0.000000 0.000000 7.197200 5.211100 3.443700 -14.971200 0.000000 0.000000 -6.227300 3.857500 -3.007400 0.673500 -0.889500 -4.123000 12.197500 -3.849300 0.079500 -2.417400 -18.583900 7.189900 -1.518400 10.776400 6.625400 3.543900 2.935000 -84.071500 0.000000 -9.865900 0.000000 4.971300 0.185700 7.078500 -9.902800 -2.553100 -6.972800 4.100800 34.348000 84.677800 -0.000100 25.327900 0.000000 10.986300 -4.736900 -3.154300 +106.370120 87.165688 -202.992990 166.026900 -61.754400 170.724900 -16.772100 8.044900 -6.239300 17.562800 0.000000 0.000000 -6.626400 7.920300 9.374200 -13.690900 0.000000 0.000000 -21.832800 3.502900 -8.911400 73.269600 0.000000 0.000000 3.293900 4.441900 1.466500 -15.193500 0.000000 0.000000 -5.892900 2.882400 -3.073500 0.749500 -1.698400 -3.095200 12.656000 -3.920200 0.284100 -1.761300 -17.256800 6.285500 -1.659500 10.409800 6.883200 1.750100 -1.632100 -85.398300 -0.000100 -13.444200 0.000000 -0.860300 -1.987000 6.150300 -9.327500 -3.017400 -6.953200 6.135000 33.817800 84.662300 -0.000100 22.849800 0.000000 11.217200 -5.209600 -3.149600 +103.442008 87.477092 -203.996290 166.168700 -63.127200 170.128600 -13.633000 7.185100 -6.235400 15.976800 0.000000 0.000000 -7.692100 7.088300 9.738800 -13.507100 0.000000 0.000000 -25.344800 3.841300 -7.866900 72.022100 0.000000 0.000000 0.926800 2.854400 0.543200 -15.683500 0.000000 0.000000 -5.687200 1.965300 -3.146500 0.810900 -2.548800 -1.815200 12.864500 -3.661000 0.356200 -0.860700 -16.143700 5.309000 -1.926400 9.849900 6.932600 -0.235300 -6.279400 -86.038900 -0.000100 -17.734500 0.000000 -3.435000 -2.789900 5.418300 -8.629000 -3.779000 -7.251200 7.910400 32.130700 84.649400 -0.000100 21.038300 0.000000 11.593600 -5.267600 -2.545600 +100.589334 87.611712 -204.921612 165.802800 -64.132000 169.516300 -10.761400 7.300400 -6.434200 14.484300 0.000000 0.000000 -8.755500 5.781400 9.939800 -13.733500 0.000000 0.000000 -28.697500 4.409300 -7.180900 68.606800 0.000000 0.000000 -2.433200 0.909000 0.384000 -14.312600 0.000000 0.000000 -5.559000 1.330000 -3.245100 0.743100 -3.151900 -1.139600 13.344900 -3.050800 0.397600 -0.472900 -14.958400 4.816800 -2.255600 9.222900 7.264200 -2.125200 -10.629000 -86.188300 -0.000100 -22.910300 0.000000 -4.968200 -3.361300 5.019300 -8.119800 -4.664900 -7.237900 10.594200 30.121800 83.945200 -0.000100 20.788000 0.000000 11.098700 -5.142400 -2.385400 +97.734882 87.594948 -205.907132 165.325900 -64.974300 168.665800 -8.267200 7.155200 -6.335300 13.527100 0.000000 0.000000 -10.100400 4.650100 9.808600 -13.554900 0.000000 0.000000 -31.276600 4.811700 -6.309700 62.760100 0.000000 0.000000 -4.889900 -0.983600 -0.612600 -15.139000 0.000000 0.000000 -5.618200 0.746400 -3.260900 1.007900 -3.748500 -0.394900 13.633900 -2.571700 0.437100 -0.275200 -13.407200 4.131700 -2.462800 9.086400 7.481200 -4.331500 -14.358900 -85.896800 -0.000100 -28.308500 0.000000 -4.806200 -3.722400 4.839400 -7.634400 -5.418900 -7.305100 12.946900 28.493800 83.192900 -0.000100 20.789200 0.000000 10.473700 -5.393900 -2.342300 +94.862142 87.453978 -206.869538 164.875300 -65.385400 168.156200 -5.832900 6.646400 -6.559300 12.534600 0.000000 0.000000 -11.338900 4.489100 9.780100 -14.191400 0.000000 0.000000 -33.081400 5.501100 -5.664200 54.888900 0.000000 0.000000 -6.111200 -2.898200 -0.887600 -14.880800 0.000000 0.000000 -5.601500 0.508200 -3.226100 1.090300 -3.992200 -0.097100 13.927500 -1.704000 0.215700 0.012200 -12.461100 4.148600 -2.963500 8.663800 7.692200 -5.914300 -16.931400 -85.126300 -0.000100 -33.829100 0.000000 -5.520600 -3.859700 4.767100 -6.921800 -6.323500 -7.379500 14.674000 27.842500 82.586900 -0.000100 20.126400 0.000000 10.127700 -4.892600 -2.927000 +91.951048 87.195406 -207.870552 164.423100 -65.542500 167.736300 -3.634200 5.790500 -6.840300 12.006400 0.000000 0.000000 -12.878100 4.917800 10.384100 -13.616800 0.000000 0.000000 -34.100100 5.683000 -5.183900 45.544500 0.000000 0.000000 -5.583900 -4.889800 -1.172100 -15.005600 0.000000 0.000000 -5.671300 0.397200 -3.142700 1.242600 -4.132200 0.021800 14.000400 -0.973000 0.146100 0.391500 -11.392700 3.865700 -3.451500 8.431300 7.909800 -7.552300 -19.053100 -84.252600 -0.000200 -38.564900 -0.000100 -5.239800 -4.142900 5.238300 -6.361600 -6.773300 -7.525300 16.258000 27.120500 82.233700 -0.000100 19.602500 0.000000 9.959000 -4.859400 -3.061300 +88.910414 86.814152 -208.916016 163.884400 -65.715800 167.356000 -1.591700 4.619700 -7.241900 11.792600 0.000000 0.000000 -14.375900 5.736400 11.070100 -13.911000 0.000000 0.000000 -34.370000 4.591200 -5.172100 35.412200 0.000000 0.000000 -4.174800 -5.066100 -1.020400 -15.113200 0.000000 0.000000 -5.916500 0.282200 -3.028300 1.578800 -4.304800 -0.018400 14.096300 -0.178000 -0.134600 0.387700 -10.548600 3.976200 -3.812100 8.263400 8.109700 -9.111700 -20.683400 -83.322600 -0.000200 -42.688300 -0.000100 -5.402500 -4.333700 5.675500 -6.158800 -6.927900 -7.777500 17.797400 26.289100 82.108900 -0.000100 19.186600 0.000000 9.661700 -4.935500 -2.973300 +85.877654 86.314280 -210.057746 163.419600 -65.556900 166.988100 0.234200 4.724200 -7.397800 12.243700 0.000000 0.000000 -16.090100 5.648200 11.372000 -13.869500 0.000000 0.000000 -34.368200 2.607300 -4.927500 25.451900 0.000000 0.000000 -2.249500 -2.325400 0.025700 -14.980700 0.000000 0.000000 -5.817100 0.374900 -2.885800 1.357700 -4.232700 -0.026400 14.075800 0.485300 -0.394300 0.673500 -9.999900 4.018700 -3.947700 7.971500 8.186600 -10.211600 -21.933400 -82.268300 -0.000200 -46.311100 -0.000100 -5.226500 -4.202600 6.372400 -5.871700 -7.198300 -7.910800 19.024500 25.541100 81.902500 -0.000100 18.888100 0.000000 9.760900 -5.197200 -2.398300 +82.660744 85.804502 -211.435188 163.427000 -66.133700 166.551700 2.507500 5.190000 -6.851800 12.910500 0.000000 0.000000 -17.790900 4.674800 11.627500 -13.759800 0.000000 0.000000 -33.306100 -0.956900 -4.325600 16.053900 0.000000 0.000000 0.838300 2.791300 1.934100 -15.788600 0.000000 0.000000 -5.919700 0.128100 -2.751600 1.924400 -4.535800 0.554000 13.887100 0.801600 -0.500000 0.671800 -9.062600 3.681400 -4.259400 7.804700 8.260500 -11.368900 -22.455700 -81.838300 -0.000200 -48.398100 -0.000100 -4.778100 -4.209300 6.625000 -5.864000 -7.300200 -7.924100 20.024100 25.160800 81.431900 -0.000100 18.645400 0.000000 9.601300 -5.018300 -2.029400 +79.250794 85.314536 -212.903816 163.258900 -66.896700 166.117100 4.716400 6.016800 -6.284400 13.971700 0.000000 0.000000 -18.761100 3.286900 11.257800 -14.405800 0.000000 0.000000 -31.779200 -2.549100 -3.728600 8.638100 0.000000 0.000000 2.050500 7.832900 4.878300 -16.267500 0.000000 0.000000 -6.053800 -0.145900 -2.764900 2.211300 -4.808100 1.194200 13.977600 1.186200 -0.539600 0.572700 -8.339900 3.170600 -4.500900 7.499400 8.128500 -11.757300 -22.913100 -81.444400 -0.000200 -49.573100 -0.000100 -4.603600 -4.104900 6.953500 -5.913700 -7.489000 -7.951200 20.699500 24.872200 81.028600 -0.000100 18.298800 0.000000 9.671900 -4.953000 -2.149500 +75.658472 84.897214 -214.465408 163.247600 -67.729800 165.852900 6.479000 6.371000 -5.580700 16.156700 0.000000 0.000000 -19.150300 2.268100 11.126200 -15.817100 0.000000 0.000000 -30.781100 -2.003700 -3.183700 6.783400 0.000000 0.000000 -0.621100 9.544000 5.666400 -16.939100 0.000000 0.000000 -6.273500 -0.409600 -2.674000 2.472700 -5.091200 1.621100 13.713700 1.689300 0.039100 1.146800 -6.836900 2.122400 -4.748100 7.273900 8.342100 -11.786000 -22.982400 -81.764300 -0.000200 -49.455300 -0.000100 -4.386600 -3.977200 6.864000 -6.296800 -7.351200 -7.771100 21.506100 24.125700 80.623100 -0.000100 18.281100 0.000000 9.749900 -4.953400 -2.117600 +72.024494 84.594192 -216.173812 162.592000 -68.209800 164.521000 7.029800 6.559300 -4.219900 19.927400 0.000000 0.000000 -18.901100 1.654400 11.441000 -18.344100 0.000000 0.000000 -31.087800 -1.801700 -2.237200 11.050900 0.000000 0.000000 0.460900 9.635600 6.015900 -17.942600 0.000000 0.000000 -6.182700 -0.301900 -2.512200 1.688700 -4.936400 2.915500 13.491400 2.427400 -0.175700 2.252900 -6.579500 1.822600 -4.786200 6.914800 8.064800 -11.064500 -23.057700 -82.376600 -0.000200 -48.513700 -0.000100 -3.834400 -3.793800 6.526500 -5.626100 -8.137000 -8.063900 20.682000 24.116400 80.456800 -0.000100 17.797600 0.000000 9.552300 -4.839300 -2.411200 +68.241926 84.378292 -217.984070 161.311900 -68.868000 162.405600 6.164000 6.963900 -2.377500 26.112200 0.000000 0.000000 -17.554200 0.919800 11.521500 -20.998800 0.000000 0.000000 -30.878200 -0.630000 -1.298900 15.122800 0.000000 0.000000 2.241600 8.078300 9.047100 -16.695100 0.000000 0.000000 -6.299900 -0.437600 -1.756300 0.806900 -5.216100 3.379100 13.150700 3.213500 -0.056000 3.166300 -5.722100 1.299200 -4.332300 7.084500 8.087800 -9.747000 -23.252400 -82.761100 -0.000200 -47.466000 -0.000100 -3.463000 -3.523200 6.453400 -6.198800 -8.112800 -8.027600 20.930900 23.668200 80.465800 -0.000100 17.874200 0.000000 10.376200 -5.169700 -2.079600 +64.677036 84.474304 -220.089984 159.908000 -69.395400 158.664000 2.885300 8.054200 1.875400 35.574000 0.000000 0.000000 -13.667700 -0.900100 10.164000 -27.129400 0.000000 0.000000 -30.938200 -1.331900 1.163600 20.214900 0.000000 0.000000 -0.557500 8.015300 6.387200 -15.903400 0.000000 0.000000 -6.523500 -0.364800 -0.638400 0.357900 -5.421800 5.271100 12.786900 4.054900 0.131300 3.585300 -5.001900 0.035000 -4.180500 6.929100 7.557000 -7.686600 -22.938500 -83.094000 -0.000200 -45.764000 -0.000100 -2.786300 -3.254400 6.358000 -6.303900 -8.155700 -7.908800 19.926200 23.648900 80.378800 -0.000100 17.934200 0.000000 10.143700 -5.011000 -2.306500 +61.207396 84.775040 -221.990158 160.514500 -69.409400 157.473200 -1.416300 8.504000 5.519800 46.738600 0.000000 0.000000 -7.905900 -2.137500 7.259200 -26.423100 0.000000 0.000000 -29.842400 -1.815300 3.341100 23.864000 0.000000 0.000000 -3.018900 8.087800 2.334200 -15.814000 0.000000 0.000000 -6.581300 0.054300 -0.026000 0.404300 -5.303600 6.898200 12.641400 4.601400 0.435400 3.778800 -3.639600 -0.912400 -4.226200 6.768400 7.774200 -5.700400 -21.988500 -84.488600 -0.000200 -42.786400 -0.000100 -1.999700 -2.606100 6.450600 -6.265800 -7.609500 -7.647200 17.963800 24.426500 80.351800 -0.000100 17.978200 0.000000 9.520700 -5.001500 -2.669800 +57.903618 85.169756 -223.549464 158.596100 -70.708600 154.822400 -7.106900 6.471600 7.685200 58.340900 0.000000 0.000000 -2.929000 -1.746500 4.392300 -14.664500 0.000000 0.000000 -27.416300 -2.521000 4.065400 24.251100 0.000000 0.000000 -5.737600 7.056200 1.209000 -15.033700 0.000000 0.000000 -7.026700 -0.071200 0.685200 0.650100 -5.685900 6.675900 12.473000 5.214300 0.710600 3.876900 -2.662400 -0.783000 -3.772600 7.571800 8.590000 -5.667300 -21.793800 -86.285300 -0.000200 -37.750100 -0.000100 -1.418300 -2.186300 6.002900 -6.905600 -7.014700 -7.168200 15.774800 25.570700 80.839900 -0.000100 18.041200 0.000000 9.531800 -4.918700 -3.263500 +54.754018 85.705442 -224.889060 156.294700 -72.589000 152.017700 -12.766200 3.794100 8.951100 67.611800 0.000000 0.000000 3.432400 -0.867900 2.457700 -11.841200 0.000000 0.000000 -24.241600 -4.187500 4.160400 23.508700 0.000000 0.000000 -7.833000 6.815400 1.036000 -14.755800 0.000000 0.000000 -7.303100 -0.114400 0.974600 1.044600 -5.904300 6.705800 12.551400 5.642300 0.747900 3.667200 -2.270900 -0.366300 -3.490400 7.749400 8.509700 -5.265300 -21.219100 -87.313800 -0.000100 -32.402600 0.000000 -2.480400 -2.229600 5.596100 -7.758800 -6.632800 -6.811800 13.603700 26.322000 81.087600 -0.000100 18.790600 0.000000 9.137200 -4.620300 -4.263900 +51.659790 86.294468 -226.035616 157.151300 -73.843200 152.664500 -16.942900 3.096600 9.669400 73.760000 0.000000 0.000000 2.092100 0.785600 4.403800 -13.066700 0.000000 0.000000 -20.237500 -4.740800 4.307000 21.858500 0.000000 0.000000 -9.078800 6.684900 0.792000 -15.090800 0.000000 0.000000 -7.041600 0.818700 1.542000 1.236900 -5.269100 5.810300 12.636100 5.107700 1.204200 3.918900 -1.931500 -0.301300 -3.378900 7.542600 8.433700 -4.420400 -21.026500 -87.596400 -0.000100 -27.316400 0.000000 -2.235400 -1.611800 4.835700 -7.739100 -6.550400 -6.588400 10.647600 26.788200 81.657900 -0.000100 20.053600 0.000000 9.386700 -4.692000 -5.045100 +48.613822 86.830662 -227.002594 157.765400 -74.576600 153.545500 -21.058800 3.269900 9.960500 76.836400 0.000000 0.000000 0.474700 1.464700 5.917900 -13.700900 0.000000 0.000000 -16.456200 -5.080400 4.101500 19.757500 0.000000 0.000000 -10.047200 6.825100 0.645300 -14.841900 0.000000 0.000000 -6.928000 1.696000 1.737200 1.208900 -4.560200 4.946600 13.041300 5.245400 1.012300 3.902700 -1.951600 0.365100 -2.432100 8.398800 8.375700 -4.045600 -20.666100 -87.698300 -0.000100 -23.034000 0.000000 -0.946200 -0.663600 4.442300 -8.271500 -5.528800 -6.749000 8.532100 27.118500 82.092900 -0.000100 21.843600 0.000000 9.292900 -4.497800 -5.341600 +45.606462 87.256112 -227.825046 158.220900 -75.472400 154.574300 -24.759900 3.566200 9.752000 77.075700 0.000000 0.000000 -0.219600 1.039400 6.859400 -14.064900 0.000000 0.000000 -12.677200 -5.807600 3.442600 17.574000 0.000000 0.000000 -10.996500 7.338100 0.844500 -14.523200 0.000000 0.000000 -6.768500 2.453500 1.661700 1.369200 -3.899700 4.151100 13.081300 5.333600 0.778800 3.985400 -1.861900 0.531500 -2.822600 8.468300 8.251200 -0.837800 -18.420200 -87.123200 -0.000100 -20.941300 0.000000 -0.009000 -0.386400 5.092600 -9.264900 -4.518400 -7.075600 7.104600 28.044500 81.939600 -0.000100 24.256700 0.000000 8.317900 -4.103600 -5.935200 +42.766234 87.509350 -228.540818 157.713000 -76.190900 154.466100 -28.427800 4.127700 9.731700 74.957100 0.000000 0.000000 -2.161700 0.172300 7.696800 -14.250300 0.000000 0.000000 -9.545500 -7.073100 2.988600 15.826800 0.000000 0.000000 -11.804500 8.098400 0.692700 -14.441300 0.000000 0.000000 -6.361400 3.063900 1.615400 1.001500 -3.348500 3.517400 13.279900 5.762200 0.415700 3.450400 -1.739900 0.725700 -2.585000 8.969300 8.098600 1.903600 -15.760000 -86.245800 -0.000100 -19.370000 0.000000 0.649800 -0.663800 5.337300 -9.976200 -3.540000 -7.357900 6.045600 29.521400 81.011000 -0.000100 27.306400 0.000000 8.223800 -4.201700 -6.311200 +39.986458 87.590884 -229.117398 156.650000 -76.720000 153.932100 -31.506700 5.260600 9.553100 70.148700 0.000000 0.000000 -4.704800 0.228100 8.054900 -14.599300 0.000000 0.000000 -6.967400 -8.447100 2.378900 14.622200 0.000000 0.000000 -12.962100 9.013000 0.970400 -14.123800 0.000000 0.000000 -6.047600 3.697800 1.569300 0.758600 -2.765100 2.683900 13.427300 5.855000 0.312500 2.600000 -1.273400 0.605000 -2.271500 9.653200 7.850500 4.392800 -13.315300 -85.011500 -0.000100 -18.340200 0.000000 0.415000 -0.731900 5.746400 -11.078000 -2.663300 -7.573900 5.354000 30.318600 79.906400 -0.000100 30.206000 0.000000 9.189400 -3.766200 -6.468100 +37.256212 87.544910 -229.665022 154.606300 -77.556200 152.121500 -33.866500 6.263600 9.395500 62.966700 0.000000 0.000000 -5.753400 1.604600 8.591300 -14.800500 0.000000 0.000000 -4.485500 -9.495000 2.171100 13.565800 0.000000 0.000000 -13.996800 9.140700 0.963400 -14.175100 0.000000 0.000000 -5.781000 4.106100 1.417600 0.758100 -2.365500 2.406700 13.312700 6.298800 -0.038700 2.027500 -1.194900 0.801800 -1.480700 10.547900 7.468600 5.743100 -11.405800 -83.840200 -0.000100 -17.003100 0.000000 -0.509000 -0.817000 5.976200 -11.751600 -2.130700 -7.714200 4.342300 30.638500 78.404500 -0.000100 33.145900 0.000000 8.881100 -3.624300 -6.937900 +34.526982 87.377778 -230.139748 151.341000 -78.455300 148.938100 -35.410400 7.565900 9.252400 53.708300 0.000000 0.000000 -4.576600 3.710400 8.086500 -14.336000 0.000000 0.000000 -2.184900 -9.663000 2.216500 12.592900 0.000000 0.000000 -15.006700 8.333500 1.205000 -14.107400 0.000000 0.000000 -5.609900 4.316300 1.239800 0.779300 -2.143600 2.274900 13.320000 6.612600 -0.229900 1.381900 -1.038700 0.832200 -1.214700 10.878700 7.278000 7.589900 -8.619400 -82.916500 -0.000100 -15.903000 0.000000 -1.517200 -1.067300 6.025000 -12.115700 -1.613000 -7.819900 3.256800 30.504200 76.901500 -0.000200 35.869700 0.000000 9.148700 -3.378300 -7.201700 +31.766002 87.125302 -230.511350 146.130700 -79.127400 143.700400 -36.318700 9.339100 9.047700 42.902100 0.000000 0.000000 -2.805600 5.758100 6.865500 -14.201100 0.000000 0.000000 -0.255900 -10.158200 2.342400 11.753400 0.000000 0.000000 -15.713000 7.886000 1.112700 -14.366200 0.000000 0.000000 -5.927000 4.485700 1.153400 1.196300 -1.926400 2.176900 13.113400 6.657800 -0.273800 0.832600 -0.924900 0.757500 -1.251500 10.853100 7.090900 9.262200 -5.934000 -82.084600 -0.000100 -14.638700 0.000000 -2.020800 -1.165900 6.612800 -12.331300 -1.409800 -7.862200 1.765000 30.101700 75.615800 -0.000200 38.002200 0.000100 9.354100 -3.527100 -7.595500 +28.867608 86.791292 -230.801418 141.151500 -79.691800 138.487700 -36.292300 11.640700 8.784800 31.402000 0.000000 0.000000 -1.531200 6.847700 6.084900 -14.202700 0.000000 0.000000 1.959500 -10.343600 2.659200 10.832800 0.000000 0.000000 -16.461000 7.331600 1.927300 -14.634500 0.000000 0.000000 -5.887500 4.506200 1.040300 1.163700 -1.863100 2.288800 12.943500 6.912000 -0.418200 0.365300 -0.913000 0.873600 -1.049500 11.250900 6.938700 10.539000 -3.727400 -81.423900 0.000000 -13.252800 0.000000 -2.313600 -1.091800 6.934300 -12.865900 -1.140600 -7.887300 1.091500 29.640600 74.519400 -0.000200 39.903800 0.000100 9.393400 -3.561100 -7.974600 +25.798272 86.427310 -230.940610 136.344400 -79.977200 133.431200 -35.562700 14.334100 8.278900 19.806800 0.000000 0.000000 -1.117600 5.248500 6.112300 -14.462800 0.000000 0.000000 3.987900 -10.827200 2.866400 10.308200 0.000000 0.000000 -16.850700 7.134000 2.306900 -15.387200 0.000000 0.000000 -6.124800 4.496900 0.993300 1.368500 -1.829500 2.368400 12.769100 7.149500 -0.544200 -0.127300 -0.879900 0.858000 -0.987100 11.520600 6.744900 11.750000 -1.016100 -80.937800 0.000000 -12.145700 0.000000 0.913300 -0.195200 7.894400 -13.053500 -0.764700 -7.775100 0.484900 28.961500 73.586800 -0.000200 41.623600 0.000100 9.486300 -3.721400 -8.134500 +22.496272 86.034626 -230.883206 133.388800 -80.062800 130.324100 -33.936800 16.216000 7.360100 9.268300 0.000000 0.000000 -0.763100 2.837500 4.689300 -14.883400 0.000000 0.000000 5.624300 -11.591300 2.627600 10.960200 0.000000 0.000000 -17.236600 7.561700 3.022300 -16.815700 0.000000 0.000000 -6.217400 4.680000 0.988100 1.357900 -1.634000 2.283200 12.710100 7.257200 -0.592800 -0.758100 -0.880600 0.721500 -0.784300 11.699000 6.598500 12.732500 1.129800 -80.583200 0.000000 -11.074500 0.000000 0.471400 -0.251500 8.154900 -13.257100 -0.778300 -7.782000 0.059800 28.544100 73.276000 -0.000200 42.562700 0.000100 9.738500 -3.661000 -8.425000 +19.026124 85.664802 -230.737664 132.643500 -79.936300 129.453100 -32.671800 16.403900 6.629000 3.836300 0.000000 0.000000 -1.118300 2.581000 4.399600 -15.311200 0.000000 0.000000 6.665900 -11.756600 2.093000 12.936200 0.000000 0.000000 -17.361700 7.837500 3.385400 -18.846600 0.000000 0.000000 -6.315200 4.936800 0.923500 1.394800 -1.364300 2.139300 12.566800 7.484400 -0.690000 -1.272700 -0.810400 0.785800 -0.670100 12.018400 6.501500 13.462500 3.036300 -80.346800 0.000000 -10.099300 0.000000 0.079200 -0.402900 8.457200 -13.240600 -0.662200 -7.627400 0.072500 28.221800 73.163800 -0.000200 43.348400 0.000100 9.820700 -3.609300 -8.588400 +15.320518 85.321648 -230.530908 130.534700 -80.237800 127.326700 -33.162100 14.183600 6.216600 7.937100 0.000000 0.000000 -1.586200 5.066900 4.517500 -14.765300 0.000000 0.000000 7.581400 -11.887700 1.343100 15.710400 0.000000 0.000000 -16.937700 8.128400 3.719000 -21.178000 0.000000 0.000000 -6.327100 4.984800 0.635800 1.307500 -1.267100 1.928200 12.405000 7.539800 -0.663200 -1.486500 -0.784500 1.044100 -0.505400 12.160200 6.544300 13.955900 4.772400 -80.271700 0.000000 -9.443600 0.000000 -0.163800 -0.398100 8.415700 -12.990600 -0.701300 -7.538800 0.632900 28.185300 73.419000 -0.000200 43.802300 0.000100 9.913100 -3.443900 -8.701200 +11.226800 85.066124 -230.025702 127.580300 -80.550600 125.206900 -32.812000 11.593400 4.579100 12.970600 0.000000 0.000000 -2.520600 8.264000 5.981100 -15.323900 0.000000 0.000000 7.841400 -12.287500 -0.675500 19.458700 0.000000 0.000000 -15.375300 8.886100 4.581000 -26.343500 0.000000 0.000000 -6.799400 5.054200 0.106700 1.511200 -1.005100 0.878800 12.056100 7.571600 -0.368300 -1.325600 -1.081800 1.578000 -1.025200 11.990700 6.725800 14.911600 5.924700 -80.099200 0.000000 -9.252000 0.000000 -0.348400 -0.237300 8.466100 -13.037600 -0.830900 -7.199100 2.581100 28.182800 73.670900 -0.000200 44.192700 0.000100 10.354900 -3.737800 -8.895000 +6.937756 84.965794 -229.334314 126.691100 -80.353100 125.507500 -31.485000 9.752600 2.911200 15.139000 0.000000 0.000000 0.601600 9.034800 3.945400 -14.635200 0.000000 0.000000 6.569500 -11.835000 -3.482400 25.111400 0.000000 0.000000 -11.957900 9.773200 5.216300 -33.948700 0.000000 0.000000 -7.049800 5.292500 -0.556600 0.791700 -0.478700 -0.431500 11.692500 7.826400 -0.056100 -0.501500 -1.385700 2.190800 -0.856500 12.455500 6.720100 15.013600 6.019500 -79.741100 0.000000 -9.080000 0.000000 -0.716600 -0.376900 8.278200 -12.661100 -1.400700 -6.786400 4.928600 29.169500 73.987900 -0.000200 43.800200 0.000100 10.876800 -3.296300 -8.752300 +2.829814 85.082634 -228.467158 123.200100 -80.343600 123.825500 -30.929400 11.532400 1.009800 18.966300 0.000000 0.000000 1.504500 8.005900 4.053400 -14.381600 0.000000 0.000000 2.792700 -10.697700 -7.091300 34.474700 0.000000 0.000000 -6.296300 10.182400 4.981100 -42.246000 0.000000 0.000000 -6.843700 5.326000 -1.334000 -0.431800 -0.126500 -2.380900 11.395700 8.278500 -0.008700 0.168300 -1.694700 3.212700 -0.446600 12.627000 6.790300 14.443100 5.602200 -79.546400 0.000000 -9.062300 0.000000 -1.155300 -0.450500 8.033200 -10.921200 -2.546000 -6.552500 5.430200 30.648600 75.244500 -0.000200 41.926400 0.000100 12.192500 -3.104700 -8.501100 +-0.990092 85.251798 -227.663502 116.475700 -81.021100 118.461000 -30.013800 13.795800 -0.815300 22.901500 0.000000 0.000000 -0.757900 5.371600 8.063900 -14.279600 0.000000 0.000000 -1.943200 -8.498100 -9.688500 46.212600 0.000000 0.000000 -0.766600 9.416400 4.676600 -38.393400 0.000000 0.000000 -6.872800 4.933400 -1.830800 -0.273200 -0.232000 -3.804400 10.970100 8.799800 -0.186500 0.031900 -1.880100 3.404500 -0.718200 12.247300 7.102200 13.325700 4.759800 -80.044300 0.000000 -9.160200 0.000000 -1.183700 -0.545200 7.826200 -10.256300 -2.911700 -7.220800 5.684900 30.937300 77.974800 -0.000200 39.191400 0.000100 12.749300 -3.152700 -7.551900 +-4.446524 85.537040 -226.951032 109.909700 -81.665000 112.515100 -27.679600 12.465100 -2.713300 23.845000 0.000000 0.000000 -3.342100 6.329400 9.190100 -13.947400 0.000000 0.000000 -7.107300 -5.397800 -10.717100 57.157800 0.000000 0.000000 4.977200 7.849600 3.405500 -21.073600 0.000000 0.000000 -6.690500 4.508200 -2.072900 -0.101200 -0.509700 -4.155900 10.945100 9.547900 -0.735600 -0.253500 -1.745300 2.914900 -0.832100 11.995300 6.859900 11.335100 2.981600 -80.560800 0.000000 -9.472100 0.000000 -1.123800 -0.719300 7.668700 -10.446800 -2.793400 -7.974100 6.715500 30.721700 80.472800 -0.000200 36.101800 0.000100 11.923300 -2.970100 -6.284400 +-7.749540 85.988652 -226.288854 107.730200 -82.159900 110.848500 -24.623300 11.284500 -4.264000 23.391400 0.000000 0.000000 -5.224200 7.330000 9.743100 -13.797800 0.000000 0.000000 -12.189300 -1.759500 -10.954900 65.496400 0.000000 0.000000 10.792900 6.447800 4.226200 -18.312900 0.000000 0.000000 -6.436500 4.349600 -2.370900 0.068600 -0.538400 -4.109900 11.317400 9.957900 -1.098300 -0.202700 -1.191200 2.080000 -0.917300 12.158300 6.597100 8.729700 0.456800 -81.223300 0.000000 -10.267600 0.000000 -1.106300 -0.998900 7.671700 -10.307000 -2.877400 -8.103100 7.751800 31.033400 81.884400 -0.000100 32.917500 0.000000 10.606200 -2.928800 -4.803000 +-11.145774 86.496652 -225.680524 102.812400 -82.985400 106.262200 -20.767500 9.892800 -5.667300 21.765000 0.000000 0.000000 -6.549200 7.771000 9.891300 -13.758400 0.000000 0.000000 -16.121400 0.748000 -10.767900 70.654800 0.000000 0.000000 7.558900 5.567500 4.004000 -18.298300 0.000000 0.000000 -6.432800 4.008900 -2.632400 0.513400 -0.755200 -3.842500 11.904600 10.079000 -1.237800 0.330400 -0.435700 1.481600 -1.279700 11.922900 6.578300 6.566300 -1.461000 -82.196200 0.000000 -12.244300 0.000000 -1.950500 -1.318700 7.432400 -9.604300 -3.250200 -8.030800 8.533500 31.756100 82.759500 -0.000100 29.864400 0.000000 10.433000 -3.147600 -4.208100 +-14.424406 86.962488 -225.139504 91.028200 -83.843500 94.358300 -16.874300 7.972800 -6.642600 19.593600 0.000000 0.000000 -7.413000 8.063100 10.317200 -13.834400 0.000000 0.000000 -19.793300 2.018500 -10.168500 72.860900 0.000000 0.000000 4.385200 4.740200 2.360000 -17.521300 0.000000 0.000000 -6.237200 3.402900 -2.717200 0.695500 -1.253800 -3.287300 12.447100 10.037500 -1.189700 1.085100 0.214300 1.221300 -1.562000 11.561800 6.665000 4.574700 -4.081200 -83.222300 -0.000100 -15.436200 0.000000 -2.447100 -1.669700 7.371200 -8.964800 -3.900600 -8.066200 9.714600 32.186300 83.361100 -0.000100 27.443600 0.000000 10.403900 -3.536000 -3.680000 +-17.687798 87.330534 -224.730564 71.892400 -84.627500 74.632800 -12.668900 6.620700 -6.778100 17.442200 0.000000 0.000000 -8.300500 7.282500 10.797200 -13.837400 0.000000 0.000000 -22.589200 2.510600 -9.047200 72.191100 0.000000 0.000000 2.123500 3.115200 1.023900 -17.084500 0.000000 0.000000 -5.846900 2.629900 -2.695400 1.277700 -1.944300 -2.334300 12.486200 9.801900 -0.985900 2.017200 0.811700 1.040300 -1.608200 11.447900 6.696300 2.190900 -7.899600 -83.895200 -0.000100 -19.459100 0.000000 -2.773300 -2.359200 7.169500 -8.367900 -4.758000 -7.952800 11.160600 31.898300 83.445100 -0.000100 25.787500 0.000000 10.244500 -3.817900 -3.353400 +-20.760944 87.515192 -224.299018 54.195600 -84.033600 56.601300 -9.356900 5.957100 -6.893700 15.416400 0.000000 0.000000 -9.086400 5.863800 11.189500 -14.016200 0.000000 0.000000 -25.751400 2.828900 -8.258200 69.327000 0.000000 0.000000 -1.028200 0.789200 0.667600 -17.032400 0.000000 0.000000 -5.883600 1.989600 -2.702900 1.678400 -2.577600 -1.730300 12.810900 9.492100 -0.742000 1.767100 1.059200 1.043400 -1.801100 10.925000 6.952400 0.116600 -11.561000 -84.295800 -0.000100 -24.446600 0.000000 -2.675000 -2.803400 7.113500 -7.744200 -5.543800 -7.736200 12.703900 30.344600 83.463500 -0.000100 24.612500 0.000000 9.955100 -3.830000 -3.008400 +-23.734776 87.536020 -223.866202 44.614700 -83.198000 46.879100 -6.528900 5.422600 -7.008200 13.835100 0.000000 0.000000 -10.044400 4.715100 11.330500 -13.999200 0.000000 0.000000 -28.634700 3.413600 -7.557600 64.279100 0.000000 0.000000 -4.191600 -1.399800 -0.358700 -16.510200 0.000000 0.000000 -5.652300 1.569200 -2.760600 1.568100 -2.954500 -1.323100 13.110000 9.105500 -0.434900 1.338300 1.213100 1.036800 -2.676300 10.156300 7.393500 -0.906400 -14.709100 -84.342700 -0.000100 -29.953000 0.000000 -2.598100 -2.987000 7.379000 -6.893800 -6.440100 -7.458000 13.931400 28.987400 83.341600 -0.000100 23.255200 0.000000 9.109000 -3.776200 -3.166200 +-26.708100 87.432642 -223.515936 39.249400 -82.487600 41.184800 -3.919600 4.854600 -6.769500 12.640100 0.000000 0.000000 -11.270400 3.993200 11.049600 -13.896500 0.000000 0.000000 -30.698000 4.204500 -6.499500 57.007900 0.000000 0.000000 -6.147500 -3.540100 -0.955200 -15.892000 0.000000 0.000000 -5.578200 1.274300 -2.782200 1.802100 -3.241400 -0.658200 13.309000 8.827000 -0.302200 0.730600 1.315600 1.061900 -2.798200 9.812500 7.566300 -3.067000 -17.708400 -84.116900 -0.000100 -34.920600 0.000000 -2.446100 -3.369300 7.445000 -6.749800 -6.825900 -7.307900 15.313300 27.318700 83.348300 -0.000100 21.535700 0.000000 8.914000 -4.069300 -3.132000 +-29.720540 87.205820 -223.132142 37.459400 -81.929600 39.290100 -1.530800 3.874000 -6.776200 11.514800 0.000000 0.000000 -12.432400 4.171900 11.128500 -14.190300 0.000000 0.000000 -32.107000 4.682600 -5.854500 48.060900 0.000000 0.000000 -6.649500 -5.182600 -1.200600 -16.015900 0.000000 0.000000 -5.647900 1.111500 -2.820700 2.042900 -3.416400 -0.169000 13.397600 8.710100 -0.253300 0.144100 1.403900 0.989800 -3.116800 9.559000 7.696600 -4.912800 -19.973400 -83.676100 -0.000200 -39.539900 -0.000100 -2.037900 -3.296000 7.434400 -6.542200 -6.996700 -7.310000 16.092400 26.003900 83.549900 -0.000100 19.440600 0.000000 8.528700 -4.619700 -3.276400 +-32.797750 86.855046 -222.757746 37.919500 -81.523300 39.647700 0.479400 3.242700 -6.730900 11.062200 0.000000 0.000000 -13.940900 4.346000 11.139000 -13.740500 0.000000 0.000000 -32.860500 4.091500 -5.426300 37.903900 0.000000 0.000000 -5.961400 -6.053900 -0.988700 -14.970800 0.000000 0.000000 -5.768600 1.105400 -2.728400 2.108800 -3.476000 0.160300 13.414700 8.618800 -0.242000 -0.236400 1.516900 0.929400 -3.270200 9.170400 7.868900 -6.613700 -21.354800 -83.266900 -0.000200 -43.641800 -0.000100 -1.728900 -3.148800 7.610800 -6.567800 -6.938700 -7.313000 16.970000 24.389300 83.677100 -0.000100 17.483400 0.000000 9.428900 -5.548200 -2.232600 +-36.017454 86.390988 -222.418402 38.587900 -81.085500 40.154700 2.472100 3.051700 -6.533300 10.794900 0.000000 0.000000 -15.415400 4.131100 11.374600 -13.891100 0.000000 0.000000 -33.009100 1.681700 -5.205700 27.205800 0.000000 0.000000 -4.073100 -4.091900 0.139900 -14.919100 0.000000 0.000000 -5.859500 1.006500 -2.707700 2.065000 -3.603800 0.728600 13.192100 8.815900 -0.389300 -0.342200 1.492600 0.911300 -3.433200 9.137900 7.920100 -8.106900 -22.479500 -82.897500 -0.000200 -46.914900 -0.000100 -1.827300 -2.969600 7.783800 -6.549300 -7.009700 -7.466900 17.560400 24.025100 83.594100 -0.000100 15.392000 0.000000 9.455600 -5.523900 -2.506100 +-39.426388 85.844380 -222.068390 37.131500 -80.604600 38.706600 4.875700 3.388300 -6.388100 10.540100 0.000000 0.000000 -16.646800 3.323100 11.769000 -14.050200 0.000000 0.000000 -32.493400 -1.909300 -5.127600 17.183900 0.000000 0.000000 -1.525700 1.497800 2.358400 -15.395200 0.000000 0.000000 -5.900700 0.832600 -2.659000 2.165000 -3.788400 1.006100 13.059600 8.807800 -0.328400 -0.788800 1.618300 0.671000 -3.628900 8.854700 8.052500 -9.184400 -22.862200 -82.681100 -0.000200 -49.453700 -0.000100 -4.775700 -4.207700 6.377400 -6.469500 -7.050200 -7.440400 18.164600 23.054300 83.323700 -0.000100 14.193700 0.000000 9.671700 -5.598500 -2.532700 +-43.042840 85.317838 -221.780354 34.397800 -79.866900 35.973900 7.118000 4.139400 -5.962600 11.030700 0.000000 0.000000 -17.562300 1.865900 11.268500 -14.504700 0.000000 0.000000 -31.402400 -3.596500 -4.869300 9.073900 0.000000 0.000000 -0.223300 7.201300 5.432400 -16.060900 0.000000 0.000000 -6.084200 0.588000 -2.752300 2.355600 -4.026800 1.442200 13.073800 8.489300 -0.016900 -1.299000 1.894800 0.074200 -3.729100 8.435000 8.034100 -10.034300 -23.088900 -82.624400 -0.000300 -50.821200 -0.000100 -4.582200 -4.046200 6.832300 -6.448600 -7.143100 -7.280800 18.925500 22.032600 82.784700 -0.000100 13.750000 0.000000 9.503000 -5.595500 -2.938100 +-46.890940 84.843620 -221.523560 30.969100 -78.956300 32.567800 8.728800 4.466600 -5.312100 13.071900 0.000000 0.000000 -18.121100 0.558600 10.931400 -15.222400 0.000000 0.000000 -30.794900 -3.113300 -4.590300 6.914500 0.000000 0.000000 -2.702800 8.201100 5.684100 -15.929300 0.000000 0.000000 -6.222300 0.314600 -2.861000 2.334000 -4.272900 1.892800 12.980200 8.340900 0.001400 -1.117600 1.805800 0.191400 -3.958400 8.132200 8.170300 -10.438500 -23.425000 -82.963100 -0.000300 -50.848500 -0.000100 -4.553400 -4.031900 6.907300 -6.443100 -7.449800 -7.256600 19.555300 21.410400 82.269400 -0.000100 13.678800 0.000000 9.359400 -5.458500 -3.271400 +-50.875184 84.483194 -221.383606 29.844700 -78.130100 30.863000 9.181100 4.583000 -3.913300 16.771200 0.000000 0.000000 -18.373300 -0.145000 11.164900 -17.102000 0.000000 0.000000 -31.587200 -3.187000 -3.798600 11.404400 0.000000 0.000000 -2.331100 6.890700 5.355300 -16.163600 0.000000 0.000000 -6.381500 0.180600 -2.419700 1.794400 -4.474300 2.352700 12.867700 8.338800 0.090800 -0.513300 1.661700 0.068700 -4.176900 7.937600 8.203100 -9.892900 -23.595800 -83.221700 -0.000300 -50.345900 -0.000100 -4.253600 -3.746600 6.721700 -6.466900 -7.592000 -7.218700 20.204900 20.891800 81.801000 -0.000100 14.152900 0.000000 9.467000 -5.447500 -3.247200 +-55.118254 84.194396 -221.259908 29.049200 -77.197400 29.290800 8.592100 4.554900 -2.155800 22.370500 0.000000 0.000000 -17.354500 -0.640400 11.365700 -20.866800 0.000000 0.000000 -31.531400 -2.560700 -2.951700 15.652300 0.000000 0.000000 -0.560900 5.756500 8.037400 -17.157300 0.000000 0.000000 -6.927600 0.008100 -1.776400 1.441200 -4.792500 2.800700 12.725800 8.504100 0.195500 0.063000 1.521500 -0.353300 -4.159300 7.928400 8.153600 -8.788300 -23.593800 -83.453500 -0.000200 -49.441400 -0.000100 -3.252400 -3.549300 6.808000 -6.618500 -7.649400 -7.348000 20.528100 21.146400 81.522600 -0.000100 14.634500 0.000000 9.472800 -5.290700 -3.204400 +-59.451240 84.142834 -221.398846 28.222700 -76.659100 26.537800 6.364000 5.247200 1.195700 31.039600 0.000000 0.000000 -14.618400 -1.503600 10.473700 -23.995300 0.000000 0.000000 -30.981200 -1.633300 -0.692700 19.825000 0.000000 0.000000 -0.183600 4.648100 8.092200 -15.675800 0.000000 0.000000 -7.112500 0.146700 -0.697800 0.941200 -4.967000 4.113300 12.367000 8.633100 0.124500 1.005900 1.311200 -0.755900 -3.765700 8.301500 7.712500 -7.722500 -23.971000 -83.708800 -0.000200 -47.621000 -0.000100 -2.846900 -3.605000 6.734200 -6.696800 -7.825100 -7.309700 20.505600 22.038600 80.945600 -0.000100 15.153800 0.000000 8.899300 -5.094300 -3.488900 +-63.739776 84.328508 -221.585536 26.648800 -77.235100 22.820200 2.938100 6.307400 4.899800 41.995100 0.000000 0.000000 -8.503300 -1.892900 8.589200 -29.460500 0.000000 0.000000 -29.750100 -3.091200 2.058000 24.263600 0.000000 0.000000 -2.773400 5.875000 3.590700 -15.565900 0.000000 0.000000 -7.043800 0.779900 0.348600 0.997700 -4.750100 5.744800 11.900200 8.650400 0.437500 2.111900 1.384300 -1.633400 -3.689300 8.597700 7.797900 -6.465900 -23.581900 -84.939600 -0.000200 -44.759100 -0.000100 -1.992500 -3.229900 6.675700 -6.841800 -7.529500 -7.115500 19.712600 23.081400 80.378900 -0.000100 15.391900 0.000000 8.343800 -4.721400 -3.560700 +-67.419982 84.628482 -221.492318 26.227600 -77.313300 21.844500 -2.455500 6.086500 6.583600 54.118300 0.000000 0.000000 -2.392500 -0.864300 6.658600 -24.607800 0.000000 0.000000 -27.831600 -2.909200 3.285400 25.804600 0.000000 0.000000 -5.332900 5.350200 1.257600 -15.314200 0.000000 0.000000 -6.794200 1.108100 0.443400 0.535200 -4.500500 6.489200 11.869400 8.800200 0.624500 2.425800 1.423100 -1.918400 -3.593100 8.824600 8.375300 -5.288500 -22.258800 -86.879300 -0.000200 -41.045400 -0.000100 -1.164200 -2.957400 6.766400 -6.977700 -6.672700 -6.929800 18.150000 24.330100 80.026800 -0.000100 15.694800 0.000000 8.571300 -4.760000 -3.589100 +-70.928484 85.153500 -221.341696 22.502300 -76.211400 17.695000 -8.157600 4.589000 7.972800 64.347200 0.000000 0.000000 5.593700 0.858800 4.958700 -15.510800 0.000000 0.000000 -24.454600 -3.983100 3.780300 25.160900 0.000000 0.000000 -7.560600 5.001700 0.588600 -15.047400 0.000000 0.000000 -6.554200 1.214200 0.590500 0.429200 -4.513600 6.685300 12.125500 8.512300 0.864000 2.325100 1.067400 -1.679400 -3.583900 8.638400 8.502700 -4.098500 -21.517900 -87.982300 -0.000200 -36.665700 -0.000100 -1.200200 -2.823300 6.676600 -7.411400 -6.602400 -6.520500 16.108200 25.583700 79.624600 -0.000100 15.919600 0.000000 8.603700 -4.119900 -4.177100 +-74.303636 85.821266 -221.121732 18.753300 -74.766700 13.627800 -13.710700 3.129700 9.015200 71.761700 0.000000 0.000000 13.588500 1.839200 4.111200 -15.006800 0.000000 0.000000 -20.530300 -5.694200 4.065400 23.444900 0.000000 0.000000 -8.891900 5.224100 -0.117900 -15.072300 0.000000 0.000000 -6.473500 1.400500 0.771400 0.627400 -4.452100 6.638900 12.403300 7.945900 0.874400 2.288600 0.572700 -1.069400 -3.459400 8.807100 8.343700 -3.476900 -21.535100 -88.549500 -0.000100 -31.621100 0.000000 -0.524700 -2.293500 6.320300 -7.915100 -6.505000 -6.418700 13.743600 26.144900 79.698300 -0.000100 16.915900 0.000000 9.026400 -4.267100 -4.949400 +-77.702918 86.471506 -220.722698 13.629700 -74.158600 8.748600 -17.350200 3.019500 9.487200 75.730800 0.000000 0.000000 14.115600 1.895000 3.977800 -15.122900 0.000000 0.000000 -15.370000 -6.473700 4.245000 20.536200 0.000000 0.000000 -9.745500 5.526800 -0.248600 -15.006100 0.000000 0.000000 -6.413900 2.183700 1.305400 1.711400 -3.954400 5.433500 12.501900 7.082100 0.931900 2.443700 0.200100 -0.176300 -3.694100 8.729100 8.518700 -2.111200 -20.894600 -88.540100 -0.000100 -27.262200 0.000000 1.223400 -1.438600 6.105200 -8.367800 -6.202500 -6.326600 11.060300 26.230500 80.195800 -0.000100 18.545400 0.000000 8.941700 -3.817200 -5.690000 +-80.762856 86.974172 -220.308170 11.951100 -73.744200 7.434600 -21.571400 3.366600 9.669600 77.324900 0.000000 0.000000 10.928000 0.289000 5.207700 -14.780800 0.000000 0.000000 -11.468600 -7.129300 4.238300 17.909600 0.000000 0.000000 -10.290300 6.125900 -0.428300 -14.668500 0.000000 0.000000 -6.229900 2.908300 1.602100 1.640800 -3.389000 4.342900 12.995800 6.669300 0.798800 2.304100 -0.113900 0.256100 -3.253500 9.018700 8.529300 -0.493300 -19.088500 -88.182400 -0.000100 -23.763100 0.000000 2.646700 -0.604200 6.657600 -9.182700 -5.173200 -6.435400 9.610900 26.579000 80.193200 -0.000100 21.270300 0.000000 8.330100 -3.546300 -6.008900 +-83.720940 87.318088 -219.870528 11.208600 -73.369600 6.931400 -25.587200 3.785300 9.765200 76.406900 0.000000 0.000000 6.719600 -1.177700 7.165500 -15.273600 0.000000 0.000000 -7.852400 -7.981000 4.317400 15.231500 0.000000 0.000000 -10.595800 6.980300 -0.706000 -14.793400 0.000000 0.000000 -6.138100 3.497700 1.567500 1.666200 -2.847200 4.058400 13.186400 6.719700 0.179800 2.091200 -0.813400 0.659400 -2.826300 9.657100 7.980500 1.633200 -16.837400 -87.142700 -0.000100 -21.264300 0.000000 1.459400 -0.998500 6.391600 -9.693000 -4.332200 -6.752400 7.966700 27.859600 79.447700 -0.000100 24.475300 0.000000 8.668200 -3.350000 -6.006200 +-86.569550 87.470488 -219.364560 10.802800 -72.921700 6.808700 -28.983900 4.303900 9.519700 72.898700 0.000000 0.000000 1.593200 -0.671400 7.898900 -15.463900 0.000000 0.000000 -4.584100 -10.233900 4.201100 13.113600 0.000000 0.000000 -11.265600 8.991500 -0.881800 -14.766700 0.000000 0.000000 -6.077000 4.018400 1.630700 1.843500 -2.390300 3.387100 13.290600 6.302100 0.134200 1.383400 -1.026300 0.443200 -2.595600 10.187800 7.643600 3.914600 -14.128800 -85.934200 -0.000100 -19.310700 0.000000 0.927600 -1.017800 6.645200 -10.117800 -3.760000 -6.695900 6.266000 29.244600 78.157400 -0.000100 27.802800 0.000000 9.148100 -3.321300 -6.656100 +-89.282524 87.483188 -218.800426 10.760800 -72.336500 7.083400 -31.564200 4.924700 8.932800 66.562700 0.000000 0.000000 -3.347000 1.316500 9.119400 -15.835200 0.000000 0.000000 -1.548300 -10.255800 4.249800 10.716100 0.000000 0.000000 -11.938000 8.704300 -0.328200 -14.556100 0.000000 0.000000 -5.949300 4.342200 1.419600 1.991400 -2.072500 3.087400 13.259700 6.097800 -0.076500 0.738000 -1.342900 0.356100 -2.309600 10.687700 7.292800 5.964300 -11.425200 -84.782200 -0.000100 -17.465000 0.000000 0.834300 -0.974000 6.950800 -10.958800 -2.899100 -6.690400 5.218500 30.010000 76.575700 -0.000100 31.195500 0.000000 9.576800 -3.341400 -7.369600 +-91.887294 87.384382 -218.120214 11.489600 -71.907500 8.197600 -33.132200 5.901400 8.112600 57.278300 0.000000 0.000000 -4.016400 3.541700 9.560200 -15.268600 0.000000 0.000000 0.260600 -10.810500 3.945300 10.230000 0.000000 0.000000 -13.123900 8.970400 -0.365500 -14.758300 0.000000 0.000000 -5.728900 4.696500 1.191400 1.835300 -1.708100 2.684900 13.151100 5.952100 -0.319600 0.252500 -1.715800 0.565700 -1.795400 11.272400 7.165100 7.507200 -9.232600 -83.839200 -0.000100 -15.439200 0.000000 -0.584600 -1.023700 7.200900 -12.006700 -2.124300 -6.797700 4.359400 30.156800 75.280700 -0.000100 34.238600 0.000000 10.332400 -3.356600 -7.710300 +-94.445836 87.194390 -217.393012 12.835200 -71.621900 9.733200 -33.704400 7.164200 7.445700 45.945300 0.000000 0.000000 -2.387000 4.993700 8.557800 -14.716300 0.000000 0.000000 1.478900 -10.734200 3.744100 10.472500 0.000000 0.000000 -14.380000 8.726300 -0.512500 -14.742200 0.000000 0.000000 -5.736400 5.057000 0.936600 1.837000 -1.292300 2.568200 13.193300 5.700100 -0.407100 -0.507000 -2.046900 0.406000 -1.900200 11.221300 6.993500 9.689600 -5.979200 -83.030500 -0.000100 -13.774800 0.000000 -0.357500 -1.123700 7.619500 -12.503600 -1.350000 -6.955600 2.861200 29.720700 74.278500 -0.000200 36.864100 0.000100 10.552400 -3.417100 -8.046900 +-97.120710 86.920070 -216.572592 13.580100 -71.491500 10.336100 -33.242100 9.179500 7.083200 33.855500 0.000000 0.000000 -1.159700 5.827700 6.764100 -14.454100 0.000000 0.000000 3.144500 -10.912400 3.834300 10.537400 0.000000 0.000000 -15.385100 8.983900 -0.317900 -14.959100 0.000000 0.000000 -5.682400 5.302400 0.836200 1.952800 -0.997300 2.668600 13.218700 5.643900 -0.546800 -1.173000 -2.211400 0.365000 -1.601000 11.554400 6.791600 11.100000 -3.046600 -82.297000 0.000000 -12.110800 0.000000 3.052600 0.102300 7.997200 -13.021100 -0.703300 -7.029900 1.747700 29.662700 73.201800 -0.000200 39.332600 0.000100 10.634000 -3.473900 -8.183600 +-99.847146 86.572598 -215.656668 15.566200 -71.200200 11.867800 -32.925900 12.172700 6.771600 22.279100 0.000000 0.000000 -1.116100 5.101200 5.914700 -14.604100 0.000000 0.000000 4.345600 -11.117000 4.085700 10.858900 0.000000 0.000000 -16.265900 9.225200 0.031600 -15.597200 0.000000 0.000000 -5.916300 5.342300 0.794700 1.736100 -0.820500 2.883000 13.260800 5.624900 -0.662900 -1.475700 -2.116800 0.431500 -1.306600 11.931000 6.703900 12.408500 -0.547600 -81.760900 0.000000 -10.429300 0.000000 2.001000 -0.406700 8.391400 -13.525300 -0.247100 -7.004100 0.786700 30.106300 72.340000 -0.000200 40.969700 0.000100 10.913200 -3.449300 -8.675400 +-102.780592 86.195154 -214.509858 16.318400 -70.882100 12.374100 -31.724500 15.801600 5.874400 11.752500 0.000000 0.000000 -0.896500 4.362100 4.753400 -14.707500 0.000000 0.000000 6.179900 -11.882200 4.077100 11.026200 0.000000 0.000000 -16.904500 9.913500 0.600700 -16.506600 0.000000 0.000000 -6.113000 5.334100 0.639600 1.782400 -0.760000 3.033300 13.200700 5.728200 -0.747200 -1.526300 -2.148100 0.547100 -1.257400 12.108900 6.733300 13.855900 2.012000 -81.400200 0.000000 -9.275200 0.000000 1.900500 0.075500 8.504800 -13.824500 -0.102600 -6.954200 -0.118000 30.597400 71.863900 -0.000200 42.289400 0.000100 11.429100 -3.949300 -9.038100 +-105.873550 85.804248 -213.165436 16.729900 -70.729100 12.614200 -30.242900 18.071500 4.753000 4.259400 0.000000 0.000000 -0.777600 3.867300 3.896900 -14.598000 0.000000 0.000000 7.680700 -12.407400 3.774100 12.230800 0.000000 0.000000 -17.359100 10.544400 1.122300 -18.008900 0.000000 0.000000 -6.422300 5.426300 0.554600 2.033800 -0.635000 2.989000 13.077600 5.806900 -0.712600 -1.612100 -2.074300 0.497200 -1.160400 12.144700 6.795000 14.989300 4.381300 -81.169000 0.000000 -8.420200 0.000000 0.699100 -0.067300 8.902000 -13.845900 -0.099400 -6.909600 -0.853800 30.515400 71.918800 -0.000200 43.386900 0.000100 11.849300 -3.889100 -9.052600 +-109.103668 85.397594 -211.749640 16.781900 -70.589400 12.553100 -30.357800 18.708000 4.334200 4.868700 0.000000 0.000000 -1.520000 3.334700 2.217200 -15.508400 0.000000 0.000000 8.830000 -12.191600 3.358500 14.380600 0.000000 0.000000 -17.561600 10.564500 1.254100 -20.188000 0.000000 0.000000 -6.575500 5.484400 0.340300 2.124500 -0.535200 2.859000 12.514900 6.390500 -0.604500 -1.422400 -1.348400 0.382800 -1.002500 12.232100 6.954300 15.756100 5.982700 -81.021400 0.000000 -7.682300 0.000000 0.152200 -0.237300 9.228500 -13.725500 -0.105900 -6.921000 -1.134700 30.199000 72.573700 -0.000200 44.278500 0.000100 12.342900 -3.951400 -8.786600 +-112.398302 85.063584 -210.161886 16.924500 -70.104700 12.962900 -30.992300 16.623200 3.683200 10.052400 0.000000 0.000000 -1.135400 3.275300 4.589200 -14.770500 0.000000 0.000000 9.248800 -12.047600 2.375100 17.619600 0.000000 0.000000 -17.262100 10.615300 1.591600 -22.002200 0.000000 0.000000 -6.595700 5.421600 -0.087000 1.828100 -0.450500 2.275700 12.314700 7.038000 -0.366500 -1.681300 -0.823200 0.455500 -0.944800 12.126800 7.018900 16.394000 7.095800 -80.738900 0.000000 -7.403800 0.000000 0.092400 -0.291900 9.393700 -13.343400 -0.317000 -6.673300 -0.626300 29.974000 73.245200 -0.000200 44.937400 0.000100 12.978900 -4.006500 -8.918600 +-115.809522 84.835238 -208.198466 18.398200 -69.983600 15.526100 -30.603900 12.770900 1.932900 13.296400 0.000000 0.000000 0.267800 5.337500 4.104300 -14.896800 0.000000 0.000000 8.297000 -11.983700 -0.070500 22.329800 0.000000 0.000000 -15.766900 11.394500 2.197100 -27.607500 0.000000 0.000000 -6.931900 5.523700 -0.738000 1.311900 0.044600 0.858500 11.984200 8.188400 -0.101500 -1.797100 -0.227300 0.949500 -1.054200 12.219800 7.105100 16.848500 7.421600 -80.358600 0.000000 -7.394700 0.000000 -0.319300 -0.356200 9.533400 -12.555200 -0.901000 -6.203100 0.494400 30.632900 73.741400 -0.000200 45.085100 0.000100 13.170700 -3.970100 -9.127300 +-119.084344 84.889594 -206.090266 19.722900 -69.635500 18.631500 -30.554100 10.358300 -0.198800 17.605600 0.000000 0.000000 1.123200 8.465100 2.824700 -14.522800 0.000000 0.000000 5.384700 -11.496000 -3.531100 29.819600 0.000000 0.000000 -11.972700 12.046700 2.717900 -35.563500 0.000000 0.000000 -6.970400 5.564500 -1.529000 0.553900 0.493100 -1.342000 11.413100 9.386100 0.369800 -1.547100 0.661100 1.304700 -0.921300 12.426200 7.239300 16.178500 7.261800 -80.044300 0.000000 -7.309800 0.000000 -0.404600 -0.348500 9.305600 -12.277500 -1.431900 -5.617800 2.496700 31.673000 74.577000 -0.000200 44.128100 0.000100 13.833800 -4.019300 -9.302000 +-122.199146 85.160104 -203.985622 19.160400 -68.938000 19.808900 -29.856300 11.697200 -2.269400 21.692700 0.000000 0.000000 -0.429900 6.975700 6.814600 -14.361300 0.000000 0.000000 1.175900 -9.916400 -6.846300 40.119300 0.000000 0.000000 -6.066100 12.292000 3.976500 -40.116200 0.000000 0.000000 -6.872400 5.460000 -2.052800 0.419600 0.686200 -3.338200 11.350400 10.374000 0.186100 -2.134400 1.475700 1.842100 -1.184500 12.029400 7.627600 15.015100 6.047400 -80.441000 0.000000 -7.065600 0.000000 -0.310700 -0.215100 8.873900 -11.665800 -1.583300 -5.916800 3.528300 32.085800 76.692900 -0.000200 41.902100 0.000100 14.460000 -4.195200 -8.350300 +-125.012704 85.523578 -202.172570 18.500200 -68.640200 19.530200 -27.939700 11.758700 -3.335200 22.875400 0.000000 0.000000 -2.390300 6.929100 9.054300 -14.187100 0.000000 0.000000 -3.932600 -6.438800 -8.016800 51.736300 0.000000 0.000000 -0.689300 11.017200 4.713600 -31.647700 0.000000 0.000000 -6.535900 5.356100 -2.140200 0.202700 0.656600 -3.546800 11.434600 11.707100 -0.484700 -2.411100 2.375100 1.458400 -1.185900 11.984900 7.462300 13.018800 3.983300 -81.283100 0.000000 -7.321900 0.000000 -0.216000 -0.258000 8.438600 -11.571600 -1.409500 -6.805000 4.557500 33.015400 78.697200 -0.000200 38.827400 0.000100 14.313000 -4.451100 -5.875500 +-127.558038 85.996526 -200.436988 18.560400 -68.961500 20.085000 -25.413000 11.803600 -4.391800 22.612600 0.000000 0.000000 -4.195700 7.484900 10.117100 -14.076600 0.000000 0.000000 -9.679500 -2.371000 -8.745700 61.698400 0.000000 0.000000 6.220000 10.054400 5.217400 -18.284100 0.000000 0.000000 -6.186300 5.309800 -2.450500 -0.110800 0.702100 -3.344400 11.732300 12.800300 -0.956800 -2.373700 3.663900 0.770200 -1.438100 12.126100 7.086000 11.104300 1.226300 -82.254900 0.000000 -8.561700 0.000000 -0.186600 -0.436600 8.234400 -11.187200 -1.397300 -7.129200 5.253600 34.971400 79.679200 -0.000100 35.387300 0.000000 13.751400 -4.728800 -3.727900 +-130.077210 86.510114 -198.848980 18.093100 -68.740000 19.600100 -22.933300 11.494300 -4.963600 22.140600 0.000000 0.000000 -5.824200 7.316200 10.161300 -13.799200 0.000000 0.000000 -14.773600 0.509500 -8.474900 68.651200 0.000000 0.000000 7.609300 7.895000 7.579800 -15.930400 0.000000 0.000000 -6.026900 5.056000 -2.367200 -0.391700 0.451500 -3.178400 12.238500 13.436100 -1.016000 -2.275000 4.972100 0.224100 -1.246500 11.993500 6.997700 8.623200 -2.947700 -83.273500 0.000000 -10.615200 0.000000 0.467300 -0.615200 7.564000 -10.842800 -1.530000 -7.150500 6.507700 36.203400 80.362500 -0.000100 32.473600 0.000000 13.809800 -4.863200 -2.701000 +-132.678424 87.000842 -197.229730 15.876100 -67.692400 17.270800 -19.695800 9.851400 -5.770300 20.730900 0.000000 0.000000 -6.962900 7.415200 10.437500 -13.900600 0.000000 0.000000 -18.754300 1.595200 -8.226700 72.277800 0.000000 0.000000 4.586900 6.269800 6.297900 -16.378400 0.000000 0.000000 -6.003100 4.378100 -2.392300 -0.142700 -0.224400 -2.467900 12.793400 13.491900 -1.184700 -2.208300 6.379700 -0.085600 -1.400300 11.572900 6.836700 6.511100 -7.322600 -84.105700 -0.000100 -13.882400 0.000000 0.522400 -0.915500 6.626600 -10.231300 -1.955200 -7.314700 7.719400 36.538500 80.879800 -0.000100 30.038000 0.000000 13.928200 -4.908900 -3.138200 +-135.235950 87.392510 -195.614544 12.736500 -66.330600 14.093900 -15.932900 8.090300 -6.541900 18.851200 0.000000 0.000000 -7.890800 7.272600 10.558200 -13.821400 0.000000 0.000000 -22.133900 1.862900 -8.263700 73.202200 0.000000 0.000000 2.532600 5.391000 3.974700 -16.563300 0.000000 0.000000 -5.629700 3.546800 -2.645000 0.189600 -1.030700 -1.359000 13.116200 13.569000 -1.291000 -1.816300 7.263800 -0.404700 -1.611700 11.240500 6.669800 4.262100 -11.264500 -84.803800 -0.000100 -17.872200 0.000000 0.083900 -1.396300 6.078900 -9.534500 -2.580100 -7.570600 9.056000 35.572800 81.166000 -0.000100 28.115300 0.000000 13.683500 -4.861800 -3.294500 +-137.599674 87.660226 -194.059556 11.410000 -64.583000 12.668800 -13.041800 7.089300 -7.127900 17.198900 0.000000 0.000000 -8.633000 6.287600 11.096300 -13.823200 0.000000 0.000000 -25.808700 1.867700 -8.407500 71.724000 0.000000 0.000000 0.388000 3.711700 2.212700 -16.835500 0.000000 0.000000 -5.655300 2.732200 -2.512900 0.372200 -1.862900 -1.189000 13.503400 13.449100 -0.925200 -2.063700 7.916700 -0.684300 -2.155600 10.691800 7.136100 1.956900 -14.642900 -85.394700 -0.000100 -22.120000 0.000000 -2.042200 -2.263800 5.839200 -8.905200 -3.367400 -7.357700 10.482000 33.492100 81.356700 -0.000100 26.411100 0.000000 13.214700 -4.764700 -3.129300 +-139.995656 87.799926 -192.574926 10.179300 -62.962900 11.224900 -10.250600 6.410200 -7.281700 15.846600 0.000000 0.000000 -9.591800 4.970400 11.172600 -13.829700 0.000000 0.000000 -28.566600 1.918600 -8.223600 67.687300 0.000000 0.000000 -2.794400 1.425400 1.012800 -16.470300 0.000000 0.000000 -5.811000 2.051000 -2.705900 0.934000 -2.546300 -0.280500 13.682600 13.181900 -0.717600 -2.076000 8.266100 -1.007700 -2.046600 10.275600 7.158500 -1.325900 -18.010400 -85.695900 -0.000100 -26.135100 0.000000 -4.032000 -3.081200 6.792700 -8.703700 -3.883100 -7.248700 12.354300 30.934300 81.296700 -0.000100 24.711700 0.000000 12.756100 -4.946100 -3.176900 +-142.439644 87.841074 -191.206120 9.730000 -62.174800 10.652900 -7.733600 6.321800 -7.263700 14.848200 0.000000 0.000000 -10.641200 3.922500 11.103500 -14.014700 0.000000 0.000000 -30.679000 2.854600 -7.553600 61.266200 0.000000 0.000000 -5.334200 -0.664300 0.337900 -15.716800 0.000000 0.000000 -5.898400 1.965700 -3.039800 1.165100 -2.608600 0.483400 14.043300 12.679400 -0.398600 -2.425400 8.567900 -1.253500 -2.598100 9.429600 7.346100 -3.736700 -21.146600 -85.526700 -0.000100 -29.973200 0.000000 -3.422200 -3.037500 6.613500 -8.196400 -4.661600 -7.037900 13.730800 28.394100 81.415700 -0.000100 22.534400 0.000000 12.619300 -5.062300 -3.497100 +-144.785842 87.735664 -189.877192 9.069200 -60.792500 9.584200 -5.996100 6.333000 -6.843600 15.304900 0.000000 0.000000 -12.275100 2.382200 11.363300 -13.929900 0.000000 0.000000 -31.832300 2.788600 -6.997100 52.807200 0.000000 0.000000 -6.305400 -3.186600 0.143100 -15.241000 0.000000 0.000000 -5.609700 1.429300 -3.100600 1.146200 -3.114600 1.334300 14.111000 12.432900 -0.364900 -2.522000 8.942400 -1.346000 -3.318800 8.956000 7.676700 -6.309400 -23.489100 -85.638600 -0.000100 -33.021800 0.000000 -3.222100 -3.377200 6.519400 -7.905000 -5.154600 -7.163000 14.809400 26.431100 81.812300 -0.000100 19.924300 0.000000 10.703200 -4.967200 -4.650200 +-147.278090 87.540338 -188.376814 9.046500 -60.544100 9.552800 -3.773100 6.311300 -6.919500 14.834400 0.000000 0.000000 -13.667500 1.967700 11.603700 -14.121900 0.000000 0.000000 -32.235900 3.030200 -6.529900 42.948400 0.000000 0.000000 -5.721700 -6.284000 0.196800 -14.928100 0.000000 0.000000 -5.755900 1.451900 -2.995400 1.263900 -3.125500 1.418800 14.363500 12.469500 -0.241300 -2.728000 9.307900 -1.421800 -3.999600 8.391300 8.084300 -8.201600 -24.877400 -85.451500 -0.000200 -36.175500 -0.000100 -2.664200 -3.420800 6.371900 -7.270000 -5.485500 -7.047800 15.500200 25.441800 82.172600 -0.000100 17.026500 0.000000 10.400100 -5.018800 -4.768300 +-149.786340 87.208614 -186.767978 8.889300 -60.580800 9.773800 -1.349100 5.694800 -7.489000 14.248700 0.000000 0.000000 -15.044100 2.393100 11.677400 -13.839000 0.000000 0.000000 -32.220100 1.990300 -6.631700 33.022600 0.000000 0.000000 -4.399800 -5.702300 0.031900 -14.993400 0.000000 0.000000 -5.800400 1.459700 -2.950900 1.460700 -3.140800 1.281000 14.396800 12.479100 -0.302400 -2.724000 9.865600 -1.528000 -3.732200 8.475800 8.096400 -10.590900 -26.125200 -84.872500 -0.000200 -39.295800 -0.000100 -2.788100 -3.399700 6.721000 -7.248800 -5.546700 -7.065500 16.397600 25.075300 82.493400 -0.000100 14.137400 0.000000 11.054500 -5.417300 -3.702900 +-152.459436 86.754970 -185.198766 8.872400 -60.282100 9.785600 0.717100 5.343900 -7.538000 14.296400 0.000000 0.000000 -16.626400 2.158500 11.605600 -13.906800 0.000000 0.000000 -32.009300 -1.060700 -6.562100 23.435300 0.000000 0.000000 -2.696300 -1.560100 1.768600 -15.132700 0.000000 0.000000 -5.832200 1.285400 -2.838800 1.407300 -3.327300 1.404000 14.436000 12.668300 -0.362400 -2.676300 10.025200 -1.749500 -4.175700 8.123700 8.283600 -11.295700 -26.189900 -84.323500 -0.000200 -42.458500 -0.000100 -3.412900 -3.575600 6.528600 -6.844900 -5.908300 -7.076700 17.096400 25.231500 82.513000 0.000000 12.028200 0.000000 11.708400 -5.909200 -2.802300 +-155.266898 86.253574 -183.601106 8.813900 -59.994600 9.756000 2.883100 5.432600 -7.501000 14.468400 0.000000 0.000000 -18.086000 1.823300 12.048900 -14.079500 0.000000 0.000000 -31.479300 -3.988200 -6.156900 15.012400 0.000000 0.000000 -0.197900 3.788100 4.105400 -16.048300 0.000000 0.000000 -6.122900 1.122600 -2.744300 1.807700 -3.535000 1.560800 14.343900 12.671300 -0.269300 -2.688800 10.295800 -2.227700 -4.058800 8.034700 8.329100 -12.422900 -26.027400 -83.910000 -0.000200 -44.827000 -0.000100 -3.813800 -3.812100 6.640200 -6.612300 -6.252900 -7.022600 17.736000 24.950100 82.387800 0.000000 10.653600 0.000000 11.972400 -6.161400 -2.446800 +-158.312358 85.754718 -181.974744 8.517100 -59.459900 9.436300 5.163200 5.966300 -7.223200 14.911300 0.000000 0.000000 -19.212500 0.986300 12.324000 -14.491100 0.000000 0.000000 -30.175300 -5.376300 -5.457300 8.118400 0.000000 0.000000 1.144400 8.380200 6.532200 -16.004800 0.000000 0.000000 -6.470700 0.765400 -2.970400 2.258700 -3.859400 2.249900 14.175700 12.671800 -0.245600 -2.411500 10.411600 -2.567200 -4.154200 7.902200 8.381300 -12.697700 -25.375800 -83.865600 -0.000200 -46.536400 -0.000100 -4.216400 -3.875300 6.754000 -6.542900 -6.523900 -7.058800 18.597000 23.853900 82.045800 0.000000 10.158500 0.000000 11.687500 -6.177300 -2.358500 +-161.492184 85.329014 -180.353716 8.216000 -58.635500 9.134800 6.816200 6.060300 -6.730000 16.546200 0.000000 0.000000 -19.932600 0.255500 11.799300 -14.915600 0.000000 0.000000 -29.542400 -5.486400 -4.951700 6.269800 0.000000 0.000000 -1.070400 9.927900 9.230100 -15.853900 0.000000 0.000000 -6.615700 0.377300 -3.158100 2.136300 -4.195300 2.623500 14.115700 12.270900 0.098400 -1.895100 10.570800 -2.735200 -3.818800 7.670700 8.535900 -12.759100 -24.626500 -84.113200 -0.000200 -47.233900 -0.000100 -4.947000 -3.952900 6.568300 -6.354000 -7.038800 -6.871100 19.426300 22.169700 81.614100 0.000000 10.278000 0.000000 11.478100 -6.178800 -2.327200 +-164.821616 85.082634 -178.744372 8.243000 -58.076500 8.626300 7.735200 5.963000 -5.600900 19.240300 0.000000 0.000000 -19.804600 -0.159200 11.576900 -17.003100 0.000000 0.000000 -29.822400 -6.620900 -4.144900 9.427500 0.000000 0.000000 -0.393700 11.912600 9.332200 -16.375500 0.000000 0.000000 -6.634200 0.047100 -2.874700 1.569400 -4.439400 3.073800 13.917900 12.286100 0.409900 -1.018100 10.401100 -3.004300 -3.795100 7.754100 8.364100 -11.731200 -24.416800 -84.119000 -0.000200 -47.085900 -0.000100 -5.744700 -3.995600 6.187600 -6.405100 -7.566200 -6.651800 20.282500 20.650300 81.074600 0.000000 10.618800 0.000000 11.411600 -6.224100 -2.196000 +-168.412922 84.951062 -177.070766 8.535800 -57.598500 7.966200 7.925900 6.192900 -3.922200 23.197800 0.000000 0.000000 -18.681900 -0.606900 11.563500 -20.256100 0.000000 0.000000 -29.143600 -5.576900 -2.823100 12.570300 0.000000 0.000000 1.521400 11.536400 8.429600 -17.191600 0.000000 0.000000 -7.110100 -0.178100 -2.358300 1.301000 -4.712100 3.816400 13.583200 12.550600 0.540400 -0.012000 10.119100 -3.351500 -3.741600 7.847800 8.155400 -10.133400 -24.440600 -84.215200 -0.000200 -46.148800 -0.000100 -5.616000 -3.896600 6.076400 -6.291700 -7.936000 -6.753700 20.488100 19.764600 80.878200 0.000000 10.837600 0.000000 11.234500 -6.178200 -2.336400 +-172.159168 84.975446 -175.576484 8.850400 -56.929500 6.358800 6.333100 7.073800 -0.610700 30.131800 0.000000 0.000000 -16.654200 -2.037900 10.589000 -22.529900 0.000000 0.000000 -28.052100 -3.025000 -0.567700 15.135600 0.000000 0.000000 2.418600 9.036800 8.243500 -15.611500 0.000000 0.000000 -7.450000 -0.154200 -1.256600 0.810800 -5.014700 4.849300 13.259900 12.821700 0.509800 0.694800 9.671300 -3.396200 -3.490500 7.717000 7.897400 -8.317600 -24.631100 -84.354900 -0.000200 -44.385900 -0.000100 -5.176800 -3.561700 5.567300 -6.227300 -8.275300 -6.766300 20.620000 18.930800 80.838100 0.000000 11.133300 0.000000 10.927500 -6.055300 -2.521200 +-175.930560 85.290152 -174.219616 8.313600 -57.086000 3.275700 3.310700 8.947200 4.135200 39.446000 0.000000 0.000000 -11.194700 -4.501200 9.052000 -29.160800 0.000000 0.000000 -26.851900 -3.185700 2.576900 18.905500 0.000000 0.000000 0.259600 8.793600 4.747700 -15.504000 0.000000 0.000000 -7.462100 0.354400 -0.038500 0.787500 -5.017100 6.840900 12.792800 13.271400 0.618600 1.745400 9.056700 -4.147300 -3.016500 7.957300 7.553100 -7.303100 -24.625700 -85.312500 -0.000200 -40.851800 -0.000100 -3.679700 -3.336100 5.248300 -6.910700 -7.999800 -6.855600 20.903000 19.013500 80.702200 0.000000 11.046300 0.000000 10.334400 -5.900000 -2.645700 +-179.104798 85.653880 -172.740574 8.054400 -56.806000 2.272900 -1.401400 9.261900 6.970300 50.417700 0.000000 0.000000 -5.614100 -6.005900 4.856700 -21.585100 0.000000 0.000000 -25.176700 -3.840500 3.626000 20.815700 0.000000 0.000000 -2.228200 8.857200 2.398800 -14.856300 0.000000 0.000000 -7.288800 0.651100 0.153900 0.476700 -4.868000 7.720800 12.585900 12.955800 0.800800 2.219800 9.106700 -4.456500 -3.628300 7.940700 8.379700 -5.944600 -23.758100 -87.567400 -0.000200 -35.952000 0.000000 -2.129400 -2.717700 5.031600 -7.253700 -7.310000 -7.009800 19.998000 19.756000 80.972100 0.000000 10.897900 0.000000 10.744300 -6.287600 -2.400700 +-181.866286 86.100920 -171.294552 7.842400 -54.809400 1.726400 -7.248000 7.263900 8.928900 61.114700 0.000000 0.000000 0.317400 -5.915600 3.634600 -11.862300 0.000000 0.000000 -22.535700 -5.680400 3.549700 20.493700 0.000000 0.000000 -4.653300 8.668400 1.985900 -14.246700 0.000000 0.000000 -7.096000 0.622600 0.292900 0.267700 -5.021900 7.700200 12.414000 12.570700 1.110100 2.001700 8.444400 -4.420800 -3.759500 7.586700 8.568000 -5.127700 -22.677300 -88.940200 -0.000100 -30.753800 0.000000 -2.055000 -2.593300 4.685700 -7.630700 -7.267900 -6.736600 18.597000 20.426600 81.045700 0.000000 11.333900 0.000000 10.990800 -6.447400 -2.576400 +-184.478168 86.648798 -169.837100 7.207800 -52.181100 0.942500 -12.955700 4.945800 10.275700 69.131500 0.000000 0.000000 9.985000 -4.715200 1.458700 -11.014500 0.000000 0.000000 -19.340700 -8.058200 3.240600 19.345200 0.000000 0.000000 -6.305700 8.717100 1.997500 -14.026000 0.000000 0.000000 -6.935200 0.624700 0.305700 0.320700 -5.107200 7.693100 12.663900 11.969200 0.892900 1.404100 7.574100 -3.750200 -3.647000 7.417800 8.109400 -4.738800 -22.164800 -89.562200 -0.000100 -25.380700 0.000000 -2.185100 -2.442700 4.389500 -7.960400 -7.228100 -6.728400 17.092700 21.096600 81.295400 0.000000 12.551400 0.000000 10.625800 -6.242400 -3.905200 +-186.781694 87.178642 -168.440862 6.891900 -50.889100 0.877900 -18.337100 4.592900 10.955600 74.649100 0.000000 0.000000 14.662000 -2.169200 1.376400 -12.322400 0.000000 0.000000 -16.420400 -8.641700 3.119800 17.687800 0.000000 0.000000 -7.261800 8.325000 1.871700 -14.022600 0.000000 0.000000 -6.653000 1.445700 0.380100 0.132200 -4.315200 7.182900 12.963700 11.618500 0.578200 0.911600 6.696700 -2.962600 -3.287100 7.496200 7.774600 -4.239400 -21.771200 -89.726200 -0.000100 -21.151100 0.000000 -0.765500 -1.527100 5.051800 -8.295400 -6.900800 -7.023900 15.428100 21.400400 81.787700 -0.000100 14.599600 0.000000 10.131300 -5.826000 -4.275900 diff --git a/data/test/character/bvh/Skeletonzombie_T_Avelange.bvh b/data/test/character/bvh/Skeletonzombie_T_Avelange.bvh new file mode 100755 index 0000000000000000000000000000000000000000..004da612361a8d4c520187f42790fbecfe5e8317 --- /dev/null +++ b/data/test/character/bvh/Skeletonzombie_T_Avelange.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000402 10.717499 -0.931136 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.000000 10.585320 -0.428527 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000000 10.599319 -0.781266 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.000000 26.240295 -4.488132 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.000000 17.466843 5.625650 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 10.961243 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 10.574359 23.009216 -7.323003 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 14.878175 -4.653427 -3.069340 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 24.109007 0.000000 -0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 31.674404 0.000000 0.552828 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 21.800186 0.005066 0.321598 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -10.574407 23.009140 -7.323003 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -14.878106 -4.653000 -3.069292 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -24.109001 0.000000 0.000003 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -31.674473 0.000000 0.552578 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -21.800308 0.004990 0.321547 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 12.297482 -6.742088 -1.000300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET -0.000002 -45.703384 1.030478 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000004 -50.028076 -3.690418 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 2.595073 -14.255128 19.507614 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.073220 -0.003525 11.362320 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -12.297504 -6.741722 -1.000300 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET 0.000153 -45.703812 1.030478 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.000154 -50.028049 -3.690423 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -2.594995 -14.255290 19.507509 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.073338 -0.003505 11.362415 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 +-0.000008 116.721878 0.900463 0.000000 0.000008 -0.000012 0.000000 -0.000001 0.000018 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000012 -0.000008 0.000609 0.000002 0.000008 -0.000665 -0.000007 0.999993 0.000007 -0.010432 -0.154821 -0.013584 0.000001 -0.000004 0.000673 -0.000001 -0.000001 -0.000661 -0.000010 -0.999431 -0.000014 -0.009774 0.154349 0.013313 0.165060 0.000001 0.000023 0.115484 -0.000001 -0.000004 -0.280547 -0.000017 0.000031 0.000004 0.000002 0.000000 0.164765 0.000012 0.000028 0.116171 0.000036 -0.000012 -0.280955 -0.000016 0.000039 0.000000 -0.000001 0.000000 diff --git a/data/test/character/bvh/The_Boss.bvh b/data/test/character/bvh/The_Boss.bvh new file mode 100755 index 0000000000000000000000000000000000000000..62df64e34de9d1dc34acb5723f9437bfb30ce391 --- /dev/null +++ b/data/test/character/bvh/The_Boss.bvh @@ -0,0 +1,199 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000003 9.226318 1.577133 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.000000 16.254036 -0.165605 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 13.639656 -1.292305 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.000000 13.877441 -4.354187 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck1 + { + OFFSET 0.000000 4.340027 0.926895 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 4.026611 0.858520 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.009413 38.405151 9.587807 + } + } + } + } + JOINT LeftShoulder + { + OFFSET 6.144226 10.187012 -3.793245 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 12.298095 -1.078262 -1.730746 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 27.686996 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 27.894791 -0.000015 0.000011 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 10.490761 -0.034729 -0.062738 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -6.144231 10.187180 -3.793244 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -12.298071 -1.078003 -1.730750 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -27.687017 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -27.894798 0.000015 0.000009 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -10.490791 -0.035004 -0.062730 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 9.633788 -3.273254 -0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.065899 -41.832405 -0.416725 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.052268 -38.877117 -2.267618 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET -0.454518 -12.422029 8.747953 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.660500 0.023827 18.425316 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -9.633788 -3.273224 -0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.065900 -41.832405 -0.416725 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.052270 -38.877197 -2.267614 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 0.454532 -12.422005 8.747985 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.660530 0.023828 18.425310 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 +-0.000002 96.407486 -0.028713 0.000000 0.000008 -0.000013 0.000000 -0.000001 0.000019 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 0.000000 0.001013 -0.000031 -0.000002 -0.001093 -0.000009 0.000000 0.000003 0.033340 -0.342396 0.189514 -0.000008 0.000010 0.001097 0.000000 -0.000020 -0.001043 -0.000007 -0.000006 0.000000 0.033905 0.342423 -0.191141 -0.102523 0.000000 -0.083920 0.055667 0.000089 0.000000 0.046854 0.000062 0.083942 0.000006 -0.000002 0.000000 -0.103281 -0.000001 0.083955 0.057345 -0.000091 0.000000 0.045933 -0.000062 -0.083940 0.000007 0.000001 -0.000001 diff --git a/data/test/character/bvh/TotalCapture_S1_acting2_BlenderZXY_YmZ_3.bvh b/data/test/character/bvh/TotalCapture_S1_acting2_BlenderZXY_YmZ_3.bvh new file mode 100755 index 0000000000000000000000000000000000000000..0335e78f00301c3b30f46a2adf9253700d445f6b --- /dev/null +++ b/data/test/character/bvh/TotalCapture_S1_acting2_BlenderZXY_YmZ_3.bvh @@ -0,0 +1,440 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 4.617136 -6.925691 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 1.603502 -9.093962 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 0.804824 -9.199118 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine3 + { + OFFSET 0.000000 0.000000 -9.234246 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000003 -3.462833 -24.239906 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 -2.204822 -12.504194 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000003 0.000000 -14.947953 + } + } + } + JOINT RightShoulder + { + OFFSET 2.917647 -4.862754 -15.755341 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET 14.491005 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET 28.886760 0.000000 0.000005 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET 21.960279 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 6.589316 0.000000 0.000000 + } + } + } + } + } + JOINT LeftShoulder + { + OFFSET -2.917645 -4.862754 -15.755341 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET -14.491005 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET -28.886760 0.000000 -0.000005 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET -21.960279 0.000000 0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -6.589316 0.000000 0.000000 + } + } + } + } + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET 8.655710 0.000000 2.528646 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.000003 0.000000 37.889104 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.000003 0.000000 37.543788 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.000000 -14.403146 5.242334 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -7.002374 0.000000 + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET -8.655710 0.000000 2.528646 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET -0.000003 0.000000 37.889104 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET -0.000003 0.000000 37.543788 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET -0.000000 -14.403146 5.242334 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -7.002374 0.000000 + } + } + } + } + } +} +MOTION +Frames: 301 +Frame Time: 0.033333 +0.000000 84.703872 0.000000 90.000000 0.000000 -180.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 +8.041879 85.341971 89.534243 96.766402 7.935168 22.602598 -8.239199 -0.130500 0.212699 -3.091001 0.317700 -0.114598 -7.382100 -2.357898 -2.411202 0.051404 -1.891599 -1.202104 13.951903 -10.500199 2.580697 16.990204 -8.448998 -19.080499 0.517901 14.132599 10.607802 -102.769902 -78.432587 -103.205702 -0.000001 0.000000 -18.153704 8.600400 8.974800 0.743897 -12.702001 -18.150303 9.181496 -80.142620 78.826482 92.453616 0.000001 -0.000004 21.002405 0.382898 -4.220602 1.836496 9.057099 -4.384200 3.397903 -19.821202 0.000002 -0.000002 2.095398 1.240106 18.885402 22.604103 -0.000001 0.000001 -18.421798 0.383802 -13.449902 -4.512201 0.000000 -0.000001 14.331997 -1.327803 -9.226598 11.181902 0.000000 0.000002 +8.055849 85.068413 87.650579 96.393007 7.717159 20.720203 -8.233401 -0.202100 0.244801 -3.048600 0.339100 -0.104304 -7.661802 -2.434800 -2.051301 0.011701 -1.880199 -1.098601 14.284400 -10.444001 2.990398 17.619903 -8.238899 -18.368199 0.357905 13.900703 10.879196 -102.264674 -79.137490 -102.681273 0.000001 -0.000000 -17.284402 7.884404 9.123201 0.781598 -13.375396 -18.003403 8.760599 -94.441000 80.516878 106.774699 -0.000001 -0.000006 18.997504 1.662402 -3.232304 1.125904 10.698101 -4.892499 4.112305 -16.001103 0.000001 -0.000003 1.620295 0.772406 16.375407 22.639798 0.000003 0.000007 -19.035900 0.342003 -12.441801 -4.601301 0.000000 0.000000 15.113499 -1.436503 -8.522400 11.272402 0.000000 0.000002 +8.188691 84.739226 85.639171 96.081805 7.504976 18.885800 -8.231400 -0.319500 0.250699 -3.027199 0.315001 -0.106999 -7.892299 -2.430600 -1.925202 -0.019098 -1.839399 -1.057301 14.673200 -10.271802 3.467497 18.006100 -8.160595 -17.324696 0.235903 13.721602 11.164297 -101.870203 -79.763991 -102.116104 0.000000 -0.000003 -16.630203 7.200101 9.080997 0.985598 -13.734295 -18.043705 8.584196 -100.150883 79.470487 112.480476 0.000005 -0.000003 18.102407 1.493597 -2.360203 1.019197 12.191702 -5.293600 4.885201 -12.638898 0.000001 -0.000001 1.865098 0.752805 14.181903 22.533706 -0.000001 0.000005 -19.477100 0.183403 -11.388903 -5.373099 0.000000 0.000000 16.091500 -1.593102 -7.983397 11.326002 0.000000 0.000002 +8.410433 84.341975 83.475071 95.792906 7.270977 17.263299 -8.202798 -0.483500 0.266798 -2.950101 0.254600 -0.116204 -8.106200 -2.343600 -2.009103 -0.057902 -1.776999 -1.061901 15.043004 -9.978601 3.890898 18.288702 -8.013297 -16.131695 -0.026700 13.754901 11.190100 -101.761479 -80.009187 -101.870578 0.000001 -0.000001 -16.214405 7.135401 9.005699 0.984997 -13.885800 -18.327004 8.652199 -95.888908 75.771185 108.430297 -0.000002 -0.000005 18.357204 -0.922797 -1.393802 0.873201 13.577906 -5.616401 5.600402 -9.892703 0.000000 0.000000 2.050600 0.705404 12.545001 22.355409 0.000001 0.000006 -20.307797 0.123602 -10.357102 -5.757402 0.000000 -0.000001 16.928798 -1.849202 -7.592099 11.381203 0.000000 0.000002 +8.687803 83.882989 81.151994 95.454300 6.964667 15.771702 -8.106197 -0.674000 0.309697 -2.825401 0.207799 -0.124597 -8.211500 -2.230900 -2.100401 -0.080802 -1.727799 -1.060301 15.310005 -9.716401 4.224399 18.491903 -7.732298 -15.055097 -0.147398 13.935202 11.035098 -101.138767 -79.547788 -101.071065 -0.000000 -0.000001 -15.930904 6.963000 8.989900 1.046599 -13.669599 -18.710106 8.843796 -89.923304 69.987285 102.525596 0.000003 -0.000004 19.540104 -3.819396 -1.267500 1.382600 14.836701 -5.784501 6.395200 -7.749401 0.000001 0.000001 2.058799 0.788303 11.481602 22.344306 -0.000003 0.000001 -21.431498 0.087203 -10.184202 -5.706902 0.000001 -0.000001 17.682195 -1.751701 -6.528098 11.509702 0.000000 0.000002 +9.052039 83.379310 78.653640 95.035803 6.685674 14.130903 -7.894798 -0.917500 0.384199 -2.659499 0.182199 -0.122001 -8.224600 -2.246300 -1.944300 -0.077799 -1.697400 -1.005501 15.538102 -9.424700 4.445300 18.499905 -7.360999 -14.129598 -0.189696 13.994198 10.897401 -99.757499 -78.871084 -99.599298 0.000001 -0.000000 -15.828402 6.660497 9.040297 1.091094 -13.399494 -19.261103 9.236300 -86.300605 64.908988 98.966494 0.000001 -0.000004 21.198704 -4.707794 -0.641801 1.693898 15.847005 -5.928700 7.257402 -6.287800 -0.000000 0.000001 2.504299 1.243903 11.404603 22.430905 -0.000001 -0.000001 -22.550799 -0.164198 -10.230301 -5.799805 0.000001 0.000000 18.477795 -1.309101 -5.278499 11.506802 0.000000 0.000002 +9.502635 82.853779 75.916036 94.859706 6.392975 12.415203 -7.715601 -1.055501 0.473000 -2.538999 0.166899 -0.112900 -8.184098 -2.387300 -1.580501 -0.072400 -1.689699 -0.923003 15.619799 -9.167199 4.612998 18.483700 -6.943298 -13.463999 -0.163199 13.913899 10.866801 -97.953875 -78.152791 -97.767875 0.000001 -0.000002 -15.993605 6.002401 9.073296 1.231597 -12.997697 -19.918504 9.681399 -84.240103 61.273288 96.901302 0.000003 -0.000004 22.812205 -4.965103 -0.391902 1.643704 16.304902 -5.933402 7.849901 -5.944802 0.000001 0.000004 3.155300 1.663203 11.674999 22.582308 0.000001 0.000005 -23.762797 -0.492997 -9.954102 -6.494705 0.000001 -0.000001 19.073407 -0.862001 -4.341899 11.680500 0.000000 0.000002 +10.017239 82.372451 72.839339 95.009501 6.034052 10.700105 -7.458798 -1.138500 0.535199 -2.391199 0.164000 -0.102901 -8.272201 -2.560899 -1.102402 -0.112401 -1.704399 -0.809301 15.480303 -8.914797 4.709799 18.486401 -6.646799 -12.962499 -0.223798 13.797000 11.043599 -96.816399 -77.806989 -96.725693 -0.000000 -0.000001 -16.372003 5.968000 9.169098 1.317898 -12.461497 -20.426902 10.082798 -82.961002 59.752885 95.580798 0.000004 -0.000004 23.975209 -4.112098 -0.240201 1.813398 15.960601 -5.724401 7.961802 -6.835902 0.000001 0.000004 3.906096 2.225103 11.441300 22.531903 0.000001 0.000005 -24.957305 -0.889796 -9.493502 -8.220202 0.000000 -0.000001 19.254397 -0.269502 -3.583899 12.459705 0.000000 0.000002 +10.808703 82.102449 69.572139 94.726504 6.771965 9.221895 -6.751299 -2.217000 0.304300 -1.808900 0.082800 -0.101201 -8.937500 -2.874101 -0.584201 -0.190101 -1.697900 -0.685502 15.656303 -8.780299 4.929798 18.045901 -6.219398 -12.602997 0.103002 13.206899 11.347102 -95.153001 -78.018589 -94.853102 -0.000000 -0.000001 -17.117303 6.964200 9.519997 1.154595 -11.657398 -20.123405 10.361800 -81.271311 60.196181 93.637010 0.000002 -0.000005 24.538809 -3.564900 -0.372105 1.963305 15.646902 -7.123200 7.082504 -8.898099 -0.000000 0.000001 0.462900 8.067104 11.830900 23.251304 0.000002 0.000005 -25.445204 -2.765697 -9.839605 -11.227905 0.000001 -0.000001 19.111799 0.992999 -2.536999 14.506500 0.000001 0.000002 +11.806161 81.985869 66.167765 94.332898 8.116966 8.376997 -5.996296 -3.573801 0.047898 -1.110000 -0.036000 -0.089501 -9.594701 -3.447701 -0.371404 -0.240698 -1.730799 -0.676201 15.616003 -8.324501 4.738699 17.631098 -5.870497 -12.157799 0.333902 12.629902 11.486904 -93.093704 -77.828287 -92.592800 -0.000001 -0.000002 -18.103804 9.247101 9.902298 0.939200 -10.894898 -19.212105 10.153099 -79.978405 62.681185 91.992701 0.000003 -0.000006 24.619110 -2.505797 -1.548801 1.912304 15.512002 -9.227701 2.530501 -11.446904 0.000001 -0.000002 -4.830204 9.474104 16.513597 24.137405 0.000000 0.000000 -25.269204 -5.438495 -10.954806 -15.642001 0.000002 -0.000002 17.673209 3.517200 -1.581500 19.221805 -0.000000 0.000003 +12.762725 82.042765 62.518298 94.743702 9.127628 8.250006 -5.818595 -4.250101 -0.083000 -0.951399 -0.347100 -0.074900 -9.585899 -3.993600 -0.464502 -0.260303 -1.759199 -0.742201 14.962499 -7.688201 4.106499 17.431402 -5.932196 -11.571498 0.121700 12.658699 11.326102 -93.675612 -77.801388 -93.370310 -0.000000 -0.000001 -18.663506 11.014699 9.801897 0.590389 -10.807900 -18.684901 9.450097 -80.898409 67.141180 92.803100 -0.000002 -0.000006 24.509707 0.407301 -4.585401 2.358101 14.815608 -10.633400 -1.316998 -15.468903 0.000001 -0.000001 -6.261303 6.783506 19.890300 23.429603 0.000000 0.000003 -24.663500 -7.501097 -11.614902 -22.221105 0.000002 -0.000002 14.728906 5.058699 -1.307001 22.242605 0.000000 0.000003 +13.527268 82.349838 58.834528 95.863301 9.629954 8.035805 -6.063994 -4.525200 -0.077200 -1.210000 -0.595400 -0.054901 -9.295700 -4.360100 -0.524803 -0.287299 -1.762600 -0.795301 14.027004 -7.173900 3.544200 17.168805 -6.108400 -11.037998 0.267203 13.404102 10.970900 -97.910388 -77.682885 -97.511887 -0.000000 -0.000001 -18.917903 12.214501 9.811099 0.188596 -10.664498 -18.827804 8.897599 -85.119698 71.463985 96.790295 -0.000001 -0.000007 25.059505 4.695901 -8.403799 2.488795 12.575401 -10.888800 0.783403 -18.783401 0.000001 -0.000001 -3.351405 8.070805 17.437599 23.150207 0.000001 0.000004 -22.469705 -9.647296 -12.849103 -31.770908 0.000003 -0.000003 9.093898 6.832900 0.372899 23.397100 0.000001 0.000004 +14.196812 82.885783 55.396638 97.303795 9.807054 7.636003 -6.619000 -4.580001 -0.204003 -1.647300 -0.648600 -0.044998 -9.121199 -4.596200 -0.778304 -0.300102 -1.811699 -0.907901 13.524302 -6.930398 3.443399 16.888705 -6.041500 -10.481300 0.344703 14.000300 10.827900 -101.756888 -77.788488 -101.507086 -0.000001 -0.000002 -18.972599 13.272598 9.797296 0.203396 -10.212696 -19.031702 8.712498 -87.785411 72.446089 99.373203 0.000004 -0.000006 26.592503 6.706402 -11.926102 3.186197 8.092203 -10.956101 1.570799 -18.340103 0.000002 -0.000002 -0.750804 8.970905 16.307898 22.629501 -0.000001 0.000001 -18.494698 -11.625301 -12.253002 -43.135312 0.000005 -0.000002 1.985503 7.811601 0.660497 21.960407 0.000000 0.000003 +14.674332 83.561179 52.197264 99.051997 9.241983 6.961494 -7.496299 -4.195101 -0.251102 -2.246299 -0.547900 -0.057600 -9.002402 -4.465401 -1.310803 -0.310100 -1.852399 -1.045601 13.378102 -6.851199 3.652900 16.892601 -5.964597 -9.604199 0.266301 14.044400 10.767401 -102.558978 -77.693888 -102.657880 -0.000000 -0.000001 -18.986802 14.733101 9.546794 0.023292 -9.526097 -19.294099 8.739096 -88.525210 71.969283 100.206501 0.000003 -0.000005 28.920206 6.967800 -13.209400 3.317900 2.429301 -10.259000 1.584402 -15.702601 0.000002 -0.000002 1.089698 9.233304 15.880497 22.462301 0.000001 0.000005 -13.841300 -12.317998 -10.485803 -53.335509 0.000005 -0.000002 -4.999097 9.830802 -1.961304 13.663301 0.000000 0.000001 +14.814288 84.276687 49.170852 100.362192 7.811677 6.623406 -8.094999 -3.545000 -0.186501 -2.733201 -0.435000 -0.080101 -8.959301 -3.842499 -2.004402 -0.314897 -1.740300 -1.149702 13.254698 -6.633401 3.742901 16.935500 -5.946399 -8.598298 0.009098 14.147502 10.451303 -102.773186 -77.276488 -103.305686 -0.000000 -0.000001 -19.112304 15.176000 9.686396 -0.083402 -9.358698 -19.736905 8.722198 -88.751206 71.012184 100.879203 0.000001 -0.000008 31.258907 7.649801 -12.964404 3.528801 -2.582302 -8.451998 1.896500 -12.902501 0.000001 -0.000002 2.541800 9.268803 15.005300 22.786501 0.000002 0.000007 -9.196603 -11.374795 -9.777901 -60.890706 0.000005 -0.000003 -1.663100 10.207697 -8.467104 13.496705 -0.000002 0.000003 +14.823686 84.897211 46.314111 101.080297 5.938767 6.905008 -8.530099 -2.652100 -0.151602 -3.038999 -0.274600 -0.118300 -8.718603 -2.981799 -2.881403 -0.282502 -1.591599 -1.296700 12.978000 -6.245700 3.657199 16.899601 -5.819598 -7.633399 -0.201101 14.305603 10.167799 -101.630985 -75.797185 -102.336181 -0.000000 -0.000001 -19.555503 15.163300 10.030097 -0.037603 -9.184600 -20.020002 8.627296 -89.172206 69.669292 101.341705 -0.000000 -0.000007 33.183105 10.863498 -12.244899 4.427296 -6.806600 -6.024600 3.142300 -10.079000 0.000001 -0.000001 4.125598 8.644803 12.975599 23.076110 0.000002 0.000005 -4.317400 -9.888599 -10.688702 -65.809501 0.000006 -0.000003 5.272801 5.992995 -15.144905 12.261195 -0.000002 -0.000001 +14.820892 85.348569 43.580566 101.394101 4.072484 7.677905 -8.902796 -1.740800 -0.190702 -3.232500 -0.096800 -0.171300 -8.356199 -1.982199 -3.920101 -0.212399 -1.441099 -1.470501 12.735896 -5.920999 3.573999 16.724003 -5.684099 -6.769699 -0.437201 14.433901 9.779599 -100.348283 -74.199593 -101.262783 -0.000001 -0.000002 -19.839905 14.828102 9.490394 0.440197 -9.282502 -20.254300 8.458797 -89.786802 68.231587 101.917799 0.000000 -0.000007 34.753403 12.865503 -12.019300 4.897103 -10.199602 -3.590500 4.841898 -7.727000 0.000000 -0.000002 5.647901 7.889902 10.461998 23.481504 -0.000001 0.000002 0.512901 -8.458100 -12.397002 -67.465405 0.000007 -0.000002 7.552398 2.508796 -20.487205 11.706110 -0.000001 0.000006 +14.807176 85.598003 40.873175 101.524799 2.419689 8.711694 -9.115498 -0.982900 -0.211702 -3.336501 0.018100 -0.230200 -8.270303 -0.903599 -5.129302 -0.161602 -1.259799 -1.662001 12.719998 -5.473102 3.448799 16.584702 -5.586198 -5.859699 -0.623900 14.652998 9.338702 -99.429601 -72.457191 -100.508400 -0.000000 -0.000001 -20.253504 14.762102 8.594397 0.907698 -9.384700 -20.201602 8.198698 -90.035595 66.568089 101.996985 0.000006 -0.000006 36.170807 12.774705 -12.637399 4.726497 -12.980602 -1.277299 6.695899 -6.011302 0.000000 -0.000001 7.405496 6.569802 7.767298 23.059101 0.000001 0.000006 4.758905 -7.486102 -14.177303 -66.259406 0.000006 -0.000002 7.935100 2.158696 -22.539297 11.158601 0.000003 -0.000001 +14.855690 85.616034 38.153853 101.552200 1.145086 9.540497 -9.137497 -0.381601 -0.200402 -3.332199 0.103300 -0.275500 -8.643100 0.044401 -6.146500 -0.185898 -1.091399 -1.808800 13.107099 -4.942800 3.247100 16.658603 -5.458098 -5.166499 -0.757500 14.828497 8.956300 -98.641281 -70.678193 -99.974186 0.000001 -0.000001 -20.975207 13.888302 7.392296 1.624597 -9.533401 -20.030804 8.003697 -89.958393 64.870083 101.641987 0.000001 -0.000009 37.548804 11.158505 -14.030602 4.784196 -15.345803 0.479699 7.709501 -4.922100 0.000000 -0.000002 8.862297 5.948902 6.227800 23.178402 0.000002 0.000004 8.396003 -6.982700 -15.287697 -62.805208 0.000007 -0.000003 9.095596 2.468892 -20.827100 12.142902 -0.000002 0.000002 +14.912586 85.431112 35.373569 101.572400 0.410351 9.901508 -9.270998 0.002000 -0.202701 -3.303999 0.124900 -0.305900 -9.058800 0.686501 -6.706701 -0.229897 -0.989499 -1.865000 13.601904 -4.541300 3.094100 16.940499 -5.388499 -4.802100 -0.882799 14.950895 8.592701 -97.914182 -69.086085 -99.588187 -0.000002 -0.000002 -21.570805 13.952299 6.257199 2.137994 -10.042800 -19.833100 7.934797 -90.287201 63.705578 101.784497 0.000005 -0.000006 38.605810 9.771797 -15.676301 4.471288 -17.704103 1.573799 8.184704 -4.098900 -0.000000 0.000003 10.337801 5.513402 5.695499 23.124205 0.000003 0.000005 11.163705 -6.880800 -15.440998 -56.918306 0.000004 -0.000002 10.747306 3.790295 -17.344506 11.715204 -0.000001 0.000001 +14.954753 85.076541 32.425135 101.638399 -0.125728 10.060103 -9.438799 0.427900 -0.209501 -3.274999 0.149100 -0.328000 -9.390100 1.086701 -7.077299 -0.256300 -0.936399 -1.918100 13.932797 -4.226500 2.971300 17.243400 -5.375599 -4.574799 -0.944299 15.084800 8.249900 -97.923894 -68.025688 -99.697292 -0.000002 -0.000001 -21.912205 15.008198 5.352995 2.636191 -10.656799 -19.622900 7.952298 -91.138692 63.340186 102.522791 0.000002 -0.000009 38.570604 12.440304 -15.756996 5.176000 -20.418398 2.466101 9.485101 -3.027500 -0.000000 0.000001 11.685197 4.746301 4.547602 23.154005 0.000002 0.000006 12.802909 -6.639302 -15.208700 -48.429504 0.000003 -0.000002 10.971701 4.652895 -15.224903 11.056204 0.000001 -0.000002 +14.989040 84.547707 29.255469 101.540898 -0.549140 10.029709 -9.361296 0.783499 -0.225499 -3.198301 0.177200 -0.345201 -9.721502 1.462003 -7.412402 -0.293301 -0.860999 -1.959201 14.339901 -4.146698 3.004000 17.486101 -5.360997 -4.366698 -1.158802 15.044502 8.198500 -98.355868 -67.650092 -100.153570 -0.000002 -0.000001 -22.032507 15.153499 4.612500 3.161601 -10.914501 -19.559304 7.700698 -92.964294 64.245080 103.941696 0.000002 -0.000009 38.478800 17.444903 -16.327904 6.953893 -23.331109 3.089298 11.122201 -1.381701 -0.000000 0.000002 11.696998 4.243001 3.344601 23.256307 0.000001 0.000006 13.205499 -6.103700 -14.332598 -37.299704 0.000003 -0.000002 9.977400 5.088195 -14.801105 11.098802 -0.000001 -0.000001 +15.025111 83.834475 25.857713 101.229296 -0.644923 9.879098 -9.090894 0.940600 -0.314402 -3.083101 0.177400 -0.363099 -9.867598 1.713302 -7.707800 -0.317601 -0.813199 -2.011701 14.594002 -4.127601 3.132800 17.805398 -5.286896 -4.068198 -1.436300 14.907499 8.381000 -99.134795 -67.878284 -100.795297 -0.000004 -0.000002 -21.719703 14.660703 4.135999 3.692594 -11.170299 -19.402704 7.255998 -94.454393 66.362079 105.067091 0.000000 -0.000009 38.693100 17.521100 -15.152101 6.792500 -26.262002 3.329902 11.410299 0.220200 -0.000001 0.000000 11.887203 3.588501 3.536804 23.066809 0.000001 0.000003 12.344103 -5.550302 -12.354001 -23.870905 0.000002 -0.000002 8.575504 4.899194 -15.680301 11.585699 -0.000001 0.000000 +15.038065 82.932273 22.213324 100.843099 -0.528217 9.992502 -8.826296 1.106400 -0.490001 -2.979899 0.181800 -0.379502 -9.576600 1.818002 -8.152700 -0.271099 -0.808099 -2.109400 14.427596 -4.169900 3.194801 18.097202 -5.109698 -3.673899 -1.761100 14.726798 8.614500 -100.295991 -68.912090 -101.545089 -0.000004 -0.000001 -20.901303 14.822999 3.269998 4.231995 -11.364202 -19.248705 6.791198 -94.834791 67.888987 105.325890 0.000003 -0.000008 38.094004 16.849097 -12.133497 5.737100 -29.213298 3.502702 12.647898 1.571998 0.000000 0.000001 12.631800 2.402200 2.694097 22.317903 0.000000 0.000003 10.936303 -5.273701 -9.294800 -10.764900 0.000001 -0.000001 6.647601 3.611195 -17.060702 12.999505 -0.000001 0.000002 +14.848581 82.025226 18.396722 100.495899 -0.946222 10.602600 -8.461198 1.840700 -0.582900 -2.718701 0.190600 -0.396600 -9.426602 1.952302 -8.865500 -0.194702 -0.811499 -2.292800 14.421797 -4.094399 3.176300 18.233601 -5.122197 -3.266399 -1.808700 14.381202 8.726699 -100.686396 -70.383885 -101.325001 -0.000001 -0.000001 -19.965104 15.126799 1.673698 5.075196 -11.034098 -18.773904 6.560898 -93.876691 68.701682 104.243881 -0.000000 -0.000008 36.385005 17.006598 -8.846501 5.024700 -31.364003 4.679198 14.159301 1.246301 -0.000001 0.000002 14.130596 1.173199 1.632198 22.222405 0.000002 0.000006 10.117803 -4.681300 -7.105297 -1.809901 0.000000 0.000000 5.716703 2.961192 -18.090704 13.281501 0.000000 0.000002 +14.401287 81.197950 14.313413 100.436103 -1.539620 11.807299 -8.142296 2.656899 -0.609600 -2.416298 0.234000 -0.407700 -9.420800 2.196102 -9.640999 -0.110801 -0.796699 -2.484700 14.776806 -3.906100 3.063400 18.067601 -5.267898 -3.059299 -1.833497 14.106697 8.567200 -99.986688 -71.406386 -100.161985 -0.000001 -0.000002 -19.113603 15.798897 0.398297 5.905699 -10.926600 -17.799400 6.375699 -91.761595 69.464286 102.044195 0.000002 -0.000007 34.504907 19.509700 -6.522503 5.225096 -32.668101 6.929300 14.440998 -1.362200 0.000001 -0.000002 15.755504 -0.096999 1.358202 22.722204 -0.000001 0.000004 9.932602 -3.781501 -7.560099 0.569300 0.000000 0.000000 6.673897 2.346696 -16.293200 12.646805 0.000001 0.000003 +13.515591 80.673951 9.879846 101.006500 -2.678121 13.451299 -7.875999 3.813101 -0.493502 -1.987700 0.174600 -0.414601 -9.906600 2.675903 -10.237700 -0.094401 -0.732298 -2.594801 15.506801 -3.823699 2.937501 17.665202 -5.308197 -3.307098 -1.452198 14.001899 8.202102 -98.511079 -71.837692 -98.097177 -0.000000 -0.000001 -18.490903 16.242401 -1.003701 6.451799 -11.106200 -16.415299 6.204698 -89.361002 70.483583 99.453503 0.000002 -0.000006 33.195409 20.830404 -5.863702 6.517799 -33.450006 10.769304 13.495100 -6.022702 -0.000000 0.000001 16.288298 -1.532199 1.844702 23.872409 0.000000 0.000003 10.178702 -1.714100 -7.673800 -3.708801 0.000000 0.000000 3.387702 1.294895 -15.236300 9.490100 -0.000001 0.000002 +12.406373 80.384637 5.293873 101.332203 -3.773629 14.619303 -7.363098 4.547897 -0.304500 -1.436500 0.271999 -0.418401 -10.227500 3.177703 -10.321800 -0.114901 -0.730699 -2.564700 15.901102 -4.197200 3.059100 17.590898 -5.355396 -4.020799 -0.850400 13.683801 8.193098 -96.561593 -71.812485 -95.503795 0.000001 -0.000001 -18.010106 15.952195 -1.870996 6.351299 -11.463500 -15.342804 6.216099 -87.410408 71.452584 97.451008 0.000004 -0.000006 32.165010 23.246405 -5.584601 7.945698 -32.758204 14.486897 10.456501 -12.663802 -0.000000 0.000001 15.048304 -3.252400 4.222600 25.722504 0.000001 0.000003 11.967601 0.324298 -4.101000 -11.683301 0.000001 -0.000001 -0.708600 4.572195 -19.350501 10.864001 -0.000000 0.000003 +11.428727 80.604863 0.878337 101.432098 -5.161913 14.765197 -6.717300 5.146000 -0.131001 -1.092300 0.729500 -0.447200 -10.258101 3.983202 -9.959200 -0.113299 -0.778499 -2.422100 16.281402 -5.170599 3.986500 17.844601 -5.626397 -4.888199 -0.425400 12.580099 8.854401 -95.141489 -72.417483 -93.828788 -0.000000 -0.000001 -17.488604 15.028796 -1.920399 6.059699 -11.376101 -15.505704 6.846399 -86.085798 71.909085 96.467795 0.000002 -0.000008 30.973204 24.959000 -6.973099 9.599393 -29.844002 17.175301 6.425499 -21.811098 0.000001 0.000001 10.934902 -5.501996 8.756401 27.969305 -0.000000 0.000004 13.796503 2.423800 -5.175498 -19.781700 0.000001 -0.000001 0.034701 5.862595 -18.675302 12.402002 0.000001 0.000003 +10.660380 81.261199 -3.350255 102.275706 -5.242027 14.909607 -7.010199 5.049499 -0.103801 -1.497101 0.834400 -0.459498 -9.586899 4.300702 -9.567399 -0.097798 -0.684799 -2.276701 15.931301 -5.670899 4.426400 18.368002 -5.893898 -5.180399 -0.171801 12.650002 9.086999 -99.414898 -75.158187 -97.944295 0.000000 0.000000 -17.042604 15.612600 -1.752205 5.557693 -11.078200 -16.621703 7.624898 -86.487407 71.730085 97.303296 0.000002 -0.000007 30.522107 24.319098 -8.800801 9.647496 -25.352496 18.341798 3.710497 -32.993502 0.000002 -0.000002 2.838097 -8.612195 12.815308 26.742808 -0.000002 0.000004 11.977601 3.495398 -7.240100 -23.708205 0.000003 -0.000002 2.824802 3.863395 -16.444700 11.874701 0.000001 0.000004 +10.104625 82.187793 -7.139175 103.184306 -4.271219 16.112502 -7.828200 4.486499 -0.005302 -2.139099 0.749800 -0.458902 -8.679099 4.225902 -9.621700 -0.069799 -0.572599 -2.270100 15.535396 -5.814701 4.124600 18.801901 -5.867196 -5.676999 0.184202 13.318801 8.795900 -105.717466 -77.355488 -104.542066 0.000000 0.000000 -17.695502 14.443301 -0.835303 5.319398 -10.432703 -17.184702 7.879897 -85.992187 71.880984 96.912881 0.000001 -0.000008 30.558106 22.430202 -8.011101 7.271893 -18.464599 18.032700 0.296699 -45.329609 0.000005 -0.000003 -6.767305 -4.705995 16.064599 27.268308 -0.000004 0.000002 7.401600 4.141000 -7.577399 -22.595705 0.000002 -0.000002 5.372299 2.832594 -17.300501 10.953900 -0.000000 0.000004 +9.907270 83.201007 -10.442702 103.635906 -2.777321 17.985102 -8.431202 3.943701 -0.057201 -2.568700 0.749001 -0.463199 -8.235000 3.869903 -9.571901 -0.110201 -0.610298 -2.306799 15.013101 -6.174001 3.744400 18.800599 -6.048698 -6.845400 0.329602 13.518799 8.293999 -104.365690 -76.820190 -104.988692 -0.000001 -0.000002 -19.728501 9.425900 0.818900 4.969897 -10.484897 -17.712003 8.223798 -82.869608 73.848782 94.241209 0.000003 -0.000007 31.768207 21.986394 -4.868707 6.091694 -11.065298 15.791599 -3.820401 -55.725007 0.000008 -0.000002 -7.513102 -2.419796 20.984204 21.238605 -0.000001 0.000001 2.422101 3.947001 -8.878401 -19.467400 0.000002 -0.000002 6.263604 1.984693 -17.891799 11.032604 0.000001 0.000003 +9.993884 84.169997 -13.481047 103.822707 -0.579523 19.269206 -8.799699 3.175500 -0.151200 -2.836500 0.705600 -0.430800 -8.356201 3.049602 -8.836799 -0.236901 -0.724398 -2.218700 13.681702 -6.844500 3.383400 17.577601 -6.372099 -8.171101 0.813901 13.372896 7.345200 -96.703594 -74.228586 -99.375796 -0.000000 -0.000001 -24.178407 2.580400 4.183497 4.337800 -10.585698 -18.702206 8.778399 -76.983999 75.711187 88.858601 0.000004 -0.000007 34.559507 21.842801 -3.831403 5.344897 -4.943199 11.840801 -5.719502 -62.869309 0.000007 -0.000002 -0.903907 -0.141191 23.430698 22.633000 0.000001 0.000007 -2.416499 2.745002 -10.699501 -16.243699 0.000001 -0.000001 6.284803 1.332594 -17.216603 11.333603 0.000000 0.000002 +10.070846 84.925146 -16.325339 103.623407 1.715468 19.524506 -9.046698 2.285799 -0.186501 -3.017800 0.538100 -0.374000 -8.350400 1.884602 -7.645601 -0.375902 -0.873298 -2.018602 11.141500 -7.502998 2.904098 15.251301 -6.665597 -8.922799 1.267601 13.643602 6.646299 -90.587687 -72.959686 -94.928784 0.000001 -0.000003 -30.826208 3.237101 7.212996 3.582499 -9.538701 -19.998302 9.318898 -70.399026 77.332287 82.355821 0.000001 -0.000008 38.180105 25.296400 -3.204904 4.563197 0.184103 7.520600 -5.306300 -66.016305 0.000006 -0.000001 1.579794 1.355402 23.625199 22.309003 -0.000001 0.000002 -6.512198 1.347700 -11.533900 -13.351303 0.000001 -0.000002 6.252303 1.079494 -16.748502 10.892800 0.000000 0.000001 +10.114788 85.378277 -19.047201 103.340295 3.307793 19.239695 -9.346898 1.671200 -0.099301 -3.145098 0.474100 -0.340202 -7.937201 0.966101 -6.580401 -0.492300 -1.092899 -1.867501 7.994898 -8.236800 2.727898 12.502204 -6.789001 -9.152600 1.858799 14.426501 7.026699 -87.520214 -73.622086 -92.574416 -0.000000 -0.000004 -40.025206 13.060901 10.683998 2.620996 -7.728301 -21.625700 9.889094 -61.468028 79.903490 73.315819 0.000003 -0.000011 44.023100 27.761594 -4.479195 4.859403 4.678403 4.227999 -3.531199 -66.002201 0.000008 -0.000002 1.949993 1.053809 22.780601 22.099203 -0.000004 0.000001 -9.705397 0.425001 -12.890701 -11.318100 0.000001 -0.000002 6.699702 0.863394 -15.501303 10.686003 0.000000 0.000002 +10.072878 85.564215 -21.757635 103.143112 4.045774 18.926504 -9.591697 1.383299 0.026198 -3.250600 0.493401 -0.315500 -7.494302 0.444302 -5.734800 -0.597500 -1.279399 -1.728801 5.264702 -8.791201 2.551399 10.215204 -6.913298 -9.252599 2.423102 15.351099 7.820201 -85.014098 -75.048084 -90.537795 -0.000002 -0.000002 -51.280306 24.730496 14.640501 1.707801 -5.585396 -22.948101 10.194098 -44.493291 82.157592 56.327087 0.000004 -0.000007 51.912706 30.018899 -8.664396 5.405404 8.475401 2.550699 -0.976096 -63.215504 0.000009 -0.000004 3.217698 0.744307 20.426903 22.014902 -0.000003 0.000006 -12.336199 0.390000 -13.762199 -9.901401 0.000001 -0.000002 7.507102 0.771796 -14.505401 10.739901 0.000000 0.000002 +9.966201 85.555833 -24.480517 102.848604 4.264688 18.984799 -9.518798 1.269800 0.078400 -3.217699 0.475700 -0.288297 -7.416800 0.104701 -5.245498 -0.756400 -1.368199 -1.662500 3.244199 -8.980503 2.258998 8.801301 -7.121501 -9.432401 3.320801 16.389503 8.089901 -81.755416 -77.224287 -87.586219 -0.000001 -0.000003 -63.169401 33.207300 18.878697 0.632394 -3.005098 -23.701805 10.566298 -12.553045 83.675098 24.669544 0.000006 -0.000014 60.226805 33.678798 -12.815003 5.433092 11.427503 1.756501 1.173803 -57.453905 0.000009 -0.000004 5.233594 0.261105 17.504200 22.126205 -0.000003 0.000007 -14.592598 0.907502 -14.336301 -8.764602 0.000001 -0.000001 8.384898 0.682697 -13.769401 10.719802 0.000000 0.000001 +9.912861 85.413324 -27.223969 102.400710 4.246600 18.881994 -9.240498 1.081900 0.129700 -3.167000 0.431700 -0.272101 -7.449301 -0.057899 -4.993697 -0.881503 -1.414699 -1.621002 2.270203 -8.978102 2.185997 8.272300 -7.178901 -9.333401 4.248304 17.489899 7.996997 -77.107726 -80.073186 -83.373326 -0.000003 -0.000003 -73.818198 38.845194 21.882097 -0.807805 -0.315996 -24.572106 11.475099 31.358333 83.121008 -18.289835 0.000009 -0.000011 68.201406 35.057294 -16.647101 5.091495 13.059600 0.981499 2.971402 -48.197203 0.000004 -0.000003 5.754400 0.010205 15.969905 21.156409 0.000000 0.000004 -16.596699 1.546901 -15.323101 -7.638199 0.000000 -0.000001 9.451898 0.549096 -12.881400 10.757702 0.000000 0.000002 +9.906511 85.154249 -30.049465 101.992703 3.802282 18.403399 -9.029598 1.022899 0.255802 -3.148199 0.430900 -0.263300 -7.198099 -0.073899 -4.765699 -0.892300 -1.431099 -1.563599 1.965199 -8.932400 2.273398 8.125899 -7.135200 -9.122000 5.026798 18.545700 7.690002 -68.701163 -82.755594 -75.519359 -0.000006 -0.000003 -82.887003 44.159704 25.299292 -2.016816 2.519205 -25.517997 12.813004 58.560094 80.456913 -44.453197 0.000010 -0.000016 75.619709 34.601899 -19.764903 4.799098 12.775404 0.750099 5.378202 -35.175706 0.000002 -0.000001 3.921600 -0.160695 15.620206 20.814909 0.000002 0.000007 -18.502997 2.440703 -15.586204 -6.598701 0.000000 -0.000001 10.412302 0.615397 -12.114999 10.659903 0.000000 0.000002 +9.954263 84.724479 -33.008313 101.550807 2.825786 17.541303 -8.767300 1.227000 0.486198 -3.113300 0.544900 -0.246100 -6.586203 -0.028399 -4.350300 -0.811200 -1.434699 -1.470201 2.042699 -8.974000 2.473098 8.514803 -7.023001 -9.063600 5.845003 19.509897 7.287396 -53.448293 -84.721393 -60.715195 -0.000004 -0.000003 -89.829002 46.109197 27.716996 -3.258310 5.123003 -26.589800 14.390195 73.827019 77.248506 -58.683918 0.000011 -0.000014 82.347800 34.894796 -22.247604 4.919393 10.830701 1.144799 9.836098 -19.242504 0.000002 0.000000 1.311497 0.025505 13.455801 21.295901 0.000003 0.000005 -20.169302 3.568204 -15.454104 -5.928602 0.000000 -0.000001 11.529502 0.308697 -10.823600 9.931503 0.000000 0.000001 +10.172449 84.182702 -36.140131 101.192304 1.770070 16.298405 -8.474096 1.460799 0.621298 -3.032700 0.637700 -0.245602 -5.952002 0.059401 -3.718401 -0.695000 -1.440099 -1.332102 2.413198 -9.080999 2.815196 9.668902 -6.920099 -9.157399 6.758605 20.381997 7.058498 -31.082670 -85.777492 -38.612875 -0.000004 -0.000005 -94.862797 44.338799 29.625997 -4.030610 7.722404 -27.779198 16.073695 82.975289 74.512015 -66.904589 0.000011 -0.000014 87.779508 33.382300 -24.693402 3.841102 8.566000 1.044398 16.636806 -4.036699 0.000001 0.000003 0.546901 0.182002 7.033205 22.500904 -0.000000 0.000004 -21.844598 4.494704 -14.882206 -5.706000 0.000000 -0.000001 12.870206 0.342896 -9.975701 8.564302 0.000000 0.000002 +10.651241 83.705695 -39.361869 100.829098 1.354889 15.014794 -8.040200 1.015000 0.469200 -2.787201 0.666201 -0.272101 -5.919202 0.285401 -3.221701 -0.595903 -1.397800 -1.212299 3.465899 -9.268200 3.448598 11.048700 -6.623799 -9.159099 7.554203 20.437101 7.084097 -5.889459 -85.291600 -13.469560 -0.000005 -0.000007 -98.630397 41.751802 30.818599 -4.040401 10.296903 -28.363001 17.801293 86.593507 73.075010 -69.697911 0.000012 -0.000016 91.364497 31.944800 -26.290397 4.285894 6.748301 -0.308201 18.252902 7.470300 0.000001 -0.000001 1.386895 -0.717000 4.595097 23.358600 0.000004 0.000008 -23.781704 4.516905 -14.423403 -5.551002 0.000000 -0.000001 13.767794 0.908898 -9.189000 9.161801 0.000000 0.000000 +11.237473 83.219785 -42.680631 100.536498 1.094674 13.845512 -7.504698 0.428100 0.404000 -2.543999 0.650700 -0.287700 -6.058100 0.460600 -3.022801 -0.485199 -1.348599 -1.153102 4.762900 -9.170803 4.024298 12.423900 -6.295800 -8.871397 7.733304 20.149498 7.108701 6.765125 -83.989406 -0.824978 -0.000007 -0.000006 -101.171501 39.964299 31.750098 -4.413910 11.798803 -28.510899 19.174094 88.083902 72.977803 -70.167001 0.000010 -0.000017 93.287502 31.238603 -28.708200 5.619996 6.260797 -0.870501 16.958600 11.247299 -0.000001 0.000001 2.681899 -1.250997 6.288800 23.131305 0.000001 0.000006 -25.763196 4.216402 -13.764303 -5.734702 0.000000 -0.000001 14.440601 1.726297 -8.562099 10.114903 0.000000 0.000001 +11.902445 82.720929 -45.986695 100.026400 0.926297 12.804601 -6.923498 -0.064200 0.491599 -2.322501 0.615301 -0.266400 -6.042399 0.283900 -2.867699 -0.350202 -1.318799 -1.128400 6.096997 -8.773101 4.216897 13.531801 -6.067196 -8.655201 7.661203 19.919798 7.087099 8.776731 -83.027205 1.376829 -0.000007 -0.000008 -102.067103 39.661599 31.982998 -5.540602 12.188702 -28.490499 19.528394 89.127789 74.281608 -70.465095 0.000012 -0.000014 93.761599 30.236299 -31.070298 7.515493 8.760202 -0.053800 12.074600 4.077999 0.000000 0.000002 2.921501 1.695803 8.852597 22.455306 -0.000000 0.000005 -26.640999 3.444004 -13.493706 -7.740602 0.000000 -0.000001 15.430001 2.664997 -7.884799 11.148901 0.000000 0.000001 +12.923779 82.318085 -49.434234 99.741795 1.581459 11.104604 -6.544799 -0.922501 0.498701 -2.052398 0.522400 -0.223998 -6.144401 -0.213600 -2.174501 -0.253197 -1.312199 -0.985000 7.264703 -8.536902 4.336696 14.224203 -5.904998 -8.655899 7.588702 19.437495 7.243200 5.343042 -82.627003 -1.300359 -0.000005 -0.000006 -101.553903 38.884200 31.955396 -5.315106 12.228404 -28.525204 19.593495 89.587915 76.521509 -71.260721 0.000012 -0.000016 92.873702 25.404502 -32.514996 7.867498 10.641502 -0.610200 8.081002 -4.293299 -0.000000 0.000002 1.141800 4.614303 11.292299 22.908504 0.000001 0.000005 -27.015295 1.232403 -13.567305 -11.494504 0.000001 -0.000001 15.749403 4.926796 -7.357401 15.983403 0.000001 0.000002 +14.354307 82.298019 -53.084730 99.813403 3.687759 8.780210 -6.188796 -2.854600 0.222400 -1.573000 0.378700 -0.186102 -6.987401 -1.046301 -1.198400 -0.255301 -1.390399 -0.831601 8.533603 -8.289899 4.810798 14.864401 -5.723998 -8.498999 7.089805 18.116094 8.130998 -2.587267 -81.945804 -8.244770 -0.000004 -0.000004 -100.089203 36.964695 31.887403 -4.687806 11.269503 -27.937502 19.504390 86.277014 79.723910 -68.316908 0.000016 -0.000014 90.311097 21.492502 -32.284997 7.860892 10.456402 -3.257901 6.964602 -8.022401 0.000000 -0.000001 -5.355103 10.372305 14.524401 22.882408 0.000002 0.000005 -27.466701 -2.858798 -12.956503 -16.032303 0.000001 -0.000001 15.026304 6.322297 -7.522401 18.966699 -0.000000 0.000003 +15.845290 82.386909 -56.979563 100.348495 5.224201 7.165897 -5.957798 -3.615301 0.154500 -1.416699 0.074400 -0.141901 -7.326098 -2.322400 -0.829903 -0.266403 -1.516299 -0.890401 9.185396 -7.796701 4.915698 15.497505 -5.434499 -8.107598 5.730699 17.784800 8.985398 -10.369953 -82.312894 -14.766554 -0.000005 -0.000003 -96.848503 34.293008 30.716700 -4.757812 9.766502 -27.428696 18.866496 79.241700 84.562313 -62.357796 0.000011 -0.000014 85.801000 21.242804 -31.063306 8.119496 10.100603 -4.781201 5.092501 -13.392705 0.000001 -0.000001 -6.976306 7.805504 17.075598 23.394008 0.000001 0.000005 -27.059899 -6.229799 -11.909102 -22.495001 0.000002 -0.000002 12.415002 6.404096 -8.380702 23.215202 0.000000 0.000003 +17.385800 82.552024 -60.836045 101.069598 6.336069 7.143504 -6.083997 -3.881400 0.171499 -1.622000 -0.222600 -0.116199 -7.001999 -3.237300 -1.265800 -0.225200 -1.595898 -1.121000 9.124503 -7.478803 4.619400 16.129302 -5.213198 -7.796097 4.796502 18.287399 9.341600 -20.829874 -83.621001 -23.210974 -0.000005 -0.000003 -92.114499 30.878406 29.016791 -3.356707 7.628303 -27.484900 17.722894 43.643290 89.103310 -28.467094 0.000011 -0.000014 79.895400 19.338902 -25.823202 7.004597 8.660904 -6.163400 6.061302 -17.945200 0.000001 -0.000001 -3.467801 6.711205 16.174096 23.076805 0.000003 0.000006 -25.545404 -9.186794 -13.303704 -30.739003 0.000004 -0.000003 6.858801 6.916598 -7.198302 26.858804 0.000001 0.000004 +18.794484 82.947746 -64.575177 102.183298 7.318766 7.079306 -6.672496 -4.259400 0.054998 -2.052698 -0.429100 -0.085300 -6.554199 -3.925300 -1.279400 -0.142897 -1.636499 -1.178602 8.983899 -7.461300 4.371299 16.600604 -5.207899 -7.806599 4.035303 18.616902 9.800798 -33.679287 -84.950696 -34.507588 -0.000003 -0.000003 -85.312703 26.637499 25.149992 -2.070206 4.191805 -27.077103 15.564200 -78.672107 85.727084 92.642906 0.000010 -0.000015 73.401502 16.629800 -20.651100 4.989997 4.667601 -7.711000 6.353603 -18.482702 0.000001 0.000000 -0.275303 7.945306 15.493097 22.684308 0.000001 0.000006 -22.755399 -12.210097 -13.727305 -40.407703 0.000005 -0.000003 -0.073203 8.548200 -7.070402 25.275807 0.000000 0.000005 +19.941040 83.555578 -68.165975 103.615997 7.576080 6.180603 -7.313996 -4.214399 -0.008602 -2.580499 -0.515000 -0.049101 -6.440101 -4.448101 -0.765002 -0.134897 -1.687699 -1.109201 9.243204 -7.688799 4.595200 17.129903 -5.032398 -8.210499 3.364403 18.576000 10.839796 -50.037359 -85.369890 -50.197060 -0.000003 -0.000001 -75.641797 23.935197 21.455394 -3.027606 0.270407 -25.895302 13.684201 -82.541633 83.043988 95.451030 0.000006 -0.000012 67.279016 13.676499 -15.118795 3.641694 -1.052799 -8.412600 6.965202 -15.876701 0.000001 -0.000001 1.555799 8.636107 14.838903 22.102303 0.000001 0.000004 -18.490200 -14.039898 -11.815802 -50.222511 0.000004 -0.000003 -7.202796 9.499698 -10.304406 14.994395 -0.000001 0.000002 +20.761714 84.228435 -71.447409 104.570489 6.479790 6.212298 -7.637699 -3.469400 0.042598 -2.899899 -0.438700 -0.052700 -6.664901 -4.158300 -1.003803 -0.209200 -1.682399 -1.155902 9.679300 -8.349799 5.081799 17.863701 -4.761696 -8.670498 2.745203 17.980400 11.563900 -50.606932 -85.504692 -51.041431 -0.000004 -0.000004 -63.573010 18.004497 18.248991 -3.346511 -3.026895 -24.425701 12.034002 -88.391984 82.576790 100.322381 0.000006 -0.000011 59.603106 8.561904 -10.521996 4.102298 -5.994902 -7.520000 7.667503 -13.024003 0.000001 -0.000001 2.863198 8.599504 13.457095 21.581805 0.000000 0.000004 -14.288599 -13.196595 -10.538701 -57.297508 0.000004 -0.000002 -5.855805 8.660096 -15.419104 15.458004 -0.000004 0.000001 +21.332960 84.902540 -74.497181 105.174699 4.671400 7.988493 -8.012201 -2.487800 0.007799 -3.135201 -0.304000 -0.098501 -6.715000 -3.175800 -2.331901 -0.265201 -1.592798 -1.329300 9.784604 -8.591300 4.936297 18.430403 -4.605298 -8.535300 2.540703 17.670396 11.251998 -40.759828 -85.692595 -41.763627 -0.000003 -0.000001 -49.403004 11.877704 15.520995 -1.071214 -5.965197 -23.233202 10.376598 -94.108694 83.125289 105.435590 0.000005 -0.000012 50.352913 10.142697 -7.373700 3.226203 -10.065200 -5.413801 8.218300 -10.515400 0.000001 0.000001 3.990897 8.218404 10.989798 21.675206 0.000000 0.000003 -10.531701 -10.694700 -11.578802 -61.666909 0.000006 -0.000002 1.598093 5.903096 -20.938701 14.031504 -0.000002 0.000002 +21.897602 85.425775 -77.353660 105.538103 3.005274 10.336805 -8.468797 -1.664400 -0.088802 -3.239399 -0.229101 -0.161600 -6.628999 -2.064699 -4.141100 -0.275200 -1.480998 -1.612101 9.710302 -8.265399 4.561000 18.710502 -4.538999 -7.835899 2.342502 17.257100 10.485198 -13.688562 -85.693501 -15.382363 -0.000001 -0.000001 -35.431504 10.049103 10.959495 2.517593 -8.215697 -21.812700 9.126998 -106.261647 87.234488 117.421742 0.000002 -0.000010 40.421302 11.868401 -3.737301 1.828702 -13.419405 -3.143899 8.899899 -8.361101 0.000001 0.000000 5.067398 7.678902 7.976601 21.865205 -0.000000 0.000002 -6.851700 -8.423899 -13.555602 -63.233304 0.000006 -0.000003 4.802204 3.346596 -24.075098 11.409601 -0.000001 -0.000001 +22.511268 85.700593 -80.056731 105.756494 1.797188 12.427405 -8.901505 -1.086401 -0.244203 -3.381899 -0.235400 -0.217800 -6.473400 -1.157599 -5.861801 -0.243798 -1.348700 -1.883401 9.527602 -7.646102 4.112499 18.670101 -4.426396 -6.673000 2.161303 16.498298 9.618800 28.725449 -83.554706 26.302347 -0.000000 -0.000001 -22.708106 9.539502 7.094698 3.536196 -9.281396 -20.475203 8.507398 88.181927 86.864013 -77.408332 0.000002 -0.000008 31.061904 16.053502 -2.906801 2.306802 -16.149901 -1.301499 10.141197 -6.736100 -0.000000 0.000002 5.799801 7.093203 4.839400 21.503502 0.000001 0.000003 -3.269801 -7.019500 -15.491600 -62.530006 0.000007 -0.000003 5.282303 3.136891 -24.852703 11.772895 0.000000 0.000006 +23.179288 85.729313 -82.652105 105.652594 1.118495 13.739496 -9.107903 -0.812600 -0.336101 -3.488201 -0.281700 -0.253701 -6.567502 -0.629798 -7.014301 -0.211903 -1.162398 -2.088101 9.836200 -6.972100 3.821399 18.322201 -4.406899 -5.655400 1.975102 15.767101 8.942800 46.952970 -79.183407 44.534967 -0.000002 0.000001 -14.596405 7.382302 8.506803 4.261504 -9.743198 -19.511300 8.039999 83.215000 78.525210 -73.158404 0.000002 -0.000006 25.606707 24.861400 -4.149401 0.105898 -18.270401 -0.329101 10.980903 -5.646500 0.000001 0.000000 6.483399 6.824201 2.895001 21.089903 0.000000 0.000003 0.320503 -6.524900 -16.788202 -59.950906 0.000005 -0.000002 6.595001 3.682796 -23.508099 12.473304 -0.000000 0.000003 +23.840196 85.591907 -85.233507 105.364304 0.756775 14.450806 -9.140399 -0.686601 -0.348303 -3.490297 -0.322301 -0.265802 -7.030100 -0.309898 -7.495101 -0.244200 -0.961898 -2.160900 10.550399 -6.691300 3.712299 18.217207 -4.355097 -5.322100 1.343803 15.504800 8.645999 54.554402 -75.240305 52.202801 0.000002 -0.000000 -10.775902 4.045996 13.576299 5.294002 -9.811897 -19.385003 7.118396 83.024294 70.322509 -74.005500 0.000001 -0.000006 24.115205 34.962091 -8.070009 1.025196 -20.192803 0.089102 10.878396 -4.799001 -0.000000 0.000003 7.334698 6.655800 2.503400 20.998804 0.000000 0.000004 3.364502 -6.243001 -17.199999 -54.831806 0.000004 -0.000002 8.026897 4.744193 -21.090604 11.536704 -0.000000 -0.000002 +24.484851 85.348549 -87.820492 104.860597 0.631997 14.863103 -9.093199 -0.461202 -0.346802 -3.399902 -0.359900 -0.255900 -7.361900 -0.318398 -7.463600 -0.287498 -0.871198 -2.161701 10.797102 -6.690997 3.616500 18.149605 -4.454801 -5.504699 0.992903 15.670799 8.846998 58.557591 -72.086109 56.625689 0.000000 0.000002 -9.629600 4.247799 17.287498 5.162202 -9.448497 -19.907198 5.886097 82.835894 63.833810 -75.465702 -0.000000 -0.000009 26.364506 47.286798 -12.809702 3.089997 -22.040302 0.182700 10.928400 -3.865300 -0.000000 0.000001 8.211501 6.492902 2.077399 20.931403 -0.000000 0.000002 5.554303 -5.896401 -16.894198 -46.757108 0.000005 -0.000003 7.831699 6.008993 -19.131002 10.856505 0.000000 0.000001 +25.088101 85.030295 -90.486725 104.069200 0.535278 15.232694 -8.868498 -0.128001 -0.394001 -3.217399 -0.360701 -0.244903 -7.290002 -0.482797 -7.333999 -0.279602 -0.909499 -2.145401 10.175703 -6.838199 3.474999 17.256804 -4.772099 -5.602000 0.593503 15.553700 9.505101 59.075198 -69.761706 57.691197 0.000001 0.000001 -10.460900 7.100901 18.216197 4.217601 -8.970697 -20.618096 4.843095 81.623698 58.759410 -75.955008 0.000001 -0.000005 30.059912 52.614798 -14.211397 4.370997 -23.893404 0.221300 11.689899 -2.541001 0.000000 0.000000 9.066799 6.038402 0.892402 21.056404 0.000002 0.000005 6.421305 -5.172601 -16.382298 -35.210206 0.000004 -0.000002 6.622100 7.125094 -18.135103 10.782999 -0.000002 -0.000001 +25.746469 84.562183 -93.274121 102.937007 0.831181 15.918401 -8.398899 -0.104501 -0.555700 -2.976697 -0.366401 -0.253000 -6.824501 -0.684098 -7.504898 -0.241201 -1.020198 -2.214500 8.566598 -6.904500 3.263598 15.268702 -5.281099 -5.216199 -0.071099 15.355399 10.485099 56.143402 -69.425300 55.440501 0.000004 0.000001 -12.530903 12.098397 17.388299 3.077497 -8.580997 -21.555095 4.017395 79.328303 56.504215 -74.998104 0.000002 -0.000006 33.388208 50.900091 -13.286120 4.508488 -25.454305 -0.034301 11.990500 -1.441999 0.000000 -0.000001 9.904900 5.253901 -0.213899 20.837405 0.000001 0.000004 5.682405 -4.575000 -15.744796 -20.524406 0.000002 -0.000002 5.352901 7.696493 -16.747105 11.809502 0.000001 0.000003 +26.437600 83.986870 -96.267262 101.861998 1.560200 16.962102 -7.825100 -0.332599 -0.729504 -2.715100 -0.417700 -0.266701 -6.312000 -0.922398 -7.866100 -0.248700 -1.161398 -2.328399 6.269896 -7.021801 2.941398 12.684803 -5.914098 -4.755700 -0.667400 15.503498 11.378100 50.083308 -71.181910 50.319605 0.000001 -0.000001 -15.423003 16.792491 16.241889 2.805097 -8.034998 -22.291400 3.162795 75.663715 57.041517 -72.605814 0.000002 -0.000008 36.686811 48.459699 -13.762309 4.772193 -26.972108 -0.401700 12.532500 -0.979799 -0.000001 -0.000001 10.802297 4.212000 -1.876299 20.599400 0.000002 0.000005 4.145401 -4.262400 -14.212001 -5.919701 0.000000 -0.000001 4.693999 6.890996 -15.308203 13.024302 0.000001 0.000003 +26.973799 83.468451 -99.428816 101.392813 1.901168 18.194201 -7.393097 -0.066301 -0.790901 -2.488400 -0.479100 -0.272198 -6.243201 -1.127198 -8.183498 -0.300099 -1.284499 -2.412100 4.424298 -7.000799 2.415398 10.578705 -6.282099 -4.760700 -0.988200 15.699900 11.934000 37.407616 -74.363013 38.528017 -0.000001 -0.000001 -18.672501 21.226298 15.263901 2.636399 -7.232998 -22.252699 2.262696 70.837212 58.704918 -68.889110 0.000003 -0.000007 40.233202 46.427404 -15.096614 4.721093 -28.549205 0.137696 12.581704 -1.513600 0.000000 0.000000 11.871403 3.355898 -2.940902 20.793606 -0.000002 0.000000 2.740503 -3.533000 -12.718901 4.492802 0.000000 0.000000 5.286898 6.634395 -14.360001 13.099505 0.000001 0.000003 +27.319747 82.976204 -102.702617 101.383797 1.741382 19.501201 -7.077201 0.542500 -0.776500 -2.244200 -0.442299 -0.260700 -6.588001 -1.141297 -8.425100 -0.412000 -1.324599 -2.451000 3.756002 -6.707900 1.871999 10.448002 -6.473000 -5.102598 -1.468198 15.893803 11.929900 26.057878 -76.671600 27.190977 -0.000000 -0.000003 -22.515707 26.666200 13.448802 4.229894 -6.774796 -22.120298 1.756395 65.968995 61.042204 -65.077803 0.000002 -0.000009 44.027212 44.944898 -16.657103 5.223795 -29.810803 1.678097 12.858002 -3.310901 0.000002 0.000003 13.123209 2.244897 -3.964503 21.472006 0.000001 0.000004 2.431401 -2.099600 -13.331900 8.218101 -0.000001 0.000001 6.367496 7.238694 -12.824402 12.060401 0.000001 0.000002 +27.443953 82.589870 -106.099861 101.768094 1.009997 21.038699 -6.922296 1.660200 -0.808500 -1.983401 -0.364700 -0.253499 -7.014400 -1.030798 -8.651802 -0.444599 -1.299198 -2.476001 4.370502 -6.438501 1.389697 11.295701 -6.375199 -5.702599 -1.472998 16.188901 11.332103 15.617562 -78.728904 16.350663 -0.000000 -0.000003 -26.866308 32.263404 11.952196 4.933992 -6.562099 -21.953297 1.576196 62.259902 63.555005 -62.347005 0.000000 -0.000007 47.357199 41.877597 -18.148099 5.532300 -30.240803 4.367900 12.093904 -7.027904 0.000001 0.000001 14.397301 1.316899 -3.867898 22.195101 -0.000000 0.000002 3.445601 -0.200599 -12.704700 4.646699 0.000000 0.000002 4.214894 4.561596 -11.014000 10.462608 -0.000001 0.000002 +27.629373 82.309947 -109.628927 102.197314 0.900662 22.885617 -6.858598 2.315899 -0.804100 -1.834600 -0.332601 -0.280897 -7.265698 -0.809998 -9.151399 -0.377201 -1.299299 -2.585202 5.709503 -6.496500 1.135497 12.356201 -6.194196 -6.539399 -1.274197 16.130702 10.507498 -8.183358 -79.965996 -8.532559 -0.000002 -0.000003 -32.741304 37.986001 12.038895 5.270695 -6.359595 -21.837597 1.757195 60.178497 66.543107 -60.835599 0.000004 -0.000013 48.185902 34.033399 -18.900807 9.192197 -30.089403 6.773003 9.904098 -11.929403 0.000000 0.000004 14.711902 0.367599 -2.968503 23.868803 -0.000004 -0.000001 4.938003 0.388601 -8.937699 -2.139700 0.000000 0.000000 -1.597699 2.882096 -10.360100 9.433303 0.000001 0.000002 +27.755103 82.353889 -113.312697 102.966111 0.439371 24.609711 -6.609397 3.031700 -0.691700 -1.649299 -0.077301 -0.313701 -7.664000 -0.336197 -9.626699 -0.343300 -1.310098 -2.675501 7.135104 -6.870799 1.131098 13.366201 -6.125899 -7.539799 -0.326396 15.447595 9.457802 -31.075843 -78.859799 -33.545543 -0.000001 -0.000002 -39.620309 42.837595 11.763688 5.317789 -6.249795 -21.394298 2.476997 58.690201 69.800606 -58.733510 0.000004 -0.000011 46.434904 28.042899 -20.987203 10.136998 -29.095199 9.535900 7.153698 -18.253500 0.000001 -0.000001 13.015398 -0.989798 -1.241801 26.745504 -0.000000 0.000005 6.051098 1.309999 -4.917697 -9.169199 0.000000 0.000000 -3.795902 5.411995 -14.464403 11.452504 0.000001 0.000003 +27.719038 82.696794 -117.094249 104.176802 0.236481 26.171803 -6.714099 3.222700 -0.686100 -1.738801 0.016800 -0.352401 -7.540199 0.272203 -10.043600 -0.288598 -1.208299 -2.722100 7.780601 -7.204499 1.202999 13.772404 -5.898401 -8.121801 1.395201 15.487297 7.996499 -47.378026 -77.310593 -52.103528 -0.000000 -0.000003 -47.529309 46.726391 12.716209 5.406704 -6.932097 -20.825297 3.863096 57.228582 73.676607 -55.077784 0.000003 -0.000008 41.486306 23.676395 -19.961300 9.100393 -26.782897 12.484905 5.671296 -26.826808 0.000001 0.000002 8.768796 -2.836900 -0.468795 29.332807 0.000000 0.000004 5.587404 2.649100 -5.677502 -15.406402 0.000001 -0.000001 -0.879201 4.198497 -14.485901 10.984807 -0.000001 0.000002 +27.816317 83.241624 -120.629429 105.357405 1.098178 27.663102 -7.264297 2.709400 -0.650801 -2.231499 -0.076100 -0.381803 -7.003402 0.527103 -10.726697 -0.173002 -1.110298 -2.869699 8.010901 -7.123800 0.925499 13.358805 -5.465001 -8.455798 3.431602 16.342401 5.879995 -58.243705 -75.598492 -65.828808 -0.000001 -0.000004 -55.557906 48.578193 14.772393 4.861491 -7.009799 -20.004097 5.310796 55.353680 77.722809 -50.517785 0.000001 -0.000004 34.564200 18.044503 -15.237504 7.586801 -22.951403 14.029300 3.273902 -36.864505 0.000004 -0.000004 1.822402 -6.605300 1.939003 28.652305 -0.000003 0.000004 2.646702 3.691002 -5.857799 -17.450502 0.000002 -0.000001 1.940098 2.259794 -15.753508 10.292198 0.000000 0.000001 +27.964145 83.875113 -123.638053 106.226703 2.460797 29.404598 -8.066096 2.064399 -0.569701 -2.810300 -0.265401 -0.392700 -6.577600 0.513103 -11.504297 -0.066399 -1.027098 -3.029100 8.329202 -7.098800 0.465699 12.560007 -5.255299 -8.882299 6.369601 17.714198 2.783799 -64.817432 -74.363385 -75.888029 -0.000002 -0.000007 -62.858811 50.758701 17.157396 3.931586 -6.620799 -19.300305 6.601397 50.200255 82.198509 -43.520460 0.000002 -0.000007 29.555007 14.899399 -11.652404 6.865098 -17.309295 13.844498 -0.295903 -47.722508 0.000003 -0.000002 -5.282902 -9.559398 6.992905 27.268704 -0.000001 0.000005 -0.786397 4.142800 -7.418800 -17.505300 0.000001 0.000001 3.040203 -0.676006 -16.530401 7.751904 0.000000 0.000002 +28.285966 84.375732 -126.035039 106.162498 3.917008 30.459001 -8.607298 1.364401 -0.567200 -3.138901 -0.381101 -0.381899 -6.305999 0.217303 -11.531401 -0.004799 -1.030198 -3.078602 8.489102 -7.409200 0.209099 11.983703 -5.212199 -9.818199 10.413701 19.369599 -0.513401 -71.702905 -73.954191 -86.640002 -0.000004 0.000000 -68.236499 50.690692 19.727495 3.049191 -6.749501 -19.226097 7.963596 53.365578 85.537807 -45.278183 0.000004 -0.000009 28.446607 7.906905 -10.310303 5.536296 -11.738698 11.910002 -1.973401 -56.497508 0.000008 -0.000004 -4.282607 -7.859596 13.567903 22.081107 -0.000002 -0.000001 -2.970599 3.643401 -7.608199 -17.857799 0.000001 0.000001 4.200199 -0.630606 -17.429502 6.545704 0.000000 0.000002 +28.611340 84.855538 -128.111240 105.762813 5.253398 30.282389 -8.962099 0.606199 -0.560699 -3.383501 -0.565399 -0.343305 -6.340097 -0.197198 -10.974899 0.024201 -1.003398 -3.010101 8.520198 -7.840498 0.371797 11.674804 -5.139599 -10.485400 14.398303 21.377396 -3.587903 -80.439616 -74.790887 -99.134013 -0.000004 -0.000002 -72.136305 49.794399 23.907407 1.960196 -6.556999 -19.209596 9.121093 48.858220 88.788208 -39.514223 0.000005 -0.000005 29.373505 1.989299 -10.152803 4.113592 -6.990698 9.500001 -1.227696 -62.216207 0.000005 -0.000002 1.814292 -2.866392 17.855805 23.631205 -0.000007 0.000000 -4.515399 2.736901 -8.187597 -18.243703 0.000001 0.000000 4.900601 -0.909106 -17.084904 6.465101 0.000000 0.000001 +28.902170 85.270076 -129.944355 105.212005 6.324798 29.485098 -9.300296 -0.104600 -0.575402 -3.595800 -0.839700 -0.306203 -6.236301 -0.600496 -10.639098 0.049900 -0.966498 -2.963802 8.342605 -8.070401 0.688096 11.364405 -4.989499 -10.232599 17.773406 23.794496 -6.301508 -93.035003 -76.763888 -114.421403 -0.000003 -0.000005 -75.139109 50.300702 25.692603 1.174193 -5.885998 -19.477699 10.360598 -98.515220 86.598487 108.901415 -0.000002 -0.000007 31.292508 2.275506 -10.572900 3.726703 -2.846800 7.282800 0.255699 -64.370906 0.000006 -0.000002 4.299095 -0.177990 19.547301 22.485603 0.000002 0.000005 -5.717499 1.836701 -8.455304 -18.368003 0.000002 0.000000 5.477998 -1.309705 -16.403698 6.539399 0.000000 0.000001 +29.214587 85.617284 -131.662419 104.751209 6.856474 28.664101 -9.454801 -0.599901 -0.595200 -3.676600 -1.011199 -0.301899 -6.137799 -0.712497 -10.704595 0.041700 -0.960099 -2.981700 7.979601 -8.213901 1.028096 10.951702 -4.680200 -9.484699 20.114607 25.404697 -8.319906 -102.166078 -78.443385 -125.545787 -0.000002 -0.000003 -76.950701 49.442394 25.435695 0.767993 -5.211998 -19.906599 11.614697 -94.766705 80.947283 106.147401 0.000008 -0.000008 34.083508 5.582500 -10.977295 4.863999 0.597902 5.808201 1.559999 -63.453905 0.000004 -0.000002 5.315696 -0.075689 18.851303 22.333904 -0.000001 0.000005 -7.297802 1.340401 -9.440502 -17.247501 0.000001 0.000000 5.783002 -1.602104 -14.932099 6.591103 0.000000 0.000001 +29.585176 85.928942 -133.361163 104.546702 6.962592 27.755712 -9.389802 -0.826500 -0.583200 -3.629801 -1.086901 -0.307101 -6.212600 -0.663996 -10.850698 -0.010400 -0.963598 -2.999303 7.458999 -8.264999 1.344598 10.347303 -4.513599 -8.480401 21.331302 25.956099 -9.651803 -105.655175 -79.856886 -130.700281 -0.000004 -0.000001 -75.666400 48.708895 25.617805 -0.397501 -4.274296 -20.056799 12.472301 -90.321708 74.996784 102.308010 0.000002 -0.000010 37.383907 5.274900 -11.532900 5.601602 2.741402 5.185500 2.962099 -59.386405 0.000005 -0.000004 7.310602 0.103502 15.962502 22.291806 -0.000001 0.000002 -9.215799 1.313202 -10.136301 -15.480299 0.000001 0.000000 5.685704 -1.699005 -13.526999 6.663399 0.000000 0.000001 +29.978624 86.196668 -134.994647 104.482404 6.758483 26.536598 -9.301195 -0.842000 -0.567303 -3.614298 -1.104800 -0.304002 -6.135599 -0.615398 -10.899798 -0.006998 -0.937798 -2.993901 7.072699 -8.143298 1.696700 9.755002 -4.616298 -7.339502 21.572505 26.313795 -10.250204 -106.245555 -81.094886 -132.671353 -0.000002 -0.000003 -69.176497 45.430293 24.184808 -0.684707 -3.682797 -20.301301 12.845899 -88.042195 69.610786 100.587792 0.000003 -0.000008 40.963312 3.836702 -12.270803 5.632995 3.299802 5.200499 4.649397 -52.013410 0.000003 -0.000001 9.263602 0.011304 12.478403 22.443399 0.000001 0.000008 -10.654498 1.451701 -10.292305 -14.436602 0.000001 -0.000002 5.510897 -1.542504 -12.126802 7.174202 0.000000 0.000001 +30.459446 86.413068 -136.560047 104.474110 6.323878 24.898012 -9.104895 -0.717300 -0.514403 -3.620499 -1.079400 -0.307300 -5.907199 -0.529597 -10.988202 0.021302 -0.907099 -2.997502 6.790001 -8.135900 2.262399 9.563702 -4.665800 -5.973702 20.686805 26.099891 -10.112707 -99.085540 -82.056491 -126.594042 -0.000001 -0.000004 -58.625201 42.001006 21.459894 0.028091 -3.194898 -20.729398 12.989501 -87.441305 65.382579 100.538108 0.000005 -0.000011 43.714809 3.176903 -12.095501 5.460904 2.374899 5.135299 5.794400 -41.873103 0.000003 -0.000001 8.983395 -0.684196 9.549705 21.684901 0.000001 0.000005 -11.861399 1.593102 -10.342502 -13.632900 0.000001 -0.000001 5.283402 -1.567904 -10.695601 7.545103 0.000000 0.000001 +30.978368 86.521026 -138.096996 104.483700 5.574987 22.944395 -8.725996 -0.500701 -0.451802 -3.494999 -1.045601 -0.307302 -5.795999 -0.310797 -11.152000 -0.012700 -0.870999 -2.948401 6.771601 -8.090398 2.756999 9.607201 -4.556199 -4.257300 19.072105 25.498996 -9.750306 -86.431209 -82.685288 -114.468911 -0.000001 -0.000002 -48.160610 41.118104 19.174301 1.566292 -2.925597 -21.396201 13.088498 -88.547003 63.268779 101.940701 0.000008 -0.000012 45.830706 2.943804 -10.906901 5.475297 0.103001 5.203598 5.688501 -29.840004 0.000002 -0.000002 6.252496 -1.626798 6.097299 21.225906 -0.000002 0.000001 -13.126899 1.884601 -9.914803 -12.507604 0.000000 -0.000001 5.246104 -1.100903 -9.146699 7.636700 0.000000 0.000001 +31.498560 86.510612 -139.626594 104.659497 4.486408 20.700098 -8.431102 -0.158300 -0.397401 -3.312100 -0.913800 -0.301600 -5.756299 -0.090397 -11.169696 -0.058001 -0.824898 -2.896500 6.930702 -7.859601 3.271099 9.911201 -4.272000 -2.561598 17.286401 25.050894 -8.934105 -74.693445 -82.132487 -101.733848 0.000001 -0.000004 -44.668901 41.097395 19.141300 2.508395 -3.073099 -21.948598 12.996498 -89.655200 62.220987 102.911793 0.000008 -0.000012 47.607904 3.907702 -10.659599 5.450201 -2.911401 5.806198 5.545701 -18.393102 0.000002 0.000000 1.899301 -3.012500 2.070698 21.241207 0.000000 0.000004 -14.339401 2.479501 -8.995300 -11.568101 0.000002 -0.000003 5.388604 -1.139803 -7.982001 7.745403 0.000000 0.000001 +32.192234 86.491049 -141.081757 104.896700 3.861596 18.148692 -8.225298 -0.283999 -0.392504 -3.119601 -0.811599 -0.307701 -6.048700 0.102203 -10.761899 -0.144698 -0.761699 -2.809100 7.134899 -7.597801 3.825298 10.586603 -4.022000 -1.560999 15.589703 24.750897 -7.204305 -72.702905 -81.471190 -98.106907 0.000000 -0.000005 -50.857203 44.573597 21.967599 1.902595 -3.530897 -21.992401 12.634099 -89.420101 61.676585 102.184696 0.000007 -0.000010 48.619011 5.433499 -11.504200 5.576795 -5.389896 5.672801 6.311902 -11.710101 0.000001 0.000002 -2.527100 -2.446000 -1.105496 22.227701 0.000001 0.000005 -15.902099 2.314702 -8.134204 -10.502601 0.000001 -0.000001 5.627901 -0.905602 -6.496599 7.339103 0.000000 0.000001 +33.021288 86.435169 -142.368509 104.967005 3.442601 16.224500 -7.921602 -0.606400 -0.363802 -2.938198 -0.743000 -0.322898 -6.401900 0.380503 -10.337299 -0.240799 -0.676498 -2.699599 7.012503 -7.482001 4.071199 11.319200 -3.679399 -1.167101 15.344407 24.299698 -5.648204 -76.629126 -81.348088 -100.571732 -0.000003 -0.000001 -62.164502 47.038904 24.880900 0.894892 -4.186396 -21.668100 11.973895 -88.569602 61.911587 100.433900 0.000006 -0.000010 48.496211 6.962400 -12.163505 6.231998 -6.169501 5.046801 4.751399 -12.901000 0.000002 0.000001 -1.735701 0.368800 1.404300 21.713303 0.000002 0.000006 -17.492702 1.892202 -7.137502 -9.185799 0.000001 0.000000 6.000100 -0.557501 -5.659498 7.182603 0.000000 0.000001 +33.782528 86.171009 -143.436594 104.660303 2.450983 15.340196 -7.650897 -0.492200 -0.330400 -2.822501 -0.630100 -0.338302 -6.113199 0.714202 -10.365201 -0.191599 -0.570298 -2.659201 6.679400 -7.210199 3.951599 11.531000 -3.706500 -0.818099 16.254002 24.507499 -5.291204 -85.860777 -82.279784 -108.625688 -0.000004 -0.000002 -73.420702 45.906994 26.795399 -0.278506 -5.319697 -21.445599 11.078497 -87.693104 62.620685 98.885302 0.000002 -0.000008 47.191102 6.867806 -12.149102 6.184208 -6.216199 5.427100 4.652702 -14.933201 0.000001 0.000001 2.072500 0.817500 2.747400 21.323507 0.000000 0.000004 -18.276901 2.148002 -6.805501 -8.329501 0.000001 -0.000001 6.941801 -0.310802 -4.864600 7.222004 0.000000 0.000002 +34.663146 85.879912 -144.412203 104.241803 2.527195 14.192999 -7.596602 -1.277100 -0.323802 -2.746099 -0.685400 -0.358601 -5.612701 1.001503 -10.573798 -0.098502 -0.417599 -2.651900 6.331901 -7.239301 4.087098 11.040001 -3.695099 -0.244399 16.956507 24.973499 -5.340604 -91.486183 -83.726190 -114.067688 -0.000004 -0.000007 -77.678703 41.483394 27.517002 -0.925202 -6.163200 -21.247500 10.857398 -86.615603 63.328681 97.224494 0.000008 -0.000010 44.817010 6.872898 -11.861900 6.117796 -7.393702 4.518001 5.961399 -14.238500 0.000001 -0.000001 3.952798 1.643201 3.152699 20.959402 0.000000 0.000004 -19.315604 1.205302 -6.695402 -7.404301 0.000000 -0.000001 8.615396 -0.122501 -4.052199 7.299000 0.000000 0.000001 +35.627838 85.611703 -145.401784 104.048998 3.231468 12.798904 -7.272698 -2.109600 -0.295400 -2.590803 -0.870700 -0.365803 -5.673500 0.971303 -10.646499 -0.132099 -0.379399 -2.679399 5.886401 -7.685602 4.510298 9.968100 -3.669702 0.183600 17.442404 25.125700 -5.412404 -77.461535 -83.773590 -100.843035 -0.000002 -0.000005 -70.698803 36.616599 27.795493 -0.101312 -6.382097 -20.768201 10.817598 -85.635404 63.818683 95.589893 0.000006 -0.000010 41.857803 7.309600 -11.522799 6.120905 -9.516201 3.000999 7.407600 -12.501103 0.000001 0.000000 5.548001 1.836001 2.956302 21.247103 -0.000000 0.000002 -20.563698 -0.523098 -6.729402 -6.885200 0.000000 0.000000 10.686508 0.483798 -3.317500 7.874102 0.000000 0.000001 +36.511504 85.478851 -146.332443 104.062395 3.611682 11.927198 -6.878302 -2.415000 -0.320402 -2.555801 -0.978800 -0.382801 -5.923800 0.954403 -10.837200 -0.212299 -0.489999 -2.735800 5.528401 -8.154400 4.936899 8.765000 -4.205600 0.552900 17.099305 24.394398 -5.570003 -59.705543 -83.019989 -83.882851 -0.000000 -0.000005 -58.669091 37.617197 24.126495 1.830894 -6.777996 -19.700496 10.210499 -83.584300 64.127680 93.250496 0.000005 -0.000009 38.844409 8.315298 -10.766699 5.973702 -11.430600 1.960401 8.035801 -11.073501 0.000001 -0.000001 6.949898 1.575002 2.812602 21.437105 0.000000 0.000001 -20.877800 -1.900997 -7.341702 -8.212701 0.000001 -0.000001 12.575898 1.725999 -2.611400 8.328803 0.000000 0.000001 +37.127452 85.454475 -147.085053 103.557195 3.535962 11.109107 -6.482399 -2.601800 -0.390100 -2.410200 -1.086200 -0.401801 -6.107699 1.102603 -11.255400 -0.231602 -0.503399 -2.789500 5.796099 -8.558099 5.523399 7.571599 -4.919598 1.460200 15.255005 23.424992 -5.114004 -48.443448 -82.516394 -71.956856 0.000000 -0.000005 -52.927703 38.799505 22.081002 2.051393 -7.403500 -19.025597 9.758397 -82.219412 65.329683 92.069706 0.000001 -0.000008 36.214104 7.811001 -8.924404 4.441899 -12.393000 1.364999 7.646502 -9.905401 0.000000 -0.000001 8.125998 0.969801 3.567002 21.640507 0.000000 0.000003 -18.699902 -2.818598 -8.178504 -12.463402 0.000001 -0.000001 14.761298 3.164598 -3.848201 8.908705 0.000000 0.000001 +37.518868 85.477088 -147.809448 103.222494 3.318704 9.766396 -6.467101 -2.531299 -0.472002 -2.394400 -1.146200 -0.385101 -6.266898 0.762503 -10.984398 -0.223299 -0.538299 -2.791200 6.203300 -8.413401 6.049699 7.230603 -5.186000 2.030400 13.574505 23.005595 -3.725504 -49.710064 -81.293291 -71.897463 -0.000003 -0.000003 -54.304406 41.526600 22.366401 1.634596 -7.825098 -18.750099 9.804898 -82.262210 69.331792 91.395204 0.000003 -0.000010 35.305507 4.503999 -4.287599 2.648198 -14.125002 1.017600 9.468099 -7.515500 0.000001 -0.000002 8.720001 0.031101 2.705101 22.008707 -0.000001 0.000002 -15.401397 -3.548599 -11.002805 -18.007503 0.000001 -0.000001 17.114601 4.808996 -9.256702 8.956601 0.000000 0.000002 +37.766772 85.486217 -148.503135 103.073201 3.032780 9.028508 -6.688396 -2.292500 -0.587803 -2.513502 -1.165900 -0.354400 -6.485900 0.333103 -10.307999 -0.260501 -0.605999 -2.698400 6.615199 -8.264502 6.096599 8.023400 -5.000296 1.610701 13.340303 22.973602 -2.928304 -54.327232 -79.821992 -75.721037 -0.000002 -0.000004 -58.177707 44.404697 21.195597 1.181192 -8.209899 -18.483999 9.563898 -78.732199 74.071588 86.913798 0.000000 -0.000012 35.546104 3.297300 2.232095 0.263294 -15.776102 1.016901 12.092797 -5.258400 -0.000000 0.000001 8.624602 -1.438500 0.769401 21.924205 0.000000 0.000000 -12.516399 -4.076700 -15.077203 -21.858099 0.000002 -0.000002 18.909304 3.596697 -11.213001 9.697202 0.000001 0.000004 +37.823668 85.565475 -149.153105 102.985204 2.437975 9.443107 -6.982496 -2.082500 -0.672802 -2.720901 -1.176599 -0.349401 -6.826901 0.394103 -10.313200 -0.275001 -0.534498 -2.680500 7.547403 -8.181900 5.900200 10.505703 -4.767199 1.057600 14.015409 23.079992 -3.410305 -52.829953 -79.348089 -74.134954 -0.000002 -0.000006 -61.391216 43.620902 20.353999 0.550591 -8.458497 -18.205797 9.380197 -62.424723 77.943189 71.206618 0.000003 -0.000008 34.748604 3.398101 9.360601 -1.821895 -16.913898 1.641899 12.001201 -3.483201 0.000000 0.000000 8.006700 -2.342999 0.577203 21.946602 -0.000000 0.000002 -10.735798 -3.483399 -17.905703 -22.306800 0.000001 -0.000001 19.932507 3.986297 -10.578400 9.856000 -0.000002 0.000000 +37.709876 85.655140 -149.795992 102.722196 1.695194 10.002396 -7.215298 -1.975901 -0.712001 -2.912700 -1.207700 -0.345103 -7.090899 0.602204 -10.705600 -0.261099 -0.321299 -2.760499 9.366999 -7.882201 5.983899 14.274598 -4.696098 0.900600 15.070102 23.590994 -4.557704 -46.311439 -80.649992 -67.881341 0.000000 -0.000007 -63.246302 43.956998 20.637294 0.355188 -7.564900 -18.222099 10.121598 -28.315277 79.334192 38.526672 0.000003 -0.000006 33.178306 3.378303 13.392604 -3.091000 -17.615302 2.533799 12.166404 -2.083900 -0.000000 0.000002 7.588898 -2.912800 0.137900 22.073906 -0.000001 0.000001 -9.220896 -2.200199 -17.810401 -20.714803 0.000002 -0.000002 19.837901 5.645096 -7.250901 10.065803 0.000000 0.000002 +37.443684 85.729303 -150.547070 102.361399 0.760984 10.263500 -7.416000 -1.684500 -0.781502 -3.077099 -1.238200 -0.344100 -7.106500 0.701804 -10.971399 -0.165400 -0.097198 -2.848999 11.890401 -7.528399 6.432100 17.715500 -4.442900 0.786102 16.072102 23.795594 -5.436303 -34.134177 -81.605194 -55.966780 0.000000 -0.000008 -64.538300 45.434608 19.504105 -0.104804 -5.169399 -18.590000 11.849199 0.578149 75.861302 10.947548 0.000003 -0.000004 31.538405 9.329398 11.518696 -4.321699 -18.048305 3.713198 12.481900 -1.205900 -0.000000 0.000001 7.606002 -3.669200 -0.045998 22.150307 -0.000001 0.000003 -8.053198 -0.447700 -14.729202 -17.925603 0.000001 -0.000001 16.191202 5.167999 -4.356901 9.429202 0.000000 0.000001 +37.162758 85.751132 -151.459438 102.002596 0.071480 10.381005 -7.472299 -1.331500 -0.819201 -3.226801 -1.201800 -0.341001 -6.969099 0.501403 -11.065402 -0.075803 0.062400 -2.956100 14.041004 -7.352302 7.084899 19.991904 -3.976200 0.690901 16.511206 23.599299 -5.833504 -24.174487 -80.248893 -46.288090 -0.000001 -0.000002 -66.130206 48.560298 17.652696 0.324894 -1.239398 -19.082702 14.072600 8.643266 69.630313 3.467731 0.000002 -0.000011 30.308206 16.588401 7.389691 -3.942804 -18.263298 4.714398 12.704898 -1.108100 -0.000000 0.000004 7.993103 -4.572999 0.087507 21.798101 0.000001 0.000005 -7.521998 0.957501 -11.692605 -16.744002 0.000002 -0.000002 11.032701 2.900197 -7.413099 11.281896 -0.000001 0.000002 +36.916129 85.602041 -152.611595 101.744799 0.490275 10.481097 -7.489497 -1.570300 -0.759202 -3.283598 -1.206699 -0.324100 -6.635800 -0.079097 -10.781999 -0.062901 0.119803 -3.016299 14.727203 -7.326697 7.479100 20.388003 -3.550600 0.677600 16.407502 23.252194 -6.471804 -22.280766 -76.846394 -44.486568 -0.000003 -0.000006 -67.950506 50.715699 16.052089 0.828387 2.412802 -20.909101 16.291897 14.827682 64.481210 -1.374884 0.000004 -0.000009 29.773204 28.873801 2.570297 -3.195702 -18.386900 4.650300 12.452397 -2.045200 0.000000 -0.000001 8.954801 -4.526299 0.454103 21.645501 -0.000001 0.000001 -8.776699 0.970601 -12.999903 -16.256402 0.000002 -0.000002 13.276805 3.025297 -8.379499 11.747802 0.000000 0.000002 +36.622248 85.384884 -153.896807 101.826496 0.952962 10.727802 -7.517298 -1.241700 -0.609900 -3.218201 -1.058899 -0.267301 -6.475501 -1.142098 -10.100199 -0.110200 -0.029598 -3.022800 13.840100 -7.684901 7.626599 18.783604 -3.763398 0.692000 16.453005 22.563295 -7.320102 -25.338217 -70.997386 -47.119621 -0.000002 -0.000003 -69.684103 53.712601 12.903100 1.117095 6.215206 -23.926501 18.645800 18.507987 60.422503 -3.405890 -0.000001 -0.000006 30.186301 42.963792 -1.419702 -2.368001 -17.250900 4.841799 10.486704 -6.254400 -0.000000 0.000002 11.220803 -3.314899 2.409005 21.429705 0.000001 0.000003 -11.884599 1.279402 -15.940103 -12.745801 0.000001 0.000000 13.581501 2.096999 -5.465800 10.462104 0.000001 0.000003 +36.153875 85.140269 -154.889713 101.641305 0.346990 10.536403 -7.496696 -0.030901 -0.463800 -3.056199 -0.613999 -0.235200 -6.213401 -1.884097 -8.989198 -0.158702 -0.437099 -2.867800 11.804700 -8.911600 8.103198 16.105298 -4.559600 0.627201 16.485703 21.715692 -7.546002 -28.977733 -63.715896 -49.807029 -0.000003 -0.000003 -72.151304 58.539399 9.186003 1.673594 11.021706 -27.337100 21.986796 20.463293 56.640508 -3.522895 -0.000000 -0.000007 31.481407 53.891101 -2.579407 -1.387606 -12.550502 5.859201 6.634803 -15.942802 0.000001 0.000000 14.243399 -0.858398 6.684802 21.085798 -0.000001 0.000004 -12.677100 2.598103 -13.651102 -11.676203 0.000001 -0.000001 13.636301 1.377299 -7.025798 10.155803 0.000000 0.000002 +35.858219 84.960958 -155.732480 101.593790 0.050774 9.619201 -7.801795 0.570900 -0.184802 -2.985298 -0.154000 -0.261601 -5.961299 -1.971098 -7.892702 -0.346301 -0.960999 -2.654300 9.016400 -10.464699 8.697898 12.728300 -5.241197 0.892800 15.654500 21.635393 -7.127902 -30.700039 -58.706605 -50.791340 -0.000001 -0.000005 -75.496902 59.996600 7.549894 1.764496 16.844702 -30.864696 27.110495 19.740283 52.653506 -1.241587 0.000003 -0.000006 33.594306 51.198296 -4.359204 0.715397 -6.728599 5.945900 5.056901 -26.991403 0.000002 -0.000002 14.588002 1.089504 11.738604 20.902706 -0.000000 0.000002 -12.314599 2.757302 -12.677803 -13.286501 0.000001 -0.000001 14.628201 1.325898 -6.902999 10.483102 0.000000 0.000002 +35.793192 84.985083 -156.742120 101.991004 1.146072 9.596606 -8.497994 0.255800 -0.096601 -3.008699 -0.061200 -0.264299 -6.066600 -2.379098 -7.107601 -0.692798 -1.393598 -2.531900 5.393400 -11.123503 8.293299 9.244102 -6.031798 1.340802 14.686805 21.881993 -7.161005 -31.664519 -54.563599 -51.526518 -0.000005 -0.000004 -78.462399 61.592593 6.353995 1.270392 21.997606 -33.891399 31.932100 18.531789 48.817304 1.339308 0.000003 -0.000008 35.700706 46.435701 -5.280701 1.842799 -1.842899 4.604799 5.760604 -34.949204 0.000001 0.000001 14.507301 4.048405 16.843001 21.677706 0.000002 0.000004 -13.468798 1.778302 -13.525203 -13.685102 0.000001 -0.000001 15.248300 1.755699 -6.203700 10.266301 0.000000 0.000002 +35.705562 85.148910 -157.826443 101.801497 2.622278 10.542003 -8.910100 -0.328800 -0.095002 -3.017600 -0.160301 -0.237101 -6.259901 -3.159997 -6.439302 -0.957399 -1.735297 -2.461801 1.950701 -10.806901 7.123998 5.836502 -6.857600 1.388702 14.502504 22.292996 -7.791505 -32.999522 -51.494996 -52.750522 -0.000005 -0.000006 -80.817298 62.620190 5.766893 1.270495 26.517806 -36.609297 35.554098 18.069991 46.453707 3.117309 0.000003 -0.000008 37.657200 45.488195 -4.030707 1.686994 2.705500 2.865400 6.610203 -38.027905 0.000002 -0.000001 12.765705 4.718407 19.187701 21.115706 0.000001 0.000004 -14.877198 0.855402 -15.104302 -12.675200 0.000001 -0.000002 15.125504 1.673798 -5.975899 10.437501 0.000000 0.000002 +35.603203 85.295725 -158.993075 101.067399 3.636187 11.606505 -9.114700 -0.802601 0.046398 -2.941098 -0.245500 -0.225601 -6.279200 -3.697098 -5.798602 -1.129800 -1.999998 -2.386801 -0.560299 -10.426601 6.085197 3.153602 -7.271900 0.860799 14.678403 22.817192 -8.374405 -34.820111 -49.800989 -54.435114 -0.000005 -0.000008 -82.829199 61.757903 5.785699 1.085389 31.319809 -38.924198 39.477698 17.028593 44.921197 4.767105 0.000003 -0.000008 39.858307 41.981797 -4.126807 1.704697 6.615898 1.295400 7.102901 -36.718407 0.000003 -0.000001 10.515194 2.686705 17.486599 21.166205 -0.000001 0.000001 -16.230000 0.621703 -15.296504 -10.601701 0.000001 -0.000001 14.770706 1.528398 -7.067899 10.336402 0.000000 0.000002 +35.499571 85.273109 -160.320990 100.044605 3.880988 12.672599 -9.054200 -0.871300 0.267399 -2.765798 -0.201600 -0.213101 -6.160601 -3.961599 -5.053302 -1.234501 -2.118699 -2.243699 -2.436400 -10.306001 5.337397 0.781700 -7.732799 0.230000 14.632606 23.185798 -8.761706 -36.222709 -48.281190 -56.241909 -0.000002 -0.000004 -84.258901 62.250690 5.079390 1.050292 36.608206 -40.986198 44.476298 15.171382 43.805101 6.442814 0.000004 -0.000010 41.228306 40.399199 -4.861305 2.417700 9.698901 0.186600 7.732403 -32.270704 0.000001 0.000000 10.426197 1.477703 13.830400 21.374406 -0.000001 0.000002 -17.383500 1.057503 -16.200103 -8.346903 0.000001 -0.000001 14.288498 1.466296 -7.148700 10.185701 -0.000001 0.000002 +35.402286 85.086434 -161.844733 99.044902 3.559579 13.723105 -8.815501 -0.610600 0.482600 -2.632399 -0.053300 -0.193202 -6.095899 -4.138099 -4.289401 -1.303002 -2.164899 -2.048499 -3.657105 -10.395000 4.762996 -1.432800 -8.049301 -0.300201 14.638903 23.243698 -8.759506 -37.230708 -46.288690 -58.105310 -0.000008 -0.000007 -85.573698 61.911391 4.790103 0.823192 42.501817 -42.039398 49.637804 15.272191 43.716800 6.308711 0.000003 -0.000009 43.574804 39.655194 -4.283099 1.834797 11.498901 -0.549400 8.756503 -24.970601 0.000002 -0.000001 8.959299 0.031104 10.292604 20.926706 0.000002 0.000005 -18.311099 2.035203 -16.615403 -6.559599 0.000000 -0.000001 14.039506 1.183497 -7.505100 10.290705 0.000000 0.000002 +35.363935 84.748103 -163.589452 98.171198 3.034272 14.790904 -8.641798 -0.332300 0.691897 -2.569800 0.071000 -0.175702 -5.874099 -4.212598 -3.584204 -1.362501 -2.203099 -1.864902 -4.654298 -10.647301 4.302597 -2.871099 -7.995496 -0.938602 15.065105 23.615495 -8.596405 -38.942012 -44.640390 -60.617012 -0.000000 -0.000009 -86.658298 61.172387 5.413894 0.389294 47.591712 -41.754099 53.412800 17.393685 44.095297 4.391508 0.000005 -0.000011 49.014510 40.447610 -4.093299 1.673000 12.054701 -1.065100 10.171205 -16.031202 0.000002 -0.000002 3.400799 -2.112898 5.700207 20.684704 0.000001 0.000001 -19.333896 3.242803 -16.707504 -5.040400 0.000000 0.000000 14.214501 1.144797 -8.170001 10.186104 0.000001 0.000001 +35.455629 84.296230 -165.585397 97.331506 2.619478 16.030396 -8.285495 -0.372501 0.789901 -2.353700 0.158300 -0.170799 -5.925500 -4.209099 -2.990703 -1.471200 -2.204798 -1.732804 -5.513795 -10.914703 4.021796 -3.219797 -7.759997 -1.614802 15.326505 24.133099 -8.681706 -40.220917 -43.369787 -62.718815 -0.000005 -0.000005 -87.375803 61.024801 5.496687 -0.058809 50.885911 -41.370402 55.847196 20.576388 44.374799 1.432207 0.000006 -0.000012 57.298197 43.069093 -6.280713 3.025195 12.078502 -1.874100 10.717202 -8.684800 0.000000 -0.000001 -0.467302 -2.441698 0.305601 21.706602 0.000000 0.000003 -20.214595 4.213303 -17.741204 -4.404800 0.000000 0.000000 14.927299 1.539396 -8.170601 9.717399 0.000000 0.000002 +35.681181 83.858331 -167.783246 96.443605 2.801390 17.191098 -7.740503 -1.091700 0.642698 -1.953700 0.151400 -0.165004 -6.500601 -4.511199 -2.489898 -1.607900 -2.247198 -1.622305 -5.707805 -11.031503 3.760197 -3.215899 -6.853198 -2.148001 15.432101 24.378394 -8.599803 -40.966311 -41.478486 -64.345510 0.000000 -0.000010 -87.832900 60.072096 5.952898 -0.434906 52.574907 -40.819805 57.392994 25.138495 44.838406 -3.239095 0.000009 -0.000014 68.327198 44.868397 -10.044814 4.567392 12.269101 -3.133302 9.181997 -6.651703 0.000001 0.000003 -1.026800 -0.881200 -2.148701 23.308507 -0.000000 0.000004 -20.553496 4.312202 -19.380004 -5.450702 0.000000 -0.000001 16.306502 1.692997 -7.845700 10.086402 -0.000001 0.000002 +35.978615 83.431614 -170.141903 95.655810 3.365967 17.733698 -7.232001 -2.115201 0.390500 -1.633600 -0.009999 -0.130498 -7.141602 -5.420700 -1.647102 -1.694400 -2.356801 -1.482402 -5.365202 -10.845800 3.508997 -3.416999 -5.776999 -2.720603 16.407101 24.768796 -8.162306 -43.081015 -39.322791 -67.210414 -0.000002 -0.000004 -87.218101 60.211388 6.194588 -0.743805 51.449812 -40.027204 57.248398 29.250993 44.751703 -7.287196 0.000011 -0.000014 81.173499 46.250903 -15.894902 7.800394 12.597201 -4.219400 6.218902 -8.806802 0.000001 0.000000 -6.133002 3.903500 -1.120402 21.080303 0.000001 0.000004 -20.373698 3.531902 -20.567001 -8.326902 0.000001 -0.000001 18.310901 1.904597 -7.479000 11.254403 0.000000 0.000001 +36.455883 83.153237 -172.550823 94.956904 4.658774 17.643300 -6.891296 -3.504500 0.070297 -1.445400 -0.285700 -0.068400 -7.658900 -6.927799 -0.186502 -1.666501 -2.447600 -1.259800 -4.955896 -10.804203 3.256697 -3.562899 -4.716298 -3.614903 16.753503 24.474788 -7.809404 -44.488810 -37.155192 -69.531411 -0.000004 -0.000006 -86.571398 59.117194 6.488889 -0.634909 47.116913 -40.272301 54.815304 30.705591 45.020304 -6.907199 0.000015 -0.000013 92.474601 45.291796 -22.945000 9.966896 13.218505 -5.916801 2.640001 -11.752402 0.000001 -0.000001 -9.114504 6.062000 2.037899 20.274804 0.000001 0.000004 -19.747994 1.385601 -21.485400 -12.877801 0.000001 -0.000001 20.139112 3.027297 -7.217200 11.527702 0.000002 0.000003 +36.962867 83.070685 -174.949361 94.464005 5.834890 17.714702 -6.506694 -4.359699 -0.075804 -1.415300 -0.626801 0.006499 -8.192801 -8.849299 0.956295 -1.593301 -2.598998 -1.181903 -4.393099 -10.507099 2.968097 -3.439601 -3.936599 -4.550701 16.543005 24.161791 -7.423205 -45.555410 -35.096583 -71.329612 -0.000003 -0.000005 -86.179502 58.251298 7.021293 -0.686807 44.546016 -40.842305 53.108504 20.012285 47.342801 2.518305 0.000015 -0.000014 98.469403 45.096097 -25.955107 9.005496 14.004802 -7.701103 -0.261801 -16.177202 0.000002 -0.000002 -7.235401 8.137803 5.185093 20.404403 0.000001 0.000003 -18.279894 -0.873397 -21.473205 -19.149600 0.000002 -0.000002 20.814503 4.265599 -8.035100 12.279802 0.000000 0.000002 +37.374347 83.219765 -177.183527 94.436209 6.441553 18.768007 -6.350895 -4.796200 -0.205804 -1.427099 -0.731400 0.048001 -9.142600 -10.348999 1.220196 -1.537800 -2.800301 -1.237701 -3.126700 -10.037800 2.680595 -2.948900 -3.276898 -5.134902 16.485705 23.855393 -7.236307 -46.544007 -33.652886 -72.484706 -0.000006 -0.000004 -86.219097 57.376488 7.292802 -0.744504 46.112611 -41.011204 54.379498 -1.540316 46.888300 19.677416 0.000016 -0.000014 95.922897 41.231798 -19.185705 5.341999 13.216904 -8.791600 -2.979399 -18.348101 0.000002 -0.000002 -5.009100 8.303903 7.252998 19.967805 0.000002 0.000005 -16.429497 -2.351299 -21.860402 -26.153201 0.000002 -0.000002 19.637501 5.302697 -8.841100 12.908102 0.000001 0.000003 +37.665685 83.516958 -179.152050 94.808606 6.271888 20.710093 -6.629599 -4.757802 -0.355601 -1.567599 -0.679100 0.034599 -9.913498 -11.047499 0.686997 -1.509203 -3.028397 -1.405599 -1.638500 -9.626703 2.429996 -2.302002 -2.565799 -5.454699 16.059803 23.539395 -7.039403 -46.875597 -32.649486 -72.792402 -0.000004 -0.000006 -86.862097 55.933987 7.295293 -1.101907 46.899221 -40.866902 56.420007 -15.450409 43.255798 29.446405 0.000015 -0.000014 90.771302 39.367401 -18.402700 8.935693 11.775707 -8.749299 -5.347298 -19.271901 0.000002 -0.000002 -3.348002 7.993902 7.381696 19.546306 0.000000 0.000003 -14.797198 -2.552700 -22.008199 -32.213904 0.000003 -0.000003 17.547108 5.971796 -9.789900 12.223504 0.000000 0.000002 +37.814783 83.919809 -180.817025 94.867301 5.617173 23.390707 -7.040799 -4.592199 -0.419504 -1.811400 -0.720101 0.023100 -10.213599 -11.158597 -0.138802 -1.416800 -3.115800 -1.658799 -0.299799 -9.219300 2.103800 -1.670300 -1.822299 -6.150700 15.573903 23.692593 -6.558004 -47.352908 -31.743386 -73.924109 -0.000005 -0.000005 -87.386601 55.449796 7.488192 -1.230005 44.897826 -39.857997 55.403810 -11.701206 45.657593 24.146502 0.000011 -0.000014 88.592403 44.447998 -22.332519 13.333793 10.634503 -7.948802 -6.258702 -19.220700 0.000003 -0.000005 -2.312900 8.132003 5.342199 19.430604 0.000001 0.000002 -13.383101 -2.088799 -22.628602 -35.822303 0.000004 -0.000002 16.086499 6.357395 -11.276700 11.799102 0.000000 0.000002 +37.946353 84.352120 -182.285637 94.821599 4.760382 25.834212 -7.487697 -4.347201 -0.434100 -2.114999 -0.728301 0.048001 -9.902498 -10.938500 -0.200106 -1.258100 -2.992596 -1.680400 0.332699 -8.873699 1.601498 -1.357500 -1.761998 -7.394299 15.285600 23.625694 -6.941303 -48.014704 -31.580886 -75.364408 -0.000002 -0.000005 -87.601199 53.836391 7.424988 -0.995410 41.435711 -38.670804 52.180400 6.191184 49.369705 7.603412 0.000013 -0.000015 86.394400 57.432907 -24.522909 15.769893 9.521202 -7.097100 -8.355401 -18.459700 0.000001 -0.000001 -1.875101 7.984603 4.649799 19.528802 0.000001 0.000006 -12.262497 -1.739198 -23.346704 -37.395607 0.000003 -0.000002 16.964803 5.874496 -13.339403 12.065000 0.000000 0.000002 +38.115771 84.746320 -183.644548 94.641009 3.957083 27.853802 -7.629401 -4.220900 -0.467401 -2.204800 -0.657799 0.062101 -9.466299 -10.574798 0.019195 -1.149998 -2.844398 -1.568403 0.542602 -8.608998 0.996296 -1.410197 -1.706400 -8.541602 15.236907 23.554493 -7.219599 -48.946095 -30.983986 -77.167797 -0.000004 -0.000003 -87.315697 54.286587 7.443294 -1.049211 38.330714 -37.756297 49.378805 24.982891 47.777009 -8.547794 0.000012 -0.000014 81.435997 63.007495 -23.275210 14.413592 8.276500 -6.307500 -10.662403 -16.991702 0.000001 -0.000001 -1.656803 7.774103 4.616502 19.525206 0.000002 0.000004 -11.365101 -1.800398 -23.752204 -37.471408 0.000004 -0.000002 17.906608 4.851494 -15.600102 11.275304 0.000001 0.000004 +38.376375 85.113856 -184.943750 94.566804 3.538689 29.595805 -7.605395 -4.171199 -0.429600 -2.225302 -0.539001 0.062698 -9.349501 -10.409400 0.197896 -1.076997 -2.752900 -1.515599 0.825900 -8.210401 0.428198 -1.485501 -1.649998 -9.733405 15.446203 23.529301 -7.393007 -49.738908 -29.811189 -78.617008 -0.000002 -0.000004 -87.188403 53.540290 7.341504 -1.228106 37.248203 -37.258203 47.922887 33.224789 45.248703 -15.596198 0.000011 -0.000014 74.564103 64.024506 -22.248102 12.368994 6.636602 -5.615501 -12.034604 -15.067799 0.000000 0.000002 -1.650503 7.621902 4.002600 19.525202 0.000000 0.000004 -11.168099 -2.440700 -24.228099 -36.215200 0.000004 -0.000002 16.994203 4.263594 -17.222201 11.060901 0.000001 0.000003 +38.668221 85.406474 -186.186582 94.672703 3.391488 31.085212 -7.620596 -4.123599 -0.361802 -2.309400 -0.489900 0.052298 -9.162003 -10.176200 0.088594 -1.029999 -2.695501 -1.544399 1.012104 -7.977000 0.138200 -1.505100 -1.737099 -10.411903 15.581203 23.559693 -7.445103 -50.520803 -28.980485 -79.571506 -0.000005 -0.000001 -87.134103 52.968793 6.945001 -1.329406 37.079801 -37.308698 47.602195 30.163586 45.118504 -13.822491 0.000009 -0.000013 69.519209 67.182991 -23.269317 13.625398 4.889804 -4.875801 -11.789601 -13.301802 0.000001 -0.000002 -1.501297 7.634100 2.143399 19.475803 0.000002 0.000005 -11.512798 -3.312899 -24.582000 -34.209201 0.000004 -0.000002 16.358699 4.120295 -17.805604 12.022802 0.000000 0.000002 +38.939241 85.655120 -187.406021 95.030103 3.365799 31.883813 -7.530496 -4.074598 -0.298901 -2.267099 -0.471900 0.028704 -9.116900 -9.811498 -0.315806 -1.105799 -2.700101 -1.618097 0.842501 -8.175298 0.181697 -1.437299 -1.646798 -10.377496 15.399507 23.650895 -7.278907 -51.150197 -28.603989 -79.676601 -0.000003 -0.000005 -87.370202 53.367896 6.969495 -1.580905 37.543917 -37.879307 48.721302 20.425092 46.920101 -6.658794 0.000010 -0.000014 70.006304 67.290407 -24.299606 13.475493 3.015701 -3.975300 -10.050800 -11.793700 0.000001 -0.000001 -0.979104 7.649101 -0.485104 19.641705 -0.000001 0.000003 -12.068800 -4.048697 -23.715202 -31.897608 0.000004 -0.000003 16.639407 3.374192 -17.949600 12.139403 -0.000001 0.000002 +39.166571 85.831911 -188.586339 95.559211 3.417887 31.895796 -7.417897 -4.066301 -0.190700 -2.169101 -0.427600 0.011601 -9.218103 -9.434299 -0.466905 -1.232799 -2.681499 -1.589803 0.538905 -8.465300 0.428501 -1.504700 -1.762800 -9.900600 15.081204 23.799195 -7.082006 -51.407904 -28.401284 -79.460205 -0.000005 -0.000004 -87.730303 52.943393 7.063789 -1.822710 36.077212 -39.406699 49.252204 4.838888 45.266397 5.567606 0.000007 -0.000014 78.291597 64.954201 -23.439413 13.177789 0.986801 -3.117300 -8.373402 -10.416599 0.000001 0.000002 -0.387001 7.563901 -2.307804 19.570309 0.000002 0.000004 -12.627498 -4.663699 -21.393103 -29.442408 0.000003 -0.000002 15.946000 3.227594 -18.083499 11.575406 0.000000 0.000002 +39.362405 85.920047 -189.618117 95.834011 3.573189 31.970893 -7.178997 -4.137398 -0.122201 -2.043800 -0.396299 -0.005603 -9.447201 -9.180899 -0.675005 -1.338003 -2.675102 -1.579998 0.011999 -8.736301 0.614300 -1.755501 -1.551803 -9.263199 14.830904 24.124693 -6.802303 -51.536806 -28.170285 -79.333809 -0.000007 -0.000005 -87.985397 52.634093 7.244193 -1.829910 35.708318 -40.406503 49.492707 -4.757711 43.737992 14.045509 0.000013 -0.000013 85.668399 55.828502 -22.226213 12.081295 -0.570399 -2.697799 -7.881301 -9.424501 0.000000 -0.000002 0.049299 7.589699 -2.978001 19.621704 0.000001 0.000006 -12.881099 -5.482498 -19.429002 -27.228406 0.000003 -0.000003 15.342401 4.028194 -17.590800 11.945102 0.000001 0.000003 +39.468580 85.946216 -190.470798 95.823000 3.865181 32.722211 -6.955599 -4.287499 -0.128004 -1.949199 -0.433099 -0.022798 -9.721800 -9.116201 -1.026897 -1.460300 -2.693899 -1.671202 -0.771801 -8.566601 0.441100 -2.108300 -1.229800 -9.017901 14.871103 24.613692 -6.542204 -51.502108 -27.716182 -79.461809 -0.000005 -0.000005 -88.126297 52.329203 7.634397 -1.999707 35.762522 -40.541103 49.098909 -5.800215 44.406295 15.257212 0.000013 -0.000015 87.739401 55.950296 -24.308017 12.023590 -1.525398 -2.598899 -8.168805 -8.894699 0.000000 0.000004 0.459299 7.526898 -3.500301 19.766503 0.000001 0.000003 -12.830698 -6.334200 -18.111608 -25.581700 0.000002 -0.000001 15.736800 4.216793 -16.450602 12.026904 0.000001 0.000002 +39.454861 85.945703 -191.144649 95.784112 4.155100 33.812002 -7.027999 -4.371900 -0.140498 -2.000999 -0.479700 -0.017898 -9.760702 -9.128898 -0.973910 -1.541899 -2.654799 -1.694500 -1.649097 -8.238000 -0.058901 -2.373700 -1.122399 -9.627200 15.469703 25.008697 -6.609005 -51.717201 -27.509987 -80.148203 -0.000003 -0.000007 -87.981197 51.149596 7.699095 -1.882203 35.082311 -40.101598 47.531301 1.073988 46.033804 8.847808 0.000011 -0.000014 84.990503 62.974499 -26.030509 14.488593 -1.970600 -2.509699 -8.758801 -8.930199 0.000001 0.000002 0.843102 7.299901 -4.053905 19.659506 0.000000 0.000003 -12.564599 -6.933699 -16.915901 -24.298603 0.000000 0.000000 15.218102 4.375295 -15.492402 11.611701 0.000000 0.000002 +39.347422 85.944687 -191.668146 95.610713 4.312370 35.266418 -7.196697 -4.360301 -0.175899 -2.083099 -0.492401 -0.012301 -9.631302 -8.994400 -0.973003 -1.584701 -2.617799 -1.695799 -2.396498 -8.215097 -0.524306 -2.333199 -1.271196 -10.454801 16.055608 25.233295 -6.902512 -52.201611 -27.848887 -80.737811 -0.000004 -0.000006 -87.975801 51.265498 7.675898 -1.727408 34.196811 -39.746105 45.934598 9.980686 46.316997 0.422409 0.000011 -0.000015 80.059202 66.699198 -25.589321 16.522090 -1.790899 -2.469899 -10.061001 -9.496000 0.000001 0.000001 1.073701 7.082198 -4.160503 19.451305 -0.000001 0.000001 -12.231698 -7.247197 -16.343203 -22.935702 0.000001 0.000000 13.886704 5.493691 -14.800506 11.782502 0.000000 0.000002 +39.186894 85.992454 -192.116685 95.310809 4.372175 36.891505 -7.254599 -4.256599 -0.217705 -2.108201 -0.499300 -0.023104 -9.546701 -8.727900 -1.367204 -1.609100 -2.631996 -1.767603 -2.846701 -8.402097 -0.832706 -2.346101 -1.513102 -11.072403 16.242901 25.461398 -6.762002 -52.733207 -28.225883 -81.179409 -0.000004 -0.000005 -88.025900 51.340196 7.615997 -1.730901 33.868811 -39.323699 45.051098 14.827294 45.745995 -4.311392 0.000011 -0.000013 75.382305 68.584798 -25.324716 16.655893 -1.445999 -2.453498 -11.827208 -9.909601 0.000001 0.000000 1.025499 6.888298 -3.950103 19.343005 0.000001 0.000004 -11.961100 -7.326196 -16.294507 -21.674103 0.000001 0.000001 14.146896 6.248098 -13.887898 12.333503 -0.000001 0.000000 +38.970740 86.055426 -192.543946 95.142400 4.491509 37.884401 -7.263501 -4.118898 -0.221804 -2.125399 -0.481201 -0.037001 -9.395801 -8.484500 -1.591501 -1.648197 -2.633202 -1.830802 -3.418102 -8.648902 -0.958499 -2.454499 -1.787899 -11.530603 16.022301 25.497895 -6.497910 -52.908499 -28.285880 -81.231805 -0.000002 -0.000004 -87.921303 51.519103 7.689509 -1.801605 33.972706 -39.121201 44.786100 15.896892 45.697102 -4.804396 0.000009 -0.000012 72.349209 69.245001 -25.445614 15.437995 -1.369998 -2.309199 -12.350704 -10.035201 0.000001 0.000002 0.893601 6.595696 -4.332499 19.348700 0.000001 0.000001 -11.905397 -7.263798 -15.606201 -20.500102 0.000002 -0.000002 13.809700 6.424496 -12.806602 11.837403 0.000000 0.000002 +38.695401 86.110549 -192.921636 95.224504 4.759303 37.973003 -7.271000 -3.900597 -0.194406 -2.108301 -0.452901 -0.041496 -9.333702 -8.308497 -1.546504 -1.747000 -2.648698 -1.818601 -4.194198 -8.956202 -0.979702 -2.590601 -1.993400 -11.726804 16.023102 25.665695 -6.439702 -53.176411 -28.216981 -81.157310 -0.000004 -0.000005 -87.598501 51.908198 7.616605 -1.864007 34.715109 -39.342904 45.375597 12.907090 46.467201 -1.350888 0.000009 -0.000014 73.172903 71.042102 -26.227014 14.674098 -1.551098 -2.146198 -11.777505 -10.240100 0.000001 0.000000 0.795402 6.315598 -4.843902 19.325906 0.000002 0.000004 -12.022699 -7.173297 -14.011205 -19.554302 0.000002 -0.000002 12.235400 7.459095 -12.051506 11.459303 0.000001 0.000004 +38.374599 86.134433 -193.215009 95.292617 5.212096 37.526203 -7.232301 -3.756696 -0.134102 -2.023100 -0.394200 -0.041596 -9.391800 -8.126402 -1.306902 -1.903300 -2.643297 -1.735103 -5.306902 -9.426703 -0.945505 -2.629405 -2.131902 -11.728603 15.890903 25.939290 -6.230704 -53.123295 -28.020585 -81.215301 -0.000008 -0.000004 -87.310001 51.604599 7.439705 -1.853806 35.744912 -40.171704 46.359499 6.627790 46.620699 4.880006 0.000012 -0.000013 78.941598 65.276200 -23.585209 11.942685 -1.742299 -2.242297 -11.067103 -10.593301 0.000001 0.000002 0.711697 6.200499 -4.888505 19.412204 -0.000000 0.000003 -12.261799 -7.288896 -12.755605 -18.894205 0.000000 0.000002 11.059206 9.056196 -11.153507 11.804406 -0.000000 0.000003 +38.016205 86.121972 -193.445887 95.296211 5.767471 37.093604 -7.072901 -3.616699 -0.074205 -1.912600 -0.312300 -0.039100 -9.545201 -7.977298 -0.991808 -2.075000 -2.652200 -1.601797 -6.716799 -9.869704 -1.004402 -2.575201 -2.214102 -11.611799 15.799104 26.298699 -6.070907 -52.969310 -27.995984 -81.464707 -0.000002 -0.000004 -87.091298 51.555401 7.352603 -1.780608 37.126807 -40.902999 47.583196 0.251391 45.843396 11.283210 0.000011 -0.000015 84.829597 55.575201 -21.646609 9.712497 -1.870400 -2.442300 -10.298604 -10.968001 0.000001 -0.000001 0.633900 6.124001 -5.057804 19.467707 -0.000000 0.000002 -12.672303 -7.415899 -12.653805 -18.638000 0.000003 -0.000003 11.189602 8.731295 -10.834404 12.134102 0.000000 0.000002 +37.589231 86.049340 -193.597525 95.052515 6.476376 36.941502 -6.781296 -3.653199 -0.025603 -1.785299 -0.293800 -0.038098 -9.711302 -7.997900 -0.774301 -2.189102 -2.685600 -1.528499 -7.643701 -9.834106 -1.269901 -2.613502 -2.053497 -11.738195 15.867403 26.626496 -5.796405 -52.891604 -28.140190 -81.861105 -0.000004 -0.000007 -86.880600 51.273396 7.221694 -1.676605 38.340912 -41.168903 48.502604 -1.446513 46.292195 13.864010 0.000010 -0.000014 85.378601 55.032493 -22.137110 7.928892 -1.762598 -2.876099 -9.880302 -11.385701 0.000001 -0.000001 0.507097 5.821698 -5.249701 19.376902 0.000003 0.000007 -13.356201 -7.669596 -13.545505 -17.873101 0.000001 0.000001 11.706796 7.962901 -11.054701 12.523601 0.000001 0.000003 +37.062943 85.962457 -193.686687 94.868215 7.115569 37.076616 -6.638497 -3.624499 0.010395 -1.706299 -0.307701 -0.031993 -9.667598 -8.098398 -0.491894 -2.162700 -2.683499 -1.495605 -7.359800 -9.357204 -1.477298 -2.422300 -2.065399 -12.335506 16.137505 26.603295 -5.796803 -53.063311 -28.491981 -82.223509 0.000000 -0.000005 -86.613602 50.732890 7.383690 -1.734007 38.351513 -40.549098 48.490806 2.425586 47.383099 11.167909 0.000009 -0.000015 80.003700 58.046902 -21.272925 6.232591 -1.664896 -3.138400 -9.658106 -11.631602 0.000000 0.000000 0.395103 5.406898 -5.584800 19.351603 0.000001 0.000002 -14.337099 -7.516296 -14.481308 -16.215404 0.000001 0.000000 12.172599 6.918696 -11.399899 12.408902 0.000001 0.000004 +36.466808 85.858586 -193.682363 94.638219 7.503890 37.321607 -6.539399 -3.569299 0.071397 -1.597799 -0.256200 -0.026099 -9.432102 -7.983799 -0.178906 -1.978801 -2.646999 -1.438103 -5.636503 -9.160101 -1.450001 -1.211795 -2.336995 -13.453393 16.339206 26.387495 -6.313011 -53.584203 -29.464483 -82.466507 -0.000001 -0.000008 -86.289400 50.599094 7.220793 -1.748503 37.369513 -40.051201 47.170104 8.851785 48.849205 7.078010 0.000008 -0.000013 71.607007 58.783490 -18.134107 5.305096 -1.491899 -3.186600 -9.502802 -11.511100 0.000001 -0.000001 0.282798 5.114498 -5.983904 19.413602 0.000001 0.000002 -15.325301 -7.136499 -15.398699 -14.119200 0.000001 0.000000 12.627606 6.124894 -11.554502 11.894301 0.000000 0.000001 +35.822918 85.813890 -193.661279 94.348112 7.783278 37.604799 -6.333699 -3.515498 0.106999 -1.505699 -0.208699 -0.029201 -9.145399 -7.791601 -0.194099 -1.681800 -2.630698 -1.404102 -3.129298 -9.362499 -1.225001 0.451303 -2.707399 -14.411997 16.119303 26.029896 -6.718905 -53.943509 -30.394588 -82.108710 -0.000002 -0.000007 -86.027100 50.644395 6.729698 -1.549606 35.843411 -39.484699 45.872400 12.512989 48.972806 4.665410 0.000007 -0.000012 64.128100 54.045293 -14.760698 3.511994 -1.478396 -3.107299 -9.512599 -10.754103 0.000001 -0.000002 -0.211300 4.805998 -6.331402 19.485104 0.000000 0.000003 -16.262898 -6.715798 -15.573200 -11.872302 0.000001 0.000001 12.785201 5.577195 -11.857102 11.607107 -0.000001 0.000002 +35.160483 85.843849 -193.596265 94.006204 8.052811 37.893509 -5.994498 -3.455302 0.151895 -1.410698 -0.182601 -0.043494 -8.952801 -7.700401 -0.584702 -1.358901 -2.633400 -1.468999 -0.355198 -9.616096 -0.959303 2.012401 -3.100800 -15.293302 15.628300 25.564694 -6.669402 -54.095111 -30.929481 -81.399213 -0.000001 -0.000007 -85.534302 49.818493 6.383490 -1.252010 33.577721 -39.030700 44.472810 13.361990 48.814505 4.339209 0.000007 -0.000011 58.165816 49.544595 -11.931003 0.507295 -1.456998 -3.010001 -9.526803 -9.754601 0.000001 0.000000 -1.203302 4.388599 -6.791505 19.452104 -0.000001 0.000001 -16.956098 -6.423198 -15.390307 -9.883299 -0.000000 0.000001 12.625801 5.192695 -12.176699 11.349903 -0.000001 0.000002 +34.468079 85.903544 -193.472570 93.852708 8.173901 38.245298 -5.622997 -3.279501 0.208400 -1.280698 -0.113701 -0.065697 -8.911100 -7.482800 -1.016899 -1.088896 -2.586698 -1.569000 2.342303 -9.960400 -0.531100 3.335703 -3.671397 -16.325500 15.007605 25.008095 -6.649204 -54.332998 -31.732686 -80.627699 -0.000004 -0.000003 -84.729200 49.879892 6.388600 -1.237113 30.926005 -38.671706 42.622691 12.190887 49.243499 5.595811 0.000005 -0.000011 52.845211 45.849201 -9.213399 -0.672406 -1.225498 -2.730201 -9.551205 -9.167102 0.000000 -0.000001 -2.188903 3.895098 -7.248201 19.702907 -0.000001 0.000000 -17.382899 -5.993700 -16.106105 -8.359898 0.000001 0.000003 12.176401 4.970695 -11.784700 11.153502 0.000000 0.000001 +33.752307 85.936054 -193.311785 93.992409 8.403281 38.419008 -5.452096 -3.107701 0.259396 -1.227100 -0.026001 -0.081701 -8.781299 -7.147699 -1.329700 -0.862303 -2.504199 -1.631099 4.652502 -10.373602 -0.065203 4.548603 -4.325698 -17.325699 14.187306 24.267799 -6.785601 -54.677503 -33.214987 -79.490604 -0.000003 -0.000006 -84.125999 50.693101 6.833604 -1.462407 27.973308 -38.046998 40.344997 9.680688 49.976401 8.125611 0.000005 -0.000010 47.901804 40.031696 -7.222906 -0.522500 -1.127098 -2.368700 -9.146100 -8.880302 0.000000 -0.000001 -2.958100 3.490398 -7.976500 19.722603 0.000002 0.000002 -17.797298 -5.587699 -16.723902 -7.352901 -0.000000 0.000003 11.929400 4.743595 -11.291697 11.013900 -0.000000 -0.000001 +33.027394 85.948512 -193.165225 94.423508 8.841681 38.200005 -5.529697 -2.919098 0.266993 -1.351797 0.028999 -0.085997 -8.517101 -6.856199 -1.462902 -0.628803 -2.439899 -1.617802 6.791004 -10.797696 0.423200 5.664305 -5.014494 -18.260593 13.112106 23.242899 -6.453005 -54.860597 -35.030485 -78.004202 -0.000005 -0.000005 -83.433199 51.407290 6.800689 -1.068408 24.622510 -37.100498 38.042698 7.483386 51.155401 10.124915 0.000004 -0.000009 43.751204 36.158197 -5.960904 -0.138605 -1.641899 -1.929998 -8.389906 -8.161400 0.000000 0.000000 -3.806502 3.033997 -8.827901 19.884006 0.000002 0.000004 -18.320100 -5.270795 -16.800609 -6.697400 0.000001 0.000003 11.731000 3.773496 -10.786499 10.383704 0.000000 0.000001 +32.319750 85.989140 -192.967097 94.754000 9.402103 37.720805 -5.469301 -2.719798 0.240298 -1.476701 0.053600 -0.085306 -8.550703 -6.813900 -1.459302 -0.437699 -2.460299 -1.579097 8.748203 -11.067596 0.892900 7.060802 -5.613793 -19.188395 12.205302 22.439197 -5.440299 -55.453901 -36.505184 -77.107603 -0.000003 -0.000006 -81.969203 49.063500 7.388804 -0.586004 21.631609 -35.350096 35.203498 5.549479 53.210011 11.786919 0.000003 -0.000008 40.220706 30.740895 -5.047703 1.057493 -2.681998 -1.627199 -7.159310 -6.352701 0.000001 -0.000001 -5.284703 2.565898 -9.878804 20.078905 0.000002 0.000002 -18.614199 -5.238796 -16.081708 -6.303100 0.000000 0.000000 11.603799 3.203597 -11.017397 10.282402 -0.000000 0.000003 +31.644615 86.065599 -192.748390 95.113409 9.823407 37.299991 -5.224294 -2.340297 0.241196 -1.601098 0.092399 -0.087698 -8.762401 -6.889600 -1.518600 -0.344502 -2.484297 -1.607101 10.350504 -11.279897 1.243897 8.425199 -5.987301 -20.262598 11.791106 21.504499 -4.424808 -56.669304 -37.932680 -76.166307 -0.000002 -0.000006 -79.811901 48.916601 7.079199 -1.753606 17.049103 -32.986397 31.256191 6.225979 55.062207 11.969517 0.000003 -0.000009 37.724405 23.964697 -5.220603 1.304195 -3.774300 -1.165598 -5.205496 -4.298400 -0.000000 0.000005 -7.110401 1.152998 -11.620908 20.244107 0.000001 0.000007 -18.824897 -5.127995 -15.448403 -5.969999 0.000000 0.000000 11.337300 2.915396 -11.264698 10.341202 -0.000001 0.000002 +31.048223 86.119444 -192.453252 95.359010 9.919887 37.327316 -5.155000 -1.909701 0.201294 -1.748100 0.119700 -0.102996 -8.524800 -6.558800 -1.913797 -0.206899 -2.455599 -1.667297 11.885399 -11.852798 1.723700 9.256103 -6.336600 -21.193898 10.685304 20.082098 -3.084005 -57.331409 -39.389882 -74.876214 -0.000003 -0.000001 -77.414798 48.759794 7.100995 -1.757106 12.290005 -30.817900 27.560797 5.153276 56.898611 12.942723 0.000001 -0.000007 35.689808 22.338005 -6.292703 1.562897 -4.363399 -0.577399 -3.841201 -2.674700 -0.000000 0.000002 -8.360400 -0.250804 -13.244603 20.612602 -0.000002 -0.000003 -18.746796 -4.834299 -15.541604 -5.773801 -0.000000 0.000003 11.043907 2.659395 -11.082900 9.461702 0.000000 0.000002 +30.499840 86.102167 -192.125597 95.662208 9.672809 37.450194 -5.170597 -1.439499 0.134799 -1.879099 0.112601 -0.122399 -8.063000 -5.916400 -2.604099 -0.061900 -2.346598 -1.743300 13.317600 -12.256397 2.034698 10.040604 -6.818498 -21.779303 9.464701 19.056800 -1.742700 -58.424510 -41.884290 -73.858510 -0.000004 0.000003 -74.861701 46.943989 7.249101 -1.356705 7.900302 -28.579196 24.126999 4.502378 59.252002 13.596024 0.000002 -0.000006 33.088203 19.435204 -6.925097 1.691999 -4.563499 0.316001 -2.660900 -1.792200 -0.000000 0.000003 -8.166399 -3.179304 -14.116902 21.474101 0.000002 0.000006 -18.497698 -4.241997 -15.278202 -5.598500 -0.000000 0.000002 10.782402 2.591996 -11.130098 9.379102 0.000000 0.000001 +30.127222 86.114608 -191.821316 96.212411 9.666695 37.312505 -5.386900 -1.021300 0.123100 -2.071599 0.098999 -0.142399 -7.500701 -5.342399 -3.464297 0.074698 -2.241499 -1.874599 14.171202 -12.475399 2.168999 10.870903 -7.396896 -22.013302 8.321999 17.705400 -0.925203 -59.186915 -45.009786 -71.668613 -0.000004 -0.000002 -72.479099 46.362296 7.699793 -1.798305 3.632501 -26.275402 21.427491 7.791574 62.661705 10.665923 0.000004 -0.000006 29.145008 18.780899 -7.013705 1.454597 -4.882399 1.088401 -1.504604 -2.556200 0.000000 -0.000005 -5.746300 -5.932103 -12.536998 22.153104 0.000001 0.000003 -18.884301 -3.777696 -15.204702 -4.955500 -0.000000 0.000001 10.296202 2.391696 -11.066000 9.317802 0.000000 0.000003 +29.845025 86.141796 -191.552299 96.701105 9.760805 36.945704 -5.519102 -0.795699 0.106997 -2.191999 0.061299 -0.159001 -7.267703 -4.817897 -4.222502 0.190299 -2.178598 -1.978102 15.165300 -12.368999 2.342001 11.524803 -8.215097 -22.067005 6.732503 16.878198 0.277595 -59.546211 -47.907087 -70.018516 -0.000004 -0.000004 -69.399797 46.969902 8.370901 -2.423905 -0.343396 -24.482804 19.051597 16.247567 66.792213 2.578928 -0.000001 -0.000004 24.313307 19.393703 -6.185300 0.836200 -5.049500 1.850202 -0.305402 -5.021200 -0.000000 0.000001 -2.231198 -4.852103 -9.050502 21.816201 0.000002 0.000006 -19.454595 -3.488497 -14.901902 -3.991200 -0.000000 0.000004 9.735702 2.524096 -11.115202 9.275500 0.000000 0.000000 +29.649702 86.210630 -191.283595 96.941708 9.649683 36.081205 -5.311401 -0.722700 0.111896 -2.077301 0.125600 -0.168600 -7.258599 -4.371899 -4.534400 0.253299 -2.129998 -1.960502 15.975704 -12.315194 2.399103 12.255405 -8.348299 -22.270002 5.562002 16.265098 1.850499 -60.472314 -50.702588 -69.370009 -0.000001 -0.000004 -65.135102 46.337895 8.937300 -2.329908 -4.496196 -22.094701 16.450000 21.602369 69.479604 -3.130876 0.000002 -0.000007 19.854200 15.922199 -7.493402 0.904097 -5.011399 2.767500 0.579901 -8.307900 0.000001 0.000001 -0.070997 -3.428902 -4.086299 21.789905 -0.000000 0.000005 -19.638400 -3.422096 -14.102906 -3.053599 0.000000 0.000000 9.056898 2.711197 -11.084301 8.758900 0.000000 0.000001 +29.602712 86.282253 -190.974718 97.177714 9.569990 34.840701 -5.128902 -0.627301 0.148298 -2.125798 0.215499 -0.170499 -6.948100 -3.950598 -4.705103 0.357600 -2.084899 -1.896200 16.454402 -12.615403 2.589297 12.711901 -8.567298 -22.424104 4.836904 15.471304 3.322196 -61.531214 -54.126983 -68.677416 -0.000001 -0.000005 -59.662017 42.911001 9.060793 -2.220706 -7.451899 -19.775304 14.464099 27.571565 71.857002 -11.074470 0.000004 -0.000002 15.346100 13.339394 -7.751098 0.554199 -5.088302 3.673499 0.695304 -12.398203 0.000003 -0.000003 1.309998 -2.393001 1.152701 21.700310 0.000004 0.000010 -19.673998 -3.699199 -13.441901 -2.400500 -0.000000 0.000001 8.434104 2.790297 -10.653203 8.645407 0.000000 0.000003 +29.640304 86.324925 -190.667645 97.492104 9.386188 33.666513 -5.034098 -0.434001 0.092399 -2.075199 0.203400 -0.178697 -6.679200 -3.443398 -4.879896 0.439400 -2.009198 -1.864199 16.830301 -12.708994 2.911200 12.867802 -8.982496 -22.370297 4.146002 15.243299 4.694402 -63.001810 -58.496482 -68.915908 0.000001 -0.000004 -52.529906 39.365192 8.747896 -2.515604 -10.064998 -18.295202 12.532100 40.719678 73.886911 -26.773680 0.000002 -0.000003 11.582102 9.505000 -7.749598 -0.244000 -5.231499 4.731399 -0.397701 -17.063404 0.000001 0.000001 2.659898 -1.515697 4.550699 21.511302 -0.000001 0.000003 -19.606097 -3.887497 -12.860307 -2.070200 -0.000000 0.000003 7.916602 2.943296 -10.092502 8.508302 0.000000 0.000001 +29.775940 86.379030 -190.315088 97.910311 9.215763 32.505905 -4.978498 -0.282901 0.035900 -2.052996 0.180701 -0.198302 -6.487702 -2.880899 -5.317399 0.499700 -1.907799 -1.891200 17.183903 -12.800200 3.096398 13.001509 -8.869500 -22.208296 3.380902 14.811799 6.080799 -62.915619 -63.629882 -68.122123 0.000001 -0.000001 -43.945813 32.394387 7.776498 -3.630405 -11.942099 -16.879799 10.466693 54.060892 74.362309 -43.314696 0.000000 -0.000001 8.549602 5.270404 -6.662498 -1.324204 -5.626298 5.725900 -2.370898 -21.853901 0.000002 -0.000005 3.667300 -1.294797 5.708802 21.737207 0.000003 0.000007 -19.523098 -4.099099 -12.337701 -1.979500 -0.000000 0.000004 7.473802 3.085497 -9.568601 8.452602 0.000000 0.000001 +29.957550 86.395791 -189.903603 98.238999 9.093301 31.330610 -4.910099 -0.285902 -0.073399 -1.982900 0.029100 -0.222703 -6.331700 -2.347798 -6.141402 0.538701 -1.767699 -1.965400 17.352002 -12.672500 3.075898 13.398405 -8.886900 -21.264802 2.764702 14.309001 7.077498 -60.214017 -68.544190 -64.060916 -0.000001 -0.000002 -36.629205 26.255402 8.641597 -3.196108 -13.171398 -15.613103 8.278099 63.361408 74.327714 -56.313715 0.000000 -0.000002 6.038399 5.277899 -5.890602 -1.273299 -6.313397 6.663200 -3.960499 -26.114602 0.000004 -0.000004 4.566199 -1.594400 5.106098 21.751603 0.000000 0.000008 -19.426700 -4.470001 -11.770001 -1.809900 -0.000000 0.000004 7.088502 3.441697 -9.115901 7.796802 0.000000 0.000001 +30.361661 86.410531 -189.353190 98.560000 8.895394 30.157802 -4.783094 -0.165301 -0.188201 -1.931201 -0.039299 -0.269202 -6.154800 -1.874297 -7.418003 0.612601 -1.691499 -2.219402 17.431703 -12.357602 3.176097 13.773305 -8.974998 -19.812296 2.371803 14.026402 8.170401 -47.593939 -77.715898 -50.011740 0.000000 -0.000001 -29.078905 22.858207 9.090202 -3.567003 -13.714598 -15.679204 6.209799 75.637883 71.271904 -71.619490 0.000001 -0.000001 2.906901 1.144904 -4.900699 -1.545703 -7.374699 7.552899 -4.840203 -29.452104 0.000004 -0.000003 5.092895 -2.292499 4.459402 21.459606 0.000000 0.000003 -19.354901 -4.947997 -11.427106 -1.480401 -0.000000 0.000001 6.600700 3.689698 -8.356101 7.919102 0.000000 0.000001 +30.775935 86.395540 -188.744352 98.934496 8.606208 28.728998 -4.744898 -0.103200 -0.285700 -1.906401 -0.130300 -0.320203 -5.836501 -1.465998 -8.682996 0.694597 -1.625598 -2.467900 17.325901 -11.852500 3.133998 14.011804 -8.743896 -18.019295 2.200000 14.152301 9.275599 -7.973294 -82.791198 -8.492895 0.000003 -0.000002 -22.364206 19.511400 10.085399 -3.154504 -14.177297 -15.953203 4.355495 77.138500 72.999207 -76.243711 -0.000000 0.000003 1.424301 -2.187000 -4.164895 -1.887404 -8.830700 8.566399 -4.921398 -31.783107 0.000003 -0.000002 5.418405 -3.009698 3.940902 21.586903 -0.000001 -0.000001 -19.091903 -5.444998 -10.637703 -1.307099 -0.000000 0.000003 6.178002 3.969698 -7.847500 7.855202 0.000000 0.000002 +31.218147 86.381064 -188.023757 99.467106 8.184398 26.962300 -4.792496 0.030599 -0.392900 -1.913299 -0.201600 -0.354300 -5.559101 -1.160198 -9.626299 0.742700 -1.520198 -2.648301 17.166598 -11.385998 3.105000 14.343208 -8.597302 -16.358699 1.971800 14.450302 10.118502 41.553371 -80.887907 42.895671 0.000001 0.000001 -16.542503 14.892901 11.439496 -2.107906 -14.627800 -16.180200 2.703500 74.883603 75.928207 -76.317405 0.000001 -0.000001 0.951900 -5.445001 -2.304601 -2.591598 -10.785398 9.714899 -4.120098 -32.897203 0.000002 -0.000001 5.022498 -3.660297 2.668302 21.771008 -0.000004 0.000003 -18.556796 -5.945701 -9.618000 -1.546200 -0.000000 0.000002 5.778198 4.379298 -7.220800 7.630301 0.000000 0.000000 +31.745453 86.361240 -187.088775 100.025105 7.687198 25.102093 -4.868600 0.208300 -0.496299 -1.911400 -0.262900 -0.379700 -5.415101 -0.956697 -10.345302 0.745400 -1.395399 -2.788701 16.998702 -10.824498 3.132999 14.928504 -8.287898 -14.398299 1.839300 14.846500 10.603199 58.706494 -76.539208 61.906689 -0.000000 -0.000001 -11.718101 11.082198 12.900597 -1.284004 -14.820101 -16.487602 1.400897 71.692589 77.557009 -74.586291 -0.000001 -0.000000 0.847999 -6.203698 -0.969303 -3.142500 -12.872798 10.698500 -2.935303 -32.959604 0.000004 -0.000003 3.614397 -4.188598 0.685899 21.915102 0.000000 0.000003 -17.521097 -6.546199 -8.522798 -2.438700 -0.000000 0.000001 5.462705 4.733497 -6.557402 7.543101 0.000000 0.000001 +32.316443 86.296226 -185.918594 100.619305 7.079701 23.276396 -5.116999 0.440799 -0.648301 -1.983797 -0.339400 -0.397297 -5.243199 -0.796998 -10.819501 0.768801 -1.285499 -2.893101 16.923700 -10.234299 2.994400 15.238200 -7.857695 -13.138899 1.477503 15.494697 10.910702 63.624694 -74.185304 68.622391 -0.000002 0.000000 -8.725702 8.672800 14.197894 -0.390504 -14.950800 -16.866696 0.567796 68.982972 78.009511 -72.415380 0.000000 0.000000 1.253100 -5.517499 -0.516502 -3.368003 -14.920501 11.561300 -1.765400 -32.017608 0.000004 -0.000001 0.954197 -5.415701 -2.029801 21.784509 -0.000001 0.000003 -16.019698 -7.112701 -7.242301 -3.906300 0.000000 -0.000002 5.326296 5.199500 -5.962902 7.541004 -0.000001 0.000002 +32.962365 86.144082 -184.494940 101.197302 6.328078 21.509704 -5.463801 0.724499 -0.768501 -2.090701 -0.398900 -0.405501 -5.123499 -0.632297 -11.051002 0.763703 -1.172999 -2.944801 16.986605 -9.646200 2.916099 15.563204 -7.668999 -12.200500 0.667202 16.105401 11.277004 65.293408 -74.232903 71.455509 0.000001 0.000001 -7.644601 6.562900 14.194097 0.606101 -14.789600 -17.405808 0.254497 67.098070 78.329110 -70.290376 0.000000 -0.000004 2.051701 -5.189201 -0.983704 -3.212002 -16.706802 12.219501 -0.815701 -30.183108 0.000004 -0.000003 -2.813000 -6.438002 -5.259801 22.034703 0.000002 0.000005 -14.140602 -7.609799 -5.807201 -5.684501 0.000000 -0.000001 5.259499 5.932599 -5.422703 7.519700 0.000000 0.000001 +33.726399 85.870514 -182.775860 101.603007 5.509063 19.965399 -5.794300 1.029400 -0.853798 -2.175501 -0.427800 -0.405999 -5.094600 -0.495897 -11.056399 0.736100 -1.093298 -2.951902 16.994404 -9.133600 2.819198 16.068108 -7.513599 -11.584300 0.116702 16.528201 11.510199 66.473991 -74.928702 73.264990 0.000001 0.000001 -7.777201 4.110998 12.619001 1.591896 -14.359297 -17.875699 0.371296 63.941098 79.344509 -66.389903 0.000001 -0.000003 3.411401 -3.983398 -1.884501 -2.457700 -17.984502 12.478899 -0.396699 -27.888506 0.000002 -0.000003 -3.731802 -7.411404 -7.708299 24.694902 -0.000000 0.000002 -11.968401 -8.127100 -4.361499 -7.388100 -0.000000 0.000001 5.195401 6.852497 -5.096801 7.665000 0.000000 0.000000 +34.604731 85.487746 -180.745130 101.814815 4.583485 18.657292 -6.147197 1.406398 -0.892799 -2.292601 -0.393500 -0.404299 -5.080499 -0.360097 -10.854501 0.731699 -1.054298 -2.891100 17.174297 -8.823198 2.748398 16.345204 -7.321898 -11.432400 0.146600 16.770600 11.521901 66.426908 -76.635604 73.513107 0.000003 0.000002 -8.785600 4.735099 11.095498 1.558300 -13.788401 -17.996399 0.838395 58.079882 80.487812 -59.294589 0.000000 0.000000 5.162001 -2.739799 -2.695697 -1.731399 -18.602596 12.330101 -0.743803 -26.155805 0.000002 -0.000002 -0.425799 -6.393605 -9.379100 26.066401 0.000003 0.000004 -9.378099 -8.635898 -2.916703 -9.185901 0.000001 -0.000002 5.076798 7.891900 -4.923905 7.632201 0.000000 0.000002 +35.625809 84.949525 -178.390545 101.753205 3.410365 17.492903 -6.488497 1.980199 -0.895100 -2.400100 -0.309500 -0.403698 -4.998500 -0.189797 -10.584798 0.749001 -1.026898 -2.807901 17.465901 -8.584501 2.705298 16.609701 -7.282898 -11.480298 0.330702 16.773395 11.357200 67.037862 -78.322006 73.794264 0.000001 -0.000001 -10.375401 5.975299 10.126198 1.181098 -13.029899 -18.251601 1.659196 49.126776 81.897210 -48.742780 0.000000 -0.000002 7.446303 -0.185700 -3.651800 -0.871103 -18.896698 11.688401 -1.544403 -24.677805 0.000003 -0.000002 4.401497 -5.664502 -8.184000 27.459703 0.000002 0.000005 -6.250199 -9.006100 -1.428603 -10.936802 0.000001 -0.000001 4.725701 9.011198 -4.893205 7.355803 0.000000 0.000002 +36.799035 84.335346 -175.839364 101.649600 2.204988 16.317301 -6.910200 2.535599 -0.863101 -2.521100 -0.218001 -0.405699 -4.951498 0.081202 -10.295800 0.745202 -0.973698 -2.713501 17.755103 -8.372102 2.699699 17.120105 -7.174099 -11.494900 0.704401 16.716702 11.040398 69.162905 -79.786310 75.132006 0.000004 0.000002 -12.133601 7.230101 9.624996 0.899899 -11.812599 -18.796502 2.800195 43.415731 82.513808 -41.166236 0.000000 -0.000002 10.176001 0.937999 -4.049899 -0.718903 -19.645800 10.465103 -1.920503 -22.261004 0.000001 -0.000001 9.599102 -4.920003 -4.475099 26.737107 0.000000 0.000003 -3.573600 -9.379499 -0.024501 -11.437002 0.000002 -0.000003 3.710001 10.111197 -4.758704 7.650004 0.000000 0.000001 +38.126439 83.792309 -173.283126 101.681201 1.549865 14.854700 -7.395697 2.525300 -0.745102 -2.764899 -0.095900 -0.398500 -5.094198 0.396603 -9.807401 0.713599 -0.906199 -2.571199 18.088998 -8.339000 2.871799 17.485205 -7.159200 -11.739902 1.214403 16.560204 10.530498 70.729184 -81.736808 75.499586 0.000001 -0.000002 -13.932000 8.810704 9.461894 0.611192 -10.475098 -19.516295 4.163497 37.485726 83.097811 -33.434232 -0.000000 -0.000003 13.689203 3.073498 -4.225900 0.426296 -20.952299 8.442803 -1.412501 -18.935902 0.000001 0.000000 14.019499 -2.876101 -0.740298 24.485805 0.000001 0.000005 -2.276300 -10.281201 1.166099 -9.803301 0.000001 -0.000001 2.392101 11.814398 -4.719205 7.862401 0.000000 0.000001 +39.504391 83.416361 -170.720761 101.530513 1.779377 13.173503 -7.764699 1.920900 -0.684200 -3.096999 -0.165600 -0.371901 -5.365100 0.345402 -9.070599 0.660799 -0.836598 -2.376001 18.535704 -8.227099 2.985999 17.748301 -7.353199 -11.986299 1.554003 16.431497 9.803602 67.866365 -84.328911 70.925668 0.000001 -0.000001 -15.819505 10.508898 9.570500 0.114295 -9.425598 -20.296297 5.606395 32.800827 83.875108 -26.840131 0.000001 -0.000003 18.044305 5.506996 -4.721400 0.996392 -21.430800 5.640101 -0.430202 -16.276701 0.000001 -0.000001 16.205990 -0.608399 1.247302 22.538004 -0.000001 0.000002 -1.726602 -12.208500 2.094499 -6.941200 -0.000000 0.000002 2.056101 12.605699 -4.571505 9.123602 0.000000 0.000002 +40.796743 83.301312 -168.326044 101.373496 2.240977 11.674199 -8.004303 1.357800 -0.668201 -3.348100 -0.298000 -0.335101 -5.607399 -0.055298 -8.233301 0.601098 -0.864199 -2.182800 18.610799 -8.115398 2.732298 18.069098 -7.462999 -12.565401 1.813400 16.509500 8.863500 54.611763 -86.687605 55.653561 0.000000 -0.000002 -17.413103 10.373501 9.739397 -0.127508 -8.347997 -20.989901 6.913196 34.691285 84.846410 -27.163488 0.000001 -0.000005 22.685408 7.067002 -5.906495 1.717101 -21.125100 3.154301 0.836898 -14.670403 0.000001 -0.000001 17.080307 2.542301 1.172502 21.542003 -0.000001 0.000001 -2.210102 -14.169999 0.669100 -3.097199 0.000001 0.000001 4.287402 12.570100 -3.976404 10.045601 0.000001 0.000004 +41.812995 83.468441 -166.186348 101.261808 2.492290 10.667196 -8.165299 0.810999 -0.606801 -3.484398 -0.339000 -0.309499 -5.672099 -0.317699 -7.537297 0.546000 -0.943699 -2.036100 18.377704 -8.278800 2.676000 18.232307 -7.613798 -13.220500 2.080899 16.576803 7.968100 -0.090775 -87.823201 -0.934275 0.000001 -0.000000 -18.955303 10.768894 10.102198 -0.487698 -7.442599 -21.777098 7.877597 35.845884 86.489509 -26.974989 -0.000000 -0.000006 27.168005 8.236802 -7.601901 2.550201 -20.400400 1.758500 3.333998 -13.593804 0.000001 0.000001 16.767397 3.296799 -0.944200 19.957104 0.000002 0.000003 -3.528098 -15.315401 -3.809502 1.189200 -0.000001 0.000000 7.131300 10.690497 -3.478803 10.391901 -0.000001 0.000002 +42.627067 83.875364 -164.320977 101.191401 2.276476 9.939606 -8.197301 0.551900 -0.489902 -3.479803 -0.193199 -0.294700 -5.497699 -0.478198 -7.160001 0.533901 -1.058699 -1.990800 17.820904 -8.634199 2.836799 17.810004 -7.740098 -13.576198 2.484801 16.757103 7.374898 -41.499856 -86.664093 -43.429255 0.000001 -0.000001 -20.581107 11.460501 10.415997 -0.761709 -6.278899 -22.988299 9.086897 6.995118 88.847799 2.799977 0.000003 -0.000007 30.964803 8.986204 -9.634602 3.977299 -19.768199 0.948101 4.945898 -12.257402 -0.000000 0.000001 15.392905 3.299399 -1.917899 19.569902 0.000001 0.000003 -4.905202 -15.231300 -8.681602 4.738301 -0.000001 0.000001 9.523503 6.407699 -6.859202 10.987000 0.000000 0.000002 +43.223457 84.446356 -162.678364 101.325996 1.408553 9.543504 -8.230197 0.638599 -0.318100 -3.455998 0.065899 -0.294501 -5.144400 -0.261098 -7.090901 0.560998 -1.114898 -1.977900 17.001803 -9.157600 3.105599 17.180407 -7.716800 -13.732997 2.644399 17.021503 7.027600 -53.215308 -85.837295 -55.777408 -0.000001 0.000000 -22.476206 11.824298 10.444696 -0.691105 -4.813898 -24.264500 10.040498 -95.472713 87.205986 105.887906 0.000001 -0.000009 34.442004 7.824002 -10.829600 4.130894 -19.581900 0.920400 5.594599 -10.349700 -0.000000 0.000001 13.553703 3.775098 -1.938701 19.740896 0.000001 0.000003 -5.854700 -13.997399 -12.664302 5.809100 -0.000002 0.000001 9.674902 6.140794 -15.270705 9.400902 0.000000 0.000001 +43.654749 85.014811 -161.168342 101.453193 0.433193 9.452200 -8.128998 0.718499 -0.292102 -3.385601 0.185900 -0.299600 -4.874000 0.094302 -7.038302 0.558899 -1.083299 -1.922500 16.092402 -9.263299 3.021098 16.556204 -7.655198 -13.648099 2.751200 17.425403 6.802500 -60.420001 -85.475594 -63.504802 -0.000000 -0.000001 -24.158710 12.793598 10.473403 -0.971900 -3.799399 -24.946996 10.647496 -97.489378 84.193083 108.605673 0.000003 -0.000008 37.718104 5.843302 -10.926599 3.680100 -19.475096 1.248101 6.061000 -8.316700 -0.000000 0.000001 11.515297 4.143698 -2.027200 19.826303 0.000001 0.000002 -6.198499 -12.850001 -16.639702 3.643900 -0.000001 0.000002 6.967801 6.431894 -17.957102 9.708602 0.000000 0.000001 +44.010090 85.407472 -159.695629 101.444400 -0.056606 9.440904 -7.988700 0.458800 -0.305699 -3.280701 0.191700 -0.293400 -4.569900 0.275102 -6.791499 0.567701 -1.057400 -1.837501 14.953401 -8.993998 2.586799 15.714900 -7.549998 -13.571000 3.203802 18.253199 6.422498 -69.942032 -85.027287 -73.245932 0.000000 -0.000001 -25.547208 13.797401 10.698394 -1.397705 -3.192295 -25.314098 11.124597 -95.311277 81.903087 106.649175 0.000003 -0.000009 41.369404 3.739201 -10.445099 3.267101 -18.966001 1.252600 6.407599 -7.012900 0.000000 0.000000 9.979199 4.423901 -2.291802 19.955502 0.000002 0.000004 -6.310597 -12.558898 -18.731802 -1.212201 -0.000001 0.000000 7.942604 6.640894 -16.863104 10.733201 0.000000 0.000000 +44.344356 85.643959 -158.295086 101.633891 -0.261227 9.580407 -7.938900 0.168900 -0.295102 -3.215400 0.190700 -0.289200 -4.347900 0.307002 -6.454701 0.568000 -1.082999 -1.767501 13.669201 -8.685999 2.028198 14.605403 -7.510998 -13.760798 3.774903 18.977398 6.036199 -75.892561 -84.275289 -79.358965 -0.000000 -0.000001 -26.903704 14.109796 10.949491 -1.526003 -2.803897 -25.512201 11.409397 -92.736295 80.079986 103.820194 0.000004 -0.000008 45.028808 3.421199 -10.448300 3.211899 -18.392100 1.166300 7.049800 -6.456401 0.000001 0.000002 9.100303 4.574599 -3.092500 20.058707 0.000000 0.000003 -7.063796 -12.404499 -18.413003 -6.509702 0.000000 -0.000001 8.360603 6.409096 -15.325908 10.093603 0.000002 0.000003 +44.656266 85.771975 -157.023303 101.949196 -0.191007 9.968193 -7.768796 -0.226200 -0.225301 -3.143400 0.168499 -0.288599 -4.373399 0.301501 -6.340200 0.518099 -1.121299 -1.750001 12.335902 -8.424598 1.522998 13.040206 -7.643998 -13.843101 3.875902 19.089701 5.930700 -74.751640 -83.184692 -78.733838 -0.000001 -0.000002 -28.185407 14.517000 11.295896 -1.777707 -2.879399 -25.540798 11.362596 -88.945110 77.989085 100.102901 0.000001 -0.000012 47.668505 5.498203 -11.327002 4.047602 -17.963300 0.922401 7.201999 -6.112901 -0.000000 0.000001 8.435604 4.678798 -3.670400 20.227405 0.000000 0.000004 -8.548799 -12.186299 -17.502500 -11.439903 0.000001 -0.000002 8.267504 6.988196 -12.595104 10.289704 -0.000000 0.000003 +44.934650 85.818464 -155.812736 102.198004 0.160882 10.418896 -7.506799 -0.728500 -0.151002 -2.987802 0.122800 -0.285100 -4.438199 0.148601 -6.357001 0.450901 -1.184298 -1.768800 10.714301 -8.158997 1.043598 10.702301 -7.691197 -13.551097 3.625101 18.785898 6.087799 -70.374760 -82.110684 -75.048065 -0.000000 -0.000001 -28.975602 14.777700 11.571894 -2.254108 -3.083996 -25.405901 11.192798 -85.540093 75.500881 97.044588 0.000001 -0.000012 48.705703 8.062801 -12.017898 5.145397 -17.513899 0.419101 6.949700 -5.868300 -0.000000 0.000002 7.901004 4.763399 -3.949000 20.303707 0.000000 0.000003 -10.473798 -12.042997 -17.517205 -15.857302 0.000002 -0.000002 8.067998 8.159097 -9.694904 10.523199 0.000000 0.000001 +45.161982 85.827105 -154.658301 102.490193 0.654289 10.739606 -7.228500 -1.241500 -0.056701 -2.802301 0.061001 -0.282401 -4.430199 -0.098799 -6.274100 0.356003 -1.281099 -1.773200 8.500702 -7.960797 0.678399 7.672902 -7.752801 -12.957599 3.474602 18.215397 6.315199 -65.941624 -81.026986 -71.082625 -0.000000 -0.000001 -29.085206 14.822102 11.751095 -2.508005 -3.197798 -25.140099 11.137295 -83.344097 73.044687 95.184993 0.000001 -0.000009 48.215511 9.850007 -11.673204 5.853100 -17.095302 -0.219999 6.411798 -5.795300 0.000000 -0.000002 7.347998 4.845099 -3.859202 20.348307 0.000000 0.000003 -12.731601 -11.752298 -17.718704 -19.740102 0.000002 -0.000001 8.102702 9.239198 -8.588602 10.800802 0.000000 0.000001 +45.267136 85.837763 -153.508713 102.708795 1.153580 10.798198 -6.859294 -1.659800 0.009600 -2.560498 -0.037800 -0.266300 -4.378600 -0.463998 -5.866000 0.191099 -1.394699 -1.699601 5.705500 -7.824299 0.457998 4.411702 -7.950299 -12.132303 3.312002 17.462794 6.654000 -62.123935 -79.613788 -67.838441 0.000001 -0.000003 -28.230009 14.467102 11.650395 -2.561709 -3.311694 -24.702496 11.112399 -82.104701 70.948290 94.241597 0.000004 -0.000011 46.514903 8.699008 -10.045902 5.603900 -16.538500 -0.850100 6.287199 -5.866001 0.000000 -0.000001 6.745901 4.905399 -3.956701 20.326402 0.000000 0.000004 -15.044799 -11.179902 -17.643104 -22.909803 0.000002 -0.000002 8.033604 9.718398 -9.574604 10.956002 0.000001 0.000001 +45.304730 85.849684 -152.345372 102.910497 1.564993 10.606599 -6.438797 -1.888701 0.082097 -2.287402 -0.099001 -0.243600 -4.361400 -0.870598 -5.233800 -0.047100 -1.521899 -1.590401 2.770199 -7.958200 0.464098 1.337703 -8.037401 -11.319901 3.369402 16.862502 7.271998 -60.518034 -78.388091 -66.628233 0.000001 -0.000002 -26.647706 13.302702 11.300691 -2.354005 -3.506199 -24.384200 10.988195 -81.902913 69.309084 94.407006 0.000007 -0.000007 44.002500 5.346297 -8.533196 4.750498 -15.990402 -1.437999 6.160797 -5.858200 0.000000 0.000000 6.086404 4.960998 -3.799600 20.324701 -0.000000 0.000002 -17.343498 -10.414798 -17.711506 -25.546502 0.000003 -0.000002 8.010997 9.692797 -11.829604 10.976899 0.000000 0.000001 +45.295840 85.845391 -151.086058 103.158296 1.933394 10.168802 -6.117894 -2.056600 0.186398 -2.066099 -0.094201 -0.229100 -4.570700 -1.175099 -4.595599 -0.287701 -1.651799 -1.479200 0.772500 -8.339902 0.673197 0.209800 -7.732901 -10.701001 3.310303 16.365600 8.178900 -59.349444 -77.894287 -65.519748 0.000000 -0.000001 -25.541607 12.066499 11.079698 -1.802505 -3.610599 -24.224599 10.815695 -82.393705 68.035793 95.259202 0.000002 -0.000009 41.056807 2.836397 -7.397803 3.849302 -15.313196 -2.011099 6.346398 -6.060902 0.000001 -0.000001 5.475703 4.879399 -3.650404 20.291809 0.000000 0.000003 -19.514295 -9.685998 -18.066302 -27.887203 0.000003 -0.000002 8.126806 9.397396 -13.782805 10.957202 0.000000 0.000000 +45.193224 85.820740 -149.712159 103.445501 2.278064 9.461606 -6.003496 -2.194699 0.268999 -1.973500 -0.096800 -0.212903 -4.945602 -1.445099 -3.943901 -0.436598 -1.740900 -1.356502 0.468299 -8.677400 1.057398 1.283302 -7.485800 -10.428800 2.805102 15.775700 9.045399 -56.323043 -78.321990 -62.301444 -0.000000 -0.000003 -25.103507 11.972801 11.125298 -1.627305 -4.117199 -24.055199 10.809996 -82.585705 67.391280 95.833296 0.000000 -0.000009 38.288108 3.218003 -6.616497 3.505797 -14.529699 -2.549900 6.936099 -6.381200 0.000001 0.000000 4.872301 4.951200 -3.641200 20.070202 -0.000000 0.000002 -21.362999 -9.046494 -18.413905 -30.202704 0.000004 -0.000002 8.343006 9.099091 -15.051202 10.942901 -0.000000 0.000005 +45.028124 85.787476 -148.207466 103.604699 2.569975 8.534894 -6.001699 -2.321900 0.324797 -1.976599 -0.083301 -0.199001 -5.253500 -1.661300 -3.327701 -0.443099 -1.792500 -1.237901 1.366801 -8.955703 1.632998 2.563402 -7.414900 -10.327499 2.102301 15.019302 9.697697 -51.177844 -79.341093 -56.555242 -0.000000 -0.000001 -24.743106 12.738697 11.171497 -1.861703 -4.821098 -23.883203 11.092795 -82.562314 67.050580 95.970006 0.000003 -0.000008 35.649698 3.857201 -6.125700 3.573506 -13.614299 -3.100400 7.259499 -6.473301 0.000000 -0.000001 3.996998 5.007600 -3.161301 20.111205 0.000001 0.000004 -22.656497 -8.637497 -18.685703 -32.534602 0.000004 -0.000003 8.439599 9.382399 -15.221404 10.840501 -0.000001 0.000003 +44.798506 85.745561 -146.567903 103.425894 2.733486 7.338596 -5.872998 -2.349400 0.346500 -1.894400 -0.051200 -0.184701 -5.447399 -1.885499 -2.714401 -0.381499 -1.835198 -1.122802 2.549800 -9.327399 2.337398 3.586900 -7.353998 -10.259599 1.540001 14.358003 10.229700 -45.489844 -80.376989 -49.761845 0.000001 -0.000001 -23.926204 13.090495 11.074099 -1.892599 -5.307498 -23.781205 11.546098 -82.925703 66.810381 96.263297 0.000005 -0.000005 32.887907 4.017400 -5.547008 3.583599 -12.422002 -3.580900 7.841399 -6.206402 0.000000 -0.000001 2.993799 4.934400 -2.628802 20.262504 0.000001 0.000003 -23.175999 -8.396098 -18.554204 -34.750797 0.000005 -0.000002 8.239398 9.832595 -14.582104 10.563803 -0.000002 0.000004 +44.504628 85.680022 -144.780757 103.148396 2.876282 6.031808 -5.771499 -2.330000 0.352799 -1.855799 -0.004000 -0.171600 -5.502202 -2.136899 -2.210402 -0.291799 -1.882499 -1.039701 3.594899 -9.728098 3.073698 4.389200 -7.376199 -10.082299 1.103000 13.864501 10.936101 -38.598766 -81.504398 -41.863266 0.000000 0.000001 -22.177605 12.553401 10.785396 -1.454006 -5.594098 -23.673602 11.852496 -83.193608 66.212281 96.381301 -0.000001 -0.000006 30.309507 3.239804 -4.900801 3.328001 -10.858802 -3.964900 8.616698 -6.229701 0.000000 -0.000001 2.041399 4.790699 -2.141502 20.477906 0.000001 0.000005 -23.284598 -8.270297 -18.049305 -36.617303 0.000005 -0.000002 8.132301 10.620797 -13.496601 10.358395 -0.000002 0.000006 +44.145982 85.581231 -142.826242 102.890291 3.048087 4.765106 -5.760901 -2.342301 0.363899 -1.881100 0.032800 -0.164600 -5.566701 -2.312299 -1.904501 -0.218901 -1.904999 -0.998100 4.558799 -10.216100 3.927498 5.260801 -7.461000 -9.685898 0.775501 13.346403 11.661298 -29.189472 -82.461995 -31.682570 0.000000 0.000000 -19.707503 11.302306 10.496597 -1.045711 -5.946597 -23.637900 12.032300 -83.188506 65.994984 96.333304 0.000005 -0.000007 28.246107 1.251603 -3.848001 2.724003 -8.984800 -4.276300 9.011599 -6.609401 -0.000000 0.000001 1.016799 4.940699 -1.258101 20.413103 0.000001 0.000002 -23.254200 -8.259597 -17.512706 -37.713402 0.000004 -0.000003 7.108298 11.534399 -11.148601 10.002207 0.000002 0.000001 +43.746438 85.402656 -140.687041 102.516697 3.217599 3.683099 -5.741200 -2.386600 0.375800 -1.840301 0.085000 -0.167201 -5.749700 -2.391000 -1.841101 -0.202400 -1.911900 -1.004301 5.388102 -10.662001 4.650898 6.205700 -7.566995 -9.269300 0.634302 12.870300 12.097205 -12.451887 -83.405204 -14.098587 0.000000 -0.000002 -17.415205 9.119003 10.545897 -0.406311 -6.290897 -23.746197 11.986498 -83.313998 66.300584 96.375898 0.000005 -0.000004 26.974007 -0.261396 -2.780704 2.128806 -6.582399 -4.442799 9.229700 -7.493801 0.000000 0.000000 0.082999 4.990500 -0.256101 20.349802 -0.000000 0.000002 -23.175501 -8.144095 -16.684404 -37.084311 0.000003 -0.000002 4.055300 12.134698 -7.972602 9.384805 0.000002 0.000002 +43.257490 85.141285 -138.370313 102.042687 3.510112 2.680897 -5.765498 -2.590200 0.393399 -1.757100 0.064900 -0.171300 -5.962101 -2.428700 -1.937501 -0.214496 -1.871299 -1.036801 6.009001 -10.926403 5.229798 7.275602 -7.706597 -8.693100 0.458500 12.546899 12.309702 6.839226 -83.693501 6.030227 0.000001 -0.000001 -15.549704 7.696300 10.894196 0.380592 -6.542199 -23.729602 11.730195 -83.271695 66.821683 96.130294 -0.000001 -0.000007 26.313107 -0.432293 -2.329405 2.156700 -3.890102 -4.563900 9.434001 -8.473800 0.000001 -0.000002 -0.865498 4.747500 0.602100 20.539904 0.000000 0.000003 -23.368698 -7.919798 -15.710404 -33.769702 0.000003 -0.000002 0.150405 11.868500 -5.763805 13.728503 -0.000001 0.000001 +42.729930 84.780359 -135.839713 101.384593 3.938187 1.736104 -5.758199 -2.865200 0.396999 -1.657098 0.022300 -0.175700 -6.214899 -2.494899 -2.155601 -0.235601 -1.818799 -1.103900 6.588002 -11.140102 5.881699 8.512903 -7.738602 -7.807199 0.194702 12.289400 12.512500 27.474943 -83.271509 27.149243 0.000000 -0.000002 -13.921102 7.131399 11.348502 0.489298 -6.835596 -23.745600 11.432497 -82.953014 67.429885 95.791603 0.000004 -0.000007 26.068307 0.515199 -2.472799 2.200405 -1.010400 -4.811601 9.282401 -9.090601 0.000001 -0.000001 -2.159799 4.262701 2.012300 20.694795 0.000001 0.000003 -23.860996 -7.583996 -14.712803 -29.242103 0.000002 -0.000002 3.697195 11.365895 -6.350004 20.338510 0.000004 0.000005 +42.168595 84.247213 -132.986767 100.000104 4.883605 0.959896 -5.520401 -3.541899 0.381798 -1.350298 -0.123800 -0.178600 -6.314401 -2.588099 -2.376901 -0.247600 -1.756199 -1.164301 6.991902 -11.303604 6.553996 9.746803 -7.635200 -6.578800 0.089002 12.283098 12.512901 38.871560 -82.751309 38.936258 -0.000001 0.000000 -12.822802 6.248201 11.376397 0.796295 -7.017800 -23.688001 11.156597 -82.756481 68.333991 95.429173 0.000004 -0.000007 26.209507 1.930309 -3.050702 2.442501 2.895001 -5.500900 8.287801 -9.729101 0.000001 -0.000001 -3.624703 3.751102 4.119298 20.350004 0.000001 0.000003 -23.904794 -7.525898 -13.889304 -24.504902 0.000003 -0.000003 8.780102 9.691200 -6.777603 21.983705 0.000001 0.000004 +41.553656 83.768684 -130.086847 98.975386 5.566308 0.360505 -5.463298 -3.840600 0.362599 -1.195699 -0.193800 -0.180100 -6.512200 -2.726399 -2.546701 -0.284702 -1.739399 -1.216901 7.176805 -11.480303 7.101198 10.638204 -7.457201 -5.531499 0.025003 12.094399 12.419204 43.514757 -82.466706 43.657856 -0.000000 -0.000001 -12.444202 5.170202 11.320294 1.445398 -7.237597 -23.597700 10.882097 -82.576916 69.454884 95.203917 0.000003 -0.000003 26.321707 3.212401 -3.925100 2.735802 5.772000 -5.765600 8.207102 -9.120902 0.000001 -0.000001 -4.913501 2.356801 5.185799 20.866008 0.000000 0.000004 -24.513103 -6.859496 -13.325906 -18.807899 0.000000 -0.000001 13.456003 8.848499 -8.592700 19.222198 -0.000001 0.000003 +40.816296 83.440509 -127.220975 98.601690 5.535718 -0.180398 -5.717399 -3.583799 0.351799 -1.301299 -0.144000 -0.188700 -6.867400 -2.693899 -2.701701 -0.372300 -1.740899 -1.245900 7.179403 -11.700800 7.676297 11.228600 -7.261798 -4.424800 0.085002 11.650499 12.470402 43.505159 -82.587808 43.416158 -0.000000 -0.000002 -12.661604 4.874399 11.274697 1.754695 -7.642699 -23.466002 10.695795 -81.723306 70.640287 94.864897 0.000002 -0.000008 25.857305 4.000205 -4.587202 2.866102 7.102098 -5.142400 9.141002 -7.106401 0.000001 0.000000 -5.886102 0.967201 4.930800 21.823305 0.000000 0.000004 -25.164105 -5.474195 -12.436203 -13.507002 0.000001 -0.000002 16.419512 7.129496 -10.432702 15.419502 0.000001 0.000002 +40.037022 83.301835 -124.406650 98.748796 4.715110 -0.240400 -6.261401 -2.796100 0.323899 -1.611200 0.048000 -0.221400 -7.277101 -2.254500 -3.106702 -0.503700 -1.744699 -1.311801 6.827502 -12.106102 8.324998 11.192705 -6.982300 -3.183599 0.098100 11.208499 12.510703 41.062434 -83.396901 40.639133 0.000001 -0.000000 -13.504903 5.482002 11.282898 1.632395 -7.772300 -23.334901 10.732698 -80.537798 71.648987 94.320692 -0.000001 -0.000006 24.692006 4.588194 -4.975301 2.944798 7.278401 -3.810201 10.318401 -4.358102 0.000000 -0.000002 -5.569901 -0.754998 3.263699 22.119503 0.000000 0.000003 -25.416003 -3.426298 -12.894603 -9.609701 0.000000 -0.000001 17.924603 3.331795 -9.983300 10.243906 0.000000 0.000001 +39.388052 83.242904 -121.578365 98.783086 3.906000 0.344906 -6.935902 -1.987500 0.292200 -1.928599 0.239799 -0.260000 -7.253100 -1.612799 -3.780701 -0.609603 -1.744499 -1.435301 5.750502 -12.406101 8.603299 10.246700 -6.943598 -2.006100 0.020702 11.197900 12.344502 43.062140 -84.660105 42.324739 0.000001 -0.000001 -14.612406 6.481901 11.215897 1.262504 -8.084000 -23.432602 10.858896 -79.596008 72.601585 94.137502 0.000002 -0.000008 23.121106 4.088000 -5.113596 2.715997 7.550499 -2.816900 10.496301 -1.987001 0.000000 -0.000001 -2.731901 -1.021499 2.765100 22.015906 0.000000 0.000004 -24.770803 -1.688998 -14.294403 -7.316403 0.000000 -0.000001 18.352603 2.543397 -8.615801 9.825502 -0.000000 0.000003 +38.747718 83.272358 -118.964192 99.143286 2.852012 1.125597 -7.836598 -0.858101 0.282999 -2.408299 0.394500 -0.274401 -6.808500 -1.073899 -4.280301 -0.681201 -1.715299 -1.504801 4.100601 -12.492703 8.421597 8.508201 -6.969499 -0.986400 0.084400 11.839101 12.138902 42.137513 -86.931403 41.343314 0.000000 -0.000003 -15.836705 7.869402 10.883699 0.854295 -8.548096 -23.226199 10.590698 -78.408003 73.142582 93.451402 0.000001 -0.000004 21.514304 3.051403 -4.790399 2.241301 7.266303 -1.546500 11.173405 0.085200 0.000000 0.000000 1.890298 -2.237899 1.818103 22.707304 0.000000 0.000003 -24.429700 0.159305 -15.659105 -5.375101 0.000001 -0.000002 17.993198 2.330498 -6.933801 9.989901 0.000000 0.000006 +38.139642 83.463625 -116.682761 99.856593 1.537383 1.900099 -8.602100 0.586799 0.333199 -2.951100 0.567200 -0.273200 -6.593001 -0.670099 -4.613200 -0.815200 -1.679499 -1.531101 2.519201 -12.361701 8.135899 7.550902 -7.023497 -0.121699 0.060704 12.683902 12.018001 30.175851 -89.440308 29.235550 0.000001 -0.000000 -17.453201 8.743600 10.127397 0.701699 -9.231301 -22.682903 9.985797 -76.308909 73.077084 91.773597 0.000001 -0.000006 20.204605 1.899499 -4.352301 1.929497 6.307702 -0.068300 12.943204 2.243401 0.000000 0.000001 5.835998 -3.284299 0.654304 22.125404 0.000001 0.000005 -24.639996 2.418003 -14.793505 -3.099300 0.000000 0.000000 16.567001 1.788500 -7.666097 10.348903 0.000002 0.000003 +37.716729 83.784420 -114.550955 99.793698 1.089092 2.731295 -8.663501 1.097699 0.394499 -2.995400 0.648000 -0.291400 -6.791801 -0.132299 -5.043300 -0.979799 -1.588099 -1.568000 1.681302 -12.199902 8.050998 7.341802 -7.135202 0.450600 -0.130700 13.090302 11.999103 -117.493514 -88.009889 -118.792304 -0.000000 -0.000001 -19.384504 9.625401 9.581896 0.771094 -10.055197 -22.093204 9.506497 -74.169617 73.194085 89.851113 -0.000000 -0.000005 19.434103 0.719200 -4.346000 1.681497 6.431498 0.508300 13.763301 3.020600 -0.000001 0.000000 6.297899 -3.875498 2.029905 21.946006 -0.000001 0.000004 -24.007799 3.593703 -14.097704 -1.195802 0.000000 0.000000 15.165105 1.722796 -8.556800 10.996403 -0.000001 -0.000001 +37.501843 84.225110 -112.569757 99.527198 1.728971 3.453307 -8.754996 0.775499 0.352500 -2.953597 0.595199 -0.294101 -6.824198 0.114302 -5.314801 -0.983300 -1.473699 -1.582701 1.438401 -11.910003 7.865899 7.103800 -7.030299 0.827401 -0.108296 13.434301 11.732801 -114.473171 -85.381192 -115.905373 0.000000 0.000000 -20.956506 10.635994 8.996800 0.452200 -10.625695 -21.368103 9.154098 -72.962607 73.364187 88.232005 -0.000001 -0.000003 18.930607 0.403000 -4.432900 1.660997 6.716402 0.067700 13.480804 2.444700 -0.000000 -0.000001 0.444201 -3.672800 4.592103 20.832500 0.000001 0.000004 -22.907397 3.370803 -15.004803 -0.190001 0.000000 -0.000001 14.472598 2.409698 -8.710699 11.302104 0.000000 0.000002 +37.268673 84.575884 -110.851693 99.579093 2.231392 3.942402 -9.093299 0.710600 0.368799 -3.111400 0.523300 -0.272601 -6.544299 0.075401 -5.358000 -0.895199 -1.373299 -1.566601 1.559199 -11.338502 7.615799 7.117503 -7.002699 1.153900 -0.200100 14.022899 11.324803 -110.318771 -82.166892 -111.892974 -0.000001 -0.000002 -22.193305 11.443500 8.632795 -0.040507 -11.041599 -21.014304 8.851499 -74.102218 73.681889 88.562621 0.000003 -0.000004 18.682903 0.594602 -4.146602 1.667399 6.753299 0.250400 12.353402 -0.488899 0.000000 0.000000 -1.324504 -3.852999 6.012499 22.142107 -0.000000 0.000004 -22.053598 3.164303 -15.602403 0.217998 0.000000 0.000000 14.430499 3.297796 -9.155905 10.788401 -0.000000 -0.000002 +37.035755 84.837001 -109.387122 99.732393 2.432980 4.305202 -9.300899 0.876499 0.429599 -3.231300 0.508500 -0.248200 -6.431200 0.014302 -5.318400 -0.822301 -1.271399 -1.548700 2.034203 -10.672201 7.463099 7.797002 -6.822500 1.441900 -0.482397 14.234001 10.917800 -105.083782 -78.883385 -107.131384 -0.000000 -0.000001 -23.326906 11.630099 8.490195 -0.252409 -11.470593 -20.896103 8.667798 -75.680117 73.545987 89.344409 -0.000001 -0.000006 18.823803 1.478204 -3.427398 1.618401 6.789100 0.972700 9.604801 -5.329300 0.000000 0.000000 1.393403 -2.762098 6.631302 21.980910 0.000001 0.000006 -21.498194 3.251001 -15.873903 0.830501 0.000000 0.000000 13.883399 3.670497 -9.423102 10.471804 -0.000000 -0.000002 +36.889451 85.028522 -108.106213 99.692692 2.664776 4.781597 -9.176999 0.967299 0.439599 -3.204700 0.511400 -0.237500 -6.636801 0.026001 -5.345401 -0.765901 -1.165499 -1.536101 3.072397 -9.994501 7.340698 9.317000 -6.188499 1.670200 -0.726500 13.795800 10.410499 -100.178879 -76.919789 -102.711082 0.000000 -0.000001 -24.909802 9.449301 8.315299 -0.272009 -11.821200 -20.826102 8.540797 -76.876516 72.574689 89.868213 0.000000 -0.000004 19.251704 1.771601 -3.374198 1.701098 6.858902 1.461200 5.952701 -10.515700 0.000000 0.000000 2.327499 -2.086598 7.315802 21.711203 0.000001 0.000003 -20.988297 3.304503 -16.807502 1.676699 0.000000 0.000001 13.288897 4.385596 -9.241402 10.415000 -0.000001 0.000001 +36.816299 85.156284 -107.021617 99.650696 2.796779 5.116999 -8.966795 1.103699 0.399100 -3.164298 0.525900 -0.236700 -6.896700 0.054901 -5.345100 -0.687099 -1.060800 -1.520000 4.584500 -9.211102 7.373199 11.428700 -5.376897 2.073399 -1.097697 13.187002 10.142299 -95.502298 -75.227986 -98.407600 -0.000001 -0.000003 -27.403306 7.637001 9.174197 -0.394405 -12.106195 -20.887805 8.667400 -77.679411 71.838489 90.152404 -0.000000 -0.000005 19.946603 0.806794 -2.930300 1.144497 6.593104 1.902000 3.085601 -15.706502 0.000001 0.000000 3.646601 -1.957198 8.085104 21.888205 -0.000000 0.000002 -20.653896 3.356504 -17.059404 2.535798 0.000000 0.000001 12.841403 4.834195 -9.484502 10.427299 0.000001 0.000003 +36.745179 85.235021 -106.096054 99.610895 2.769785 5.338900 -8.779798 1.219198 0.376599 -3.100802 0.551600 -0.240101 -7.097802 0.179401 -5.309799 -0.583099 -0.921800 -1.504500 6.353998 -8.376299 7.418598 13.617900 -4.297600 2.268500 -1.568597 12.817102 10.234199 -92.110605 -73.834987 -95.272006 -0.000000 -0.000002 -30.974006 8.013000 10.260395 -0.780604 -12.322897 -21.127504 8.696899 -79.077923 73.264488 91.013216 -0.000002 -0.000007 21.519503 2.663900 -1.252701 -0.236102 5.944904 2.502900 1.602401 -20.479706 0.000002 -0.000001 5.517399 -1.719197 8.967505 21.641301 0.000001 0.000001 -20.406593 3.550602 -16.999206 3.470600 0.000000 0.000000 12.091309 4.896097 -9.776805 10.113101 -0.000001 0.000001 +36.696665 85.292176 -105.297216 99.680700 2.716071 5.595504 -8.628798 1.298899 0.329599 -3.060201 0.567899 -0.239500 -7.283401 0.306701 -5.304999 -0.491002 -0.764299 -1.482201 8.048602 -7.468700 7.255499 15.406300 -3.539198 2.369301 -1.696299 12.925499 10.159700 -89.974686 -73.474588 -92.958892 -0.000000 -0.000002 -35.825811 11.958702 10.384499 -0.729708 -11.771098 -21.750902 8.547897 -82.268294 74.291187 93.349594 -0.000001 -0.000005 24.812902 9.874798 -0.172403 -0.819302 4.732402 3.096600 0.813600 -24.308001 0.000002 -0.000001 6.635698 -1.054797 10.861005 21.585903 0.000001 0.000002 -20.202793 3.723202 -16.617105 4.127101 -0.000000 -0.000002 11.274405 4.683496 -10.198001 10.296203 0.000000 0.000001 +36.656787 85.330779 -104.594663 99.850300 2.597972 5.997098 -8.542797 1.368399 0.276400 -3.034100 0.567199 -0.243100 -7.370999 0.509200 -5.498400 -0.408298 -0.642999 -1.504700 9.379702 -6.604000 7.050199 16.232702 -3.258798 2.497201 -1.458698 13.694196 9.938802 -88.658098 -73.377591 -91.119794 -0.000002 -0.000002 -41.991805 22.915197 10.951295 -0.286306 -10.837794 -22.508403 8.624498 -85.598709 74.623386 95.490406 0.000001 -0.000008 31.558008 19.121999 -0.832201 -0.541600 3.102001 3.797300 0.774100 -27.246704 0.000003 -0.000002 7.387897 -0.204997 13.303301 21.778104 0.000003 0.000007 -19.648795 3.906602 -16.879203 3.689600 0.000000 0.000001 11.145499 4.672498 -10.243300 9.922703 -0.000002 0.000002 +36.646881 85.357716 -103.983033 100.049196 2.453167 6.669203 -8.455797 1.422600 0.227099 -2.990099 0.553500 -0.255000 -7.360700 0.867601 -5.899300 -0.347100 -0.561699 -1.559601 10.172700 -6.111700 6.916698 16.476605 -3.122398 2.564501 -1.096098 14.760002 9.763699 -87.254905 -73.491483 -89.485602 -0.000000 -0.000001 -48.541396 34.368999 12.109600 -0.594401 -9.832098 -23.071503 8.732296 -88.793393 75.401985 97.426085 0.000002 -0.000009 41.581304 30.831303 -2.370400 -0.421505 1.307902 4.489799 1.033100 -29.483905 0.000003 -0.000002 8.372898 1.035905 15.763102 21.879504 0.000002 0.000004 -19.053298 4.120403 -17.266903 2.983001 -0.000000 -0.000001 10.939202 4.495397 -10.223303 9.774302 0.000001 0.000002 +36.709617 85.376746 -103.467405 100.237908 2.573270 7.729603 -8.346301 1.325599 0.155900 -2.967000 0.469300 -0.268901 -7.104100 1.197902 -6.424401 -0.289596 -0.492199 -1.625600 10.038403 -5.686002 6.486100 16.443701 -3.180199 2.779501 -0.196699 16.039302 9.309899 -86.386311 -74.123788 -88.615812 -0.000003 -0.000002 -54.062112 41.075297 13.251303 -1.863502 -8.522399 -23.092003 8.375298 -91.010105 76.054484 99.035203 0.000003 -0.000009 51.763313 37.956897 -3.814703 0.663597 -0.554698 4.759400 0.930601 -30.978705 0.000002 -0.000002 8.930500 2.534408 17.676601 21.940308 -0.000001 0.000002 -18.817497 4.222501 -17.407800 2.821901 0.000000 0.000000 10.336803 3.797496 -10.695904 9.977902 0.000000 0.000002 +36.802329 85.403924 -103.075229 100.532398 2.710567 8.957198 -8.233698 1.230499 0.104099 -2.945198 0.380399 -0.276701 -6.752700 1.452502 -6.959101 -0.248101 -0.430899 -1.696001 9.376693 -5.235202 5.898299 15.904200 -3.415599 3.003301 0.979900 17.237599 8.602698 -85.669611 -74.997188 -88.227914 -0.000002 -0.000004 -58.199912 42.908395 15.019698 -3.464912 -6.799401 -22.622103 8.331197 -91.230494 76.716889 99.310291 0.000009 -0.000013 60.618605 36.284001 -8.425204 0.745897 -2.680899 5.076800 1.118799 -31.528908 0.000002 -0.000002 8.605594 3.322703 18.354703 21.765105 0.000000 0.000003 -18.998699 4.487703 -17.667405 3.140299 0.000000 0.000001 9.630302 3.190796 -11.538700 9.705105 0.000001 0.000003 +36.922471 85.386911 -102.736383 100.692093 2.730779 9.964902 -7.903394 1.161199 0.042298 -2.833500 0.292400 -0.279400 -6.571901 1.682102 -7.177099 -0.245701 -0.369399 -1.707000 8.640298 -4.776700 5.290900 15.011505 -3.790499 2.855001 2.297504 18.083599 7.745799 -85.045688 -75.918685 -88.166791 -0.000002 -0.000005 -61.094505 43.376100 16.882292 -4.889007 -5.536697 -22.394799 8.720597 -90.852315 77.620081 99.918812 0.000011 -0.000010 67.425312 33.384004 -14.097003 2.076296 -4.816098 5.675900 2.413501 -31.191507 0.000002 -0.000003 8.661994 2.992904 17.370901 21.864802 0.000001 0.000005 -19.032799 4.676903 -17.332604 3.397900 -0.000000 -0.000001 8.683400 2.561396 -12.216502 9.625401 0.000000 0.000002 +37.112969 85.341196 -102.456993 100.954905 2.551483 10.914602 -7.589294 1.304499 0.046800 -2.726199 0.311299 -0.280801 -6.507401 1.863301 -7.264999 -0.242800 -0.353599 -1.728500 8.042302 -4.403401 4.819700 13.960601 -4.278900 2.419700 3.420801 18.633900 6.895999 -84.768863 -76.534284 -88.589467 -0.000003 -0.000003 -63.356104 44.041501 18.861008 -5.873107 -4.559097 -22.145898 9.390597 -89.178605 78.705682 99.427098 0.000007 -0.000012 73.080804 35.143002 -17.789203 2.923596 -7.033100 6.500697 4.404301 -30.125803 0.000001 0.000000 8.396500 1.894504 15.520296 21.727499 -0.000000 0.000005 -19.083995 5.014202 -17.378704 3.424500 0.000000 0.000000 7.889002 1.710495 -12.732501 9.736401 0.000000 0.000002 +37.384497 85.269824 -102.228907 101.262603 2.245871 11.898702 -7.294998 1.538900 0.008598 -2.637498 0.370999 -0.289500 -6.471100 2.126302 -7.349099 -0.242601 -0.322299 -1.738100 7.573601 -4.288400 4.482100 12.353702 -4.835000 1.814902 4.119202 18.713600 6.191298 -84.037795 -76.846984 -88.466197 -0.000003 -0.000003 -65.628808 44.341589 20.418799 -6.305703 -3.742796 -22.009599 10.158697 -86.402204 79.984790 97.884001 0.000010 -0.000013 78.105597 36.003901 -18.447295 3.455400 -9.436197 7.338602 6.498201 -27.890000 0.000002 -0.000003 7.337801 -0.307495 13.726006 21.720106 0.000002 0.000007 -19.108200 5.418203 -17.597401 3.248900 -0.000001 0.000000 7.476802 1.338394 -13.092602 9.692804 0.000001 0.000000 +37.725111 85.175837 -102.034081 101.518003 1.876073 13.080907 -6.951596 1.830499 -0.038201 -2.444398 0.468200 -0.298899 -6.500300 2.404202 -7.531500 -0.282800 -0.319399 -1.764601 6.947603 -4.320699 4.125199 10.407800 -5.500300 1.063502 4.411405 18.616197 5.603598 -83.541294 -76.979085 -88.573293 -0.000003 -0.000002 -67.836407 45.766694 20.789401 -6.048406 -3.100998 -21.982200 10.817898 -81.900600 80.676592 94.385498 0.000014 -0.000013 83.142301 36.159798 -20.234206 4.635794 -11.981197 8.038799 8.568998 -23.808600 0.000003 -0.000004 8.439706 -2.703195 12.566304 22.778100 0.000001 0.000004 -19.203895 5.908003 -17.371206 3.276599 0.000000 0.000000 7.206600 1.149396 -14.122003 9.479504 -0.000000 -0.000002 +38.166055 85.130124 -101.914963 101.866300 1.798185 14.351503 -6.615997 1.878301 -0.051402 -2.283700 0.533900 -0.316001 -6.578899 2.690101 -7.804399 -0.355498 -0.344500 -1.804000 5.935199 -4.348800 3.658899 8.457001 -6.284000 0.266600 4.564503 18.511498 5.356999 -83.948221 -76.568987 -89.378720 -0.000003 -0.000003 -69.698501 47.773302 20.434802 -6.024507 -2.181098 -22.002399 11.200298 -79.155214 81.291785 92.073508 0.000015 -0.000014 87.415397 34.686501 -22.005095 4.732297 -14.579803 8.173000 10.912899 -19.067501 0.000002 -0.000002 8.947394 -1.797697 9.872601 22.357707 0.000002 0.000006 -19.620197 6.161704 -17.225704 3.512501 0.000000 0.000000 6.687600 0.709595 -15.240899 9.343900 -0.000000 -0.000001 +38.694121 85.094051 -101.805471 102.133203 1.872558 15.924607 -6.232097 1.919199 -0.129899 -2.098000 0.538001 -0.332300 -6.641502 2.852002 -8.139200 -0.465899 -0.376199 -1.873699 4.623901 -4.357801 3.065101 6.673102 -6.866899 -0.588099 4.424204 18.364699 5.306199 -84.567713 -75.667290 -90.357016 -0.000003 -0.000003 -71.606310 48.729798 20.996205 -5.933803 -1.498298 -22.002000 11.154799 -79.179836 82.553389 92.344631 0.000014 -0.000012 90.122201 35.005301 -21.968102 4.592793 -16.465403 7.889898 11.175403 -15.476806 0.000001 0.000001 9.145904 -0.969295 8.920302 21.825905 -0.000001 -0.000003 -20.243597 6.363900 -17.190299 4.209299 0.000000 0.000000 6.079000 0.568395 -16.686198 9.146303 0.000001 0.000004 +39.258255 85.111821 -101.666799 102.274601 2.280483 17.488607 -5.880900 1.662899 -0.135099 -1.909402 0.516801 -0.339898 -6.737200 2.883901 -8.373898 -0.584798 -0.407999 -1.928099 3.281400 -4.285900 2.254800 4.991101 -7.278001 -1.707200 4.147402 18.031503 5.332198 -84.812209 -74.520588 -90.801309 -0.000003 -0.000003 -73.541501 49.098802 21.796688 -6.099309 -1.050499 -21.669201 10.517298 -78.727143 83.434883 91.902535 0.000014 -0.000012 91.546200 37.169807 -23.454101 4.909796 -17.953501 7.225602 10.187699 -12.437101 0.000002 -0.000005 8.727702 -0.302497 8.709104 21.659303 0.000000 0.000001 -21.007499 6.209202 -17.048899 5.205901 0.000000 0.000001 5.445600 0.670594 -18.290301 8.850802 -0.000000 -0.000001 +39.813497 85.142555 -101.496111 102.292108 2.653480 18.685394 -5.559400 1.427200 -0.139800 -1.731901 0.479600 -0.337899 -6.797500 2.810203 -8.291300 -0.694397 -0.436199 -1.909902 2.170502 -4.209300 1.611598 4.088202 -7.414900 -2.622000 3.817705 17.706799 5.555897 -85.411209 -73.206988 -91.241206 -0.000003 -0.000003 -75.585202 49.409799 21.899096 -5.908803 -1.231696 -21.464303 9.813595 -77.676649 84.515180 90.904441 0.000014 -0.000013 91.908699 36.171398 -25.281303 3.917692 -19.063096 6.579200 9.022899 -9.978000 0.000001 0.000000 8.241297 0.139904 8.814004 21.509604 -0.000001 0.000004 -21.528598 5.941903 -17.070601 6.013099 0.000000 0.000001 4.830003 0.698994 -19.535799 8.552399 -0.000001 -0.000003 +40.298891 85.177864 -101.320851 102.342395 2.869084 19.294202 -5.312301 1.303599 -0.136303 -1.592700 0.451100 -0.323901 -6.926801 2.637602 -7.898799 -0.781199 -0.470099 -1.834101 1.543703 -4.139400 1.203800 3.767901 -7.359600 -3.415202 3.250001 17.495597 6.047300 -86.420802 -72.211590 -91.974805 -0.000004 -0.000006 -77.594999 49.810099 21.248990 -5.640509 -1.610097 -21.217699 9.452598 -73.192423 86.688988 86.225314 0.000012 -0.000013 91.812400 40.019402 -20.706502 0.796196 -20.070400 6.169201 10.049999 -7.970601 0.000000 -0.000002 7.674697 0.322903 7.296698 21.501700 0.000003 0.000006 -21.841600 5.651802 -17.192600 6.461702 0.000000 0.000001 4.298397 0.755396 -20.194002 8.496003 0.000001 0.000000 +40.746695 85.221562 -101.102917 102.308808 2.981301 19.565192 -5.076396 1.216900 -0.136402 -1.498399 0.422600 -0.309799 -7.061801 2.453501 -7.458700 -0.807203 -0.506799 -1.752000 1.444002 -4.103399 0.939999 3.601900 -7.298701 -4.155200 2.564102 17.191501 6.712399 -86.931996 -71.556589 -92.090100 -0.000003 -0.000004 -79.303298 50.887395 20.413601 -5.523104 -1.779396 -20.957297 9.134296 -59.745256 87.901588 72.568053 0.000011 -0.000014 91.282698 45.222500 -17.007004 -3.758010 -20.718699 5.774499 11.311305 -6.542900 0.000000 -0.000003 7.156197 0.326502 5.735602 21.459899 0.000002 0.000004 -21.860197 5.312702 -17.624700 6.642201 0.000000 0.000001 3.891104 0.830492 -20.183103 8.453703 -0.000001 -0.000003 +41.179255 85.273129 -100.841559 102.370910 2.988488 19.885399 -4.967198 1.258099 -0.176001 -1.481399 0.415700 -0.302697 -7.157001 2.278801 -7.206799 -0.773600 -0.565100 -1.726601 1.751398 -4.048800 0.764100 4.116602 -7.182800 -4.752599 2.058301 16.885097 7.295498 -86.731803 -71.243487 -91.266305 -0.000003 -0.000005 -80.340503 51.758098 19.761098 -5.419206 -1.708698 -20.831701 8.986996 -50.852538 87.781495 63.336334 0.000014 -0.000015 90.331198 44.139399 -17.267601 -3.385505 -21.425300 5.472998 12.447600 -5.033199 0.000000 -0.000001 6.679601 0.327702 4.307104 21.058602 0.000003 0.000004 -21.834796 5.103702 -17.980503 6.645201 -0.000001 0.000001 3.604804 0.407991 -20.245301 7.391701 -0.000001 0.000000 +41.601405 85.269060 -100.539027 102.456110 3.002486 20.277095 -4.943799 1.256900 -0.191499 -1.482899 0.397900 -0.304300 -7.301499 2.172302 -7.151399 -0.719502 -0.613099 -1.733103 2.675900 -3.983200 0.661898 5.762602 -7.036101 -5.166701 1.484702 16.675503 7.585697 -86.118889 -71.611488 -90.284295 -0.000003 -0.000004 -80.574902 51.543593 19.554302 -4.624204 -2.025698 -21.098599 9.083695 -45.193713 87.367396 57.689706 0.000014 -0.000014 89.344598 41.423198 -19.607407 -3.008710 -22.039605 5.152398 12.842499 -3.674103 0.000001 0.000003 6.462803 0.587602 3.568700 20.936000 0.000000 0.000004 -21.757300 4.891704 -18.666300 6.513501 -0.000001 0.000001 3.586102 0.632693 -19.984806 7.277699 0.000001 0.000004 +42.035743 85.254836 -100.216713 102.588900 3.055491 20.722599 -4.964695 1.182200 -0.202399 -1.528299 0.380498 -0.311798 -7.531699 2.136701 -7.223201 -0.652399 -0.642799 -1.768002 4.075401 -3.900999 0.605298 8.313602 -6.688798 -5.499400 1.257803 16.522798 7.608600 -85.308274 -72.363485 -89.069578 -0.000004 -0.000003 -80.130297 52.609199 19.032199 -4.316702 -2.191297 -21.249101 9.242996 -41.425665 86.856194 53.976661 0.000013 -0.000015 87.760199 41.659201 -20.892306 -3.468208 -22.924303 4.716197 12.343305 -1.857101 0.000001 0.000006 5.984600 0.908002 3.714801 21.069704 -0.000002 0.000001 -21.781301 4.635501 -18.890998 6.446600 0.000000 0.000001 3.501802 0.965593 -20.195900 7.421104 -0.000001 0.000002 +42.418521 85.232481 -99.858063 102.694796 2.910900 21.198195 -5.022495 1.204598 -0.243799 -1.607499 0.366601 -0.317501 -7.704400 2.140602 -7.306203 -0.540101 -0.651899 -1.793700 5.796599 -3.736098 0.508500 10.985400 -6.241499 -5.856601 1.021001 16.343299 7.542898 -83.732008 -73.080391 -87.300808 -0.000003 -0.000004 -80.364299 54.613487 19.002997 -3.153911 -2.343597 -21.293502 9.423898 -37.959639 86.412895 50.379435 0.000014 -0.000013 86.365003 42.619296 -21.308700 -3.997905 -23.590700 4.534500 12.598499 -0.251100 -0.000001 0.000003 5.697302 1.140900 3.109197 21.154506 -0.000002 0.000001 -21.653299 4.577102 -18.838400 6.353002 -0.000001 0.000001 3.374803 1.156893 -20.728603 7.430402 0.000001 -0.000002 +42.786569 85.221813 -99.465381 102.722997 2.761606 21.630298 -5.061697 1.137900 -0.256202 -1.709100 0.339000 -0.323600 -7.871499 2.185001 -7.383998 -0.427800 -0.645799 -1.807200 7.560601 -3.524899 0.382300 13.389303 -5.781499 -6.196300 0.896301 16.273103 7.504900 -82.008006 -73.388791 -85.390609 -0.000003 -0.000003 -81.535199 54.444398 18.657895 -2.509509 -2.502299 -21.349700 9.557194 -36.073631 86.058095 48.261526 0.000008 -0.000012 85.514897 43.349093 -21.548600 -3.374907 -24.063501 4.353795 12.831205 1.173000 0.000000 0.000005 5.349900 1.199901 2.503300 21.142104 0.000002 0.000007 -21.330397 4.457602 -18.996203 6.075399 0.000000 0.000001 3.295903 1.375092 -21.000400 7.372299 -0.000000 0.000004 +43.160709 85.251521 -99.024189 102.610998 2.742190 22.042605 -5.057597 0.938100 -0.251000 -1.750599 0.270599 -0.325697 -8.072301 2.160902 -7.416298 -0.345600 -0.649699 -1.820601 9.086602 -3.227599 0.232600 14.996002 -5.371999 -6.438400 0.890101 16.392200 7.429098 -80.732905 -73.187489 -84.085810 -0.000004 -0.000006 -83.295202 53.771104 19.039200 -2.673708 -2.713899 -21.166499 9.614899 -32.014750 85.936596 43.930148 0.000015 -0.000013 85.339703 42.924095 -21.373801 -3.036807 -24.327299 4.021497 12.575801 2.464800 -0.000001 0.000001 4.702000 1.194701 2.293001 21.073304 0.000000 0.000004 -20.874598 4.139802 -19.315699 5.770500 -0.000001 0.000000 3.176096 1.688994 -21.157301 7.250601 -0.000000 -0.000001 +43.519359 85.301054 -98.524063 102.410202 2.697793 22.389290 -5.084095 0.754900 -0.263501 -1.778599 0.185199 -0.322401 -8.141400 2.065101 -7.361195 -0.245498 -0.646099 -1.820901 10.352602 -2.880499 0.064700 15.216505 -5.171899 -6.552099 1.124602 16.659400 7.262497 -80.446976 -73.245385 -83.683081 -0.000004 -0.000003 -84.793602 53.617796 17.799593 -2.557607 -2.907699 -20.841700 9.661696 -26.694164 86.052294 38.260762 0.000012 -0.000013 85.660503 43.773399 -21.467305 -2.712804 -24.415805 3.653000 12.179998 3.682701 0.000000 0.000003 3.947301 1.308800 2.257598 21.021106 0.000000 0.000001 -20.234998 3.783003 -19.848701 5.386801 0.000000 0.000001 2.991304 1.940792 -21.066101 7.168304 0.000000 0.000000 +43.857433 85.349819 -97.984813 102.312498 2.610300 22.602093 -5.213391 0.590100 -0.267598 -1.880998 0.118899 -0.317897 -8.053100 1.986802 -7.264400 -0.143901 -0.616599 -1.801199 11.039199 -2.580300 -0.064600 14.699200 -5.165298 -6.458600 1.471202 16.837898 6.969497 -80.529107 -73.375489 -83.876809 -0.000004 -0.000003 -85.875197 53.495296 18.371100 -2.976009 -2.993099 -20.615499 9.699800 -21.830133 86.424998 33.118635 0.000013 -0.000013 86.100299 45.773094 -21.650506 -1.790908 -24.526903 3.313698 11.769602 4.803599 0.000000 0.000004 3.218202 1.481401 2.433602 20.970301 0.000000 0.000003 -19.514599 3.412903 -20.185602 4.737400 0.000000 0.000001 2.919802 2.200892 -21.046205 7.087699 -0.000001 -0.000001 +44.185345 85.410030 -97.388677 102.316702 2.479573 22.724601 -5.381995 0.475500 -0.271100 -1.989301 0.065100 -0.317999 -8.017400 1.955701 -7.229200 -0.079301 -0.596799 -1.792702 11.295203 -2.334100 -0.111300 13.728103 -5.255299 -6.204199 1.862300 16.844002 6.690798 -80.292605 -73.958587 -83.987205 -0.000004 -0.000002 -85.742698 52.971797 18.150497 -3.857106 -2.986298 -20.346101 9.931897 -10.829806 86.897103 21.980105 0.000016 -0.000011 87.091401 44.358490 -21.979103 -0.864310 -24.606105 3.018899 11.383004 5.750302 -0.000001 0.000004 2.531600 1.796001 2.692702 20.848305 0.000002 0.000008 -18.626594 2.994500 -20.423399 3.653200 0.000000 0.000000 2.998301 2.472693 -21.020604 7.138101 -0.000000 -0.000001 +44.484049 85.457777 -96.731828 102.339717 2.337688 22.853697 -5.574601 0.407400 -0.297899 -2.094600 0.010301 -0.317399 -7.975700 1.911602 -7.204300 -0.051400 -0.575799 -1.792901 11.020701 -2.191899 -0.112399 12.601605 -5.359899 -5.951799 2.391804 16.950496 6.371398 -80.311218 -75.027689 -84.697114 -0.000004 -0.000003 -83.315399 53.533100 16.119299 -4.340010 -2.899194 -20.039799 10.202199 4.756461 87.245301 6.151637 0.000013 -0.000012 89.207298 43.369607 -21.965497 -1.587401 -24.447906 2.803700 11.022499 6.282000 -0.000000 0.000006 2.072698 1.927901 2.921200 20.746602 0.000000 0.000007 -17.479396 2.512400 -20.872697 2.079600 0.000000 0.000000 3.298302 2.703593 -20.804101 7.159501 -0.000001 -0.000002 +44.762941 85.511371 -96.029275 102.355895 2.280987 23.072002 -5.748400 0.296599 -0.330297 -2.193499 -0.050000 -0.318304 -7.957301 1.882001 -7.187898 -0.067399 -0.546899 -1.791199 10.269800 -2.146899 -0.116899 11.381003 -5.533702 -5.737702 3.181001 17.193397 5.931900 -80.825695 -76.500886 -86.446799 -0.000003 -0.000004 -77.326300 54.549194 13.092693 -4.211415 -2.823698 -19.887698 10.231198 18.343816 87.578509 -7.624320 0.000015 -0.000012 91.832897 44.443491 -20.212704 -1.577209 -24.245504 2.562700 10.581999 6.755902 0.000001 0.000006 1.579702 2.068901 3.072298 20.733604 0.000000 0.000007 -16.069294 1.860200 -21.373599 -0.068300 0.000000 0.000000 3.803704 2.865794 -20.606304 7.365202 -0.000001 0.000000 +45.006275 85.562674 -95.270833 102.334508 2.239586 23.302906 -5.929698 0.175100 -0.365301 -2.287498 -0.109202 -0.324499 -7.907599 1.886002 -7.264599 -0.103200 -0.531499 -1.799201 9.308902 -2.172399 -0.117002 10.045102 -5.800698 -5.483200 4.121904 17.206098 5.344897 -80.229405 -78.044686 -87.325104 -0.000002 -0.000005 -69.569903 53.684499 13.648500 -3.173006 -2.612999 -19.757702 10.210294 31.061660 87.799306 -20.360465 0.000017 -0.000013 94.350799 43.947586 -18.673304 -1.551306 -23.892708 2.286300 10.398199 7.092702 -0.000001 0.000003 1.179400 2.343301 2.949295 20.665909 -0.000001 0.000003 -14.190599 1.016302 -21.668799 -3.058100 0.000000 0.000000 4.582200 2.983793 -20.669199 7.652200 -0.000001 0.000000 +45.198807 85.576908 -94.462082 102.327205 2.263285 23.380001 -6.208695 -0.026801 -0.371700 -2.411300 -0.156300 -0.337001 -7.882199 1.924502 -7.468698 -0.133200 -0.544399 -1.821000 8.515799 -2.127200 -0.116201 8.947601 -6.048599 -5.006401 4.668101 16.738703 4.611996 -75.517821 -80.057688 -83.852018 -0.000001 -0.000002 -62.557498 55.612102 13.705106 -1.341105 -1.846900 -19.891596 10.477993 62.866522 87.606916 -52.294823 0.000017 -0.000015 95.780200 42.709393 -18.416799 -1.638505 -23.502609 1.938198 10.142200 7.295699 -0.000000 0.000005 0.885002 2.529001 3.031298 20.609705 -0.000001 0.000003 -11.754498 -0.114999 -21.657002 -7.175700 0.000000 -0.000001 5.761399 3.152295 -20.958001 7.852300 -0.000001 0.000001 +45.347905 85.521272 -93.679505 102.368006 2.417085 23.252506 -6.563803 -0.266600 -0.366905 -2.565700 -0.224100 -0.345299 -7.924301 1.818202 -7.688196 -0.158699 -0.556699 -1.869603 7.941500 -1.960598 -0.129903 8.655803 -6.118699 -4.360499 4.768701 16.262197 4.062795 -66.359356 -82.150590 -75.145059 -0.000001 -0.000002 -58.627298 56.623591 12.848293 -0.527711 -0.820499 -20.430297 10.698095 96.044045 85.529813 -85.231742 0.000014 -0.000017 94.527803 43.731995 -19.747499 -1.558007 -23.320504 1.453800 9.988100 7.607300 -0.000001 0.000002 0.747497 2.754601 3.116598 20.503900 -0.000000 0.000005 -9.009798 -1.583900 -21.633301 -12.202203 0.000001 -0.000001 7.276704 3.543292 -20.762604 8.195801 -0.000001 0.000000 +45.474651 85.410271 -93.026997 102.574311 2.630873 22.996705 -6.961697 -0.468700 -0.342202 -2.723898 -0.279800 -0.357900 -8.040200 1.664701 -7.867797 -0.210499 -0.592299 -1.951401 7.633102 -1.964499 0.013899 8.890401 -5.916199 -3.961700 4.283201 16.045199 4.261997 -55.926425 -83.214195 -64.515829 -0.000004 0.000000 -58.626806 54.800598 13.491895 -0.918907 0.044100 -20.919099 10.876795 102.783832 82.471212 -91.400832 0.000011 -0.000016 90.877600 47.235397 -22.912197 -0.235501 -23.610406 1.016400 9.392700 8.235599 -0.000000 0.000004 0.610901 2.920102 3.722400 20.664106 0.000001 0.000007 -6.710398 -3.204900 -21.538599 -17.188101 0.000001 -0.000001 8.561300 3.944296 -18.238202 8.818100 0.000000 0.000000 +45.578535 85.260426 -92.550999 102.719802 2.822782 22.810103 -7.172702 -0.606700 -0.294901 -2.789199 -0.281400 -0.359801 -8.176501 1.518902 -7.748400 -0.278498 -0.659899 -1.969099 7.404399 -2.314400 0.211101 9.251500 -5.788898 -4.307798 3.686502 16.071499 5.037896 -51.559753 -83.258995 -59.720255 -0.000003 -0.000004 -60.257315 54.196592 13.769207 -1.460006 0.383700 -21.029402 10.924096 100.318298 79.176908 -88.648301 0.000015 -0.000014 87.471603 49.990199 -25.580405 0.817691 -24.032002 0.680302 8.604097 9.002299 -0.000001 0.000001 0.614700 3.025402 4.516701 20.677097 0.000004 0.000009 -4.973298 -4.746899 -20.567601 -21.718303 0.000002 -0.000002 10.039203 5.503796 -15.039201 10.004300 0.000000 0.000002 +45.681915 85.148407 -92.290133 102.825112 3.096485 22.868196 -7.225995 -0.695500 -0.267098 -2.776698 -0.252100 -0.348500 -8.284601 1.400102 -7.255898 -0.341200 -0.718999 -1.868801 7.178600 -2.941600 0.360600 9.496200 -6.074198 -5.262000 3.508003 16.246603 5.785398 -54.585629 -82.586495 -62.157830 -0.000003 -0.000003 -61.304814 53.366492 13.757901 -2.209906 -0.163799 -20.989002 10.594394 95.073816 76.640907 -83.620119 0.000012 -0.000015 85.939298 47.730998 -27.159898 1.189396 -24.564002 0.354302 8.078098 9.862700 -0.000000 0.000004 0.346898 2.980903 4.840403 20.575503 0.000002 0.000007 -4.233298 -6.028798 -19.094800 -25.190303 0.000001 -0.000002 11.642802 7.315796 -13.165702 10.704702 0.000001 0.000003 +45.770559 85.136721 -92.181680 102.894011 3.485173 23.342507 -7.196301 -0.772701 -0.246899 -2.764898 -0.231900 -0.338802 -8.337200 1.340602 -6.934799 -0.386300 -0.745799 -1.787400 7.066197 -3.618399 0.451898 9.536402 -6.624601 -6.200699 3.246101 16.259398 6.324500 -57.489550 -81.525894 -64.526852 -0.000003 -0.000003 -61.732008 52.629798 13.885201 -2.452004 -1.026699 -20.998597 9.947897 89.262705 76.154312 -78.381711 0.000014 -0.000013 85.795700 45.895092 -28.170906 1.485091 -24.761203 0.109000 7.709899 10.077001 -0.000001 0.000003 0.039403 3.042303 4.624798 20.582203 -0.000001 -0.000001 -4.502898 -7.079298 -17.876101 -27.370004 0.000002 -0.000002 12.310797 7.193296 -13.000501 10.508500 -0.000000 0.000003 +45.808661 85.170508 -92.154492 102.752706 3.946103 24.258696 -7.033098 -0.886702 -0.266799 -2.679699 -0.232500 -0.344199 -8.291999 1.284601 -7.088398 -0.409000 -0.789599 -1.831103 6.947001 -4.188800 0.486199 9.500904 -6.989201 -6.796100 2.781002 16.100699 6.644999 -58.606552 -80.411195 -65.032954 -0.000005 -0.000001 -61.723306 52.186399 13.980101 -2.432802 -1.468197 -21.406003 9.334698 84.776410 78.093708 -74.699817 0.000013 -0.000014 85.637499 46.031398 -29.060003 2.351790 -24.427202 -0.096299 7.912698 9.645901 -0.000000 0.000005 -0.046501 3.083201 3.467799 20.525104 0.000002 0.000006 -5.584697 -7.921099 -16.889202 -28.188303 0.000002 -0.000002 13.169504 6.975996 -13.961002 10.633700 0.000000 0.000000 +45.788595 85.213170 -92.213925 102.580201 4.465902 25.277894 -6.844900 -1.091000 -0.242002 -2.614799 -0.188801 -0.361502 -8.150900 1.252501 -7.497600 -0.411802 -0.852899 -1.944802 6.809901 -4.563701 0.464595 9.397401 -7.223601 -7.127503 2.155501 15.838199 6.871401 -59.430028 -79.185892 -65.199926 -0.000002 -0.000002 -61.438808 51.070000 14.117393 -2.630010 -1.654097 -22.019098 9.143894 79.501128 81.386211 -70.445132 0.000014 -0.000014 85.492897 46.439994 -29.157910 2.738790 -24.186104 -0.295597 8.121197 9.318900 0.000000 0.000003 -0.203804 3.050001 2.202804 20.638001 0.000000 0.000000 -7.474497 -8.494998 -15.642098 -27.757202 0.000002 -0.000002 13.498399 7.600597 -13.505401 9.724005 0.000000 0.000002 +45.648133 85.208859 -92.336864 102.305705 5.073193 26.129407 -6.628399 -1.409200 -0.197600 -2.500400 -0.196801 -0.369601 -8.048400 1.122802 -7.701900 -0.409598 -0.917299 -2.020001 6.734302 -4.673699 0.374597 9.180300 -7.419199 -7.372696 1.739800 15.663700 6.977501 -61.609219 -77.663986 -66.572417 -0.000001 -0.000003 -61.084902 50.004391 14.546398 -2.757706 -1.911399 -22.380496 8.954994 62.735811 85.408712 -54.551114 0.000013 -0.000014 84.852403 45.693798 -28.438102 3.226298 -23.979404 -0.525099 7.892997 9.078601 0.000001 0.000012 -0.413600 3.156500 1.425496 20.558304 0.000002 0.000006 -9.662899 -8.873597 -13.420803 -26.546601 0.000001 -0.000001 12.963203 8.864194 -10.731202 10.042600 0.000000 0.000002 +45.388291 85.149164 -92.502231 101.884407 5.806989 26.782007 -6.369399 -1.852100 -0.122401 -2.350501 -0.279201 -0.363801 -7.985900 0.886503 -7.664098 -0.404799 -0.971799 -2.023801 6.671298 -4.661400 0.209898 8.939301 -7.482000 -7.624001 1.279801 15.531702 7.101099 -64.576125 -75.961488 -68.944228 -0.000002 -0.000000 -60.530912 50.354598 14.465992 -2.572907 -2.377199 -22.433401 8.796095 -12.909856 87.571197 20.511352 0.000009 -0.000014 83.548998 44.743990 -27.750305 3.605894 -23.695404 -0.871802 7.611805 8.781602 0.000001 0.000006 -0.484201 3.103501 0.807997 20.534004 0.000000 0.000004 -12.015298 -9.212998 -10.463697 -24.556301 0.000003 -0.000002 12.187399 10.121699 -7.097601 9.918399 0.000000 0.000001 +45.013644 85.018618 -92.689167 101.274915 6.672194 27.167294 -6.043499 -2.388100 -0.029898 -2.144500 -0.403501 -0.349404 -7.967098 0.504801 -7.385399 -0.407199 -1.050299 -1.993201 6.680902 -4.679800 0.140299 8.725002 -7.486801 -7.946699 0.899101 15.545601 7.347797 -67.901425 -74.058092 -71.688928 0.000000 -0.000004 -59.842204 49.700399 13.939598 -2.180104 -2.949498 -22.361101 8.811295 -67.669555 84.308686 75.000353 0.000013 -0.000008 81.085697 43.777893 -26.874302 4.092291 -23.434609 -1.447600 7.377500 8.733200 0.000001 0.000006 -0.590003 2.974401 0.346196 20.348706 0.000001 0.000007 -14.507301 -9.711998 -7.323100 -21.551202 0.000001 -0.000001 12.363902 9.958096 -4.598601 11.442103 0.000001 0.000005 +44.541201 84.880188 -92.888554 100.650696 7.498305 27.373601 -5.689096 -2.812802 0.098200 -1.937298 -0.520799 -0.332503 -8.003000 0.044102 -7.023398 -0.406500 -1.156699 -1.952604 6.758402 -4.766298 0.136999 8.661902 -7.551699 -8.301899 0.510300 15.421203 7.670599 -70.727414 -72.239088 -73.855415 -0.000003 -0.000003 -59.281609 48.347290 13.880889 -2.139710 -3.574699 -22.187903 8.754993 -81.081103 79.802485 88.689200 0.000010 -0.000013 76.788798 41.982793 -24.613908 4.440492 -23.251201 -2.013500 7.141596 8.859101 -0.000001 0.000003 -0.729604 2.739201 0.131896 20.456604 -0.000001 0.000002 -17.066198 -10.387401 -5.163402 -17.183098 0.000002 0.000001 13.308202 9.840099 -3.947502 11.237103 0.000000 0.000001 +43.907979 84.796869 -93.117670 100.263210 8.041601 27.521793 -5.378998 -2.958401 0.209604 -1.771501 -0.562900 -0.315002 -8.142399 -0.392098 -6.675400 -0.407800 -1.283499 -1.912302 6.989901 -4.912098 0.211100 8.627605 -7.621999 -8.648401 0.084302 14.965902 8.113999 -72.532296 -70.368490 -75.052999 -0.000002 -0.000003 -58.727797 47.927296 13.915296 -2.012606 -4.033799 -21.768796 8.941995 -87.255805 76.116884 95.476700 0.000010 -0.000014 70.652310 36.162783 -20.633502 2.774491 -23.046903 -2.163401 7.424201 8.830102 0.000000 0.000007 -0.846703 2.296300 -0.339200 20.535006 0.000001 0.000007 -19.339596 -10.512399 -5.086802 -12.988000 0.000001 -0.000001 13.555999 9.507500 -3.551196 11.018104 -0.000001 0.000002 +43.077651 84.759787 -93.325699 99.979714 8.269780 27.430001 -5.090399 -3.016202 0.336698 -1.616098 -0.533501 -0.294000 -8.375500 -0.698399 -6.159798 -0.416599 -1.378698 -1.825299 7.429603 -5.060100 0.386700 8.655905 -7.693598 -9.088197 -0.530798 14.387602 8.673602 -73.986717 -68.977686 -76.304420 -0.000004 -0.000004 -57.874413 47.253493 13.480295 -1.888907 -4.969198 -21.029502 9.239899 -89.545103 72.740784 98.890799 0.000008 -0.000012 63.528710 35.961806 -16.876804 1.398298 -22.559802 -1.950400 8.235098 8.448900 0.000000 0.000007 -0.763499 1.750600 -1.002204 20.627704 0.000002 0.000009 -20.771699 -9.946101 -6.613105 -9.789500 0.000000 -0.000001 13.500204 8.586499 -3.165200 10.584801 -0.000000 -0.000002 +42.108897 84.743026 -93.496125 99.853604 8.267793 27.063296 -4.942799 -3.000099 0.416698 -1.537499 -0.505300 -0.273100 -8.488198 -0.870199 -5.527800 -0.417001 -1.411899 -1.692600 7.818500 -5.130699 0.583799 8.797900 -7.740496 -9.419797 -0.924900 14.071502 9.139398 -76.543498 -68.084290 -78.537402 -0.000003 -0.000005 -56.780107 46.565694 13.536410 -1.622203 -5.691296 -20.316497 9.471096 -90.670006 69.199483 101.426396 0.000008 -0.000011 55.189318 38.755296 -13.419092 1.715502 -21.996701 -1.472599 9.364601 7.920001 -0.000001 0.000002 -0.516501 1.302700 -1.686802 20.753007 0.000000 0.000003 -21.711899 -9.071598 -8.130401 -7.199500 -0.000000 0.000002 13.158303 7.258699 -2.419700 10.564002 -0.000000 -0.000001 +41.143187 84.777054 -93.761563 100.264609 8.095198 26.761288 -5.043996 -2.683198 0.387700 -1.575000 -0.460099 -0.254501 -8.541799 -0.986299 -5.116602 -0.447199 -1.415899 -1.611100 7.936599 -5.085198 0.765002 8.913202 -7.775998 -9.391698 -1.371000 13.949700 9.490703 -79.903305 -68.015990 -81.318301 -0.000002 -0.000005 -55.826903 46.430696 13.658791 -1.462806 -6.444096 -19.777499 9.744200 -91.924502 66.849682 104.315401 0.000006 -0.000011 46.191507 33.537997 -10.194599 1.775495 -22.041103 -0.564797 10.512498 7.680701 -0.000000 0.000005 -0.468799 0.730900 -2.316899 20.913107 -0.000002 0.000007 -22.897503 -7.934794 -7.871804 -4.936100 0.000001 0.000002 12.395303 6.820499 -2.351105 10.356101 0.000001 0.000004 +40.176717 84.854026 -94.020376 100.642901 7.703603 26.611898 -5.000100 -2.404600 0.461298 -1.518699 -0.322999 -0.249204 -8.691099 -0.847800 -5.035398 -0.493799 -1.427699 -1.583901 7.824301 -5.048100 0.881998 8.716102 -7.779200 -9.284999 -1.808298 13.756301 9.739498 -83.268007 -68.257282 -84.205709 -0.000001 -0.000002 -54.558509 46.381400 13.569497 -1.353606 -7.525800 -19.139497 10.229597 -90.593997 64.217374 104.879394 0.000000 -0.000010 37.760202 22.617798 -8.732494 0.555101 -21.870303 0.594500 11.583202 7.270401 0.000000 0.000001 -0.425603 0.137199 -2.901505 21.063106 0.000000 0.000006 -23.444498 -6.824597 -7.082801 -3.710902 -0.000000 0.000004 11.691399 6.886398 -2.341803 10.257802 0.000000 0.000002 +39.255967 84.921329 -94.223319 100.658803 7.381996 26.745510 -4.749700 -2.377798 0.600599 -1.354798 -0.205701 -0.253801 -8.810897 -0.600400 -5.181500 -0.542999 -1.427599 -1.611204 7.310698 -5.004801 0.946198 8.052304 -7.800398 -9.121299 -1.699398 13.865701 9.942698 -87.458402 -68.290290 -87.995003 -0.000002 -0.000004 -52.096708 44.185796 13.186903 -1.348005 -8.833698 -18.153703 10.703393 -87.085499 60.663886 103.312192 0.000003 -0.000007 29.756108 14.616099 -6.373702 -0.550801 -21.186102 1.621500 12.036704 6.528101 0.000001 0.000006 -0.325201 -0.333901 -3.214403 21.061206 0.000003 0.000005 -23.571501 -5.815497 -7.164900 -2.837100 0.000001 0.000002 11.188906 6.596299 -1.998500 10.042598 0.000001 0.000002 +38.432499 84.942937 -94.411292 100.689897 7.398796 26.959601 -4.654598 -2.344801 0.506600 -1.272397 -0.291700 -0.244901 -8.757999 -0.536999 -5.165101 -0.627599 -1.411899 -1.586400 6.272003 -4.863601 0.829495 6.767304 -7.972402 -8.973401 -1.401997 14.301899 9.889398 -91.751903 -68.230588 -92.303707 0.000001 -0.000004 -47.940411 37.506296 11.934991 -2.341609 -10.232599 -16.871704 11.139898 -83.352808 57.122882 100.608999 0.000002 -0.000006 23.948402 10.129101 -2.774499 -1.450100 -20.535001 2.377698 12.109902 5.550301 0.000000 0.000003 -0.184900 -0.514501 -3.495299 21.120004 0.000003 0.000007 -23.894797 -5.017598 -6.516001 -2.031200 0.000000 0.000000 11.059806 5.941198 -2.811802 9.914201 0.000001 0.000003 +37.673036 84.957653 -94.592384 100.957609 7.440174 26.853099 -4.612897 -2.161501 0.451500 -1.197297 -0.283001 -0.229899 -8.835899 -0.527599 -4.928202 -0.806200 -1.422399 -1.528998 4.778802 -5.039399 0.866502 5.139201 -8.136697 -9.022697 -1.089598 14.440300 9.686397 -93.800803 -67.380585 -94.940904 -0.000001 -0.000004 -43.103900 30.666994 10.811996 -2.206604 -11.299801 -16.064105 11.764395 -82.558102 59.804574 99.303296 0.000002 -0.000005 21.043202 21.643897 2.580601 -4.767402 -20.175004 3.077899 12.370798 4.577100 -0.000000 -0.000002 -0.045198 -0.619202 -3.725007 21.193305 0.000003 0.000005 -24.174000 -4.426998 -6.357201 -1.681901 0.000001 0.000002 10.924399 5.465600 -2.731202 9.994802 0.000001 0.000003 +37.001717 84.984580 -94.728287 101.240204 7.470576 27.020113 -4.552193 -2.014101 0.507398 -1.053199 -0.183900 -0.233701 -8.962401 -0.343198 -5.018401 -1.088000 -1.414699 -1.533602 2.671500 -5.563000 0.918997 3.344601 -8.299401 -8.907799 -0.888799 13.837702 9.355599 -92.929489 -65.470684 -94.835993 -0.000000 -0.000004 -38.991911 28.891897 10.027392 -0.471112 -11.631794 -16.022803 11.263899 -83.608702 65.085078 99.028592 0.000002 -0.000005 22.470807 22.430000 3.819801 -3.739595 -19.726701 3.826701 12.124499 3.505001 -0.000001 0.000000 0.121797 -0.872402 -3.623600 21.118706 0.000003 0.000005 -24.554903 -3.769698 -6.840303 -1.211001 -0.000001 0.000002 10.649999 5.502099 -2.178802 9.953902 0.000001 0.000006 +36.407103 85.044519 -94.839269 101.498303 7.559089 27.462409 -4.509497 -1.828799 0.447200 -1.030900 -0.164201 -0.242501 -8.849200 -0.266098 -5.435303 -1.372798 -1.417299 -1.601698 -0.155300 -5.935101 0.661897 1.412201 -8.372497 -8.428699 -1.033498 13.141801 9.274097 -90.963497 -62.615583 -93.515598 -0.000001 -0.000003 -35.759906 26.504493 8.643403 0.329995 -11.409700 -16.041503 9.860495 -81.027199 63.657283 95.743003 -0.000003 -0.000006 25.907606 10.821204 1.738603 -1.753804 -19.144902 4.549502 11.350698 2.325399 0.000001 0.000003 -0.012899 -1.079101 -3.268095 21.022006 0.000004 0.000009 -24.958301 -3.043898 -6.644300 -0.788899 -0.000000 0.000001 10.266898 4.004398 -2.653101 9.111999 0.000002 0.000004 +35.818331 85.093797 -94.880430 101.534200 7.711511 27.948896 -4.485696 -1.676700 0.289001 -0.992601 -0.236300 -0.249103 -8.736199 -0.373897 -5.988503 -1.612802 -1.454699 -1.724002 -2.530802 -6.144199 0.267701 0.691801 -8.182499 -8.010501 -1.401401 12.803203 9.579903 -89.244105 -59.002888 -92.337504 -0.000000 -0.000002 -33.372601 22.382798 7.201397 -0.416001 -10.676697 -16.241604 8.515202 -78.339412 59.443882 92.553509 -0.000000 -0.000008 29.578008 7.934898 0.425098 -2.200099 -18.034300 5.169099 10.076104 0.567599 -0.000000 -0.000001 0.052299 -1.312400 -2.602902 20.816603 0.000000 0.000003 -24.830303 -2.521099 -6.488399 -0.990101 -0.000000 0.000002 10.236802 3.401801 -3.244201 8.603800 0.000001 0.000005 +35.164789 85.171768 -94.811586 101.599208 7.883000 28.707203 -4.714599 -1.533900 0.123901 -1.051201 -0.337499 -0.259500 -8.926801 -0.469197 -6.674204 -1.705898 -1.452099 -1.916002 -2.664200 -6.116501 -0.073303 3.084802 -8.177101 -8.074099 -2.135199 12.352000 9.617598 -87.675706 -56.611387 -90.999902 -0.000000 -0.000002 -33.120810 21.066298 6.974997 -0.444004 -9.877402 -16.529901 7.588396 -76.907513 57.203780 90.419404 0.000005 -0.000007 33.644306 9.877001 0.472701 -2.862502 -16.702099 5.846299 8.923002 -1.365400 0.000001 -0.000003 0.067299 -1.641000 -2.307703 20.622607 0.000001 0.000004 -24.394797 -1.913999 -6.038899 -1.703401 -0.000000 0.000003 10.265897 2.636499 -4.284499 8.006104 -0.000000 -0.000002 +34.414981 85.269814 -94.616008 101.614310 8.002397 29.628994 -5.256598 -1.400900 -0.001099 -1.289501 -0.382200 -0.272100 -9.100098 -0.469898 -7.304100 -1.527999 -1.431899 -2.082599 -0.267300 -6.029700 -0.168100 6.786904 -8.330599 -8.605698 -3.004902 12.175502 9.115903 -86.830883 -58.018682 -90.182691 -0.000001 -0.000001 -34.193908 22.650002 6.147696 0.196199 -9.933996 -17.356905 7.723102 -76.116903 58.042185 89.161896 0.000004 -0.000011 37.724603 13.770201 0.374903 -2.926595 -15.111895 6.538497 7.728305 -3.327301 -0.000000 0.000003 -0.217899 -1.764001 -2.156597 20.602504 0.000002 0.000006 -23.542495 -1.224396 -6.282504 -2.836701 -0.000000 0.000003 10.161801 2.055999 -4.908998 7.917103 0.000001 0.000005 +33.591259 85.433400 -94.294709 101.346809 8.171974 30.554002 -5.729300 -1.348099 -0.029697 -1.540097 -0.349800 -0.279102 -9.281802 -0.556698 -7.575398 -1.257101 -1.447199 -2.192303 3.000002 -6.108901 -0.055799 11.346902 -8.428701 -9.524000 -3.050000 12.602202 8.375202 -86.751907 -60.060680 -89.910507 -0.000000 -0.000002 -35.364906 24.206501 6.885597 -0.259206 -8.849600 -18.422201 8.160098 -77.623213 59.238585 89.310403 0.000003 -0.000008 40.928099 16.393199 -1.060502 -1.933198 -13.365201 6.923002 6.806998 -4.758101 0.000000 0.000000 -1.292198 -2.004501 -2.139900 20.629803 0.000002 0.000005 -22.037499 -0.792398 -7.145399 -4.569100 0.000000 0.000000 10.177299 1.647898 -5.130196 7.419601 0.000000 0.000000 +32.703526 85.659460 -93.858070 100.737903 8.494095 31.616391 -6.116601 -1.284001 -0.071398 -1.801299 -0.361000 -0.269103 -9.353101 -0.914598 -7.478998 -0.995000 -1.520298 -2.211601 6.505503 -6.459302 -0.102800 15.987204 -8.427699 -11.468701 -2.695999 13.211502 7.637601 -85.843902 -60.666585 -89.362098 -0.000001 -0.000002 -36.322700 24.575797 8.082096 -0.324409 -8.883001 -19.688507 9.097798 -79.010205 61.449981 90.486401 0.000005 -0.000011 42.864109 18.064004 -3.099698 -1.404904 -11.512799 6.996399 5.942702 -5.591402 0.000000 -0.000001 -3.187703 -2.296101 -2.541199 20.693805 0.000002 0.000006 -20.180498 -0.698197 -8.896499 -6.370400 -0.000000 0.000001 9.930305 1.151898 -4.900101 7.531604 0.000000 0.000002 +31.822400 85.910415 -93.344749 99.768015 8.952182 33.145400 -6.252094 -1.315699 -0.106398 -1.932401 -0.391000 -0.255802 -9.357902 -1.493498 -7.388502 -0.811203 -1.642798 -2.268501 9.005502 -7.052900 -0.146197 18.709303 -8.164596 -13.506697 -2.301298 13.433199 6.870097 -83.398297 -61.452882 -87.808699 -0.000001 -0.000003 -37.279203 23.130097 7.991502 0.440601 -8.036496 -20.135003 9.757305 -80.349718 62.338876 91.409314 0.000007 -0.000010 43.531412 18.636703 -4.997203 -0.917199 -9.683699 6.741098 5.445100 -5.572702 0.000001 -0.000001 -5.866001 -2.518901 -3.678203 21.075505 0.000000 0.000001 -18.435797 -0.778397 -10.784904 -7.450199 0.000001 0.000001 9.397499 0.771999 -5.215298 7.487702 0.000000 0.000002 +31.003253 86.156282 -92.834450 98.839312 9.502491 35.099595 -6.181594 -1.319799 -0.137905 -2.012798 -0.397700 -0.239394 -9.363400 -2.182197 -7.282904 -0.712000 -1.808298 -2.315902 9.892400 -7.647800 -0.234800 18.284902 -8.035401 -14.953599 -1.759298 13.410600 6.104899 -79.967212 -61.749587 -85.622014 -0.000001 -0.000003 -38.827805 22.388901 8.246800 0.507400 -7.112095 -20.367500 10.544201 -81.026802 62.653278 91.758093 0.000003 -0.000011 43.922406 17.195898 -5.972099 -1.146699 -8.682300 6.349197 6.338301 -4.033000 -0.000000 0.000001 -9.270700 -3.214302 -5.964898 20.940902 -0.000002 0.000004 -17.142699 -0.904798 -12.571901 -8.095400 0.000000 0.000000 8.809802 0.617397 -5.766198 7.368801 0.000001 0.000002 +30.304496 86.289131 -92.362007 98.197698 10.019504 37.219207 -6.006798 -1.156703 -0.189298 -1.989600 -0.467299 -0.225101 -9.234699 -2.820398 -7.003601 -0.706800 -2.007998 -2.334799 8.578303 -8.009900 -0.532806 15.351507 -8.201899 -15.771399 -0.852202 13.668302 5.465700 -77.315209 -60.831381 -84.366109 -0.000001 -0.000003 -40.941407 22.424402 9.527994 -0.329911 -6.717599 -20.465504 11.151294 -79.415905 62.683479 90.176897 0.000003 -0.000011 45.388410 11.275802 -4.474802 -2.987805 -8.686099 5.882798 8.379904 -1.400001 -0.000001 -0.000003 -11.948301 -4.471602 -8.020898 21.313505 -0.000001 0.000004 -16.437601 -0.913001 -14.467097 -8.354001 -0.000000 0.000002 8.384995 0.417999 -6.091098 7.340301 -0.000001 -0.000001 +29.663911 86.297755 -91.860111 98.008797 10.321717 39.379096 -5.965696 -0.877199 -0.238503 -1.944001 -0.506300 -0.217802 -8.734599 -3.112499 -6.793798 -0.798698 -2.176598 -2.331901 5.397101 -8.314298 -0.954397 10.955599 -8.434701 -15.791104 0.373001 13.977497 5.358304 -75.568008 -59.948489 -84.201105 -0.000001 -0.000003 -43.531108 21.670703 10.461393 -0.796408 -6.272395 -20.211203 11.083304 -75.591700 62.885380 86.124796 0.000005 -0.000014 49.285709 -1.229199 -0.910500 -1.135600 -8.864799 5.726597 10.255104 -0.745900 0.000000 -0.000005 -9.795200 -7.318701 -6.444701 22.429207 -0.000002 -0.000001 -15.939695 -0.545395 -16.179107 -8.693700 -0.000000 0.000002 8.109200 0.192698 -6.649398 7.127103 0.000000 0.000004 +29.026371 86.280236 -91.369888 98.327495 10.515300 41.338308 -6.057898 -0.579702 -0.228597 -1.969300 -0.505300 -0.201100 -8.210700 -3.187798 -6.806402 -0.994199 -2.250898 -2.339500 1.944901 -8.390300 -1.585304 6.842703 -8.510399 -15.546299 1.657201 14.600899 5.833999 -75.064511 -59.791888 -85.323706 0.000001 -0.000004 -46.776212 21.597595 11.433002 -0.962003 -5.425097 -20.232200 10.344297 -71.071915 64.178886 81.036404 0.000006 -0.000012 57.298505 -11.541701 -1.898602 -1.197010 -9.370098 6.264598 13.187102 -2.793699 0.000000 -0.000002 -3.282101 -6.993501 -3.795296 22.338204 0.000004 0.000008 -15.658099 0.125702 -17.783999 -9.216301 0.000001 0.000003 7.847399 0.196698 -7.075001 7.137301 0.000000 0.000003 +28.394927 86.284549 -90.842333 98.727803 10.801814 43.113597 -6.145200 -0.642199 -0.160403 -2.027398 -0.503600 -0.191698 -8.056201 -3.083499 -7.043200 -1.192799 -2.203498 -2.386598 0.017001 -8.167001 -2.233798 6.275103 -8.363998 -15.691200 2.736501 15.749299 6.289303 -75.911812 -60.505181 -87.756911 -0.000004 -0.000005 -50.316907 22.616300 12.954697 -1.442006 -4.376098 -21.114200 9.788695 -65.997121 69.178588 75.239215 0.000010 -0.000016 68.200907 -13.219593 -8.225397 -2.597101 -10.338901 7.133798 15.377499 -5.782901 0.000001 0.000000 -0.489203 -4.653700 -0.064600 21.457205 0.000000 0.000003 -15.746700 0.726303 -19.425101 -9.181100 0.000001 0.000002 7.386198 0.188198 -7.108702 7.188901 0.000001 0.000002 +27.801329 86.294191 -90.187015 98.906810 11.088400 44.749799 -6.148100 -0.807701 -0.191401 -2.075099 -0.585800 -0.181100 -8.082102 -3.106198 -7.257399 -1.229501 -2.114199 -2.444200 -0.035500 -7.775501 -2.929998 7.060101 -8.426800 -16.655394 3.499501 16.986198 5.789401 -77.129516 -61.920079 -90.078219 -0.000001 -0.000002 -54.191308 24.563904 15.337196 -2.280802 -2.662804 -21.854697 9.528792 -54.264543 77.081393 63.045136 0.000009 -0.000014 79.921505 -10.908294 -17.315897 -2.164904 -11.311398 7.923497 15.305799 -9.556802 0.000000 0.000000 -0.121000 -2.985098 5.795603 21.645004 -0.000001 0.000003 -15.655894 1.089500 -20.386302 -9.049301 0.000000 0.000000 6.987400 0.302598 -7.586798 6.965303 -0.000001 0.000001 +27.253197 86.306650 -89.389466 98.982320 11.282992 46.469397 -6.151899 -0.866598 -0.242701 -2.131299 -0.690300 -0.176898 -7.923001 -3.297996 -7.656805 -1.105900 -2.062499 -2.574097 0.582499 -7.254199 -3.659298 7.254602 -8.658199 -17.807495 4.130702 18.004600 4.599104 -77.979507 -63.003786 -91.756409 -0.000001 -0.000002 -57.285401 27.011103 17.769299 -3.046305 -0.218000 -22.519698 9.883994 -1.465716 84.009798 11.170914 0.000018 -0.000019 89.922903 -6.841800 -24.238001 -1.116708 -12.241296 8.845500 14.653201 -13.905202 0.000002 0.000000 0.948398 -1.629197 10.023498 21.647508 -0.000001 0.000004 -15.418800 1.426105 -21.092704 -8.771201 0.000001 -0.000002 6.478299 0.241397 -8.446305 7.096600 0.000002 0.000005 +26.768565 86.311979 -88.443554 98.891016 11.484900 48.285192 -5.999997 -0.976099 -0.298403 -2.100801 -0.804499 -0.180102 -7.770300 -3.575999 -8.043394 -0.983501 -2.052798 -2.709702 0.949901 -6.720600 -4.437401 6.533502 -8.719400 -18.815097 5.132700 18.803097 3.076600 -78.560210 -63.419986 -93.429711 -0.000001 -0.000003 -58.306306 28.057499 18.794088 -3.797705 3.077303 -23.211400 11.096703 71.485171 78.713206 -59.819183 0.000015 -0.000015 96.572598 -0.989397 -35.553803 7.413498 -13.486500 9.664400 14.241603 -17.581703 0.000001 0.000001 1.741200 -0.814496 12.206799 21.695104 0.000001 0.000003 -15.061496 1.505704 -21.877807 -8.473201 -0.000000 0.000001 5.997005 0.333397 -9.267699 6.768205 -0.000001 0.000004 +26.321779 86.301049 -87.326975 98.701392 11.670126 50.309992 -5.767798 -1.074102 -0.363901 -2.050499 -0.888700 -0.181401 -7.608000 -3.925199 -8.312097 -0.890300 -2.060999 -2.833997 0.857099 -6.261700 -5.348501 5.083203 -8.680798 -20.123697 6.353603 19.181797 1.590800 -78.467998 -62.634189 -94.765700 -0.000003 -0.000004 -57.768306 26.700000 19.138597 -4.357407 7.009202 -23.786503 12.355094 86.669809 69.862911 -72.626814 0.000018 -0.000017 101.203302 3.495398 -47.377295 14.133187 -15.056000 10.530799 14.308099 -20.150404 0.000001 -0.000001 2.160701 -0.428797 13.020402 21.811601 -0.000003 0.000004 -14.729898 1.483901 -22.963306 -7.883901 0.000001 -0.000002 5.406900 0.355195 -10.090599 6.808202 0.000000 0.000002 +25.900901 86.259406 -86.035388 98.511997 11.910700 52.803311 -5.665996 -1.101101 -0.427202 -2.062700 -0.958801 -0.184797 -7.399901 -4.313797 -8.662600 -0.816200 -2.104798 -3.006300 0.459802 -5.770697 -6.269599 3.255303 -8.603099 -21.571802 7.491501 19.479302 0.359404 -78.503490 -61.077084 -96.567495 -0.000002 -0.000005 -56.172606 24.298598 18.881295 -4.389405 11.014405 -24.429900 13.589604 88.663899 64.165902 -72.825103 0.000018 -0.000013 104.040993 11.743208 -58.521798 24.920590 -16.761802 11.617103 14.727802 -21.815102 0.000002 -0.000001 2.339899 -0.201897 13.340200 21.797403 -0.000001 0.000004 -14.416899 1.404004 -23.989606 -7.407700 0.000001 0.000001 4.888103 0.456595 -11.365401 6.531400 -0.000000 -0.000001 +25.510503 86.175845 -84.533986 98.188101 12.174107 55.857308 -5.606804 -1.105499 -0.517800 -2.095399 -1.061200 -0.190204 -7.214799 -4.779497 -9.202596 -0.776997 -2.153698 -3.182295 -0.249395 -5.130298 -7.417200 1.665001 -8.623798 -22.910503 8.632506 19.889800 -0.883998 -79.462999 -59.525685 -99.015099 -0.000001 -0.000004 -54.169008 21.822799 18.056089 -4.659904 13.768504 -25.397397 14.337297 83.690814 62.279310 -66.868024 0.000018 -0.000011 106.104701 17.576307 -62.060700 36.340693 -18.370702 12.914798 15.520705 -22.593902 0.000002 -0.000001 2.193499 -0.097096 13.669402 21.845404 -0.000001 0.000003 -13.996296 1.116501 -25.363199 -7.106701 0.000000 0.000000 4.486900 0.713096 -12.772802 6.265404 -0.000001 0.000000 +25.149315 86.062304 -82.858605 97.897611 12.404201 59.454198 -5.568096 -1.066101 -0.630999 -2.128700 -1.202200 -0.201704 -7.167098 -5.222099 -10.090296 -0.795198 -2.161197 -3.424702 -1.069601 -4.441800 -8.574202 0.295404 -8.666999 -23.986999 9.490601 20.114698 -1.978296 -80.697892 -58.373486 -100.975092 -0.000002 -0.000001 -53.090511 18.633799 17.415693 -4.125206 15.061302 -26.351799 14.705799 75.950911 60.877007 -58.847822 0.000019 -0.000012 108.316200 -4.287095 -60.779502 23.612596 -19.786505 14.707794 17.198199 -22.733499 0.000000 -0.000001 1.958198 0.118303 14.224103 21.661407 0.000002 0.000004 -13.583598 0.818403 -26.802005 -6.884001 -0.000000 0.000002 3.992299 1.092794 -14.648400 6.117803 -0.000001 0.000000 +24.753326 85.941131 -80.976714 97.583706 12.532906 63.452188 -5.473998 -1.054699 -0.700901 -2.104299 -1.347400 -0.224000 -7.440002 -5.520997 -11.204102 -0.877199 -2.181597 -3.722599 -1.752300 -3.987697 -9.608602 -0.806798 -8.364802 -24.984700 9.706303 20.039300 -2.468199 -81.296601 -57.161078 -101.952302 -0.000001 -0.000002 -53.061510 16.739003 17.289902 -3.649609 15.457805 -26.866500 14.597900 68.781398 59.194215 -51.703407 0.000020 -0.000013 109.882403 -23.110103 -61.770301 10.141986 -20.703200 16.873097 19.264899 -22.476804 0.000005 -0.000002 1.661697 0.551405 15.264604 21.408403 -0.000001 0.000002 -13.018196 0.400203 -28.384808 -6.855402 0.000001 0.000002 3.389199 1.630394 -16.776402 6.036300 0.000000 0.000002 +24.276312 85.768922 -78.859885 96.960303 12.637706 67.820502 -5.499794 -1.183101 -0.799399 -2.133298 -1.564901 -0.241303 -7.707001 -5.871394 -12.123006 -0.940299 -2.211497 -3.997997 -2.249497 -3.475996 -10.682103 -1.558697 -7.925699 -26.288499 9.689305 20.063497 -2.507103 -82.118389 -55.733788 -102.720292 -0.000001 -0.000001 -53.519610 16.775100 16.978192 -3.581508 15.303506 -27.133200 13.627797 66.125915 56.369209 -49.482515 0.000021 -0.000013 110.107103 -17.780692 -64.726207 13.132092 -20.876900 18.988899 21.301801 -21.876205 -0.000000 -0.000002 1.200498 1.272905 16.481403 21.545603 0.000002 0.000002 -12.413997 -0.421401 -30.278298 -6.791801 -0.000000 0.000001 3.023801 2.146494 -18.814802 6.390301 0.000000 0.000001 +23.753580 85.493075 -76.579222 96.318103 12.727301 72.434107 -5.739397 -1.215501 -0.907000 -2.293900 -1.785501 -0.241604 -7.827400 -6.324995 -12.752504 -0.968600 -2.225795 -4.207898 -2.684101 -2.826998 -11.854402 -1.308799 -7.659699 -27.989600 9.523401 20.135098 -2.394702 -83.140007 -54.513485 -103.115605 -0.000001 -0.000002 -54.370707 16.061401 16.561199 -3.474607 14.385800 -27.071903 11.786393 66.566402 52.211209 -50.503704 0.000023 -0.000011 110.260994 -14.503985 -65.291309 14.815001 -20.510200 21.234899 23.582999 -20.968500 -0.000001 -0.000003 1.065200 1.801302 17.400302 21.656704 0.000000 0.000001 -12.102897 -1.299101 -31.881305 -6.494101 0.000000 -0.000001 2.989000 2.631895 -21.317000 6.841203 0.000000 0.000001 +23.227292 85.178395 -74.154030 95.935522 12.657205 77.037591 -5.991896 -1.095700 -0.936002 -2.461100 -1.916199 -0.244901 -7.975097 -6.526096 -13.308102 -0.994798 -2.217697 -4.356202 -2.729097 -2.486697 -12.833703 -0.134898 -7.662100 -29.583203 8.681006 19.675099 -1.854108 -83.116897 -53.620987 -102.252698 -0.000002 -0.000000 -55.148706 15.748101 16.473993 -3.433704 13.461702 -26.601001 9.803193 66.609707 48.158712 -51.702409 0.000025 -0.000010 110.299393 -12.287604 -66.076496 16.981081 -19.644800 23.493898 26.079703 -19.677801 0.000000 -0.000004 1.394900 3.065504 18.616103 21.841106 0.000000 0.000003 -11.910396 -2.090497 -33.356205 -6.153501 0.000000 -0.000002 2.886501 3.425892 -23.904705 7.176901 -0.000000 -0.000001 +22.706592 84.862147 -71.503035 95.620088 12.339294 81.343013 -6.135192 -1.022600 -0.865702 -2.595399 -1.915699 -0.257201 -8.089199 -6.405496 -13.708601 -0.954700 -2.214796 -4.430601 -2.160497 -2.523296 -13.334805 1.404703 -7.997202 -30.607302 7.333303 18.896798 -0.940401 -82.727292 -53.170488 -100.699996 -0.000001 -0.000003 -55.053507 16.656000 16.331994 -3.693906 12.223404 -26.084198 8.055394 66.042505 44.786209 -53.095312 0.000014 -0.000014 110.651202 -10.085988 -67.253912 18.937596 -18.173501 25.081999 28.705200 -18.091798 0.000003 0.000000 2.062102 4.212207 20.989403 21.853301 -0.000000 0.000002 -11.616995 -3.045796 -34.645802 -5.804601 0.000000 -0.000002 3.342894 4.413993 -26.272002 7.718701 0.000000 0.000000 +22.229834 84.571835 -68.654163 95.406119 12.007109 85.342296 -6.273000 -0.874500 -0.847000 -2.758398 -1.877899 -0.261200 -8.094301 -6.195495 -13.811001 -0.876902 -2.228897 -4.410003 -1.183798 -2.742796 -13.292398 2.985804 -8.097099 -30.551100 6.025405 18.362000 -0.056203 -82.994695 -53.574893 -99.230193 -0.000001 -0.000002 -53.701106 17.883801 15.587097 -3.652606 10.148603 -25.549104 6.493893 65.221002 42.222404 -54.957107 0.000020 -0.000013 111.244398 -9.247106 -67.798904 19.094184 -16.450903 25.801598 31.505502 -16.437400 0.000002 -0.000002 2.332393 5.155804 23.625605 22.052403 -0.000000 0.000004 -11.677398 -3.873501 -35.138605 -4.984900 -0.000000 0.000003 4.720503 4.407391 -28.935197 8.385602 0.000000 0.000001 +21.825212 84.275409 -65.510913 95.011298 11.782889 88.914805 -6.450402 -0.851301 -0.804900 -2.888102 -1.849100 -0.261101 -7.981000 -5.929997 -13.712103 -0.781399 -2.199695 -4.328004 -0.159498 -3.160897 -12.390299 4.659103 -8.016700 -28.672105 4.706101 17.855100 0.887596 -83.323901 -54.714486 -97.635497 -0.000001 -0.000006 -50.882703 17.653502 14.846997 -3.228806 7.828103 -25.083500 5.045996 64.239199 41.325501 -57.068106 0.000021 -0.000011 111.306402 -6.511708 -67.503598 21.265671 -14.725109 25.048998 33.922711 -15.047002 0.000001 -0.000003 2.612798 6.550304 26.065399 22.245708 -0.000001 0.000002 -12.355098 -4.976498 -35.310702 -3.488700 -0.000001 0.000000 6.144101 3.927492 -31.850402 8.905802 0.000000 0.000002 +21.510252 83.961465 -61.995304 94.094807 11.677701 91.998110 -6.569800 -1.271101 -0.606401 -3.019998 -1.741800 -0.254601 -7.846801 -5.646794 -13.547002 -0.675298 -2.131997 -4.216900 0.718598 -3.913700 -10.189203 6.494301 -7.463197 -23.738901 3.450301 17.119995 1.936298 -82.991300 -56.249686 -95.427702 -0.000001 -0.000003 -46.543405 16.835100 13.962697 -2.827409 5.698501 -24.909303 3.736296 62.923595 42.813508 -59.479394 0.000020 -0.000013 110.677499 -2.141381 -66.552105 24.564100 -13.329900 22.298599 35.129102 -13.823098 0.000002 0.000000 2.468995 8.058104 27.202298 22.606309 -0.000000 0.000002 -13.682295 -6.771700 -35.643104 -1.313400 -0.000001 -0.000007 7.197096 3.443090 -34.040800 9.640902 0.000002 0.000006 +21.327623 83.694514 -58.163706 92.250112 12.023605 94.541413 -6.821094 -2.643801 -0.096701 -3.245001 -1.488401 -0.207001 -7.947799 -5.479495 -13.270301 -0.629698 -1.950597 -4.060400 1.310300 -4.230199 -7.082299 8.131204 -6.943397 -16.228902 2.311602 16.046801 2.703398 -81.573003 -58.650489 -92.350902 0.000000 -0.000001 -41.079203 15.564896 12.944390 -1.921003 3.920204 -24.559397 2.329797 61.079902 46.432809 -61.479902 0.000019 -0.000013 109.182999 -2.578790 -64.483108 21.576003 -13.061603 18.435898 31.616003 -13.520901 0.000002 0.000000 2.427593 5.615505 24.943100 23.864503 0.000001 0.000004 -15.783498 -9.728801 -35.924301 0.681400 -0.000000 -0.000003 8.609600 2.430190 -35.410205 11.021302 0.000002 0.000003 +21.065749 83.515182 -53.977791 89.132391 12.022810 96.844326 -6.840594 -4.635099 0.110599 -3.284502 -1.602499 -0.152401 -8.509801 -5.766396 -12.589001 -0.664498 -1.677399 -3.822099 1.751098 -4.139799 -3.170102 9.011900 -5.661800 -6.555098 1.456700 14.827800 3.065098 -78.569509 -62.146477 -88.133407 -0.000004 -0.000003 -34.724907 13.591494 12.555391 -1.106304 1.794302 -23.796193 0.921297 59.500104 51.306005 -63.117710 0.000019 -0.000014 106.447802 -5.365600 -61.183206 16.125387 -12.513203 13.540099 27.132204 -13.921202 0.000000 -0.000002 1.618293 0.433006 25.005200 21.520005 -0.000001 0.000001 -17.391797 -14.495801 -36.569402 1.416701 -0.000001 0.000002 11.100103 1.257183 -34.688405 11.362400 -0.000000 -0.000001 +20.679669 83.397080 -49.736751 85.758800 11.030619 98.286520 -6.281496 -6.206400 -0.014201 -2.932501 -2.051800 -0.107401 -9.019901 -6.800895 -11.361903 -0.746297 -1.516300 -3.516201 1.664500 -4.223003 1.509500 8.586201 -4.046097 4.100601 0.731002 13.902699 3.769198 -73.566310 -65.725282 -82.071112 0.000002 -0.000003 -28.594606 11.973698 12.453593 0.511692 0.137603 -23.172600 -0.151205 57.470998 58.508205 -64.002302 0.000016 -0.000013 101.162403 -3.942798 -58.413405 15.794689 -10.592703 8.193500 26.857205 -16.850700 -0.000001 0.000003 4.686494 1.043909 24.053201 20.491708 -0.000001 0.000002 -16.871698 -20.638296 -34.357307 -0.482600 -0.000001 -0.000002 15.460000 0.175688 -32.757896 9.536400 0.000001 0.000002 +20.404587 83.391238 -45.857917 84.208789 10.272218 99.251013 -6.035796 -6.578699 0.047199 -2.680200 -2.120500 -0.083301 -8.747800 -7.206598 -10.500902 -0.937802 -1.574697 -3.334599 0.492102 -5.419200 6.350498 7.451701 -3.109199 13.511400 -0.321096 12.610298 5.118698 -64.376406 -69.577695 -72.213009 0.000002 -0.000003 -23.110109 10.849499 12.600900 1.903699 -1.741697 -23.411599 -0.510406 57.902995 65.982906 -65.746503 0.000016 -0.000015 93.120900 -4.107797 -53.655206 15.502494 -9.787601 4.333398 28.327106 -18.079803 0.000001 0.000000 6.987198 2.792607 22.179504 20.028206 -0.000001 0.000005 -15.138199 -24.590097 -28.765903 -3.645999 -0.000002 0.000000 17.636501 -3.926211 -29.496001 9.458304 -0.000000 -0.000003 +20.338545 83.695017 -42.352714 84.300796 10.805925 101.123915 -6.702697 -6.144100 0.090098 -2.797698 -1.907399 -0.116103 -8.425801 -6.355897 -10.451302 -1.241799 -1.675201 -3.295701 -1.059502 -7.513302 10.511297 6.155399 -1.968105 21.068099 -0.913601 11.429502 6.622900 -50.572044 -73.262991 -58.058140 -0.000001 0.000000 -17.963107 8.289198 13.957996 1.812100 -2.623097 -24.160199 -0.378504 57.079957 74.123307 -64.925562 0.000011 -0.000011 81.198901 -4.427305 -49.550406 13.634189 -10.774998 1.879199 26.288503 -17.204304 0.000002 -0.000003 8.065499 4.350809 22.988198 20.394303 -0.000001 0.000005 -14.002997 -25.164599 -21.439902 -8.445102 0.000001 -0.000001 15.246806 -4.583612 -25.970601 9.206298 -0.000001 0.000003 +20.294351 84.126067 -39.324275 85.202915 11.420247 104.159800 -7.536998 -5.507799 -0.045401 -2.953401 -1.769500 -0.149102 -8.260700 -5.077195 -10.567002 -1.506501 -1.570698 -3.232700 -2.416404 -8.628704 12.581199 4.940600 -0.671799 25.397203 -0.927299 11.811700 7.524199 -35.449347 -76.270201 -42.956346 -0.000000 -0.000001 -13.867203 3.509001 17.372999 2.527997 -4.149998 -23.921698 0.003696 55.709909 79.487213 -61.750214 0.000006 -0.000014 66.293099 -0.712906 -43.214204 16.990489 -11.800603 0.773300 22.150199 -15.789603 0.000001 0.000000 8.219698 5.268208 24.633298 20.676207 -0.000001 0.000000 -12.686603 -22.901399 -15.439001 -14.298402 0.000001 -0.000001 13.782598 -1.754409 -21.016696 11.093603 -0.000001 -0.000001 +20.320003 84.599013 -36.613333 86.316099 12.015423 107.349310 -8.321095 -4.779499 -0.180502 -3.185400 -1.634701 -0.162899 -8.044100 -4.066497 -10.305100 -1.654400 -1.392599 -3.102700 -3.389899 -8.663405 12.959197 4.586699 -0.106101 26.379599 -0.522398 12.923801 7.853599 -17.103450 -78.230199 -24.314352 0.000001 -0.000001 -12.033503 0.095604 20.811698 4.401993 -5.669896 -22.719599 0.449395 43.927147 83.479012 -47.692452 0.000007 -0.000011 51.504810 0.822897 -37.508401 16.778991 -13.667997 0.469898 20.686401 -12.945204 0.000002 -0.000003 8.153897 5.390607 23.454201 20.965302 0.000002 0.000003 -10.745198 -19.186200 -11.474002 -20.678502 0.000000 -0.000001 14.885600 -0.101107 -15.272100 10.867704 0.000001 0.000001 +20.384011 85.003124 -34.132007 87.333208 12.118621 111.172708 -8.865203 -4.080900 -0.306702 -3.339600 -1.582400 -0.183200 -7.688003 -3.219198 -10.467900 -1.697801 -1.263497 -3.041301 -3.766401 -8.038503 12.280499 4.725999 -0.096202 25.258302 -0.532399 13.987300 7.857699 -0.306347 -78.043602 -7.369948 -0.000001 -0.000001 -12.021003 2.257097 21.565204 4.651003 -6.781899 -21.521799 0.643096 14.263113 86.421805 -15.967417 0.000002 -0.000010 38.292397 0.586600 -28.924597 13.365097 -15.001404 0.731898 21.833101 -10.331100 0.000001 -0.000002 8.136899 5.317307 18.974199 20.871806 0.000000 0.000003 -8.220503 -14.941399 -10.040102 -26.259905 0.000000 -0.000003 14.674901 2.141893 -11.928301 9.602902 -0.000001 0.000001 +20.436081 85.270581 -31.703259 88.065808 11.631924 116.064917 -9.115896 -3.558500 -0.487802 -3.329900 -1.588299 -0.227598 -7.413901 -2.438096 -11.304802 -1.645998 -1.129699 -3.135701 -3.618103 -6.859004 10.929198 5.095598 -0.398599 23.224103 -0.316600 14.854197 7.510201 5.105563 -76.699305 -1.764037 0.000001 0.000001 -12.603803 6.009400 19.589695 3.399803 -7.918596 -20.153202 0.593995 5.064064 87.765902 -5.398766 -0.000000 -0.000010 28.274507 -2.869199 -21.112404 10.261396 -15.060702 0.953997 20.113400 -9.057901 0.000000 -0.000002 8.330298 5.163403 16.026603 20.226307 -0.000002 0.000001 -5.683601 -10.851702 -10.415602 -29.876402 0.000001 -0.000002 13.352107 5.056499 -11.418901 9.210003 -0.000001 0.000001 +20.528791 85.418158 -29.298387 88.598401 11.021819 121.460412 -9.228098 -2.960700 -0.698903 -3.329699 -1.601501 -0.276796 -7.154700 -1.836298 -12.401402 -1.533801 -1.058799 -3.314702 -3.362499 -5.862501 9.430899 5.425399 -0.811000 20.745201 -0.101199 15.546198 6.936001 3.029562 -75.275304 -3.867838 0.000001 -0.000000 -13.719303 7.858503 17.023798 2.547096 -8.899499 -18.800795 0.578498 41.057125 88.496311 -40.719328 -0.000002 -0.000003 21.258501 0.602203 -12.549897 4.496195 -14.762803 1.108700 16.489001 -8.486600 0.000001 -0.000007 8.551902 5.914604 14.285799 19.856910 -0.000002 0.000001 -2.907601 -6.991099 -11.168497 -32.368004 0.000003 -0.000001 14.265003 5.686695 -13.576101 10.339501 0.000001 0.000003 +20.658077 85.406474 -26.868115 88.937086 10.590511 126.352918 -9.432699 -2.269000 -0.794500 -3.354798 -1.547200 -0.312403 -6.839498 -1.416397 -13.253801 -1.411199 -1.028797 -3.456999 -3.114698 -5.361803 7.901299 5.334703 -1.402099 17.844100 0.243802 15.960294 6.414397 -3.375727 -73.985801 -10.405427 0.000001 -0.000000 -15.185606 8.329008 15.804496 1.935793 -9.833597 -18.320599 0.305697 91.817687 89.265412 -91.792591 0.000001 -0.000005 18.121204 -0.165307 -5.441708 1.336497 -15.055399 0.978601 12.902998 -7.702399 -0.000000 0.000001 8.905404 6.855203 12.834601 20.260103 -0.000000 0.000005 0.265401 -3.361900 -10.998604 -33.920502 0.000003 -0.000001 15.665297 4.564994 -18.281602 9.650602 0.000000 0.000002 +20.774914 85.295743 -24.287226 88.669185 10.119700 130.920214 -9.659199 -1.898499 -0.822005 -3.352498 -1.467800 -0.345303 -6.826899 -1.050796 -13.978299 -1.376101 -1.056998 -3.592899 -2.838000 -5.151701 6.533000 5.364699 -1.959700 15.062199 0.787504 16.324700 6.131599 -6.206432 -73.573103 -13.911433 0.000000 0.000001 -16.468404 8.753202 15.355093 1.166902 -10.562902 -18.198996 -0.105806 -123.144175 88.517787 122.538977 0.000001 -0.000005 18.027506 -4.661097 -2.754902 1.368902 -16.247904 0.276300 10.802104 -6.274301 0.000000 -0.000003 9.086899 7.091904 10.437100 20.053401 0.000001 0.000005 3.286902 -0.807999 -10.212399 -34.130107 0.000002 -0.000002 14.226902 3.075292 -23.619207 9.450804 0.000000 0.000002 +20.927314 85.139522 -21.697942 88.365888 9.498425 135.768525 -9.693198 -1.511501 -0.894903 -3.263700 -1.459699 -0.390298 -7.014998 -0.712294 -15.037200 -1.410700 -1.115397 -3.825200 -2.853199 -4.980402 5.382400 5.617801 -2.457001 12.888899 1.120404 16.512100 5.947402 -5.453127 -73.782903 -14.170126 0.000001 -0.000001 -17.909403 9.793797 15.104303 0.905104 -10.903898 -17.926597 -0.312905 -102.649275 84.845891 101.606068 -0.000001 -0.000003 19.030401 -3.602403 -2.775499 1.855692 -17.732499 -0.200401 9.823401 -4.504100 0.000000 -0.000001 9.132694 7.297901 6.446095 20.536803 -0.000002 0.000000 6.287705 1.077199 -10.031897 -33.178002 0.000001 0.000002 13.187596 3.076293 -27.070605 10.548102 0.000000 0.000001 +21.062950 84.955880 -19.095463 88.161192 8.749119 140.614118 -9.677596 -1.096100 -0.958605 -3.136999 -1.459498 -0.439903 -7.118701 -0.399296 -16.240100 -1.414602 -1.148097 -4.102198 -3.005503 -4.928003 4.321198 5.516299 -2.787400 11.056405 1.490703 16.555500 5.614096 -5.692366 -74.347007 -15.033667 -0.000001 -0.000002 -19.516306 10.919399 15.058700 0.935398 -10.717702 -17.880901 -0.473207 -98.388204 81.034785 96.778897 0.000001 -0.000004 21.126402 -2.142799 -3.213696 2.088200 -18.908201 -0.487599 8.407597 -3.370401 -0.000000 0.000001 9.202999 6.797003 2.928001 20.592004 -0.000002 0.000003 9.417607 2.465397 -9.348004 -31.612807 0.000004 -0.000002 13.630302 2.220492 -26.916605 10.423403 0.000000 0.000000 +21.253450 84.763595 -16.405093 87.937585 8.071693 145.088817 -9.650799 -0.741299 -0.934297 -3.083100 -1.393100 -0.477104 -7.181598 -0.050596 -17.200194 -1.424199 -1.129898 -4.305798 -3.072901 -4.856602 3.325096 5.301899 -3.194000 9.426401 1.726602 16.372899 5.153398 -7.395146 -75.263397 -17.306647 0.000000 -0.000002 -20.928104 12.097998 14.903797 0.212896 -10.386198 -18.134396 -0.672502 -96.235686 78.135782 94.260280 0.000003 0.000000 23.693902 -0.691096 -2.899100 2.331401 -20.141901 -0.769299 6.341903 -2.652801 -0.000001 0.000002 8.901696 6.225801 0.806498 20.358204 0.000000 0.000004 12.149901 3.585500 -7.427999 -28.906300 -0.000002 0.000006 12.407100 2.694789 -25.763801 9.617303 0.000000 0.000001 +21.546058 84.496897 -13.690087 87.880387 7.430599 149.353711 -9.568798 -0.408301 -0.980404 -2.954699 -1.321999 -0.510100 -7.223698 0.324905 -17.821103 -1.446700 -1.051398 -4.435199 -3.090800 -4.633003 2.513099 5.299201 -3.601697 8.048999 1.968903 16.379297 4.521495 -12.506542 -76.514100 -22.783443 -0.000002 0.000001 -22.111003 12.479400 14.811298 -0.153005 -10.199498 -18.750500 -0.608702 -95.317890 76.552680 93.257390 0.000003 -0.000001 26.211708 1.470901 -2.411304 2.588107 -21.371305 -0.699601 5.187698 -2.196800 -0.000001 0.000001 9.200702 8.889600 -2.735602 21.733903 -0.000003 0.000004 14.137602 4.481797 -4.817903 -24.551103 0.000002 -0.000003 11.953400 6.045093 -24.503705 10.216103 -0.000001 0.000004 +21.908770 84.217253 -10.879323 87.879183 6.861320 153.373213 -9.514602 -0.062402 -1.003999 -2.840602 -1.235700 -0.535200 -7.318598 0.757906 -18.196300 -1.402596 -0.938898 -4.501499 -2.656903 -4.348902 1.869099 5.269501 -3.988800 6.831902 2.034899 16.314398 3.956600 -23.622443 -77.115599 -34.209144 0.000005 -0.000003 -23.105111 12.293998 14.538693 -0.567103 -9.926799 -19.129395 -0.549903 -93.287496 76.061391 91.239284 0.000001 -0.000005 28.558804 3.400397 -2.698503 2.706699 -22.758904 -0.475201 4.234399 -1.711602 0.000000 -0.000001 9.106898 8.656197 -5.431002 22.258707 -0.000001 0.000000 15.465100 4.912998 -2.920998 -19.296801 0.000002 -0.000002 12.221500 6.228689 -22.616408 10.695800 -0.000000 0.000003 +22.375622 83.896459 -7.933687 88.041977 6.254403 157.200716 -9.298697 0.207500 -1.028201 -2.699398 -1.183300 -0.557001 -7.407200 1.245906 -18.423796 -1.336199 -0.778199 -4.511599 -2.014501 -3.922799 1.349198 5.263100 -4.515600 5.920003 1.939405 16.134801 3.445294 -37.318659 -76.758991 -48.037662 0.000003 -0.000003 -23.972912 11.391302 13.995196 -0.742104 -9.519898 -19.155696 -0.401904 -89.824504 76.454184 87.875393 0.000002 -0.000007 30.390500 5.541501 -3.694203 2.929496 -23.968501 -0.058798 3.446098 -1.577199 -0.000000 0.000002 8.793904 8.362900 -7.920105 24.566399 0.000002 0.000005 16.183206 5.037698 -0.774700 -13.192901 0.000002 -0.000003 11.394199 5.926690 -22.083905 10.138602 0.000001 0.000000 +22.942547 83.514438 -4.797295 88.260889 5.679412 160.804917 -9.023996 0.456300 -1.056798 -2.505400 -1.138700 -0.574302 -7.461098 1.721204 -18.506299 -1.243097 -0.625498 -4.477702 -1.206900 -3.543300 0.905801 5.214900 -4.779701 5.097901 1.835503 16.078400 2.997399 -50.609226 -75.829997 -61.140931 0.000005 -0.000002 -24.570007 9.847601 13.173696 -0.717198 -9.044695 -19.091803 -0.134298 -85.384010 77.121281 83.621206 0.000002 -0.000006 31.437407 7.002402 -5.272904 3.381800 -25.056199 0.491702 2.665000 -2.000998 -0.000000 0.000001 8.594106 8.056995 -10.099305 25.877398 -0.000001 0.000004 16.373206 4.846300 0.972204 -7.554602 0.000001 0.000000 10.201402 6.178195 -21.665801 10.831903 0.000003 -0.000001 +23.680925 83.065607 -1.407917 88.450082 5.512790 164.099210 -8.713293 0.927301 -1.021701 -2.305800 -1.000200 -0.578401 -7.529800 2.170906 -18.339502 -1.124204 -0.487800 -4.399102 -0.292504 -3.220502 0.530591 5.209702 -5.002196 4.237502 1.753000 16.028196 2.666399 -62.087235 -74.448990 -72.164737 -0.000003 -0.000003 -24.862208 8.596803 11.760600 -0.557298 -8.413898 -19.157901 0.288995 -81.249901 77.768884 79.574597 0.000004 -0.000007 31.725098 8.995704 -7.052296 4.045201 -26.215401 1.452002 1.705499 -3.094504 -0.000001 0.000003 8.491102 8.072696 -11.394203 26.950301 0.000002 0.000004 16.303401 4.951200 1.831103 -4.476702 0.000000 -0.000001 10.549001 5.913394 -20.059602 11.737704 0.000001 0.000002 +24.619455 82.635585 2.186945 88.857494 6.134119 166.836631 -8.261100 1.958799 -0.747302 -1.930001 -0.736300 -0.567500 -7.793099 2.734005 -17.839802 -0.984100 -0.374198 -4.222103 0.922402 -2.960399 0.256797 5.118401 -5.369998 3.317904 1.533103 15.570700 2.669400 -70.388529 -72.327384 -79.999227 0.000003 -0.000003 -24.876104 8.812296 10.509494 -0.425210 -8.006393 -18.847595 0.763896 -74.950733 78.372185 73.573531 0.000003 -0.000007 31.559002 10.382200 -8.725704 4.385101 -27.049308 3.255402 1.089098 -5.134099 0.000000 -0.000002 8.386803 8.188795 -12.457703 28.795302 0.000000 0.000003 16.640598 6.115798 3.054801 -5.812000 0.000001 0.000000 5.668300 2.826495 -16.086205 8.491201 -0.000001 -0.000002 +25.699463 82.192609 6.014982 89.314885 6.815419 169.408414 -7.639596 2.876500 -0.562201 -1.457200 -0.438099 -0.562202 -7.966898 3.398105 -17.213996 -0.845500 -0.278298 -4.013499 2.143001 -3.018699 0.269101 5.099201 -5.666000 2.452400 1.150504 14.958100 3.119100 -76.620903 -70.214284 -85.478906 -0.000002 0.000001 -24.696110 8.499996 9.694798 -0.094104 -7.744494 -18.327399 1.334396 -67.429347 78.841284 66.702942 0.000001 -0.000006 30.400708 10.895311 -9.089001 4.381897 -27.001605 5.316502 0.448697 -8.710301 0.000000 -0.000003 7.776901 8.102794 -13.617005 30.576308 0.000001 0.000007 18.026798 7.447998 6.444301 -11.925000 0.000001 -0.000001 0.017302 0.841995 -17.141200 10.824002 -0.000001 0.000000 +26.869641 82.047580 9.923280 89.802392 7.911810 171.537494 -6.985301 3.759199 -0.388599 -1.149299 0.032901 -0.573002 -8.038201 4.406204 -16.475698 -0.719900 -0.221897 -3.748698 3.363098 -3.701902 0.806397 5.368202 -5.831202 1.584600 0.823100 13.944891 3.854497 -80.901100 -69.305286 -88.685707 0.000003 -0.000003 -24.042508 7.958799 8.913500 0.156594 -7.694401 -17.943496 2.401294 -58.765852 79.683689 59.390646 0.000002 -0.000007 28.305508 10.593501 -8.660904 4.183502 -25.349302 7.770104 -0.287302 -14.742203 0.000001 -0.000001 5.788104 7.753994 -14.836403 32.383501 0.000001 0.000005 20.191795 8.909200 6.121505 -20.862902 0.000002 -0.000002 3.003197 2.418394 -21.033203 13.311404 -0.000001 -0.000002 +27.846523 82.296005 14.074402 88.859091 8.115289 173.669906 -7.187198 4.082500 -0.293601 -1.447899 0.276901 -0.591600 -7.715502 4.801205 -15.870802 -0.590197 -0.254698 -3.566401 4.004902 -4.406299 1.250598 5.447601 -5.778300 0.634699 0.605102 13.523195 4.512997 -85.725007 -69.879192 -91.914910 0.000002 -0.000002 -22.956008 7.622299 8.556792 0.278996 -8.058197 -17.756994 3.788299 -52.238858 80.641585 55.108258 0.000001 -0.000007 25.006205 10.381404 -8.078901 3.739301 -22.297005 9.139302 -0.549300 -24.412505 0.000002 -0.000002 0.090501 3.305294 -14.957502 35.472803 0.000001 0.000005 18.551202 8.579602 2.508903 -25.447806 0.000002 -0.000002 5.863502 1.216595 -18.730699 11.788702 -0.000001 -0.000002 +28.603697 82.832443 18.002517 87.344701 7.178155 176.315918 -8.026997 3.863199 -0.054101 -1.988001 0.284300 -0.573601 -6.914599 4.393203 -15.366200 -0.455803 -0.314699 -3.437202 4.116297 -4.481600 0.876797 5.201803 -5.675899 -0.453099 0.488602 14.058599 4.609498 -90.596093 -70.876783 -95.582595 -0.000003 0.000000 -21.331304 7.787098 7.947994 0.493794 -7.770201 -17.508998 4.554596 -52.387978 81.453890 57.095977 0.000002 -0.000008 21.519804 8.543704 -7.535001 3.268500 -16.374702 9.615401 -1.976301 -37.496803 0.000003 -0.000003 -10.484703 -10.165103 -12.849697 33.370108 0.000000 0.000005 14.308603 7.504898 1.325202 -25.974602 0.000002 -0.000002 8.822699 0.130794 -19.303301 10.800202 0.000001 0.000003 +29.175451 83.640671 21.670272 86.103195 5.942289 178.784403 -8.658098 3.418299 0.003899 -2.385900 0.312799 -0.544401 -6.587699 3.931103 -14.049998 -0.418000 -0.410998 -3.164301 4.250202 -4.544100 0.475300 4.899903 -5.887700 -2.110100 0.773399 14.204297 4.810699 -92.295401 -70.721186 -96.771100 -0.000004 -0.000001 -19.976804 6.331797 7.893397 1.056896 -8.140099 -17.533697 5.079696 -52.566484 82.267992 59.515884 0.000001 -0.000005 19.426298 6.459201 -6.744698 2.587601 -9.421801 8.986902 -2.892401 -50.096214 0.000005 -0.000003 -15.942203 -17.057299 -6.377497 24.922809 0.000001 0.000003 9.135600 6.398202 1.096901 -23.738901 0.000002 -0.000002 10.043901 0.175593 -20.698802 9.433903 0.000000 0.000002 +29.484315 84.627723 25.290788 84.710007 4.162696 -179.073091 -9.173298 2.736099 -0.122701 -2.870300 0.270900 -0.504100 -6.650797 3.151204 -12.531601 -0.440998 -0.614098 -2.906602 3.998399 -4.448400 0.068198 4.691099 -6.138401 -3.807703 0.765301 14.370501 5.211699 -92.502402 -71.105288 -96.967604 0.000000 -0.000002 -19.532804 4.155997 7.678001 1.783798 -8.205200 -17.775000 5.975899 -57.159252 81.687090 66.074851 0.000001 -0.000005 18.995705 4.757500 -7.008499 1.846898 -3.665798 7.662500 -0.964600 -59.444509 0.000005 -0.000003 -7.778999 -13.205798 4.299304 22.360904 0.000000 0.000003 2.758104 4.687600 0.390000 -19.436803 0.000002 -0.000002 9.880503 -0.097106 -21.286995 8.017904 0.000000 0.000001 +29.583118 85.578691 28.711916 83.957426 1.435302 -177.320703 -9.575999 1.552000 -0.262101 -3.262001 0.000300 -0.437801 -6.385803 1.918604 -11.114301 -0.432400 -0.812598 -2.672001 3.293004 -4.216099 -0.580400 4.386201 -6.243500 -5.262298 0.441801 14.845599 5.652900 -91.764307 -71.289488 -96.193205 0.000001 -0.000003 -20.101004 4.282501 7.315996 2.039897 -7.815100 -18.530098 6.601598 -65.208027 80.185785 75.355820 0.000000 -0.000004 20.442307 3.241503 -7.623403 2.051600 1.881901 5.273300 1.701801 -64.327500 0.000006 -0.000002 -0.922095 -6.648098 11.108305 24.391003 -0.000003 0.000003 -3.152399 1.731300 -2.909701 -14.663400 0.000001 -0.000001 9.114803 0.369691 -19.346102 8.252702 0.000000 0.000003 +29.697926 86.397584 31.857447 84.008515 -0.750698 -176.060898 -9.857696 0.616499 -0.243301 -3.462202 -0.209300 -0.368701 -5.900401 0.835803 -9.619399 -0.371499 -0.976798 -2.393701 2.623602 -4.169000 -1.165401 4.034000 -6.222802 -6.686299 0.222500 15.315597 6.075499 -90.837994 -71.508888 -95.169392 -0.000001 -0.000001 -21.163705 6.750297 7.358697 1.197793 -7.414598 -19.510300 6.793198 -69.862030 78.300882 81.062919 0.000001 -0.000007 23.431107 4.124899 -8.585302 2.520199 7.637304 3.374400 4.048502 -65.545507 0.000003 -0.000001 0.298903 -2.993696 13.841904 22.962500 0.000001 0.000003 -7.279798 -0.487299 -5.936102 -11.278802 0.000001 -0.000001 7.826301 1.924894 -17.291202 8.539202 -0.000000 -0.000001 +29.813242 87.008973 34.926278 84.430382 -2.027984 -175.128611 -9.826798 -0.015900 -0.138401 -3.489000 -0.240000 -0.328101 -5.668300 0.247803 -8.301598 -0.351702 -1.113699 -2.133300 2.117602 -4.280598 -1.507001 3.784603 -6.261898 -7.988900 0.111703 15.530200 6.537699 -89.666801 -71.924488 -93.879600 -0.000001 -0.000001 -22.566107 8.115101 7.988495 0.748393 -6.358893 -20.728199 7.236199 -71.573623 76.844981 83.276821 -0.000003 -0.000008 27.520405 6.091702 -9.602603 3.190598 12.697002 2.066099 5.601802 -63.460203 0.000005 -0.000002 1.129194 -2.544696 14.037304 22.266605 0.000001 0.000005 -9.940999 -1.650299 -8.729201 -9.634601 0.000001 -0.000001 6.530702 3.494696 -15.429504 8.848200 0.000000 0.000002 +29.823656 87.355423 38.007044 84.809691 -3.222705 -174.290886 -9.813995 -0.634000 -0.033902 -3.497102 -0.333801 -0.290601 -5.600001 -0.349798 -7.391000 -0.369998 -1.224799 -2.000200 1.655501 -4.174399 -1.743900 3.721700 -6.294599 -8.796000 -0.035898 15.939997 7.148500 -89.229297 -72.796590 -93.276996 -0.000003 -0.000002 -24.132110 9.493002 8.784099 0.416695 -5.628897 -21.944897 7.817498 -70.822332 75.979582 83.261228 0.000000 -0.000012 32.319202 8.557104 -10.651000 4.024004 16.304105 0.496900 6.613204 -57.970705 0.000006 -0.000003 2.995701 -0.239396 12.129902 22.714402 -0.000000 0.000002 -12.360697 -2.712899 -10.781302 -8.629000 0.000001 -0.000001 5.549403 5.930496 -14.620902 11.186602 -0.000000 0.000003 +29.803336 87.412571 41.184589 85.065783 -3.839019 -173.515891 -9.867306 -0.898300 0.053698 -3.516998 -0.434300 -0.265802 -5.571401 -0.763998 -6.856000 -0.417901 -1.306599 -1.937301 1.310200 -3.962601 -2.035301 3.839300 -6.352501 -9.548701 -0.327998 16.413900 7.692299 -89.318007 -73.902093 -93.175506 0.000000 -0.000002 -25.642405 11.194899 9.232399 0.346698 -4.737399 -23.144799 8.367396 -69.597028 75.403787 83.014126 0.000002 -0.000012 36.615111 10.382404 -12.148296 5.010700 18.265702 -0.635900 7.197802 -49.096004 0.000003 -0.000001 4.273196 -0.554097 10.297904 21.579704 0.000002 0.000002 -14.820701 -2.930597 -12.113602 -7.844703 0.000000 -0.000001 4.949999 6.225198 -14.286805 12.970505 0.000001 0.000001 +29.792414 87.148411 44.456614 85.321210 -3.668498 -173.182505 -9.875699 -0.858900 0.266398 -3.512001 -0.392200 -0.256900 -5.493899 -0.854498 -6.449501 -0.462500 -1.354499 -1.857401 0.993400 -4.083698 -2.066502 3.895802 -6.442800 -9.943800 -0.545297 16.701797 8.134500 -90.016911 -75.274591 -93.360610 -0.000002 -0.000002 -26.953007 12.395698 9.727495 0.157200 -3.585598 -24.519897 9.012798 -68.812741 75.080381 82.999332 0.000002 -0.000008 40.611707 10.505606 -13.735501 5.652504 18.525100 -0.991000 8.055503 -36.897601 0.000003 -0.000002 4.448097 -0.608597 9.240801 21.268306 -0.000001 0.000001 -17.379101 -2.317398 -12.642605 -6.709603 0.000000 0.000000 4.823006 6.631197 -14.266400 13.641506 0.000000 0.000002 +29.774380 86.507579 47.882561 85.667589 -2.756213 -173.294610 -9.794297 -0.423301 0.615199 -3.483999 -0.232600 -0.242202 -5.176399 -0.846299 -6.041902 -0.475602 -1.391198 -1.783301 0.676300 -4.263501 -1.910801 3.978003 -6.472699 -10.094999 -0.737600 17.126301 8.546900 -92.347607 -76.730987 -95.046405 -0.000002 -0.000002 -27.504409 12.702496 10.110794 -0.092900 -2.641598 -25.854402 9.680496 -68.169222 75.129288 83.293319 0.000005 -0.000008 43.767511 11.102504 -14.752497 5.881507 17.240202 -0.597900 9.666403 -21.699099 0.000001 -0.000001 3.633898 -0.175397 7.897202 21.597603 0.000001 0.000003 -19.738497 -1.159798 -12.102903 -5.828802 0.000001 0.000000 4.983901 6.701396 -14.278303 14.603103 -0.000002 0.000001 +29.692338 85.570309 51.572173 86.056192 -1.314993 -173.732300 -9.484999 0.290999 0.973600 -3.370801 -0.017300 -0.232002 -4.896702 -0.725699 -5.644001 -0.509600 -1.418999 -1.708800 0.495201 -4.526098 -1.550502 4.002301 -6.543100 -10.059300 -1.057300 17.432699 9.193800 -95.308487 -77.967589 -97.390487 -0.000001 -0.000003 -27.401307 12.474700 10.296498 -0.255400 -1.672700 -27.132499 10.455595 -68.422528 75.243386 84.368025 0.000004 -0.000010 45.913307 11.837405 -15.443797 6.126805 15.408502 0.081199 13.279401 -6.069098 0.000000 0.000000 3.525996 0.600201 3.923097 22.612106 0.000002 0.000004 -22.068898 0.275203 -11.753203 -5.160797 0.000000 -0.000001 5.299600 8.279596 -13.877701 16.872507 0.000002 0.000002 +29.297620 84.626201 55.445919 86.659681 -0.649436 -174.435395 -8.911296 0.169500 0.881399 -2.965099 0.133100 -0.256799 -5.075199 -0.490099 -5.095800 -0.540200 -1.459698 -1.568800 0.573401 -4.870199 -1.022301 3.796700 -6.356501 -9.821702 -1.085398 16.942898 9.950799 -97.439787 -80.029889 -98.815989 -0.000001 -0.000002 -26.682206 11.906800 10.233994 -0.184605 -0.631196 -27.651598 11.470193 -67.390640 75.156288 83.827137 0.000004 -0.000009 47.114904 12.325597 -16.076004 6.409196 14.442705 -0.763500 15.204402 5.536699 -0.000000 -0.000001 4.466600 -0.356598 2.644005 23.233406 0.000001 0.000004 -24.364907 0.505004 -12.419703 -4.597003 0.000000 0.000000 5.039102 9.285697 -12.401407 20.026101 0.000001 0.000003 diff --git a/data/test/character/bvh/Ty.bvh b/data/test/character/bvh/Ty.bvh new file mode 100755 index 0000000000000000000000000000000000000000..b35218399456fb65466eb86c2e4ab49e2e036a1c --- /dev/null +++ b/data/test/character/bvh/Ty.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000001 7.722015 1.166203 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.000714 9.594879 0.261390 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000820 11.036560 -0.507535 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.001605 21.684448 -3.096555 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.000666 8.918442 1.007324 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000000 62.363037 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 4.217376 16.560928 -4.061052 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 5.300992 0.669037 -1.702313 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 21.869188 0.000000 -0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 23.865284 -0.000015 -0.000018 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 12.134480 0.010895 -0.006928 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -4.217379 16.561340 -4.061054 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -5.300990 0.669006 -1.702311 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -21.869202 -0.000015 -0.000000 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -23.865301 0.000000 -0.000022 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -12.134407 0.011002 -0.006921 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 8.266982 -4.795517 -0.379053 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.002544 -33.831280 0.112823 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.002369 -33.193874 -2.279806 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.947577 -12.825567 13.985954 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.507118 -0.006404 13.609330 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.266981 -4.795525 -0.379053 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.002540 -33.831303 0.112822 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -0.002370 -33.193806 -2.279805 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.947572 -12.825686 13.985846 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.507135 -0.006573 13.609556 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 +-0.000010 84.649719 0.417920 0.000000 0.000006 0.000031 0.000000 0.000001 -0.000025 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000003 0.002063 0.000007 -0.000012 -0.001980 -0.000007 0.000068 0.000007 0.021211 -0.032583 -0.051465 -0.000004 0.000014 0.002074 -0.000007 -0.000015 -0.001964 -0.000007 -0.000089 -0.000007 0.021933 0.032587 0.051936 0.007455 0.000001 -0.004225 0.071486 0.000005 0.000000 -0.078942 -0.000008 0.004201 0.000002 0.000000 0.000000 0.008344 0.000001 0.004178 0.069805 -0.000005 0.000000 -0.078150 0.000007 -0.004201 0.000000 0.000000 0.000000 diff --git a/data/test/character/bvh/Vampire_A_Lusth.bvh b/data/test/character/bvh/Vampire_A_Lusth.bvh new file mode 100755 index 0000000000000000000000000000000000000000..2082b431b66ec73db3188b52cd946c534d6286a5 --- /dev/null +++ b/data/test/character/bvh/Vampire_A_Lusth.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.071958 7.257317 -0.789679 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 8.520218 -0.810853 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000000 29.181381 -1.048248 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 13.857941 7.405259 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 8.198502 5.703135 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 17.760818 13.332674 + } + } + } + JOINT LeftShoulder + { + OFFSET 12.584894 11.395248 -1.453072 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 13.910777 -6.129074 1.899151 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 34.109291 0.031494 -0.026956 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 41.070244 0.037903 0.684417 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 17.919678 -0.034241 0.438102 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -12.584903 11.394867 -1.453076 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -13.910809 -6.128998 1.899151 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -34.109295 0.031998 -0.026951 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -41.070320 0.037994 0.684420 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -17.919083 -0.035004 0.438087 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 13.026874 -6.336288 -1.092769 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET -0.000007 -45.880257 9.969885 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000016 -53.553963 -13.011755 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET -0.000007 -15.971712 16.270971 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 -0.005906 9.596000 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -12.882945 -6.336220 -1.092769 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.000002 -45.880341 9.969887 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000003 -53.553936 -13.011760 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 0.000003 -15.971819 16.270874 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000001 -0.005994 9.596034 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 +-0.071959 121.743759 1.014779 0.000000 0.000008 -0.000011 0.000000 -0.000001 0.000017 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000009 -0.000004 -0.011080 -0.000012 -0.045379 -0.041816 -0.000932 1.000000 0.000012 0.053468 0.445956 0.163338 0.000002 0.000004 0.010199 -0.000021 0.045382 0.043631 -0.000947 -1.000000 -0.000716 0.053925 -0.445982 -0.165898 0.069002 0.000017 0.000024 0.029795 0.000028 -0.000014 -0.098794 -0.000047 0.000002 -0.000006 0.000049 0.000005 0.068867 -0.000004 0.000021 0.029991 0.000011 -0.000003 -0.098867 -0.000006 0.000000 0.000009 0.000000 0.000000 diff --git a/data/test/character/bvh/Warrok_W_Kurniawan.bvh b/data/test/character/bvh/Warrok_W_Kurniawan.bvh new file mode 100755 index 0000000000000000000000000000000000000000..d5f569c749e9eb242bcaa1fe9b0789fe5d347c8a --- /dev/null +++ b/data/test/character/bvh/Warrok_W_Kurniawan.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000001 13.784843 0.064361 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 12.017487 0.405859 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 17.810654 0.430075 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET -0.000000 39.117615 11.976992 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET -0.000000 14.552521 15.664096 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000000 15.601730 7.553741 + } + } + } + JOINT LeftShoulder + { + OFFSET 17.399467 24.614197 1.157871 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 18.966230 5.773895 1.835135 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 49.301285 0.000015 -0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 31.599922 -0.000046 0.551540 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 23.331192 -0.008621 0.390773 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -17.399502 24.614258 1.157873 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -18.966200 5.774002 1.835130 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -49.301308 0.000015 0.000001 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -31.600189 -0.000015 0.551553 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -23.330734 -0.009003 0.390770 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 19.899147 -7.885056 -3.429541 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.000090 -36.607994 11.199699 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET -0.000090 -29.783567 -13.460409 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.000006 -22.564230 15.008865 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000002 0.010064 16.631992 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -19.899101 -7.885063 -3.429541 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.000004 -36.608002 11.199677 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000002 -29.783600 -13.460387 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 0.000004 -22.564205 15.008891 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 0.010018 16.631941 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 +-0.000011 96.489662 3.075860 0.000000 0.000007 0.000005 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000013 -0.000009 0.000446 0.000006 0.000007 -0.000362 -0.000005 0.999993 0.000007 0.045683 -0.040543 0.021918 -0.000001 0.000001 0.000358 0.000002 -0.000001 -0.000351 -0.000007 -0.999993 -0.000008 0.045502 0.040538 -0.022898 -0.590904 -0.000054 -0.000009 1.616514 0.000007 0.000006 -1.025611 -0.000014 -0.000030 -0.000001 0.000045 0.000005 -0.590955 -0.000007 0.000006 1.616642 0.000008 -0.000015 -1.025693 0.000000 0.000010 0.000000 0.000000 0.000000 diff --git a/data/test/character/bvh/X_Bot.bvh b/data/test/character/bvh/X_Bot.bvh new file mode 100755 index 0000000000000000000000000000000000000000..79ec81a899977e05c1eb0dd188c8b95d10370797 --- /dev/null +++ b/data/test/character/bvh/X_Bot.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET -0.000005 10.181595 0.131521 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.000000 9.893959 -1.470711 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000000 9.220757 -1.370642 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000001 16.740417 -2.049038 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 9.617874 1.685009 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000002 23.106583 -2.828261 + } + } + } + JOINT RightShoulder + { + OFFSET -4.569969 11.014923 -2.160886 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -10.592850 -0.524811 -2.232100 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -27.841520 0.000015 -0.000005 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -28.328838 -0.000015 0.000018 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -9.532509 -0.000046 -0.000025 + } + } + } + } + } + JOINT LeftShoulder + { + OFFSET 4.570447 11.014725 -2.160858 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 10.592371 -0.524597 -2.232121 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 27.841520 -0.000015 0.000023 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 28.328835 -0.000046 0.000017 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.533401 0.000031 0.000044 + } + } + } + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.207787 -6.751663 -1.599560 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.000001 -44.370129 0.345939 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.000001 -44.423679 -3.043537 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.000003 -8.728673 10.710563 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000003 -0.000676 9.278122 + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 8.207791 -6.751694 -1.599555 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET -0.000002 -44.370033 0.346957 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 0.000000 -44.423672 -3.044393 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET -0.000003 -8.728668 10.710562 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.000003 -0.000677 9.278135 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 +0.000006 104.270470 1.554256 0.000021 0.000003 -0.000113 0.000002 -0.000003 0.000084 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000004 0.000004 -0.000024 -0.000051 0.000030 0.000010 -0.000010 0.000001 -0.000003 -0.000321 -0.000044 0.000010 -0.000007 -0.000002 -0.000015 0.000002 0.000103 0.000118 -0.000007 -0.000007 0.000007 0.000020 -0.000089 0.000000 -0.077008 -0.000003 0.000080 0.153719 0.000000 0.000000 -0.076705 0.000000 -0.000002 0.000005 0.000000 0.000000 -0.074517 -0.000003 0.000081 0.148829 0.000002 0.000000 -0.074311 0.000000 -0.000002 0.000003 0.000000 0.000000 diff --git a/data/test/character/bvh/alex.bvh b/data/test/character/bvh/alex.bvh new file mode 100755 index 0000000000000000000000000000000000000000..4a66cb8feeb5073adac5115a2350858d7e7810e4 --- /dev/null +++ b/data/test/character/bvh/alex.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 10.729927 -1.090263 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 12.518242 -1.272026 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 14.306557 -1.453739 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 16.094879 -1.635523 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 6.762299 3.044908 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 22.913177 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 6.802174 14.493835 -1.627687 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 13.918566 -3.195938 0.015628 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 23.100763 -1.693985 -0.900273 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 25.226974 1.425507 0.435319 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 10.419601 -0.885376 1.910803 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -6.802182 14.493896 -1.643284 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -13.918570 -3.196030 -0.015706 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -23.100767 -1.693954 -0.903206 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -25.226929 1.425583 0.450610 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -10.274681 -0.981781 1.986913 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 8.707260 -5.963440 -0.626374 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 3.943727 -39.836140 -3.013489 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 2.296976 -36.621365 -2.255810 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 1.005202 -9.891911 13.654875 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.861074 0.285174 7.186011 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.707253 -5.963371 -0.444643 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -3.943736 -39.836201 -3.027602 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -2.296966 -36.621380 -2.192677 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -1.005177 -9.891721 14.333511 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.861054 0.285257 7.370820 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 +-0.001797 94.154053 0.520212 0.000180 -0.000558 0.017191 -0.000207 0.000558 -0.017191 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000025 0.000000 0.000000 0.000000 0.000000 0.000000 0.000005 -0.000049 0.063278 0.072862 -2.225981 4.130279 0.154862 3.210244 -7.431898 -8.641872 8.906439 7.956580 0.000011 -0.000001 -0.063543 0.073104 2.232948 -4.130523 0.159679 -3.251435 7.432281 -8.132106 -9.441767 -8.571361 -3.460841 0.001940 -4.683559 2.676170 0.232501 -0.003077 0.773062 0.048586 4.664194 -0.000014 -0.000023 -0.000003 -3.179950 0.001877 4.649359 2.448983 -0.213723 0.002468 0.720273 -0.045256 -4.664440 0.000001 0.000006 0.000002 diff --git a/data/test/character/bvh/brady.bvh b/data/test/character/bvh/brady.bvh new file mode 100755 index 0000000000000000000000000000000000000000..58c3a9fc0005ef9a8592bd10515710d83b8ca13f --- /dev/null +++ b/data/test/character/bvh/brady.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 9.499786 -0.870903 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 11.083084 -1.016054 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 12.666382 -1.161205 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 14.249680 -1.306353 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 4.495483 1.417411 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 23.176620 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 6.116709 12.704941 -1.339071 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 12.425781 -3.211105 -0.065434 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 22.158945 -2.872360 -1.399630 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 25.104652 -0.192932 1.056070 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.705849 -0.442657 1.612894 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -6.116709 12.704941 -1.273637 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -12.425779 -3.211105 0.065434 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -22.158939 -2.872360 -1.514240 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -25.104675 -0.192963 0.744701 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -10.231018 -0.629379 1.756910 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 8.851810 -5.273262 -0.260579 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 4.786218 -47.301109 -2.645185 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 2.862842 -47.133522 -4.655134 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 1.791019 -9.768358 14.054543 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.867786 0.177796 6.204005 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.851810 -5.273262 -0.506956 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -4.786219 -47.301121 -2.078138 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -2.862835 -47.133102 -4.812192 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -1.791128 -9.769389 13.920980 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.867828 0.177334 6.173149 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 +-0.000849 111.171730 0.380898 -0.000149 -0.000338 0.010723 0.000149 0.000338 -0.010723 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 0.000004 0.742418 0.068529 -3.585422 6.642026 0.702015 5.952284 -6.981226 -0.229246 7.018427 2.155539 -0.000008 0.000074 -0.741292 0.074136 3.878216 -6.642179 0.587260 -5.546640 6.971364 1.465378 -8.016593 -3.118212 -2.963053 0.001097 -4.641050 0.799125 0.107690 0.003887 2.154449 0.131147 4.624378 -0.000020 -0.000001 0.000000 -2.446590 0.001052 4.619560 -0.037416 -0.046821 -0.005065 2.476104 -0.150694 -4.623043 0.000005 0.000002 0.000001 diff --git a/data/test/character/bvh/gas_mask.bvh b/data/test/character/bvh/gas_mask.bvh new file mode 100755 index 0000000000000000000000000000000000000000..a191e576d68173045da71d7f636bd3770e4a0fcf --- /dev/null +++ b/data/test/character/bvh/gas_mask.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 9.465591 -1.179067 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 11.043190 -1.375579 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 12.620781 -1.572088 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 14.198364 -1.768600 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 4.940964 2.499977 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 25.371643 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 7.080386 12.332626 -1.781908 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 14.193053 -3.710541 -0.026618 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 20.595480 -0.814011 -1.084635 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 27.005219 0.200455 0.567441 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 11.074303 -0.202698 1.948441 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -7.080386 12.332626 -1.755290 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -14.193065 -3.710526 0.026614 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -20.595469 -0.814011 -2.381104 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -27.005226 0.200439 1.869089 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -11.078819 -0.144226 1.861887 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 9.831665 -5.267471 -0.602804 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 2.615115 -40.221111 -1.296709 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 2.757051 -43.401630 -3.987997 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 1.449224 -10.952891 12.999776 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.805309 -0.038409 6.265759 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -9.831665 -5.267471 -0.177373 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -2.615115 -40.221107 -1.713084 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -2.757060 -43.401703 -4.073595 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -1.449205 -10.952621 12.570034 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.805304 -0.038285 6.101549 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 +0.000825 101.241356 0.343671 -0.000184 0.000276 -0.008508 0.000183 -0.000276 0.008508 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000005 -0.000016 0.147552 0.032330 -3.012382 2.115506 0.124251 4.214342 -2.692492 -3.188713 8.751753 1.411345 -0.000010 0.000065 -0.147361 0.070716 6.589886 -2.114624 0.358513 -10.543039 2.720243 -3.159664 -5.562526 -0.953930 -1.919562 -0.000800 -3.665779 -0.043621 -0.001333 0.000134 1.959400 0.124565 3.672029 0.000005 0.000001 0.000001 -2.319172 -0.000639 3.682658 0.625083 -0.041155 0.000120 1.689512 -0.107433 -3.672504 -0.000011 -0.000002 0.000000 diff --git a/data/test/character/bvh/louise.bvh b/data/test/character/bvh/louise.bvh new file mode 100755 index 0000000000000000000000000000000000000000..c12fa7c53e898b815606bd79c9f6908bbbbff04d --- /dev/null +++ b/data/test/character/bvh/louise.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 9.124741 -0.303033 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 10.645523 -0.353538 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 12.166306 -0.404044 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 13.687134 -0.454550 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 9.016312 1.273142 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 20.986450 -0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 6.065188 11.939972 -0.447791 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 12.258447 -3.468094 0.013519 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 22.258667 -1.824280 -1.753587 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 24.861584 1.314575 0.927653 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.031776 -0.272888 1.360615 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -6.065188 11.939972 -0.461309 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -12.258451 -3.468063 -0.013518 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -22.258667 -1.824280 -1.636289 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -24.861572 1.314575 0.902853 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.969734 -0.180862 1.398190 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 9.810857 -5.071983 -0.000141 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 2.413923 -44.751675 -1.905678 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 2.780751 -34.928223 -4.418494 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.935018 -14.297944 10.746361 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.638333 0.092551 4.962524 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -9.810857 -5.071983 0.150281 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -2.413924 -44.751690 -2.044709 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -2.780767 -34.928215 -4.429886 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.934930 -14.297280 10.883619 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.638301 0.093074 5.008942 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 +0.000312 99.926056 -0.041614 -0.000023 0.000100 -0.003006 0.000023 -0.000100 0.003006 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000023 0.123643 0.149692 -4.489915 4.560915 0.383998 6.614327 -7.731094 1.905557 6.540638 4.859742 0.000003 -0.000014 -0.124191 0.139730 4.190729 -4.561220 0.371040 -6.257930 7.729833 2.183283 -6.908388 -4.294572 -2.693836 -0.000320 -3.726905 -0.009001 -0.038814 -0.004809 2.697143 0.214253 3.728755 0.000004 0.000001 0.000000 -2.774107 -0.000296 3.732789 0.173879 0.025572 0.004677 2.594373 -0.206090 -3.728948 0.000004 -0.000002 0.000001 diff --git a/data/test/character/bvh/megan.bvh b/data/test/character/bvh/megan.bvh new file mode 100755 index 0000000000000000000000000000000000000000..a077c3f7c32e6d8707d0d286c15c22be0dc1a732 --- /dev/null +++ b/data/test/character/bvh/megan.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 8.951164 -0.286642 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 10.443016 -0.334416 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET -0.000000 11.934875 -0.382189 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 13.426727 -0.429963 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 8.477280 0.443076 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 21.335846 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 5.225270 11.895874 -0.427614 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 10.405485 -3.014740 0.004701 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 25.316505 -2.258133 -2.180183 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 24.444893 1.498306 0.870077 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 8.960663 -0.277771 1.460124 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -5.225270 11.895874 -0.432313 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -10.405491 -3.014709 -0.004700 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -25.316505 -2.258133 -2.163533 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -24.444889 1.498276 0.898457 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.892281 -0.452988 1.476768 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 8.899668 -4.969727 -0.781577 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 3.062883 -42.749832 -0.694436 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 2.562582 -42.568401 -4.052387 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.357713 -8.547654 13.291756 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.306569 0.162115 6.425951 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -8.899668 -4.969727 -0.953905 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -3.062883 -42.749836 -0.564207 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -2.562577 -42.568367 -4.016928 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.357718 -8.547743 13.332318 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.306572 0.162061 6.518645 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 +-0.000123 100.350990 0.809170 -0.000015 -0.000049 0.001535 0.000015 0.000049 -0.001535 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 0.000004 0.174988 0.165848 -4.903132 4.921644 0.402623 6.929075 -8.623466 0.183304 7.240609 5.333226 0.000000 -0.000012 -0.175277 0.164553 4.865882 -4.921333 0.413069 -6.957274 8.624588 2.066345 -7.458583 -6.544029 -1.408290 0.000085 -3.773631 0.104900 0.014281 0.000692 1.300340 0.078351 3.770600 0.000005 -0.000001 -0.000001 -1.359584 0.000119 3.770485 -0.001226 -0.007643 -0.000726 1.357858 -0.081807 -3.770425 -0.000006 0.000000 0.000000 diff --git a/data/test/character/bvh/morak.bvh b/data/test/character/bvh/morak.bvh new file mode 100755 index 0000000000000000000000000000000000000000..6cb3de63b0d4d752d466e7d9b00e7fde94e81af6 --- /dev/null +++ b/data/test/character/bvh/morak.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 11.654694 -0.779708 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET -0.000000 13.597153 -0.909658 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 15.539589 -1.039610 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 17.482056 -1.169563 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 0.554123 0.288906 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 27.564255 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 7.385855 16.358994 -1.218628 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 14.527525 -2.281250 -0.098130 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 22.358158 -6.974487 -1.841915 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 27.617630 0.453964 1.433033 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.706085 -0.499115 2.173395 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -7.385855 16.358994 -1.120497 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -14.527525 -2.281235 0.098131 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -22.358150 -6.974487 -2.234561 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -27.617653 0.453964 1.376283 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -10.071159 -0.698212 2.621387 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 11.550196 -6.484505 0.044462 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 2.615408 -42.278301 -4.425847 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 4.145214 -36.318710 -4.546780 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 4.050718 -11.935559 14.351170 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.931999 -0.218195 7.202614 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -11.550196 -6.484505 0.962870 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -2.615408 -42.278301 -5.298195 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -4.145226 -36.318867 -4.621993 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -4.050695 -11.935063 14.616154 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.931980 -0.217949 6.980888 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 +0.005252 98.835678 -0.631495 -0.001482 0.001239 -0.037287 0.001483 -0.001238 0.037287 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000003 -0.000010 1.486489 0.272287 -4.505305 15.833777 1.998849 7.199777 -18.389174 5.645658 9.744505 4.201862 0.000004 -0.000150 -1.488982 0.329991 5.460423 -15.831470 2.085563 -8.049042 18.403929 6.189375 -11.824748 -5.249202 -4.960317 -0.006706 -4.873603 -0.031736 -0.139272 -0.016910 4.975183 0.566628 4.896888 0.000001 -0.000002 0.000003 -7.053028 -0.005781 4.943460 4.430799 -0.307409 0.028745 2.597851 -0.296097 -4.912294 -0.000026 0.000002 0.000001 diff --git a/data/test/character/bvh/mousey.bvh b/data/test/character/bvh/mousey.bvh new file mode 100755 index 0000000000000000000000000000000000000000..a06a4c90cb643d00e712e0625732557daaf0f3de --- /dev/null +++ b/data/test/character/bvh/mousey.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 6.876060 0.125662 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 8.022060 0.146603 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 9.168079 0.167547 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 10.314075 0.188489 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 7.643753 -2.377445 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 45.857788 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 4.392187 8.825001 0.174995 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 8.774866 -2.970879 -0.026997 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 8.450586 -0.797432 -0.648343 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 18.458662 0.962311 0.193148 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 8.556145 -0.261200 0.258753 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -4.392150 8.825024 0.141388 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -8.774886 -2.970947 -0.094209 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -8.450586 -0.797386 -0.330665 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -18.458664 0.962341 0.025780 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -8.158691 -0.528496 0.196552 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 10.205382 -3.823519 0.155145 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 0.283732 -12.998343 0.567794 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET -1.058953 -10.688869 -2.184322 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.108145 -7.191069 7.560211 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.070226 0.081726 4.490266 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -10.205383 -3.823513 0.005508 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -0.283728 -12.998341 0.610627 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 1.058956 -10.688892 -1.945833 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.108150 -7.191040 7.372945 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.070229 0.081738 4.479398 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 +-0.002073 34.761070 -0.411495 -0.000031 -0.001238 0.004266 0.000030 0.001238 -0.004266 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 -0.000006 -0.070128 0.224517 -4.367660 5.460965 0.191783 4.970665 -8.374134 -2.222095 1.018659 4.708699 -0.000010 -0.000020 0.072205 0.114631 2.230713 -5.460839 0.060259 -2.315370 8.373065 -1.696634 -1.210747 -6.687687 -6.407915 -0.012214 1.954886 10.292646 -0.569419 -0.193502 -3.889193 0.350228 -1.716661 0.000015 -0.000011 0.000017 -6.191304 0.009974 -1.943602 10.515926 0.612020 0.168648 -4.329091 -0.396634 1.714682 0.000002 -0.000005 0.000008 diff --git a/data/test/character/bvh/ortiz.bvh b/data/test/character/bvh/ortiz.bvh new file mode 100755 index 0000000000000000000000000000000000000000..8f61e1309acda9f127a6c0ef296f4a28300a1e12 --- /dev/null +++ b/data/test/character/bvh/ortiz.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 14.685707 -1.734714 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 17.133331 -2.023833 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 19.580948 -2.312953 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 22.028564 -2.602070 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 7.772293 1.167654 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 26.815750 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 11.646637 18.513367 -2.583829 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 23.494797 -6.787735 0.036483 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 22.628841 -2.236465 0.895561 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 32.235813 0.214081 0.341628 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 12.067444 0.830978 1.411757 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -11.646637 18.513367 -2.620312 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -23.494804 -6.787735 -0.036485 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -22.628826 -2.236481 0.960591 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -32.235806 0.214096 0.317908 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -12.051239 0.663742 1.548264 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 13.580879 -8.149223 -1.796077 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 3.676140 -35.802425 -2.676071 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET -0.369089 -26.709160 -2.057140 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET -1.192477 -6.581660 13.403662 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.351338 -0.163913 5.937977 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -13.580879 -8.149223 -2.255285 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -3.676140 -35.802425 -2.316821 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET 0.369059 -26.709040 -2.090143 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET 1.192393 -6.582436 13.372205 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.351307 -0.164255 5.913618 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 +-0.001216 77.745224 1.559386 -0.000045 -0.000363 0.002653 0.000046 0.000363 -0.002653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000006 -0.000009 0.422250 -0.052936 2.255862 5.221771 -0.012181 -1.654973 -6.021296 2.620197 6.068011 -3.528946 -0.000002 0.000004 -0.422108 -0.056793 -2.419360 -5.221843 -0.026052 1.860375 6.021175 3.266231 -6.767689 2.736922 -5.284444 0.001209 -3.039718 6.778236 0.257477 -0.002187 -1.501094 0.021546 3.019759 -0.000005 -0.000001 0.000000 -5.036500 -0.000319 3.033189 5.904362 -0.252760 0.000435 -0.874799 -0.012740 -3.020761 0.000001 0.000000 0.000000 diff --git a/data/test/character/bvh/racer.bvh b/data/test/character/bvh/racer.bvh new file mode 100755 index 0000000000000000000000000000000000000000..e7b9746c0c44e3cb0d1fc4056dd356bbb16932df --- /dev/null +++ b/data/test/character/bvh/racer.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 10.236633 -0.985389 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 11.942749 -1.149607 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 13.648842 -1.313846 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 15.354965 -1.478083 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 3.779831 1.345864 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 26.586700 -0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 6.191272 13.567642 -1.482505 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 12.640412 -3.468536 -0.008860 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 26.983429 -1.357040 -1.711584 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 25.529598 0.388855 1.340383 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 10.002861 -0.514282 1.273262 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -6.191271 13.567764 -1.473656 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -12.640451 -3.468536 0.008855 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -26.983360 -1.357269 -1.679521 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -25.529621 0.388916 1.295802 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -10.016167 -0.616241 1.280610 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 9.149316 -5.691643 -0.209776 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 3.350564 -40.639099 -3.165111 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 2.479871 -38.813557 -2.495497 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 3.266852 -11.730350 15.127145 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 1.671803 -0.049752 6.701402 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -9.149317 -5.691650 -0.455456 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -3.350562 -40.639099 -2.947695 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -2.479888 -38.813435 -2.831225 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -3.266907 -11.731069 15.306976 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -1.671818 -0.050066 7.010759 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 +0.002016 98.193748 0.338446 0.000271 0.000662 -0.020162 -0.000268 -0.000662 0.020162 -0.000005 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000021 -0.000026 0.210961 0.044344 -3.625012 2.667730 0.314101 6.622578 -3.769772 0.306735 4.244761 3.837236 -0.000003 0.000053 -0.210956 0.043464 3.557366 -2.667434 0.304526 -6.455495 3.768793 0.964914 -4.382687 -4.448125 -3.104977 -0.002274 -4.176473 1.978423 0.156158 -0.001494 1.117901 0.071499 4.194946 -0.000013 -0.000018 0.000001 -3.373024 -0.002196 4.216703 1.992773 -0.158749 0.001333 1.371066 -0.087632 -4.194429 -0.000018 -0.000045 -0.000014 diff --git a/data/test/character/bvh/suzie.bvh b/data/test/character/bvh/suzie.bvh new file mode 100755 index 0000000000000000000000000000000000000000..08a91dde0a9a0bbd4ab491198a21f6d8fb3a25a1 --- /dev/null +++ b/data/test/character/bvh/suzie.bvh @@ -0,0 +1,194 @@ +HIERARCHY +ROOT Hips +{ + OFFSET 0.000000 0.000000 0.000000 + CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation + JOINT Spine + { + OFFSET 0.000000 9.892853 -0.431040 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine1 + { + OFFSET 0.000000 11.541664 -0.502879 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Spine2 + { + OFFSET 0.000000 13.190491 -0.574720 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Neck + { + OFFSET 0.000000 14.839249 -0.646559 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT Head + { + OFFSET 0.000000 7.381821 2.166136 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.000000 22.250732 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 5.775723 12.826736 -0.654646 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftArm + { + OFFSET 11.556721 -4.026581 -0.016174 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftForeArm + { + OFFSET 20.627449 -1.991257 -1.794727 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftHand + { + OFFSET 27.482666 1.655899 0.607355 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 9.150925 -0.286270 1.494504 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -5.775723 12.826736 -0.638471 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightArm + { + OFFSET -11.556717 -4.026566 0.016174 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightForeArm + { + OFFSET -20.627460 -1.991272 -1.944019 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightHand + { + OFFSET -27.482658 1.655914 0.796505 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -9.185806 -0.253830 1.440565 + } + } + } + } + } + } + } + } + JOINT LeftUpLeg + { + OFFSET 9.206878 -5.488930 -0.519935 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftLeg + { + OFFSET 4.205531 -43.262280 -2.162630 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftFoot + { + OFFSET 1.827133 -36.711155 -2.955524 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT LeftToeBase + { + OFFSET 0.450005 -9.939116 12.432705 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET 0.167034 -0.021092 4.948256 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -9.206878 -5.488930 -0.459628 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightLeg + { + OFFSET -4.205531 -43.262280 -2.150845 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightFoot + { + OFFSET -1.827144 -36.711151 -3.027616 + CHANNELS 3 Xrotation Yrotation Zrotation + JOINT RightToeBase + { + OFFSET -0.450027 -9.939575 12.302733 + CHANNELS 3 Xrotation Yrotation Zrotation + End Site + { + OFFSET -0.167047 -0.021336 4.888955 + } + } + } + } + } +} +MOTION +Frames: 60 +Frame Time: 0.033333 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 +0.000092 96.788727 0.440278 -0.000003 0.000029 -0.000907 0.000003 -0.000029 0.000907 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000007 -0.000011 0.079748 0.214292 -4.949947 5.433753 0.309851 6.212464 -8.969527 1.520009 8.114378 5.317620 0.000003 -0.000004 -0.079914 0.232033 5.359427 -5.433719 0.386228 -7.011580 8.976318 1.430912 -7.352446 -5.112670 -1.873160 -0.000064 -4.312964 -0.001793 0.047557 0.003825 1.869629 0.093214 4.309307 0.000011 0.000000 0.000000 -1.927433 -0.000084 4.314887 0.116577 -0.054801 -0.003775 1.805376 -0.090035 -4.309512 -0.000006 0.000000 -0.000001 diff --git a/data/test/character/default.txt b/data/test/character/default.txt new file mode 100644 index 0000000000000000000000000000000000000000..d184270b27fbc224febe5c4446c2b787d9b0cc02 --- /dev/null +++ b/data/test/character/default.txt @@ -0,0 +1,25 @@ +Hips, 0, 0, 0 +LeftUpLeg, 8.20778, -6.75171, -1.59956 +LeftLeg, 0, -44.3705, 0.284643 +LeftFoot, 0, -44.4279, -2.98219 +LeftToeBase, 0, -8.72867, 10.7106 +LeftToeBase_End, 0, 0, 6 +RightUpLeg, -8.2078, -6.75166, -1.59956 +RightLeg, 0, -44.3705, 0.286156 +RightFoot, 0, -44.4277, -2.98379 +RightToeBase, 0, -8.72867, 10.7106 +RightToeBase_End, 0, 0, 6, +Spine, 0. , 29.36511 , -2.242699 +LeftShoulder, 4.57045, 10.946, -2.6279 +LeftArm, 15.16277, 10.421402, -4.86012 +LeftForeArm, 27.8415, -8.94286e-05, 3.74589e-05 +LeftHand, 28.3288, -1.74407e-05, 3.78045e-05 +LeftHand_End, 6, 0, 0 +RightShoulder, -4.56997, 10.9462, -2.6280 +RightArm, -15.16277, 10.421402, -4.86012 +RightForeArm, -27.8415, -3.30792e-05, 1.16763e-05 +RightHand, -28.3288, 0, 5.5816e-05 +RightHand_End, -6, 0, 0 +Neck, 0, 16.6717, -2.51617 +Head, 0, 9.61788, 1.68501 +Head_End, 0, 19, 1 diff --git a/data/test/character/joint_pos/Erika_Archer.txt b/data/test/character/joint_pos/Erika_Archer.txt new file mode 100644 index 0000000000000000000000000000000000000000..8419f0dd9c2a6efec5660f41e7a99efcb6a1e524 --- /dev/null +++ b/data/test/character/joint_pos/Erika_Archer.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0007, 10.1816, 0.0000 +Spine1, -0.0000, 10.0967, -0.8569 +Spine2, -0.0000, 9.1040, -1.3464 +Neck, -0.0000, 16.6695, -2.5309 +Head, 0.0000, 9.6208, 1.6680 +Head_End, -0.0000, 17.8418, 2.3942 +LeftShoulder, 4.5704, 10.9287, -2.6674 +LeftArm, 10.5814, -0.5424, -2.2436 +LeftForeArm, 27.8399, -0.0000, 0.0000 +LeftHand, 28.3351, -0.0000, 0.0000 +LeftHand_End, 9.5429, 0.0002, 0.0001 +RightShoulder, -4.5700, 10.9290, -2.6674 +RightArm, -10.5943, -0.5430, -2.1807 +RightForeArm, -27.8415, -0.0001, -0.0000 +RightHand, -28.3167, 0.0001, -0.0000 +RightHand_End, -9.5444, 0.0001, -0.0000 +LeftUpLeg, 8.2101, -6.7490, -1.5995 +LeftLeg, 0.0000, -44.3557, 0.7568 +LeftFoot, 0.0000, -44.4207, -3.4536 +LeftToeBase, 0.0761, -8.7007, 10.6014 +LeftToeBase_End, -0.0534, -0.0057, 9.2722 +RightUpLeg, -8.2055, -6.7544, -1.5997 +RightLeg, 0.0000, -44.3727, 0.7899 +RightFoot, 0.0000, -44.3981, -3.4868 +RightToeBase, -0.0702, -8.7176, 10.5835 +RightToeBase_End, 0.0921, 0.0128, 9.2720 diff --git a/data/test/character/joint_pos/Ganfaul_M_Aure.txt b/data/test/character/joint_pos/Ganfaul_M_Aure.txt new file mode 100644 index 0000000000000000000000000000000000000000..5fdba8755ad683b7045ec725d23eb6fc15e599ee --- /dev/null +++ b/data/test/character/joint_pos/Ganfaul_M_Aure.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0065, 10.8226, -0.4307 +Spine1, -0.0220, 12.6528, -0.2404 +Spine2, -0.0252, 14.4595, 0.0727 +Neck, -0.0281, 16.1354, 0.0811 +Head, -0.0118, 6.7910, -0.0608 +Head_End, -0.0600, 22.8310, 3.5418 +LeftShoulder, 10.9999, 13.2613, -1.4870 +LeftArm, 14.5041, -7.9708, 0.2270 +LeftForeArm, 27.1983, 0.0001, -0.0000 +LeftHand, 21.5354, 0.0001, 0.0000 +LeftHand_End, 14.6983, 0.0001, 0.0000 +RightShoulder, -10.9054, 13.2612, -1.4870 +RightArm, -14.4551, -7.9708, 0.0465 +RightForeArm, -19.9537, -0.0001, -0.0000 +RightHand, -28.8104, 0.0000, -0.0000 +RightHand_End, -14.7074, 0.0001, -0.0001 +LeftUpLeg, 13.2805, -6.0126, -0.5314 +LeftLeg, -0.0075, -52.1569, 1.6800 +LeftFoot, 0.0075, -50.7461, -4.8162 +LeftToeBase, 2.7158, -10.0900, 19.3530 +LeftToeBase_End, 0.6142, 0.1525, 8.9813 +RightUpLeg, -13.2937, -6.0124, -0.5314 +RightLeg, -0.0056, -52.1272, 1.6685 +RightFoot, 0.0057, -50.7758, -4.8048 +RightToeBase, -2.8626, -10.0464, 19.3960 +RightToeBase_End, -0.6876, 0.0718, 9.0058 diff --git a/data/test/character/joint_pos/Lola_B_Styperek.txt b/data/test/character/joint_pos/Lola_B_Styperek.txt new file mode 100644 index 0000000000000000000000000000000000000000..7c8b94d0c7ef37a14157c13789aced1658e309b2 --- /dev/null +++ b/data/test/character/joint_pos/Lola_B_Styperek.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0011, 10.8717, -0.8285 +Spine1, 0.0022, 12.6837, -0.9666 +Spine2, 0.0025, 14.4956, -1.1046 +Neck, 0.0029, 16.3075, -1.2427 +Head, -0.0000, 11.1767, 5.1345 +Head_End, -0.0000, 19.3553, 1.9809 +LeftShoulder, 5.9061, 14.3470, -1.2160 +LeftArm, 12.2698, -2.0544, 0.0535 +LeftForeArm, 27.8947, 0.0005, -0.0000 +LeftHand, 28.3255, 0.0005, -0.0000 +LeftHand_End, 9.8986, 0.0002, 0.0000 +RightShoulder, -5.9405, 14.3469, -1.2160 +RightArm, -12.2697, -2.0540, 0.0535 +RightForeArm, -27.8947, 0.0014, 0.0001 +RightHand, -28.3255, 0.0013, 0.0001 +RightHand_End, -9.8986, 0.0005, 0.0001 +LeftUpLeg, 12.4999, -6.0389, 1.6449 +LeftLeg, 0.0000, -51.6398, -0.1541 +LeftFoot, 0.0000, -44.2093, -2.8339 +LeftToeBase, 4.1572, -11.8749, 16.1850 +LeftToeBase_End, 1.3388, 0.0617, 8.0636 +RightUpLeg, -12.4999, -6.0388, 1.6449 +RightLeg, 0.0001, -51.6398, -0.1536 +RightFoot, -0.0000, -44.2092, -2.8345 +RightToeBase, -4.1571, -11.8750, 16.1850 +RightToeBase_End, -1.3388, 0.0617, 8.0636 diff --git a/data/test/character/joint_pos/Maria_WProp_J_J_Ong.txt b/data/test/character/joint_pos/Maria_WProp_J_J_Ong.txt new file mode 100644 index 0000000000000000000000000000000000000000..317e739e9afcb9a90287241e83d30fc0a33dc246 --- /dev/null +++ b/data/test/character/joint_pos/Maria_WProp_J_J_Ong.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0046, 5.2453, 0.2588 +Spine1, -0.0000, 11.0448, -0.6976 +Spine2, -0.0000, 8.0689, -1.0877 +Neck, -0.1122, 18.9195, -3.7361 +Head, -0.0000, 8.6730, 3.3193 +Head_End, -0.0000, 20.9573, 0.0000 +LeftShoulder, 6.3392, 14.9529, -4.6429 +LeftArm, 8.9852, -1.6944, -0.0463 +LeftForeArm, 24.5739, -0.0001, 0.0000 +LeftHand, 23.0966, -0.0001, 0.0000 +LeftHand_End, 11.4475, -0.0001, 0.0000 +RightShoulder, -6.3392, 14.9527, -4.6429 +RightArm, -8.9851, -1.6946, -0.0463 +RightForeArm, -24.5739, -0.0010, 0.0000 +RightHand, -23.0966, -0.0010, 0.0000 +RightHand_End, -11.4475, -0.0005, 0.0000 +LeftUpLeg, 9.6888, -5.6852, -1.6886 +LeftLeg, 0.0000, -43.1418, 1.5032 +LeftFoot, 0.0000, -40.5937, -4.2710 +LeftToeBase, 0.9333, -15.8177, 8.5399 +LeftToeBase_End, 0.5650, -0.0135, 13.7566 +RightUpLeg, -9.6888, -5.6852, -1.6886 +RightLeg, 0.0000, -43.1418, 1.5027 +RightFoot, 0.0000, -40.5937, -4.2706 +RightToeBase, -0.9333, -15.8177, 8.5399 +RightToeBase_End, -0.5651, -0.0135, 13.7566 diff --git a/data/test/character/joint_pos/Pirate_By_P._Konstantinov.txt b/data/test/character/joint_pos/Pirate_By_P._Konstantinov.txt new file mode 100644 index 0000000000000000000000000000000000000000..80fd0d48cef4e1263700c61ed5d66b5d477fb493 --- /dev/null +++ b/data/test/character/joint_pos/Pirate_By_P._Konstantinov.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.1183, 3.0107, -0.2342 +Spine1, 0.0225, 3.2829, -0.2731 +Spine2, -0.0458, 5.2264, -0.3121 +Neck, 0.0375, 5.6713, -0.8499 +Head, -0.0022, 3.4800, 1.1979 +Head_End, -0.0000, 5.7580, 0.0000 +LeftShoulder, 2.4397, 4.0661, -0.2063 +LeftArm, 2.7022, -1.4708, 0.2896 +LeftForeArm, 7.4920, -0.0000, 0.0000 +LeftHand, 8.2097, 0.0000, 0.0000 +LeftHand_End, 4.5820, -0.0000, -0.0000 +RightShoulder, -2.7601, 4.0661, -0.4959 +RightArm, -2.3439, -1.4708, -0.2896 +RightForeArm, -7.5026, -0.0000, 0.0000 +RightHand, -8.2546, -0.0000, 0.0000 +RightHand_End, -4.6234, -0.0000, -0.0000 +LeftUpLeg, 3.3480, -0.9169, -0.0416 +LeftLeg, 0.0006, -14.2248, 0.5119 +LeftFoot, 0.0007, -16.0769, -1.4261 +LeftToeBase, -0.0000, -5.9168, 0.3953 +LeftToeBase_End, -0.0000, -0.0002, 0.7679 +RightUpLeg, -3.5542, -0.9066, 0.1459 +RightLeg, -0.0006, -14.2431, 0.6377 +RightFoot, -0.0007, -16.0721, -1.7398 +RightToeBase, 0.0000, -5.8851, 3.2025 +RightToeBase_End, 0.0000, 0.0031, 3.2751 diff --git a/data/test/character/joint_pos/SFU_0007_Walking001_0.txt b/data/test/character/joint_pos/SFU_0007_Walking001_0.txt new file mode 100644 index 0000000000000000000000000000000000000000..584f67fa8cc44c01f55f554944c9e61dd539f638 --- /dev/null +++ b/data/test/character/joint_pos/SFU_0007_Walking001_0.txt @@ -0,0 +1,26 @@ +Hips, 0, 0, 0 +LeftUpLeg, 8.4887, 0.0000, 0.0000 +LeftLeg, 0.0000, -42.1546, 0.0000 +LeftFoot, 0.0000, -40.9870, 0.0000 +LeftToeBase, 0.0000, -4.3192, 16.1193 +LeftToeBase_End, 0.0000, 0.0000, 7.5000 +RightUpLeg, -8.4887, 0.0000, 0.0000 +RightLeg, 0.0000, -42.1546, 0.0000 +RightFoot, 0.0000, -40.9870, 0.0000 +RightToeBase, 0.0000, -4.3192, 16.1193 +RightToeBase_End, 0.0000, 0.0000, 7.5000 +Spine, 0.0000, 0.1000, 0.0000 +Spine1, 0.0000, 23.5151, 0.0000 +Neck, 0.0000, 22.3894, 0.0000 +Head, 0.0000, 17.5132, 0.0000 +Head_End, 0.0000, 11.5000, 0.0000 +LeftShoulder, 0.0000, 22.3894, 0.0000 +LeftArm, 18.5716, -0.0001, 0.0000 +LeftForeArm, 27.4788, -0.0001, 0.0000 +LeftHand, 25.8947, -0.0001, 0.0000 +LeftHand_End, 10.0000, -0.0000, 0.0000 +RightShoulder, 0.0000, 22.3894, 0.0000 +RightArm, -18.5716, -0.0001, 0.0000 +RightForeArm, -27.4788, -0.0001, 0.0000 +RightHand, -25.8947, -0.0001, 0.0000 +RightHand_End, -13.7000, -0.0001, 0.0000 diff --git a/data/test/character/joint_pos/Skeletonzombie_T_Avelange.txt b/data/test/character/joint_pos/Skeletonzombie_T_Avelange.txt new file mode 100644 index 0000000000000000000000000000000000000000..b12a241a3900311e9dc263e1d9a6ce9f230536e7 --- /dev/null +++ b/data/test/character/joint_pos/Skeletonzombie_T_Avelange.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0004, 10.7175, -0.9311 +Spine1, -0.0000, 10.5853, -0.4285 +Spine2, -0.0000, 10.5993, -0.7813 +Neck, -0.0000, 26.2403, -4.4881 +Head, -0.0000, 17.4668, 5.6257 +Head_End, -0.0000, 10.9612, 0.0000 +LeftShoulder, 10.5744, 23.0092, -7.3230 +LeftArm, 14.8782, -4.6533, -3.0693 +LeftForeArm, 24.1090, -0.0000, -0.0000 +LeftHand, 31.6792, -0.0000, -0.0001 +LeftHand_End, 21.8026, -0.0000, -0.0000 +RightShoulder, -10.5744, 23.0091, -7.3230 +RightArm, -14.8781, -4.6532, -3.0693 +RightForeArm, -24.1090, -0.0000, 0.0000 +RightHand, -31.6793, -0.0000, 0.0000 +RightHand_End, -21.8027, -0.0000, -0.0000 +LeftUpLeg, 12.2975, -6.7421, -1.0003 +LeftLeg, 0.0000, -45.7062, 0.8988 +LeftFoot, 0.0000, -50.0094, -3.9353 +LeftToeBase, 2.5951, -14.2551, 19.5076 +LeftToeBase_End, 1.0732, -0.0035, 11.3623 +RightUpLeg, -12.2975, -6.7417, -1.0003 +RightLeg, 0.0002, -45.7066, 0.8990 +RightFoot, -0.0002, -50.0094, -3.9357 +RightToeBase, -2.5950, -14.2553, 19.5075 +RightToeBase_End, -1.0733, -0.0035, 11.3624 diff --git a/data/test/character/joint_pos/The_Boss.txt b/data/test/character/joint_pos/The_Boss.txt new file mode 100644 index 0000000000000000000000000000000000000000..f0c19152fcd3956dae55d2abc4a3857cd409fbdd --- /dev/null +++ b/data/test/character/joint_pos/The_Boss.txt @@ -0,0 +1,28 @@ +Hips, 0, 0, 0 +Spine, 0.0000, 9.2263, 1.5771 +Spine1, -0.0000, 16.2540, -0.1656 +Spine2, -0.0000, 13.6397, -1.2923 +Neck, -0.0000, 13.8774, -4.3542 +Neck1, -0.0000, 4.3400, 0.9269 +Head, -0.0000, 4.0266, 0.8585 +Head_End, 0.0094, 38.4052, 9.5878 +LeftShoulder, 6.1442, 10.1870, -3.7932 +LeftArm, 12.2981, -1.0780, -1.7307 +LeftForeArm, 27.6870, -0.0000, -0.0000 +LeftHand, 27.8948, -0.0000, 0.0000 +LeftHand_End, 10.4910, -0.0000, -0.0000 +RightShoulder, -6.1442, 10.1872, -3.7932 +RightArm, -12.2981, -1.0782, -1.7307 +RightForeArm, -27.6870, -0.0000, -0.0000 +RightHand, -27.8948, -0.0000, 0.0000 +RightHand_End, -10.4910, -0.0000, -0.0000 +LeftUpLeg, 9.6338, -3.2733, -0.0000 +LeftLeg, 0.0046, -41.8331, -0.3419 +LeftFoot, -0.0047, -38.8790, -2.2358 +LeftToeBase, -0.4545, -12.4220, 8.7480 +LeftToeBase_End, 1.6605, 0.0238, 18.4253 +RightUpLeg, -9.6338, -3.2732, 0.0000 +RightLeg, -0.0046, -41.8331, -0.3413 +RightFoot, 0.0047, -38.8790, -2.2364 +RightToeBase, 0.4545, -12.4220, 8.7480 +RightToeBase_End, -1.6605, 0.0238, 18.4253 diff --git a/data/test/character/joint_pos/TotalCapture_S1_acting2_BlenderZXY_YmZ_3.txt b/data/test/character/joint_pos/TotalCapture_S1_acting2_BlenderZXY_YmZ_3.txt new file mode 100644 index 0000000000000000000000000000000000000000..f1b1a3efc345a4fdfe721e49bbf97855f3f6b866 --- /dev/null +++ b/data/test/character/joint_pos/TotalCapture_S1_acting2_BlenderZXY_YmZ_3.txt @@ -0,0 +1,28 @@ +Hips, 0, 0, 0 +Spine, 0.0000, 6.9257, -4.6171 +Spine1, 0.0000, 9.0940, -1.6035 +Spine2, 0.0000, 9.1991, -0.8048 +Spine3, 0.0000, 9.2342, -0.0000 +Neck, -0.0000, 24.2399, 3.4628 +Head, -0.0000, 12.5042, 2.2048 +Head_End, -0.0000, 14.9480, -0.0000 +RightShoulder, -2.9176, 15.7553, 4.8628 +RightArm, -14.4910, 0.0000, -0.0000 +RightForeArm, -28.8868, -0.0000, -0.0000 +RightHand, -21.9603, 0.0000, -0.0000 +RightHand_End, -6.5893, 0.0000, -0.0000 +LeftShoulder, 2.9176, 15.7553, 4.8628 +LeftArm, 14.4910, 0.0000, 0.0000 +LeftForeArm, 28.8868, 0.0000, 0.0000 +LeftHand, 21.9603, 0.0000, 0.0000 +LeftHand_End, 6.5893, 0.0000, 0.0000 +RightUpLeg, -8.6557, -2.5286, -0.0000 +RightLeg, 0.0000, -37.8891, 0.0000 +RightFoot, 0.0000, -37.5438, 0.0000 +RightToeBase, -0.0000, -5.2423, 14.4031 +RightToeBase_End, 0.0000, 0.0000, 7.0024 +LeftUpLeg, 8.6557, -2.5286, 0.0000 +LeftLeg, 0.0000, -37.8891, 0.0000 +LeftFoot, 0.0000, -37.5438, 0.0000 +LeftToeBase, -0.0000, -5.2423, 14.4031 +LeftToeBase_End, 0.0000, 0.0000, 7.0024 diff --git a/data/test/character/joint_pos/Ty.txt b/data/test/character/joint_pos/Ty.txt new file mode 100644 index 0000000000000000000000000000000000000000..3bace9e0f46aa9e6e20e7c7beb7d2bb0319d129c --- /dev/null +++ b/data/test/character/joint_pos/Ty.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0000, 7.7220, 1.1662 +Spine1, -0.0007, 9.5949, 0.2614 +Spine2, -0.0008, 11.0366, -0.5075 +Neck, -0.0016, 21.6844, -3.0966 +Head, -0.0007, 8.9184, 1.0073 +Head_End, -0.0000, 62.3630, 0.0000 +LeftShoulder, 4.2174, 16.5609, -4.0611 +LeftArm, 5.3010, 0.6692, -1.7023 +LeftForeArm, 21.8692, 0.0000, 0.0000 +LeftHand, 23.8653, 0.0000, -0.0000 +LeftHand_End, 12.1345, 0.0000, -0.0000 +RightShoulder, -4.2174, 16.5613, -4.0611 +RightArm, -5.3010, 0.6688, -1.7023 +RightForeArm, -21.8692, -0.0001, 0.0000 +RightHand, -23.8653, -0.0000, -0.0001 +RightHand_End, -12.1344, -0.0000, -0.0000 +LeftUpLeg, 8.2670, -4.7955, -0.3791 +LeftLeg, 0.0001, -33.8313, 0.1084 +LeftFoot, -0.0001, -33.1907, -2.3255 +LeftToeBase, 0.9476, -12.8256, 13.9860 +LeftToeBase_End, 0.5071, -0.0064, 13.6093 +RightUpLeg, -8.2670, -4.7955, -0.3791 +RightLeg, -0.0001, -33.8313, 0.1079 +RightFoot, 0.0001, -33.1907, -2.3251 +RightToeBase, -0.9476, -12.8257, 13.9858 +RightToeBase_End, -0.5071, -0.0066, 13.6096 diff --git a/data/test/character/joint_pos/Vampire_A_Lusth.txt b/data/test/character/joint_pos/Vampire_A_Lusth.txt new file mode 100644 index 0000000000000000000000000000000000000000..00eb806d9f13610d082bc53f17b5c61f5b6a1db6 --- /dev/null +++ b/data/test/character/joint_pos/Vampire_A_Lusth.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0720, 7.2573, -0.7897 +Spine1, -0.0000, 8.5202, -0.8109 +Spine2, -0.0000, 29.1814, -1.0482 +Neck, -0.0000, 13.8579, 7.4053 +Head, -0.0000, 8.1985, 5.7031 +Head_End, -0.0000, 17.7608, 13.3327 +LeftShoulder, 12.5849, 11.3952, -1.4531 +LeftArm, 13.9096, -6.1318, 1.8992 +LeftForeArm, 34.1093, 0.0000, 0.0001 +LeftHand, 41.0760, -0.0000, 0.0001 +LeftHand_End, 17.9251, 0.0000, -0.0000 +RightShoulder, -12.5849, 11.3949, -1.4531 +RightArm, -13.9097, -6.1315, 1.8992 +RightForeArm, -34.1093, -0.0001, 0.0001 +RightHand, -41.0760, -0.0001, 0.0001 +RightHand_End, -17.9245, -0.0000, -0.0000 +LeftUpLeg, 13.0269, -6.3363, -1.0928 +LeftLeg, 0.0000, -45.8922, 9.9146 +LeftFoot, 0.0000, -53.5314, -13.1041 +LeftToeBase, -0.0000, -15.9717, 16.2710 +LeftToeBase_End, 0.0000, -0.0059, 9.5960 +RightUpLeg, -12.8829, -6.3362, -1.0928 +RightLeg, 0.0000, -45.8923, 9.9147 +RightFoot, 0.0000, -53.5314, -13.1041 +RightToeBase, 0.0000, -15.9718, 16.2709 +RightToeBase_End, 0.0000, -0.0060, 9.5960 diff --git a/data/test/character/joint_pos/Warrok_W_Kurniawan.txt b/data/test/character/joint_pos/Warrok_W_Kurniawan.txt new file mode 100644 index 0000000000000000000000000000000000000000..34b8fb6a45d5b3642d5080fc4b421830b7ea6757 --- /dev/null +++ b/data/test/character/joint_pos/Warrok_W_Kurniawan.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0000, 13.7848, 0.0644 +Spine1, -0.0000, 12.0175, 0.4059 +Spine2, -0.0000, 17.8107, 0.4301 +Neck, -0.0000, 39.1176, 11.9770 +Head, 0.0000, 14.5525, 15.6641 +Head_End, -0.0000, 15.6017, 7.5537 +LeftShoulder, 17.3995, 24.6142, 1.1579 +LeftArm, 18.9662, 5.7740, 1.8351 +LeftForeArm, 49.3013, 0.0001, -0.0000 +LeftHand, 31.6047, 0.0000, -0.0000 +LeftHand_End, 23.3345, 0.0000, 0.0000 +RightShoulder, -17.3995, 24.6143, 1.1579 +RightArm, -18.9662, 5.7739, 1.8351 +RightForeArm, -49.3013, 0.0000, 0.0000 +RightHand, -31.6050, -0.0000, -0.0000 +RightHand_End, -23.3340, -0.0000, 0.0000 +LeftUpLeg, 19.8991, -7.8851, -3.4295 +LeftLeg, 0.0001, -36.4905, 11.5766 +LeftFoot, -0.0001, -29.5379, -13.9914 +LeftToeBase, -0.0000, -22.5642, 15.0089 +LeftToeBase_End, -0.0000, 0.0101, 16.6320 +RightUpLeg, -19.8991, -7.8851, -3.4295 +RightLeg, 0.0000, -36.4905, 11.5767 +RightFoot, -0.0000, -29.5379, -13.9914 +RightToeBase, 0.0000, -22.5642, 15.0089 +RightToeBase_End, 0.0000, 0.0100, 16.6319 diff --git a/data/test/character/joint_pos/X_Bot.txt b/data/test/character/joint_pos/X_Bot.txt new file mode 100644 index 0000000000000000000000000000000000000000..9eeed039ca9e899164b0390040be06aa0137fdda --- /dev/null +++ b/data/test/character/joint_pos/X_Bot.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0000, 10.1816, 0.1315 +Spine1, 0.0000, 9.8940, -1.4707 +Spine2, 0.0000, 9.2208, -1.3706 +Neck, 0.0000, 16.7404, -2.0490 +Head, 0.0000, 9.6179, 1.6850 +Head_End, 0.0000, 23.1066, -2.8283 +RightShoulder, -4.5700, 11.0149, -2.1609 +RightArm, -10.5929, -0.5248, -2.2321 +RightForeArm, -27.8415, 0.0000, 0.0000 +RightHand, -28.3288, 0.0000, 0.0000 +RightHand_End, -9.5325, -0.0000, -0.0000 +LeftShoulder, 4.5705, 11.0147, -2.1609 +LeftArm, 10.5924, -0.5246, -2.2321 +LeftForeArm, 27.8415, 0.0000, -0.0000 +LeftHand, 28.3288, -0.0000, -0.0000 +LeftHand_End, 9.5334, 0.0000, 0.0000 +RightUpLeg, -8.2078, -6.7516, -1.5996 +RightLeg, -0.0000, -44.3696, 0.4056 +RightFoot, -0.0000, -44.4196, -3.1030 +RightToeBase, -0.0000, -8.7287, 10.7106 +RightToeBase_End, -0.0000, -0.0007, 9.2781 +LeftUpLeg, 8.2078, -6.7517, -1.5996 +LeftLeg, -0.0000, -44.3695, 0.4046 +LeftFoot, -0.0000, -44.4197, -3.1020 +LeftToeBase, -0.0000, -8.7287, 10.7106 +LeftToeBase_End, -0.0000, -0.0007, 9.2781 diff --git a/data/test/character/joint_pos/alex.txt b/data/test/character/joint_pos/alex.txt new file mode 100644 index 0000000000000000000000000000000000000000..3fbafe34c942f48c43a8fd589f481b9107bdf860 --- /dev/null +++ b/data/test/character/joint_pos/alex.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0032, 10.7299, -1.0902 +Spine1, 0.0000, 12.5182, -1.2720 +Spine2, 0.0000, 14.3066, -1.4537 +Neck, 0.0000, 16.0949, -1.6355 +Head, -0.0000, 6.7623, 3.0449 +Head_End, 0.0000, 22.9132, -0.0000 +LeftShoulder, 6.8022, 14.4938, -1.6277 +LeftArm, 13.9221, -3.1806, 0.0156 +LeftForeArm, 23.1803, -0.0002, 0.0001 +LeftHand, 25.2710, -0.0003, 0.0000 +LeftHand_End, 10.6303, 0.0000, -0.0000 +RightShoulder, -6.8022, 14.4939, -1.6433 +RightArm, -13.9221, -3.1806, -0.0157 +RightForeArm, -23.1804, 0.0001, -0.0001 +RightHand, -25.2712, -0.0000, 0.0001 +RightHand_End, -10.5110, 0.0000, -0.0001 +LeftUpLeg, 8.7091, -5.9608, -0.6263 +LeftLeg, 0.6898, -40.1339, -0.5920 +LeftFoot, -0.6892, -36.7140, -1.7596 +LeftToeBase, 1.0052, -9.8919, 13.6549 +LeftToeBase_End, 0.8611, 0.2852, 7.1860 +RightUpLeg, -8.7055, -5.9660, -0.4447 +RightLeg, -0.6898, -40.1313, -0.8028 +RightFoot, 0.6894, -36.7116, -1.7304 +RightToeBase, -1.0052, -9.8917, 14.3335 +RightToeBase_End, -0.8611, 0.2853, 7.3708 diff --git a/data/test/character/joint_pos/brady.txt b/data/test/character/joint_pos/brady.txt new file mode 100644 index 0000000000000000000000000000000000000000..1642f75a51166048c15106d0df2032b3c39d354d --- /dev/null +++ b/data/test/character/joint_pos/brady.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0018, 9.4998, -0.8709 +Spine1, -0.0000, 11.0831, -1.0161 +Spine2, -0.0000, 12.6664, -1.1612 +Neck, -0.0000, 14.2497, -1.3064 +Head, 0.0000, 4.4955, 1.4174 +Head_End, -0.0000, 23.1766, -0.0000 +LeftShoulder, 6.1167, 12.7049, -1.3391 +LeftArm, 12.4663, -3.0498, -0.0654 +LeftForeArm, 22.3881, 0.0000, -0.0000 +LeftHand, 25.1276, 0.0001, 0.0000 +LeftHand_End, 9.8489, 0.0000, 0.0000 +RightShoulder, -6.1167, 12.7049, -1.2736 +RightArm, -12.4663, -3.0501, 0.0655 +RightForeArm, -22.3956, -0.0002, 0.0000 +RightHand, -25.1165, -0.0003, 0.0000 +RightHand_End, -10.3998, -0.0000, -0.0000 +LeftUpLeg, 8.8528, -5.2716, -0.2605 +LeftLeg, 0.9521, -47.6063, -0.1844 +LeftFoot, -0.9514, -47.3527, -2.8734 +LeftToeBase, 1.7910, -9.7684, 14.0545 +LeftToeBase_End, 0.8678, 0.1778, 6.2040 +RightUpLeg, -8.8508, -5.2749, -0.5070 +RightLeg, -0.9522, -47.5785, -0.0470 +RightFoot, 0.9513, -47.3745, -2.7638 +RightToeBase, -1.7911, -9.7694, 13.9210 +RightToeBase_End, -0.8678, 0.1773, 6.1731 diff --git a/data/test/character/joint_pos/gas_mask.txt b/data/test/character/joint_pos/gas_mask.txt new file mode 100644 index 0000000000000000000000000000000000000000..6a62f29bed433e79decdb207f673d7e6c36f16c9 --- /dev/null +++ b/data/test/character/joint_pos/gas_mask.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0014, 9.4656, -1.1791 +Spine1, 0.0000, 11.0432, -1.3756 +Spine2, 0.0000, 12.6208, -1.5721 +Neck, 0.0000, 14.1984, -1.7686 +Head, -0.0000, 4.9410, 2.5000 +Head_End, 0.0000, 25.3716, -0.0000 +LeftShoulder, 7.0804, 12.3326, -1.7819 +LeftArm, 14.2026, -3.6740, -0.0266 +LeftForeArm, 20.6401, -0.0000, 0.0000 +LeftHand, 27.0119, -0.0000, 0.0000 +LeftHand_End, 11.2462, -0.0001, -0.0000 +RightShoulder, -7.0804, 12.3326, -1.7553 +RightArm, -14.2026, -3.6740, 0.0266 +RightForeArm, -20.7486, -0.0001, -0.0000 +RightHand, -27.0706, -0.0002, 0.0000 +RightHand_End, -11.2351, -0.0001, 0.0000 +LeftUpLeg, 9.8309, -5.2689, -0.6028 +LeftLeg, 0.0322, -40.3268, 0.0543 +LeftFoot, -0.0300, -43.6002, -2.4957 +LeftToeBase, 1.4492, -10.9529, 12.9998 +LeftToeBase_End, 0.8053, -0.0384, 6.2658 +RightUpLeg, -9.8324, -5.2660, -0.1773 +RightLeg, -0.0323, -40.3423, -0.0805 +RightFoot, 0.0299, -43.5905, -2.7870 +RightToeBase, -1.4492, -10.9526, 12.5700 +RightToeBase_End, -0.8053, -0.0383, 6.1015 diff --git a/data/test/character/joint_pos/louise.txt b/data/test/character/joint_pos/louise.txt new file mode 100644 index 0000000000000000000000000000000000000000..daaa92f25676027431272d41dc8eb259d18e3399 --- /dev/null +++ b/data/test/character/joint_pos/louise.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0005, 9.1247, -0.3030 +Spine1, 0.0000, 10.6455, -0.3535 +Spine2, 0.0000, 12.1663, -0.4040 +Neck, 0.0000, 13.6871, -0.4546 +Head, -0.0000, 9.0163, 1.2731 +Head_End, 0.0000, 20.9865, -0.0000 +LeftShoulder, 6.0652, 11.9400, -0.4478 +LeftArm, 12.2659, -3.4416, 0.0135 +LeftForeArm, 22.4020, -0.0002, 0.0000 +LeftHand, 24.9136, -0.0002, -0.0000 +LeftHand_End, 9.1378, -0.0000, 0.0000 +RightShoulder, -6.0652, 11.9400, -0.4613 +RightArm, -12.2659, -3.4415, -0.0135 +RightForeArm, -22.3932, 0.0001, 0.0000 +RightHand, -24.9127, 0.0001, 0.0000 +RightHand_End, -9.0799, 0.0001, -0.0000 +LeftUpLeg, 9.8106, -5.0725, -0.0002 +LeftLeg, -0.5024, -44.8540, 0.2027 +LeftFoot, 0.5027, -35.2047, -2.7596 +LeftToeBase, 0.9350, -14.2979, 10.7464 +LeftToeBase_End, 0.6383, 0.0926, 4.9625 +RightUpLeg, -9.8111, -5.0715, 0.1503 +RightLeg, 0.5023, -44.8604, 0.1266 +RightFoot, -0.5027, -35.2002, -2.8343 +RightToeBase, -0.9349, -14.2973, 10.8836 +RightToeBase_End, -0.6383, 0.0931, 5.0089 diff --git a/data/test/character/joint_pos/megan.txt b/data/test/character/joint_pos/megan.txt new file mode 100644 index 0000000000000000000000000000000000000000..2a9971d513aa49274952bc137f83571035c622f1 --- /dev/null +++ b/data/test/character/joint_pos/megan.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0002, 8.9512, -0.2866 +Spine1, -0.0000, 10.4430, -0.3344 +Spine2, -0.0000, 11.9349, -0.3822 +Neck, -0.0000, 13.4267, -0.4300 +Head, 0.0000, 8.4773, 0.4431 +Head_End, -0.0000, 21.3358, -0.0000 +LeftShoulder, 5.2253, 11.8959, -0.4276 +LeftArm, 10.4146, -2.9829, 0.0047 +LeftForeArm, 25.5103, 0.0001, -0.0000 +LeftHand, 24.5062, 0.0001, -0.0000 +LeftHand_End, 9.0831, -0.0000, 0.0000 +RightShoulder, -5.2253, 11.8959, -0.4323 +RightArm, -10.4147, -2.9829, -0.0047 +RightForeArm, -25.5089, 0.0001, -0.0000 +RightHand, -24.5072, 0.0000, -0.0000 +RightHand_End, -9.0254, 0.0001, 0.0000 +LeftUpLeg, 8.8998, -4.9695, -0.7816 +LeftLeg, 0.2438, -42.8628, 0.3591 +LeftFoot, -0.2435, -42.7259, -3.0818 +LeftToeBase, 0.3577, -8.5477, 13.2918 +LeftToeBase_End, 0.3066, 0.1621, 6.4260 +RightUpLeg, -8.8995, -4.9700, -0.9539 +RightLeg, -0.2439, -42.8600, 0.4529 +RightFoot, 0.2434, -42.7281, -3.0034 +RightToeBase, -0.3577, -8.5477, 13.3323 +RightToeBase_End, -0.3066, 0.1621, 6.5186 diff --git a/data/test/character/joint_pos/morak.txt b/data/test/character/joint_pos/morak.txt new file mode 100644 index 0000000000000000000000000000000000000000..4feedf82269c267f528d6ec0b531af5bffa31d37 --- /dev/null +++ b/data/test/character/joint_pos/morak.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0076, 11.6547, -0.7800 +Spine1, 0.0000, 13.5972, -0.9097 +Spine2, 0.0000, 15.5396, -1.0396 +Neck, 0.0000, 17.4821, -1.1696 +Head, 0.0000, 0.5541, 0.2889 +Head_End, 0.0000, 27.5643, -0.0000 +LeftShoulder, 7.3859, 16.3590, -1.2186 +LeftArm, 14.5818, -1.9036, -0.0981 +LeftForeArm, 23.4930, -0.0001, -0.0000 +LeftHand, 27.6585, -0.0001, 0.0000 +LeftHand_End, 9.9590, -0.0001, 0.0001 +RightShoulder, -7.3859, 16.3590, -1.1205 +RightArm, -14.5819, -1.9030, 0.0981 +RightForeArm, -23.5271, 0.0009, -0.0001 +RightHand, -27.6557, 0.0011, -0.0001 +RightHand_End, -10.4301, 0.0003, -0.0001 +LeftUpLeg, 11.5460, -6.4920, 0.0444 +LeftLeg, -1.0131, -42.5711, -0.7466 +LeftFoot, 1.0212, -36.7977, -1.3389 +LeftToeBase, 4.0507, -11.9356, 14.3512 +LeftToeBase_End, 1.9320, -0.2182, 7.2026 +RightUpLeg, -11.5544, -6.4770, 0.9633 +RightLeg, 1.0103, -42.6772, -0.0573 +RightFoot, -1.0205, -36.7133, -2.9496 +RightToeBase, -4.0507, -11.9351, 14.6162 +RightToeBase_End, -1.9320, -0.2179, 6.9809 diff --git a/data/test/character/joint_pos/mousey.txt b/data/test/character/joint_pos/mousey.txt new file mode 100644 index 0000000000000000000000000000000000000000..d6e99e444c77288b15263389fa18d297a8b2b9b0 --- /dev/null +++ b/data/test/character/joint_pos/mousey.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0005, 6.8761, 0.1257 +Spine1, -0.0000, 8.0221, 0.1466 +Spine2, -0.0000, 9.1681, 0.1675 +Neck, -0.0000, 10.3141, 0.1885 +Head, -0.0000, 7.6438, -2.3774 +Head_End, -0.0000, 45.8578, -0.0000 +LeftShoulder, 4.3922, 8.8250, 0.1750 +LeftArm, 8.7712, -2.9816, -0.0270 +LeftForeArm, 8.5129, -0.0000, 0.0000 +LeftHand, 18.4847, 0.0000, -0.0000 +LeftHand_End, 8.5640, 0.0000, 0.0000 +RightShoulder, -4.3922, 8.8250, 0.1414 +RightArm, -8.7711, -2.9820, -0.0942 +RightForeArm, -8.4946, -0.0003, -0.0000 +RightHand, -18.4838, -0.0006, -0.0000 +RightHand_End, -8.1782, -0.0003, -0.0000 +LeftUpLeg, 10.2057, -3.8228, 0.1554 +LeftLeg, 0.7278, -12.8366, 2.0132 +LeftFoot, -0.7257, -10.5426, -2.9107 +LeftToeBase, 0.1081, -7.1911, 7.5602 +LeftToeBase_End, 0.0702, 0.0817, 4.4903 +RightUpLeg, -10.2051, -3.8243, 0.0053 +RightLeg, -0.7234, -12.8397, 2.0072 +RightFoot, 0.7249, -10.5379, -2.7544 +RightToeBase, -0.1082, -7.1910, 7.3729 +RightToeBase_End, -0.0702, 0.0817, 4.4794 diff --git a/data/test/character/joint_pos/ortiz.txt b/data/test/character/joint_pos/ortiz.txt new file mode 100644 index 0000000000000000000000000000000000000000..d65b7f41cd682595413c860ecdf0d59f9f434801 --- /dev/null +++ b/data/test/character/joint_pos/ortiz.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, -0.0007, 14.6857, -1.7347 +Spine1, -0.0000, 17.1333, -2.0238 +Spine2, -0.0000, 19.5809, -2.3130 +Neck, -0.0000, 22.0286, -2.6021 +Head, 0.0000, 7.7723, 1.1677 +Head_End, -0.0000, 26.8158, -0.0000 +LeftShoulder, 11.6466, 18.5134, -2.5838 +LeftArm, 23.5442, -6.6144, 0.0365 +LeftForeArm, 22.7567, -0.0000, -0.0000 +LeftHand, 32.2383, -0.0000, -0.0000 +LeftHand_End, 12.1781, -0.0001, -0.0000 +RightShoulder, -11.6466, 18.5134, -2.6203 +RightArm, -23.5442, -6.6145, -0.0365 +RightForeArm, -22.7594, -0.0000, 0.0000 +RightHand, -32.2381, 0.0000, 0.0000 +RightHand_End, -12.1684, 0.0000, 0.0000 +LeftUpLeg, 13.5813, -8.1486, -1.7960 +LeftLeg, 1.7740, -36.0406, 0.6460 +LeftFoot, -1.7713, -26.5897, -2.7562 +LeftToeBase, -1.1925, -6.5817, 13.4037 +LeftToeBase_End, -0.3513, -0.1639, 5.9380 +RightUpLeg, -13.5805, -8.1499, -2.2554 +RightLeg, -1.7749, -36.0115, 0.8479 +RightFoot, 1.7737, -26.6175, -2.4978 +RightToeBase, 1.1924, -6.5824, 13.3722 +RightToeBase_End, 0.3513, -0.1643, 5.9136 diff --git a/data/test/character/joint_pos/racer.txt b/data/test/character/joint_pos/racer.txt new file mode 100644 index 0000000000000000000000000000000000000000..47af9fafdc677ff446f59de070de6012a5d1662b --- /dev/null +++ b/data/test/character/joint_pos/racer.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0036, 10.2366, -0.9853 +Spine1, -0.0000, 11.9427, -1.1496 +Spine2, -0.0000, 13.6488, -1.3138 +Neck, -0.0000, 15.3550, -1.4781 +Head, 0.0000, 3.7798, 1.3459 +Head_End, -0.0000, 26.5867, 0.0000 +LeftShoulder, 6.1913, 13.5676, -1.4825 +LeftArm, 12.6531, -3.4220, -0.0089 +LeftForeArm, 27.0717, 0.0000, -0.0000 +LeftHand, 25.5677, 0.0000, -0.0000 +LeftHand_End, 10.0967, -0.0001, 0.0000 +RightShoulder, -6.1913, 13.5678, -1.4737 +RightArm, -12.6531, -3.4220, 0.0089 +RightForeArm, -27.0696, -0.0004, 0.0000 +RightHand, -25.5654, -0.0001, -0.0000 +RightHand_End, -10.1165, -0.0001, -0.0000 +LeftUpLeg, 9.1473, -5.6949, -0.2099 +LeftLeg, 0.3677, -40.8869, -0.9520 +LeftFoot, -0.3669, -38.9323, -1.7347 +LeftToeBase, 3.2669, -11.7303, 15.1272 +LeftToeBase_End, 1.6718, -0.0497, 6.7014 +RightUpLeg, -9.1513, -5.6884, -0.4554 +RightLeg, -0.3676, -40.8781, -0.5437 +RightFoot, 0.3669, -38.9475, -1.8980 +RightToeBase, -3.2669, -11.7311, 15.3070 +RightToeBase_End, -1.6718, -0.0501, 7.0108 diff --git a/data/test/character/joint_pos/suzie.txt b/data/test/character/joint_pos/suzie.txt new file mode 100644 index 0000000000000000000000000000000000000000..dcab92c6651a48896d026bdd7580f8e11aa4ce6a --- /dev/null +++ b/data/test/character/joint_pos/suzie.txt @@ -0,0 +1,27 @@ +Hips, 0, 0, 0 +Spine, 0.0002, 9.8929, -0.4310 +Spine1, 0.0000, 11.5417, -0.5029 +Spine2, 0.0000, 13.1905, -0.5747 +Neck, 0.0000, 14.8392, -0.6466 +Head, -0.0000, 7.3818, 2.1661 +Head_End, 0.0000, 22.2507, -0.0000 +LeftShoulder, 5.7757, 12.8267, -0.6546 +LeftArm, 11.5623, -4.0105, -0.0162 +LeftForeArm, 20.8009, -0.0000, -0.0000 +LeftHand, 27.5392, -0.0001, -0.0000 +LeftHand_End, 9.2766, -0.0000, -0.0000 +RightShoulder, -5.7757, 12.8267, -0.6385 +RightArm, -11.5623, -4.0104, 0.0162 +RightForeArm, -20.8143, 0.0000, -0.0000 +RightHand, -27.5440, -0.0000, 0.0000 +RightHand_End, -9.3015, 0.0000, 0.0000 +LeftUpLeg, 9.2068, -5.4891, -0.5199 +LeftLeg, 0.9394, -43.5035, -0.7410 +LeftFoot, -0.9395, -36.8215, -1.7532 +LeftToeBase, 0.4500, -9.9391, 12.4327 +LeftToeBase_End, 0.1670, -0.0211, 4.9483 +RightUpLeg, -9.2070, -5.4888, -0.4596 +RightLeg, -0.9393, -43.5038, -0.6880 +RightFoot, 0.9395, -36.8218, -1.8667 +RightToeBase, -0.4500, -9.9396, 12.3027 +RightToeBase_End, -0.1670, -0.0213, 4.8890 diff --git a/gradio/bvh_stick_viewer.py b/gradio/bvh_stick_viewer.py new file mode 100644 index 0000000000000000000000000000000000000000..43b835d092a96497c220bab5f0f6b73892e933d0 --- /dev/null +++ b/gradio/bvh_stick_viewer.py @@ -0,0 +1,498 @@ +""" +Fast BVH stick-figure viewer for the Gradio demo. + +The UI path is intentionally direct: + + BVH -> world-space joint positions JSON -> iframe srcdoc + +No MP4/PNG rendering, no generated HTML files, and no Gradio /file route. +""" +from __future__ import annotations + +import hashlib +import html +import json +import os +from typing import Any + +import numpy as np + + +GRADIO_DIR = os.path.dirname(os.path.abspath(__file__)) +THREE_MODULE_PATH = os.path.join(GRADIO_DIR, "static", "three", "three.module.js") +_THREE_SOURCE: str | None = None + + +def _load_three_source() -> str: + """Load Three.js once and inline it into the iframe module.""" + global _THREE_SOURCE + if _THREE_SOURCE is None: + with open(THREE_MODULE_PATH, "r", encoding="utf-8") as f: + source = f.read() + _THREE_SOURCE = source.replace(" tuple[np.ndarray, list[dict[str, Any]], float]: + """Load BVH and return world-space positions, joint metadata, and fps.""" + from fairmotion.data import bvh as bvh_loader + + motion = bvh_loader.load(bvh_path) + if motion.num_frames() == 0: + raise ValueError(f"BVH has no frames: {bvh_path}") + + positions = motion.to_matrix(local=False)[..., :3, 3].astype(np.float32) + joints = motion.skel.joints + name_to_idx = {joint.name: idx for idx, joint in enumerate(joints)} + + joint_data: list[dict[str, Any]] = [] + for joint in joints: + parent = -1 + if joint.parent_joint is not None: + parent = name_to_idx.get(joint.parent_joint.name, -1) + joint_data.append({"name": joint.name, "parent": parent}) + + return positions, joint_data, float(motion.fps or 20) + + +def bvh_to_stick_json( + bvh_path: str, + *, + max_frames: int = 300, + frame_stride: int = 1, + scale: float = 0.01, + precision: int = 5, +) -> dict[str, Any]: + """Convert a BVH file to the JSON contract consumed by the viewer.""" + if not bvh_path or not os.path.exists(bvh_path): + raise FileNotFoundError(f"BVH file does not exist: {bvh_path}") + if frame_stride < 1: + raise ValueError("frame_stride must be >= 1") + + positions, joints, fps = _load_bvh_motion(bvh_path) + positions = positions[::frame_stride] + if max_frames > 0: + positions = positions[:max_frames] + positions = positions * scale + if precision >= 0: + positions = np.round(positions, precision) + + return { + "fps": max(1, round(fps / frame_stride)), + "joints": joints, + "frames": positions.tolist(), + } + + +def _viewer_document(motion_data: dict[str, Any], title: str = "") -> str: + three_source = _load_three_source() + motion_json = json.dumps(motion_data, ensure_ascii=False, separators=(",", ":")) + motion_json = motion_json.replace("No motion data'); + throw new Error('No motion data'); +}} + +timeline.max = String(motionData.frames.length - 1); + +const scene = new Scene(); +scene.background = new Color(0x161616); + +const camera = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.001, 100000); +const renderer = new WebGLRenderer({{ antialias: true }}); +renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); +renderer.setSize(window.innerWidth, window.innerHeight); +renderer.outputColorSpace = SRGBColorSpace; +renderer.shadowMap.enabled = true; +container.appendChild(renderer.domElement); + +scene.add(new HemisphereLight(0xffffff, 0x303030, 2.1)); +const keyLight = new DirectionalLight(0xffffff, 2.2); +keyLight.position.set(4, 7, 5); +keyLight.castShadow = true; +scene.add(keyLight); + +function calculateBounds(frames) {{ + const min = new Vector3(Infinity, Infinity, Infinity); + const max = new Vector3(-Infinity, -Infinity, -Infinity); + for (const frame of frames) {{ + for (const p of frame) {{ + min.min(new Vector3(p[0], p[1], p[2])); + max.max(new Vector3(p[0], p[1], p[2])); + }} + }} + if (!Number.isFinite(min.x)) {{ + min.set(-1, 0, -1); + max.set(1, 2, 1); + }} + const size = new Vector3().subVectors(max, min); + const center = new Vector3().addVectors(min, max).multiplyScalar(0.5); + return {{ min, max, size, center, maxRange: Math.max(size.x, size.y, size.z, 0.001) }}; +}} + +function calculateFrameBounds(frame) {{ + const min = new Vector3(Infinity, Infinity, Infinity); + const max = new Vector3(-Infinity, -Infinity, -Infinity); + for (const p of frame) {{ + min.min(new Vector3(p[0], p[1], p[2])); + max.max(new Vector3(p[0], p[1], p[2])); + }} + if (!Number.isFinite(min.x)) {{ + min.set(-1, 0, -1); + max.set(1, 2, 1); + }} + const size = new Vector3().subVectors(max, min); + const center = new Vector3().addVectors(min, max).multiplyScalar(0.5); + return {{ min, max, size, center, maxRange: Math.max(size.x, size.y, size.z, 0.001) }}; +}} + +function median(values) {{ + if (!values.length) return 1; + const sorted = values.slice().sort((a, b) => a - b); + const mid = Math.floor(sorted.length / 2); + return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) * 0.5; +}} + +const bounds = calculateBounds(motionData.frames); +const frameBounds = motionData.frames.map(calculateFrameBounds); +const bodyRange = Math.max(median(frameBounds.map((frame) => frame.maxRange)), 0.001); +const floorSize = Math.max(bounds.maxRange * 1.6, bodyRange * 2.6, 1); +const floor = new Mesh( + new PlaneGeometry(floorSize, floorSize), + new MeshStandardMaterial({{ color: 0x242424, roughness: 0.86 }}) +); +floor.rotation.x = -Math.PI / 2; +floor.position.set(bounds.center.x, bounds.min.y - bounds.maxRange * 0.015, bounds.center.z); +floor.receiveShadow = true; +scene.add(floor); + +const grid = new GridHelper(floorSize, 20, 0x464646, 0x303030); +grid.position.copy(floor.position); +scene.add(grid); + +const target = frameBounds[0].center.clone(); +let yaw = Math.PI / 4; +let pitch = 0.42; +let distance = Math.max(bodyRange * 2.0, 1); + +function clamp(value, min, max) {{ + return Math.min(Math.max(value, min), max); +}} + +function updateCamera() {{ + const cp = Math.cos(pitch); + camera.position.set( + target.x + distance * cp * Math.sin(yaw), + target.y + distance * Math.sin(pitch), + target.z + distance * cp * Math.cos(yaw) + ); + camera.near = Math.max(bodyRange / 1000, 0.001); + camera.far = Math.max(bounds.maxRange * 30, bodyRange * 30, 100); + camera.lookAt(target); + camera.updateProjectionMatrix(); +}} +updateCamera(); + +let dragging = false; +let lastX = 0; +let lastY = 0; +renderer.domElement.addEventListener('pointerdown', (event) => {{ + dragging = true; + lastX = event.clientX; + lastY = event.clientY; + renderer.domElement.setPointerCapture(event.pointerId); +}}); +renderer.domElement.addEventListener('pointermove', (event) => {{ + if (!dragging) return; + const dx = event.clientX - lastX; + const dy = event.clientY - lastY; + lastX = event.clientX; + lastY = event.clientY; + yaw -= dx * 0.006; + pitch = clamp(pitch + dy * 0.006, -1.2, 1.2); + updateCamera(); +}}); +renderer.domElement.addEventListener('pointerup', (event) => {{ + dragging = false; + renderer.domElement.releasePointerCapture(event.pointerId); +}}); +renderer.domElement.addEventListener('wheel', (event) => {{ + event.preventDefault(); + distance = clamp(distance * (1 + event.deltaY * 0.001), bodyRange * 0.2, bodyRange * 12); + updateCamera(); +}}, {{ passive: false }}); + +const jointRadius = Math.min(Math.max(bodyRange * 0.012, 0.015), bodyRange * 0.045); +const stickRadius = Math.max(jointRadius * 0.32, bodyRange * 0.004); +const jointMaterial = new MeshStandardMaterial({{ color: 0x4fb3ff, roughness: 0.38 }}); +const rootMaterial = new MeshStandardMaterial({{ color: 0xff6f59, roughness: 0.38 }}); +const stickMaterial = new MeshStandardMaterial({{ color: 0xf2c14e, roughness: 0.5 }}); + +const joints = motionData.joints.map((joint) => {{ + const sphere = new Mesh( + new SphereGeometry(jointRadius, 20, 12), + joint.parent < 0 ? rootMaterial : jointMaterial + ); + sphere.name = joint.name; + sphere.castShadow = true; + scene.add(sphere); + return sphere; +}}); + +const sticks = motionData.joints.map((joint) => {{ + if (joint.parent < 0) return null; + const stick = new Mesh( + new CylinderGeometry(stickRadius, stickRadius, 1, 12), + stickMaterial + ); + stick.castShadow = true; + scene.add(stick); + return stick; +}}); + +const start = new Vector3(); +const end = new Vector3(); +const midpoint = new Vector3(); +const direction = new Vector3(); +const yAxis = new Vector3(0, 1, 0); + +function setStickBetween(stick, from, to) {{ + if (!stick) return; + start.fromArray(from); + end.fromArray(to); + direction.copy(end).sub(start); + const length = direction.length(); + if (length < 1e-8) {{ + stick.visible = false; + return; + }} + stick.visible = true; + midpoint.copy(start).add(end).multiplyScalar(0.5); + stick.position.copy(midpoint); + stick.scale.set(1, length, 1); + stick.quaternion.setFromUnitVectors(yAxis, direction.normalize()); +}} + +let currentFrame = 0; +let isPlaying = motionData.frames.length > 1; +let lastTimestamp = 0; +let frameAccumulator = 0; + +function updateFrame(frameIndex) {{ + const frame = motionData.frames[frameIndex]; + target.copy(frameBounds[frameIndex].center); + for (let i = 0; i < joints.length; i += 1) {{ + joints[i].position.fromArray(frame[i]); + }} + for (let child = 0; child < motionData.joints.length; child += 1) {{ + const parent = motionData.joints[child].parent; + if (parent >= 0) {{ + setStickBetween(sticks[child], frame[parent], frame[child]); + }} + }} + timeline.value = String(frameIndex); + frameLabel.textContent = `${{frameIndex}} / ${{motionData.frames.length - 1}}`; + updateCamera(); +}} + +window.__stickViewerDebug = {{ + getJointPositions: () => joints.map(joint => joint.position.toArray()), + getCurrentFrame: () => currentFrame, + getFrameCount: () => motionData.frames.length +}}; + +function animate(timestamp) {{ + requestAnimationFrame(animate); + if (!lastTimestamp) lastTimestamp = timestamp; + const delta = (timestamp - lastTimestamp) / 1000; + lastTimestamp = timestamp; + + if (isPlaying) {{ + frameAccumulator += delta * motionData.fps; + if (frameAccumulator >= 1) {{ + currentFrame = (currentFrame + Math.floor(frameAccumulator)) % motionData.frames.length; + frameAccumulator %= 1; + updateFrame(currentFrame); + }} + }} + renderer.render(scene, camera); +}} + +playPauseButton.addEventListener('click', () => {{ + isPlaying = !isPlaying; + playPauseButton.textContent = isPlaying ? 'II' : '>'; +}}); + +timeline.addEventListener('input', (event) => {{ + currentFrame = Number(event.target.value); + frameAccumulator = 0; + updateFrame(currentFrame); +}}); + +window.addEventListener('resize', () => {{ + camera.aspect = window.innerWidth / window.innerHeight; + renderer.setSize(window.innerWidth, window.innerHeight); + updateCamera(); +}}); + +updateFrame(currentFrame); +playPauseButton.textContent = isPlaying ? 'II' : '>'; +requestAnimationFrame(animate); +""" + viewer_js = "(() => {\n" + viewer_js + "\n})();" + viewer_js = viewer_js.replace(" + + + + + + + +
+
+
+ + +
0 / 0
+
+ + + +""" + + +def iframe_html_for_motion( + motion_data: dict[str, Any] | None, + *, + title: str = "", + height: int = 360, +) -> str: + """Wrap a viewer document in an iframe suitable for gr.HTML.""" + if not motion_data: + escaped = html.escape(title or "No motion available") + return ( + f'
' + f"{escaped}
" + ) + + document = _viewer_document(motion_data, title) + viewer_key = hashlib.sha1(document.encode("utf-8")).hexdigest()[:12] + escaped_doc = html.escape(document, quote=True) + return ( + f'' + ) + + +def get_bvh_viewer_html( + bvh_path: str, + *, + title: str = "", + height: int = 360, + max_frames: int = 300, + frame_stride: int = 1, +) -> str: + """Return Gradio-ready HTML for a BVH file.""" + try: + motion_data = bvh_to_stick_json( + bvh_path, + max_frames=max_frames, + frame_stride=frame_stride, + ) + except Exception as exc: + print(f"[viewer] Failed to load BVH: {bvh_path} {exc}") + motion_data = None + return iframe_html_for_motion(motion_data, title=title, height=height) diff --git a/gradio/config.py b/gradio/config.py new file mode 100644 index 0000000000000000000000000000000000000000..88dc1b429612bc3c2f5e197a60ea3f11800ecff9 --- /dev/null +++ b/gradio/config.py @@ -0,0 +1,215 @@ +""" +Gradio visualization config: paths and task data. +""" +import os + + +def _resolve_device(env_name, fallback='cpu'): + value = os.environ.get(env_name) + if value and value.strip(): + return value.strip() + return fallback + + +# ===== Base paths ===== +GRADIO_DIR = os.path.dirname(os.path.abspath(__file__)) +RELEASE_DIR = os.path.dirname(GRADIO_DIR) +DATA_DIR = os.path.join(RELEASE_DIR, 'data') +SRC_DIR = os.path.join(RELEASE_DIR, 'src') +MDM_DIR = os.path.join(SRC_DIR, 'mdm') +MOMASK_DIR = os.path.join(SRC_DIR, 'momask-preenc') + +# ===== BVH paths ===== +# Source motion BVHs generated by dec_same_2_bvh.py. +HUMAN_SRC_BVH_DIR = os.path.join(DATA_DIR, 'gradio_human', 'bvh') +ANIMO_SRC_BVH_DIR = os.path.join(DATA_DIR, 'gradio_animo', 'bvh') + +# Static target skeleton BVHs. +HUMAN_TGT_BVH_DIR = os.path.join(DATA_DIR, 'gradio_target_bvh', 'human') +ANIMO_TGT_BVH_DIR = os.path.join(DATA_DIR, 'gradio_target_bvh', 'animo') + +# ===== Z paths ===== +GRADIO_Z_DIR = os.path.join(DATA_DIR, 'gradio_z') +HUMAN_Z_DIR = os.path.join(GRADIO_Z_DIR, 'human') +ANIMO_Z_DIR = os.path.join(GRADIO_Z_DIR, 'animo') + +# ===== Skeleton paths ===== +GRADIO_SKEL_DIR = os.path.join(DATA_DIR, 'gradio_skel') +HUMAN_SKEL_DIR = os.path.join(GRADIO_SKEL_DIR, 'human', 'processed') +ANIMO_SKEL_DIR = os.path.join(GRADIO_SKEL_DIR, 'animo', 'processed') + +# ===== Model config ===== +MODEL_TYPE = 'vae' +MODEL_EPOCH = 'vae_merge' +DEVICE = _resolve_device('SATA_DEVICE', 'cpu') + +# ===== Output dir ===== +OUTPUT_DIR = os.path.join(GRADIO_DIR, 'output') +os.makedirs(OUTPUT_DIR, exist_ok=True) + + +# ───────────────────────────────────────────────────────────── +# Task 1: Human -> Human +# ───────────────────────────────────────────────────────────── +TASK1_Z_OPTIONS = { + '000327': { + 'label': 'Pick up and raise', + 'z_path': os.path.join(HUMAN_Z_DIR, '000327.pt'), + 'src_bvh': os.path.join(HUMAN_SRC_BVH_DIR,'000327.bvh'), + 'name': '000327', + }, + '000419': { + 'label': 'Wave', + 'z_path': os.path.join(HUMAN_Z_DIR, '000419.pt'), + 'src_bvh': os.path.join(HUMAN_SRC_BVH_DIR,'000419.bvh'), + 'name': '000419', + }, + '000708': { + 'label': 'Jump', + 'z_path': os.path.join(HUMAN_Z_DIR, '000708.pt'), + 'src_bvh': os.path.join(HUMAN_SRC_BVH_DIR,'000708.bvh'), + 'name': '000708', + }, + '000926': { + 'label': 'Shaking arms', + 'z_path': os.path.join(HUMAN_Z_DIR, '000926.pt'), + 'src_bvh': os.path.join(HUMAN_SRC_BVH_DIR,'000926.bvh'), + 'name': '000926', + }, +} + +TASK1_SKEL_OPTIONS = { + 'guard': { + 'skel_path': os.path.join(HUMAN_SKEL_DIR, 'guard.npz'), + 'tgt_bvh': os.path.join(HUMAN_TGT_BVH_DIR, 'guard.bvh'), + 'name': 'guard', + }, + 'amy': { + 'skel_path': os.path.join(HUMAN_SKEL_DIR, 'amy.npz'), + 'tgt_bvh': os.path.join(HUMAN_TGT_BVH_DIR, 'amy.bvh'), + 'name': 'amy', + }, + 'mousey': { + 'skel_path': os.path.join(HUMAN_SKEL_DIR, 'mousey.npz'), + 'tgt_bvh': os.path.join(HUMAN_TGT_BVH_DIR, 'mousey.bvh'), + 'name': 'mousey', + }, +} + + +# ───────────────────────────────────────────────────────────── +# Task 2: Animo -> Animo +# ───────────────────────────────────────────────────────────── +TASK2_Z_OPTIONS = { + 'dromedary_camel (run to stand turn)': { + 'label': 'dromedary camel (run to stand turn)', + 'z_path': os.path.join(ANIMO_Z_DIR, 'dromedary_camel_male_runtostandturnl.pt'), + 'src_bvh': os.path.join(ANIMO_SRC_BVH_DIR,'dromedary_camel_male_runtostandturnl.bvh'), + 'name': 'dromedary_camel_male_runtostandturnl', + }, + 'arctic_wolf (fight flee)': { + 'label': 'arctic wolf (fight flee)', + 'z_path': os.path.join(ANIMO_Z_DIR, 'arctic_wolf_female_fightflee.pt'), + 'src_bvh': os.path.join(ANIMO_SRC_BVH_DIR,'arctic_wolf_female_fightflee.bvh'), + 'name': 'arctic_wolf_female_fightflee', + }, +} + +TASK2_SKEL_OPTIONS = { + 'malayan_tapir (stand idle)': { + 'label': 'malayan tapir', + 'skel_path': os.path.join(ANIMO_SKEL_DIR, 'malayan_tapir_male_standidle01.npz'), + 'tgt_bvh': os.path.join(ANIMO_TGT_BVH_DIR, 'malayan_tapir_male_standidle01.bvh'), + 'name': 'malayan_tapir_male_standidle01', + }, + 'dama_gazelle (run to stand turn)': { + 'label': 'dama gazelle', + 'skel_path': os.path.join(ANIMO_SKEL_DIR, 'dama_gazelle_male_runtostandturnl.npz'), + 'tgt_bvh': os.path.join(ANIMO_TGT_BVH_DIR, 'dama_gazelle_male_runtostandturnl.bvh'), + 'name': 'dama_gazelle_male_runtostandturnl', + }, +} + + +# ───────────────────────────────────────────────────────────── +# Task 3: Human -> Animo +# ───────────────────────────────────────────────────────────── +TASK3_PAIRS = { + '000708 -> wisent': { + 'label': 'Jump -> wisent', + 'z_path': os.path.join(HUMAN_Z_DIR, '000708.pt'), + 'skel_path': os.path.join(ANIMO_SKEL_DIR, 'wisent_male_attackfence.npz'), + 'src_bvh': os.path.join(HUMAN_SRC_BVH_DIR,'000708.bvh'), + 'tgt_bvh': os.path.join(ANIMO_TGT_BVH_DIR,'wisent_male_attackfence.bvh'), + 'output_name':'000708__wisent_male_attackfence', + }, + '000926 -> dama_gazelle': { + 'label': 'Shaking arms -> dama gazelle', + 'z_path': os.path.join(HUMAN_Z_DIR, '000926.pt'), + 'skel_path': os.path.join(ANIMO_SKEL_DIR, 'dama_gazelle_male_runtostandturnl.npz'), + 'src_bvh': os.path.join(HUMAN_SRC_BVH_DIR,'000926.bvh'), + 'tgt_bvh': os.path.join(ANIMO_TGT_BVH_DIR,'dama_gazelle_male_runtostandturnl.bvh'), + 'output_name':'000926__dama_gazelle_male_runtostandturnl', + }, +} + + +# ───────────────────────────────────────────────────────────── +# ===== Generation config ===== +# ───────────────────────────────────────────────────────────── + +# Human text-to-latent checkpoints. +MDM_HUMAN_MODEL_PATH = os.path.join(MDM_DIR, 'save', 'paper_vae_human_0125', 'model000100000.pt') + +MOMASK_HUMAN_NAME = 't2m_base' +MOMASK_HUMAN_RES_NAME = 't2m_rvq' +MOMASK_HUMAN_CHECKPOINTS_DIR = os.path.join(MOMASK_DIR, 'checkpoints') + +# SAME decoders for generated latent/code streams. +SATA_HUMAN_GEN_EPOCH = 'vae_human/390' +SATA_HUMAN_RVQ_GEN_EPOCH = 'rvq_human' + +# Device for generation. +GEN_DEVICE = _resolve_device('SATA_GEN_DEVICE', DEVICE) +GEN_DEFAULT_MOTION_SECONDS = 6.0 +GEN_DEFAULT_MOTION_FRAMES = int(GEN_DEFAULT_MOTION_SECONDS * 20) +GEN_MIN_MOTION_FRAMES = 40 +GEN_MAX_MOTION_FRAMES = 200 +GEN_GUIDANCE_PARAM = 2.5 +GEN_SEED = 10 + +GEN_MODEL_OPTIONS = { + 'VAE': 'vae', + 'RVQ': 'rvq', +} + +RVQ_COND_SCALE = 4.0 +RVQ_TIME_STEPS = 18 +RVQ_TEMPERATURE = 1.0 +RVQ_TOPKR = 0.9 +RVQ_UNIT_LENGTH = 1 + +# Human generation reuses the same target skeletons as Task 1 retarget. +HUMAN_GEN_SKEL_OPTIONS = TASK1_SKEL_OPTIONS + +# ───────────────────────────────────────────────────────────── +# Task 4: Animo -> Human +# ───────────────────────────────────────────────────────────── +TASK4_PAIRS = { + 'arctic_wolf (fight flee) -> guard': { + 'label': 'arctic wolf (fight flee) -> guard', + 'z_path': os.path.join(ANIMO_Z_DIR, 'arctic_wolf_female_fightflee.pt'), + 'skel_path': os.path.join(HUMAN_SKEL_DIR, 'guard.npz'), + 'src_bvh': os.path.join(ANIMO_SRC_BVH_DIR,'arctic_wolf_female_fightflee.bvh'), + 'tgt_bvh': os.path.join(HUMAN_TGT_BVH_DIR,'guard.bvh'), + 'output_name':'arctic_wolf_female_fightflee__guard', + }, + 'arctic_wolf (fight taunt) -> mousey': { + 'label': 'arctic wolf (fight taunt) -> mousey', + 'z_path': os.path.join(ANIMO_Z_DIR, 'arctic_wolf_female_fighttaunt.pt'), + 'skel_path': os.path.join(HUMAN_SKEL_DIR, 'mousey.npz'), + 'src_bvh': os.path.join(ANIMO_SRC_BVH_DIR,'arctic_wolf_female_fighttaunt.bvh'), + 'tgt_bvh': os.path.join(HUMAN_TGT_BVH_DIR,'mousey.bvh'), + 'output_name':'arctic_wolf_female_fighttaunt__mousey', + }, +} diff --git a/gradio/gen_runner.py b/gradio/gen_runner.py new file mode 100644 index 0000000000000000000000000000000000000000..02851ff07e6604d5ad6165aa1bc4db7f957de266 --- /dev/null +++ b/gradio/gen_runner.py @@ -0,0 +1,250 @@ +import hashlib +import os +import re +import subprocess +import sys +import threading +import time +from typing import Dict, Optional + +from config import ( + GEN_DEFAULT_MOTION_FRAMES, + GEN_MAX_MOTION_FRAMES, + GEN_MIN_MOTION_FRAMES, + GEN_DEVICE, + GEN_GUIDANCE_PARAM, + GEN_SEED, + GRADIO_DIR, + MDM_DIR, + MDM_HUMAN_MODEL_PATH, + MOMASK_DIR, + MOMASK_HUMAN_CHECKPOINTS_DIR, + MOMASK_HUMAN_NAME, + MOMASK_HUMAN_RES_NAME, + OUTPUT_DIR, + RVQ_COND_SCALE, + RVQ_TEMPERATURE, + RVQ_TIME_STEPS, + RVQ_TOPKR, + RVQ_UNIT_LENGTH, + SATA_HUMAN_GEN_EPOCH, + SATA_HUMAN_RVQ_GEN_EPOCH, +) + + +_decoder_states: Dict[str, tuple] = {} +_decoder_lock = threading.Lock() + + +def _python_bin() -> str: + return os.environ.get("GRADIO_PYTHON", sys.executable) + + +def _device_index(device_str: str) -> int: + if not device_str or device_str == "cpu": + return -1 + if device_str.startswith("cuda:"): + return int(device_str.split(":", 1)[1]) + if device_str.isdigit(): + return int(device_str) + return 0 + + +def _slug(text: str, max_len: int = 36) -> str: + value = re.sub(r"[^A-Za-z0-9._-]+", "_", text.strip()).strip("_") + return value[:max_len] or "prompt" + + +def _run_subprocess(cmd, cwd: str, log_path: str, extra_pythonpath: Optional[str] = None) -> None: + env = os.environ.copy() + if extra_pythonpath: + env["PYTHONPATH"] = extra_pythonpath + os.pathsep + env.get("PYTHONPATH", "") + + proc = subprocess.run( + cmd, + cwd=cwd, + env=env, + text=True, + capture_output=True, + ) + + os.makedirs(os.path.dirname(log_path), exist_ok=True) + with open(log_path, "w", encoding="utf-8") as f: + f.write("$ " + " ".join(cmd) + "\n\n") + f.write(proc.stdout or "") + if proc.stderr: + f.write("\n[stderr]\n") + f.write(proc.stderr) + + if proc.returncode != 0: + tail = ((proc.stderr or "") + "\n" + (proc.stdout or "")).strip().splitlines()[-20:] + raise RuntimeError( + f"Generation command failed with exit code {proc.returncode}. " + f"Log: {log_path}\n" + "\n".join(tail) + ) + + +def _motion_frames_or_default(motion_frames: Optional[int]) -> int: + if motion_frames is None: + return GEN_DEFAULT_MOTION_FRAMES + motion_frames = int(round(float(motion_frames))) + return min(max(motion_frames, GEN_MIN_MOTION_FRAMES), GEN_MAX_MOTION_FRAMES) + + +def _motion_seconds_from_frames(motion_frames: int) -> float: + return motion_frames / 20.0 + + +def _make_run_dir(text: str, generation_type: str, skel_name: str, output_dir: str) -> str: + stamp = time.strftime("%Y%m%d_%H%M%S") + digest = hashlib.sha1(f"{generation_type}|{skel_name}|{text}|{time.time()}".encode("utf-8")).hexdigest()[:8] + run_name = f"{stamp}_{generation_type}_{_slug(skel_name)}_{_slug(text, 24)}_{digest}" + run_dir = os.path.join(output_dir, run_name) + os.makedirs(run_dir, exist_ok=True) + return run_dir + + +def _generate_vae_latent(text: str, run_dir: str, device_str: str, motion_frames: int) -> str: + latent_dir = os.path.join(run_dir, "vae_latent") + log_path = os.path.join(run_dir, "vae_generate.log") + cmd = [ + _python_bin(), + os.path.join(MDM_DIR, "sample", "sample_z.py"), + "--model_path", + MDM_HUMAN_MODEL_PATH, + "--text_prompt", + text, + "--num_samples", + "1", + "--num_repetitions", + "1", + "--motion_length", + str(_motion_seconds_from_frames(motion_frames)), + "--guidance_param", + str(GEN_GUIDANCE_PARAM), + "--output_dir", + latent_dir, + "--save_individual", + "--seed", + str(GEN_SEED), + "--device", + str(_device_index(device_str)), + ] + _run_subprocess(cmd, cwd=MDM_DIR, log_path=log_path, extra_pythonpath=MDM_DIR) + + z_path = os.path.join(latent_dir, "individual", "z_0000.npy") + if not os.path.exists(z_path): + raise FileNotFoundError(f"VAE latent file was not created: {z_path}") + return z_path + + +def _generate_rvq_codes(text: str, run_dir: str, device_str: str, motion_frames: int) -> str: + code_path = os.path.join(run_dir, "rvq_prediction.pt") + log_path = os.path.join(run_dir, "rvq_generate.log") + helper = os.path.join(GRADIO_DIR, "rvq_prompt_predict.py") + cmd = [ + _python_bin(), + helper, + "--momask_dir", + MOMASK_DIR, + "--checkpoints_dir", + MOMASK_HUMAN_CHECKPOINTS_DIR, + "--name", + MOMASK_HUMAN_NAME, + "--res_name", + MOMASK_HUMAN_RES_NAME, + "--dataset_name", + "t2m", + "--text_prompt", + text, + "--output_path", + code_path, + "--gpu_id", + str(_device_index(device_str)), + "--motion_length", + str(motion_frames), + "--unit_length", + str(RVQ_UNIT_LENGTH), + "--cond_scale", + str(RVQ_COND_SCALE), + "--time_steps", + str(RVQ_TIME_STEPS), + "--temperature", + str(RVQ_TEMPERATURE), + "--topkr", + str(RVQ_TOPKR), + "--seed", + str(GEN_SEED), + ] + _run_subprocess(cmd, cwd=MOMASK_DIR, log_path=log_path, extra_pythonpath=MOMASK_DIR) + + if not os.path.exists(code_path): + raise FileNotFoundError(f"RVQ code file was not created: {code_path}") + return code_path + + +def _decoder_epoch(generation_type: str) -> str: + if generation_type == "vae": + return SATA_HUMAN_GEN_EPOCH + if generation_type == "rvq": + return SATA_HUMAN_RVQ_GEN_EPOCH + raise ValueError(f"Unknown generation type: {generation_type}") + + +def _get_decoder_state(generation_type: str, device_str: str): + cache_key = f"{generation_type}:{device_str}" + if cache_key not in _decoder_states: + with _decoder_lock: + if cache_key not in _decoder_states: + from sata.utils.model_loading import load_model_by_type + + model_epoch = _decoder_epoch(generation_type) + model, cfg, ms_dict = load_model_by_type(generation_type, model_epoch, device_str) + model = model.to(device_str) + model.eval() + _decoder_states[cache_key] = (model, cfg, ms_dict) + return _decoder_states[cache_key] + + +def generate_motion_from_text( + text: str, + skel_npz_path: str, + generation_type: str, + output_dir: Optional[str] = None, + device_str: str = GEN_DEVICE, + skel_name: str = "target", + motion_frames: Optional[int] = None, +) -> str: + text = text.strip() + generation_type = generation_type.lower().strip() + if generation_type not in {"vae", "rvq"}: + raise ValueError(f"Unsupported generation type: {generation_type}") + if not text: + raise ValueError("Text prompt is empty") + if not os.path.exists(skel_npz_path): + raise FileNotFoundError(f"Skeleton file not found: {skel_npz_path}") + + motion_frames = _motion_frames_or_default(motion_frames) + + output_dir = output_dir or os.path.join(OUTPUT_DIR, "generation") + run_dir = _make_run_dir(text, generation_type, skel_name, output_dir) + + if generation_type == "vae": + latent_or_code_path = _generate_vae_latent(text, run_dir, device_str, motion_frames) + else: + latent_or_code_path = _generate_rvq_codes(text, run_dir, device_str, motion_frames) + + from decode_z_sliding import decode_z_skel_to_bvh + + bvh_dir = os.path.join(run_dir, "bvh") + output_name = f"{generation_type}_{_slug(skel_name)}_{hashlib.sha1(text.encode('utf-8')).hexdigest()[:8]}" + return decode_z_skel_to_bvh( + z_path=latent_or_code_path, + skel_path=skel_npz_path, + model_epoch=_decoder_epoch(generation_type), + output_dir=bvh_dir, + output_name=output_name, + device=device_str, + model_type=generation_type, + model_state=_get_decoder_state(generation_type, device_str), + ) diff --git a/gradio/rvq_prompt_predict.py b/gradio/rvq_prompt_predict.py new file mode 100644 index 0000000000000000000000000000000000000000..4e42f29b5d507a62e359cad0f085707790dcad70 --- /dev/null +++ b/gradio/rvq_prompt_predict.py @@ -0,0 +1,133 @@ +import argparse +import os +import sys +from types import SimpleNamespace + + +def parse_args(): + parser = argparse.ArgumentParser(description="Generate one pre-encoded RVQ code stream from text.") + parser.add_argument("--momask_dir", required=True) + parser.add_argument("--checkpoints_dir", required=True) + parser.add_argument("--name", required=True) + parser.add_argument("--res_name", required=True) + parser.add_argument("--dataset_name", default="t2m") + parser.add_argument("--text_prompt", required=True) + parser.add_argument("--output_path", required=True) + parser.add_argument("--gpu_id", type=int, default=0) + parser.add_argument("--motion_length", type=int, default=120) + parser.add_argument("--unit_length", type=int, default=1) + parser.add_argument("--cond_scale", type=float, default=4.0) + parser.add_argument("--time_steps", type=int, default=18) + parser.add_argument("--temperature", type=float, default=1.0) + parser.add_argument("--topkr", type=float, default=0.9) + parser.add_argument("--seed", type=int, default=10) + parser.add_argument("--gumbel_sample", action="store_true") + parser.add_argument("--force_mask", action="store_true") + return parser.parse_args() + + +def main(): + args = parse_args() + + sys.path.insert(0, args.momask_dir) + os.chdir(args.momask_dir) + + import torch + from os.path import join as pjoin + + from predict_preenc import load_mask_trans_model, load_res_model + from utils.fixseed import fixseed + from utils.get_opt import get_opt + + fixseed(args.seed) + + if args.gpu_id != -1: + torch.cuda.set_device(args.gpu_id) + device = torch.device("cpu" if args.gpu_id == -1 else f"cuda:{args.gpu_id}") + + opt = SimpleNamespace( + checkpoints_dir=args.checkpoints_dir, + dataset_name=args.dataset_name, + name=args.name, + res_name=args.res_name, + which_epoch="latest", + device=device, + cond_scale=args.cond_scale, + time_steps=args.time_steps, + temperature=args.temperature, + topkr=args.topkr, + gumbel_sample=args.gumbel_sample, + force_mask=args.force_mask, + ) + + model_opt = get_opt( + pjoin(args.checkpoints_dir, args.dataset_name, args.name, "opt.txt"), + device=device, + ) + res_opt = get_opt( + pjoin(args.checkpoints_dir, args.dataset_name, args.res_name, "opt.txt"), + device=device, + ) + + if not hasattr(model_opt, "num_quantizers"): + model_opt.num_quantizers = 6 + if not hasattr(model_opt, "num_tokens"): + model_opt.num_tokens = 512 + if not hasattr(model_opt, "code_dim"): + model_opt.code_dim = 256 + + t2m_transformer = load_mask_trans_model(opt, model_opt) + t2m_transformer.eval() + t2m_transformer.to(device) + + res_transformer = load_res_model(opt, model_opt, res_opt) + res_transformer.eval() + res_transformer.to(device) + + unit_length = max(1, int(args.unit_length)) + token_len = max(1, int(args.motion_length) // unit_length) + max_token_len = getattr(model_opt, "max_motion_length", 196) // unit_length + token_len = min(token_len, max_token_len) + + caption = args.text_prompt.strip() + m_lens = torch.tensor([token_len], device=device, dtype=torch.long) + + with torch.no_grad(): + mids = t2m_transformer.generate( + conds=[caption], + m_lens=m_lens, + timesteps=args.time_steps, + cond_scale=args.cond_scale, + temperature=args.temperature, + topk_filter_thres=args.topkr, + gsample=args.gumbel_sample, + force_mask=args.force_mask, + ) + pred_ids = res_transformer.generate( + motion_ids=mids, + conds=[caption], + m_lens=m_lens, + temperature=1.0, + cond_scale=args.cond_scale, + ) + + idx_pred = pred_ids[0, :token_len].detach().cpu().long() + output = { + "idx_pred": idx_pred, + "text": { + "caption": caption, + "tokens": [], + "start_time": 0.0, + "end_time": 0.0, + }, + "m_len": int(token_len * unit_length), + } + + os.makedirs(os.path.dirname(args.output_path), exist_ok=True) + torch.save(output, args.output_path) + print(f"Saved RVQ prediction to: {args.output_path}") + print(f"idx_pred shape: {tuple(idx_pred.shape)}") + + +if __name__ == "__main__": + main() diff --git a/gradio/static/three/three.module.js b/gradio/static/three/three.module.js new file mode 100644 index 0000000000000000000000000000000000000000..0bcc7a286da2c115853ceec9deea19923e10ddc1 --- /dev/null +++ b/gradio/static/three/three.module.js @@ -0,0 +1,53044 @@ +/** + * @license + * Copyright 2010-2023 Three.js Authors + * SPDX-License-Identifier: MIT + */ +const REVISION = '160'; + +const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; +const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; +const CullFaceNone = 0; +const CullFaceBack = 1; +const CullFaceFront = 2; +const CullFaceFrontBack = 3; +const BasicShadowMap = 0; +const PCFShadowMap = 1; +const PCFSoftShadowMap = 2; +const VSMShadowMap = 3; +const FrontSide = 0; +const BackSide = 1; +const DoubleSide = 2; +const TwoPassDoubleSide = 2; // r149 +const NoBlending = 0; +const NormalBlending = 1; +const AdditiveBlending = 2; +const SubtractiveBlending = 3; +const MultiplyBlending = 4; +const CustomBlending = 5; +const AddEquation = 100; +const SubtractEquation = 101; +const ReverseSubtractEquation = 102; +const MinEquation = 103; +const MaxEquation = 104; +const ZeroFactor = 200; +const OneFactor = 201; +const SrcColorFactor = 202; +const OneMinusSrcColorFactor = 203; +const SrcAlphaFactor = 204; +const OneMinusSrcAlphaFactor = 205; +const DstAlphaFactor = 206; +const OneMinusDstAlphaFactor = 207; +const DstColorFactor = 208; +const OneMinusDstColorFactor = 209; +const SrcAlphaSaturateFactor = 210; +const ConstantColorFactor = 211; +const OneMinusConstantColorFactor = 212; +const ConstantAlphaFactor = 213; +const OneMinusConstantAlphaFactor = 214; +const NeverDepth = 0; +const AlwaysDepth = 1; +const LessDepth = 2; +const LessEqualDepth = 3; +const EqualDepth = 4; +const GreaterEqualDepth = 5; +const GreaterDepth = 6; +const NotEqualDepth = 7; +const MultiplyOperation = 0; +const MixOperation = 1; +const AddOperation = 2; +const NoToneMapping = 0; +const LinearToneMapping = 1; +const ReinhardToneMapping = 2; +const CineonToneMapping = 3; +const ACESFilmicToneMapping = 4; +const CustomToneMapping = 5; +const AgXToneMapping = 6; +const AttachedBindMode = 'attached'; +const DetachedBindMode = 'detached'; + +const UVMapping = 300; +const CubeReflectionMapping = 301; +const CubeRefractionMapping = 302; +const EquirectangularReflectionMapping = 303; +const EquirectangularRefractionMapping = 304; +const CubeUVReflectionMapping = 306; +const RepeatWrapping = 1000; +const ClampToEdgeWrapping = 1001; +const MirroredRepeatWrapping = 1002; +const NearestFilter = 1003; +const NearestMipmapNearestFilter = 1004; +const NearestMipMapNearestFilter = 1004; +const NearestMipmapLinearFilter = 1005; +const NearestMipMapLinearFilter = 1005; +const LinearFilter = 1006; +const LinearMipmapNearestFilter = 1007; +const LinearMipMapNearestFilter = 1007; +const LinearMipmapLinearFilter = 1008; +const LinearMipMapLinearFilter = 1008; +const UnsignedByteType = 1009; +const ByteType = 1010; +const ShortType = 1011; +const UnsignedShortType = 1012; +const IntType = 1013; +const UnsignedIntType = 1014; +const FloatType = 1015; +const HalfFloatType = 1016; +const UnsignedShort4444Type = 1017; +const UnsignedShort5551Type = 1018; +const UnsignedInt248Type = 1020; +const AlphaFormat = 1021; +const RGBAFormat = 1023; +const LuminanceFormat = 1024; +const LuminanceAlphaFormat = 1025; +const DepthFormat = 1026; +const DepthStencilFormat = 1027; +const RedFormat = 1028; +const RedIntegerFormat = 1029; +const RGFormat = 1030; +const RGIntegerFormat = 1031; +const RGBAIntegerFormat = 1033; + +const RGB_S3TC_DXT1_Format = 33776; +const RGBA_S3TC_DXT1_Format = 33777; +const RGBA_S3TC_DXT3_Format = 33778; +const RGBA_S3TC_DXT5_Format = 33779; +const RGB_PVRTC_4BPPV1_Format = 35840; +const RGB_PVRTC_2BPPV1_Format = 35841; +const RGBA_PVRTC_4BPPV1_Format = 35842; +const RGBA_PVRTC_2BPPV1_Format = 35843; +const RGB_ETC1_Format = 36196; +const RGB_ETC2_Format = 37492; +const RGBA_ETC2_EAC_Format = 37496; +const RGBA_ASTC_4x4_Format = 37808; +const RGBA_ASTC_5x4_Format = 37809; +const RGBA_ASTC_5x5_Format = 37810; +const RGBA_ASTC_6x5_Format = 37811; +const RGBA_ASTC_6x6_Format = 37812; +const RGBA_ASTC_8x5_Format = 37813; +const RGBA_ASTC_8x6_Format = 37814; +const RGBA_ASTC_8x8_Format = 37815; +const RGBA_ASTC_10x5_Format = 37816; +const RGBA_ASTC_10x6_Format = 37817; +const RGBA_ASTC_10x8_Format = 37818; +const RGBA_ASTC_10x10_Format = 37819; +const RGBA_ASTC_12x10_Format = 37820; +const RGBA_ASTC_12x12_Format = 37821; +const RGBA_BPTC_Format = 36492; +const RGB_BPTC_SIGNED_Format = 36494; +const RGB_BPTC_UNSIGNED_Format = 36495; +const RED_RGTC1_Format = 36283; +const SIGNED_RED_RGTC1_Format = 36284; +const RED_GREEN_RGTC2_Format = 36285; +const SIGNED_RED_GREEN_RGTC2_Format = 36286; +const LoopOnce = 2200; +const LoopRepeat = 2201; +const LoopPingPong = 2202; +const InterpolateDiscrete = 2300; +const InterpolateLinear = 2301; +const InterpolateSmooth = 2302; +const ZeroCurvatureEnding = 2400; +const ZeroSlopeEnding = 2401; +const WrapAroundEnding = 2402; +const NormalAnimationBlendMode = 2500; +const AdditiveAnimationBlendMode = 2501; +const TrianglesDrawMode = 0; +const TriangleStripDrawMode = 1; +const TriangleFanDrawMode = 2; +/** @deprecated Use LinearSRGBColorSpace or NoColorSpace in three.js r152+. */ +const LinearEncoding = 3000; +/** @deprecated Use SRGBColorSpace in three.js r152+. */ +const sRGBEncoding = 3001; +const BasicDepthPacking = 3200; +const RGBADepthPacking = 3201; +const TangentSpaceNormalMap = 0; +const ObjectSpaceNormalMap = 1; + +// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available. +const NoColorSpace = ''; +const SRGBColorSpace = 'srgb'; +const LinearSRGBColorSpace = 'srgb-linear'; +const DisplayP3ColorSpace = 'display-p3'; +const LinearDisplayP3ColorSpace = 'display-p3-linear'; + +const LinearTransfer = 'linear'; +const SRGBTransfer = 'srgb'; + +const Rec709Primaries = 'rec709'; +const P3Primaries = 'p3'; + +const ZeroStencilOp = 0; +const KeepStencilOp = 7680; +const ReplaceStencilOp = 7681; +const IncrementStencilOp = 7682; +const DecrementStencilOp = 7683; +const IncrementWrapStencilOp = 34055; +const DecrementWrapStencilOp = 34056; +const InvertStencilOp = 5386; + +const NeverStencilFunc = 512; +const LessStencilFunc = 513; +const EqualStencilFunc = 514; +const LessEqualStencilFunc = 515; +const GreaterStencilFunc = 516; +const NotEqualStencilFunc = 517; +const GreaterEqualStencilFunc = 518; +const AlwaysStencilFunc = 519; + +const NeverCompare = 512; +const LessCompare = 513; +const EqualCompare = 514; +const LessEqualCompare = 515; +const GreaterCompare = 516; +const NotEqualCompare = 517; +const GreaterEqualCompare = 518; +const AlwaysCompare = 519; + +const StaticDrawUsage = 35044; +const DynamicDrawUsage = 35048; +const StreamDrawUsage = 35040; +const StaticReadUsage = 35045; +const DynamicReadUsage = 35049; +const StreamReadUsage = 35041; +const StaticCopyUsage = 35046; +const DynamicCopyUsage = 35050; +const StreamCopyUsage = 35042; + +const GLSL1 = '100'; +const GLSL3 = '300 es'; + +const _SRGBAFormat = 1035; // fallback for WebGL 1 + +const WebGLCoordinateSystem = 2000; +const WebGPUCoordinateSystem = 2001; + +/** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + +class EventDispatcher { + + addEventListener( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + const listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + } + + hasEventListener( type, listener ) { + + if ( this._listeners === undefined ) return false; + + const listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + } + + removeEventListener( type, listener ) { + + if ( this._listeners === undefined ) return; + + const listeners = this._listeners; + const listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + const index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + } + + dispatchEvent( event ) { + + if ( this._listeners === undefined ) return; + + const listeners = this._listeners; + const listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + // Make a copy, in case listeners are removed while iterating. + const array = listenerArray.slice( 0 ); + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + event.target = null; + + } + + } + +} + +const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ]; + +let _seed = 1234567; + + +const DEG2RAD = Math.PI / 180; +const RAD2DEG = 180 / Math.PI; + +// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 +function generateUUID() { + + const d0 = Math.random() * 0xffffffff | 0; + const d1 = Math.random() * 0xffffffff | 0; + const d2 = Math.random() * 0xffffffff | 0; + const d3 = Math.random() * 0xffffffff | 0; + const uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' + + _lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' + + _lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] + + _lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ]; + + // .toLowerCase() here flattens concatenated strings to save heap memory space. + return uuid.toLowerCase(); + +} + +function clamp( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + +} + +// compute euclidean modulo of m % n +// https://en.wikipedia.org/wiki/Modulo_operation +function euclideanModulo( n, m ) { + + return ( ( n % m ) + m ) % m; + +} + +// Linear mapping from range to range +function mapLinear( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + +} + +// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/ +function inverseLerp( x, y, value ) { + + if ( x !== y ) { + + return ( value - x ) / ( y - x ); + + } else { + + return 0; + + } + +} + +// https://en.wikipedia.org/wiki/Linear_interpolation +function lerp( x, y, t ) { + + return ( 1 - t ) * x + t * y; + +} + +// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/ +function damp( x, y, lambda, dt ) { + + return lerp( x, y, 1 - Math.exp( - lambda * dt ) ); + +} + +// https://www.desmos.com/calculator/vcsjnyz7x4 +function pingpong( x, length = 1 ) { + + return length - Math.abs( euclideanModulo( x, length * 2 ) - length ); + +} + +// http://en.wikipedia.org/wiki/Smoothstep +function smoothstep( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + +} + +function smootherstep( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + +} + +// Random integer from interval +function randInt( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + +} + +// Random float from interval +function randFloat( low, high ) { + + return low + Math.random() * ( high - low ); + +} + +// Random float from <-range/2, range/2> interval +function randFloatSpread( range ) { + + return range * ( 0.5 - Math.random() ); + +} + +// Deterministic pseudo-random float in the interval [ 0, 1 ] +function seededRandom( s ) { + + if ( s !== undefined ) _seed = s; + + // Mulberry32 generator + + let t = _seed += 0x6D2B79F5; + + t = Math.imul( t ^ t >>> 15, t | 1 ); + + t ^= t + Math.imul( t ^ t >>> 7, t | 61 ); + + return ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296; + +} + +function degToRad( degrees ) { + + return degrees * DEG2RAD; + +} + +function radToDeg( radians ) { + + return radians * RAD2DEG; + +} + +function isPowerOfTwo( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + +} + +function ceilPowerOfTwo( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + +} + +function floorPowerOfTwo( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + +} + +function setQuaternionFromProperEuler( q, a, b, c, order ) { + + // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles + + // rotations are applied to the axes in the order specified by 'order' + // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c' + // angles are in radians + + const cos = Math.cos; + const sin = Math.sin; + + const c2 = cos( b / 2 ); + const s2 = sin( b / 2 ); + + const c13 = cos( ( a + c ) / 2 ); + const s13 = sin( ( a + c ) / 2 ); + + const c1_3 = cos( ( a - c ) / 2 ); + const s1_3 = sin( ( a - c ) / 2 ); + + const c3_1 = cos( ( c - a ) / 2 ); + const s3_1 = sin( ( c - a ) / 2 ); + + switch ( order ) { + + case 'XYX': + q.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 ); + break; + + case 'YZY': + q.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 ); + break; + + case 'ZXZ': + q.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 ); + break; + + case 'XZX': + q.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 ); + break; + + case 'YXY': + q.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 ); + break; + + case 'ZYZ': + q.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 ); + break; + + default: + console.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order ); + + } + +} + +function denormalize( value, array ) { + + switch ( array.constructor ) { + + case Float32Array: + + return value; + + case Uint32Array: + + return value / 4294967295.0; + + case Uint16Array: + + return value / 65535.0; + + case Uint8Array: + + return value / 255.0; + + case Int32Array: + + return Math.max( value / 2147483647.0, - 1.0 ); + + case Int16Array: + + return Math.max( value / 32767.0, - 1.0 ); + + case Int8Array: + + return Math.max( value / 127.0, - 1.0 ); + + default: + + throw new Error( 'Invalid component type.' ); + + } + +} + +function normalize( value, array ) { + + switch ( array.constructor ) { + + case Float32Array: + + return value; + + case Uint32Array: + + return Math.round( value * 4294967295.0 ); + + case Uint16Array: + + return Math.round( value * 65535.0 ); + + case Uint8Array: + + return Math.round( value * 255.0 ); + + case Int32Array: + + return Math.round( value * 2147483647.0 ); + + case Int16Array: + + return Math.round( value * 32767.0 ); + + case Int8Array: + + return Math.round( value * 127.0 ); + + default: + + throw new Error( 'Invalid component type.' ); + + } + +} + +const MathUtils = { + DEG2RAD: DEG2RAD, + RAD2DEG: RAD2DEG, + generateUUID: generateUUID, + clamp: clamp, + euclideanModulo: euclideanModulo, + mapLinear: mapLinear, + inverseLerp: inverseLerp, + lerp: lerp, + damp: damp, + pingpong: pingpong, + smoothstep: smoothstep, + smootherstep: smootherstep, + randInt: randInt, + randFloat: randFloat, + randFloatSpread: randFloatSpread, + seededRandom: seededRandom, + degToRad: degToRad, + radToDeg: radToDeg, + isPowerOfTwo: isPowerOfTwo, + ceilPowerOfTwo: ceilPowerOfTwo, + floorPowerOfTwo: floorPowerOfTwo, + setQuaternionFromProperEuler: setQuaternionFromProperEuler, + normalize: normalize, + denormalize: denormalize +}; + +class Vector2 { + + constructor( x = 0, y = 0 ) { + + Vector2.prototype.isVector2 = true; + + this.x = x; + this.y = y; + + } + + get width() { + + return this.x; + + } + + set width( value ) { + + this.x = value; + + } + + get height() { + + return this.y; + + } + + set height( value ) { + + this.y = value; + + } + + set( x, y ) { + + this.x = x; + this.y = y; + + return this; + + } + + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + } + + setX( x ) { + + this.x = x; + + return this; + + } + + setY( y ) { + + this.y = y; + + return this; + + } + + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + clone() { + + return new this.constructor( this.x, this.y ); + + } + + copy( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + } + + add( v ) { + + this.x += v.x; + this.y += v.y; + + return this; + + } + + addScalar( s ) { + + this.x += s; + this.y += s; + + return this; + + } + + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + } + + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + } + + sub( v ) { + + this.x -= v.x; + this.y -= v.y; + + return this; + + } + + subScalar( s ) { + + this.x -= s; + this.y -= s; + + return this; + + } + + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + } + + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + } + + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + } + + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + } + + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + applyMatrix3( m ) { + + const x = this.x, y = this.y; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + } + + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + } + + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + } + + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + } + + clampScalar( minVal, maxVal ) { + + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + + return this; + + } + + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + } + + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + } + + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + } + + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + } + + roundToZero() { + + this.x = Math.trunc( this.x ); + this.y = Math.trunc( this.y ); + + return this; + + } + + negate() { + + this.x = - this.x; + this.y = - this.y; + + return this; + + } + + dot( v ) { + + return this.x * v.x + this.y * v.y; + + } + + cross( v ) { + + return this.x * v.y - this.y * v.x; + + } + + lengthSq() { + + return this.x * this.x + this.y * this.y; + + } + + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + } + + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + } + + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + angle() { + + // computes the angle in radians with respect to the positive x-axis + + const angle = Math.atan2( - this.y, - this.x ) + Math.PI; + + return angle; + + } + + angleTo( v ) { + + const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() ); + + if ( denominator === 0 ) return Math.PI / 2; + + const theta = this.dot( v ) / denominator; + + // clamp, to handle numerical problems + + return Math.acos( clamp( theta, - 1, 1 ) ); + + } + + distanceTo( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + } + + distanceToSquared( v ) { + + const dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + } + + manhattanDistanceTo( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + } + + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + + return this; + + } + + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + } + + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + } + + rotateAround( center, angle ) { + + const c = Math.cos( angle ), s = Math.sin( angle ); + + const x = this.x - center.x; + const y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + random() { + + this.x = Math.random(); + this.y = Math.random(); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + + } + +} + +class Matrix3 { + + constructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + Matrix3.prototype.isMatrix3 = true; + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( n11 !== undefined ) { + + this.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ); + + } + + } + + set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + const te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + } + + identity() { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + } + + copy( m ) { + + const te = this.elements; + const me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + } + + extractBasis( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrix3Column( this, 0 ); + yAxis.setFromMatrix3Column( this, 1 ); + zAxis.setFromMatrix3Column( this, 2 ); + + return this; + + } + + setFromMatrix4( m ) { + + const me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + } + + multiply( m ) { + + return this.multiplyMatrices( this, m ); + + } + + premultiply( m ) { + + return this.multiplyMatrices( m, this ); + + } + + multiplyMatrices( a, b ) { + + const ae = a.elements; + const be = b.elements; + const te = this.elements; + + const a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + const a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + const a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + const b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + const b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + const b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + } + + multiplyScalar( s ) { + + const te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + } + + determinant() { + + const te = this.elements; + + const a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + } + + invert() { + + const te = this.elements, + + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], + n12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ], + n13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + + const detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + } + + transpose() { + + let tmp; + const m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + } + + getNormalMatrix( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).invert().transpose(); + + } + + transposeIntoArray( r ) { + + const m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + } + + setUvTransform( tx, ty, sx, sy, rotation, cx, cy ) { + + const c = Math.cos( rotation ); + const s = Math.sin( rotation ); + + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); + + return this; + + } + + // + + scale( sx, sy ) { + + this.premultiply( _m3.makeScale( sx, sy ) ); + + return this; + + } + + rotate( theta ) { + + this.premultiply( _m3.makeRotation( - theta ) ); + + return this; + + } + + translate( tx, ty ) { + + this.premultiply( _m3.makeTranslation( tx, ty ) ); + + return this; + + } + + // for 2D Transforms + + makeTranslation( x, y ) { + + if ( x.isVector2 ) { + + this.set( + + 1, 0, x.x, + 0, 1, x.y, + 0, 0, 1 + + ); + + } else { + + this.set( + + 1, 0, x, + 0, 1, y, + 0, 0, 1 + + ); + + } + + return this; + + } + + makeRotation( theta ) { + + // counterclockwise + + const c = Math.cos( theta ); + const s = Math.sin( theta ); + + this.set( + + c, - s, 0, + s, c, 0, + 0, 0, 1 + + ); + + return this; + + } + + makeScale( x, y ) { + + this.set( + + x, 0, 0, + 0, y, 0, + 0, 0, 1 + + ); + + return this; + + } + + // + + equals( matrix ) { + + const te = this.elements; + const me = matrix.elements; + + for ( let i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + } + + fromArray( array, offset = 0 ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + clone() { + + return new this.constructor().fromArray( this.elements ); + + } + +} + +const _m3 = /*@__PURE__*/ new Matrix3(); + +function arrayNeedsUint32( array ) { + + // assumes larger values usually on last + + for ( let i = array.length - 1; i >= 0; -- i ) { + + if ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565 + + } + + return false; + +} + +const TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + Uint8ClampedArray: Uint8ClampedArray, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array +}; + +function getTypedArray( type, buffer ) { + + return new TYPED_ARRAYS[ type ]( buffer ); + +} + +function createElementNS( name ) { + + return document.createElementNS( 'http://www.w3.org/1999/xhtml', name ); + +} + +function createCanvasElement() { + + const canvas = createElementNS( 'canvas' ); + canvas.style.display = 'block'; + return canvas; + +} + +const _cache = {}; + +function warnOnce( message ) { + + if ( message in _cache ) return; + + _cache[ message ] = true; + + console.warn( message ); + +} + +/** + * Matrices converting P3 <-> Rec. 709 primaries, without gamut mapping + * or clipping. Based on W3C specifications for sRGB and Display P3, + * and ICC specifications for the D50 connection space. Values in/out + * are _linear_ sRGB and _linear_ Display P3. + * + * Note that both sRGB and Display P3 use the sRGB transfer functions. + * + * Reference: + * - http://www.russellcottrell.com/photo/matrixCalculator.htm + */ + +const LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set( + 0.8224621, 0.177538, 0.0, + 0.0331941, 0.9668058, 0.0, + 0.0170827, 0.0723974, 0.9105199, +); + +const LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = /*@__PURE__*/ new Matrix3().set( + 1.2249401, - 0.2249404, 0.0, + - 0.0420569, 1.0420571, 0.0, + - 0.0196376, - 0.0786361, 1.0982735 +); + +/** + * Defines supported color spaces by transfer function and primaries, + * and provides conversions to/from the Linear-sRGB reference space. + */ +const COLOR_SPACES = { + [ LinearSRGBColorSpace ]: { + transfer: LinearTransfer, + primaries: Rec709Primaries, + toReference: ( color ) => color, + fromReference: ( color ) => color, + }, + [ SRGBColorSpace ]: { + transfer: SRGBTransfer, + primaries: Rec709Primaries, + toReference: ( color ) => color.convertSRGBToLinear(), + fromReference: ( color ) => color.convertLinearToSRGB(), + }, + [ LinearDisplayP3ColorSpace ]: { + transfer: LinearTransfer, + primaries: P3Primaries, + toReference: ( color ) => color.applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ), + fromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ), + }, + [ DisplayP3ColorSpace ]: { + transfer: SRGBTransfer, + primaries: P3Primaries, + toReference: ( color ) => color.convertSRGBToLinear().applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ), + fromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ).convertLinearToSRGB(), + }, +}; + +const SUPPORTED_WORKING_COLOR_SPACES = new Set( [ LinearSRGBColorSpace, LinearDisplayP3ColorSpace ] ); + +const ColorManagement = { + + enabled: true, + + _workingColorSpace: LinearSRGBColorSpace, + + get workingColorSpace() { + + return this._workingColorSpace; + + }, + + set workingColorSpace( colorSpace ) { + + if ( ! SUPPORTED_WORKING_COLOR_SPACES.has( colorSpace ) ) { + + throw new Error( `Unsupported working color space, "${ colorSpace }".` ); + + } + + this._workingColorSpace = colorSpace; + + }, + + convert: function ( color, sourceColorSpace, targetColorSpace ) { + + if ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) { + + return color; + + } + + const sourceToReference = COLOR_SPACES[ sourceColorSpace ].toReference; + const targetFromReference = COLOR_SPACES[ targetColorSpace ].fromReference; + + return targetFromReference( sourceToReference( color ) ); + + }, + + fromWorkingColorSpace: function ( color, targetColorSpace ) { + + return this.convert( color, this._workingColorSpace, targetColorSpace ); + + }, + + toWorkingColorSpace: function ( color, sourceColorSpace ) { + + return this.convert( color, sourceColorSpace, this._workingColorSpace ); + + }, + + getPrimaries: function ( colorSpace ) { + + return COLOR_SPACES[ colorSpace ].primaries; + + }, + + getTransfer: function ( colorSpace ) { + + if ( colorSpace === NoColorSpace ) return LinearTransfer; + + return COLOR_SPACES[ colorSpace ].transfer; + + }, + +}; + + +function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + +} + +function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + +} + +let _canvas; + +class ImageUtils { + + static getDataURL( image ) { + + if ( /^data:/i.test( image.src ) ) { + + return image.src; + + } + + if ( typeof HTMLCanvasElement === 'undefined' ) { + + return image.src; + + } + + let canvas; + + if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + if ( _canvas === undefined ) _canvas = createElementNS( 'canvas' ); + + _canvas.width = image.width; + _canvas.height = image.height; + + const context = _canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + canvas = _canvas; + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + console.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image ); + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + static sRGBToLinear( image ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const canvas = createElementNS( 'canvas' ); + + canvas.width = image.width; + canvas.height = image.height; + + const context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height ); + + const imageData = context.getImageData( 0, 0, image.width, image.height ); + const data = imageData.data; + + for ( let i = 0; i < data.length; i ++ ) { + + data[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255; + + } + + context.putImageData( imageData, 0, 0 ); + + return canvas; + + } else if ( image.data ) { + + const data = image.data.slice( 0 ); + + for ( let i = 0; i < data.length; i ++ ) { + + if ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) { + + data[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 ); + + } else { + + // assuming float + + data[ i ] = SRGBToLinear( data[ i ] ); + + } + + } + + return { + data: data, + width: image.width, + height: image.height + }; + + } else { + + console.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' ); + return image; + + } + + } + +} + +let _sourceId = 0; + +class Source { + + constructor( data = null ) { + + this.isSource = true; + + Object.defineProperty( this, 'id', { value: _sourceId ++ } ); + + this.uuid = generateUUID(); + + this.data = data; + + this.version = 0; + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) { + + return meta.images[ this.uuid ]; + + } + + const output = { + uuid: this.uuid, + url: '' + }; + + const data = this.data; + + if ( data !== null ) { + + let url; + + if ( Array.isArray( data ) ) { + + // cube texture + + url = []; + + for ( let i = 0, l = data.length; i < l; i ++ ) { + + if ( data[ i ].isDataTexture ) { + + url.push( serializeImage( data[ i ].image ) ); + + } else { + + url.push( serializeImage( data[ i ] ) ); + + } + + } + + } else { + + // texture + + url = serializeImage( data ); + + } + + output.url = url; + + } + + if ( ! isRootObject ) { + + meta.images[ this.uuid ] = output; + + } + + return output; + + } + +} + +function serializeImage( image ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + // default images + + return ImageUtils.getDataURL( image ); + + } else { + + if ( image.data ) { + + // images of DataTexture + + return { + data: Array.from( image.data ), + width: image.width, + height: image.height, + type: image.data.constructor.name + }; + + } else { + + console.warn( 'THREE.Texture: Unable to serialize Texture.' ); + return {}; + + } + + } + +} + +let _textureId = 0; + +class Texture extends EventDispatcher { + + constructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) { + + super(); + + this.isTexture = true; + + Object.defineProperty( this, 'id', { value: _textureId ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + + this.source = new Source( image ); + this.mipmaps = []; + + this.mapping = mapping; + this.channel = 0; + + this.wrapS = wrapS; + this.wrapT = wrapT; + + this.magFilter = magFilter; + this.minFilter = minFilter; + + this.anisotropy = anisotropy; + + this.format = format; + this.internalFormat = null; + this.type = type; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + if ( typeof colorSpace === 'string' ) { + + this.colorSpace = colorSpace; + + } else { // @deprecated, r152 + + warnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' ); + this.colorSpace = colorSpace === sRGBEncoding ? SRGBColorSpace : NoColorSpace; + + } + + + this.userData = {}; + + this.version = 0; + this.onUpdate = null; + + this.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not + this.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures) + + } + + get image() { + + return this.source.data; + + } + + set image( value = null ) { + + this.source.data = value; + + } + + updateMatrix() { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.name = source.name; + + this.source = source.source; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + this.channel = source.channel; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.internalFormat = source.internalFormat; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.colorSpace = source.colorSpace; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.needsUpdate = true; + + return this; + + } + + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + const output = { + + metadata: { + version: 4.6, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + image: this.source.toJSON( meta ).uuid, + + mapping: this.mapping, + channel: this.channel, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + internalFormat: this.internalFormat, + type: this.type, + colorSpace: this.colorSpace, + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY, + + generateMipmaps: this.generateMipmaps, + premultiplyAlpha: this.premultiplyAlpha, + unpackAlignment: this.unpackAlignment + + }; + + if ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData; + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + transformUv( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + + set needsUpdate( value ) { + + if ( value === true ) { + + this.version ++; + this.source.needsUpdate = true; + + } + + } + + get encoding() { // @deprecated, r152 + + warnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' ); + return this.colorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding; + + } + + set encoding( encoding ) { // @deprecated, r152 + + warnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' ); + this.colorSpace = encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace; + + } + +} + +Texture.DEFAULT_IMAGE = null; +Texture.DEFAULT_MAPPING = UVMapping; +Texture.DEFAULT_ANISOTROPY = 1; + +class Vector4 { + + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + Vector4.prototype.isVector4 = true; + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + } + + get width() { + + return this.z; + + } + + set width( value ) { + + this.z = value; + + } + + get height() { + + return this.w; + + } + + set height( value ) { + + this.w = value; + + } + + set( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + } + + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + } + + setX( x ) { + + this.x = x; + + return this; + + } + + setY( y ) { + + this.y = y; + + return this; + + } + + setZ( z ) { + + this.z = z; + + return this; + + } + + setW( w ) { + + this.w = w; + + return this; + + } + + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + clone() { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + } + + copy( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + } + + add( v ) { + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + } + + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + } + + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + } + + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + } + + sub( v ) { + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + } + + subScalar( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + } + + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + } + + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + this.w *= v.w; + + return this; + + } + + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + } + + applyMatrix4( m ) { + + const x = this.x, y = this.y, z = this.z, w = this.w; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + } + + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + setAxisAngleFromQuaternion( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + const s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + } + + setAxisAngleFromRotationMatrix( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + let angle, x, y, z; // variables for result + const epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + const xx = ( m11 + 1 ) / 2; + const yy = ( m22 + 1 ) / 2; + const zz = ( m33 + 1 ) / 2; + const xy = ( m12 + m21 ) / 4; + const xz = ( m13 + m31 ) / 4; + const yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + let s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + } + + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + } + + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + } + + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + } + + clampScalar( minVal, maxVal ) { + + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + this.z = Math.max( minVal, Math.min( maxVal, this.z ) ); + this.w = Math.max( minVal, Math.min( maxVal, this.w ) ); + + return this; + + } + + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + } + + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + } + + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + } + + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + } + + roundToZero() { + + this.x = Math.trunc( this.x ); + this.y = Math.trunc( this.y ); + this.z = Math.trunc( this.z ); + this.w = Math.trunc( this.w ); + + return this; + + } + + negate() { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + } + + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + } + + lengthSq() { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + } + + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + } + + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + } + + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + } + + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + this.w = v1.w + ( v2.w - v1.w ) * alpha; + + return this; + + } + + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + } + + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + random() { + + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + yield this.z; + yield this.w; + + } + +} + +/* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers +*/ +class RenderTarget extends EventDispatcher { + + constructor( width = 1, height = 1, options = {} ) { + + super(); + + this.isRenderTarget = true; + + this.width = width; + this.height = height; + this.depth = 1; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + const image = { width: width, height: height, depth: 1 }; + + if ( options.encoding !== undefined ) { + + // @deprecated, r152 + warnOnce( 'THREE.WebGLRenderTarget: option.encoding has been replaced by option.colorSpace.' ); + options.colorSpace = options.encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace; + + } + + options = Object.assign( { + generateMipmaps: false, + internalFormat: null, + minFilter: LinearFilter, + depthBuffer: true, + stencilBuffer: false, + depthTexture: null, + samples: 0 + }, options ); + + this.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace ); + this.texture.isRenderTargetTexture = true; + + this.texture.flipY = false; + this.texture.generateMipmaps = options.generateMipmaps; + this.texture.internalFormat = options.internalFormat; + + this.depthBuffer = options.depthBuffer; + this.stencilBuffer = options.stencilBuffer; + + this.depthTexture = options.depthTexture; + + this.samples = options.samples; + + } + + setSize( width, height, depth = 1 ) { + + if ( this.width !== width || this.height !== height || this.depth !== depth ) { + + this.width = width; + this.height = height; + this.depth = depth; + + this.texture.image.width = width; + this.texture.image.height = height; + this.texture.image.depth = depth; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + + this.scissor.copy( source.scissor ); + this.scissorTest = source.scissorTest; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + this.texture.isRenderTargetTexture = true; + + // ensure image object is not shared, see #20328 + + const image = Object.assign( {}, source.texture.image ); + this.texture.source = new Source( image ); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + + if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone(); + + this.samples = source.samples; + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +class WebGLRenderTarget extends RenderTarget { + + constructor( width = 1, height = 1, options = {} ) { + + super( width, height, options ); + + this.isWebGLRenderTarget = true; + + } + +} + +class DataArrayTexture extends Texture { + + constructor( data = null, width = 1, height = 1, depth = 1 ) { + + super( null ); + + this.isDataArrayTexture = true; + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + +} + +class WebGLArrayRenderTarget extends WebGLRenderTarget { + + constructor( width = 1, height = 1, depth = 1, options = {} ) { + + super( width, height, options ); + + this.isWebGLArrayRenderTarget = true; + + this.depth = depth; + + this.texture = new DataArrayTexture( null, width, height, depth ); + + this.texture.isRenderTargetTexture = true; + + } + +} + +class Data3DTexture extends Texture { + + constructor( data = null, width = 1, height = 1, depth = 1 ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // const texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + super( null ); + + this.isData3DTexture = true; + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + +} + +class WebGL3DRenderTarget extends WebGLRenderTarget { + + constructor( width = 1, height = 1, depth = 1, options = {} ) { + + super( width, height, options ); + + this.isWebGL3DRenderTarget = true; + + this.depth = depth; + + this.texture = new Data3DTexture( null, width, height, depth ); + + this.texture.isRenderTargetTexture = true; + + } + +} + +class WebGLMultipleRenderTargets extends WebGLRenderTarget { + + constructor( width = 1, height = 1, count = 1, options = {} ) { + + super( width, height, options ); + + this.isWebGLMultipleRenderTargets = true; + + const texture = this.texture; + + this.texture = []; + + for ( let i = 0; i < count; i ++ ) { + + this.texture[ i ] = texture.clone(); + this.texture[ i ].isRenderTargetTexture = true; + + } + + } + + setSize( width, height, depth = 1 ) { + + if ( this.width !== width || this.height !== height || this.depth !== depth ) { + + this.width = width; + this.height = height; + this.depth = depth; + + for ( let i = 0, il = this.texture.length; i < il; i ++ ) { + + this.texture[ i ].image.width = width; + this.texture[ i ].image.height = height; + this.texture[ i ].image.depth = depth; + + } + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + } + + copy( source ) { + + this.dispose(); + + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + + this.scissor.copy( source.scissor ); + this.scissorTest = source.scissorTest; + + this.viewport.copy( source.viewport ); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + + if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone(); + + this.texture.length = 0; + + for ( let i = 0, il = source.texture.length; i < il; i ++ ) { + + this.texture[ i ] = source.texture[ i ].clone(); + this.texture[ i ].isRenderTargetTexture = true; + + } + + return this; + + } + +} + +class Quaternion { + + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + this.isQuaternion = true; + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + } + + static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + let x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( t === 0 ) { + + dst[ dstOffset + 0 ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + return; + + } + + if ( t === 1 ) { + + dst[ dstOffset + 0 ] = x1; + dst[ dstOffset + 1 ] = y1; + dst[ dstOffset + 2 ] = z1; + dst[ dstOffset + 3 ] = w1; + return; + + } + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + let s = 1 - t; + const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + const sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + const tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + const f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + static multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) { + + const x0 = src0[ srcOffset0 ]; + const y0 = src0[ srcOffset0 + 1 ]; + const z0 = src0[ srcOffset0 + 2 ]; + const w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 ]; + const y1 = src1[ srcOffset1 + 1 ]; + const z1 = src1[ srcOffset1 + 2 ]; + const w1 = src1[ srcOffset1 + 3 ]; + + dst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; + dst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; + dst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; + dst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; + + return dst; + + } + + get x() { + + return this._x; + + } + + set x( value ) { + + this._x = value; + this._onChangeCallback(); + + } + + get y() { + + return this._y; + + } + + set y( value ) { + + this._y = value; + this._onChangeCallback(); + + } + + get z() { + + return this._z; + + } + + set z( value ) { + + this._z = value; + this._onChangeCallback(); + + } + + get w() { + + return this._w; + + } + + set w( value ) { + + this._w = value; + this._onChangeCallback(); + + } + + set( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this._onChangeCallback(); + + return this; + + } + + clone() { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + } + + copy( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this._onChangeCallback(); + + return this; + + } + + setFromEuler( euler, update = true ) { + + const x = euler._x, y = euler._y, z = euler._z, order = euler._order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + const cos = Math.cos; + const sin = Math.sin; + + const c1 = cos( x / 2 ); + const c2 = cos( y / 2 ); + const c3 = cos( z / 2 ); + + const s1 = sin( x / 2 ); + const s2 = sin( y / 2 ); + const s3 = sin( z / 2 ); + + switch ( order ) { + + case 'XYZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'YXZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + case 'ZXY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'ZYX': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + case 'YZX': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'XZY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + default: + console.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order ); + + } + + if ( update === true ) this._onChangeCallback(); + + return this; + + } + + setFromAxisAngle( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + const halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this._onChangeCallback(); + + return this; + + } + + setFromRotationMatrix( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + const te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33; + + if ( trace > 0 ) { + + const s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + const s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + const s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + const s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this._onChangeCallback(); + + return this; + + } + + setFromUnitVectors( vFrom, vTo ) { + + // assumes direction vectors vFrom and vTo are normalized + + let r = vFrom.dot( vTo ) + 1; + + if ( r < Number.EPSILON ) { + + // vFrom and vTo point in opposite directions + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + this._x = - vFrom.y; + this._y = vFrom.x; + this._z = 0; + this._w = r; + + } else { + + this._x = 0; + this._y = - vFrom.z; + this._z = vFrom.y; + this._w = r; + + } + + } else { + + // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3 + + this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; + this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; + this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; + this._w = r; + + } + + return this.normalize(); + + } + + angleTo( q ) { + + return 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) ); + + } + + rotateTowards( q, step ) { + + const angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + const t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + } + + identity() { + + return this.set( 0, 0, 0, 1 ); + + } + + invert() { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + } + + conjugate() { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this._onChangeCallback(); + + return this; + + } + + dot( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + } + + lengthSq() { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + } + + length() { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + } + + normalize() { + + let l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this._onChangeCallback(); + + return this; + + } + + multiply( q ) { + + return this.multiplyQuaternions( this, q ); + + } + + premultiply( q ) { + + return this.multiplyQuaternions( q, this ); + + } + + multiplyQuaternions( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this._onChangeCallback(); + + return this; + + } + + slerp( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + const x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + const s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + this.normalize(); // normalize calls _onChangeCallback() + + return this; + + } + + const sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + const halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + const ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this._onChangeCallback(); + + return this; + + } + + slerpQuaternions( qa, qb, t ) { + + return this.copy( qa ).slerp( qb, t ); + + } + + random() { + + // Derived from http://planning.cs.uiuc.edu/node198.html + // Note, this source uses w, x, y, z ordering, + // so we swap the order below. + + const u1 = Math.random(); + const sqrt1u1 = Math.sqrt( 1 - u1 ); + const sqrtu1 = Math.sqrt( u1 ); + + const u2 = 2 * Math.PI * Math.random(); + + const u3 = 2 * Math.PI * Math.random(); + + return this.set( + sqrt1u1 * Math.cos( u2 ), + sqrtu1 * Math.sin( u3 ), + sqrtu1 * Math.cos( u3 ), + sqrt1u1 * Math.sin( u2 ), + ); + + } + + equals( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + } + + fromArray( array, offset = 0 ) { + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this._onChangeCallback(); + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this._x = attribute.getX( index ); + this._y = attribute.getY( index ); + this._z = attribute.getZ( index ); + this._w = attribute.getW( index ); + + this._onChangeCallback(); + + return this; + + } + + toJSON() { + + return this.toArray(); + + } + + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + + } + + _onChangeCallback() {} + + *[ Symbol.iterator ]() { + + yield this._x; + yield this._y; + yield this._z; + yield this._w; + + } + +} + +class Vector3 { + + constructor( x = 0, y = 0, z = 0 ) { + + Vector3.prototype.isVector3 = true; + + this.x = x; + this.y = y; + this.z = z; + + } + + set( x, y, z ) { + + if ( z === undefined ) z = this.z; // sprite.scale.set(x,y) + + this.x = x; + this.y = y; + this.z = z; + + return this; + + } + + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + } + + setX( x ) { + + this.x = x; + + return this; + + } + + setY( y ) { + + this.y = y; + + return this; + + } + + setZ( z ) { + + this.z = z; + + return this; + + } + + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + clone() { + + return new this.constructor( this.x, this.y, this.z ); + + } + + copy( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + } + + add( v ) { + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + } + + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + } + + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + } + + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + } + + sub( v ) { + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + } + + subScalar( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + } + + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + } + + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + } + + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + } + + multiplyVectors( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + } + + applyEuler( euler ) { + + return this.applyQuaternion( _quaternion$4.setFromEuler( euler ) ); + + } + + applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) ); + + } + + applyMatrix3( m ) { + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + } + + applyNormalMatrix( m ) { + + return this.applyMatrix3( m ).normalize(); + + } + + applyMatrix4( m ) { + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + const w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + } + + applyQuaternion( q ) { + + // quaternion q is assumed to have unit length + + const vx = this.x, vy = this.y, vz = this.z; + const qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // t = 2 * cross( q.xyz, v ); + const tx = 2 * ( qy * vz - qz * vy ); + const ty = 2 * ( qz * vx - qx * vz ); + const tz = 2 * ( qx * vy - qy * vx ); + + // v + q.w * t + cross( q.xyz, t ); + this.x = vx + qw * tx + qy * tz - qz * ty; + this.y = vy + qw * ty + qz * tx - qx * tz; + this.z = vz + qw * tz + qx * ty - qy * tx; + + return this; + + } + + project( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + } + + unproject( camera ) { + + return this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld ); + + } + + transformDirection( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + } + + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + } + + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + } + + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + } + + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + } + + clampScalar( minVal, maxVal ) { + + this.x = Math.max( minVal, Math.min( maxVal, this.x ) ); + this.y = Math.max( minVal, Math.min( maxVal, this.y ) ); + this.z = Math.max( minVal, Math.min( maxVal, this.z ) ); + + return this; + + } + + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + } + + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + } + + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + } + + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + } + + roundToZero() { + + this.x = Math.trunc( this.x ); + this.y = Math.trunc( this.y ); + this.z = Math.trunc( this.z ); + + return this; + + } + + negate() { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + } + + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + } + + // TODO lengthSquared? + + lengthSq() { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + } + + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + } + + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + } + + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + } + + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + + return this; + + } + + cross( v ) { + + return this.crossVectors( this, v ); + + } + + crossVectors( a, b ) { + + const ax = a.x, ay = a.y, az = a.z; + const bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + } + + projectOnVector( v ) { + + const denominator = v.lengthSq(); + + if ( denominator === 0 ) return this.set( 0, 0, 0 ); + + const scalar = v.dot( this ) / denominator; + + return this.copy( v ).multiplyScalar( scalar ); + + } + + projectOnPlane( planeNormal ) { + + _vector$c.copy( this ).projectOnVector( planeNormal ); + + return this.sub( _vector$c ); + + } + + reflect( normal ) { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + return this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + + angleTo( v ) { + + const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() ); + + if ( denominator === 0 ) return Math.PI / 2; + + const theta = this.dot( v ) / denominator; + + // clamp, to handle numerical problems + + return Math.acos( clamp( theta, - 1, 1 ) ); + + } + + distanceTo( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + } + + distanceToSquared( v ) { + + const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + } + + manhattanDistanceTo( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + } + + setFromSpherical( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + } + + setFromSphericalCoords( radius, phi, theta ) { + + const sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + } + + setFromCylindrical( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + } + + setFromCylindricalCoords( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + } + + setFromMatrixPosition( m ) { + + const e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + } + + setFromMatrixScale( m ) { + + const sx = this.setFromMatrixColumn( m, 0 ).length(); + const sy = this.setFromMatrixColumn( m, 1 ).length(); + const sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + } + + setFromMatrixColumn( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + } + + setFromMatrix3Column( m, index ) { + + return this.fromArray( m.elements, index * 3 ); + + } + + setFromEuler( e ) { + + this.x = e._x; + this.y = e._y; + this.z = e._z; + + return this; + + } + + setFromColor( c ) { + + this.x = c.r; + this.y = c.g; + this.z = c.b; + + return this; + + } + + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + } + + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + random() { + + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + + return this; + + } + + randomDirection() { + + // Derived from https://mathworld.wolfram.com/SpherePointPicking.html + + const u = ( Math.random() - 0.5 ) * 2; + const t = Math.random() * Math.PI * 2; + const f = Math.sqrt( 1 - u ** 2 ); + + this.x = f * Math.cos( t ); + this.y = f * Math.sin( t ); + this.z = u; + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + yield this.z; + + } + +} + +const _vector$c = /*@__PURE__*/ new Vector3(); +const _quaternion$4 = /*@__PURE__*/ new Quaternion(); + +class Box3 { + + constructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) { + + this.isBox3 = true; + + this.min = min; + this.max = max; + + } + + set( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + } + + setFromArray( array ) { + + this.makeEmpty(); + + for ( let i = 0, il = array.length; i < il; i += 3 ) { + + this.expandByPoint( _vector$b.fromArray( array, i ) ); + + } + + return this; + + } + + setFromBufferAttribute( attribute ) { + + this.makeEmpty(); + + for ( let i = 0, il = attribute.count; i < il; i ++ ) { + + this.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) ); + + } + + return this; + + } + + setFromPoints( points ) { + + this.makeEmpty(); + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + } + + setFromCenterAndSize( center, size ) { + + const halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + } + + setFromObject( object, precise = false ) { + + this.makeEmpty(); + + return this.expandByObject( object, precise ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + } + + makeEmpty() { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + } + + isEmpty() { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + } + + getCenter( target ) { + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + } + + getSize( target ) { + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + } + + expandByPoint( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + } + + expandByVector( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + } + + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + } + + expandByObject( object, precise = false ) { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + object.updateWorldMatrix( false, false ); + + const geometry = object.geometry; + + if ( geometry !== undefined ) { + + const positionAttribute = geometry.getAttribute( 'position' ); + + // precise AABB computation based on vertex data requires at least a position attribute. + // instancing isn't supported so far and uses the normal (conservative) code path. + + if ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) { + + for ( let i = 0, l = positionAttribute.count; i < l; i ++ ) { + + if ( object.isMesh === true ) { + + object.getVertexPosition( i, _vector$b ); + + } else { + + _vector$b.fromBufferAttribute( positionAttribute, i ); + + } + + _vector$b.applyMatrix4( object.matrixWorld ); + this.expandByPoint( _vector$b ); + + } + + } else { + + if ( object.boundingBox !== undefined ) { + + // object-level bounding box + + if ( object.boundingBox === null ) { + + object.computeBoundingBox(); + + } + + _box$4.copy( object.boundingBox ); + + + } else { + + // geometry-level bounding box + + if ( geometry.boundingBox === null ) { + + geometry.computeBoundingBox(); + + } + + _box$4.copy( geometry.boundingBox ); + + } + + _box$4.applyMatrix4( object.matrixWorld ); + + this.union( _box$4 ); + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + this.expandByObject( children[ i ], precise ); + + } + + return this; + + } + + containsPoint( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ? false : true; + + } + + containsBox( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + } + + getParameter( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + } + + intersectsBox( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + } + + intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, _vector$b ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + } + + intersectsPlane( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + let min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + } + + intersectsTriangle( triangle ) { + + if ( this.isEmpty() ) { + + return false; + + } + + // compute box center and extents + this.getCenter( _center ); + _extents.subVectors( this.max, _center ); + + // translate triangle to aabb origin + _v0$2.subVectors( triangle.a, _center ); + _v1$7.subVectors( triangle.b, _center ); + _v2$4.subVectors( triangle.c, _center ); + + // compute edge vectors for triangle + _f0.subVectors( _v1$7, _v0$2 ); + _f1.subVectors( _v2$4, _v1$7 ); + _f2.subVectors( _v0$2, _v2$4 ); + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + let axes = [ + 0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y, + _f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x, + - _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0 + ]; + if ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) { + + return false; + + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + _triangleNormal.crossVectors( _f0, _f1 ); + axes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ]; + + return satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ); + + } + + clampPoint( point, target ) { + + return target.copy( point ).clamp( this.min, this.max ); + + } + + distanceToPoint( point ) { + + return this.clampPoint( point, _vector$b ).distanceTo( point ); + + } + + getBoundingSphere( target ) { + + if ( this.isEmpty() ) { + + target.makeEmpty(); + + } else { + + this.getCenter( target.center ); + + target.radius = this.getSize( _vector$b ).length() * 0.5; + + } + + return target; + + } + + intersect( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + } + + union( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + } + + applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + _points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + _points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + _points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + _points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + _points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + _points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + _points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + _points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( _points ); + + return this; + + } + + translate( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + } + + equals( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} + +const _points = [ + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3() +]; + +const _vector$b = /*@__PURE__*/ new Vector3(); + +const _box$4 = /*@__PURE__*/ new Box3(); + +// triangle centered vertices + +const _v0$2 = /*@__PURE__*/ new Vector3(); +const _v1$7 = /*@__PURE__*/ new Vector3(); +const _v2$4 = /*@__PURE__*/ new Vector3(); + +// triangle edge vectors + +const _f0 = /*@__PURE__*/ new Vector3(); +const _f1 = /*@__PURE__*/ new Vector3(); +const _f2 = /*@__PURE__*/ new Vector3(); + +const _center = /*@__PURE__*/ new Vector3(); +const _extents = /*@__PURE__*/ new Vector3(); +const _triangleNormal = /*@__PURE__*/ new Vector3(); +const _testAxis = /*@__PURE__*/ new Vector3(); + +function satForAxes( axes, v0, v1, v2, extents ) { + + for ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + _testAxis.fromArray( axes, i ); + // project the aabb onto the separating axis + const r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z ); + // project all 3 vertices of the triangle onto the separating axis + const p0 = v0.dot( _testAxis ); + const p1 = v1.dot( _testAxis ); + const p2 = v2.dot( _testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { + + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is separating and we can exit + return false; + + } + + } + + return true; + +} + +const _box$3 = /*@__PURE__*/ new Box3(); +const _v1$6 = /*@__PURE__*/ new Vector3(); +const _v2$3 = /*@__PURE__*/ new Vector3(); + +class Sphere { + + constructor( center = new Vector3(), radius = - 1 ) { + + this.isSphere = true; + + this.center = center; + this.radius = radius; + + } + + set( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + } + + setFromPoints( points, optionalCenter ) { + + const center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + _box$3.setFromPoints( points ).getCenter( center ); + + } + + let maxRadiusSq = 0; + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + } + + copy( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + } + + isEmpty() { + + return ( this.radius < 0 ); + + } + + makeEmpty() { + + this.center.set( 0, 0, 0 ); + this.radius = - 1; + + return this; + + } + + containsPoint( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + } + + distanceToPoint( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + } + + intersectsSphere( sphere ) { + + const radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + } + + intersectsBox( box ) { + + return box.intersectsSphere( this ); + + } + + intersectsPlane( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + } + + clampPoint( point, target ) { + + const deltaLengthSq = this.center.distanceToSquared( point ); + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + } + + getBoundingBox( target ) { + + if ( this.isEmpty() ) { + + // Empty sphere produces empty bounding box + target.makeEmpty(); + return target; + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + } + + applyMatrix4( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + } + + translate( offset ) { + + this.center.add( offset ); + + return this; + + } + + expandByPoint( point ) { + + if ( this.isEmpty() ) { + + this.center.copy( point ); + + this.radius = 0; + + return this; + + } + + _v1$6.subVectors( point, this.center ); + + const lengthSq = _v1$6.lengthSq(); + + if ( lengthSq > ( this.radius * this.radius ) ) { + + // calculate the minimal sphere + + const length = Math.sqrt( lengthSq ); + + const delta = ( length - this.radius ) * 0.5; + + this.center.addScaledVector( _v1$6, delta / length ); + + this.radius += delta; + + } + + return this; + + } + + union( sphere ) { + + if ( sphere.isEmpty() ) { + + return this; + + } + + if ( this.isEmpty() ) { + + this.copy( sphere ); + + return this; + + } + + if ( this.center.equals( sphere.center ) === true ) { + + this.radius = Math.max( this.radius, sphere.radius ); + + } else { + + _v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius ); + + this.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) ); + + this.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) ); + + } + + return this; + + } + + equals( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$a = /*@__PURE__*/ new Vector3(); +const _segCenter = /*@__PURE__*/ new Vector3(); +const _segDir = /*@__PURE__*/ new Vector3(); +const _diff = /*@__PURE__*/ new Vector3(); + +const _edge1 = /*@__PURE__*/ new Vector3(); +const _edge2 = /*@__PURE__*/ new Vector3(); +const _normal$1 = /*@__PURE__*/ new Vector3(); + +class Ray { + + constructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) { + + this.origin = origin; + this.direction = direction; + + } + + set( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + } + + copy( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + } + + at( t, target ) { + + return target.copy( this.origin ).addScaledVector( this.direction, t ); + + } + + lookAt( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + } + + recast( t ) { + + this.origin.copy( this.at( t, _vector$a ) ); + + return this; + + } + + closestPointToPoint( point, target ) { + + target.subVectors( point, this.origin ); + + const directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + + } + + distanceToPoint( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + } + + distanceSqToPoint( point ) { + + const directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + _vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + + return _vector$a.distanceToSquared( point ); + + } + + distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + _segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + _segDir.copy( v1 ).sub( v0 ).normalize(); + _diff.copy( this.origin ).sub( _segCenter ); + + const segExtent = v0.distanceTo( v1 ) * 0.5; + const a01 = - this.direction.dot( _segDir ); + const b0 = _diff.dot( this.direction ); + const b1 = - _diff.dot( _segDir ); + const c = _diff.lengthSq(); + const det = Math.abs( 1 - a01 * a01 ); + let s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + const invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 ); + + } + + return sqrDist; + + } + + intersectSphere( sphere, target ) { + + _vector$a.subVectors( sphere.center, this.origin ); + const tca = _vector$a.dot( this.direction ); + const d2 = _vector$a.dot( _vector$a ) - tca * tca; + const radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + const thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + const t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + const t1 = tca + thc; + + // test to see if t1 is behind the ray - if so, return null + if ( t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); + + } + + intersectsSphere( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + } + + distanceToPlane( plane ) { + + const denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + const t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + } + + intersectPlane( plane, target ) { + + const t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + } + + intersectsPlane( plane ) { + + // check if the ray lies on the plane first + + const distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + const denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + } + + intersectBox( box, target ) { + + let tmin, tmax, tymin, tymax, tzmin, tzmax; + + const invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + const origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + if ( tymin > tmin || isNaN( tmin ) ) tmin = tymin; + + if ( tymax < tmax || isNaN( tmax ) ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, target ); + + } + + intersectsBox( box ) { + + return this.intersectBox( box, _vector$a ) !== null; + + } + + intersectTriangle( a, b, c, backfaceCulling, target ) { + + // Compute the offset origin, edges, and normal. + + // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + _edge1.subVectors( b, a ); + _edge2.subVectors( c, a ); + _normal$1.crossVectors( _edge1, _edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + let DdN = this.direction.dot( _normal$1 ); + let sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + _diff.subVectors( this.origin, a ); + const DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + const DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + const QdN = - sign * _diff.dot( _normal$1 ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + } + + applyMatrix4( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + } + + equals( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +class Matrix4 { + + constructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + Matrix4.prototype.isMatrix4 = true; + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( n11 !== undefined ) { + + this.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ); + + } + + } + + set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + const te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + } + + identity() { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + clone() { + + return new Matrix4().fromArray( this.elements ); + + } + + copy( m ) { + + const te = this.elements; + const me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + } + + copyPosition( m ) { + + const te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + } + + setFromMatrix3( m ) { + + const me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], 0, + me[ 1 ], me[ 4 ], me[ 7 ], 0, + me[ 2 ], me[ 5 ], me[ 8 ], 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + extractBasis( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + } + + makeBasis( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + } + + extractRotation( m ) { + + // this method does not support reflection matrices + + const te = this.elements; + const me = m.elements; + + const scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length(); + const scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length(); + const scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + te[ 3 ] = 0; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + te[ 7 ] = 0; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + te[ 11 ] = 0; + + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + } + + makeRotationFromEuler( euler ) { + + const te = this.elements; + + const x = euler.x, y = euler.y, z = euler.z; + const a = Math.cos( x ), b = Math.sin( x ); + const c = Math.cos( y ), d = Math.sin( y ); + const e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + const ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + const ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + const ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + const ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // bottom row + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // last column + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + } + + makeRotationFromQuaternion( q ) { + + return this.compose( _zero, q, _one ); + + } + + lookAt( eye, target, up ) { + + const te = this.elements; + + _z.subVectors( eye, target ); + + if ( _z.lengthSq() === 0 ) { + + // eye and target are in the same position + + _z.z = 1; + + } + + _z.normalize(); + _x.crossVectors( up, _z ); + + if ( _x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + _z.x += 0.0001; + + } else { + + _z.z += 0.0001; + + } + + _z.normalize(); + _x.crossVectors( up, _z ); + + } + + _x.normalize(); + _y.crossVectors( _z, _x ); + + te[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x; + te[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y; + te[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z; + + return this; + + } + + multiply( m ) { + + return this.multiplyMatrices( this, m ); + + } + + premultiply( m ) { + + return this.multiplyMatrices( m, this ); + + } + + multiplyMatrices( a, b ) { + + const ae = a.elements; + const be = b.elements; + const te = this.elements; + + const a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + const a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + const a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + const a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + const b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + const b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + const b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + const b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + } + + multiplyScalar( s ) { + + const te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + } + + determinant() { + + const te = this.elements; + + const n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + const n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + const n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + const n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + } + + transpose() { + + const te = this.elements; + let tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + } + + setPosition( x, y, z ) { + + const te = this.elements; + + if ( x.isVector3 ) { + + te[ 12 ] = x.x; + te[ 13 ] = x.y; + te[ 14 ] = x.z; + + } else { + + te[ 12 ] = x; + te[ 13 ] = y; + te[ 14 ] = z; + + } + + return this; + + } + + invert() { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + const te = this.elements, + + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ], + n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ], + n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ], + n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + + const detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + } + + scale( v ) { + + const te = this.elements; + const x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + } + + getMaxScaleOnAxis() { + + const te = this.elements; + + const scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + const scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + const scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + } + + makeTranslation( x, y, z ) { + + if ( x.isVector3 ) { + + this.set( + + 1, 0, 0, x.x, + 0, 1, 0, x.y, + 0, 0, 1, x.z, + 0, 0, 0, 1 + + ); + + } else { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + } + + return this; + + } + + makeRotationX( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationY( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationZ( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeRotationAxis( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + const c = Math.cos( angle ); + const s = Math.sin( angle ); + const t = 1 - c; + const x = axis.x, y = axis.y, z = axis.z; + const tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeScale( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + makeShear( xy, xz, yx, yz, zx, zy ) { + + this.set( + + 1, yx, zx, 0, + xy, 1, zy, 0, + xz, yz, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + compose( position, quaternion, scale ) { + + const te = this.elements; + + const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + const x2 = x + x, y2 = y + y, z2 = z + z; + const xx = x * x2, xy = x * y2, xz = x * z2; + const yy = y * y2, yz = y * z2, zz = z * z2; + const wx = w * x2, wy = w * y2, wz = w * z2; + + const sx = scale.x, sy = scale.y, sz = scale.z; + + te[ 0 ] = ( 1 - ( yy + zz ) ) * sx; + te[ 1 ] = ( xy + wz ) * sx; + te[ 2 ] = ( xz - wy ) * sx; + te[ 3 ] = 0; + + te[ 4 ] = ( xy - wz ) * sy; + te[ 5 ] = ( 1 - ( xx + zz ) ) * sy; + te[ 6 ] = ( yz + wx ) * sy; + te[ 7 ] = 0; + + te[ 8 ] = ( xz + wy ) * sz; + te[ 9 ] = ( yz - wx ) * sz; + te[ 10 ] = ( 1 - ( xx + yy ) ) * sz; + te[ 11 ] = 0; + + te[ 12 ] = position.x; + te[ 13 ] = position.y; + te[ 14 ] = position.z; + te[ 15 ] = 1; + + return this; + + } + + decompose( position, quaternion, scale ) { + + const te = this.elements; + + let sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + const sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + const sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + const det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + _m1$2.copy( this ); + + const invSX = 1 / sx; + const invSY = 1 / sy; + const invSZ = 1 / sz; + + _m1$2.elements[ 0 ] *= invSX; + _m1$2.elements[ 1 ] *= invSX; + _m1$2.elements[ 2 ] *= invSX; + + _m1$2.elements[ 4 ] *= invSY; + _m1$2.elements[ 5 ] *= invSY; + _m1$2.elements[ 6 ] *= invSY; + + _m1$2.elements[ 8 ] *= invSZ; + _m1$2.elements[ 9 ] *= invSZ; + _m1$2.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( _m1$2 ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + } + + makePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) { + + const te = this.elements; + const x = 2 * near / ( right - left ); + const y = 2 * near / ( top - bottom ); + + const a = ( right + left ) / ( right - left ); + const b = ( top + bottom ) / ( top - bottom ); + + let c, d; + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + c = - ( far + near ) / ( far - near ); + d = ( - 2 * far * near ) / ( far - near ); + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + c = - far / ( far - near ); + d = ( - far * near ) / ( far - near ); + + } else { + + throw new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem ); + + } + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + } + + makeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) { + + const te = this.elements; + const w = 1.0 / ( right - left ); + const h = 1.0 / ( top - bottom ); + const p = 1.0 / ( far - near ); + + const x = ( right + left ) * w; + const y = ( top + bottom ) * h; + + let z, zInv; + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + z = ( far + near ) * p; + zInv = - 2 * p; + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + z = near * p; + zInv = - 1 * p; + + } else { + + throw new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem ); + + } + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = zInv; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + } + + equals( matrix ) { + + const te = this.elements; + const me = matrix.elements; + + for ( let i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + } + + fromArray( array, offset = 0 ) { + + for ( let i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + +} + +const _v1$5 = /*@__PURE__*/ new Vector3(); +const _m1$2 = /*@__PURE__*/ new Matrix4(); +const _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 ); +const _one = /*@__PURE__*/ new Vector3( 1, 1, 1 ); +const _x = /*@__PURE__*/ new Vector3(); +const _y = /*@__PURE__*/ new Vector3(); +const _z = /*@__PURE__*/ new Vector3(); + +const _matrix$1 = /*@__PURE__*/ new Matrix4(); +const _quaternion$3 = /*@__PURE__*/ new Quaternion(); + +class Euler { + + constructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) { + + this.isEuler = true; + + this._x = x; + this._y = y; + this._z = z; + this._order = order; + + } + + get x() { + + return this._x; + + } + + set x( value ) { + + this._x = value; + this._onChangeCallback(); + + } + + get y() { + + return this._y; + + } + + set y( value ) { + + this._y = value; + this._onChangeCallback(); + + } + + get z() { + + return this._z; + + } + + set z( value ) { + + this._z = value; + this._onChangeCallback(); + + } + + get order() { + + return this._order; + + } + + set order( value ) { + + this._order = value; + this._onChangeCallback(); + + } + + set( x, y, z, order = this._order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order; + + this._onChangeCallback(); + + return this; + + } + + clone() { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + } + + copy( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this._onChangeCallback(); + + return this; + + } + + setFromRotationMatrix( m, order = this._order, update = true ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + const te = m.elements; + const m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + const m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + const m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + switch ( order ) { + + case 'XYZ': + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.9999999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + break; + + case 'YXZ': + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.9999999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + break; + + case 'ZXY': + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.9999999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + break; + + case 'ZYX': + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.9999999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + break; + + case 'YZX': + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.9999999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + break; + + case 'XZY': + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.9999999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + break; + + default: + + console.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order ); + + } + + this._order = order; + + if ( update === true ) this._onChangeCallback(); + + return this; + + } + + setFromQuaternion( q, order, update ) { + + _matrix$1.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( _matrix$1, order, update ); + + } + + setFromVector3( v, order = this._order ) { + + return this.set( v.x, v.y, v.z, order ); + + } + + reorder( newOrder ) { + + // WARNING: this discards revolution information -bhouston + + _quaternion$3.setFromEuler( this ); + + return this.setFromQuaternion( _quaternion$3, newOrder ); + + } + + equals( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + } + + fromArray( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this._onChangeCallback(); + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + } + + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + + } + + _onChangeCallback() {} + + *[ Symbol.iterator ]() { + + yield this._x; + yield this._y; + yield this._z; + yield this._order; + + } + +} + +Euler.DEFAULT_ORDER = 'XYZ'; + +class Layers { + + constructor() { + + this.mask = 1 | 0; + + } + + set( channel ) { + + this.mask = ( 1 << channel | 0 ) >>> 0; + + } + + enable( channel ) { + + this.mask |= 1 << channel | 0; + + } + + enableAll() { + + this.mask = 0xffffffff | 0; + + } + + toggle( channel ) { + + this.mask ^= 1 << channel | 0; + + } + + disable( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + } + + disableAll() { + + this.mask = 0; + + } + + test( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + isEnabled( channel ) { + + return ( this.mask & ( 1 << channel | 0 ) ) !== 0; + + } + +} + +let _object3DId = 0; + +const _v1$4 = /*@__PURE__*/ new Vector3(); +const _q1 = /*@__PURE__*/ new Quaternion(); +const _m1$1 = /*@__PURE__*/ new Matrix4(); +const _target = /*@__PURE__*/ new Vector3(); + +const _position$3 = /*@__PURE__*/ new Vector3(); +const _scale$2 = /*@__PURE__*/ new Vector3(); +const _quaternion$2 = /*@__PURE__*/ new Quaternion(); + +const _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 ); +const _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 ); +const _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 ); + +const _addedEvent = { type: 'added' }; +const _removedEvent = { type: 'removed' }; + +class Object3D extends EventDispatcher { + + constructor() { + + super(); + + this.isObject3D = true; + + Object.defineProperty( this, 'id', { value: _object3DId ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DEFAULT_UP.clone(); + + const position = new Vector3(); + const rotation = new Euler(); + const quaternion = new Quaternion(); + const scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation._onChange( onRotationChange ); + quaternion._onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE; + + this.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.animations = []; + + this.userData = {}; + + } + + onBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {} + + onAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {} + + onBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {} + + onAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {} + + applyMatrix4( matrix ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + this.matrix.premultiply( matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + } + + applyQuaternion( q ) { + + this.quaternion.premultiply( q ); + + return this; + + } + + setRotationFromAxisAngle( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + } + + setRotationFromEuler( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + } + + setRotationFromMatrix( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + } + + setRotationFromQuaternion( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + } + + rotateOnAxis( axis, angle ) { + + // rotate object on axis in object space + // axis is assumed to be normalized + + _q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( _q1 ); + + return this; + + } + + rotateOnWorldAxis( axis, angle ) { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + _q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( _q1 ); + + return this; + + } + + rotateX( angle ) { + + return this.rotateOnAxis( _xAxis, angle ); + + } + + rotateY( angle ) { + + return this.rotateOnAxis( _yAxis, angle ); + + } + + rotateZ( angle ) { + + return this.rotateOnAxis( _zAxis, angle ); + + } + + translateOnAxis( axis, distance ) { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + _v1$4.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( _v1$4.multiplyScalar( distance ) ); + + return this; + + } + + translateX( distance ) { + + return this.translateOnAxis( _xAxis, distance ); + + } + + translateY( distance ) { + + return this.translateOnAxis( _yAxis, distance ); + + } + + translateZ( distance ) { + + return this.translateOnAxis( _zAxis, distance ); + + } + + localToWorld( vector ) { + + this.updateWorldMatrix( true, false ); + + return vector.applyMatrix4( this.matrixWorld ); + + } + + worldToLocal( vector ) { + + this.updateWorldMatrix( true, false ); + + return vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() ); + + } + + lookAt( x, y, z ) { + + // This method does not support objects having non-uniformly-scaled parent(s) + + if ( x.isVector3 ) { + + _target.copy( x ); + + } else { + + _target.set( x, y, z ); + + } + + const parent = this.parent; + + this.updateWorldMatrix( true, false ); + + _position$3.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera || this.isLight ) { + + _m1$1.lookAt( _position$3, _target, this.up ); + + } else { + + _m1$1.lookAt( _target, _position$3, this.up ); + + } + + this.quaternion.setFromRotationMatrix( _m1$1 ); + + if ( parent ) { + + _m1$1.extractRotation( parent.matrixWorld ); + _q1.setFromRotationMatrix( _m1$1 ); + this.quaternion.premultiply( _q1.invert() ); + + } + + } + + add( object ) { + + if ( arguments.length > 1 ) { + + for ( let i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( 'THREE.Object3D.add: object can\'t be added as a child of itself.', object ); + return this; + + } + + if ( object && object.isObject3D ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + this.children.push( object ); + + object.dispatchEvent( _addedEvent ); + + } else { + + console.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object ); + + } + + return this; + + } + + remove( object ) { + + if ( arguments.length > 1 ) { + + for ( let i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + const index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + this.children.splice( index, 1 ); + + object.dispatchEvent( _removedEvent ); + + } + + return this; + + } + + removeFromParent() { + + const parent = this.parent; + + if ( parent !== null ) { + + parent.remove( this ); + + } + + return this; + + } + + clear() { + + return this.remove( ... this.children ); + + } + + attach( object ) { + + // adds object as a child of this, while maintaining the object's world transform + + // Note: This method does not support scene graphs having non-uniformly-scaled nodes(s) + + this.updateWorldMatrix( true, false ); + + _m1$1.copy( this.matrixWorld ).invert(); + + if ( object.parent !== null ) { + + object.parent.updateWorldMatrix( true, false ); + + _m1$1.multiply( object.parent.matrixWorld ); + + } + + object.applyMatrix4( _m1$1 ); + + this.add( object ); + + object.updateWorldMatrix( false, true ); + + return this; + + } + + getObjectById( id ) { + + return this.getObjectByProperty( 'id', id ); + + } + + getObjectByName( name ) { + + return this.getObjectByProperty( 'name', name ); + + } + + getObjectByProperty( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( let i = 0, l = this.children.length; i < l; i ++ ) { + + const child = this.children[ i ]; + const object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + } + + getObjectsByProperty( name, value, result = [] ) { + + if ( this[ name ] === value ) result.push( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].getObjectsByProperty( name, value, result ); + + } + + return result; + + } + + getWorldPosition( target ) { + + this.updateWorldMatrix( true, false ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + } + + getWorldQuaternion( target ) { + + this.updateWorldMatrix( true, false ); + + this.matrixWorld.decompose( _position$3, target, _scale$2 ); + + return target; + + } + + getWorldScale( target ) { + + this.updateWorldMatrix( true, false ); + + this.matrixWorld.decompose( _position$3, _quaternion$2, target ); + + return target; + + } + + getWorldDirection( target ) { + + this.updateWorldMatrix( true, false ); + + const e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + } + + raycast( /* raycaster, intersects */ ) {} + + traverse( callback ) { + + callback( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + } + + traverseVisible( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + } + + traverseAncestors( callback ) { + + const parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + } + + updateMatrix() { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + } + + updateMatrixWorld( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + const child = children[ i ]; + + if ( child.matrixWorldAutoUpdate === true || force === true ) { + + child.updateMatrixWorld( force ); + + } + + } + + } + + updateWorldMatrix( updateParents, updateChildren ) { + + const parent = this.parent; + + if ( updateParents === true && parent !== null && parent.matrixWorldAutoUpdate === true ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + // update children + + if ( updateChildren === true ) { + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + const child = children[ i ]; + + if ( child.matrixWorldAutoUpdate === true ) { + + child.updateWorldMatrix( false, true ); + + } + + } + + } + + } + + toJSON( meta ) { + + // meta is a string when called from JSON.stringify + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + const output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {}, + skeletons: {}, + animations: {}, + nodes: {} + }; + + output.metadata = { + version: 4.6, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + const object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + object.up = this.up.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // object specific properties + + if ( this.isInstancedMesh ) { + + object.type = 'InstancedMesh'; + object.count = this.count; + object.instanceMatrix = this.instanceMatrix.toJSON(); + if ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON(); + + } + + if ( this.isBatchedMesh ) { + + object.type = 'BatchedMesh'; + object.perObjectFrustumCulled = this.perObjectFrustumCulled; + object.sortObjects = this.sortObjects; + + object.drawRanges = this._drawRanges; + object.reservedRanges = this._reservedRanges; + + object.visibility = this._visibility; + object.active = this._active; + object.bounds = this._bounds.map( bound => ( { + boxInitialized: bound.boxInitialized, + boxMin: bound.box.min.toArray(), + boxMax: bound.box.max.toArray(), + + sphereInitialized: bound.sphereInitialized, + sphereRadius: bound.sphere.radius, + sphereCenter: bound.sphere.center.toArray() + } ) ); + + object.maxGeometryCount = this._maxGeometryCount; + object.maxVertexCount = this._maxVertexCount; + object.maxIndexCount = this._maxIndexCount; + + object.geometryInitialized = this._geometryInitialized; + object.geometryCount = this._geometryCount; + + object.matricesTexture = this._matricesTexture.toJSON( meta ); + + if ( this.boundingSphere !== null ) { + + object.boundingSphere = { + center: object.boundingSphere.center.toArray(), + radius: object.boundingSphere.radius + }; + + } + + if ( this.boundingBox !== null ) { + + object.boundingBox = { + min: object.boundingBox.min.toArray(), + max: object.boundingBox.max.toArray() + }; + + } + + } + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isScene ) { + + if ( this.background ) { + + if ( this.background.isColor ) { + + object.background = this.background.toJSON(); + + } else if ( this.background.isTexture ) { + + object.background = this.background.toJSON( meta ).uuid; + + } + + } + + if ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) { + + object.environment = this.environment.toJSON( meta ).uuid; + + } + + } else if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + const parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + const shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.isSkinnedMesh ) { + + object.bindMode = this.bindMode; + object.bindMatrix = this.bindMatrix.toArray(); + + if ( this.skeleton !== undefined ) { + + serialize( meta.skeletons, this.skeleton ); + + object.skeleton = this.skeleton.uuid; + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + const uuids = []; + + for ( let i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( let i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + // + + if ( this.animations.length > 0 ) { + + object.animations = []; + + for ( let i = 0; i < this.animations.length; i ++ ) { + + const animation = this.animations[ i ]; + + object.animations.push( serialize( meta.animations, animation ) ); + + } + + } + + if ( isRootObject ) { + + const geometries = extractFromCache( meta.geometries ); + const materials = extractFromCache( meta.materials ); + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + const shapes = extractFromCache( meta.shapes ); + const skeletons = extractFromCache( meta.skeletons ); + const animations = extractFromCache( meta.animations ); + const nodes = extractFromCache( meta.nodes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + if ( skeletons.length > 0 ) output.skeletons = skeletons; + if ( animations.length > 0 ) output.animations = animations; + if ( nodes.length > 0 ) output.nodes = nodes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + const values = []; + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + } + + clone( recursive ) { + + return new this.constructor().copy( this, recursive ); + + } + + copy( source, recursive = true ) { + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.rotation.order = source.rotation.order; + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + + this.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.animations = source.animations.slice(); + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( let i = 0; i < source.children.length; i ++ ) { + + const child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +} + +Object3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 ); +Object3D.DEFAULT_MATRIX_AUTO_UPDATE = true; +Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true; + +const _v0$1 = /*@__PURE__*/ new Vector3(); +const _v1$3 = /*@__PURE__*/ new Vector3(); +const _v2$2 = /*@__PURE__*/ new Vector3(); +const _v3$1 = /*@__PURE__*/ new Vector3(); + +const _vab = /*@__PURE__*/ new Vector3(); +const _vac = /*@__PURE__*/ new Vector3(); +const _vbc = /*@__PURE__*/ new Vector3(); +const _vap = /*@__PURE__*/ new Vector3(); +const _vbp = /*@__PURE__*/ new Vector3(); +const _vcp = /*@__PURE__*/ new Vector3(); + +let warnedGetUV = false; + +class Triangle { + + constructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) { + + this.a = a; + this.b = b; + this.c = c; + + } + + static getNormal( a, b, c, target ) { + + target.subVectors( c, b ); + _v0$1.subVectors( a, b ); + target.cross( _v0$1 ); + + const targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + } + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + static getBarycoord( point, a, b, c, target ) { + + _v0$1.subVectors( c, a ); + _v1$3.subVectors( b, a ); + _v2$2.subVectors( point, a ); + + const dot00 = _v0$1.dot( _v0$1 ); + const dot01 = _v0$1.dot( _v1$3 ); + const dot02 = _v0$1.dot( _v2$2 ); + const dot11 = _v1$3.dot( _v1$3 ); + const dot12 = _v1$3.dot( _v2$2 ); + + const denom = ( dot00 * dot11 - dot01 * dot01 ); + + // collinear or singular triangle + if ( denom === 0 ) { + + target.set( 0, 0, 0 ); + return null; + + } + + const invDenom = 1 / denom; + const u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + const v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + } + + static containsPoint( point, a, b, c ) { + + // if the triangle is degenerate then we can't contain a point + if ( this.getBarycoord( point, a, b, c, _v3$1 ) === null ) { + + return false; + + } + + return ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 ); + + } + + static getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { // @deprecated, r151 + + if ( warnedGetUV === false ) { + + console.warn( 'THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().' ); + + warnedGetUV = true; + + } + + return this.getInterpolation( point, p1, p2, p3, uv1, uv2, uv3, target ); + + } + + static getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) { + + if ( this.getBarycoord( point, p1, p2, p3, _v3$1 ) === null ) { + + target.x = 0; + target.y = 0; + if ( 'z' in target ) target.z = 0; + if ( 'w' in target ) target.w = 0; + return null; + + } + + target.setScalar( 0 ); + target.addScaledVector( v1, _v3$1.x ); + target.addScaledVector( v2, _v3$1.y ); + target.addScaledVector( v3, _v3$1.z ); + + return target; + + } + + static isFrontFacing( a, b, c, direction ) { + + _v0$1.subVectors( c, b ); + _v1$3.subVectors( a, b ); + + // strictly front facing + return ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false; + + } + + set( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + } + + setFromPointsAndIndices( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + } + + setFromAttributeAndIndices( attribute, i0, i1, i2 ) { + + this.a.fromBufferAttribute( attribute, i0 ); + this.b.fromBufferAttribute( attribute, i1 ); + this.c.fromBufferAttribute( attribute, i2 ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + } + + getArea() { + + _v0$1.subVectors( this.c, this.b ); + _v1$3.subVectors( this.a, this.b ); + + return _v0$1.cross( _v1$3 ).length() * 0.5; + + } + + getMidpoint( target ) { + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + } + + getNormal( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + } + + getPlane( target ) { + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + } + + getBarycoord( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + } + + getUV( point, uv1, uv2, uv3, target ) { // @deprecated, r151 + + if ( warnedGetUV === false ) { + + console.warn( 'THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().' ); + + warnedGetUV = true; + + } + + return Triangle.getInterpolation( point, this.a, this.b, this.c, uv1, uv2, uv3, target ); + + } + + getInterpolation( point, v1, v2, v3, target ) { + + return Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target ); + + } + + containsPoint( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + } + + isFrontFacing( direction ) { + + return Triangle.isFrontFacing( this.a, this.b, this.c, direction ); + + } + + intersectsBox( box ) { + + return box.intersectsTriangle( this ); + + } + + closestPointToPoint( p, target ) { + + const a = this.a, b = this.b, c = this.c; + let v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + _vab.subVectors( b, a ); + _vac.subVectors( c, a ); + _vap.subVectors( p, a ); + const d1 = _vab.dot( _vap ); + const d2 = _vac.dot( _vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + _vbp.subVectors( p, b ); + const d3 = _vab.dot( _vbp ); + const d4 = _vac.dot( _vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + const vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( _vab, v ); + + } + + _vcp.subVectors( p, c ); + const d5 = _vab.dot( _vcp ); + const d6 = _vac.dot( _vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + const vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( _vac, w ); + + } + + const va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + _vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC + + } + + // face region + const denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + + return target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w ); + + } + + equals( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +} + +const _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +const _hslA = { h: 0, s: 0, l: 0 }; +const _hslB = { h: 0, s: 0, l: 0 }; + +function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + +} + +class Color { + + constructor( r, g, b ) { + + this.isColor = true; + + this.r = 1; + this.g = 1; + this.b = 1; + + return this.set( r, g, b ); + + } + + set( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + + const value = r; + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + } else { + + this.setRGB( r, g, b ); + + } + + return this; + + } + + setScalar( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + } + + setHex( hex, colorSpace = SRGBColorSpace ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + ColorManagement.toWorkingColorSpace( this, colorSpace ); + + return this; + + } + + setRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) { + + this.r = r; + this.g = g; + this.b = b; + + ColorManagement.toWorkingColorSpace( this, colorSpace ); + + return this; + + } + + setHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = euclideanModulo( h, 1 ); + s = clamp( s, 0, 1 ); + l = clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + const p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + const q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + ColorManagement.toWorkingColorSpace( this, colorSpace ); + + return this; + + } + + setStyle( style, colorSpace = SRGBColorSpace ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + let m; + + if ( m = /^(\w+)\(([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + let color; + const name = m[ 1 ]; + const components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + + handleAlpha( color[ 4 ] ); + + return this.setRGB( + Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255, + Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255, + Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255, + colorSpace + ); + + } + + if ( color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + + handleAlpha( color[ 4 ] ); + + return this.setRGB( + Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100, + Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100, + Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100, + colorSpace + ); + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + + handleAlpha( color[ 4 ] ); + + return this.setHSL( + parseFloat( color[ 1 ] ) / 360, + parseFloat( color[ 2 ] ) / 100, + parseFloat( color[ 3 ] ) / 100, + colorSpace + ); + + } + + break; + + default: + + console.warn( 'THREE.Color: Unknown color model ' + style ); + + } + + } else if ( m = /^\#([A-Fa-f\d]+)$/.exec( style ) ) { + + // hex color + + const hex = m[ 1 ]; + const size = hex.length; + + if ( size === 3 ) { + + // #ff0 + return this.setRGB( + parseInt( hex.charAt( 0 ), 16 ) / 15, + parseInt( hex.charAt( 1 ), 16 ) / 15, + parseInt( hex.charAt( 2 ), 16 ) / 15, + colorSpace + ); + + } else if ( size === 6 ) { + + // #ff0000 + return this.setHex( parseInt( hex, 16 ), colorSpace ); + + } else { + + console.warn( 'THREE.Color: Invalid hex color ' + style ); + + } + + } else if ( style && style.length > 0 ) { + + return this.setColorName( style, colorSpace ); + + } + + return this; + + } + + setColorName( style, colorSpace = SRGBColorSpace ) { + + // color keywords + const hex = _colorKeywords[ style.toLowerCase() ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex, colorSpace ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + return this; + + } + + clone() { + + return new this.constructor( this.r, this.g, this.b ); + + } + + copy( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + } + + copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + } + + copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + } + + convertSRGBToLinear() { + + this.copySRGBToLinear( this ); + + return this; + + } + + convertLinearToSRGB() { + + this.copyLinearToSRGB( this ); + + return this; + + } + + getHex( colorSpace = SRGBColorSpace ) { + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + return Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) ); + + } + + getHexString( colorSpace = SRGBColorSpace ) { + + return ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 ); + + } + + getHSL( target, colorSpace = ColorManagement.workingColorSpace ) { + + // h,s,l ranges are in 0.0 - 1.0 + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + const r = _color.r, g = _color.g, b = _color.b; + + const max = Math.max( r, g, b ); + const min = Math.min( r, g, b ); + + let hue, saturation; + const lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + const delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + } + + getRGB( target, colorSpace = ColorManagement.workingColorSpace ) { + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + target.r = _color.r; + target.g = _color.g; + target.b = _color.b; + + return target; + + } + + getStyle( colorSpace = SRGBColorSpace ) { + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + const r = _color.r, g = _color.g, b = _color.b; + + if ( colorSpace !== SRGBColorSpace ) { + + // Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/). + return `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`; + + } + + return `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`; + + } + + offsetHSL( h, s, l ) { + + this.getHSL( _hslA ); + + return this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l ); + + } + + add( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + } + + addColors( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + } + + addScalar( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + } + + sub( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + } + + multiply( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + } + + multiplyScalar( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + } + + lerp( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + } + + lerpColors( color1, color2, alpha ) { + + this.r = color1.r + ( color2.r - color1.r ) * alpha; + this.g = color1.g + ( color2.g - color1.g ) * alpha; + this.b = color1.b + ( color2.b - color1.b ) * alpha; + + return this; + + } + + lerpHSL( color, alpha ) { + + this.getHSL( _hslA ); + color.getHSL( _hslB ); + + const h = lerp( _hslA.h, _hslB.h, alpha ); + const s = lerp( _hslA.s, _hslB.s, alpha ); + const l = lerp( _hslA.l, _hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + } + + setFromVector3( v ) { + + this.r = v.x; + this.g = v.y; + this.b = v.z; + + return this; + + } + + applyMatrix3( m ) { + + const r = this.r, g = this.g, b = this.b; + const e = m.elements; + + this.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b; + this.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b; + this.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b; + + return this; + + } + + equals( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + } + + fromArray( array, offset = 0 ) { + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + } + + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + } + + fromBufferAttribute( attribute, index ) { + + this.r = attribute.getX( index ); + this.g = attribute.getY( index ); + this.b = attribute.getZ( index ); + + return this; + + } + + toJSON() { + + return this.getHex(); + + } + + *[ Symbol.iterator ]() { + + yield this.r; + yield this.g; + yield this.b; + + } + +} + +const _color = /*@__PURE__*/ new Color(); + +Color.NAMES = _colorKeywords; + +let _materialId = 0; + +class Material extends EventDispatcher { + + constructor() { + + super(); + + this.isMaterial = true; + + Object.defineProperty( this, 'id', { value: _materialId ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.blending = NormalBlending; + this.side = FrontSide; + this.vertexColors = false; + + this.opacity = 1; + this.transparent = false; + this.alphaHash = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + this.blendColor = new Color( 0, 0, 0 ); + this.blendAlpha = 0; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.stencilWriteMask = 0xff; + this.stencilFunc = AlwaysStencilFunc; + this.stencilRef = 0; + this.stencilFuncMask = 0xff; + this.stencilFail = KeepStencilOp; + this.stencilZFail = KeepStencilOp; + this.stencilZPass = KeepStencilOp; + this.stencilWrite = false; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaToCoverage = false; + this.premultipliedAlpha = false; + this.forceSinglePass = false; + + this.visible = true; + + this.toneMapped = true; + + this.userData = {}; + + this.version = 0; + + this._alphaTest = 0; + + } + + get alphaTest() { + + return this._alphaTest; + + } + + set alphaTest( value ) { + + if ( this._alphaTest > 0 !== value > 0 ) { + + this.version ++; + + } + + this._alphaTest = value; + + } + + onBuild( /* shaderobject, renderer */ ) {} + + onBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {} + + onBeforeCompile( /* shaderobject, renderer */ ) {} + + customProgramCacheKey() { + + return this.onBeforeCompile.toString(); + + } + + setValues( values ) { + + if ( values === undefined ) return; + + for ( const key in values ) { + + const newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( `THREE.Material: parameter '${ key }' has value of undefined.` ); + continue; + + } + + const currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( `THREE.Material: '${ key }' is not a property of THREE.${ this.type }.` ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + } + + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( isRootObject ) { + + meta = { + textures: {}, + images: {} + }; + + } + + const data = { + metadata: { + version: 4.6, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.sheen !== undefined ) data.sheen = this.sheen; + if ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex(); + if ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness; + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity; + if ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat; + if ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness; + + if ( this.clearcoatMap && this.clearcoatMap.isTexture ) { + + data.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid; + + } + + if ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) { + + data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid; + + } + + if ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) { + + data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid; + data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); + + } + + if ( this.iridescence !== undefined ) data.iridescence = this.iridescence; + if ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR; + if ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange; + + if ( this.iridescenceMap && this.iridescenceMap.isTexture ) { + + data.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid; + + } + + if ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) { + + data.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid; + + } + + if ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy; + if ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation; + + if ( this.anisotropyMap && this.anisotropyMap.isTexture ) { + + data.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid; + + } + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + + if ( this.lightMap && this.lightMap.isTexture ) { + + data.lightMap = this.lightMap.toJSON( meta ).uuid; + data.lightMapIntensity = this.lightMapIntensity; + + } + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + if ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid; + if ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + + if ( this.combine !== undefined ) data.combine = this.combine; + + } + + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + if ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity; + if ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio; + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.transmission !== undefined ) data.transmission = this.transmission; + if ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid; + if ( this.thickness !== undefined ) data.thickness = this.thickness; + if ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid; + if ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance; + if ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex(); + + if ( this.size !== undefined ) data.size = this.size; + if ( this.shadowSide !== null ) data.shadowSide = this.shadowSide; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors === true ) data.vertexColors = true; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = true; + + if ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc; + if ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst; + if ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation; + if ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha; + if ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha; + if ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha; + if ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex(); + if ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha; + + if ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc; + if ( this.depthTest === false ) data.depthTest = this.depthTest; + if ( this.depthWrite === false ) data.depthWrite = this.depthWrite; + if ( this.colorWrite === false ) data.colorWrite = this.colorWrite; + + if ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask; + if ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc; + if ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef; + if ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask; + if ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail; + if ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail; + if ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass; + if ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.alphaHash === true ) data.alphaHash = true; + if ( this.alphaToCoverage === true ) data.alphaToCoverage = true; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true; + if ( this.forceSinglePass === true ) data.forceSinglePass = true; + + if ( this.wireframe === true ) data.wireframe = true; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.flatShading === true ) data.flatShading = true; + + if ( this.visible === false ) data.visible = false; + + if ( this.toneMapped === false ) data.toneMapped = false; + + if ( this.fog === false ) data.fog = false; + + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + const values = []; + + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRootObject ) { + + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.name = source.name; + + this.blending = source.blending; + this.side = source.side; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + this.blendColor.copy( source.blendColor ); + this.blendAlpha = source.blendAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.stencilWriteMask = source.stencilWriteMask; + this.stencilFunc = source.stencilFunc; + this.stencilRef = source.stencilRef; + this.stencilFuncMask = source.stencilFuncMask; + this.stencilFail = source.stencilFail; + this.stencilZFail = source.stencilZFail; + this.stencilZPass = source.stencilZPass; + this.stencilWrite = source.stencilWrite; + + const srcPlanes = source.clippingPlanes; + let dstPlanes = null; + + if ( srcPlanes !== null ) { + + const n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( let i = 0; i !== n; ++ i ) { + + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + } + + this.clippingPlanes = dstPlanes; + this.clipIntersection = source.clipIntersection; + this.clipShadows = source.clipShadows; + + this.shadowSide = source.shadowSide; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.alphaHash = source.alphaHash; + this.alphaToCoverage = source.alphaToCoverage; + this.premultipliedAlpha = source.premultipliedAlpha; + this.forceSinglePass = source.forceSinglePass; + + this.visible = source.visible; + + this.toneMapped = source.toneMapped; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + +} + +class MeshBasicMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshBasicMaterial = true; + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.fog = source.fog; + + return this; + + } + +} + +// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + +const _tables = /*@__PURE__*/ _generateTables(); + +function _generateTables() { + + // float32 to float16 helpers + + const buffer = new ArrayBuffer( 4 ); + const floatView = new Float32Array( buffer ); + const uint32View = new Uint32Array( buffer ); + + const baseTable = new Uint32Array( 512 ); + const shiftTable = new Uint32Array( 512 ); + + for ( let i = 0; i < 256; ++ i ) { + + const e = i - 127; + + // very small number (0, -0) + + if ( e < - 27 ) { + + baseTable[ i ] = 0x0000; + baseTable[ i | 0x100 ] = 0x8000; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // small number (denorm) + + } else if ( e < - 14 ) { + + baseTable[ i ] = 0x0400 >> ( - e - 14 ); + baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; + shiftTable[ i ] = - e - 1; + shiftTable[ i | 0x100 ] = - e - 1; + + // normal number + + } else if ( e <= 15 ) { + + baseTable[ i ] = ( e + 15 ) << 10; + baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + // large number (Infinity, -Infinity) + + } else if ( e < 128 ) { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // stay (NaN, Infinity, -Infinity) + + } else { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + } + + } + + // float16 to float32 helpers + + const mantissaTable = new Uint32Array( 2048 ); + const exponentTable = new Uint32Array( 64 ); + const offsetTable = new Uint32Array( 64 ); + + for ( let i = 1; i < 1024; ++ i ) { + + let m = i << 13; // zero pad mantissa bits + let e = 0; // zero exponent + + // normalized + while ( ( m & 0x00800000 ) === 0 ) { + + m <<= 1; + e -= 0x00800000; // decrement exponent + + } + + m &= ~ 0x00800000; // clear leading 1 bit + e += 0x38800000; // adjust bias + + mantissaTable[ i ] = m | e; + + } + + for ( let i = 1024; i < 2048; ++ i ) { + + mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); + + } + + for ( let i = 1; i < 31; ++ i ) { + + exponentTable[ i ] = i << 23; + + } + + exponentTable[ 31 ] = 0x47800000; + exponentTable[ 32 ] = 0x80000000; + + for ( let i = 33; i < 63; ++ i ) { + + exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); + + } + + exponentTable[ 63 ] = 0xc7800000; + + for ( let i = 1; i < 64; ++ i ) { + + if ( i !== 32 ) { + + offsetTable[ i ] = 1024; + + } + + } + + return { + floatView: floatView, + uint32View: uint32View, + baseTable: baseTable, + shiftTable: shiftTable, + mantissaTable: mantissaTable, + exponentTable: exponentTable, + offsetTable: offsetTable + }; + +} + +// float32 to float16 + +function toHalfFloat( val ) { + + if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); + + val = clamp( val, - 65504, 65504 ); + + _tables.floatView[ 0 ] = val; + const f = _tables.uint32View[ 0 ]; + const e = ( f >> 23 ) & 0x1ff; + return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); + +} + +// float16 to float32 + +function fromHalfFloat( val ) { + + const m = val >> 10; + _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; + return _tables.floatView[ 0 ]; + +} + +const DataUtils = { + toHalfFloat: toHalfFloat, + fromHalfFloat: fromHalfFloat, +}; + +const _vector$9 = /*@__PURE__*/ new Vector3(); +const _vector2$1 = /*@__PURE__*/ new Vector2(); + +class BufferAttribute { + + constructor( array, itemSize, normalized = false ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.isBufferAttribute = true; + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized; + + this.usage = StaticDrawUsage; + this._updateRange = { offset: 0, count: - 1 }; + this.updateRanges = []; + this.gpuType = FloatType; + + this.version = 0; + + } + + onUploadCallback() {} + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + get updateRange() { + + console.warn( 'THREE.BufferAttribute: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159 + return this._updateRange; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + addUpdateRange( start, count ) { + + this.updateRanges.push( { start, count } ); + + } + + clearUpdateRanges() { + + this.updateRanges.length = 0; + + } + + copy( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.usage = source.usage; + this.gpuType = source.gpuType; + + return this; + + } + + copyAt( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( let i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + } + + copyArray( array ) { + + this.array.set( array ); + + return this; + + } + + applyMatrix3( m ) { + + if ( this.itemSize === 2 ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector2$1.fromBufferAttribute( this, i ); + _vector2$1.applyMatrix3( m ); + + this.setXY( i, _vector2$1.x, _vector2$1.y ); + + } + + } else if ( this.itemSize === 3 ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + _vector$9.applyMatrix3( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + } + + return this; + + } + + applyMatrix4( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + + _vector$9.applyMatrix4( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + applyNormalMatrix( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + + _vector$9.applyNormalMatrix( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + transformDirection( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + + _vector$9.transformDirection( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + set( value, offset = 0 ) { + + // Matching BufferAttribute constructor, do not normalize the array. + this.array.set( value, offset ); + + return this; + + } + + getComponent( index, component ) { + + let value = this.array[ index * this.itemSize + component ]; + + if ( this.normalized ) value = denormalize( value, this.array ); + + return value; + + } + + setComponent( index, component, value ) { + + if ( this.normalized ) value = normalize( value, this.array ); + + this.array[ index * this.itemSize + component ] = value; + + return this; + + } + + getX( index ) { + + let x = this.array[ index * this.itemSize ]; + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; + + } + + setX( index, x ) { + + if ( this.normalized ) x = normalize( x, this.array ); + + this.array[ index * this.itemSize ] = x; + + return this; + + } + + getY( index ) { + + let y = this.array[ index * this.itemSize + 1 ]; + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; + + } + + setY( index, y ) { + + if ( this.normalized ) y = normalize( y, this.array ); + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + } + + getZ( index ) { + + let z = this.array[ index * this.itemSize + 2 ]; + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; + + } + + setZ( index, z ) { + + if ( this.normalized ) z = normalize( z, this.array ); + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + } + + getW( index ) { + + let w = this.array[ index * this.itemSize + 3 ]; + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; + + } + + setW( index, w ) { + + if ( this.normalized ) w = normalize( w, this.array ); + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + } + + setXY( index, x, y ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + } + + setXYZ( index, x, y, z ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + } + + onUpload( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + clone() { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + toJSON() { + + const data = { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: Array.from( this.array ), + normalized: this.normalized + }; + + if ( this.name !== '' ) data.name = this.name; + if ( this.usage !== StaticDrawUsage ) data.usage = this.usage; + + return data; + + } + +} + +// + +class Int8BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Int8Array( array ), itemSize, normalized ); + + } + +} + +class Uint8BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint8Array( array ), itemSize, normalized ); + + } + +} + +class Uint8ClampedBufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint8ClampedArray( array ), itemSize, normalized ); + + } + +} + +class Int16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Int16Array( array ), itemSize, normalized ); + + } + +} + +class Uint16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint16Array( array ), itemSize, normalized ); + + } + +} + +class Int32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Int32Array( array ), itemSize, normalized ); + + } + +} + +class Uint32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint32Array( array ), itemSize, normalized ); + + } + +} + +class Float16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint16Array( array ), itemSize, normalized ); + + this.isFloat16BufferAttribute = true; + + } + + getX( index ) { + + let x = fromHalfFloat( this.array[ index * this.itemSize ] ); + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; + + } + + setX( index, x ) { + + if ( this.normalized ) x = normalize( x, this.array ); + + this.array[ index * this.itemSize ] = toHalfFloat( x ); + + return this; + + } + + getY( index ) { + + let y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] ); + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; + + } + + setY( index, y ) { + + if ( this.normalized ) y = normalize( y, this.array ); + + this.array[ index * this.itemSize + 1 ] = toHalfFloat( y ); + + return this; + + } + + getZ( index ) { + + let z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] ); + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; + + } + + setZ( index, z ) { + + if ( this.normalized ) z = normalize( z, this.array ); + + this.array[ index * this.itemSize + 2 ] = toHalfFloat( z ); + + return this; + + } + + getW( index ) { + + let w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] ); + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; + + } + + setW( index, w ) { + + if ( this.normalized ) w = normalize( w, this.array ); + + this.array[ index * this.itemSize + 3 ] = toHalfFloat( w ); + + return this; + + } + + setXY( index, x, y ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + + this.array[ index + 0 ] = toHalfFloat( x ); + this.array[ index + 1 ] = toHalfFloat( y ); + + return this; + + } + + setXYZ( index, x, y, z ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + + this.array[ index + 0 ] = toHalfFloat( x ); + this.array[ index + 1 ] = toHalfFloat( y ); + this.array[ index + 2 ] = toHalfFloat( z ); + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + + this.array[ index + 0 ] = toHalfFloat( x ); + this.array[ index + 1 ] = toHalfFloat( y ); + this.array[ index + 2 ] = toHalfFloat( z ); + this.array[ index + 3 ] = toHalfFloat( w ); + + return this; + + } + +} + + +class Float32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Float32Array( array ), itemSize, normalized ); + + } + +} + +class Float64BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Float64Array( array ), itemSize, normalized ); + + } + +} + +let _id$2 = 0; + +const _m1 = /*@__PURE__*/ new Matrix4(); +const _obj = /*@__PURE__*/ new Object3D(); +const _offset = /*@__PURE__*/ new Vector3(); +const _box$2 = /*@__PURE__*/ new Box3(); +const _boxMorphTargets = /*@__PURE__*/ new Box3(); +const _vector$8 = /*@__PURE__*/ new Vector3(); + +class BufferGeometry extends EventDispatcher { + + constructor() { + + super(); + + this.isBufferGeometry = true; + + Object.defineProperty( this, 'id', { value: _id$2 ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + this.morphTargetsRelative = false; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + + } + + getIndex() { + + return this.index; + + } + + setIndex( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + return this; + + } + + getAttribute( name ) { + + return this.attributes[ name ]; + + } + + setAttribute( name, attribute ) { + + this.attributes[ name ] = attribute; + + return this; + + } + + deleteAttribute( name ) { + + delete this.attributes[ name ]; + + return this; + + } + + hasAttribute( name ) { + + return this.attributes[ name ] !== undefined; + + } + + addGroup( start, count, materialIndex = 0 ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + } + + clearGroups() { + + this.groups = []; + + } + + setDrawRange( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + } + + applyMatrix4( matrix ) { + + const position = this.attributes.position; + + if ( position !== undefined ) { + + position.applyMatrix4( matrix ); + + position.needsUpdate = true; + + } + + const normal = this.attributes.normal; + + if ( normal !== undefined ) { + + const normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normal.applyNormalMatrix( normalMatrix ); + + normal.needsUpdate = true; + + } + + const tangent = this.attributes.tangent; + + if ( tangent !== undefined ) { + + tangent.transformDirection( matrix ); + + tangent.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + } + + applyQuaternion( q ) { + + _m1.makeRotationFromQuaternion( q ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + rotateX( angle ) { + + // rotate geometry around world x-axis + + _m1.makeRotationX( angle ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + rotateY( angle ) { + + // rotate geometry around world y-axis + + _m1.makeRotationY( angle ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + rotateZ( angle ) { + + // rotate geometry around world z-axis + + _m1.makeRotationZ( angle ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + translate( x, y, z ) { + + // translate geometry + + _m1.makeTranslation( x, y, z ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + scale( x, y, z ) { + + // scale geometry + + _m1.makeScale( x, y, z ); + + this.applyMatrix4( _m1 ); + + return this; + + } + + lookAt( vector ) { + + _obj.lookAt( vector ); + + _obj.updateMatrix(); + + this.applyMatrix4( _obj.matrix ); + + return this; + + } + + center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( _offset ).negate(); + + this.translate( _offset.x, _offset.y, _offset.z ); + + return this; + + } + + setFromPoints( points ) { + + const position = []; + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + const point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + } + + computeBoundingBox() { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + + if ( position && position.isGLBufferAttribute ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this ); + + this.boundingBox.set( + new Vector3( - Infinity, - Infinity, - Infinity ), + new Vector3( + Infinity, + Infinity, + Infinity ) + ); + + return; + + } + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + _box$2.setFromBufferAttribute( morphAttribute ); + + if ( this.morphTargetsRelative ) { + + _vector$8.addVectors( this.boundingBox.min, _box$2.min ); + this.boundingBox.expandByPoint( _vector$8 ); + + _vector$8.addVectors( this.boundingBox.max, _box$2.max ); + this.boundingBox.expandByPoint( _vector$8 ); + + } else { + + this.boundingBox.expandByPoint( _box$2.min ); + this.boundingBox.expandByPoint( _box$2.max ); + + } + + } + + } + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + + if ( position && position.isGLBufferAttribute ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this ); + + this.boundingSphere.set( new Vector3(), Infinity ); + + return; + + } + + if ( position ) { + + // first, find the center of the bounding sphere + + const center = this.boundingSphere.center; + + _box$2.setFromBufferAttribute( position ); + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + _boxMorphTargets.setFromBufferAttribute( morphAttribute ); + + if ( this.morphTargetsRelative ) { + + _vector$8.addVectors( _box$2.min, _boxMorphTargets.min ); + _box$2.expandByPoint( _vector$8 ); + + _vector$8.addVectors( _box$2.max, _boxMorphTargets.max ); + _box$2.expandByPoint( _vector$8 ); + + } else { + + _box$2.expandByPoint( _boxMorphTargets.min ); + _box$2.expandByPoint( _boxMorphTargets.max ); + + } + + } + + } + + _box$2.getCenter( center ); + + // second, try to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + let maxRadiusSq = 0; + + for ( let i = 0, il = position.count; i < il; i ++ ) { + + _vector$8.fromBufferAttribute( position, i ); + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) ); + + } + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + const morphTargetsRelative = this.morphTargetsRelative; + + for ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) { + + _vector$8.fromBufferAttribute( morphAttribute, j ); + + if ( morphTargetsRelative ) { + + _offset.fromBufferAttribute( position, j ); + _vector$8.add( _offset ); + + } + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) ); + + } + + } + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + } + + computeTangents() { + + const index = this.index; + const attributes = this.attributes; + + // based on http://www.terathon.com/code/tangent.html + // (per vertex tangents) + + if ( index === null || + attributes.position === undefined || + attributes.normal === undefined || + attributes.uv === undefined ) { + + console.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' ); + return; + + } + + const indices = index.array; + const positions = attributes.position.array; + const normals = attributes.normal.array; + const uvs = attributes.uv.array; + + const nVertices = positions.length / 3; + + if ( this.hasAttribute( 'tangent' ) === false ) { + + this.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) ); + + } + + const tangents = this.getAttribute( 'tangent' ).array; + + const tan1 = [], tan2 = []; + + for ( let i = 0; i < nVertices; i ++ ) { + + tan1[ i ] = new Vector3(); + tan2[ i ] = new Vector3(); + + } + + const vA = new Vector3(), + vB = new Vector3(), + vC = new Vector3(), + + uvA = new Vector2(), + uvB = new Vector2(), + uvC = new Vector2(), + + sdir = new Vector3(), + tdir = new Vector3(); + + function handleTriangle( a, b, c ) { + + vA.fromArray( positions, a * 3 ); + vB.fromArray( positions, b * 3 ); + vC.fromArray( positions, c * 3 ); + + uvA.fromArray( uvs, a * 2 ); + uvB.fromArray( uvs, b * 2 ); + uvC.fromArray( uvs, c * 2 ); + + vB.sub( vA ); + vC.sub( vA ); + + uvB.sub( uvA ); + uvC.sub( uvA ); + + const r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y ); + + // silently ignore degenerate uv triangles having coincident or colinear vertices + + if ( ! isFinite( r ) ) return; + + sdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r ); + tdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r ); + + tan1[ a ].add( sdir ); + tan1[ b ].add( sdir ); + tan1[ c ].add( sdir ); + + tan2[ a ].add( tdir ); + tan2[ b ].add( tdir ); + tan2[ c ].add( tdir ); + + } + + let groups = this.groups; + + if ( groups.length === 0 ) { + + groups = [ { + start: 0, + count: indices.length + } ]; + + } + + for ( let i = 0, il = groups.length; i < il; ++ i ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + handleTriangle( + indices[ j + 0 ], + indices[ j + 1 ], + indices[ j + 2 ] + ); + + } + + } + + const tmp = new Vector3(), tmp2 = new Vector3(); + const n = new Vector3(), n2 = new Vector3(); + + function handleVertex( v ) { + + n.fromArray( normals, v * 3 ); + n2.copy( n ); + + const t = tan1[ v ]; + + // Gram-Schmidt orthogonalize + + tmp.copy( t ); + tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize(); + + // Calculate handedness + + tmp2.crossVectors( n2, t ); + const test = tmp2.dot( tan2[ v ] ); + const w = ( test < 0.0 ) ? - 1.0 : 1.0; + + tangents[ v * 4 ] = tmp.x; + tangents[ v * 4 + 1 ] = tmp.y; + tangents[ v * 4 + 2 ] = tmp.z; + tangents[ v * 4 + 3 ] = w; + + } + + for ( let i = 0, il = groups.length; i < il; ++ i ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + handleVertex( indices[ j + 0 ] ); + handleVertex( indices[ j + 1 ] ); + handleVertex( indices[ j + 2 ] ); + + } + + } + + } + + computeVertexNormals() { + + const index = this.index; + const positionAttribute = this.getAttribute( 'position' ); + + if ( positionAttribute !== undefined ) { + + let normalAttribute = this.getAttribute( 'normal' ); + + if ( normalAttribute === undefined ) { + + normalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 ); + this.setAttribute( 'normal', normalAttribute ); + + } else { + + // reset existing normals to zero + + for ( let i = 0, il = normalAttribute.count; i < il; i ++ ) { + + normalAttribute.setXYZ( i, 0, 0, 0 ); + + } + + } + + const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); + const cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + for ( let i = 0, il = index.count; i < il; i += 3 ) { + + const vA = index.getX( i + 0 ); + const vB = index.getX( i + 1 ); + const vC = index.getX( i + 2 ); + + pA.fromBufferAttribute( positionAttribute, vA ); + pB.fromBufferAttribute( positionAttribute, vB ); + pC.fromBufferAttribute( positionAttribute, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + nA.fromBufferAttribute( normalAttribute, vA ); + nB.fromBufferAttribute( normalAttribute, vB ); + nC.fromBufferAttribute( normalAttribute, vC ); + + nA.add( cb ); + nB.add( cb ); + nC.add( cb ); + + normalAttribute.setXYZ( vA, nA.x, nA.y, nA.z ); + normalAttribute.setXYZ( vB, nB.x, nB.y, nB.z ); + normalAttribute.setXYZ( vC, nC.x, nC.y, nC.z ); + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) { + + pA.fromBufferAttribute( positionAttribute, i + 0 ); + pB.fromBufferAttribute( positionAttribute, i + 1 ); + pC.fromBufferAttribute( positionAttribute, i + 2 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z ); + + } + + } + + this.normalizeNormals(); + + normalAttribute.needsUpdate = true; + + } + + } + + normalizeNormals() { + + const normals = this.attributes.normal; + + for ( let i = 0, il = normals.count; i < il; i ++ ) { + + _vector$8.fromBufferAttribute( normals, i ); + + _vector$8.normalize(); + + normals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z ); + + } + + } + + toNonIndexed() { + + function convertBufferAttribute( attribute, indices ) { + + const array = attribute.array; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; + + const array2 = new array.constructor( indices.length * itemSize ); + + let index = 0, index2 = 0; + + for ( let i = 0, l = indices.length; i < l; i ++ ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + index = indices[ i ] * attribute.data.stride + attribute.offset; + + } else { + + index = indices[ i ] * itemSize; + + } + + for ( let j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + return new BufferAttribute( array2, itemSize, normalized ); + + } + + // + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' ); + return this; + + } + + const geometry2 = new BufferGeometry(); + + const indices = this.index.array; + const attributes = this.attributes; + + // attributes + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + + const newAttribute = convertBufferAttribute( attribute, indices ); + + geometry2.setAttribute( name, newAttribute ); + + } + + // morph attributes + + const morphAttributes = this.morphAttributes; + + for ( const name in morphAttributes ) { + + const morphArray = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, il = morphAttribute.length; i < il; i ++ ) { + + const attribute = morphAttribute[ i ]; + + const newAttribute = convertBufferAttribute( attribute, indices ); + + morphArray.push( newAttribute ); + + } + + geometry2.morphAttributes[ name ] = morphArray; + + } + + geometry2.morphTargetsRelative = this.morphTargetsRelative; + + // groups + + const groups = this.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.6, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + const parameters = this.parameters; + + for ( const key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + // for simplicity the code assumes attributes are not shared across geometries, see #15811 + + data.data = { attributes: {} }; + + const index = this.index; + + if ( index !== null ) { + + data.data.index = { + type: index.array.constructor.name, + array: Array.prototype.slice.call( index.array ) + }; + + } + + const attributes = this.attributes; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + + data.data.attributes[ key ] = attribute.toJSON( data.data ); + + } + + const morphAttributes = {}; + let hasMorphAttributes = false; + + for ( const key in this.morphAttributes ) { + + const attributeArray = this.morphAttributes[ key ]; + + const array = []; + + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { + + const attribute = attributeArray[ i ]; + + array.push( attribute.toJSON( data.data ) ); + + } + + if ( array.length > 0 ) { + + morphAttributes[ key ] = array; + + hasMorphAttributes = true; + + } + + } + + if ( hasMorphAttributes ) { + + data.data.morphAttributes = morphAttributes; + data.data.morphTargetsRelative = this.morphTargetsRelative; + + } + + const groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + const boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // used for storing cloned, shared data + + const data = {}; + + // name + + this.name = source.name; + + // index + + const index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone( data ) ); + + } + + // attributes + + const attributes = source.attributes; + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + this.setAttribute( name, attribute.clone( data ) ); + + } + + // morph attributes + + const morphAttributes = source.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone( data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + this.morphTargetsRelative = source.morphTargetsRelative; + + // groups + + const groups = source.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + const boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + const boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +const _inverseMatrix$3 = /*@__PURE__*/ new Matrix4(); +const _ray$3 = /*@__PURE__*/ new Ray(); +const _sphere$6 = /*@__PURE__*/ new Sphere(); +const _sphereHitAt = /*@__PURE__*/ new Vector3(); + +const _vA$1 = /*@__PURE__*/ new Vector3(); +const _vB$1 = /*@__PURE__*/ new Vector3(); +const _vC$1 = /*@__PURE__*/ new Vector3(); + +const _tempA = /*@__PURE__*/ new Vector3(); +const _morphA = /*@__PURE__*/ new Vector3(); + +const _uvA$1 = /*@__PURE__*/ new Vector2(); +const _uvB$1 = /*@__PURE__*/ new Vector2(); +const _uvC$1 = /*@__PURE__*/ new Vector2(); + +const _normalA = /*@__PURE__*/ new Vector3(); +const _normalB = /*@__PURE__*/ new Vector3(); +const _normalC = /*@__PURE__*/ new Vector3(); + +const _intersectionPoint = /*@__PURE__*/ new Vector3(); +const _intersectionPointWorld = /*@__PURE__*/ new Vector3(); + +class Mesh extends Object3D { + + constructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) { + + super(); + + this.isMesh = true; + + this.type = 'Mesh'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + this.material = Array.isArray( source.material ) ? source.material.slice() : source.material; + this.geometry = source.geometry; + + return this; + + } + + updateMorphTargets() { + + const geometry = this.geometry; + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } + + getVertexPosition( index, target ) { + + const geometry = this.geometry; + const position = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + + target.fromBufferAttribute( position, index ); + + const morphInfluences = this.morphTargetInfluences; + + if ( morphPosition && morphInfluences ) { + + _morphA.set( 0, 0, 0 ); + + for ( let i = 0, il = morphPosition.length; i < il; i ++ ) { + + const influence = morphInfluences[ i ]; + const morphAttribute = morphPosition[ i ]; + + if ( influence === 0 ) continue; + + _tempA.fromBufferAttribute( morphAttribute, index ); + + if ( morphTargetsRelative ) { + + _morphA.addScaledVector( _tempA, influence ); + + } else { + + _morphA.addScaledVector( _tempA.sub( target ), influence ); + + } + + } + + target.add( _morphA ); + + } + + return target; + + } + + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const material = this.material; + const matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // test with bounding sphere in world space + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$6.copy( geometry.boundingSphere ); + _sphere$6.applyMatrix4( matrixWorld ); + + // check distance from ray origin to bounding sphere + + _ray$3.copy( raycaster.ray ).recast( raycaster.near ); + + if ( _sphere$6.containsPoint( _ray$3.origin ) === false ) { + + if ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return; + + if ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return; + + } + + // convert ray to local space of mesh + + _inverseMatrix$3.copy( matrixWorld ).invert(); + _ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 ); + + // test with bounding box in local space + + if ( geometry.boundingBox !== null ) { + + if ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + // test for intersections with geometry + + this._computeIntersections( raycaster, intersects, _ray$3 ); + + } + + _computeIntersections( raycaster, intersects, rayLocalSpace ) { + + let intersection; + + const geometry = this.geometry; + const material = this.material; + + const index = geometry.index; + const position = geometry.attributes.position; + const uv = geometry.attributes.uv; + const uv1 = geometry.attributes.uv1; + const normal = geometry.attributes.normal; + const groups = geometry.groups; + const drawRange = geometry.drawRange; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) ); + + for ( let j = start, jl = end; j < jl; j += 3 ) { + + const a = index.getX( j ); + const b = index.getX( j + 1 ); + const c = index.getX( j + 2 ); + + intersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); + + } + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i += 3 ) { + + const a = index.getX( i ); + const b = index.getX( i + 1 ); + const c = index.getX( i + 2 ); + + intersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) ); + + for ( let j = start, jl = end; j < jl; j += 3 ) { + + const a = j; + const b = j + 1; + const c = j + 2; + + intersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); + + } + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i += 3 ) { + + const a = i; + const b = i + 1; + const c = i + 2; + + intersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } + +} + +function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + let intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point ); + + } + + if ( intersect === null ) return null; + + _intersectionPointWorld.copy( point ); + _intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: _intersectionPointWorld.clone(), + object: object + }; + +} + +function checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) { + + object.getVertexPosition( a, _vA$1 ); + object.getVertexPosition( b, _vB$1 ); + object.getVertexPosition( c, _vC$1 ); + + const intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + _uvA$1.fromBufferAttribute( uv, a ); + _uvB$1.fromBufferAttribute( uv, b ); + _uvC$1.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ); + + } + + if ( uv1 ) { + + _uvA$1.fromBufferAttribute( uv1, a ); + _uvB$1.fromBufferAttribute( uv1, b ); + _uvC$1.fromBufferAttribute( uv1, c ); + + intersection.uv1 = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ); + intersection.uv2 = intersection.uv1; // @deprecated, r152 + + } + + if ( normal ) { + + _normalA.fromBufferAttribute( normal, a ); + _normalB.fromBufferAttribute( normal, b ); + _normalC.fromBufferAttribute( normal, c ); + + intersection.normal = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _normalA, _normalB, _normalC, new Vector3() ); + + if ( intersection.normal.dot( ray.direction ) > 0 ) { + + intersection.normal.multiplyScalar( - 1 ); + + } + + } + + const face = { + a: a, + b: b, + c: c, + normal: new Vector3(), + materialIndex: 0 + }; + + Triangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal ); + + intersection.face = face; + + } + + return intersection; + +} + +class BoxGeometry extends BufferGeometry { + + constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) { + + super(); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + const scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ); + heightSegments = Math.floor( heightSegments ); + depthSegments = Math.floor( depthSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let numberOfVertices = 0; + let groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + const segmentWidth = width / gridX; + const segmentHeight = height / gridY; + + const widthHalf = width / 2; + const heightHalf = height / 2; + const depthHalf = depth / 2; + + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + + let vertexCounter = 0; + let groupCount = 0; + + const vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( let iy = 0; iy < gridY1; iy ++ ) { + + const y = iy * segmentHeight - heightHalf; + + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = numberOfVertices + ix + gridX1 * iy; + const b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + const c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); + + } + +} + +/** + * Uniform Utilities + */ + +function cloneUniforms( src ) { + + const dst = {}; + + for ( const u in src ) { + + dst[ u ] = {}; + + for ( const p in src[ u ] ) { + + const property = src[ u ][ p ]; + + if ( property && ( property.isColor || + property.isMatrix3 || property.isMatrix4 || + property.isVector2 || property.isVector3 || property.isVector4 || + property.isTexture || property.isQuaternion ) ) { + + if ( property.isRenderTargetTexture ) { + + console.warn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' ); + dst[ u ][ p ] = null; + + } else { + + dst[ u ][ p ] = property.clone(); + + } + + } else if ( Array.isArray( property ) ) { + + dst[ u ][ p ] = property.slice(); + + } else { + + dst[ u ][ p ] = property; + + } + + } + + } + + return dst; + +} + +function mergeUniforms( uniforms ) { + + const merged = {}; + + for ( let u = 0; u < uniforms.length; u ++ ) { + + const tmp = cloneUniforms( uniforms[ u ] ); + + for ( const p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + +} + +function cloneUniformsGroups( src ) { + + const dst = []; + + for ( let u = 0; u < src.length; u ++ ) { + + dst.push( src[ u ].clone() ); + + } + + return dst; + +} + +function getUnlitUniformColorSpace( renderer ) { + + if ( renderer.getRenderTarget() === null ) { + + // https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398 + return renderer.outputColorSpace; + + } + + return ColorManagement.workingColorSpace; + +} + +// Legacy + +const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; + +var default_vertex = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; + +var default_fragment = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; + +class ShaderMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isShaderMaterial = true; + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + this.uniformsGroups = []; + + this.vertexShader = default_vertex; + this.fragmentShader = default_fragment; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.forceSinglePass = true; + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false, // set to use shader texture LOD + clipCullDistance: false // set to use vertex shader clipping + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv1': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + this.glslVersion = null; + + if ( parameters !== undefined ) { + + this.setValues( parameters ); + + } + + } + + copy( source ) { + + super.copy( source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = cloneUniforms( source.uniforms ); + this.uniformsGroups = cloneUniformsGroups( source.uniformsGroups ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.fog = source.fog; + this.lights = source.lights; + this.clipping = source.clipping; + + this.extensions = Object.assign( {}, source.extensions ); + + this.glslVersion = source.glslVersion; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.glslVersion = this.glslVersion; + data.uniforms = {}; + + for ( const name in this.uniforms ) { + + const uniform = this.uniforms[ name ]; + const value = uniform.value; + + if ( value && value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value && value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value && value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value && value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value && value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value && value.isMatrix3 ) { + + data.uniforms[ name ] = { + type: 'm3', + value: value.toArray() + }; + + } else if ( value && value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + data.lights = this.lights; + data.clipping = this.clipping; + + const extensions = {}; + + for ( const key in this.extensions ) { + + if ( this.extensions[ key ] === true ) extensions[ key ] = true; + + } + + if ( Object.keys( extensions ).length > 0 ) data.extensions = extensions; + + return data; + + } + +} + +class Camera extends Object3D { + + constructor() { + + super(); + + this.isCamera = true; + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + + this.coordinateSystem = WebGLCoordinateSystem; + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + this.coordinateSystem = source.coordinateSystem; + + return this; + + } + + getWorldDirection( target ) { + + return super.getWorldDirection( target ).negate(); + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); + + } + + updateWorldMatrix( updateParents, updateChildren ) { + + super.updateWorldMatrix( updateParents, updateChildren ); + + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +class PerspectiveCamera extends Camera { + + constructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) { + + super(); + + this.isPerspectiveCamera = true; + + this.type = 'PerspectiveCamera'; + + this.fov = fov; + this.zoom = 1; + + this.near = near; + this.far = far; + this.focus = 10; + + this.aspect = aspect; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + } + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength( focalLength ) { + + /** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */ + const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + } + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength() { + + const vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + } + + getEffectiveFOV() { + + return RAD2DEG * 2 * Math.atan( + Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + } + + getFilmWidth() { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + } + + getFilmHeight() { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + } + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * const w = 1920; + * const h = 1080; + * const fullWidth = w * 3; + * const fullHeight = h * 2; + * + * --A-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + } + + clearViewOffset() { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + } + + updateProjectionMatrix() { + + const near = this.near; + let top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom; + let height = 2 * top; + let width = this.aspect * height; + let left = - 0.5 * width; + const view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + const fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + const skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + +} + +const fov = - 90; // negative fov is not an error +const aspect = 1; + +class CubeCamera extends Object3D { + + constructor( near, far, renderTarget ) { + + super(); + + this.type = 'CubeCamera'; + + this.renderTarget = renderTarget; + this.coordinateSystem = null; + this.activeMipmapLevel = 0; + + const cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.layers = this.layers; + this.add( cameraPX ); + + const cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.layers = this.layers; + this.add( cameraNX ); + + const cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.layers = this.layers; + this.add( cameraPY ); + + const cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.layers = this.layers; + this.add( cameraNY ); + + const cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.layers = this.layers; + this.add( cameraPZ ); + + const cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.layers = this.layers; + this.add( cameraNZ ); + + } + + updateCoordinateSystem() { + + const coordinateSystem = this.coordinateSystem; + + const cameras = this.children.concat(); + + const [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras; + + for ( const camera of cameras ) this.remove( camera ); + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + cameraPX.up.set( 0, 1, 0 ); + cameraPX.lookAt( 1, 0, 0 ); + + cameraNX.up.set( 0, 1, 0 ); + cameraNX.lookAt( - 1, 0, 0 ); + + cameraPY.up.set( 0, 0, - 1 ); + cameraPY.lookAt( 0, 1, 0 ); + + cameraNY.up.set( 0, 0, 1 ); + cameraNY.lookAt( 0, - 1, 0 ); + + cameraPZ.up.set( 0, 1, 0 ); + cameraPZ.lookAt( 0, 0, 1 ); + + cameraNZ.up.set( 0, 1, 0 ); + cameraNZ.lookAt( 0, 0, - 1 ); + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( - 1, 0, 0 ); + + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( 1, 0, 0 ); + + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( 0, 1, 0 ); + + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( 0, - 1, 0 ); + + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( 0, 0, 1 ); + + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( 0, 0, - 1 ); + + } else { + + throw new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem ); + + } + + for ( const camera of cameras ) { + + this.add( camera ); + + camera.updateMatrixWorld(); + + } + + } + + update( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + const { renderTarget, activeMipmapLevel } = this; + + if ( this.coordinateSystem !== renderer.coordinateSystem ) { + + this.coordinateSystem = renderer.coordinateSystem; + + this.updateCoordinateSystem(); + + } + + const [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children; + + const currentRenderTarget = renderer.getRenderTarget(); + const currentActiveCubeFace = renderer.getActiveCubeFace(); + const currentActiveMipmapLevel = renderer.getActiveMipmapLevel(); + + const currentXrEnabled = renderer.xr.enabled; + + renderer.xr.enabled = false; + + const generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderer.setRenderTarget( renderTarget, 0, activeMipmapLevel ); + renderer.render( scene, cameraPX ); + + renderer.setRenderTarget( renderTarget, 1, activeMipmapLevel ); + renderer.render( scene, cameraNX ); + + renderer.setRenderTarget( renderTarget, 2, activeMipmapLevel ); + renderer.render( scene, cameraPY ); + + renderer.setRenderTarget( renderTarget, 3, activeMipmapLevel ); + renderer.render( scene, cameraNY ); + + renderer.setRenderTarget( renderTarget, 4, activeMipmapLevel ); + renderer.render( scene, cameraPZ ); + + // mipmaps are generated during the last call of render() + // at this point, all sides of the cube render target are defined + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderer.setRenderTarget( renderTarget, 5, activeMipmapLevel ); + renderer.render( scene, cameraNZ ); + + renderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel ); + + renderer.xr.enabled = currentXrEnabled; + + renderTarget.texture.needsPMREMUpdate = true; + + } + +} + +class CubeTexture extends Texture { + + constructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + super( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ); + + this.isCubeTexture = true; + + this.flipY = false; + + } + + get images() { + + return this.image; + + } + + set images( value ) { + + this.image = value; + + } + +} + +class WebGLCubeRenderTarget extends WebGLRenderTarget { + + constructor( size = 1, options = {} ) { + + super( size, size, options ); + + this.isWebGLCubeRenderTarget = true; + + const image = { width: size, height: size, depth: 1 }; + const images = [ image, image, image, image, image, image ]; + + if ( options.encoding !== undefined ) { + + // @deprecated, r152 + warnOnce( 'THREE.WebGLCubeRenderTarget: option.encoding has been replaced by option.colorSpace.' ); + options.colorSpace = options.encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace; + + } + + this.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace ); + + // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js) + // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words, + // in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly. + + // three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped + // and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture + // as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures). + + this.texture.isRenderTargetTexture = true; + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false; + this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter; + + } + + fromEquirectangularTexture( renderer, texture ) { + + this.texture.type = texture.type; + this.texture.colorSpace = texture.colorSpace; + + this.texture.generateMipmaps = texture.generateMipmaps; + this.texture.minFilter = texture.minFilter; + this.texture.magFilter = texture.magFilter; + + const shader = { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: /* glsl */` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + + } + + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + } + `, + + fragmentShader: /* glsl */` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + ` + }; + + const geometry = new BoxGeometry( 5, 5, 5 ); + + const material = new ShaderMaterial( { + + name: 'CubemapFromEquirect', + + uniforms: cloneUniforms( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: BackSide, + blending: NoBlending + + } ); + + material.uniforms.tEquirect.value = texture; + + const mesh = new Mesh( geometry, material ); + + const currentMinFilter = texture.minFilter; + + // Avoid blurred poles + if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter; + + const camera = new CubeCamera( 1, 10, this ); + camera.update( renderer, mesh ); + + texture.minFilter = currentMinFilter; + + mesh.geometry.dispose(); + mesh.material.dispose(); + + return this; + + } + + clear( renderer, color, depth, stencil ) { + + const currentRenderTarget = renderer.getRenderTarget(); + + for ( let i = 0; i < 6; i ++ ) { + + renderer.setRenderTarget( this, i ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( currentRenderTarget ); + + } + +} + +const _vector1 = /*@__PURE__*/ new Vector3(); +const _vector2 = /*@__PURE__*/ new Vector3(); +const _normalMatrix = /*@__PURE__*/ new Matrix3(); + +class Plane { + + constructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) { + + this.isPlane = true; + + // normal is assumed to be normalized + + this.normal = normal; + this.constant = constant; + + } + + set( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + } + + setComponents( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + } + + setFromNormalAndCoplanarPoint( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + } + + setFromCoplanarPoints( a, b, c ) { + + const normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + } + + copy( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + } + + normalize() { + + // Note: will lead to a divide by zero if the plane is invalid. + + const inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + } + + negate() { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + } + + distanceToPoint( point ) { + + return this.normal.dot( point ) + this.constant; + + } + + distanceToSphere( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + } + + projectPoint( point, target ) { + + return target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) ); + + } + + intersectLine( line, target ) { + + const direction = line.delta( _vector1 ); + + const denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return null; + + } + + const t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return null; + + } + + return target.copy( line.start ).addScaledVector( direction, t ); + + } + + intersectsLine( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + const startSign = this.distanceToPoint( line.start ); + const endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + } + + intersectsBox( box ) { + + return box.intersectsPlane( this ); + + } + + intersectsSphere( sphere ) { + + return sphere.intersectsPlane( this ); + + } + + coplanarPoint( target ) { + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + } + + applyMatrix4( matrix, optionalNormalMatrix ) { + + const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix ); + + const referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix ); + + const normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + } + + translate( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + } + + equals( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _sphere$5 = /*@__PURE__*/ new Sphere(); +const _vector$7 = /*@__PURE__*/ new Vector3(); + +class Frustum { + + constructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) { + + this.planes = [ p0, p1, p2, p3, p4, p5 ]; + + } + + set( p0, p1, p2, p3, p4, p5 ) { + + const planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + } + + copy( frustum ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + } + + setFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) { + + const planes = this.planes; + const me = m.elements; + const me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + const me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + const me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + const me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); + + } else { + + throw new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem ); + + } + + return this; + + } + + intersectsObject( object ) { + + if ( object.boundingSphere !== undefined ) { + + if ( object.boundingSphere === null ) object.computeBoundingSphere(); + + _sphere$5.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld ); + + } else { + + const geometry = object.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$5.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld ); + + } + + return this.intersectsSphere( _sphere$5 ); + + } + + intersectsSprite( sprite ) { + + _sphere$5.center.set( 0, 0, 0 ); + _sphere$5.radius = 0.7071067811865476; + _sphere$5.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( _sphere$5 ); + + } + + intersectsSphere( sphere ) { + + const planes = this.planes; + const center = sphere.center; + const negRadius = - sphere.radius; + + for ( let i = 0; i < 6; i ++ ) { + + const distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + } + + intersectsBox( box ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + const plane = planes[ i ]; + + // corner at max distance + + _vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x; + _vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y; + _vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( _vector$7 ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + containsPoint( point ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +function WebGLAnimation() { + + let context = null; + let isAnimating = false; + let animationLoop = null; + let requestId = null; + + function onAnimationFrame( time, frame ) { + + animationLoop( time, frame ); + + requestId = context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + requestId = context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + context.cancelAnimationFrame( requestId ); + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + +} + +function WebGLAttributes( gl, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + const buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + const array = attribute.array; + const usage = attribute.usage; + const size = array.byteLength; + + const buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + let type; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Uint16Array ) { + + if ( attribute.isFloat16BufferAttribute ) { + + if ( isWebGL2 ) { + + type = gl.HALF_FLOAT; + + } else { + + throw new Error( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' ); + + } + + } else { + + type = gl.UNSIGNED_SHORT; + + } + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } else if ( array instanceof Uint8ClampedArray ) { + + type = gl.UNSIGNED_BYTE; + + } else { + + throw new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array ); + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version, + size: size + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + const array = attribute.array; + const updateRange = attribute._updateRange; // deprecated + const updateRanges = attribute.updateRanges; + + gl.bindBuffer( bufferType, buffer ); + + if ( updateRange.count === - 1 && updateRanges.length === 0 ) { + + // Not using update ranges + gl.bufferSubData( bufferType, 0, array ); + + } + + if ( updateRanges.length !== 0 ) { + + for ( let i = 0, l = updateRanges.length; i < l; i ++ ) { + + const range = updateRanges[ i ]; + if ( isWebGL2 ) { + + gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT, + array, range.start, range.count ); + + } else { + + gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT, + array.subarray( range.start, range.start + range.count ) ); + + } + + } + + attribute.clearUpdateRanges(); + + } + + // deprecated + if ( updateRange.count !== - 1 ) { + + if ( isWebGL2 ) { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array, updateRange.offset, updateRange.count ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + } + + updateRange.count = - 1; // reset range + + } + + attribute.onUploadCallback(); + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + const data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isGLBufferAttribute ) { + + const cached = buffers.get( attribute ); + + if ( ! cached || cached.version < attribute.version ) { + + buffers.set( attribute, { + buffer: attribute.buffer, + type: attribute.type, + bytesPerElement: attribute.elementSize, + version: attribute.version + } ); + + } + + return; + + } + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + const data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + if ( data.size !== attribute.array.byteLength ) { + + throw new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' ); + + } + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + +} + +class PlaneGeometry extends BufferGeometry { + + constructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) { + + super(); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + const width_half = width / 2; + const height_half = height / 2; + + const gridX = Math.floor( widthSegments ); + const gridY = Math.floor( heightSegments ); + + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + + const segment_width = width / gridX; + const segment_height = height / gridY; + + // + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + for ( let iy = 0; iy < gridY1; iy ++ ) { + + const y = iy * segment_height - height_half; + + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = ix + gridX1 * iy; + const b = ix + gridX1 * ( iy + 1 ); + const c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = ( ix + 1 ) + gridX1 * iy; + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments ); + + } + +} + +var alphahash_fragment = "#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif"; + +var alphahash_pars_fragment = "#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif"; + +var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif"; + +var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; + +var alphatest_fragment = "#ifdef USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif"; + +var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif"; + +var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; + +var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + +var batching_pars_vertex = "#ifdef USE_BATCHING\n\tattribute float batchId;\n\tuniform highp sampler2D batchingTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif"; + +var batching_vertex = "#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( batchId );\n#endif"; + +var begin_vertex = "vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif"; + +var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif"; + +var bsdfs = "float G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n} // validated"; + +var iridescence_fragment = "#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660, 0.0556434,\n\t\t-1.5371385, 1.8760108, -0.2040259,\n\t\t-0.4985314, 0.0415560, 1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\treturn vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif"; + +var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif"; + +var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif"; + +var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; + +var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif"; + +var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif"; + +var color_fragment = "#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif"; + +var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif"; + +var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif"; + +var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif"; + +var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; + +var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; + +var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif"; + +var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif"; + +var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif"; + +var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; + +var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif"; + +var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; + +var colorspace_pars_fragment = "\nconst mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3(\n\tvec3( 0.8224621, 0.177538, 0.0 ),\n\tvec3( 0.0331941, 0.9668058, 0.0 ),\n\tvec3( 0.0170827, 0.0723974, 0.9105199 )\n);\nconst mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.2249401, - 0.2249404, 0.0 ),\n\tvec3( - 0.0420569, 1.0420571, 0.0 ),\n\tvec3( - 0.0196376, - 0.0786361, 1.0982735 )\n);\nvec4 LinearSRGBToLinearDisplayP3( in vec4 value ) {\n\treturn vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a );\n}\nvec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) {\n\treturn vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a );\n}\nvec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn sRGBTransferOETF( value );\n}"; + +var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif"; + +var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif"; + +var envmap_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif"; + +var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif"; + +var envmap_vertex = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif"; + +var fog_vertex = "#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif"; + +var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif"; + +var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; + +var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif"; + +var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}"; + +var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif"; + +var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + +var lights_lambert_fragment = "LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;"; + +var lights_lambert_pars_fragment = "varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert"; + +var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( LEGACY_LIGHTS )\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#else\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif"; + +var envmap_physical_pars_fragment = "#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif"; + +var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; + +var lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon"; + +var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; + +var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong"; + +var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; + +var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; + +var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; + +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; + +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; + +var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + +var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; + +var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif"; + +var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif"; + +var map_fragment = "#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif"; + +var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif"; + +var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; + +var map_particle_pars_fragment = "#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; + +var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif"; + +var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + +var morphcolor_vertex = "#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif"; + +var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif"; + +var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif"; + +var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif"; + +var normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;"; + +var normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif"; + +var normal_pars_fragment = "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif"; + +var normal_pars_vertex = "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif"; + +var normal_vertex = "#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif"; + +var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif"; + +var clearcoat_normal_fragment_begin = "#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif"; + +var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif"; + +var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif"; + +var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif"; + +var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; + +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}"; + +var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif"; + +var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; + +var dithering_fragment = "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; + +var dithering_pars_fragment = "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif"; + +var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif"; + +var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif"; + +var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; + +var shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif"; + +var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}"; + +var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + +var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif"; + +var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; + +var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif"; + +var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + +var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + +var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; + +var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor *= toneMappingExposure;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\treturn color;\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; + +var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif"; + +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif"; + +var uv_pars_fragment = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif"; + +var uv_pars_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif"; + +var uv_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif"; + +var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif"; + +const vertex$h = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; + +const fragment$h = "uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}"; + +const vertex$g = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}"; + +const fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}"; + +const vertex$f = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}"; + +const fragment$f = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}"; + +const vertex$e = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}"; + +const fragment$e = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}"; + +const vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}"; + +const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}"; + +const vertex$c = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}"; + +const fragment$c = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}"; + +const vertex$b = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$b = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$a = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}"; + +const fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}"; + +const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}"; + +const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}"; + +const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}"; + +const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$3 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$2 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}"; + +const vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"; + +const fragment$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const ShaderChunk = { + alphahash_fragment: alphahash_fragment, + alphahash_pars_fragment: alphahash_pars_fragment, + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + alphatest_pars_fragment: alphatest_pars_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + batching_pars_vertex: batching_pars_vertex, + batching_vertex: batching_vertex, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + iridescence_fragment: iridescence_fragment, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + colorspace_fragment: colorspace_fragment, + colorspace_pars_fragment: colorspace_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_common_pars_fragment: envmap_common_pars_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_fragment: lights_lambert_fragment, + lights_lambert_pars_fragment: lights_lambert_pars_fragment, + lights_pars_begin: lights_pars_begin, + lights_toon_fragment: lights_toon_fragment, + lights_toon_pars_fragment: lights_toon_pars_fragment, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphcolor_vertex: morphcolor_vertex, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normal_pars_fragment: normal_pars_fragment, + normal_pars_vertex: normal_pars_vertex, + normal_vertex: normal_vertex, + normalmap_pars_fragment: normalmap_pars_fragment, + clearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin, + clearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps, + clearcoat_pars_fragment: clearcoat_pars_fragment, + iridescence_pars_fragment: iridescence_pars_fragment, + opaque_fragment: opaque_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + transmission_fragment: transmission_fragment, + transmission_pars_fragment: transmission_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + worldpos_vertex: worldpos_vertex, + + background_vert: vertex$h, + background_frag: fragment$h, + backgroundCube_vert: vertex$g, + backgroundCube_frag: fragment$g, + cube_vert: vertex$f, + cube_frag: fragment$f, + depth_vert: vertex$e, + depth_frag: fragment$e, + distanceRGBA_vert: vertex$d, + distanceRGBA_frag: fragment$d, + equirect_vert: vertex$c, + equirect_frag: fragment$c, + linedashed_vert: vertex$b, + linedashed_frag: fragment$b, + meshbasic_vert: vertex$a, + meshbasic_frag: fragment$a, + meshlambert_vert: vertex$9, + meshlambert_frag: fragment$9, + meshmatcap_vert: vertex$8, + meshmatcap_frag: fragment$8, + meshnormal_vert: vertex$7, + meshnormal_frag: fragment$7, + meshphong_vert: vertex$6, + meshphong_frag: fragment$6, + meshphysical_vert: vertex$5, + meshphysical_frag: fragment$5, + meshtoon_vert: vertex$4, + meshtoon_frag: fragment$4, + points_vert: vertex$3, + points_frag: fragment$3, + shadow_vert: vertex$2, + shadow_frag: fragment$2, + sprite_vert: vertex$1, + sprite_frag: fragment$1 +}; + +/** + * Uniforms library for shared webgl shaders + */ + +const UniformsLib = { + + common: { + + diffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + mapTransform: { value: /*@__PURE__*/ new Matrix3() }, + + alphaMap: { value: null }, + alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + + alphaTest: { value: 0 } + + }, + + specularmap: { + + specularMap: { value: null }, + specularMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, // basic, lambert, phong + ior: { value: 1.5 }, // physical + refractionRatio: { value: 0.98 }, // basic, lambert, phong + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 }, + aoMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 }, + lightMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + normalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + emissivemap: { + + emissiveMap: { value: null }, + emissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + metalnessmap: { + + metalnessMap: { value: null }, + metalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + roughnessmap: { + + roughnessMap: { value: null }, + roughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + lightProbe: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {} + } }, + + directionalLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {} + } }, + + spotLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotLightMap: { value: [] }, + spotShadowMap: { value: [] }, + spotLightMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {} + } }, + + pointLightShadows: { value: [], properties: { + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } }, + + ltc_1: { value: null }, + ltc_2: { value: null } + + }, + + points: { + + diffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + alphaMap: { value: null }, + alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + alphaTest: { value: 0 }, + uvTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + sprite: { + + diffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + center: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + mapTransform: { value: /*@__PURE__*/ new Matrix3() }, + alphaMap: { value: null }, + alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + alphaTest: { value: 0 } + + } + +}; + +const ShaderLib = { + + basic: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + specular: { value: /*@__PURE__*/ new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + roughness: { value: 1.0 }, + metalness: { value: 0.0 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + toon: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshtoon_vert, + fragmentShader: ShaderChunk.meshtoon_frag + + }, + + matcap: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.meshnormal_vert, + fragmentShader: ShaderChunk.meshnormal_frag + + }, + + sprite: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + uvTransform: { value: /*@__PURE__*/ new Matrix3() }, + t2D: { value: null }, + backgroundIntensity: { value: 1 } + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + + backgroundCube: { + + uniforms: { + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + backgroundBlurriness: { value: 0 }, + backgroundIntensity: { value: 1 } + }, + + vertexShader: ShaderChunk.backgroundCube_vert, + fragmentShader: ShaderChunk.backgroundCube_frag + + }, + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: /*@__PURE__*/ new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: /*@__PURE__*/ new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + +}; + +ShaderLib.physical = { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + ShaderLib.standard.uniforms, + { + clearcoat: { value: 0 }, + clearcoatMap: { value: null }, + clearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + clearcoatNormalMap: { value: null }, + clearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + clearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }, + clearcoatRoughness: { value: 0 }, + clearcoatRoughnessMap: { value: null }, + clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + iridescence: { value: 0 }, + iridescenceMap: { value: null }, + iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + iridescenceIOR: { value: 1.3 }, + iridescenceThicknessMinimum: { value: 100 }, + iridescenceThicknessMaximum: { value: 400 }, + iridescenceThicknessMap: { value: null }, + iridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + sheen: { value: 0 }, + sheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + sheenColorMap: { value: null }, + sheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + sheenRoughness: { value: 1 }, + sheenRoughnessMap: { value: null }, + sheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + transmission: { value: 0 }, + transmissionMap: { value: null }, + transmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + transmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() }, + transmissionSamplerMap: { value: null }, + thickness: { value: 0 }, + thicknessMap: { value: null }, + thicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + attenuationDistance: { value: 0 }, + attenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + specularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) }, + specularColorMap: { value: null }, + specularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + specularIntensity: { value: 1 }, + specularIntensityMap: { value: null }, + specularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + anisotropyVector: { value: /*@__PURE__*/ new Vector2() }, + anisotropyMap: { value: null }, + anisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + +}; + +const _rgb = { r: 0, b: 0, g: 0 }; + +function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) { + + const clearColor = new Color( 0x000000 ); + let clearAlpha = alpha === true ? 0 : 1; + + let planeMesh; + let boxMesh; + + let currentBackground = null; + let currentBackgroundVersion = 0; + let currentTonemapping = null; + + function render( renderList, scene ) { + + let forceClear = false; + let background = scene.isScene === true ? scene.background : null; + + if ( background && background.isTexture ) { + + const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background + background = ( usePMREM ? cubeuvmaps : cubemaps ).get( background ); + + } + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + const environmentBlendMode = renderer.xr.getEnvironmentBlendMode(); + + if ( environmentBlendMode === 'additive' ) { + + state.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha ); + + } else if ( environmentBlendMode === 'alpha-blend' ) { + + state.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha ); + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxGeometry( 1, 1, 1 ), + new ShaderMaterial( { + name: 'BackgroundCubeMaterial', + uniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ), + vertexShader: ShaderLib.backgroundCube.vertexShader, + fragmentShader: ShaderLib.backgroundCube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.deleteAttribute( 'normal' ); + boxMesh.geometry.deleteAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + // add "envMap" material property so the renderer can evaluate it like for built-in materials + Object.defineProperty( boxMesh.material, 'envMap', { + + get: function () { + + return this.uniforms.envMap.value; + + } + + } ); + + objects.update( boxMesh ); + + } + + boxMesh.material.uniforms.envMap.value = background; + boxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1; + boxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness; + boxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + boxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer; + + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { + + boxMesh.material.needsUpdate = true; + + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + + } + + boxMesh.layers.enableAll(); + + // push to the pre-sorted opaque render list + renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneGeometry( 2, 2 ), + new ShaderMaterial( { + name: 'BackgroundMaterial', + uniforms: cloneUniforms( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.deleteAttribute( 'normal' ); + + // add "map" material property so the renderer can evaluate it like for built-in materials + Object.defineProperty( planeMesh.material, 'map', { + + get: function () { + + return this.uniforms.t2D.value; + + } + + } ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + planeMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + planeMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer; + + if ( background.matrixAutoUpdate === true ) { + + background.updateMatrix(); + + } + + planeMesh.material.uniforms.uvTransform.value.copy( background.matrix ); + + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { + + planeMesh.material.needsUpdate = true; + + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + + } + + planeMesh.layers.enableAll(); + + // push to the pre-sorted opaque render list + renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + color.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) ); + + state.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha = 1 ) { + + clearColor.set( color ); + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + +} + +function WebGLBindingStates( gl, extensions, attributes, capabilities ) { + + const maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + + const extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' ); + const vaoAvailable = capabilities.isWebGL2 || extension !== null; + + const bindingStates = {}; + + const defaultState = createBindingState( null ); + let currentState = defaultState; + let forceUpdate = false; + + function setup( object, material, program, geometry, index ) { + + let updateBuffers = false; + + if ( vaoAvailable ) { + + const state = getBindingState( geometry, program, material ); + + if ( currentState !== state ) { + + currentState = state; + bindVertexArrayObject( currentState.object ); + + } + + updateBuffers = needsUpdate( object, geometry, program, index ); + + if ( updateBuffers ) saveCache( object, geometry, program, index ); + + } else { + + const wireframe = ( material.wireframe === true ); + + if ( currentState.geometry !== geometry.id || + currentState.program !== program.id || + currentState.wireframe !== wireframe ) { + + currentState.geometry = geometry.id; + currentState.program = program.id; + currentState.wireframe = wireframe; + + updateBuffers = true; + + } + + } + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + if ( updateBuffers || forceUpdate ) { + + forceUpdate = false; + + setupVertexAttributes( object, material, program, geometry ); + + if ( index !== null ) { + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer ); + + } + + } + + } + + function createVertexArrayObject() { + + if ( capabilities.isWebGL2 ) return gl.createVertexArray(); + + return extension.createVertexArrayOES(); + + } + + function bindVertexArrayObject( vao ) { + + if ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao ); + + return extension.bindVertexArrayOES( vao ); + + } + + function deleteVertexArrayObject( vao ) { + + if ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao ); + + return extension.deleteVertexArrayOES( vao ); + + } + + function getBindingState( geometry, program, material ) { + + const wireframe = ( material.wireframe === true ); + + let programMap = bindingStates[ geometry.id ]; + + if ( programMap === undefined ) { + + programMap = {}; + bindingStates[ geometry.id ] = programMap; + + } + + let stateMap = programMap[ program.id ]; + + if ( stateMap === undefined ) { + + stateMap = {}; + programMap[ program.id ] = stateMap; + + } + + let state = stateMap[ wireframe ]; + + if ( state === undefined ) { + + state = createBindingState( createVertexArrayObject() ); + stateMap[ wireframe ] = state; + + } + + return state; + + } + + function createBindingState( vao ) { + + const newAttributes = []; + const enabledAttributes = []; + const attributeDivisors = []; + + for ( let i = 0; i < maxVertexAttributes; i ++ ) { + + newAttributes[ i ] = 0; + enabledAttributes[ i ] = 0; + attributeDivisors[ i ] = 0; + + } + + return { + + // for backward compatibility on non-VAO support browser + geometry: null, + program: null, + wireframe: false, + + newAttributes: newAttributes, + enabledAttributes: enabledAttributes, + attributeDivisors: attributeDivisors, + object: vao, + attributes: {}, + index: null + + }; + + } + + function needsUpdate( object, geometry, program, index ) { + + const cachedAttributes = currentState.attributes; + const geometryAttributes = geometry.attributes; + + let attributesNum = 0; + + const programAttributes = program.getAttributes(); + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + const cachedAttribute = cachedAttributes[ name ]; + let geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor; + + } + + if ( cachedAttribute === undefined ) return true; + + if ( cachedAttribute.attribute !== geometryAttribute ) return true; + + if ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true; + + attributesNum ++; + + } + + } + + if ( currentState.attributesNum !== attributesNum ) return true; + + if ( currentState.index !== index ) return true; + + return false; + + } + + function saveCache( object, geometry, program, index ) { + + const cache = {}; + const attributes = geometry.attributes; + let attributesNum = 0; + + const programAttributes = program.getAttributes(); + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + let attribute = attributes[ name ]; + + if ( attribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor; + + } + + const data = {}; + data.attribute = attribute; + + if ( attribute && attribute.data ) { + + data.data = attribute.data; + + } + + cache[ name ] = data; + + attributesNum ++; + + } + + } + + currentState.attributes = cache; + currentState.attributesNum = attributesNum; + + currentState.index = index; + + } + + function initAttributes() { + + const newAttributes = currentState.newAttributes; + + for ( let i = 0, il = newAttributes.length; i < il; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + const attributeDivisors = currentState.attributeDivisors; + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + const extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + + for ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) { + + if ( integer === true ) { + + gl.vertexAttribIPointer( index, size, type, stride, offset ); + + } else { + + gl.vertexAttribPointer( index, size, type, normalized, stride, offset ); + + } + + } + + function setupVertexAttributes( object, material, program, geometry ) { + + if ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return; + + } + + initAttributes(); + + const geometryAttributes = geometry.attributes; + + const programAttributes = program.getAttributes(); + + const materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + let geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor; + + } + + if ( geometryAttribute !== undefined ) { + + const normalized = geometryAttribute.normalized; + const size = geometryAttribute.itemSize; + + const attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + const buffer = attribute.buffer; + const type = attribute.type; + const bytesPerElement = attribute.bytesPerElement; + + // check for integer attributes (WebGL 2 only) + + const integer = ( capabilities.isWebGL2 === true && ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType ) ); + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + const data = geometryAttribute.data; + const stride = data.stride; + const offset = geometryAttribute.offset; + + if ( data.isInstancedInterleavedBuffer ) { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute ); + + } + + if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = data.meshPerAttribute * data.count; + + } + + } else { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttribute( programAttribute.location + i ); + + } + + } + + gl.bindBuffer( gl.ARRAY_BUFFER, buffer ); + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + stride * bytesPerElement, + ( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement, + integer + ); + + } + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute ); + + } + + if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttribute( programAttribute.location + i ); + + } + + } + + gl.bindBuffer( gl.ARRAY_BUFFER, buffer ); + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + size * bytesPerElement, + ( size / programAttribute.locationSize ) * i * bytesPerElement, + integer + ); + + } + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + const value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + gl.vertexAttrib2fv( programAttribute.location, value ); + break; + + case 3: + gl.vertexAttrib3fv( programAttribute.location, value ); + break; + + case 4: + gl.vertexAttrib4fv( programAttribute.location, value ); + break; + + default: + gl.vertexAttrib1fv( programAttribute.location, value ); + + } + + } + + } + + } + + } + + disableUnusedAttributes(); + + } + + function dispose() { + + reset(); + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometryId ]; + + } + + } + + function releaseStatesOfGeometry( geometry ) { + + if ( bindingStates[ geometry.id ] === undefined ) return; + + const programMap = bindingStates[ geometry.id ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometry.id ]; + + } + + function releaseStatesOfProgram( program ) { + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + if ( programMap[ program.id ] === undefined ) continue; + + const stateMap = programMap[ program.id ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ program.id ]; + + } + + } + + function reset() { + + resetDefaultState(); + forceUpdate = true; + + if ( currentState === defaultState ) return; + + currentState = defaultState; + bindVertexArrayObject( currentState.object ); + + } + + // for backward-compatibility + + function resetDefaultState() { + + defaultState.geometry = null; + defaultState.program = null; + defaultState.wireframe = false; + + } + + return { + + setup: setup, + reset: reset, + resetDefaultState: resetDefaultState, + dispose: dispose, + releaseStatesOfGeometry: releaseStatesOfGeometry, + releaseStatesOfProgram: releaseStatesOfProgram, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + disableUnusedAttributes: disableUnusedAttributes + + }; + +} + +function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + let mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + let extension, methodName; + + if ( isWebGL2 ) { + + extension = gl; + methodName = 'drawArraysInstanced'; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + methodName = 'drawArraysInstancedANGLE'; + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ methodName ]( mode, start, count, primcount ); + + info.update( count, mode, primcount ); + + } + + function renderMultiDraw( starts, counts, drawCount ) { + + if ( drawCount === 0 ) return; + + const extension = extensions.get( 'WEBGL_multi_draw' ); + if ( extension === null ) { + + for ( let i = 0; i < drawCount; i ++ ) { + + this.render( starts[ i ], counts[ i ] ); + + } + + } else { + + extension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount ); + + let elementCount = 0; + for ( let i = 0; i < drawCount; i ++ ) { + + elementCount += counts[ i ]; + + } + + info.update( elementCount, mode, 1 ); + + } + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + +} + +function WebGLCapabilities( gl, extensions, parameters ) { + + let maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) { + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + const isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl.constructor.name === 'WebGL2RenderingContext'; + + let precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + const maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + const drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ); + + const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + const maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + const maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + const maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + const maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + const maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + const maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + const vertexTextures = maxVertexTextures > 0; + const floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' ); + const floatVertexTextures = vertexTextures && floatFragmentTextures; + + const maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0; + + return { + + isWebGL2: isWebGL2, + + drawBuffers: drawBuffers, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures, + + maxSamples: maxSamples + + }; + +} + +function WebGLClipping( properties ) { + + const scope = this; + + let globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false; + + const plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping ) { + + const enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + + }; + + this.setGlobalState = function ( planes, camera ) { + + globalState = projectPlanes( planes, camera, 0 ); + + }; + + this.setState = function ( material, camera, useCache ) { + + const planes = material.clippingPlanes, + clipIntersection = material.clipIntersection, + clipShadows = material.clipShadows; + + const materialProperties = properties.get( material ); + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + const nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4; + + let dstArray = materialProperties.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, useCache ); + + for ( let i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + materialProperties.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + const nPlanes = planes !== null ? planes.length : 0; + let dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + const flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + scope.numIntersection = 0; + + return dstArray; + + } + +} + +function WebGLCubeMaps( renderer ) { + + let cubemaps = new WeakMap(); + + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + + function get( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubemaps.has( texture ) ) { + + const cubemap = cubemaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const renderTarget = new WebGLCubeRenderTarget( image.height / 2 ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubemaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemap = cubemaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubemaps.delete( texture ); + cubemap.dispose(); + + } + + } + + function dispose() { + + cubemaps = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +class OrthographicCamera extends Camera { + + constructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) { + + super(); + + this.isOrthographicCamera = true; + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = near; + this.far = far; + + this.updateProjectionMatrix(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + } + + setViewOffset( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + } + + clearViewOffset() { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + } + + updateProjectionMatrix() { + + const dx = ( this.right - this.left ) / ( 2 * this.zoom ); + const dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + const cx = ( this.right + this.left ) / 2; + const cy = ( this.top + this.bottom ) / 2; + + let left = cx - dx; + let right = cx + dx; + let top = cy + dy; + let bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + const scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom; + const scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom; + + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + +} + +const LOD_MIN = 4; + +// The standard deviations (radians) associated with the extra mips. These are +// chosen to approximate a Trowbridge-Reitz distribution function times the +// geometric shadowing function. These sigma values squared must match the +// variance #defines in cube_uv_reflection_fragment.glsl.js. +const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ]; + +// The maximum length of the blur for loop. Smaller sigmas will use fewer +// samples and exit early, but not recompile the shader. +const MAX_SAMPLES = 20; + +const _flatCamera = /*@__PURE__*/ new OrthographicCamera(); +const _clearColor = /*@__PURE__*/ new Color(); +let _oldTarget = null; +let _oldActiveCubeFace = 0; +let _oldActiveMipmapLevel = 0; + +// Golden Ratio +const PHI = ( 1 + Math.sqrt( 5 ) ) / 2; +const INV_PHI = 1 / PHI; + +// Vertices of a dodecahedron (except the opposites, which represent the +// same axis), used as axis directions evenly spread on a sphere. +const _axisDirections = [ + /*@__PURE__*/ new Vector3( 1, 1, 1 ), + /*@__PURE__*/ new Vector3( - 1, 1, 1 ), + /*@__PURE__*/ new Vector3( 1, 1, - 1 ), + /*@__PURE__*/ new Vector3( - 1, 1, - 1 ), + /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ), + /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ), + /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ), + /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ]; + +/** + * This class generates a Prefiltered, Mipmapped Radiance Environment Map + * (PMREM) from a cubeMap environment texture. This allows different levels of + * blur to be quickly accessed based on material roughness. It is packed into a + * special CubeUV format that allows us to perform custom interpolation so that + * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap + * chain, it only goes down to the LOD_MIN level (above), and then creates extra + * even more filtered 'mips' at the same LOD_MIN resolution, associated with + * higher roughness levels. In this way we maintain resolution to smoothly + * interpolate diffuse lighting while limiting sampling computation. + * + * Paper: Fast, Accurate Image-Based Lighting + * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view +*/ + +class PMREMGenerator { + + constructor( renderer ) { + + this._renderer = renderer; + this._pingPongRenderTarget = null; + + this._lodMax = 0; + this._cubeSize = 0; + this._lodPlanes = []; + this._sizeLods = []; + this._sigmas = []; + + this._blurMaterial = null; + this._cubemapMaterial = null; + this._equirectMaterial = null; + + this._compileMaterial( this._blurMaterial ); + + } + + /** + * Generates a PMREM from a supplied Scene, which can be faster than using an + * image if networking bandwidth is low. Optional sigma specifies a blur radius + * in radians to be applied to the scene before PMREM generation. Optional near + * and far planes ensure the scene is rendered in its entirety (the cubeCamera + * is placed at the origin). + */ + fromScene( scene, sigma = 0, near = 0.1, far = 100 ) { + + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + + this._setSize( 256 ); + + const cubeUVRenderTarget = this._allocateTargets(); + cubeUVRenderTarget.depthBuffer = true; + + this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget ); + + if ( sigma > 0 ) { + + this._blur( cubeUVRenderTarget, 0, 0, sigma ); + + } + + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + /** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * or HDR. The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + */ + fromEquirectangular( equirectangular, renderTarget = null ) { + + return this._fromTexture( equirectangular, renderTarget ); + + } + + /** + * Generates a PMREM from an cubemap texture, which can be either LDR + * or HDR. The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + */ + fromCubemap( cubemap, renderTarget = null ) { + + return this._fromTexture( cubemap, renderTarget ); + + } + + /** + * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileCubemapShader() { + + if ( this._cubemapMaterial === null ) { + + this._cubemapMaterial = _getCubemapMaterial(); + this._compileMaterial( this._cubemapMaterial ); + + } + + } + + /** + * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileEquirectangularShader() { + + if ( this._equirectMaterial === null ) { + + this._equirectMaterial = _getEquirectMaterial(); + this._compileMaterial( this._equirectMaterial ); + + } + + } + + /** + * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, + * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on + * one of them will cause any others to also become unusable. + */ + dispose() { + + this._dispose(); + + if ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose(); + if ( this._equirectMaterial !== null ) this._equirectMaterial.dispose(); + + } + + // private interface + + _setSize( cubeSize ) { + + this._lodMax = Math.floor( Math.log2( cubeSize ) ); + this._cubeSize = Math.pow( 2, this._lodMax ); + + } + + _dispose() { + + if ( this._blurMaterial !== null ) this._blurMaterial.dispose(); + + if ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose(); + + for ( let i = 0; i < this._lodPlanes.length; i ++ ) { + + this._lodPlanes[ i ].dispose(); + + } + + } + + _cleanup( outputTarget ) { + + this._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel ); + outputTarget.scissorTest = false; + _setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height ); + + } + + _fromTexture( texture, renderTarget ) { + + if ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) { + + this._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) ); + + } else { // Equirectangular + + this._setSize( texture.image.width / 4 ); + + } + + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + + const cubeUVRenderTarget = renderTarget || this._allocateTargets(); + this._textureToCubeUV( texture, cubeUVRenderTarget ); + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + _allocateTargets() { + + const width = 3 * Math.max( this._cubeSize, 16 * 7 ); + const height = 4 * this._cubeSize; + + const params = { + magFilter: LinearFilter, + minFilter: LinearFilter, + generateMipmaps: false, + type: HalfFloatType, + format: RGBAFormat, + colorSpace: LinearSRGBColorSpace, + depthBuffer: false + }; + + const cubeUVRenderTarget = _createRenderTarget( width, height, params ); + + if ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) { + + if ( this._pingPongRenderTarget !== null ) { + + this._dispose(); + + } + + this._pingPongRenderTarget = _createRenderTarget( width, height, params ); + + const { _lodMax } = this; + ( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) ); + + this._blurMaterial = _getBlurShader( _lodMax, width, height ); + + } + + return cubeUVRenderTarget; + + } + + _compileMaterial( material ) { + + const tmpMesh = new Mesh( this._lodPlanes[ 0 ], material ); + this._renderer.compile( tmpMesh, _flatCamera ); + + } + + _sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) { + + const fov = 90; + const aspect = 1; + const cubeCamera = new PerspectiveCamera( fov, aspect, near, far ); + const upSign = [ 1, - 1, 1, 1, 1, 1 ]; + const forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ]; + const renderer = this._renderer; + + const originalAutoClear = renderer.autoClear; + const toneMapping = renderer.toneMapping; + renderer.getClearColor( _clearColor ); + + renderer.toneMapping = NoToneMapping; + renderer.autoClear = false; + + const backgroundMaterial = new MeshBasicMaterial( { + name: 'PMREM.Background', + side: BackSide, + depthWrite: false, + depthTest: false, + } ); + + const backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial ); + + let useSolidColor = false; + const background = scene.background; + + if ( background ) { + + if ( background.isColor ) { + + backgroundMaterial.color.copy( background ); + scene.background = null; + useSolidColor = true; + + } + + } else { + + backgroundMaterial.color.copy( _clearColor ); + useSolidColor = true; + + } + + for ( let i = 0; i < 6; i ++ ) { + + const col = i % 3; + + if ( col === 0 ) { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.lookAt( forwardSign[ i ], 0, 0 ); + + } else if ( col === 1 ) { + + cubeCamera.up.set( 0, 0, upSign[ i ] ); + cubeCamera.lookAt( 0, forwardSign[ i ], 0 ); + + } else { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.lookAt( 0, 0, forwardSign[ i ] ); + + } + + const size = this._cubeSize; + + _setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size ); + + renderer.setRenderTarget( cubeUVRenderTarget ); + + if ( useSolidColor ) { + + renderer.render( backgroundBox, cubeCamera ); + + } + + renderer.render( scene, cubeCamera ); + + } + + backgroundBox.geometry.dispose(); + backgroundBox.material.dispose(); + + renderer.toneMapping = toneMapping; + renderer.autoClear = originalAutoClear; + scene.background = background; + + } + + _textureToCubeUV( texture, cubeUVRenderTarget ) { + + const renderer = this._renderer; + + const isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ); + + if ( isCubeTexture ) { + + if ( this._cubemapMaterial === null ) { + + this._cubemapMaterial = _getCubemapMaterial(); + + } + + this._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1; + + } else { + + if ( this._equirectMaterial === null ) { + + this._equirectMaterial = _getEquirectMaterial(); + + } + + } + + const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial; + const mesh = new Mesh( this._lodPlanes[ 0 ], material ); + + const uniforms = material.uniforms; + + uniforms[ 'envMap' ].value = texture; + + const size = this._cubeSize; + + _setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size ); + + renderer.setRenderTarget( cubeUVRenderTarget ); + renderer.render( mesh, _flatCamera ); + + } + + _applyPMREM( cubeUVRenderTarget ) { + + const renderer = this._renderer; + const autoClear = renderer.autoClear; + renderer.autoClear = false; + + for ( let i = 1; i < this._lodPlanes.length; i ++ ) { + + const sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] ); + + const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ]; + + this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis ); + + } + + renderer.autoClear = autoClear; + + } + + /** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + */ + _blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) { + + const pingPongRenderTarget = this._pingPongRenderTarget; + + this._halfBlur( + cubeUVRenderTarget, + pingPongRenderTarget, + lodIn, + lodOut, + sigma, + 'latitudinal', + poleAxis ); + + this._halfBlur( + pingPongRenderTarget, + cubeUVRenderTarget, + lodOut, + lodOut, + sigma, + 'longitudinal', + poleAxis ); + + } + + _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) { + + const renderer = this._renderer; + const blurMaterial = this._blurMaterial; + + if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) { + + console.error( + 'blur direction must be either latitudinal or longitudinal!' ); + + } + + // Number of standard deviations at which to cut off the discrete approximation. + const STANDARD_DEVIATIONS = 3; + + const blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial ); + const blurUniforms = blurMaterial.uniforms; + + const pixels = this._sizeLods[ lodIn ] - 1; + const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 ); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES; + + if ( samples > MAX_SAMPLES ) { + + console.warn( `sigmaRadians, ${ + sigmaRadians}, is too large and will clip, as it requested ${ + samples} samples when the maximum is set to ${MAX_SAMPLES}` ); + + } + + const weights = []; + let sum = 0; + + for ( let i = 0; i < MAX_SAMPLES; ++ i ) { + + const x = i / sigmaPixels; + const weight = Math.exp( - x * x / 2 ); + weights.push( weight ); + + if ( i === 0 ) { + + sum += weight; + + } else if ( i < samples ) { + + sum += 2 * weight; + + } + + } + + for ( let i = 0; i < weights.length; i ++ ) { + + weights[ i ] = weights[ i ] / sum; + + } + + blurUniforms[ 'envMap' ].value = targetIn.texture; + blurUniforms[ 'samples' ].value = samples; + blurUniforms[ 'weights' ].value = weights; + blurUniforms[ 'latitudinal' ].value = direction === 'latitudinal'; + + if ( poleAxis ) { + + blurUniforms[ 'poleAxis' ].value = poleAxis; + + } + + const { _lodMax } = this; + blurUniforms[ 'dTheta' ].value = radiansPerPixel; + blurUniforms[ 'mipInt' ].value = _lodMax - lodIn; + + const outputSize = this._sizeLods[ lodOut ]; + const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 ); + const y = 4 * ( this._cubeSize - outputSize ); + + _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); + renderer.setRenderTarget( targetOut ); + renderer.render( blurMesh, _flatCamera ); + + } + +} + + + +function _createPlanes( lodMax ) { + + const lodPlanes = []; + const sizeLods = []; + const sigmas = []; + + let lod = lodMax; + + const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; + + for ( let i = 0; i < totalLods; i ++ ) { + + const sizeLod = Math.pow( 2, lod ); + sizeLods.push( sizeLod ); + let sigma = 1.0 / sizeLod; + + if ( i > lodMax - LOD_MIN ) { + + sigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ]; + + } else if ( i === 0 ) { + + sigma = 0; + + } + + sigmas.push( sigma ); + + const texelSize = 1.0 / ( sizeLod - 2 ); + const min = - texelSize; + const max = 1 + texelSize; + const uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ]; + + const cubeFaces = 6; + const vertices = 6; + const positionSize = 3; + const uvSize = 2; + const faceIndexSize = 1; + + const position = new Float32Array( positionSize * vertices * cubeFaces ); + const uv = new Float32Array( uvSize * vertices * cubeFaces ); + const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces ); + + for ( let face = 0; face < cubeFaces; face ++ ) { + + const x = ( face % 3 ) * 2 / 3 - 1; + const y = face > 2 ? 0 : - 1; + const coordinates = [ + x, y, 0, + x + 2 / 3, y, 0, + x + 2 / 3, y + 1, 0, + x, y, 0, + x + 2 / 3, y + 1, 0, + x, y + 1, 0 + ]; + position.set( coordinates, positionSize * vertices * face ); + uv.set( uv1, uvSize * vertices * face ); + const fill = [ face, face, face, face, face, face ]; + faceIndex.set( fill, faceIndexSize * vertices * face ); + + } + + const planes = new BufferGeometry(); + planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) ); + planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) ); + planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) ); + lodPlanes.push( planes ); + + if ( lod > LOD_MIN ) { + + lod --; + + } + + } + + return { lodPlanes, sizeLods, sigmas }; + +} + +function _createRenderTarget( width, height, params ) { + + const cubeUVRenderTarget = new WebGLRenderTarget( width, height, params ); + cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; + cubeUVRenderTarget.texture.name = 'PMREM.cubeUv'; + cubeUVRenderTarget.scissorTest = true; + return cubeUVRenderTarget; + +} + +function _setViewport( target, x, y, width, height ) { + + target.viewport.set( x, y, width, height ); + target.scissor.set( x, y, width, height ); + +} + +function _getBlurShader( lodMax, width, height ) { + + const weights = new Float32Array( MAX_SAMPLES ); + const poleAxis = new Vector3( 0, 1, 0 ); + const shaderMaterial = new ShaderMaterial( { + + name: 'SphericalGaussianBlur', + + defines: { + 'n': MAX_SAMPLES, + 'CUBEUV_TEXEL_WIDTH': 1.0 / width, + 'CUBEUV_TEXEL_HEIGHT': 1.0 / height, + 'CUBEUV_MAX_MIP': `${lodMax}.0`, + }, + + uniforms: { + 'envMap': { value: null }, + 'samples': { value: 1 }, + 'weights': { value: weights }, + 'latitudinal': { value: false }, + 'dTheta': { value: 0 }, + 'mipInt': { value: 0 }, + 'poleAxis': { value: poleAxis } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + +} + +function _getEquirectMaterial() { + + return new ShaderMaterial( { + + name: 'EquirectangularToCubeUV', + + uniforms: { + 'envMap': { value: null } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + + #include + + void main() { + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + +} + +function _getCubemapMaterial() { + + return new ShaderMaterial( { + + name: 'CubemapToCubeUV', + + uniforms: { + 'envMap': { value: null }, + 'flipEnvMap': { value: - 1 } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + uniform float flipEnvMap; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + void main() { + + gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + +} + +function _getCommonVertexShader() { + + return /* glsl */` + + precision mediump float; + precision mediump int; + + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + `; + +} + +function WebGLCubeUVMaps( renderer ) { + + let cubeUVmaps = new WeakMap(); + + let pmremGenerator = null; + + function get( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ); + const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping ); + + // equirect/cube map to cubeUV conversion + + if ( isEquirectMap || isCubeMap ) { + + if ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) { + + texture.needsPMREMUpdate = false; + + let renderTarget = cubeUVmaps.get( texture ); + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget ); + cubeUVmaps.set( texture, renderTarget ); + + return renderTarget.texture; + + } else { + + if ( cubeUVmaps.has( texture ) ) { + + return cubeUVmaps.get( texture ).texture; + + } else { + + const image = texture.image; + + if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) { + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + const renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); + cubeUVmaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return renderTarget.texture; + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + } + + return texture; + + } + + function isCubeTextureComplete( image ) { + + let count = 0; + const length = 6; + + for ( let i = 0; i < length; i ++ ) { + + if ( image[ i ] !== undefined ) count ++; + + } + + return count === length; + + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemapUV = cubeUVmaps.get( texture ); + + if ( cubemapUV !== undefined ) { + + cubeUVmaps.delete( texture ); + cubemapUV.dispose(); + + } + + } + + function dispose() { + + cubeUVmaps = new WeakMap(); + + if ( pmremGenerator !== null ) { + + pmremGenerator.dispose(); + pmremGenerator = null; + + } + + } + + return { + get: get, + dispose: dispose + }; + +} + +function WebGLExtensions( gl ) { + + const extensions = {}; + + function getExtension( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + let extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + return { + + has: function ( name ) { + + return getExtension( name ) !== null; + + }, + + init: function ( capabilities ) { + + if ( capabilities.isWebGL2 ) { + + getExtension( 'EXT_color_buffer_float' ); + getExtension( 'WEBGL_clip_cull_distance' ); + + } else { + + getExtension( 'WEBGL_depth_texture' ); + getExtension( 'OES_texture_float' ); + getExtension( 'OES_texture_half_float' ); + getExtension( 'OES_texture_half_float_linear' ); + getExtension( 'OES_standard_derivatives' ); + getExtension( 'OES_element_index_uint' ); + getExtension( 'OES_vertex_array_object' ); + getExtension( 'ANGLE_instanced_arrays' ); + + } + + getExtension( 'OES_texture_float_linear' ); + getExtension( 'EXT_color_buffer_half_float' ); + getExtension( 'WEBGL_multisampled_render_to_texture' ); + + }, + + get: function ( name ) { + + const extension = getExtension( name ); + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + return extension; + + } + + }; + +} + +function WebGLGeometries( gl, attributes, info, bindingStates ) { + + const geometries = {}; + const wireframeAttributes = new WeakMap(); + + function onGeometryDispose( event ) { + + const geometry = event.target; + + if ( geometry.index !== null ) { + + attributes.remove( geometry.index ); + + } + + for ( const name in geometry.attributes ) { + + attributes.remove( geometry.attributes[ name ] ); + + } + + for ( const name in geometry.morphAttributes ) { + + const array = geometry.morphAttributes[ name ]; + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + attributes.remove( array[ i ] ); + + } + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + const attribute = wireframeAttributes.get( geometry ); + + if ( attribute ) { + + attributes.remove( attribute ); + wireframeAttributes.delete( geometry ); + + } + + bindingStates.releaseStatesOfGeometry( geometry ); + + if ( geometry.isInstancedBufferGeometry === true ) { + + delete geometry._maxInstanceCount; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + if ( geometries[ geometry.id ] === true ) return geometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + geometries[ geometry.id ] = true; + + info.memory.geometries ++; + + return geometry; + + } + + function update( geometry ) { + + const geometryAttributes = geometry.attributes; + + // Updating index buffer in VAO now. See WebGLBindingStates. + + for ( const name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + const morphAttributes = geometry.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = morphAttributes[ name ]; + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function updateWireframeAttribute( geometry ) { + + const indices = []; + + const geometryIndex = geometry.index; + const geometryPosition = geometry.attributes.position; + let version = 0; + + if ( geometryIndex !== null ) { + + const array = geometryIndex.array; + version = geometryIndex.version; + + for ( let i = 0, l = array.length; i < l; i += 3 ) { + + const a = array[ i + 0 ]; + const b = array[ i + 1 ]; + const c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else if ( geometryPosition !== undefined ) { + + const array = geometryPosition.array; + version = geometryPosition.version; + + for ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + const a = i + 0; + const b = i + 1; + const c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + return; + + } + + const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + attribute.version = version; + + // Updating index buffer in VAO now. See WebGLBindingStates + + // + + const previousAttribute = wireframeAttributes.get( geometry ); + + if ( previousAttribute ) attributes.remove( previousAttribute ); + + // + + wireframeAttributes.set( geometry, attribute ); + + } + + function getWireframeAttribute( geometry ) { + + const currentAttribute = wireframeAttributes.get( geometry ); + + if ( currentAttribute ) { + + const geometryIndex = geometry.index; + + if ( geometryIndex !== null ) { + + // if the attribute is obsolete, create a new one + + if ( currentAttribute.version < geometryIndex.version ) { + + updateWireframeAttribute( geometry ); + + } + + } + + } else { + + updateWireframeAttribute( geometry ); + + } + + return wireframeAttributes.get( geometry ); + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + +} + +function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + let mode; + + function setMode( value ) { + + mode = value; + + } + + let type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + let extension, methodName; + + if ( isWebGL2 ) { + + extension = gl; + methodName = 'drawElementsInstanced'; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + methodName = 'drawElementsInstancedANGLE'; + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ methodName ]( mode, count, type, start * bytesPerElement, primcount ); + + info.update( count, mode, primcount ); + + } + + function renderMultiDraw( starts, counts, drawCount ) { + + if ( drawCount === 0 ) return; + + const extension = extensions.get( 'WEBGL_multi_draw' ); + if ( extension === null ) { + + for ( let i = 0; i < drawCount; i ++ ) { + + this.render( starts[ i ] / bytesPerElement, counts[ i ] ); + + } + + } else { + + extension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount ); + + let elementCount = 0; + for ( let i = 0; i < drawCount; i ++ ) { + + elementCount += counts[ i ]; + + } + + info.update( elementCount, mode, 1 ); + + } + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + +} + +function WebGLInfo( gl ) { + + const memory = { + geometries: 0, + textures: 0 + }; + + const render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + render.calls ++; + + switch ( mode ) { + + case gl.TRIANGLES: + render.triangles += instanceCount * ( count / 3 ); + break; + + case gl.LINES: + render.lines += instanceCount * ( count / 2 ); + break; + + case gl.LINE_STRIP: + render.lines += instanceCount * ( count - 1 ); + break; + + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + + case gl.POINTS: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + +} + +function numericalSort( a, b ) { + + return a[ 0 ] - b[ 0 ]; + +} + +function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + +} + +function WebGLMorphtargets( gl, capabilities, textures ) { + + const influencesList = {}; + const morphInfluences = new Float32Array( 8 ); + const morphTextures = new WeakMap(); + const morph = new Vector4(); + + const workInfluences = []; + + for ( let i = 0; i < 8; i ++ ) { + + workInfluences[ i ] = [ i, 0 ]; + + } + + function update( object, geometry, program ) { + + const objectInfluences = object.morphTargetInfluences; + + if ( capabilities.isWebGL2 === true ) { + + // instead of using attributes, the WebGL 2 code path encodes morph targets + // into an array of data textures. Each layer represents a single morph target. + + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0; + + let entry = morphTextures.get( geometry ); + + if ( entry === undefined || entry.count !== morphTargetsCount ) { + + if ( entry !== undefined ) entry.texture.dispose(); + + const hasMorphPosition = geometry.morphAttributes.position !== undefined; + const hasMorphNormals = geometry.morphAttributes.normal !== undefined; + const hasMorphColors = geometry.morphAttributes.color !== undefined; + + const morphTargets = geometry.morphAttributes.position || []; + const morphNormals = geometry.morphAttributes.normal || []; + const morphColors = geometry.morphAttributes.color || []; + + let vertexDataCount = 0; + + if ( hasMorphPosition === true ) vertexDataCount = 1; + if ( hasMorphNormals === true ) vertexDataCount = 2; + if ( hasMorphColors === true ) vertexDataCount = 3; + + let width = geometry.attributes.position.count * vertexDataCount; + let height = 1; + + if ( width > capabilities.maxTextureSize ) { + + height = Math.ceil( width / capabilities.maxTextureSize ); + width = capabilities.maxTextureSize; + + } + + const buffer = new Float32Array( width * height * 4 * morphTargetsCount ); + + const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount ); + texture.type = FloatType; + texture.needsUpdate = true; + + // fill buffer + + const vertexDataStride = vertexDataCount * 4; + + for ( let i = 0; i < morphTargetsCount; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const morphNormal = morphNormals[ i ]; + const morphColor = morphColors[ i ]; + + const offset = width * height * 4 * i; + + for ( let j = 0; j < morphTarget.count; j ++ ) { + + const stride = j * vertexDataStride; + + if ( hasMorphPosition === true ) { + + morph.fromBufferAttribute( morphTarget, j ); + + buffer[ offset + stride + 0 ] = morph.x; + buffer[ offset + stride + 1 ] = morph.y; + buffer[ offset + stride + 2 ] = morph.z; + buffer[ offset + stride + 3 ] = 0; + + } + + if ( hasMorphNormals === true ) { + + morph.fromBufferAttribute( morphNormal, j ); + + buffer[ offset + stride + 4 ] = morph.x; + buffer[ offset + stride + 5 ] = morph.y; + buffer[ offset + stride + 6 ] = morph.z; + buffer[ offset + stride + 7 ] = 0; + + } + + if ( hasMorphColors === true ) { + + morph.fromBufferAttribute( morphColor, j ); + + buffer[ offset + stride + 8 ] = morph.x; + buffer[ offset + stride + 9 ] = morph.y; + buffer[ offset + stride + 10 ] = morph.z; + buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1; + + } + + } + + } + + entry = { + count: morphTargetsCount, + texture: texture, + size: new Vector2( width, height ) + }; + + morphTextures.set( geometry, entry ); + + function disposeTexture() { + + texture.dispose(); + + morphTextures.delete( geometry ); + + geometry.removeEventListener( 'dispose', disposeTexture ); + + } + + geometry.addEventListener( 'dispose', disposeTexture ); + + } + + // + + let morphInfluencesSum = 0; + + for ( let i = 0; i < objectInfluences.length; i ++ ) { + + morphInfluencesSum += objectInfluences[ i ]; + + } + + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence ); + program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences ); + + program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures ); + program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size ); + + + } else { + + // When object doesn't have morph target influences defined, we treat it as a 0-length array + // This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences + + const length = objectInfluences === undefined ? 0 : objectInfluences.length; + + let influences = influencesList[ geometry.id ]; + + if ( influences === undefined || influences.length !== length ) { + + // initialise list + + influences = []; + + for ( let i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + // Collect influences + + for ( let i = 0; i < length; i ++ ) { + + const influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + for ( let i = 0; i < 8; i ++ ) { + + if ( i < length && influences[ i ][ 1 ] ) { + + workInfluences[ i ][ 0 ] = influences[ i ][ 0 ]; + workInfluences[ i ][ 1 ] = influences[ i ][ 1 ]; + + } else { + + workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER; + workInfluences[ i ][ 1 ] = 0; + + } + + } + + workInfluences.sort( numericalSort ); + + const morphTargets = geometry.morphAttributes.position; + const morphNormals = geometry.morphAttributes.normal; + + let morphInfluencesSum = 0; + + for ( let i = 0; i < 8; i ++ ) { + + const influence = workInfluences[ i ]; + const index = influence[ 0 ]; + const value = influence[ 1 ]; + + if ( index !== Number.MAX_SAFE_INTEGER && value ) { + + if ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) { + + geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] ); + + } + + if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) { + + geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + } + + morphInfluences[ i ] = value; + morphInfluencesSum += value; + + } else { + + if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) { + + geometry.deleteAttribute( 'morphTarget' + i ); + + } + + if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) { + + geometry.deleteAttribute( 'morphNormal' + i ); + + } + + morphInfluences[ i ] = 0; + + } + + } + + // GLSL shader uses formula baseinfluence * base + sum(target * influence) + // This allows us to switch between absolute morphs and relative morphs without changing shader code + // When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence) + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence ); + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + } + + return { + + update: update + + }; + +} + +function WebGLObjects( gl, geometries, attributes, info ) { + + let updateMap = new WeakMap(); + + function update( object ) { + + const frame = info.render.frame; + + const geometry = object.geometry; + const buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateMap.get( buffergeometry ) !== frame ) { + + geometries.update( buffergeometry ); + + updateMap.set( buffergeometry, frame ); + + } + + if ( object.isInstancedMesh ) { + + if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) { + + object.addEventListener( 'dispose', onInstancedMeshDispose ); + + } + + if ( updateMap.get( object ) !== frame ) { + + attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER ); + + if ( object.instanceColor !== null ) { + + attributes.update( object.instanceColor, gl.ARRAY_BUFFER ); + + } + + updateMap.set( object, frame ); + + } + + } + + if ( object.isSkinnedMesh ) { + + const skeleton = object.skeleton; + + if ( updateMap.get( skeleton ) !== frame ) { + + skeleton.update(); + + updateMap.set( skeleton, frame ); + + } + + } + + return buffergeometry; + + } + + function dispose() { + + updateMap = new WeakMap(); + + } + + function onInstancedMeshDispose( event ) { + + const instancedMesh = event.target; + + instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose ); + + attributes.remove( instancedMesh.instanceMatrix ); + + if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor ); + + } + + return { + + update: update, + dispose: dispose + + }; + +} + +class DepthTexture extends Texture { + + constructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedIntType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.isDepthTexture = true; + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + this.compareFunction = null; + + } + + + copy( source ) { + + super.copy( source ); + + this.compareFunction = source.compareFunction; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.compareFunction !== null ) data.compareFunction = this.compareFunction; + + return data; + + } + +} + +/** + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [textures] ) + * + * uploads a uniform value(s) + * the 'textures' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (textures factorizations): + * + * .upload( gl, seq, values, textures ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (textures factorizations): + * + * .setValue( gl, name, value, textures ) + * + * sets uniform with name 'name' to 'value' + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + +const emptyTexture = /*@__PURE__*/ new Texture(); + +const emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 ); +emptyShadowTexture.compareFunction = LessEqualCompare; + +const emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture(); +const empty3dTexture = /*@__PURE__*/ new Data3DTexture(); +const emptyCubeTexture = /*@__PURE__*/ new CubeTexture(); + +// --- Utilities --- + +// Array Caches (provide typed arrays for temporary by size) + +const arrayCacheF32 = []; +const arrayCacheI32 = []; + +// Float32Array caches used for uploading Matrix uniforms + +const mat4array = new Float32Array( 16 ); +const mat3array = new Float32Array( 9 ); +const mat2array = new Float32Array( 4 ); + +// Flattening for arrays of vectors and matrices + +function flatten( array, nBlocks, blockSize ) { + + const firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + const n = nBlocks * blockSize; + let r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( let i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + +} + +function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( let i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + +} + +function copyArray( a, b ) { + + for ( let i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + +} + +// Texture unit allocation + +function allocTexUnits( textures, n ) { + + let r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( let i = 0; i !== n; ++ i ) { + + r[ i ] = textures.allocateTextureUnit(); + + } + + return r; + +} + +// --- Setters --- + +// Note: Defining these methods externally, because they come in a bunch +// and this way their names minify. + +// Single scalar + +function setValueV1f( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single float vector (from flat array or THREE.VectorN) + +function setValueV2f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single matrix (from flat array or THREE.MatrixN) + +function setValueM2( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + +} + +function setValueM3( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + +} + +function setValueM4( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + +} + +// Single integer / boolean + +function setValueV1i( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single integer / boolean vector (from flat array or THREE.VectorN) + +function setValueV2i( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2i( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3i( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3i( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4i( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4i( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single unsigned integer + +function setValueV1ui( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1ui( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single unsigned integer vector (from flat array or THREE.VectorN) + +function setValueV2ui( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2ui( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2uiv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3ui( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3ui( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3uiv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4ui( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4ui( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4uiv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + + +// Single texture (2D / Cube) + +function setValueT1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + const emptyTexture2D = ( this.type === gl.SAMPLER_2D_SHADOW ) ? emptyShadowTexture : emptyTexture; + + textures.setTexture2D( v || emptyTexture2D, unit ); + +} + +function setValueT3D1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture3D( v || empty3dTexture, unit ); + +} + +function setValueT6( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTextureCube( v || emptyCubeTexture, unit ); + +} + +function setValueT2DArray1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture2DArray( v || emptyArrayTexture, unit ); + +} + +// Helper to pick the right setter for the singular case + +function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1f; // FLOAT + case 0x8b50: return setValueV2f; // _VEC2 + case 0x8b51: return setValueV3f; // _VEC3 + case 0x8b52: return setValueV4f; // _VEC4 + + case 0x8b5a: return setValueM2; // _MAT2 + case 0x8b5b: return setValueM3; // _MAT3 + case 0x8b5c: return setValueM4; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2i; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3i; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4i; // _VEC4 + + case 0x1405: return setValueV1ui; // UINT + case 0x8dc6: return setValueV2ui; // _VEC2 + case 0x8dc7: return setValueV3ui; // _VEC3 + case 0x8dc8: return setValueV4ui; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1; + + case 0x8b5f: // SAMPLER_3D + case 0x8dcb: // INT_SAMPLER_3D + case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D + return setValueT3D1; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6; + + case 0x8dc1: // SAMPLER_2D_ARRAY + case 0x8dcf: // INT_SAMPLER_2D_ARRAY + case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW + return setValueT2DArray1; + + } + +} + + +// Array of scalars + +function setValueV1fArray( gl, v ) { + + gl.uniform1fv( this.addr, v ); + +} + +// Array of vectors (from flat array or array of THREE.VectorN) + +function setValueV2fArray( gl, v ) { + + const data = flatten( v, this.size, 2 ); + + gl.uniform2fv( this.addr, data ); + +} + +function setValueV3fArray( gl, v ) { + + const data = flatten( v, this.size, 3 ); + + gl.uniform3fv( this.addr, data ); + +} + +function setValueV4fArray( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniform4fv( this.addr, data ); + +} + +// Array of matrices (from flat array or array of THREE.MatrixN) + +function setValueM2Array( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniformMatrix2fv( this.addr, false, data ); + +} + +function setValueM3Array( gl, v ) { + + const data = flatten( v, this.size, 9 ); + + gl.uniformMatrix3fv( this.addr, false, data ); + +} + +function setValueM4Array( gl, v ) { + + const data = flatten( v, this.size, 16 ); + + gl.uniformMatrix4fv( this.addr, false, data ); + +} + +// Array of integer / boolean + +function setValueV1iArray( gl, v ) { + + gl.uniform1iv( this.addr, v ); + +} + +// Array of integer / boolean vectors (from flat array) + +function setValueV2iArray( gl, v ) { + + gl.uniform2iv( this.addr, v ); + +} + +function setValueV3iArray( gl, v ) { + + gl.uniform3iv( this.addr, v ); + +} + +function setValueV4iArray( gl, v ) { + + gl.uniform4iv( this.addr, v ); + +} + +// Array of unsigned integer + +function setValueV1uiArray( gl, v ) { + + gl.uniform1uiv( this.addr, v ); + +} + +// Array of unsigned integer vectors (from flat array) + +function setValueV2uiArray( gl, v ) { + + gl.uniform2uiv( this.addr, v ); + +} + +function setValueV3uiArray( gl, v ) { + + gl.uniform3uiv( this.addr, v ); + +} + +function setValueV4uiArray( gl, v ) { + + gl.uniform4uiv( this.addr, v ); + +} + + +// Array of textures (2D / 3D / Cube / 2DArray) + +function setValueT1Array( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + +} + +function setValueT3DArray( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] ); + + } + +} + +function setValueT6Array( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + +} + +function setValueT2DArrayArray( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] ); + + } + +} + + +// Helper to pick the right setter for a pure (bottom-level) array + +function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1fArray; // FLOAT + case 0x8b50: return setValueV2fArray; // _VEC2 + case 0x8b51: return setValueV3fArray; // _VEC3 + case 0x8b52: return setValueV4fArray; // _VEC4 + + case 0x8b5a: return setValueM2Array; // _MAT2 + case 0x8b5b: return setValueM3Array; // _MAT3 + case 0x8b5c: return setValueM4Array; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4 + + case 0x1405: return setValueV1uiArray; // UINT + case 0x8dc6: return setValueV2uiArray; // _VEC2 + case 0x8dc7: return setValueV3uiArray; // _VEC3 + case 0x8dc8: return setValueV4uiArray; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1Array; + + case 0x8b5f: // SAMPLER_3D + case 0x8dcb: // INT_SAMPLER_3D + case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D + return setValueT3DArray; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6Array; + + case 0x8dc1: // SAMPLER_2D_ARRAY + case 0x8dcf: // INT_SAMPLER_2D_ARRAY + case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW + return setValueT2DArrayArray; + + } + +} + +// --- Uniform Classes --- + +class SingleUniform { + + constructor( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + +} + +class PureArrayUniform { + + constructor( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + +} + +class StructuredUniform { + + constructor( id ) { + + this.id = id; + + this.seq = []; + this.map = {}; + + } + + setValue( gl, value, textures ) { + + const seq = this.seq; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + u.setValue( gl, value[ u.id ], textures ); + + } + + } + +} + +// --- Top-level --- + +// Parser - builds up the property tree from the path strings + +const RePathPart = /(\w+)(\])?(\[|\.)?/g; + +// extracts +// - the identifier (member name or array index) +// - followed by an optional right bracket (found when array index) +// - followed by an optional left bracket or dot (type of subscript) +// +// Note: These portions can be read in a non-overlapping fashion and +// allow straightforward parsing of the hierarchy that WebGL encodes +// in the uniform names. + +function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + +} + +function parseUniform( activeInfo, addr, container ) { + + const path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + const match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex; + + let id = match[ 1 ]; + const idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + const map = container.map; + let next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + +} + +// Root Container + +class WebGLUniforms { + + constructor( gl, program ) { + + this.seq = []; + this.map = {}; + + const n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( let i = 0; i < n; ++ i ) { + + const info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + setValue( gl, name, value, textures ) { + + const u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, textures ); + + } + + setOptional( gl, object, name ) { + + const v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + } + + static upload( gl, seq, values, textures ) { + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, textures ); + + } + + } + + } + + static seqWithValue( seq, values ) { + + const r = []; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + } + +} + +function WebGLShader( gl, type, string ) { + + const shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + return shader; + +} + +// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/ +const COMPLETION_STATUS_KHR = 0x91B1; + +let programIdCount = 0; + +function handleSource( string, errorLine ) { + + const lines = string.split( '\n' ); + const lines2 = []; + + const from = Math.max( errorLine - 6, 0 ); + const to = Math.min( errorLine + 6, lines.length ); + + for ( let i = from; i < to; i ++ ) { + + const line = i + 1; + lines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` ); + + } + + return lines2.join( '\n' ); + +} + +function getEncodingComponents( colorSpace ) { + + const workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace ); + const encodingPrimaries = ColorManagement.getPrimaries( colorSpace ); + + let gamutMapping; + + if ( workingPrimaries === encodingPrimaries ) { + + gamutMapping = ''; + + } else if ( workingPrimaries === P3Primaries && encodingPrimaries === Rec709Primaries ) { + + gamutMapping = 'LinearDisplayP3ToLinearSRGB'; + + } else if ( workingPrimaries === Rec709Primaries && encodingPrimaries === P3Primaries ) { + + gamutMapping = 'LinearSRGBToLinearDisplayP3'; + + } + + switch ( colorSpace ) { + + case LinearSRGBColorSpace: + case LinearDisplayP3ColorSpace: + return [ gamutMapping, 'LinearTransferOETF' ]; + + case SRGBColorSpace: + case DisplayP3ColorSpace: + return [ gamutMapping, 'sRGBTransferOETF' ]; + + default: + console.warn( 'THREE.WebGLProgram: Unsupported color space:', colorSpace ); + return [ gamutMapping, 'LinearTransferOETF' ]; + + } + +} + +function getShaderErrors( gl, shader, type ) { + + const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS ); + const errors = gl.getShaderInfoLog( shader ).trim(); + + if ( status && errors === '' ) return ''; + + const errorMatches = /ERROR: 0:(\d+)/.exec( errors ); + if ( errorMatches ) { + + // --enable-privileged-webgl-extension + // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + const errorLine = parseInt( errorMatches[ 1 ] ); + return type.toUpperCase() + '\n\n' + errors + '\n\n' + handleSource( gl.getShaderSource( shader ), errorLine ); + + } else { + + return errors; + + } + +} + +function getTexelEncodingFunction( functionName, colorSpace ) { + + const components = getEncodingComponents( colorSpace ); + return `vec4 ${functionName}( vec4 value ) { return ${components[ 0 ]}( ${components[ 1 ]}( value ) ); }`; + +} + +function getToneMappingFunction( functionName, toneMapping ) { + + let toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + case ACESFilmicToneMapping: + toneMappingName = 'ACESFilmic'; + break; + + case AgXToneMapping: + toneMappingName = 'AgX'; + break; + + case CustomToneMapping: + toneMappingName = 'Custom'; + break; + + default: + console.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping ); + toneMappingName = 'Linear'; + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + +} + +function generateExtensions( parameters ) { + + const chunks = [ + ( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.normalMapTangentSpace || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '', + ( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + +} + +function generateVertexExtensions( parameters ) { + + const chunks = [ + parameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + +} + +function generateDefines( defines ) { + + const chunks = []; + + for ( const name in defines ) { + + const value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + +} + +function fetchAttributeLocations( gl, program ) { + + const attributes = {}; + + const n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( let i = 0; i < n; i ++ ) { + + const info = gl.getActiveAttrib( program, i ); + const name = info.name; + + let locationSize = 1; + if ( info.type === gl.FLOAT_MAT2 ) locationSize = 2; + if ( info.type === gl.FLOAT_MAT3 ) locationSize = 3; + if ( info.type === gl.FLOAT_MAT4 ) locationSize = 4; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = { + type: info.type, + location: gl.getAttribLocation( program, name ), + locationSize: locationSize + }; + + } + + return attributes; + +} + +function filterEmptyLine( string ) { + + return string !== ''; + +} + +function replaceLightNums( string, parameters ) { + + const numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps; + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps ) + .replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ) + .replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows ) + .replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps ) + .replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows ) + .replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows ); + +} + +function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + +} + +// Resolve Includes + +const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + +function resolveIncludes( string ) { + + return string.replace( includePattern, includeReplacer ); + +} + +const shaderChunkMap = new Map( [ + [ 'encodings_fragment', 'colorspace_fragment' ], // @deprecated, r154 + [ 'encodings_pars_fragment', 'colorspace_pars_fragment' ], // @deprecated, r154 + [ 'output_fragment', 'opaque_fragment' ], // @deprecated, r154 +] ); + +function includeReplacer( match, include ) { + + let string = ShaderChunk[ include ]; + + if ( string === undefined ) { + + const newInclude = shaderChunkMap.get( include ); + + if ( newInclude !== undefined ) { + + string = ShaderChunk[ newInclude ]; + console.warn( 'THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.', include, newInclude ); + + } else { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + } + + return resolveIncludes( string ); + +} + +// Unroll Loops + +const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; + +function unrollLoops( string ) { + + return string.replace( unrollLoopPattern, loopReplacer ); + +} + +function loopReplacer( match, start, end, snippet ) { + + let string = ''; + + for ( let i = parseInt( start ); i < parseInt( end ); i ++ ) { + + string += snippet + .replace( /\[\s*i\s*\]/g, '[ ' + i + ' ]' ) + .replace( /UNROLLED_LOOP_INDEX/g, i ); + + } + + return string; + +} + +// + +function generatePrecision( parameters ) { + + let precisionstring = 'precision ' + parameters.precision + ' float;\nprecision ' + parameters.precision + ' int;'; + + if ( parameters.precision === 'highp' ) { + + precisionstring += '\n#define HIGH_PRECISION'; + + } else if ( parameters.precision === 'mediump' ) { + + precisionstring += '\n#define MEDIUM_PRECISION'; + + } else if ( parameters.precision === 'lowp' ) { + + precisionstring += '\n#define LOW_PRECISION'; + + } + + return precisionstring; + +} + +function generateShadowMapTypeDefine( parameters ) { + + let shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } else if ( parameters.shadowMapType === VSMShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM'; + + } + + return shadowMapTypeDefine; + +} + +function generateEnvMapTypeDefine( parameters ) { + + let envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + } + + } + + return envMapTypeDefine; + +} + +function generateEnvMapModeDefine( parameters ) { + + let envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeRefractionMapping: + + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + } + + return envMapModeDefine; + +} + +function generateEnvMapBlendingDefine( parameters ) { + + let envMapBlendingDefine = 'ENVMAP_BLENDING_NONE'; + + if ( parameters.envMap ) { + + switch ( parameters.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + return envMapBlendingDefine; + +} + +function generateCubeUVSize( parameters ) { + + const imageHeight = parameters.envMapCubeUVHeight; + + if ( imageHeight === null ) return null; + + const maxMip = Math.log2( imageHeight ) - 2; + + const texelHeight = 1.0 / imageHeight; + + const texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) ); + + return { texelWidth, texelHeight, maxMip }; + +} + +function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { + + // TODO Send this event to Three.js DevTools + // console.log( 'WebGLProgram', cacheKey ); + + const gl = renderer.getContext(); + + const defines = parameters.defines; + + let vertexShader = parameters.vertexShader; + let fragmentShader = parameters.fragmentShader; + + const shadowMapTypeDefine = generateShadowMapTypeDefine( parameters ); + const envMapTypeDefine = generateEnvMapTypeDefine( parameters ); + const envMapModeDefine = generateEnvMapModeDefine( parameters ); + const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters ); + const envMapCubeUVSize = generateCubeUVSize( parameters ); + + const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters ); + + const customVertexExtensions = generateVertexExtensions( parameters ); + + const customDefines = generateDefines( defines ); + + const program = gl.createProgram(); + + let prefixVertex, prefixFragment; + let versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\n' : ''; + + if ( parameters.isRawShaderMaterial ) { + + prefixVertex = [ + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + generatePrecision( parameters ), + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '', + parameters.batching ? '#define USE_BATCHING' : '', + parameters.instancing ? '#define USE_INSTANCING' : '', + parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '', + + parameters.useFog && parameters.fog ? '#define USE_FOG' : '', + parameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '', + parameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '', + parameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + + parameters.anisotropy ? '#define USE_ANISOTROPY' : '', + parameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '', + + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + + parameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '', + parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '', + + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '', + parameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '', + + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.alphaHash ? '#define USE_ALPHAHASH' : '', + + parameters.transmission ? '#define USE_TRANSMISSION' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', + + parameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '', + parameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '', + + // + + parameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '', + parameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '', + parameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '', + parameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '', + parameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '', + parameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '', + parameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '', + parameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '', + + parameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '', + parameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '', + + parameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '', + + parameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '', + parameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '', + parameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '', + + parameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '', + parameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '', + + parameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '', + parameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '', + + parameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '', + parameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '', + parameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '', + + parameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '', + parameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '', + + // + + parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexUv1s ? '#define USE_UV1' : '', + parameters.vertexUv2s ? '#define USE_UV2' : '', + parameters.vertexUv3s ? '#define USE_UV3' : '', + + parameters.pointsUvs ? '#define USE_POINTS_UV' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + ( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '', + ( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '', + ( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '', + ( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '', + + parameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + '#ifdef USE_INSTANCING', + + ' attribute mat4 instanceMatrix;', + + '#endif', + + '#ifdef USE_INSTANCING_COLOR', + + ' attribute vec3 instanceColor;', + + '#endif', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_UV1', + + ' attribute vec2 uv1;', + + '#endif', + + '#ifdef USE_UV2', + + ' attribute vec2 uv2;', + + '#endif', + + '#ifdef USE_UV3', + + ' attribute vec2 uv3;', + + '#endif', + + '#ifdef USE_TANGENT', + + ' attribute vec4 tangent;', + + '#endif', + + '#if defined( USE_COLOR_ALPHA )', + + ' attribute vec4 color;', + + '#elif defined( USE_COLOR )', + + ' attribute vec3 color;', + + '#endif', + + '#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + generatePrecision( parameters ), + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.useFog && parameters.fog ? '#define USE_FOG' : '', + parameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.matcap ? '#define USE_MATCAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + envMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '', + envMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '', + envMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '', + parameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + + parameters.anisotropy ? '#define USE_ANISOTROPY' : '', + parameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '', + + parameters.clearcoat ? '#define USE_CLEARCOAT' : '', + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + + parameters.iridescence ? '#define USE_IRIDESCENCE' : '', + parameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '', + parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '', + + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '', + parameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '', + + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.alphaTest ? '#define USE_ALPHATEST' : '', + parameters.alphaHash ? '#define USE_ALPHAHASH' : '', + + parameters.sheen ? '#define USE_SHEEN' : '', + parameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '', + parameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '', + + parameters.transmission ? '#define USE_TRANSMISSION' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', + + parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', + parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '', + parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexUv1s ? '#define USE_UV1' : '', + parameters.vertexUv2s ? '#define USE_UV2' : '', + parameters.vertexUv3s ? '#define USE_UV3' : '', + + parameters.pointsUvs ? '#define USE_POINTS_UV' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '', + + parameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '', + + parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + parameters.opaque ? '#define OPAQUE' : '', + + ShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below + getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ), + + parameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = resolveIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = resolveIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) { + + // GLSL 3.0 conversion for built-in materials and ShaderMaterial + + versionString = '#version 300 es\n'; + + prefixVertex = [ + customVertexExtensions, + 'precision mediump sampler2DArray;', + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + 'precision mediump sampler2DArray;', + '#define varying in', + ( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;', + ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor', + '#define gl_FragDepthEXT gl_FragDepth', + '#define texture2D texture', + '#define textureCube texture', + '#define texture2DProj textureProj', + '#define texture2DLodEXT textureLod', + '#define texture2DProjLodEXT textureProjLod', + '#define textureCubeLodEXT textureLod', + '#define texture2DGradEXT textureGrad', + '#define texture2DProjGradEXT textureProjGrad', + '#define textureCubeGradEXT textureGrad' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + const vertexGlsl = versionString + prefixVertex + vertexShader; + const fragmentGlsl = versionString + prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + const glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + const glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( parameters.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, parameters.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + function onFirstUse( self ) { + + // check for link errors + if ( renderer.debug.checkShaderErrors ) { + + const programLog = gl.getProgramInfoLog( program ).trim(); + const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + let runnable = true; + let haveDiagnostics = true; + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + if ( typeof renderer.debug.onShaderError === 'function' ) { + + renderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader ); + + } else { + + // default error reporting + + const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' ); + const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' ); + + console.error( + 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' + + 'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' + + 'Program Info Log: ' + programLog + '\n' + + vertexErrors + '\n' + + fragmentErrors + ); + + } + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + self.diagnostics = { + + runnable: runnable, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + } + + // Clean up + + // Crashes in iOS9 and iOS10. #18402 + // gl.detachShader( program, glVertexShader ); + // gl.detachShader( program, glFragmentShader ); + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + cachedUniforms = new WebGLUniforms( gl, program ); + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + // set up caching for uniform locations + + let cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + // Populates cachedUniforms and cachedAttributes + onFirstUse( this ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + let cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + // Populates cachedAttributes and cachedUniforms + onFirstUse( this ); + + } + + return cachedAttributes; + + }; + + // indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported, + // flag the program as ready immediately. It may cause a stall when it's first used. + + let programReady = ( parameters.rendererExtensionParallelShaderCompile === false ); + + this.isReady = function () { + + if ( programReady === false ) { + + programReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR ); + + } + + return programReady; + + }; + + // free resource + + this.destroy = function () { + + bindingStates.releaseStatesOfProgram( this ); + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // + + this.type = parameters.shaderType; + this.name = parameters.shaderName; + this.id = programIdCount ++; + this.cacheKey = cacheKey; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + +} + +let _id$1 = 0; + +class WebGLShaderCache { + + constructor() { + + this.shaderCache = new Map(); + this.materialCache = new Map(); + + } + + update( material ) { + + const vertexShader = material.vertexShader; + const fragmentShader = material.fragmentShader; + + const vertexShaderStage = this._getShaderStage( vertexShader ); + const fragmentShaderStage = this._getShaderStage( fragmentShader ); + + const materialShaders = this._getShaderCacheForMaterial( material ); + + if ( materialShaders.has( vertexShaderStage ) === false ) { + + materialShaders.add( vertexShaderStage ); + vertexShaderStage.usedTimes ++; + + } + + if ( materialShaders.has( fragmentShaderStage ) === false ) { + + materialShaders.add( fragmentShaderStage ); + fragmentShaderStage.usedTimes ++; + + } + + return this; + + } + + remove( material ) { + + const materialShaders = this.materialCache.get( material ); + + for ( const shaderStage of materialShaders ) { + + shaderStage.usedTimes --; + + if ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code ); + + } + + this.materialCache.delete( material ); + + return this; + + } + + getVertexShaderID( material ) { + + return this._getShaderStage( material.vertexShader ).id; + + } + + getFragmentShaderID( material ) { + + return this._getShaderStage( material.fragmentShader ).id; + + } + + dispose() { + + this.shaderCache.clear(); + this.materialCache.clear(); + + } + + _getShaderCacheForMaterial( material ) { + + const cache = this.materialCache; + let set = cache.get( material ); + + if ( set === undefined ) { + + set = new Set(); + cache.set( material, set ); + + } + + return set; + + } + + _getShaderStage( code ) { + + const cache = this.shaderCache; + let stage = cache.get( code ); + + if ( stage === undefined ) { + + stage = new WebGLShaderStage( code ); + cache.set( code, stage ); + + } + + return stage; + + } + +} + +class WebGLShaderStage { + + constructor( code ) { + + this.id = _id$1 ++; + + this.code = code; + this.usedTimes = 0; + + } + +} + +function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) { + + const _programLayers = new Layers(); + const _customShaders = new WebGLShaderCache(); + const programs = []; + + const IS_WEBGL2 = capabilities.isWebGL2; + const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; + const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures; + + let precision = capabilities.precision; + + const shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'toon', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + function getChannel( value ) { + + if ( value === 0 ) return 'uv'; + + return `uv${ value }`; + + } + + function getParameters( material, lights, shadows, scene, object ) { + + const fog = scene.fog; + const geometry = object.geometry; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + + const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; + + const shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + // + + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0; + + let morphTextureStride = 0; + + if ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1; + if ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2; + if ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3; + + // + + let vertexShader, fragmentShader; + let customVertexShaderID, customFragmentShaderID; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + + vertexShader = shader.vertexShader; + fragmentShader = shader.fragmentShader; + + } else { + + vertexShader = material.vertexShader; + fragmentShader = material.fragmentShader; + + _customShaders.update( material ); + + customVertexShaderID = _customShaders.getVertexShaderID( material ); + customFragmentShaderID = _customShaders.getFragmentShaderID( material ); + + } + + const currentRenderTarget = renderer.getRenderTarget(); + + const IS_INSTANCEDMESH = object.isInstancedMesh === true; + const IS_BATCHEDMESH = object.isBatchedMesh === true; + + const HAS_MAP = !! material.map; + const HAS_MATCAP = !! material.matcap; + const HAS_ENVMAP = !! envMap; + const HAS_AOMAP = !! material.aoMap; + const HAS_LIGHTMAP = !! material.lightMap; + const HAS_BUMPMAP = !! material.bumpMap; + const HAS_NORMALMAP = !! material.normalMap; + const HAS_DISPLACEMENTMAP = !! material.displacementMap; + const HAS_EMISSIVEMAP = !! material.emissiveMap; + + const HAS_METALNESSMAP = !! material.metalnessMap; + const HAS_ROUGHNESSMAP = !! material.roughnessMap; + + const HAS_ANISOTROPY = material.anisotropy > 0; + const HAS_CLEARCOAT = material.clearcoat > 0; + const HAS_IRIDESCENCE = material.iridescence > 0; + const HAS_SHEEN = material.sheen > 0; + const HAS_TRANSMISSION = material.transmission > 0; + + const HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap; + + const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap; + const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap; + const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap; + + const HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap; + const HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap; + + const HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap; + const HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap; + + const HAS_SPECULARMAP = !! material.specularMap; + const HAS_SPECULAR_COLORMAP = !! material.specularColorMap; + const HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap; + + const HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap; + const HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap; + + const HAS_GRADIENTMAP = !! material.gradientMap; + + const HAS_ALPHAMAP = !! material.alphaMap; + + const HAS_ALPHATEST = material.alphaTest > 0; + + const HAS_ALPHAHASH = !! material.alphaHash; + + const HAS_EXTENSIONS = !! material.extensions; + + const HAS_ATTRIBUTE_UV1 = !! geometry.attributes.uv1; + const HAS_ATTRIBUTE_UV2 = !! geometry.attributes.uv2; + const HAS_ATTRIBUTE_UV3 = !! geometry.attributes.uv3; + + let toneMapping = NoToneMapping; + + if ( material.toneMapped ) { + + if ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) { + + toneMapping = renderer.toneMapping; + + } + + } + + const parameters = { + + isWebGL2: IS_WEBGL2, + + shaderID: shaderID, + shaderType: material.type, + shaderName: material.name, + + vertexShader: vertexShader, + fragmentShader: fragmentShader, + defines: material.defines, + + customVertexShaderID: customVertexShaderID, + customFragmentShaderID: customFragmentShaderID, + + isRawShaderMaterial: material.isRawShaderMaterial === true, + glslVersion: material.glslVersion, + + precision: precision, + + batching: IS_BATCHEDMESH, + instancing: IS_INSTANCEDMESH, + instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null, + + supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES, + outputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ), + + map: HAS_MAP, + matcap: HAS_MATCAP, + envMap: HAS_ENVMAP, + envMapMode: HAS_ENVMAP && envMap.mapping, + envMapCubeUVHeight: envMapCubeUVHeight, + aoMap: HAS_AOMAP, + lightMap: HAS_LIGHTMAP, + bumpMap: HAS_BUMPMAP, + normalMap: HAS_NORMALMAP, + displacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP, + emissiveMap: HAS_EMISSIVEMAP, + + normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap, + normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap, + + metalnessMap: HAS_METALNESSMAP, + roughnessMap: HAS_ROUGHNESSMAP, + + anisotropy: HAS_ANISOTROPY, + anisotropyMap: HAS_ANISOTROPYMAP, + + clearcoat: HAS_CLEARCOAT, + clearcoatMap: HAS_CLEARCOATMAP, + clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP, + clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP, + + iridescence: HAS_IRIDESCENCE, + iridescenceMap: HAS_IRIDESCENCEMAP, + iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP, + + sheen: HAS_SHEEN, + sheenColorMap: HAS_SHEEN_COLORMAP, + sheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP, + + specularMap: HAS_SPECULARMAP, + specularColorMap: HAS_SPECULAR_COLORMAP, + specularIntensityMap: HAS_SPECULAR_INTENSITYMAP, + + transmission: HAS_TRANSMISSION, + transmissionMap: HAS_TRANSMISSIONMAP, + thicknessMap: HAS_THICKNESSMAP, + + gradientMap: HAS_GRADIENTMAP, + + opaque: material.transparent === false && material.blending === NormalBlending, + + alphaMap: HAS_ALPHAMAP, + alphaTest: HAS_ALPHATEST, + alphaHash: HAS_ALPHAHASH, + + combine: material.combine, + + // + + mapUv: HAS_MAP && getChannel( material.map.channel ), + aoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ), + lightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ), + bumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ), + normalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ), + displacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ), + emissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ), + + metalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ), + roughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ), + + anisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ), + + clearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ), + clearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ), + clearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ), + + iridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ), + iridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ), + + sheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ), + sheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ), + + specularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ), + specularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ), + specularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ), + + transmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ), + thicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ), + + alphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ), + + // + + vertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ), + vertexColors: material.vertexColors, + vertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4, + vertexUv1s: HAS_ATTRIBUTE_UV1, + vertexUv2s: HAS_ATTRIBUTE_UV2, + vertexUv3s: HAS_ATTRIBUTE_UV3, + + pointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ), + + fog: !! fog, + useFog: material.fog === true, + fogExp2: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading === true, + + sizeAttenuation: material.sizeAttenuation === true, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + skinning: object.isSkinnedMesh === true, + + morphTargets: geometry.morphAttributes.position !== undefined, + morphNormals: geometry.morphAttributes.normal !== undefined, + morphColors: geometry.morphAttributes.color !== undefined, + morphTargetsCount: morphTargetsCount, + morphTextureStride: morphTextureStride, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numSpotLightMaps: lights.spotLightMap.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numDirLightShadows: lights.directionalShadowMap.length, + numPointLightShadows: lights.pointShadowMap.length, + numSpotLightShadows: lights.spotShadowMap.length, + numSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps, + + numLightProbes: lights.numLightProbes, + + numClippingPlanes: clipping.numPlanes, + numClipIntersection: clipping.numIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: toneMapping, + useLegacyLights: renderer._useLegacyLights, + + decodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ), + + premultipliedAlpha: material.premultipliedAlpha, + + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + useDepthPacking: material.depthPacking >= 0, + depthPacking: material.depthPacking || 0, + + index0AttributeName: material.index0AttributeName, + + extensionDerivatives: HAS_EXTENSIONS && material.extensions.derivatives === true, + extensionFragDepth: HAS_EXTENSIONS && material.extensions.fragDepth === true, + extensionDrawBuffers: HAS_EXTENSIONS && material.extensions.drawBuffers === true, + extensionShaderTextureLOD: HAS_EXTENSIONS && material.extensions.shaderTextureLOD === true, + extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance && extensions.has( 'WEBGL_clip_cull_distance' ), + + rendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ), + rendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ), + rendererExtensionShaderTextureLod: IS_WEBGL2 || extensions.has( 'EXT_shader_texture_lod' ), + rendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ), + + customProgramCacheKey: material.customProgramCacheKey() + + }; + + return parameters; + + } + + function getProgramCacheKey( parameters ) { + + const array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( parameters.customVertexShaderID ); + array.push( parameters.customFragmentShaderID ); + + } + + if ( parameters.defines !== undefined ) { + + for ( const name in parameters.defines ) { + + array.push( name ); + array.push( parameters.defines[ name ] ); + + } + + } + + if ( parameters.isRawShaderMaterial === false ) { + + getProgramCacheKeyParameters( array, parameters ); + getProgramCacheKeyBooleans( array, parameters ); + array.push( renderer.outputColorSpace ); + + } + + array.push( parameters.customProgramCacheKey ); + + return array.join(); + + } + + function getProgramCacheKeyParameters( array, parameters ) { + + array.push( parameters.precision ); + array.push( parameters.outputColorSpace ); + array.push( parameters.envMapMode ); + array.push( parameters.envMapCubeUVHeight ); + array.push( parameters.mapUv ); + array.push( parameters.alphaMapUv ); + array.push( parameters.lightMapUv ); + array.push( parameters.aoMapUv ); + array.push( parameters.bumpMapUv ); + array.push( parameters.normalMapUv ); + array.push( parameters.displacementMapUv ); + array.push( parameters.emissiveMapUv ); + array.push( parameters.metalnessMapUv ); + array.push( parameters.roughnessMapUv ); + array.push( parameters.anisotropyMapUv ); + array.push( parameters.clearcoatMapUv ); + array.push( parameters.clearcoatNormalMapUv ); + array.push( parameters.clearcoatRoughnessMapUv ); + array.push( parameters.iridescenceMapUv ); + array.push( parameters.iridescenceThicknessMapUv ); + array.push( parameters.sheenColorMapUv ); + array.push( parameters.sheenRoughnessMapUv ); + array.push( parameters.specularMapUv ); + array.push( parameters.specularColorMapUv ); + array.push( parameters.specularIntensityMapUv ); + array.push( parameters.transmissionMapUv ); + array.push( parameters.thicknessMapUv ); + array.push( parameters.combine ); + array.push( parameters.fogExp2 ); + array.push( parameters.sizeAttenuation ); + array.push( parameters.morphTargetsCount ); + array.push( parameters.morphAttributeCount ); + array.push( parameters.numDirLights ); + array.push( parameters.numPointLights ); + array.push( parameters.numSpotLights ); + array.push( parameters.numSpotLightMaps ); + array.push( parameters.numHemiLights ); + array.push( parameters.numRectAreaLights ); + array.push( parameters.numDirLightShadows ); + array.push( parameters.numPointLightShadows ); + array.push( parameters.numSpotLightShadows ); + array.push( parameters.numSpotLightShadowsWithMaps ); + array.push( parameters.numLightProbes ); + array.push( parameters.shadowMapType ); + array.push( parameters.toneMapping ); + array.push( parameters.numClippingPlanes ); + array.push( parameters.numClipIntersection ); + array.push( parameters.depthPacking ); + + } + + function getProgramCacheKeyBooleans( array, parameters ) { + + _programLayers.disableAll(); + + if ( parameters.isWebGL2 ) + _programLayers.enable( 0 ); + if ( parameters.supportsVertexTextures ) + _programLayers.enable( 1 ); + if ( parameters.instancing ) + _programLayers.enable( 2 ); + if ( parameters.instancingColor ) + _programLayers.enable( 3 ); + if ( parameters.matcap ) + _programLayers.enable( 4 ); + if ( parameters.envMap ) + _programLayers.enable( 5 ); + if ( parameters.normalMapObjectSpace ) + _programLayers.enable( 6 ); + if ( parameters.normalMapTangentSpace ) + _programLayers.enable( 7 ); + if ( parameters.clearcoat ) + _programLayers.enable( 8 ); + if ( parameters.iridescence ) + _programLayers.enable( 9 ); + if ( parameters.alphaTest ) + _programLayers.enable( 10 ); + if ( parameters.vertexColors ) + _programLayers.enable( 11 ); + if ( parameters.vertexAlphas ) + _programLayers.enable( 12 ); + if ( parameters.vertexUv1s ) + _programLayers.enable( 13 ); + if ( parameters.vertexUv2s ) + _programLayers.enable( 14 ); + if ( parameters.vertexUv3s ) + _programLayers.enable( 15 ); + if ( parameters.vertexTangents ) + _programLayers.enable( 16 ); + if ( parameters.anisotropy ) + _programLayers.enable( 17 ); + if ( parameters.alphaHash ) + _programLayers.enable( 18 ); + if ( parameters.batching ) + _programLayers.enable( 19 ); + + array.push( _programLayers.mask ); + _programLayers.disableAll(); + + if ( parameters.fog ) + _programLayers.enable( 0 ); + if ( parameters.useFog ) + _programLayers.enable( 1 ); + if ( parameters.flatShading ) + _programLayers.enable( 2 ); + if ( parameters.logarithmicDepthBuffer ) + _programLayers.enable( 3 ); + if ( parameters.skinning ) + _programLayers.enable( 4 ); + if ( parameters.morphTargets ) + _programLayers.enable( 5 ); + if ( parameters.morphNormals ) + _programLayers.enable( 6 ); + if ( parameters.morphColors ) + _programLayers.enable( 7 ); + if ( parameters.premultipliedAlpha ) + _programLayers.enable( 8 ); + if ( parameters.shadowMapEnabled ) + _programLayers.enable( 9 ); + if ( parameters.useLegacyLights ) + _programLayers.enable( 10 ); + if ( parameters.doubleSided ) + _programLayers.enable( 11 ); + if ( parameters.flipSided ) + _programLayers.enable( 12 ); + if ( parameters.useDepthPacking ) + _programLayers.enable( 13 ); + if ( parameters.dithering ) + _programLayers.enable( 14 ); + if ( parameters.transmission ) + _programLayers.enable( 15 ); + if ( parameters.sheen ) + _programLayers.enable( 16 ); + if ( parameters.opaque ) + _programLayers.enable( 17 ); + if ( parameters.pointsUvs ) + _programLayers.enable( 18 ); + if ( parameters.decodeVideoTexture ) + _programLayers.enable( 19 ); + + array.push( _programLayers.mask ); + + } + + function getUniforms( material ) { + + const shaderID = shaderIDs[ material.type ]; + let uniforms; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + uniforms = UniformsUtils.clone( shader.uniforms ); + + } else { + + uniforms = material.uniforms; + + } + + return uniforms; + + } + + function acquireProgram( parameters, cacheKey ) { + + let program; + + // Check if code has been already compiled + for ( let p = 0, pl = programs.length; p < pl; p ++ ) { + + const preexistingProgram = programs[ p ]; + + if ( preexistingProgram.cacheKey === cacheKey ) { + + program = preexistingProgram; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates ); + programs.push( program ); + + } + + return program; + + } + + function releaseProgram( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + const i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + } + + function releaseShaderCache( material ) { + + _customShaders.remove( material ); + + } + + function dispose() { + + _customShaders.dispose(); + + } + + return { + getParameters: getParameters, + getProgramCacheKey: getProgramCacheKey, + getUniforms: getUniforms, + acquireProgram: acquireProgram, + releaseProgram: releaseProgram, + releaseShaderCache: releaseShaderCache, + // Exposed for resource monitoring & error feedback via renderer.info: + programs: programs, + dispose: dispose + }; + +} + +function WebGLProperties() { + + let properties = new WeakMap(); + + function get( object ) { + + let map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + +} + +function painterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + +} + +function reversePainterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + +} + + +function WebGLRenderList() { + + const renderItems = []; + let renderItemsIndex = 0; + + const opaque = []; + const transmissive = []; + const transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transmissive.length = 0; + transparent.length = 0; + + } + + function getNextRenderItem( object, geometry, material, groupOrder, z, group ) { + + let renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + groupOrder: groupOrder, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.groupOrder = groupOrder; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + renderItemsIndex ++; + + return renderItem; + + } + + function push( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + if ( material.transmission > 0.0 ) { + + transmissive.push( renderItem ); + + } else if ( material.transparent === true ) { + + transparent.push( renderItem ); + + } else { + + opaque.push( renderItem ); + + } + + } + + function unshift( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + if ( material.transmission > 0.0 ) { + + transmissive.unshift( renderItem ); + + } else if ( material.transparent === true ) { + + transparent.unshift( renderItem ); + + } else { + + opaque.unshift( renderItem ); + + } + + } + + function sort( customOpaqueSort, customTransparentSort ) { + + if ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable ); + if ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable ); + if ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable ); + + } + + function finish() { + + // Clear references from inactive renderItems in the list + + for ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) { + + const renderItem = renderItems[ i ]; + + if ( renderItem.id === null ) break; + + renderItem.id = null; + renderItem.object = null; + renderItem.geometry = null; + renderItem.material = null; + renderItem.group = null; + + } + + } + + return { + + opaque: opaque, + transmissive: transmissive, + transparent: transparent, + + init: init, + push: push, + unshift: unshift, + finish: finish, + + sort: sort + }; + +} + +function WebGLRenderLists() { + + let lists = new WeakMap(); + + function get( scene, renderCallDepth ) { + + const listArray = lists.get( scene ); + let list; + + if ( listArray === undefined ) { + + list = new WebGLRenderList(); + lists.set( scene, [ list ] ); + + } else { + + if ( renderCallDepth >= listArray.length ) { + + list = new WebGLRenderList(); + listArray.push( list ); + + } else { + + list = listArray[ renderCallDepth ]; + + } + + } + + return list; + + } + + function dispose() { + + lists = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +function UniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0 + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + +function ShadowUniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + // TODO (abelnation): set RectAreaLight shadow uniforms + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + + + +let nextVersion = 0; + +function shadowCastingAndTexturingLightsFirst( lightA, lightB ) { + + return ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 ); + +} + +function WebGLLights( extensions, capabilities ) { + + const cache = new UniformsCache(); + + const shadowCache = ShadowUniformsCache(); + + const state = { + + version: 0, + + hash: { + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + + numDirectionalShadows: - 1, + numPointShadows: - 1, + numSpotShadows: - 1, + numSpotMaps: - 1, + + numLightProbes: - 1 + }, + + ambient: [ 0, 0, 0 ], + probe: [], + directional: [], + directionalShadow: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotLightMap: [], + spotShadow: [], + spotShadowMap: [], + spotLightMatrix: [], + rectArea: [], + rectAreaLTC1: null, + rectAreaLTC2: null, + point: [], + pointShadow: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + numSpotLightShadowsWithMaps: 0, + numLightProbes: 0 + + }; + + for ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() ); + + const vector3 = new Vector3(); + const matrix4 = new Matrix4(); + const matrix42 = new Matrix4(); + + function setup( lights, useLegacyLights ) { + + let r = 0, g = 0, b = 0; + + for ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 ); + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + let numDirectionalShadows = 0; + let numPointShadows = 0; + let numSpotShadows = 0; + let numSpotMaps = 0; + let numSpotShadowsWithMaps = 0; + + let numLightProbes = 0; + + // ordering : [shadow casting + map texturing, map texturing, shadow casting, none ] + lights.sort( shadowCastingAndTexturingLightsFirst ); + + // artist-friendly light intensity scaling factor + const scaleFactor = ( useLegacyLights === true ) ? Math.PI : 1; + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + const color = light.color; + const intensity = light.intensity; + const distance = light.distance; + + const shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity * scaleFactor; + g += color.g * intensity * scaleFactor; + b += color.b * intensity * scaleFactor; + + } else if ( light.isLightProbe ) { + + for ( let j = 0; j < 9; j ++ ) { + + state.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity ); + + } + + numLightProbes ++; + + } else if ( light.isDirectionalLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor ); + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.directionalShadow[ directionalLength ] = shadowUniforms; + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + + numDirectionalShadows ++; + + } + + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + + uniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor ); + uniforms.distance = distance; + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + state.spot[ spotLength ] = uniforms; + + const shadow = light.shadow; + + if ( light.map ) { + + state.spotLightMap[ numSpotMaps ] = light.map; + numSpotMaps ++; + + // make sure the lightMatrix is up to date + // TODO : do it if required only + shadow.updateMatrices( light ); + + if ( light.castShadow ) numSpotShadowsWithMaps ++; + + } + + state.spotLightMatrix[ spotLength ] = shadow.matrix; + + if ( light.castShadow ) { + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.spotShadow[ spotLength ] = shadowUniforms; + state.spotShadowMap[ spotLength ] = shadowMap; + + numSpotShadows ++; + + } + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + shadowUniforms.shadowCameraNear = shadow.camera.near; + shadowUniforms.shadowCameraFar = shadow.camera.far; + + state.pointShadow[ pointLength ] = shadowUniforms; + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + + numPointShadows ++; + + } + + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = cache.get( light ); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + if ( rectAreaLength > 0 ) { + + if ( capabilities.isWebGL2 ) { + + // WebGL 2 + + if ( extensions.has( 'OES_texture_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else { + + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; + + } + + } else { + + // WebGL 1 + + if ( extensions.has( 'OES_texture_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; + + } else { + + console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' ); + + } + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + const hash = state.hash; + + if ( hash.directionalLength !== directionalLength || + hash.pointLength !== pointLength || + hash.spotLength !== spotLength || + hash.rectAreaLength !== rectAreaLength || + hash.hemiLength !== hemiLength || + hash.numDirectionalShadows !== numDirectionalShadows || + hash.numPointShadows !== numPointShadows || + hash.numSpotShadows !== numSpotShadows || + hash.numSpotMaps !== numSpotMaps || + hash.numLightProbes !== numLightProbes ) { + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.directionalShadow.length = numDirectionalShadows; + state.directionalShadowMap.length = numDirectionalShadows; + state.pointShadow.length = numPointShadows; + state.pointShadowMap.length = numPointShadows; + state.spotShadow.length = numSpotShadows; + state.spotShadowMap.length = numSpotShadows; + state.directionalShadowMatrix.length = numDirectionalShadows; + state.pointShadowMatrix.length = numPointShadows; + state.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps; + state.spotLightMap.length = numSpotMaps; + state.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps; + state.numLightProbes = numLightProbes; + + hash.directionalLength = directionalLength; + hash.pointLength = pointLength; + hash.spotLength = spotLength; + hash.rectAreaLength = rectAreaLength; + hash.hemiLength = hemiLength; + + hash.numDirectionalShadows = numDirectionalShadows; + hash.numPointShadows = numPointShadows; + hash.numSpotShadows = numSpotShadows; + hash.numSpotMaps = numSpotMaps; + + hash.numLightProbes = numLightProbes; + + state.version = nextVersion ++; + + } + + } + + function setupView( lights, camera ) { + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + const viewMatrix = camera.matrixWorldInverse; + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + if ( light.isDirectionalLight ) { + + const uniforms = state.directional[ directionalLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = state.spot[ spotLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = state.rectArea[ rectAreaLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = state.point[ pointLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = state.hemi[ hemiLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + + hemiLength ++; + + } + + } + + } + + return { + setup: setup, + setupView: setupView, + state: state + }; + +} + +function WebGLRenderState( extensions, capabilities ) { + + const lights = new WebGLLights( extensions, capabilities ); + + const lightsArray = []; + const shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights( useLegacyLights ) { + + lights.setup( lightsArray, useLegacyLights ); + + } + + function setupLightsView( camera ) { + + lights.setupView( lightsArray, camera ); + + } + + const state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + setupLightsView: setupLightsView, + + pushLight: pushLight, + pushShadow: pushShadow + }; + +} + +function WebGLRenderStates( extensions, capabilities ) { + + let renderStates = new WeakMap(); + + function get( scene, renderCallDepth = 0 ) { + + const renderStateArray = renderStates.get( scene ); + let renderState; + + if ( renderStateArray === undefined ) { + + renderState = new WebGLRenderState( extensions, capabilities ); + renderStates.set( scene, [ renderState ] ); + + } else { + + if ( renderCallDepth >= renderStateArray.length ) { + + renderState = new WebGLRenderState( extensions, capabilities ); + renderStateArray.push( renderState ); + + } else { + + renderState = renderStateArray[ renderCallDepth ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +class MeshDepthMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshDepthMaterial = true; + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.depthPacking = source.depthPacking; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + } + +} + +class MeshDistanceMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshDistanceMaterial = true; + + this.type = 'MeshDistanceMaterial'; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + } + +} + +const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; + +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"; + +function WebGLShadowMap( _renderer, _objects, _capabilities ) { + + let _frustum = new Frustum(); + + const _shadowMapSize = new Vector2(), + _viewportSize = new Vector2(), + + _viewport = new Vector4(), + + _depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ), + _distanceMaterial = new MeshDistanceMaterial(), + + _materialCache = {}, + + _maxTextureSize = _capabilities.maxTextureSize; + + const shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide }; + + const shadowMaterialVertical = new ShaderMaterial( { + defines: { + VSM_SAMPLES: 8 + }, + uniforms: { + shadow_pass: { value: null }, + resolution: { value: new Vector2() }, + radius: { value: 4.0 } + }, + + vertexShader: vertex, + fragmentShader: fragment + + } ); + + const shadowMaterialHorizontal = shadowMaterialVertical.clone(); + shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; + + const fullScreenTri = new BufferGeometry(); + fullScreenTri.setAttribute( + 'position', + new BufferAttribute( + new Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ), + 3 + ) + ); + + const fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical ); + + const scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + let _previousType = this.type; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + const currentRenderTarget = _renderer.getRenderTarget(); + const activeCubeFace = _renderer.getActiveCubeFace(); + const activeMipmapLevel = _renderer.getActiveMipmapLevel(); + + const _state = _renderer.state; + + // Set GL state for depth map. + _state.setBlending( NoBlending ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // check for shadow map type changes + + const toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap ); + const fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap ); + + // render depth map + + for ( let i = 0, il = lights.length; i < il; i ++ ) { + + const light = lights[ i ]; + const shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + if ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue; + + _shadowMapSize.copy( shadow.mapSize ); + + const shadowFrameExtents = shadow.getFrameExtents(); + + _shadowMapSize.multiply( shadowFrameExtents ); + + _viewportSize.copy( shadow.mapSize ); + + if ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) { + + if ( _shadowMapSize.x > _maxTextureSize ) { + + _viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x ); + _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; + shadow.mapSize.x = _viewportSize.x; + + } + + if ( _shadowMapSize.y > _maxTextureSize ) { + + _viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y ); + _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; + shadow.mapSize.y = _viewportSize.y; + + } + + } + + if ( shadow.map === null || toVSM === true || fromVSM === true ) { + + const pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {}; + + if ( shadow.map !== null ) { + + shadow.map.dispose(); + + } + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + '.shadowMap'; + + shadow.camera.updateProjectionMatrix(); + + } + + _renderer.setRenderTarget( shadow.map ); + _renderer.clear(); + + const viewportCount = shadow.getViewportCount(); + + for ( let vp = 0; vp < viewportCount; vp ++ ) { + + const viewport = shadow.getViewport( vp ); + + _viewport.set( + _viewportSize.x * viewport.x, + _viewportSize.y * viewport.y, + _viewportSize.x * viewport.z, + _viewportSize.y * viewport.w + ); + + _state.viewport( _viewport ); + + shadow.updateMatrices( light, vp ); + + _frustum = shadow.getFrustum(); + + renderObject( scene, camera, shadow.camera, light, this.type ); + + } + + // do blur pass for VSM + + if ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) { + + VSMPass( shadow, camera ); + + } + + shadow.needsUpdate = false; + + } + + _previousType = this.type; + + scope.needsUpdate = false; + + _renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel ); + + }; + + function VSMPass( shadow, camera ) { + + const geometry = _objects.update( fullScreenMesh ); + + if ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) { + + shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples; + + shadowMaterialVertical.needsUpdate = true; + shadowMaterialHorizontal.needsUpdate = true; + + } + + if ( shadow.mapPass === null ) { + + shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y ); + + } + + // vertical pass + + shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture; + shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; + shadowMaterialVertical.uniforms.radius.value = shadow.radius; + _renderer.setRenderTarget( shadow.mapPass ); + _renderer.clear(); + _renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null ); + + // horizontal pass + + shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; + shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; + shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; + _renderer.setRenderTarget( shadow.map ); + _renderer.clear(); + _renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null ); + + } + + function getDepthMaterial( object, material, light, type ) { + + let result = null; + + const customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial; + + if ( customMaterial !== undefined ) { + + result = customMaterial; + + } else { + + result = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial; + + if ( ( _renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) || + ( material.displacementMap && material.displacementScale !== 0 ) || + ( material.alphaMap && material.alphaTest > 0 ) || + ( material.map && material.alphaTest > 0 ) ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + const keyA = result.uuid, keyB = material.uuid; + + let materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + let cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + material.addEventListener( 'dispose', onMaterialDispose ); + + } + + result = cachedMaterial; + + } + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + if ( type === VSMShadowMap ) { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ]; + + } + + result.alphaMap = material.alphaMap; + result.alphaTest = material.alphaTest; + result.map = material.map; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.displacementMap = material.displacementMap; + result.displacementScale = material.displacementScale; + result.displacementBias = material.displacementBias; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) { + + const materialProperties = _renderer.properties.get( result ); + materialProperties.light = light; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, light, type ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + const geometry = _objects.update( object ); + const material = object.material; + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let k = 0, kl = groups.length; k < kl; k ++ ) { + + const group = groups[ k ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + const depthMaterial = getDepthMaterial( object, groupMaterial, light, type ); + + object.onBeforeShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, group ); + + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + object.onAfterShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, group ); + + } + + } + + } else if ( material.visible ) { + + const depthMaterial = getDepthMaterial( object, material, light, type ); + + object.onBeforeShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, null ); + + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + object.onAfterShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, null ); + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, light, type ); + + } + + } + + function onMaterialDispose( event ) { + + const material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + // make sure to remove the unique distance/depth materials used for shadow map rendering + + for ( const id in _materialCache ) { + + const cache = _materialCache[ id ]; + + const uuid = event.target.uuid; + + if ( uuid in cache ) { + + const shadowMaterial = cache[ uuid ]; + shadowMaterial.dispose(); + delete cache[ uuid ]; + + } + + } + + } + +} + +function WebGLState( gl, extensions, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + function ColorBuffer() { + + let locked = false; + + const color = new Vector4(); + let currentColorMask = null; + const currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + let locked = false; + + let currentDepthMask = null; + let currentDepthFunc = null; + let currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + let locked = false; + + let currentStencilMask = null; + let currentStencilFunc = null; + let currentStencilRef = null; + let currentStencilFuncMask = null; + let currentStencilFail = null; + let currentStencilZFail = null; + let currentStencilZPass = null; + let currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( ! locked ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + const colorBuffer = new ColorBuffer(); + const depthBuffer = new DepthBuffer(); + const stencilBuffer = new StencilBuffer(); + + const uboBindings = new WeakMap(); + const uboProgramMap = new WeakMap(); + + let enabledCapabilities = {}; + + let currentBoundFramebuffers = {}; + let currentDrawbuffers = new WeakMap(); + let defaultDrawbuffers = []; + + let currentProgram = null; + + let currentBlendingEnabled = false; + let currentBlending = null; + let currentBlendEquation = null; + let currentBlendSrc = null; + let currentBlendDst = null; + let currentBlendEquationAlpha = null; + let currentBlendSrcAlpha = null; + let currentBlendDstAlpha = null; + let currentBlendColor = new Color( 0, 0, 0 ); + let currentBlendAlpha = 0; + let currentPremultipledAlpha = false; + + let currentFlipSided = null; + let currentCullFace = null; + + let currentLineWidth = null; + + let currentPolygonOffsetFactor = null; + let currentPolygonOffsetUnits = null; + + const maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + let lineWidthAvailable = false; + let version = 0; + const glVersion = gl.getParameter( gl.VERSION ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL ES (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + let currentTextureSlot = null; + let currentBoundTextures = {}; + + const scissorParam = gl.getParameter( gl.SCISSOR_BOX ); + const viewportParam = gl.getParameter( gl.VIEWPORT ); + + const currentScissor = new Vector4().fromArray( scissorParam ); + const currentViewport = new Vector4().fromArray( viewportParam ); + + function createTexture( type, target, count, dimensions ) { + + const data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + const texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( let i = 0; i < count; i ++ ) { + + if ( isWebGL2 && ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) ) { + + gl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } else { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + } + + return texture; + + } + + const emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + if ( isWebGL2 ) { + + emptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 ); + emptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 ); + + } + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + setBlending( NoBlending ); + + // + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function bindFramebuffer( target, framebuffer ) { + + if ( currentBoundFramebuffers[ target ] !== framebuffer ) { + + gl.bindFramebuffer( target, framebuffer ); + + currentBoundFramebuffers[ target ] = framebuffer; + + if ( isWebGL2 ) { + + // gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER + + if ( target === gl.DRAW_FRAMEBUFFER ) { + + currentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer; + + } + + if ( target === gl.FRAMEBUFFER ) { + + currentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer; + + } + + } + + return true; + + } + + return false; + + } + + function drawBuffers( renderTarget, framebuffer ) { + + let drawBuffers = defaultDrawbuffers; + + let needsUpdate = false; + + if ( renderTarget ) { + + drawBuffers = currentDrawbuffers.get( framebuffer ); + + if ( drawBuffers === undefined ) { + + drawBuffers = []; + currentDrawbuffers.set( framebuffer, drawBuffers ); + + } + + if ( renderTarget.isWebGLMultipleRenderTargets ) { + + const textures = renderTarget.texture; + + if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) { + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + drawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i; + + } + + drawBuffers.length = textures.length; + + needsUpdate = true; + + } + + } else { + + if ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) { + + drawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0; + + needsUpdate = true; + + } + + } + + } else { + + if ( drawBuffers[ 0 ] !== gl.BACK ) { + + drawBuffers[ 0 ] = gl.BACK; + + needsUpdate = true; + + } + + } + + if ( needsUpdate ) { + + if ( capabilities.isWebGL2 ) { + + gl.drawBuffers( drawBuffers ); + + } else { + + extensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers ); + + } + + } + + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + const equationToGL = { + [ AddEquation ]: gl.FUNC_ADD, + [ SubtractEquation ]: gl.FUNC_SUBTRACT, + [ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT + }; + + if ( isWebGL2 ) { + + equationToGL[ MinEquation ] = gl.MIN; + equationToGL[ MaxEquation ] = gl.MAX; + + } else { + + const extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + equationToGL[ MinEquation ] = extension.MIN_EXT; + equationToGL[ MaxEquation ] = extension.MAX_EXT; + + } + + } + + const factorToGL = { + [ ZeroFactor ]: gl.ZERO, + [ OneFactor ]: gl.ONE, + [ SrcColorFactor ]: gl.SRC_COLOR, + [ SrcAlphaFactor ]: gl.SRC_ALPHA, + [ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE, + [ DstColorFactor ]: gl.DST_COLOR, + [ DstAlphaFactor ]: gl.DST_ALPHA, + [ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR, + [ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA, + [ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR, + [ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA, + [ ConstantColorFactor ]: gl.CONSTANT_COLOR, + [ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR, + [ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA, + [ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA + }; + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled === true ) { + + disable( gl.BLEND ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( currentBlendingEnabled === false ) { + + enable( gl.BLEND ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( gl.FUNC_ADD ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.ONE, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE ); + break; + + case MultiplyBlending: + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor.set( 0, 0, 0 ); + currentBlendAlpha = 0; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + if ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) { + + gl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha ); + + currentBlendColor.copy( blendColor ); + currentBlendAlpha = blendAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = false; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + let flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + const stencilWrite = material.stencilWrite; + stencilBuffer.setTest( stencilWrite ); + if ( stencilWrite ) { + + stencilBuffer.setMask( material.stencilWriteMask ); + stencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask ); + stencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass ); + + } + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + material.alphaToCoverage === true + ? enable( gl.SAMPLE_ALPHA_TO_COVERAGE ) + : disable( gl.SAMPLE_ALPHA_TO_COVERAGE ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture, webglSlot ) { + + if ( webglSlot === undefined ) { + + if ( currentTextureSlot === null ) { + + webglSlot = gl.TEXTURE0 + maxTextures - 1; + + } else { + + webglSlot = currentTextureSlot; + + } + + } + + let boundTexture = currentBoundTextures[ webglSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ webglSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function unbindTexture() { + + const boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture !== undefined && boundTexture.type !== undefined ) { + + gl.bindTexture( boundTexture.type, null ); + + boundTexture.type = undefined; + boundTexture.texture = undefined; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function compressedTexImage3D() { + + try { + + gl.compressedTexImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texSubImage2D() { + + try { + + gl.texSubImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texSubImage3D() { + + try { + + gl.texSubImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function compressedTexSubImage2D() { + + try { + + gl.compressedTexSubImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function compressedTexSubImage3D() { + + try { + + gl.compressedTexSubImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texStorage2D() { + + try { + + gl.texStorage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texStorage3D() { + + try { + + gl.texStorage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + function updateUBOMapping( uniformsGroup, program ) { + + let mapping = uboProgramMap.get( program ); + + if ( mapping === undefined ) { + + mapping = new WeakMap(); + + uboProgramMap.set( program, mapping ); + + } + + let blockIndex = mapping.get( uniformsGroup ); + + if ( blockIndex === undefined ) { + + blockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name ); + + mapping.set( uniformsGroup, blockIndex ); + + } + + } + + function uniformBlockBinding( uniformsGroup, program ) { + + const mapping = uboProgramMap.get( program ); + const blockIndex = mapping.get( uniformsGroup ); + + if ( uboBindings.get( program ) !== blockIndex ) { + + // bind shader specific block index to global block point + gl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex ); + + uboBindings.set( program, blockIndex ); + + } + + } + + // + + function reset() { + + // reset state + + gl.disable( gl.BLEND ); + gl.disable( gl.CULL_FACE ); + gl.disable( gl.DEPTH_TEST ); + gl.disable( gl.POLYGON_OFFSET_FILL ); + gl.disable( gl.SCISSOR_TEST ); + gl.disable( gl.STENCIL_TEST ); + gl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE ); + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ONE, gl.ZERO ); + gl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO ); + gl.blendColor( 0, 0, 0, 0 ); + + gl.colorMask( true, true, true, true ); + gl.clearColor( 0, 0, 0, 0 ); + + gl.depthMask( true ); + gl.depthFunc( gl.LESS ); + gl.clearDepth( 1 ); + + gl.stencilMask( 0xffffffff ); + gl.stencilFunc( gl.ALWAYS, 0, 0xffffffff ); + gl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP ); + gl.clearStencil( 0 ); + + gl.cullFace( gl.BACK ); + gl.frontFace( gl.CCW ); + + gl.polygonOffset( 0, 0 ); + + gl.activeTexture( gl.TEXTURE0 ); + + gl.bindFramebuffer( gl.FRAMEBUFFER, null ); + + if ( isWebGL2 === true ) { + + gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null ); + gl.bindFramebuffer( gl.READ_FRAMEBUFFER, null ); + + } + + gl.useProgram( null ); + + gl.lineWidth( 1 ); + + gl.scissor( 0, 0, gl.canvas.width, gl.canvas.height ); + gl.viewport( 0, 0, gl.canvas.width, gl.canvas.height ); + + // reset internals + + enabledCapabilities = {}; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBoundFramebuffers = {}; + currentDrawbuffers = new WeakMap(); + defaultDrawbuffers = []; + + currentProgram = null; + + currentBlendingEnabled = false; + currentBlending = null; + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor = new Color( 0, 0, 0 ); + currentBlendAlpha = 0; + currentPremultipledAlpha = false; + + currentFlipSided = null; + currentCullFace = null; + + currentLineWidth = null; + + currentPolygonOffsetFactor = null; + currentPolygonOffsetUnits = null; + + currentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height ); + currentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height ); + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + enable: enable, + disable: disable, + + bindFramebuffer: bindFramebuffer, + drawBuffers: drawBuffers, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + unbindTexture: unbindTexture, + compressedTexImage2D: compressedTexImage2D, + compressedTexImage3D: compressedTexImage3D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + updateUBOMapping: updateUBOMapping, + uniformBlockBinding: uniformBlockBinding, + + texStorage2D: texStorage2D, + texStorage3D: texStorage3D, + texSubImage2D: texSubImage2D, + texSubImage3D: texSubImage3D, + compressedTexSubImage2D: compressedTexSubImage2D, + compressedTexSubImage3D: compressedTexSubImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + +} + +function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + const isWebGL2 = capabilities.isWebGL2; + const multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null; + const supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent ); + + const _videoTextures = new WeakMap(); + let _canvas; + + const _sources = new WeakMap(); // maps WebglTexture objects to instances of Source + + // cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas, + // also OffscreenCanvas.getContext("webgl"), but not OffscreenCanvas.getContext("2d")! + // Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d). + + let useOffscreenCanvas = false; + + try { + + useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' + // eslint-disable-next-line compat/compat + && ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null; + + } catch ( err ) { + + // Ignore any errors + + } + + function createCanvas( width, height ) { + + // Use OffscreenCanvas when available. Specially needed in web workers + + return useOffscreenCanvas ? + // eslint-disable-next-line compat/compat + new OffscreenCanvas( width, height ) : createElementNS( 'canvas' ); + + } + + function resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) { + + let scale = 1; + + // handle case if texture exceeds max size + + if ( image.width > maxSize || image.height > maxSize ) { + + scale = maxSize / Math.max( image.width, image.height ); + + } + + // only perform resize if necessary + + if ( scale < 1 || needsPowerOfTwo === true ) { + + // only perform resize for certain image types + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor; + + const width = floor( scale * image.width ); + const height = floor( scale * image.height ); + + if ( _canvas === undefined ) _canvas = createCanvas( width, height ); + + // cube textures can't reuse the same canvas + + const canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas; + + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, width, height ); + + console.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' ); + + return canvas; + + } else { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + + } + + return image; + + } + + } + + return image; + + } + + function isPowerOfTwo$1( image ) { + + return isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ); + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, supportsMips ) { + + return texture.generateMipmaps && supportsMips && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target ) { + + _gl.generateMipmap( target ); + + } + + function getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) { + + if ( isWebGL2 === false ) return glFormat; + + if ( internalFormatName !== null ) { + + if ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ]; + + console.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \'' + internalFormatName + '\'' ); + + } + + let internalFormat = glFormat; + + if ( glFormat === _gl.RED ) { + + if ( glType === _gl.FLOAT ) internalFormat = _gl.R32F; + if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F; + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8; + + } + + if ( glFormat === _gl.RED_INTEGER ) { + + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI; + if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI; + if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI; + if ( glType === _gl.BYTE ) internalFormat = _gl.R8I; + if ( glType === _gl.SHORT ) internalFormat = _gl.R16I; + if ( glType === _gl.INT ) internalFormat = _gl.R32I; + + } + + if ( glFormat === _gl.RG ) { + + if ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F; + if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F; + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8; + + } + + if ( glFormat === _gl.RGBA ) { + + const transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace ); + + if ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F; + if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F; + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8; + if ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4; + if ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1; + + } + + if ( internalFormat === _gl.R16F || internalFormat === _gl.R32F || + internalFormat === _gl.RG16F || internalFormat === _gl.RG32F || + internalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) { + + extensions.get( 'EXT_color_buffer_float' ); + + } + + return internalFormat; + + } + + function getMipLevels( texture, image, supportsMips ) { + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) { + + return Math.log2( Math.max( image.width, image.height ) ) + 1; + + } else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) { + + // user-defined mipmaps + + return texture.mipmaps.length; + + } else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) { + + return image.mipmaps.length; + + } else { + + // texture without mipmaps (only base level) + + return 1; + + } + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + _videoTextures.delete( texture ); + + } + + } + + function onRenderTargetDispose( event ) { + + const renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + } + + // + + function deallocateTexture( texture ) { + + const textureProperties = properties.get( texture ); + + if ( textureProperties.__webglInit === undefined ) return; + + // check if it's necessary to remove the WebGLTexture object + + const source = texture.source; + const webglTextures = _sources.get( source ); + + if ( webglTextures ) { + + const webglTexture = webglTextures[ textureProperties.__cacheKey ]; + webglTexture.usedTimes --; + + // the WebGLTexture object is not used anymore, remove it + + if ( webglTexture.usedTimes === 0 ) { + + deleteTexture( texture ); + + } + + // remove the weak map entry if no WebGLTexture uses the source anymore + + if ( Object.keys( webglTextures ).length === 0 ) { + + _sources.delete( source ); + + } + + } + + properties.remove( texture ); + + } + + function deleteTexture( texture ) { + + const textureProperties = properties.get( texture ); + _gl.deleteTexture( textureProperties.__webglTexture ); + + const source = texture.source; + const webglTextures = _sources.get( source ); + delete webglTextures[ textureProperties.__cacheKey ]; + + info.memory.textures --; + + } + + function deallocateRenderTarget( renderTarget ) { + + const texture = renderTarget.texture; + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( texture ); + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + info.memory.textures --; + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + for ( let i = 0; i < 6; i ++ ) { + + if ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) { + + for ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] ); + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + + } + + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + if ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) { + + for ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] ); + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + + } + + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer ); + + if ( renderTargetProperties.__webglColorRenderbuffer ) { + + for ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) { + + if ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + } + + } + + if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer ); + + } + + if ( renderTarget.isWebGLMultipleRenderTargets ) { + + for ( let i = 0, il = texture.length; i < il; i ++ ) { + + const attachmentProperties = properties.get( texture[ i ] ); + + if ( attachmentProperties.__webglTexture ) { + + _gl.deleteTexture( attachmentProperties.__webglTexture ); + + info.memory.textures --; + + } + + properties.remove( texture[ i ] ); + + } + + } + + properties.remove( texture ); + properties.remove( renderTarget ); + + } + + // + + let textureUnits = 0; + + function resetTextureUnits() { + + textureUnits = 0; + + } + + function allocateTextureUnit() { + + const textureUnit = textureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + textureUnits += 1; + + return textureUnit; + + } + + function getTextureCacheKey( texture ) { + + const array = []; + + array.push( texture.wrapS ); + array.push( texture.wrapT ); + array.push( texture.wrapR || 0 ); + array.push( texture.magFilter ); + array.push( texture.minFilter ); + array.push( texture.anisotropy ); + array.push( texture.internalFormat ); + array.push( texture.format ); + array.push( texture.type ); + array.push( texture.generateMipmaps ); + array.push( texture.premultiplyAlpha ); + array.push( texture.flipY ); + array.push( texture.unpackAlignment ); + array.push( texture.colorSpace ); + + return array.join(); + + } + + // + + function setTexture2D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) { + + const image = texture.image; + + if ( image === null ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + function setTexture2DArray( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + function setTexture3D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + function setTextureCube( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadCubeTexture( textureProperties, texture, slot ); + return; + + } + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + const wrappingToGL = { + [ RepeatWrapping ]: _gl.REPEAT, + [ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE, + [ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT + }; + + const filterToGL = { + [ NearestFilter ]: _gl.NEAREST, + [ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST, + [ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR, + + [ LinearFilter ]: _gl.LINEAR, + [ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST, + [ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR + }; + + const compareToGL = { + [ NeverCompare ]: _gl.NEVER, + [ AlwaysCompare ]: _gl.ALWAYS, + [ LessCompare ]: _gl.LESS, + [ LessEqualCompare ]: _gl.LEQUAL, + [ EqualCompare ]: _gl.EQUAL, + [ GreaterEqualCompare ]: _gl.GEQUAL, + [ GreaterCompare ]: _gl.GREATER, + [ NotEqualCompare ]: _gl.NOTEQUAL + }; + + function setTextureParameters( textureType, texture, supportsMips ) { + + if ( supportsMips ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] ); + + if ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, _gl.CLAMP_TO_EDGE ); + + } + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + if ( texture.compareFunction ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE ); + _gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] ); + + } + + if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) { + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( texture.magFilter === NearestFilter ) return; + if ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return; + if ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2 + if ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function initTexture( textureProperties, texture ) { + + let forceUpload = false; + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + } + + // create Source <-> WebGLTextures mapping if necessary + + const source = texture.source; + let webglTextures = _sources.get( source ); + + if ( webglTextures === undefined ) { + + webglTextures = {}; + _sources.set( source, webglTextures ); + + } + + // check if there is already a WebGLTexture object for the given texture parameters + + const textureCacheKey = getTextureCacheKey( texture ); + + if ( textureCacheKey !== textureProperties.__cacheKey ) { + + // if not, create a new instance of WebGLTexture + + if ( webglTextures[ textureCacheKey ] === undefined ) { + + // create new entry + + webglTextures[ textureCacheKey ] = { + texture: _gl.createTexture(), + usedTimes: 0 + }; + + info.memory.textures ++; + + // when a new instance of WebGLTexture was created, a texture upload is required + // even if the image contents are identical + + forceUpload = true; + + } + + webglTextures[ textureCacheKey ].usedTimes ++; + + // every time the texture cache key changes, it's necessary to check if an instance of + // WebGLTexture can be deleted in order to avoid a memory leak. + + const webglTexture = webglTextures[ textureProperties.__cacheKey ]; + + if ( webglTexture !== undefined ) { + + webglTextures[ textureProperties.__cacheKey ].usedTimes --; + + if ( webglTexture.usedTimes === 0 ) { + + deleteTexture( texture ); + + } + + } + + // store references to cache key and WebGLTexture object + + textureProperties.__cacheKey = textureCacheKey; + textureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture; + + } + + return forceUpload; + + } + + function uploadTexture( textureProperties, texture, slot ) { + + let textureType = _gl.TEXTURE_2D; + + if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY; + if ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D; + + const forceUpload = initTexture( textureProperties, texture ); + const source = texture.source; + + state.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + const sourceProperties = properties.get( source ); + + if ( source.version !== sourceProperties.__version || forceUpload === true ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + + const workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace ); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace ); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion ); + + const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false; + let image = resizeImage( texture.image, needsPowerOfTwo, false, capabilities.maxTextureSize ); + image = verifyColorSpace( texture, image ); + + const supportsMips = isPowerOfTwo$1( image ) || isWebGL2, + glFormat = utils.convert( texture.format, texture.colorSpace ); + + let glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture ); + + setTextureParameters( textureType, texture, supportsMips ); + + let mipmap; + const mipmaps = texture.mipmaps; + + const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true && glInternalFormat !== RGB_ETC1_Format ); + const allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true ); + const levels = getMipLevels( texture, image, supportsMips ); + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = _gl.DEPTH_COMPONENT; + + if ( isWebGL2 ) { + + if ( texture.type === FloatType ) { + + glInternalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( texture.type === UnsignedIntType ) { + + glInternalFormat = _gl.DEPTH_COMPONENT24; + + } else if ( texture.type === UnsignedInt248Type ) { + + glInternalFormat = _gl.DEPTH24_STENCIL8; + + } else { + + glInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D + + } + + } else { + + if ( texture.type === FloatType ) { + + console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' ); + + } + + } + + // validation checks for WebGL 1 + + if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedIntType; + glType = utils.convert( texture.type ); + + } + + } + + if ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) { + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + glInternalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + // + + if ( allocateMemory ) { + + if ( useTexStorage ) { + + state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } + + } + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && supportsMips ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + texture.generateMipmaps = false; + + } else { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height ); + + } + + state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } + + } else if ( texture.isCompressedTexture ) { + + if ( texture.isCompressedArrayTexture ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat ) { + + if ( glFormat !== null ) { + + if ( useTexStorage ) { + + state.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 ); + + } else { + + state.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 ); + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + if ( useTexStorage ) { + + state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data ); + + } else { + + state.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } else { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat ) { + + if ( glFormat !== null ) { + + if ( useTexStorage ) { + + state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data ); + + } else { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + } else if ( texture.isDataArrayTexture ) { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth ); + + } + + state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data ); + + } else { + + state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isData3DTexture ) { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth ); + + } + + state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data ); + + } else { + + state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isFramebufferTexture ) { + + if ( allocateMemory ) { + + if ( useTexStorage ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height ); + + } else { + + let width = image.width, height = image.height; + + for ( let i = 0; i < levels; i ++ ) { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null ); + + width >>= 1; + height >>= 1; + + } + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && supportsMips ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + } + + texture.generateMipmaps = false; + + } else { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height ); + + } + + state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image ); + + } + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( textureType ); + + } + + sourceProperties.__version = source.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + textureProperties.__version = texture.version; + + } + + function uploadCubeTexture( textureProperties, texture, slot ) { + + if ( texture.image.length !== 6 ) return; + + const forceUpload = initTexture( textureProperties, texture ); + const source = texture.source; + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + const sourceProperties = properties.get( source ); + + if ( source.version !== sourceProperties.__version || forceUpload === true ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + + const workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace ); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace ); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion ); + + const isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ); + const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + const cubeImage = []; + + for ( let i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + cubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] ); + + } + + const image = cubeImage[ 0 ], + supportsMips = isPowerOfTwo$1( image ) || isWebGL2, + glFormat = utils.convert( texture.format, texture.colorSpace ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace ); + + const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true ); + const allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true ); + let levels = getMipLevels( texture, image, supportsMips ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips ); + + let mipmaps; + + if ( isCompressed ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height ); + + } + + for ( let i = 0; i < 6; i ++ ) { + + mipmaps = cubeImage[ i ].mipmaps; + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat ) { + + if ( glFormat !== null ) { + + if ( useTexStorage ) { + + state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data ); + + } else { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + } else { + + mipmaps = texture.mipmaps; + + if ( useTexStorage && allocateMemory ) { + + // TODO: Uniformly handle mipmap definitions + // Normal textures and compressed cube textures define base level + mips with their mipmap array + // Uncompressed cube textures use their mipmap array only for mips (no base level) + + if ( mipmaps.length > 0 ) levels ++; + + state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height ); + + } + + for ( let i = 0; i < 6; i ++ ) { + + if ( isDataTexture ) { + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + const mipmapImage = mipmap.image[ i ].image; + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data ); + + } + + } + + } else { + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + } + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + if ( useTexStorage ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] ); + + } + + } + + } + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + // We assume images for cube map have the same size. + generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + sourceProperties.__version = source.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + textureProperties.__version = texture.version; + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) { + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace ); + const renderTargetProperties = properties.get( renderTarget ); + + if ( ! renderTargetProperties.__hasExternalTextures ) { + + const width = Math.max( 1, renderTarget.width >> level ); + const height = Math.max( 1, renderTarget.height >> level ); + + if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) { + + state.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null ); + + } else { + + state.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null ); + + } + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) ); + + } else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753 + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level ); + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + let glInternalFormat = ( isWebGL2 === true ) ? _gl.DEPTH_COMPONENT24 : _gl.DEPTH_COMPONENT16; + + if ( isMultisample || useMultisampledRTT( renderTarget ) ) { + + const depthTexture = renderTarget.depthTexture; + + if ( depthTexture && depthTexture.isDepthTexture ) { + + if ( depthTexture.type === FloatType ) { + + glInternalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( depthTexture.type === UnsignedIntType ) { + + glInternalFormat = _gl.DEPTH_COMPONENT24; + + } + + } + + const samples = getRenderTargetSamples( renderTarget ); + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + const samples = getRenderTargetSamples( renderTarget ); + + if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) { + + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height ); + + } else if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + + } + + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ]; + + for ( let i = 0; i < textures.length; i ++ ) { + + const texture = textures[ i ]; + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace ); + const samples = getRenderTargetSamples( renderTarget ); + + if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) { + + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + } + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + const isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + const samples = getRenderTargetSamples( renderTarget ); + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples ); + + } else { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples ); + + } else { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + + if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false ); + + } + + } else { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false ); + + } + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // rebind framebuffer with external textures + function rebindTextures( renderTarget, colorTexture, depthTexture ) { + + const renderTargetProperties = properties.get( renderTarget ); + + if ( colorTexture !== undefined ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 ); + + } + + if ( depthTexture !== undefined ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + const texture = renderTarget.texture; + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + if ( renderTarget.isWebGLMultipleRenderTargets !== true ) { + + if ( textureProperties.__webglTexture === undefined ) { + + textureProperties.__webglTexture = _gl.createTexture(); + + } + + textureProperties.__version = texture.version; + info.memory.textures ++; + + } + + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true ); + const supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2; + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) { + + renderTargetProperties.__webglFramebuffer[ i ] = []; + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } + + } else { + + if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + renderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + if ( isMultipleRenderTargets ) { + + if ( capabilities.drawBuffers ) { + + const textures = renderTarget.texture; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachmentProperties = properties.get( textures[ i ] ); + + if ( attachmentProperties.__webglTexture === undefined ) { + + attachmentProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' ); + + } + + } + + if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) { + + const textures = isMultipleRenderTargets ? texture : [ texture ]; + + renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); + renderTargetProperties.__webglColorRenderbuffer = []; + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + + for ( let i = 0; i < textures.length; i ++ ) { + + const texture = textures[ i ]; + renderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer(); + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true ); + const samples = getRenderTargetSamples( renderTarget ); + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + if ( renderTarget.depthBuffer ) { + + renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true ); + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips ); + + for ( let i = 0; i < 6; i ++ ) { + + if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) { + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level ); + + } + + } else { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 ); + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + state.unbindTexture(); + + } else if ( isMultipleRenderTargets ) { + + const textures = renderTarget.texture; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachment = textures[ i ]; + const attachmentProperties = properties.get( attachment ); + + state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 ); + + if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) { + + generateMipmap( _gl.TEXTURE_2D ); + + } + + } + + state.unbindTexture(); + + } else { + + let glTextureType = _gl.TEXTURE_2D; + + if ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) { + + if ( isWebGL2 ) { + + glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY; + + } else { + + console.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' ); + + } + + } + + state.bindTexture( glTextureType, textureProperties.__webglTexture ); + setTextureParameters( glTextureType, texture, supportsMips ); + + if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) { + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level ); + + } + + } else { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 ); + + } + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + generateMipmap( glTextureType ); + + } + + state.unbindTexture(); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + const supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2; + + const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ]; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const texture = textures[ i ]; + + if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) { + + const target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + const webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target ); + state.unbindTexture(); + + } + + } + + } + + function updateMultisampleRenderTarget( renderTarget ) { + + if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) { + + const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ]; + const width = renderTarget.width; + const height = renderTarget.height; + let mask = _gl.COLOR_BUFFER_BIT; + const invalidationArray = []; + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderTargetProperties = properties.get( renderTarget ); + const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true ); + + // If MRT we need to remove FBO attachments + if ( isMultipleRenderTargets ) { + + for ( let i = 0; i < textures.length; i ++ ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null ); + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 ); + + } + + } + + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + + for ( let i = 0; i < textures.length; i ++ ) { + + invalidationArray.push( _gl.COLOR_ATTACHMENT0 + i ); + + if ( renderTarget.depthBuffer ) { + + invalidationArray.push( depthStyle ); + + } + + const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false; + + if ( ignoreDepthValues === false ) { + + if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT; + if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT; + + } + + if ( isMultipleRenderTargets ) { + + _gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + } + + if ( ignoreDepthValues === true ) { + + _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] ); + _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] ); + + } + + if ( isMultipleRenderTargets ) { + + const webglTexture = properties.get( textures[ i ] ).__webglTexture; + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 ); + + } + + _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST ); + + if ( supportsInvalidateFramebuffer ) { + + _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray ); + + } + + + } + + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null ); + + // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments + if ( isMultipleRenderTargets ) { + + for ( let i = 0; i < textures.length; i ++ ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + const webglTexture = properties.get( textures[ i ] ).__webglTexture; + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 ); + + } + + } + + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + + } + + } + + function getRenderTargetSamples( renderTarget ) { + + return Math.min( capabilities.maxSamples, renderTarget.samples ); + + } + + function useMultisampledRTT( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + return isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false; + + } + + function updateVideoTexture( texture ) { + + const frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures.get( texture ) !== frame ) { + + _videoTextures.set( texture, frame ); + texture.update(); + + } + + } + + function verifyColorSpace( texture, image ) { + + const colorSpace = texture.colorSpace; + const format = texture.format; + const type = texture.type; + + if ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image; + + if ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) { + + // sRGB + + if ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) { + + if ( isWebGL2 === false ) { + + // in WebGL 1, try to use EXT_sRGB extension and unsized formats + + if ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) { + + texture.format = _SRGBAFormat; + + // it's not possible to generate mips in WebGL 1 with this extension + + texture.minFilter = LinearFilter; + texture.generateMipmaps = false; + + } else { + + // slow fallback (CPU decode) + + image = ImageUtils.sRGBToLinear( image ); + + } + + } else { + + // in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format + + if ( format !== RGBAFormat || type !== UnsignedByteType ) { + + console.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' ); + + } + + } + + } else { + + console.error( 'THREE.WebGLTextures: Unsupported texture color space:', colorSpace ); + + } + + } + + return image; + + } + + // + + this.allocateTextureUnit = allocateTextureUnit; + this.resetTextureUnits = resetTextureUnits; + + this.setTexture2D = setTexture2D; + this.setTexture2DArray = setTexture2DArray; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.rebindTextures = rebindTextures; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; + this.setupDepthRenderbuffer = setupDepthRenderbuffer; + this.setupFrameBufferTexture = setupFrameBufferTexture; + this.useMultisampledRTT = useMultisampledRTT; + +} + +function WebGLUtils( gl, extensions, capabilities ) { + + const isWebGL2 = capabilities.isWebGL2; + + function convert( p, colorSpace = NoColorSpace ) { + + let extension; + + const transfer = ColorManagement.getTransfer( colorSpace ); + + if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1; + + if ( p === ByteType ) return gl.BYTE; + if ( p === ShortType ) return gl.SHORT; + if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT; + if ( p === IntType ) return gl.INT; + if ( p === UnsignedIntType ) return gl.UNSIGNED_INT; + if ( p === FloatType ) return gl.FLOAT; + + if ( p === HalfFloatType ) { + + if ( isWebGL2 ) return gl.HALF_FLOAT; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) { + + return extension.HALF_FLOAT_OES; + + } else { + + return null; + + } + + } + + if ( p === AlphaFormat ) return gl.ALPHA; + if ( p === RGBAFormat ) return gl.RGBA; + if ( p === LuminanceFormat ) return gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL; + + // WebGL 1 sRGB fallback + + if ( p === _SRGBAFormat ) { + + extension = extensions.get( 'EXT_sRGB' ); + + if ( extension !== null ) { + + return extension.SRGB_ALPHA_EXT; + + } else { + + return null; + + } + + } + + // WebGL2 formats. + + if ( p === RedFormat ) return gl.RED; + if ( p === RedIntegerFormat ) return gl.RED_INTEGER; + if ( p === RGFormat ) return gl.RG; + if ( p === RGIntegerFormat ) return gl.RG_INTEGER; + if ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER; + + // S3TC + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + if ( transfer === SRGBTransfer ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + + } else { + + return null; + + } + + } else { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } else { + + return null; + + } + + } + + } + + // PVRTC + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } else { + + return null; + + } + + } + + // ETC1 + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) { + + return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } else { + + return null; + + } + + } + + // ETC2 + + if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc' ); + + if ( extension !== null ) { + + if ( p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2; + if ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC; + + } else { + + return null; + + } + + } + + // ASTC + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + if ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR; + if ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR; + if ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR; + if ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR; + if ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR; + if ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR; + if ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR; + if ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR; + if ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR; + if ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR; + if ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR; + if ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR; + if ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR; + if ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR; + + } else { + + return null; + + } + + } + + // BPTC + + if ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) { + + extension = extensions.get( 'EXT_texture_compression_bptc' ); + + if ( extension !== null ) { + + if ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; + if ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; + if ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; + + } else { + + return null; + + } + + } + + // RGTC + + if ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) { + + extension = extensions.get( 'EXT_texture_compression_rgtc' ); + + if ( extension !== null ) { + + if ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; + if ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; + if ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; + if ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; + + } else { + + return null; + + } + + } + + // + + if ( p === UnsignedInt248Type ) { + + if ( isWebGL2 ) return gl.UNSIGNED_INT_24_8; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) { + + return extension.UNSIGNED_INT_24_8_WEBGL; + + } else { + + return null; + + } + + } + + // if "p" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats) + + return ( gl[ p ] !== undefined ) ? gl[ p ] : null; + + } + + return { convert: convert }; + +} + +class ArrayCamera extends PerspectiveCamera { + + constructor( array = [] ) { + + super(); + + this.isArrayCamera = true; + + this.cameras = array; + + } + +} + +class Group extends Object3D { + + constructor() { + + super(); + + this.isGroup = true; + + this.type = 'Group'; + + } + +} + +const _moveEvent = { type: 'move' }; + +class WebXRController { + + constructor() { + + this._targetRay = null; + this._grip = null; + this._hand = null; + + } + + getHandSpace() { + + if ( this._hand === null ) { + + this._hand = new Group(); + this._hand.matrixAutoUpdate = false; + this._hand.visible = false; + + this._hand.joints = {}; + this._hand.inputState = { pinching: false }; + + } + + return this._hand; + + } + + getTargetRaySpace() { + + if ( this._targetRay === null ) { + + this._targetRay = new Group(); + this._targetRay.matrixAutoUpdate = false; + this._targetRay.visible = false; + this._targetRay.hasLinearVelocity = false; + this._targetRay.linearVelocity = new Vector3(); + this._targetRay.hasAngularVelocity = false; + this._targetRay.angularVelocity = new Vector3(); + + } + + return this._targetRay; + + } + + getGripSpace() { + + if ( this._grip === null ) { + + this._grip = new Group(); + this._grip.matrixAutoUpdate = false; + this._grip.visible = false; + this._grip.hasLinearVelocity = false; + this._grip.linearVelocity = new Vector3(); + this._grip.hasAngularVelocity = false; + this._grip.angularVelocity = new Vector3(); + + } + + return this._grip; + + } + + dispatchEvent( event ) { + + if ( this._targetRay !== null ) { + + this._targetRay.dispatchEvent( event ); + + } + + if ( this._grip !== null ) { + + this._grip.dispatchEvent( event ); + + } + + if ( this._hand !== null ) { + + this._hand.dispatchEvent( event ); + + } + + return this; + + } + + connect( inputSource ) { + + if ( inputSource && inputSource.hand ) { + + const hand = this._hand; + + if ( hand ) { + + for ( const inputjoint of inputSource.hand.values() ) { + + // Initialize hand with joints when connected + this._getHandJoint( hand, inputjoint ); + + } + + } + + } + + this.dispatchEvent( { type: 'connected', data: inputSource } ); + + return this; + + } + + disconnect( inputSource ) { + + this.dispatchEvent( { type: 'disconnected', data: inputSource } ); + + if ( this._targetRay !== null ) { + + this._targetRay.visible = false; + + } + + if ( this._grip !== null ) { + + this._grip.visible = false; + + } + + if ( this._hand !== null ) { + + this._hand.visible = false; + + } + + return this; + + } + + update( inputSource, frame, referenceSpace ) { + + let inputPose = null; + let gripPose = null; + let handPose = null; + + const targetRay = this._targetRay; + const grip = this._grip; + const hand = this._hand; + + if ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) { + + if ( hand && inputSource.hand ) { + + handPose = true; + + for ( const inputjoint of inputSource.hand.values() ) { + + // Update the joints groups with the XRJoint poses + const jointPose = frame.getJointPose( inputjoint, referenceSpace ); + + // The transform of this joint will be updated with the joint pose on each frame + const joint = this._getHandJoint( hand, inputjoint ); + + if ( jointPose !== null ) { + + joint.matrix.fromArray( jointPose.transform.matrix ); + joint.matrix.decompose( joint.position, joint.rotation, joint.scale ); + joint.matrixWorldNeedsUpdate = true; + joint.jointRadius = jointPose.radius; + + } + + joint.visible = jointPose !== null; + + } + + // Custom events + + // Check pinchz + const indexTip = hand.joints[ 'index-finger-tip' ]; + const thumbTip = hand.joints[ 'thumb-tip' ]; + const distance = indexTip.position.distanceTo( thumbTip.position ); + + const distanceToPinch = 0.02; + const threshold = 0.005; + + if ( hand.inputState.pinching && distance > distanceToPinch + threshold ) { + + hand.inputState.pinching = false; + this.dispatchEvent( { + type: 'pinchend', + handedness: inputSource.handedness, + target: this + } ); + + } else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) { + + hand.inputState.pinching = true; + this.dispatchEvent( { + type: 'pinchstart', + handedness: inputSource.handedness, + target: this + } ); + + } + + } else { + + if ( grip !== null && inputSource.gripSpace ) { + + gripPose = frame.getPose( inputSource.gripSpace, referenceSpace ); + + if ( gripPose !== null ) { + + grip.matrix.fromArray( gripPose.transform.matrix ); + grip.matrix.decompose( grip.position, grip.rotation, grip.scale ); + grip.matrixWorldNeedsUpdate = true; + + if ( gripPose.linearVelocity ) { + + grip.hasLinearVelocity = true; + grip.linearVelocity.copy( gripPose.linearVelocity ); + + } else { + + grip.hasLinearVelocity = false; + + } + + if ( gripPose.angularVelocity ) { + + grip.hasAngularVelocity = true; + grip.angularVelocity.copy( gripPose.angularVelocity ); + + } else { + + grip.hasAngularVelocity = false; + + } + + } + + } + + } + + if ( targetRay !== null ) { + + inputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace ); + + // Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it + if ( inputPose === null && gripPose !== null ) { + + inputPose = gripPose; + + } + + if ( inputPose !== null ) { + + targetRay.matrix.fromArray( inputPose.transform.matrix ); + targetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale ); + targetRay.matrixWorldNeedsUpdate = true; + + if ( inputPose.linearVelocity ) { + + targetRay.hasLinearVelocity = true; + targetRay.linearVelocity.copy( inputPose.linearVelocity ); + + } else { + + targetRay.hasLinearVelocity = false; + + } + + if ( inputPose.angularVelocity ) { + + targetRay.hasAngularVelocity = true; + targetRay.angularVelocity.copy( inputPose.angularVelocity ); + + } else { + + targetRay.hasAngularVelocity = false; + + } + + this.dispatchEvent( _moveEvent ); + + } + + } + + + } + + if ( targetRay !== null ) { + + targetRay.visible = ( inputPose !== null ); + + } + + if ( grip !== null ) { + + grip.visible = ( gripPose !== null ); + + } + + if ( hand !== null ) { + + hand.visible = ( handPose !== null ); + + } + + return this; + + } + + // private method + + _getHandJoint( hand, inputjoint ) { + + if ( hand.joints[ inputjoint.jointName ] === undefined ) { + + const joint = new Group(); + joint.matrixAutoUpdate = false; + joint.visible = false; + hand.joints[ inputjoint.jointName ] = joint; + + hand.add( joint ); + + } + + return hand.joints[ inputjoint.jointName ]; + + } + +} + +class WebXRManager extends EventDispatcher { + + constructor( renderer, gl ) { + + super(); + + const scope = this; + + let session = null; + + let framebufferScaleFactor = 1.0; + + let referenceSpace = null; + let referenceSpaceType = 'local-floor'; + // Set default foveation to maximum. + let foveation = 1.0; + let customReferenceSpace = null; + + let pose = null; + let glBinding = null; + let glProjLayer = null; + let glBaseLayer = null; + let xrFrame = null; + const attributes = gl.getContextAttributes(); + let initialRenderTarget = null; + let newRenderTarget = null; + + const controllers = []; + const controllerInputSources = []; + + const currentSize = new Vector2(); + let currentPixelRatio = null; + + // + + const cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + const cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + const cameras = [ cameraL, cameraR ]; + + const cameraXR = new ArrayCamera(); + cameraXR.layers.enable( 1 ); + cameraXR.layers.enable( 2 ); + + let _currentDepthNear = null; + let _currentDepthFar = null; + + // + + this.cameraAutoUpdate = true; + this.enabled = false; + + this.isPresenting = false; + + this.getController = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getTargetRaySpace(); + + }; + + this.getControllerGrip = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getGripSpace(); + + }; + + this.getHand = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getHandSpace(); + + }; + + // + + function onSessionEvent( event ) { + + const controllerIndex = controllerInputSources.indexOf( event.inputSource ); + + if ( controllerIndex === - 1 ) { + + return; + + } + + const controller = controllers[ controllerIndex ]; + + if ( controller !== undefined ) { + + controller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace ); + controller.dispatchEvent( { type: event.type, data: event.inputSource } ); + + } + + } + + function onSessionEnd() { + + session.removeEventListener( 'select', onSessionEvent ); + session.removeEventListener( 'selectstart', onSessionEvent ); + session.removeEventListener( 'selectend', onSessionEvent ); + session.removeEventListener( 'squeeze', onSessionEvent ); + session.removeEventListener( 'squeezestart', onSessionEvent ); + session.removeEventListener( 'squeezeend', onSessionEvent ); + session.removeEventListener( 'end', onSessionEnd ); + session.removeEventListener( 'inputsourceschange', onInputSourcesChange ); + + for ( let i = 0; i < controllers.length; i ++ ) { + + const inputSource = controllerInputSources[ i ]; + + if ( inputSource === null ) continue; + + controllerInputSources[ i ] = null; + + controllers[ i ].disconnect( inputSource ); + + } + + _currentDepthNear = null; + _currentDepthFar = null; + + // restore framebuffer/rendering state + + renderer.setRenderTarget( initialRenderTarget ); + + glBaseLayer = null; + glProjLayer = null; + glBinding = null; + session = null; + newRenderTarget = null; + + // + + animation.stop(); + + scope.isPresenting = false; + + renderer.setPixelRatio( currentPixelRatio ); + renderer.setSize( currentSize.width, currentSize.height, false ); + + scope.dispatchEvent( { type: 'sessionend' } ); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' ); + + } + + }; + + this.setReferenceSpaceType = function ( value ) { + + referenceSpaceType = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' ); + + } + + }; + + this.getReferenceSpace = function () { + + return customReferenceSpace || referenceSpace; + + }; + + this.setReferenceSpace = function ( space ) { + + customReferenceSpace = space; + + }; + + this.getBaseLayer = function () { + + return glProjLayer !== null ? glProjLayer : glBaseLayer; + + }; + + this.getBinding = function () { + + return glBinding; + + }; + + this.getFrame = function () { + + return xrFrame; + + }; + + this.getSession = function () { + + return session; + + }; + + this.setSession = async function ( value ) { + + session = value; + + if ( session !== null ) { + + initialRenderTarget = renderer.getRenderTarget(); + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'squeeze', onSessionEvent ); + session.addEventListener( 'squeezestart', onSessionEvent ); + session.addEventListener( 'squeezeend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + session.addEventListener( 'inputsourceschange', onInputSourcesChange ); + + if ( attributes.xrCompatible !== true ) { + + await gl.makeXRCompatible(); + + } + + currentPixelRatio = renderer.getPixelRatio(); + renderer.getSize( currentSize ); + + if ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) { + + const layerInit = { + antialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true, + alpha: true, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor: framebufferScaleFactor + }; + + glBaseLayer = new XRWebGLLayer( session, gl, layerInit ); + + session.updateRenderState( { baseLayer: glBaseLayer } ); + + renderer.setPixelRatio( 1 ); + renderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false ); + + newRenderTarget = new WebGLRenderTarget( + glBaseLayer.framebufferWidth, + glBaseLayer.framebufferHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + colorSpace: renderer.outputColorSpace, + stencilBuffer: attributes.stencil + } + ); + + } else { + + let depthFormat = null; + let depthType = null; + let glDepthFormat = null; + + if ( attributes.depth ) { + + glDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; + depthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat; + depthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType; + + } + + const projectionlayerInit = { + colorFormat: gl.RGBA8, + depthFormat: glDepthFormat, + scaleFactor: framebufferScaleFactor + }; + + glBinding = new XRWebGLBinding( session, gl ); + + glProjLayer = glBinding.createProjectionLayer( projectionlayerInit ); + + session.updateRenderState( { layers: [ glProjLayer ] } ); + + renderer.setPixelRatio( 1 ); + renderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false ); + + newRenderTarget = new WebGLRenderTarget( + glProjLayer.textureWidth, + glProjLayer.textureHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ), + stencilBuffer: attributes.stencil, + colorSpace: renderer.outputColorSpace, + samples: attributes.antialias ? 4 : 0 + } ); + + const renderTargetProperties = renderer.properties.get( newRenderTarget ); + renderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues; + + } + + newRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278 + + this.setFoveation( foveation ); + + customReferenceSpace = null; + referenceSpace = await session.requestReferenceSpace( referenceSpaceType ); + + animation.setContext( session ); + animation.start(); + + scope.isPresenting = true; + + scope.dispatchEvent( { type: 'sessionstart' } ); + + } + + }; + + this.getEnvironmentBlendMode = function () { + + if ( session !== null ) { + + return session.environmentBlendMode; + + } + + }; + + function onInputSourcesChange( event ) { + + // Notify disconnected + + for ( let i = 0; i < event.removed.length; i ++ ) { + + const inputSource = event.removed[ i ]; + const index = controllerInputSources.indexOf( inputSource ); + + if ( index >= 0 ) { + + controllerInputSources[ index ] = null; + controllers[ index ].disconnect( inputSource ); + + } + + } + + // Notify connected + + for ( let i = 0; i < event.added.length; i ++ ) { + + const inputSource = event.added[ i ]; + + let controllerIndex = controllerInputSources.indexOf( inputSource ); + + if ( controllerIndex === - 1 ) { + + // Assign input source a controller that currently has no input source + + for ( let i = 0; i < controllers.length; i ++ ) { + + if ( i >= controllerInputSources.length ) { + + controllerInputSources.push( inputSource ); + controllerIndex = i; + break; + + } else if ( controllerInputSources[ i ] === null ) { + + controllerInputSources[ i ] = inputSource; + controllerIndex = i; + break; + + } + + } + + // If all controllers do currently receive input we ignore new ones + + if ( controllerIndex === - 1 ) break; + + } + + const controller = controllers[ controllerIndex ]; + + if ( controller ) { + + controller.connect( inputSource ); + + } + + } + + } + + // + + const cameraLPos = new Vector3(); + const cameraRPos = new Vector3(); + + /** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ + function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + const ipd = cameraLPos.distanceTo( cameraRPos ); + + const projL = cameraL.projectionMatrix.elements; + const projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + const near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + const far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + const topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + const bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + const leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + const rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + const left = near * leftFov; + const right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + const zOffset = ipd / ( - leftFov + rightFov ); + const xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + const near2 = near + zOffset; + const far2 = far + zOffset; + const left2 = left - xOffset; + const right2 = right + ( ipd - xOffset ); + const top2 = topFov * far / far2 * near2; + const bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert(); + + } + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + } + + this.updateCamera = function ( camera ) { + + if ( session === null ) return; + + cameraXR.near = cameraR.near = cameraL.near = camera.near; + cameraXR.far = cameraR.far = cameraL.far = camera.far; + + if ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) { + + // Note that the new renderState won't apply until the next frame. See #18320 + + session.updateRenderState( { + depthNear: cameraXR.near, + depthFar: cameraXR.far + } ); + + _currentDepthNear = cameraXR.near; + _currentDepthFar = cameraXR.far; + + } + + const parent = camera.parent; + const cameras = cameraXR.cameras; + + updateCamera( cameraXR, parent ); + + for ( let i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update projection matrix for proper view frustum culling + + if ( cameras.length === 2 ) { + + setProjectionFromUnion( cameraXR, cameraL, cameraR ); + + } else { + + // assume single camera setup (AR) + + cameraXR.projectionMatrix.copy( cameraL.projectionMatrix ); + + } + + // update user camera and its children + + updateUserCamera( camera, cameraXR, parent ); + + }; + + function updateUserCamera( camera, cameraXR, parent ) { + + if ( parent === null ) { + + camera.matrix.copy( cameraXR.matrixWorld ); + + } else { + + camera.matrix.copy( parent.matrixWorld ); + camera.matrix.invert(); + camera.matrix.multiply( cameraXR.matrixWorld ); + + } + + camera.matrix.decompose( camera.position, camera.quaternion, camera.scale ); + camera.updateMatrixWorld( true ); + + camera.projectionMatrix.copy( cameraXR.projectionMatrix ); + camera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse ); + + if ( camera.isPerspectiveCamera ) { + + camera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] ); + camera.zoom = 1; + + } + + } + + this.getCamera = function () { + + return cameraXR; + + }; + + this.getFoveation = function () { + + if ( glProjLayer === null && glBaseLayer === null ) { + + return undefined; + + } + + return foveation; + + }; + + this.setFoveation = function ( value ) { + + // 0 = no foveation = full resolution + // 1 = maximum foveation = the edges render at lower resolution + + foveation = value; + + if ( glProjLayer !== null ) { + + glProjLayer.fixedFoveation = value; + + } + + if ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) { + + glBaseLayer.fixedFoveation = value; + + } + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getViewerPose( customReferenceSpace || referenceSpace ); + xrFrame = frame; + + if ( pose !== null ) { + + const views = pose.views; + + if ( glBaseLayer !== null ) { + + renderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer ); + renderer.setRenderTarget( newRenderTarget ); + + } + + let cameraXRNeedsUpdate = false; + + // check if it's necessary to rebuild cameraXR's camera list + + if ( views.length !== cameraXR.cameras.length ) { + + cameraXR.cameras.length = 0; + cameraXRNeedsUpdate = true; + + } + + for ( let i = 0; i < views.length; i ++ ) { + + const view = views[ i ]; + + let viewport = null; + + if ( glBaseLayer !== null ) { + + viewport = glBaseLayer.getViewport( view ); + + } else { + + const glSubImage = glBinding.getViewSubImage( glProjLayer, view ); + viewport = glSubImage.viewport; + + // For side-by-side projection, we only produce a single texture for both eyes. + if ( i === 0 ) { + + renderer.setRenderTargetTextures( + newRenderTarget, + glSubImage.colorTexture, + glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture ); + + renderer.setRenderTarget( newRenderTarget ); + + } + + } + + let camera = cameras[ i ]; + + if ( camera === undefined ) { + + camera = new PerspectiveCamera(); + camera.layers.enable( i ); + camera.viewport = new Vector4(); + cameras[ i ] = camera; + + } + + camera.matrix.fromArray( view.transform.matrix ); + camera.matrix.decompose( camera.position, camera.quaternion, camera.scale ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert(); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraXR.matrix.copy( camera.matrix ); + cameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale ); + + } + + if ( cameraXRNeedsUpdate === true ) { + + cameraXR.cameras.push( camera ); + + } + + } + + } + + // + + for ( let i = 0; i < controllers.length; i ++ ) { + + const inputSource = controllerInputSources[ i ]; + const controller = controllers[ i ]; + + if ( inputSource !== null && controller !== undefined ) { + + controller.update( inputSource, frame, customReferenceSpace || referenceSpace ); + + } + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame ); + + if ( frame.detectedPlanes ) { + + scope.dispatchEvent( { type: 'planesdetected', data: frame } ); + + } + + xrFrame = null; + + } + + const animation = new WebGLAnimation(); + + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + } + +} + +function WebGLMaterials( renderer, properties ) { + + function refreshTransformUniform( map, uniform ) { + + if ( map.matrixAutoUpdate === true ) { + + map.updateMatrix(); + + } + + uniform.value.copy( map.matrix ); + + } + + function refreshFogUniforms( uniforms, fog ) { + + fog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) ); + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) { + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsToon( uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsPhong( uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsStandard( uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsMatcap( uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsDistance( uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( uniforms, material, pixelRatio, height ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + uniforms.color.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + } else if ( material.isShaderMaterial ) { + + material.uniformsNeedUpdate = false; // #15581 + + } + + } + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value.copy( material.color ); + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.mapTransform ); + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform ); + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + + refreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform ); + + uniforms.bumpScale.value = material.bumpScale; + + if ( material.side === BackSide ) { + + uniforms.bumpScale.value *= - 1; + + } + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + + refreshTransformUniform( material.normalMap, uniforms.normalMapTransform ); + + uniforms.normalScale.value.copy( material.normalScale ); + + if ( material.side === BackSide ) { + + uniforms.normalScale.value.negate(); + + } + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + + refreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform ); + + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + refreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform ); + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + refreshTransformUniform( material.specularMap, uniforms.specularMapTransform ); + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + const envMap = properties.get( material ).envMap; + + if ( envMap ) { + + uniforms.envMap.value = envMap; + + uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.ior.value = material.ior; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + + // artist-friendly light intensity scaling factor + const scaleFactor = ( renderer._useLegacyLights === true ) ? Math.PI : 1; + + uniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor; + + refreshTransformUniform( material.lightMap, uniforms.lightMapTransform ); + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + refreshTransformUniform( material.aoMap, uniforms.aoMapTransform ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.mapTransform ); + + } + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material, pixelRatio, height ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * pixelRatio; + uniforms.scale.value = height * 0.5; + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.uvTransform ); + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform ); + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.mapTransform ); + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform ); + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value.copy( material.specular ); + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + } + + function refreshUniformsToon( uniforms, material ) { + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.metalness.value = material.metalness; + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + refreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform ); + + } + + uniforms.roughness.value = material.roughness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + refreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform ); + + } + + const envMap = properties.get( material ).envMap; + + if ( envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) { + + uniforms.ior.value = material.ior; // also part of uniforms common + + if ( material.sheen > 0 ) { + + uniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen ); + + uniforms.sheenRoughness.value = material.sheenRoughness; + + if ( material.sheenColorMap ) { + + uniforms.sheenColorMap.value = material.sheenColorMap; + + refreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform ); + + } + + if ( material.sheenRoughnessMap ) { + + uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; + + refreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform ); + + } + + } + + if ( material.clearcoat > 0 ) { + + uniforms.clearcoat.value = material.clearcoat; + uniforms.clearcoatRoughness.value = material.clearcoatRoughness; + + if ( material.clearcoatMap ) { + + uniforms.clearcoatMap.value = material.clearcoatMap; + + refreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform ); + + } + + if ( material.clearcoatRoughnessMap ) { + + uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; + + refreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform ); + + } + + if ( material.clearcoatNormalMap ) { + + uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; + + refreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform ); + + uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale ); + + if ( material.side === BackSide ) { + + uniforms.clearcoatNormalScale.value.negate(); + + } + + } + + } + + if ( material.iridescence > 0 ) { + + uniforms.iridescence.value = material.iridescence; + uniforms.iridescenceIOR.value = material.iridescenceIOR; + uniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ]; + uniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ]; + + if ( material.iridescenceMap ) { + + uniforms.iridescenceMap.value = material.iridescenceMap; + + refreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform ); + + } + + if ( material.iridescenceThicknessMap ) { + + uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap; + + refreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform ); + + } + + } + + if ( material.transmission > 0 ) { + + uniforms.transmission.value = material.transmission; + uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; + uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height ); + + if ( material.transmissionMap ) { + + uniforms.transmissionMap.value = material.transmissionMap; + + refreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform ); + + } + + uniforms.thickness.value = material.thickness; + + if ( material.thicknessMap ) { + + uniforms.thicknessMap.value = material.thicknessMap; + + refreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform ); + + } + + uniforms.attenuationDistance.value = material.attenuationDistance; + uniforms.attenuationColor.value.copy( material.attenuationColor ); + + } + + if ( material.anisotropy > 0 ) { + + uniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) ); + + if ( material.anisotropyMap ) { + + uniforms.anisotropyMap.value = material.anisotropyMap; + + refreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform ); + + } + + } + + uniforms.specularIntensity.value = material.specularIntensity; + uniforms.specularColor.value.copy( material.specularColor ); + + if ( material.specularColorMap ) { + + uniforms.specularColorMap.value = material.specularColorMap; + + refreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform ); + + } + + if ( material.specularIntensityMap ) { + + uniforms.specularIntensityMap.value = material.specularIntensityMap; + + refreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform ); + + } + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + const light = properties.get( material ).light; + + uniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld ); + uniforms.nearDistance.value = light.shadow.camera.near; + uniforms.farDistance.value = light.shadow.camera.far; + + } + + return { + refreshFogUniforms: refreshFogUniforms, + refreshMaterialUniforms: refreshMaterialUniforms + }; + +} + +function WebGLUniformsGroups( gl, info, capabilities, state ) { + + let buffers = {}; + let updateList = {}; + let allocatedBindingPoints = []; + + const maxBindingPoints = ( capabilities.isWebGL2 ) ? gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ) : 0; // binding points are global whereas block indices are per shader program + + function bind( uniformsGroup, program ) { + + const webglProgram = program.program; + state.uniformBlockBinding( uniformsGroup, webglProgram ); + + } + + function update( uniformsGroup, program ) { + + let buffer = buffers[ uniformsGroup.id ]; + + if ( buffer === undefined ) { + + prepareUniformsGroup( uniformsGroup ); + + buffer = createBuffer( uniformsGroup ); + buffers[ uniformsGroup.id ] = buffer; + + uniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose ); + + } + + // ensure to update the binding points/block indices mapping for this program + + const webglProgram = program.program; + state.updateUBOMapping( uniformsGroup, webglProgram ); + + // update UBO once per frame + + const frame = info.render.frame; + + if ( updateList[ uniformsGroup.id ] !== frame ) { + + updateBufferData( uniformsGroup ); + + updateList[ uniformsGroup.id ] = frame; + + } + + } + + function createBuffer( uniformsGroup ) { + + // the setup of an UBO is independent of a particular shader program but global + + const bindingPointIndex = allocateBindingPointIndex(); + uniformsGroup.__bindingPointIndex = bindingPointIndex; + + const buffer = gl.createBuffer(); + const size = uniformsGroup.__size; + const usage = uniformsGroup.usage; + + gl.bindBuffer( gl.UNIFORM_BUFFER, buffer ); + gl.bufferData( gl.UNIFORM_BUFFER, size, usage ); + gl.bindBuffer( gl.UNIFORM_BUFFER, null ); + gl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer ); + + return buffer; + + } + + function allocateBindingPointIndex() { + + for ( let i = 0; i < maxBindingPoints; i ++ ) { + + if ( allocatedBindingPoints.indexOf( i ) === - 1 ) { + + allocatedBindingPoints.push( i ); + return i; + + } + + } + + console.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' ); + + return 0; + + } + + function updateBufferData( uniformsGroup ) { + + const buffer = buffers[ uniformsGroup.id ]; + const uniforms = uniformsGroup.uniforms; + const cache = uniformsGroup.__cache; + + gl.bindBuffer( gl.UNIFORM_BUFFER, buffer ); + + for ( let i = 0, il = uniforms.length; i < il; i ++ ) { + + const uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ]; + + for ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) { + + const uniform = uniformArray[ j ]; + + if ( hasUniformChanged( uniform, i, j, cache ) === true ) { + + const offset = uniform.__offset; + + const values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ]; + + let arrayOffset = 0; + + for ( let k = 0; k < values.length; k ++ ) { + + const value = values[ k ]; + + const info = getUniformSize( value ); + + // TODO add integer and struct support + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + uniform.__data[ 0 ] = value; + gl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data ); + + } else if ( value.isMatrix3 ) { + + // manually converting 3x3 to 3x4 + + uniform.__data[ 0 ] = value.elements[ 0 ]; + uniform.__data[ 1 ] = value.elements[ 1 ]; + uniform.__data[ 2 ] = value.elements[ 2 ]; + uniform.__data[ 3 ] = 0; + uniform.__data[ 4 ] = value.elements[ 3 ]; + uniform.__data[ 5 ] = value.elements[ 4 ]; + uniform.__data[ 6 ] = value.elements[ 5 ]; + uniform.__data[ 7 ] = 0; + uniform.__data[ 8 ] = value.elements[ 6 ]; + uniform.__data[ 9 ] = value.elements[ 7 ]; + uniform.__data[ 10 ] = value.elements[ 8 ]; + uniform.__data[ 11 ] = 0; + + } else { + + value.toArray( uniform.__data, arrayOffset ); + + arrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT; + + } + + } + + gl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data ); + + } + + } + + } + + gl.bindBuffer( gl.UNIFORM_BUFFER, null ); + + } + + function hasUniformChanged( uniform, index, indexArray, cache ) { + + const value = uniform.value; + const indexString = index + '_' + indexArray; + + if ( cache[ indexString ] === undefined ) { + + // cache entry does not exist so far + + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + cache[ indexString ] = value; + + } else { + + cache[ indexString ] = value.clone(); + + } + + return true; + + } else { + + const cachedObject = cache[ indexString ]; + + // compare current value with cached entry + + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + if ( cachedObject !== value ) { + + cache[ indexString ] = value; + return true; + + } + + } else { + + if ( cachedObject.equals( value ) === false ) { + + cachedObject.copy( value ); + return true; + + } + + } + + } + + return false; + + } + + function prepareUniformsGroup( uniformsGroup ) { + + // determine total buffer size according to the STD140 layout + // Hint: STD140 is the only supported layout in WebGL 2 + + const uniforms = uniformsGroup.uniforms; + + let offset = 0; // global buffer offset in bytes + const chunkSize = 16; // size of a chunk in bytes + + for ( let i = 0, l = uniforms.length; i < l; i ++ ) { + + const uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ]; + + for ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) { + + const uniform = uniformArray[ j ]; + + const values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ]; + + for ( let k = 0, kl = values.length; k < kl; k ++ ) { + + const value = values[ k ]; + + const info = getUniformSize( value ); + + // Calculate the chunk offset + const chunkOffsetUniform = offset % chunkSize; + + // Check for chunk overflow + if ( chunkOffsetUniform !== 0 && ( chunkSize - chunkOffsetUniform ) < info.boundary ) { + + // Add padding and adjust offset + offset += ( chunkSize - chunkOffsetUniform ); + + } + + // the following two properties will be used for partial buffer updates + + uniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT ); + uniform.__offset = offset; + + + // Update the global offset + offset += info.storage; + + + } + + } + + } + + // ensure correct final padding + + const chunkOffset = offset % chunkSize; + + if ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset ); + + // + + uniformsGroup.__size = offset; + uniformsGroup.__cache = {}; + + return this; + + } + + function getUniformSize( value ) { + + const info = { + boundary: 0, // bytes + storage: 0 // bytes + }; + + // determine sizes according to STD140 + + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + // float/int/bool + + info.boundary = 4; + info.storage = 4; + + } else if ( value.isVector2 ) { + + // vec2 + + info.boundary = 8; + info.storage = 8; + + } else if ( value.isVector3 || value.isColor ) { + + // vec3 + + info.boundary = 16; + info.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes + + } else if ( value.isVector4 ) { + + // vec4 + + info.boundary = 16; + info.storage = 16; + + } else if ( value.isMatrix3 ) { + + // mat3 (in STD140 a 3x3 matrix is represented as 3x4) + + info.boundary = 48; + info.storage = 48; + + } else if ( value.isMatrix4 ) { + + // mat4 + + info.boundary = 64; + info.storage = 64; + + } else if ( value.isTexture ) { + + console.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value ); + + } + + return info; + + } + + function onUniformsGroupsDispose( event ) { + + const uniformsGroup = event.target; + + uniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose ); + + const index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex ); + allocatedBindingPoints.splice( index, 1 ); + + gl.deleteBuffer( buffers[ uniformsGroup.id ] ); + + delete buffers[ uniformsGroup.id ]; + delete updateList[ uniformsGroup.id ]; + + } + + function dispose() { + + for ( const id in buffers ) { + + gl.deleteBuffer( buffers[ id ] ); + + } + + allocatedBindingPoints = []; + buffers = {}; + updateList = {}; + + } + + return { + + bind: bind, + update: update, + + dispose: dispose + + }; + +} + +class WebGLRenderer { + + constructor( parameters = {} ) { + + const { + canvas = createCanvasElement(), + context = null, + depth = true, + stencil = true, + alpha = false, + antialias = false, + premultipliedAlpha = true, + preserveDrawingBuffer = false, + powerPreference = 'default', + failIfMajorPerformanceCaveat = false, + } = parameters; + + this.isWebGLRenderer = true; + + let _alpha; + + if ( context !== null ) { + + _alpha = context.getContextAttributes().alpha; + + } else { + + _alpha = alpha; + + } + + const uintClearColor = new Uint32Array( 4 ); + const intClearColor = new Int32Array( 4 ); + + let currentRenderList = null; + let currentRenderState = null; + + // render() can be called from within a callback triggered by another render. + // We track this so that the nested render call gets its list and state isolated from the parent render call. + + const renderListStack = []; + const renderStateStack = []; + + // public properties + + this.domElement = canvas; + + // Debug configuration container + this.debug = { + + /** + * Enables error checking and reporting when shader programs are being compiled + * @type {boolean} + */ + checkShaderErrors: true, + /** + * Callback for custom error reporting. + * @type {?Function} + */ + onShaderError: null + }; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this._outputColorSpace = SRGBColorSpace; + + // physical lights + + this._useLegacyLights = false; + + // tone mapping + + this.toneMapping = NoToneMapping; + this.toneMappingExposure = 1.0; + + // internal properties + + const _this = this; + + let _isContextLost = false; + + // internal state cache + + let _currentActiveCubeFace = 0; + let _currentActiveMipmapLevel = 0; + let _currentRenderTarget = null; + let _currentMaterialId = - 1; + + let _currentCamera = null; + + const _currentViewport = new Vector4(); + const _currentScissor = new Vector4(); + let _currentScissorTest = null; + + const _currentClearColor = new Color( 0x000000 ); + let _currentClearAlpha = 0; + + // + + let _width = canvas.width; + let _height = canvas.height; + + let _pixelRatio = 1; + let _opaqueSort = null; + let _transparentSort = null; + + const _viewport = new Vector4( 0, 0, _width, _height ); + const _scissor = new Vector4( 0, 0, _width, _height ); + let _scissorTest = false; + + // frustum + + const _frustum = new Frustum(); + + // clipping + + let _clippingEnabled = false; + let _localClippingEnabled = false; + + // transmission + + let _transmissionRenderTarget = null; + + // camera matrices cache + + const _projScreenMatrix = new Matrix4(); + + const _vector2 = new Vector2(); + const _vector3 = new Vector3(); + + const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + let _gl = context; + + function getContext( contextNames, contextAttributes ) { + + for ( let i = 0; i < contextNames.length; i ++ ) { + + const contextName = contextNames[ i ]; + const context = canvas.getContext( contextName, contextAttributes ); + if ( context !== null ) return context; + + } + + return null; + + } + + try { + + const contextAttributes = { + alpha: true, + depth, + stencil, + antialias, + premultipliedAlpha, + preserveDrawingBuffer, + powerPreference, + failIfMajorPerformanceCaveat, + }; + + // OffscreenCanvas does not have setAttribute, see #22811 + if ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` ); + + // event listeners must be registered before WebGL context is created, see #12753 + canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + canvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false ); + + if ( _gl === null ) { + + const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ]; + + if ( _this.isWebGL1Renderer === true ) { + + contextNames.shift(); + + } + + _gl = getContext( contextNames, contextAttributes ); + + if ( _gl === null ) { + + if ( getContext( contextNames ) ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + } + + if ( typeof WebGLRenderingContext !== 'undefined' && _gl instanceof WebGLRenderingContext ) { // @deprecated, r153 + + console.warn( 'THREE.WebGLRenderer: WebGL 1 support was deprecated in r153 and will be removed in r163.' ); + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + throw error; + + } + + let extensions, capabilities, state, info; + let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let programCache, materials, renderLists, renderStates, clipping, shadowMap; + + let background, morphtargets, bufferRenderer, indexedBufferRenderer; + + let utils, bindingStates, uniformsGroups; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + extensions.init( capabilities ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, capabilities ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + cubemaps = new WebGLCubeMaps( _this ); + cubeuvmaps = new WebGLCubeUVMaps( _this ); + attributes = new WebGLAttributes( _gl, capabilities ); + bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities ); + geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); + objects = new WebGLObjects( _gl, geometries, attributes, info ); + morphtargets = new WebGLMorphtargets( _gl, capabilities, textures ); + clipping = new WebGLClipping( properties ); + programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ); + materials = new WebGLMaterials( _this, properties ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates( extensions, capabilities ); + background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha ); + shadowMap = new WebGLShadowMap( _this, objects, capabilities ); + uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.shadowMap = shadowMap; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // xr + + const xr = new WebXRManager( _this, _gl ); + + this.xr = xr; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function ( target ) { + + return target.set( _width, _height ); + + }; + + this.setSize = function ( width, height, updateStyle = true ) { + + if ( xr.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + canvas.width = Math.floor( width * _pixelRatio ); + canvas.height = Math.floor( height * _pixelRatio ); + + if ( updateStyle === true ) { + + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function ( target ) { + + return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor(); + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + canvas.width = Math.floor( width * pixelRatio ); + canvas.height = Math.floor( height * pixelRatio ); + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function ( target ) { + + return target.copy( _currentViewport ); + + }; + + this.getViewport = function ( target ) { + + return target.copy( _viewport ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _viewport.set( x.x, x.y, x.z, x.w ); + + } else { + + _viewport.set( x, y, width, height ); + + } + + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() ); + + }; + + this.getScissor = function ( target ) { + + return target.copy( _scissor ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _scissor.set( x.x, x.y, x.z, x.w ); + + } else { + + _scissor.set( x, y, width, height ); + + } + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() ); + + }; + + this.getScissorTest = function () { + + return _scissorTest; + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + this.setOpaqueSort = function ( method ) { + + _opaqueSort = method; + + }; + + this.setTransparentSort = function ( method ) { + + _transparentSort = method; + + }; + + // Clearing + + this.getClearColor = function ( target ) { + + return target.copy( background.getClearColor() ); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color = true, depth = true, stencil = true ) { + + let bits = 0; + + if ( color ) { + + // check if we're trying to clear an integer target + let isIntegerFormat = false; + if ( _currentRenderTarget !== null ) { + + const targetFormat = _currentRenderTarget.texture.format; + isIntegerFormat = targetFormat === RGBAIntegerFormat || + targetFormat === RGIntegerFormat || + targetFormat === RedIntegerFormat; + + } + + // use the appropriate clear functions to clear the target if it's a signed + // or unsigned integer target + if ( isIntegerFormat ) { + + const targetType = _currentRenderTarget.texture.type; + const isUnsignedType = targetType === UnsignedByteType || + targetType === UnsignedIntType || + targetType === UnsignedShortType || + targetType === UnsignedInt248Type || + targetType === UnsignedShort4444Type || + targetType === UnsignedShort5551Type; + + const clearColor = background.getClearColor(); + const a = background.getClearAlpha(); + const r = clearColor.r; + const g = clearColor.g; + const b = clearColor.b; + + if ( isUnsignedType ) { + + uintClearColor[ 0 ] = r; + uintClearColor[ 1 ] = g; + uintClearColor[ 2 ] = b; + uintClearColor[ 3 ] = a; + _gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor ); + + } else { + + intClearColor[ 0 ] = r; + intClearColor[ 1 ] = g; + intClearColor[ 2 ] = b; + intClearColor[ 3 ] = a; + _gl.clearBufferiv( _gl.COLOR, 0, intClearColor ); + + } + + } else { + + bits |= _gl.COLOR_BUFFER_BIT; + + } + + } + + if ( depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil ) { + + bits |= _gl.STENCIL_BUFFER_BIT; + this.state.buffers.stencil.setMask( 0xffffffff ); + + } + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + cubemaps.dispose(); + cubeuvmaps.dispose(); + objects.dispose(); + bindingStates.dispose(); + uniformsGroups.dispose(); + programCache.dispose(); + + xr.dispose(); + + xr.removeEventListener( 'sessionstart', onXRSessionStart ); + xr.removeEventListener( 'sessionend', onXRSessionEnd ); + + if ( _transmissionRenderTarget ) { + + _transmissionRenderTarget.dispose(); + _transmissionRenderTarget = null; + + } + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + const infoAutoReset = info.autoReset; + const shadowMapEnabled = shadowMap.enabled; + const shadowMapAutoUpdate = shadowMap.autoUpdate; + const shadowMapNeedsUpdate = shadowMap.needsUpdate; + const shadowMapType = shadowMap.type; + + initGLContext(); + + info.autoReset = infoAutoReset; + shadowMap.enabled = shadowMapEnabled; + shadowMap.autoUpdate = shadowMapAutoUpdate; + shadowMap.needsUpdate = shadowMapNeedsUpdate; + shadowMap.type = shadowMapType; + + } + + function onContextCreationError( event ) { + + console.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage ); + + } + + function onMaterialDispose( event ) { + + const material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReferences( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReferences( material ) { + + const programs = properties.get( material ).programs; + + if ( programs !== undefined ) { + + programs.forEach( function ( program ) { + + programCache.releaseProgram( program ); + + } ); + + if ( material.isShaderMaterial ) { + + programCache.releaseShaderCache( material ); + + } + + } + + } + + // Buffer rendering + + this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) { + + if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null) + + const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + const program = setProgram( camera, scene, geometry, material, object ); + + state.setMaterial( material, frontFaceCW ); + + // + + let index = geometry.index; + let rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + + if ( index === undefined ) return; + + rangeFactor = 2; + + } + + // + + const drawRange = geometry.drawRange; + const position = geometry.attributes.position; + + let drawStart = drawRange.start * rangeFactor; + let drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor; + + if ( group !== null ) { + + drawStart = Math.max( drawStart, group.start * rangeFactor ); + drawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor ); + + } + + if ( index !== null ) { + + drawStart = Math.max( drawStart, 0 ); + drawEnd = Math.min( drawEnd, index.count ); + + } else if ( position !== undefined && position !== null ) { + + drawStart = Math.max( drawStart, 0 ); + drawEnd = Math.min( drawEnd, position.count ); + + } + + const drawCount = drawEnd - drawStart; + + if ( drawCount < 0 || drawCount === Infinity ) return; + + // + + bindingStates.setup( object, material, program, geometry, index ); + + let attribute; + let renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.TRIANGLES ); + + } + + } else if ( object.isLine ) { + + let lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } else if ( object.isSprite ) { + + renderer.setMode( _gl.TRIANGLES ); + + } + + if ( object.isBatchedMesh ) { + + renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount ); + + } else if ( object.isInstancedMesh ) { + + renderer.renderInstances( drawStart, drawCount, object.count ); + + } else if ( geometry.isInstancedBufferGeometry ) { + + const maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity; + const instanceCount = Math.min( geometry.instanceCount, maxInstanceCount ); + + renderer.renderInstances( drawStart, drawCount, instanceCount ); + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + // Compile + + function prepareMaterial( material, scene, object ) { + + if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) { + + material.side = BackSide; + material.needsUpdate = true; + getProgram( material, scene, object ); + + material.side = FrontSide; + material.needsUpdate = true; + getProgram( material, scene, object ); + + material.side = DoubleSide; + + } else { + + getProgram( material, scene, object ); + + } + + } + + this.compile = function ( scene, camera, targetScene = null ) { + + if ( targetScene === null ) targetScene = scene; + + currentRenderState = renderStates.get( targetScene ); + currentRenderState.init(); + + renderStateStack.push( currentRenderState ); + + // gather lights from both the target scene and the new object that will be added to the scene. + + targetScene.traverseVisible( function ( object ) { + + if ( object.isLight && object.layers.test( camera.layers ) ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + if ( scene !== targetScene ) { + + scene.traverseVisible( function ( object ) { + + if ( object.isLight && object.layers.test( camera.layers ) ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + } + + currentRenderState.setupLights( _this._useLegacyLights ); + + // Only initialize materials in the new scene, not the targetScene. + + const materials = new Set(); + + scene.traverse( function ( object ) { + + const material = object.material; + + if ( material ) { + + if ( Array.isArray( material ) ) { + + for ( let i = 0; i < material.length; i ++ ) { + + const material2 = material[ i ]; + + prepareMaterial( material2, targetScene, object ); + materials.add( material2 ); + + } + + } else { + + prepareMaterial( material, targetScene, object ); + materials.add( material ); + + } + + } + + } ); + + renderStateStack.pop(); + currentRenderState = null; + + return materials; + + }; + + // compileAsync + + this.compileAsync = function ( scene, camera, targetScene = null ) { + + const materials = this.compile( scene, camera, targetScene ); + + // Wait for all the materials in the new object to indicate that they're + // ready to be used before resolving the promise. + + return new Promise( ( resolve ) => { + + function checkMaterialsReady() { + + materials.forEach( function ( material ) { + + const materialProperties = properties.get( material ); + const program = materialProperties.currentProgram; + + if ( program.isReady() ) { + + // remove any programs that report they're ready to use from the list + materials.delete( material ); + + } + + } ); + + // once the list of compiling materials is empty, call the callback + + if ( materials.size === 0 ) { + + resolve( scene ); + return; + + } + + // if some materials are still not ready, wait a bit and check again + + setTimeout( checkMaterialsReady, 10 ); + + } + + if ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) { + + // If we can check the compilation status of the materials without + // blocking then do so right away. + + checkMaterialsReady(); + + } else { + + // Otherwise start by waiting a bit to give the materials we just + // initialized a chance to finish. + + setTimeout( checkMaterialsReady, 10 ); + + } + + } ); + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + function onXRSessionStart() { + + animation.stop(); + + } + + function onXRSessionEnd() { + + animation.start(); + + } + + const animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof self !== 'undefined' ) animation.setContext( self ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + xr.setAnimationLoop( callback ); + + ( callback === null ) ? animation.stop() : animation.start(); + + }; + + xr.addEventListener( 'sessionstart', onXRSessionStart ); + xr.addEventListener( 'sessionend', onXRSessionEnd ); + + // Rendering + + this.render = function ( scene, camera ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost === true ) return; + + // update scene graph + + if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); + + if ( xr.enabled === true && xr.isPresenting === true ) { + + if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); + + camera = xr.getCamera(); // use XR camera for rendering + + } + + // + if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget ); + + currentRenderState = renderStates.get( scene, renderStateStack.length ); + currentRenderState.init(); + + renderStateStack.push( currentRenderState ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromProjectionMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled ); + + currentRenderList = renderLists.get( scene, renderListStack.length ); + currentRenderList.init(); + + renderListStack.push( currentRenderList ); + + projectObject( scene, camera, 0, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort( _opaqueSort, _transparentSort ); + + } + + // + + this.info.render.frame ++; + + if ( _clippingEnabled === true ) clipping.beginShadows(); + + const shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + if ( _clippingEnabled === true ) clipping.endShadows(); + + // + + if ( this.info.autoReset === true ) this.info.reset(); + + + // + + background.render( currentRenderList, scene ); + + // render scene + + currentRenderState.setupLights( _this._useLegacyLights ); + + if ( camera.isArrayCamera ) { + + const cameras = camera.cameras; + + for ( let i = 0, l = cameras.length; i < l; i ++ ) { + + const camera2 = cameras[ i ]; + + renderScene( currentRenderList, scene, camera2, camera2.viewport ); + + } + + } else { + + renderScene( currentRenderList, scene, camera ); + + } + + // + + if ( _currentRenderTarget !== null ) { + + // resolve multisample renderbuffers to a single-sample texture if necessary + + textures.updateMultisampleRenderTarget( _currentRenderTarget ); + + // Generate mipmap if we're using any kind of mipmap filtering + + textures.updateRenderTargetMipmap( _currentRenderTarget ); + + } + + // + + if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera ); + + // _gl.finish(); + + bindingStates.resetDefaultState(); + _currentMaterialId = - 1; + _currentCamera = null; + + renderStateStack.pop(); + + if ( renderStateStack.length > 0 ) { + + currentRenderState = renderStateStack[ renderStateStack.length - 1 ]; + + } else { + + currentRenderState = null; + + } + + renderListStack.pop(); + + if ( renderListStack.length > 0 ) { + + currentRenderList = renderListStack[ renderListStack.length - 1 ]; + + } else { + + currentRenderList = null; + + } + + }; + + function projectObject( object, camera, groupOrder, sortObjects ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isGroup ) { + + groupOrder = object.renderOrder; + + } else if ( object.isLOD ) { + + if ( object.autoUpdate === true ) object.update( camera ); + + } else if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + const geometry = objects.update( object ); + const material = object.material; + + if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null ); + + } + + } + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + const geometry = objects.update( object ); + const material = object.material; + + if ( sortObjects ) { + + if ( object.boundingSphere !== undefined ) { + + if ( object.boundingSphere === null ) object.computeBoundingSphere(); + _vector3.copy( object.boundingSphere.center ); + + } else { + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + _vector3.copy( geometry.boundingSphere.center ); + + } + + _vector3 + .applyMatrix4( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null ); + + } + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, groupOrder, sortObjects ); + + } + + } + + function renderScene( currentRenderList, scene, camera, viewport ) { + + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; + const transparentObjects = currentRenderList.transparent; + + currentRenderState.setupLightsView( camera ); + + if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera ); + + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); + + if ( viewport ) state.viewport( _currentViewport.copy( viewport ) ); + + if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera ); + if ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera ); + if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera ); + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + } + + function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) { + + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + + if ( overrideMaterial !== null ) { + + return; + + } + + const isWebGL2 = capabilities.isWebGL2; + + if ( _transmissionRenderTarget === null ) { + + _transmissionRenderTarget = new WebGLRenderTarget( 1, 1, { + generateMipmaps: true, + type: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType, + minFilter: LinearMipmapLinearFilter, + samples: ( isWebGL2 ) ? 4 : 0 + } ); + + // debug + + /* + const geometry = new PlaneGeometry(); + const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } ); + + const mesh = new Mesh( geometry, material ); + scene.add( mesh ); + */ + + } + + _this.getDrawingBufferSize( _vector2 ); + + if ( isWebGL2 ) { + + _transmissionRenderTarget.setSize( _vector2.x, _vector2.y ); + + } else { + + _transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) ); + + } + + // + + const currentRenderTarget = _this.getRenderTarget(); + _this.setRenderTarget( _transmissionRenderTarget ); + + _this.getClearColor( _currentClearColor ); + _currentClearAlpha = _this.getClearAlpha(); + if ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 ); + + _this.clear(); + + // Turn off the features which can affect the frag color for opaque objects pass. + // Otherwise they are applied twice in opaque objects pass and transmission objects pass. + const currentToneMapping = _this.toneMapping; + _this.toneMapping = NoToneMapping; + + renderObjects( opaqueObjects, scene, camera ); + + textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); + textures.updateRenderTargetMipmap( _transmissionRenderTarget ); + + let renderTargetNeedsUpdate = false; + + for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) { + + const renderItem = transmissiveObjects[ i ]; + + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = renderItem.material; + const group = renderItem.group; + + if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) { + + const currentSide = material.side; + + material.side = BackSide; + material.needsUpdate = true; + + renderObject( object, scene, camera, geometry, material, group ); + + material.side = currentSide; + material.needsUpdate = true; + + renderTargetNeedsUpdate = true; + + } + + } + + if ( renderTargetNeedsUpdate === true ) { + + textures.updateMultisampleRenderTarget( _transmissionRenderTarget ); + textures.updateRenderTargetMipmap( _transmissionRenderTarget ); + + } + + _this.setRenderTarget( currentRenderTarget ); + + _this.setClearColor( _currentClearColor, _currentClearAlpha ); + + _this.toneMapping = currentToneMapping; + + } + + function renderObjects( renderList, scene, camera ) { + + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + + for ( let i = 0, l = renderList.length; i < l; i ++ ) { + + const renderItem = renderList[ i ]; + + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = overrideMaterial === null ? renderItem.material : overrideMaterial; + const group = renderItem.group; + + if ( object.layers.test( camera.layers ) ) { + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + material.onBeforeRender( _this, scene, camera, geometry, object, group ); + + if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) { + + material.side = BackSide; + material.needsUpdate = true; + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + material.side = FrontSide; + material.needsUpdate = true; + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + material.side = DoubleSide; + + } else { + + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + function getProgram( material, scene, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + const materialProperties = properties.get( material ); + + const lights = currentRenderState.state.lights; + const shadowsArray = currentRenderState.state.shadowsArray; + + const lightsStateVersion = lights.state.version; + + const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object ); + const programCacheKey = programCache.getProgramCacheKey( parameters ); + + let programs = materialProperties.programs; + + // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change + + materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.fog = scene.fog; + materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment ); + + if ( programs === undefined ) { + + // new material + + material.addEventListener( 'dispose', onMaterialDispose ); + + programs = new Map(); + materialProperties.programs = programs; + + } + + let program = programs.get( programCacheKey ); + + if ( program !== undefined ) { + + // early out if program and light state is identical + + if ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) { + + updateCommonMaterialProperties( material, parameters ); + + return program; + + } + + } else { + + parameters.uniforms = programCache.getUniforms( material ); + + material.onBuild( object, parameters, _this ); + + material.onBeforeCompile( parameters, _this ); + + program = programCache.acquireProgram( parameters, programCacheKey ); + programs.set( programCacheKey, program ); + + materialProperties.uniforms = parameters.uniforms; + + } + + const uniforms = materialProperties.uniforms; + + if ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) { + + uniforms.clippingPlanes = clipping.uniform; + + } + + updateCommonMaterialProperties( material, parameters ); + + // store the light setup it was created for + + materialProperties.needsLights = materialNeedsLights( material ); + materialProperties.lightsStateVersion = lightsStateVersion; + + if ( materialProperties.needsLights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.lightProbe.value = lights.state.probe; + uniforms.directionalLights.value = lights.state.directional; + uniforms.directionalLightShadows.value = lights.state.directionalShadow; + uniforms.spotLights.value = lights.state.spot; + uniforms.spotLightShadows.value = lights.state.spotShadow; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.ltc_1.value = lights.state.rectAreaLTC1; + uniforms.ltc_2.value = lights.state.rectAreaLTC2; + uniforms.pointLights.value = lights.state.point; + uniforms.pointLightShadows.value = lights.state.pointShadow; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotLightMatrix.value = lights.state.spotLightMatrix; + uniforms.spotLightMap.value = lights.state.spotLightMap; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + materialProperties.currentProgram = program; + materialProperties.uniformsList = null; + + return program; + + } + + function getUniformList( materialProperties ) { + + if ( materialProperties.uniformsList === null ) { + + const progUniforms = materialProperties.currentProgram.getUniforms(); + materialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms ); + + } + + return materialProperties.uniformsList; + + } + + function updateCommonMaterialProperties( material, parameters ) { + + const materialProperties = properties.get( material ); + + materialProperties.outputColorSpace = parameters.outputColorSpace; + materialProperties.batching = parameters.batching; + materialProperties.instancing = parameters.instancing; + materialProperties.instancingColor = parameters.instancingColor; + materialProperties.skinning = parameters.skinning; + materialProperties.morphTargets = parameters.morphTargets; + materialProperties.morphNormals = parameters.morphNormals; + materialProperties.morphColors = parameters.morphColors; + materialProperties.morphTargetsCount = parameters.morphTargetsCount; + materialProperties.numClippingPlanes = parameters.numClippingPlanes; + materialProperties.numIntersection = parameters.numClipIntersection; + materialProperties.vertexAlphas = parameters.vertexAlphas; + materialProperties.vertexTangents = parameters.vertexTangents; + materialProperties.toneMapping = parameters.toneMapping; + + } + + function setProgram( camera, scene, geometry, material, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + textures.resetTextureUnits(); + + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); + const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; + const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); + const morphTargets = !! geometry.morphAttributes.position; + const morphNormals = !! geometry.morphAttributes.normal; + const morphColors = !! geometry.morphAttributes.color; + + let toneMapping = NoToneMapping; + + if ( material.toneMapped ) { + + if ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) { + + toneMapping = _this.toneMapping; + + } + + } + + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0; + + const materialProperties = properties.get( material ); + const lights = currentRenderState.state.lights; + + if ( _clippingEnabled === true ) { + + if ( _localClippingEnabled === true || camera !== _currentCamera ) { + + const useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + clipping.setState( material, camera, useCache ); + + } + + } + + // + + let needsProgramChange = false; + + if ( material.version === materialProperties.__version ) { + + if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) { + + needsProgramChange = true; + + } else if ( materialProperties.outputColorSpace !== colorSpace ) { + + needsProgramChange = true; + + } else if ( object.isBatchedMesh && materialProperties.batching === false ) { + + needsProgramChange = true; + + } else if ( ! object.isBatchedMesh && materialProperties.batching === true ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancing === false ) { + + needsProgramChange = true; + + } else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) { + + needsProgramChange = true; + + } else if ( object.isSkinnedMesh && materialProperties.skinning === false ) { + + needsProgramChange = true; + + } else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) { + + needsProgramChange = true; + + } else if ( materialProperties.envMap !== envMap ) { + + needsProgramChange = true; + + } else if ( material.fog === true && materialProperties.fog !== fog ) { + + needsProgramChange = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== clipping.numPlanes || + materialProperties.numIntersection !== clipping.numIntersection ) ) { + + needsProgramChange = true; + + } else if ( materialProperties.vertexAlphas !== vertexAlphas ) { + + needsProgramChange = true; + + } else if ( materialProperties.vertexTangents !== vertexTangents ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphTargets !== morphTargets ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphNormals !== morphNormals ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphColors !== morphColors ) { + + needsProgramChange = true; + + } else if ( materialProperties.toneMapping !== toneMapping ) { + + needsProgramChange = true; + + } else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) { + + needsProgramChange = true; + + } + + } else { + + needsProgramChange = true; + materialProperties.__version = material.version; + + } + + // + + let program = materialProperties.currentProgram; + + if ( needsProgramChange === true ) { + + program = getProgram( material, scene, object ); + + } + + let refreshProgram = false; + let refreshMaterial = false; + let refreshLights = false; + + const p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + // common camera uniforms + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + const uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + // consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067 + + if ( material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial ) { + + p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + } + + // skinning and morph target uniforms must be set even if material didn't change + // auto-setting of texture unit for bone and morph texture must go before other textures + // otherwise textures used for skinning and morphing can take over texture units reserved for other material textures + + if ( object.isSkinnedMesh ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + const skeleton = object.skeleton; + + if ( skeleton ) { + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture(); + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures ); + + } else { + + console.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' ); + + } + + } + + } + + if ( object.isBatchedMesh ) { + + p_uniforms.setOptional( _gl, object, 'batchingTexture' ); + p_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures ); + + } + + const morphAttributes = geometry.morphAttributes; + + if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) { + + morphtargets.update( object, geometry, program ); + + } + + if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) { + + materialProperties.receiveShadow = object.receiveShadow; + p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow ); + + } + + // https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512 + + if ( material.isMeshGouraudMaterial && material.envMap !== null ) { + + m_uniforms.envMap.value = envMap; + + m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1; + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + + if ( materialProperties.needsLights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog === true ) { + + materials.refreshFogUniforms( m_uniforms, fog ); + + } + + materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget ); + + WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + // UBOs + + if ( material.isShaderMaterial || material.isRawShaderMaterial ) { + + const groups = material.uniformsGroups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + if ( capabilities.isWebGL2 ) { + + const group = groups[ i ]; + + uniformsGroups.update( group, program ); + uniformsGroups.bind( group, program ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' ); + + } + + } + + } + + return program; + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + uniforms.lightProbe.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.directionalLightShadows.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.pointLightShadows.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.spotLightShadows.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + function materialNeedsLights( material ) { + + return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || + material.isMeshStandardMaterial || material.isShadowMaterial || + ( material.isShaderMaterial && material.lights === true ); + + } + + this.getActiveCubeFace = function () { + + return _currentActiveCubeFace; + + }; + + this.getActiveMipmapLevel = function () { + + return _currentActiveMipmapLevel; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) { + + properties.get( renderTarget.texture ).__webglTexture = colorTexture; + properties.get( renderTarget.depthTexture ).__webglTexture = depthTexture; + + const renderTargetProperties = properties.get( renderTarget ); + renderTargetProperties.__hasExternalTextures = true; + + if ( renderTargetProperties.__hasExternalTextures ) { + + renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined; + + if ( ! renderTargetProperties.__autoAllocateDepthBuffer ) { + + // The multisample_render_to_texture extension doesn't work properly if there + // are midframe flushes and an external depth buffer. Disable use of the extension. + if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) { + + console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' ); + renderTargetProperties.__useRenderToTexture = false; + + } + + } + + } + + }; + + this.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) { + + const renderTargetProperties = properties.get( renderTarget ); + renderTargetProperties.__webglFramebuffer = defaultFramebuffer; + renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined; + + }; + + this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) { + + _currentRenderTarget = renderTarget; + _currentActiveCubeFace = activeCubeFace; + _currentActiveMipmapLevel = activeMipmapLevel; + + let useDefaultFramebuffer = true; + let framebuffer = null; + let isCube = false; + let isRenderTarget3D = false; + + if ( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) { + + // We need to make sure to rebind the framebuffer. + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + useDefaultFramebuffer = false; + + } else if ( renderTargetProperties.__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } else if ( renderTargetProperties.__hasExternalTextures ) { + + // Color and depth texture must be rebound in order for the swapchain to update. + textures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture ); + + } + + const texture = renderTarget.texture; + + if ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) { + + isRenderTarget3D = true; + + } + + const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + if ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) { + + framebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ]; + + } else { + + framebuffer = __webglFramebuffer[ activeCubeFace ]; + + } + + isCube = true; + + } else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) { + + framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer; + + } else { + + if ( Array.isArray( __webglFramebuffer ) ) { + + framebuffer = __webglFramebuffer[ activeMipmapLevel ]; + + } else { + + framebuffer = __webglFramebuffer; + + } + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor(); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor(); + _currentScissorTest = _scissorTest; + + } + + const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) { + + state.drawBuffers( renderTarget, framebuffer ); + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + const textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel ); + + } else if ( isRenderTarget3D ) { + + const textureProperties = properties.get( renderTarget.texture ); + const layer = activeCubeFace || 0; + _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer ); + + } + + _currentMaterialId = - 1; // reset current material to ensure correct uniform bindings + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + let framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) { + + framebuffer = framebuffer[ activeCubeFaceIndex ]; + + } + + if ( framebuffer ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + try { + + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) ); + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! halfFloatSupportedByExt ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } finally { + + // restore framebuffer of current render target if necessary + + const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null; + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level = 0 ) { + + const levelScale = Math.pow( 2, - level ); + const width = Math.floor( texture.image.width * levelScale ); + const height = Math.floor( texture.image.height * levelScale ); + + textures.setTexture2D( texture, 0 ); + + _gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height ); + + state.unbindTexture(); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) { + + const width = srcTexture.image.width; + const height = srcTexture.image.height; + const glFormat = utils.convert( dstTexture.format ); + const glType = utils.convert( dstTexture.type ); + + textures.setTexture2D( dstTexture, 0 ); + + // As another texture upload may have changed pixelStorei + // parameters, make sure they are correct for the dstTexture + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + if ( srcTexture.isCompressedTexture ) { + + _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data ); + + } else { + + _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + } + + // Generate mipmaps only when copying level 0 + if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + state.unbindTexture(); + + }; + + this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) { + + if ( _this.isWebGL1Renderer ) { + + console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' ); + return; + + } + + const width = sourceBox.max.x - sourceBox.min.x + 1; + const height = sourceBox.max.y - sourceBox.min.y + 1; + const depth = sourceBox.max.z - sourceBox.min.z + 1; + const glFormat = utils.convert( dstTexture.format ); + const glType = utils.convert( dstTexture.type ); + let glTarget; + + if ( dstTexture.isData3DTexture ) { + + textures.setTexture3D( dstTexture, 0 ); + glTarget = _gl.TEXTURE_3D; + + } else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) { + + textures.setTexture2DArray( dstTexture, 0 ); + glTarget = _gl.TEXTURE_2D_ARRAY; + + } else { + + console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' ); + return; + + } + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment ); + + const unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH ); + const unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT ); + const unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS ); + const unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS ); + const unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES ); + + const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image; + + _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width ); + _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height ); + _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x ); + _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y ); + _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z ); + + if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) { + + _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data ); + + } else { + + if ( srcTexture.isCompressedArrayTexture ) { + + console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' ); + _gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data ); + + } else { + + _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image ); + + } + + } + + _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen ); + _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight ); + _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels ); + _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows ); + _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages ); + + // Generate mipmaps only when copying level 0 + if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget ); + + state.unbindTexture(); + + }; + + this.initTexture = function ( texture ) { + + if ( texture.isCubeTexture ) { + + textures.setTextureCube( texture, 0 ); + + } else if ( texture.isData3DTexture ) { + + textures.setTexture3D( texture, 0 ); + + } else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) { + + textures.setTexture2DArray( texture, 0 ); + + } else { + + textures.setTexture2D( texture, 0 ); + + } + + state.unbindTexture(); + + }; + + this.resetState = function () { + + _currentActiveCubeFace = 0; + _currentActiveMipmapLevel = 0; + _currentRenderTarget = null; + + state.reset(); + bindingStates.reset(); + + }; + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); + + } + + } + + get coordinateSystem() { + + return WebGLCoordinateSystem; + + } + + get outputColorSpace() { + + return this._outputColorSpace; + + } + + set outputColorSpace( colorSpace ) { + + this._outputColorSpace = colorSpace; + + const gl = this.getContext(); + gl.drawingBufferColorSpace = colorSpace === DisplayP3ColorSpace ? 'display-p3' : 'srgb'; + gl.unpackColorSpace = ColorManagement.workingColorSpace === LinearDisplayP3ColorSpace ? 'display-p3' : 'srgb'; + + } + + get outputEncoding() { // @deprecated, r152 + + console.warn( 'THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.' ); + return this.outputColorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding; + + } + + set outputEncoding( encoding ) { // @deprecated, r152 + + console.warn( 'THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.' ); + this.outputColorSpace = encoding === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace; + + } + + get useLegacyLights() { // @deprecated, r155 + + console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' ); + return this._useLegacyLights; + + } + + set useLegacyLights( value ) { // @deprecated, r155 + + console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' ); + this._useLegacyLights = value; + + } + +} + +class WebGL1Renderer extends WebGLRenderer {} + +WebGL1Renderer.prototype.isWebGL1Renderer = true; + +class FogExp2 { + + constructor( color, density = 0.00025 ) { + + this.isFogExp2 = true; + + this.name = ''; + + this.color = new Color( color ); + this.density = density; + + } + + clone() { + + return new FogExp2( this.color, this.density ); + + } + + toJSON( /* meta */ ) { + + return { + type: 'FogExp2', + name: this.name, + color: this.color.getHex(), + density: this.density + }; + + } + +} + +class Fog { + + constructor( color, near = 1, far = 1000 ) { + + this.isFog = true; + + this.name = ''; + + this.color = new Color( color ); + + this.near = near; + this.far = far; + + } + + clone() { + + return new Fog( this.color, this.near, this.far ); + + } + + toJSON( /* meta */ ) { + + return { + type: 'Fog', + name: this.name, + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + } + +} + +class Scene extends Object3D { + + constructor() { + + super(); + + this.isScene = true; + + this.type = 'Scene'; + + this.background = null; + this.environment = null; + this.fog = null; + + this.backgroundBlurriness = 0; + this.backgroundIntensity = 1; + + this.overrideMaterial = null; + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.environment !== null ) this.environment = source.environment.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + + this.backgroundBlurriness = source.backgroundBlurriness; + this.backgroundIntensity = source.backgroundIntensity; + + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + if ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness; + if ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity; + + return data; + + } + +} + +class InterleavedBuffer { + + constructor( array, stride ) { + + this.isInterleavedBuffer = true; + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.usage = StaticDrawUsage; + this._updateRange = { offset: 0, count: - 1 }; + this.updateRanges = []; + + this.version = 0; + + this.uuid = generateUUID(); + + } + + onUploadCallback() {} + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + get updateRange() { + + console.warn( 'THREE.InterleavedBuffer: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159 + return this._updateRange; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + addUpdateRange( start, count ) { + + this.updateRanges.push( { start, count } ); + + } + + clearUpdateRanges() { + + this.updateRanges.length = 0; + + } + + copy( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.usage = source.usage; + + return this; + + } + + copyAt( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( let i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + } + + set( value, offset = 0 ) { + + this.array.set( value, offset ); + + return this; + + } + + clone( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer; + + } + + const array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] ); + + const ib = new this.constructor( array, this.stride ); + ib.setUsage( this.usage ); + + return ib; + + } + + onUpload( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + toJSON( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + // generate UUID for array buffer if necessary + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) ); + + } + + // + + return { + uuid: this.uuid, + buffer: this.array.buffer._uuid, + type: this.array.constructor.name, + stride: this.stride + }; + + } + +} + +const _vector$6 = /*@__PURE__*/ new Vector3(); + +class InterleavedBufferAttribute { + + constructor( interleavedBuffer, itemSize, offset, normalized = false ) { + + this.isInterleavedBufferAttribute = true; + + this.name = ''; + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized; + + } + + get count() { + + return this.data.count; + + } + + get array() { + + return this.data.array; + + } + + set needsUpdate( value ) { + + this.data.needsUpdate = value; + + } + + applyMatrix4( m ) { + + for ( let i = 0, l = this.data.count; i < l; i ++ ) { + + _vector$6.fromBufferAttribute( this, i ); + + _vector$6.applyMatrix4( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + } + + applyNormalMatrix( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$6.fromBufferAttribute( this, i ); + + _vector$6.applyNormalMatrix( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + } + + transformDirection( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$6.fromBufferAttribute( this, i ); + + _vector$6.transformDirection( m ); + + this.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z ); + + } + + return this; + + } + + setX( index, x ) { + + if ( this.normalized ) x = normalize( x, this.array ); + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + } + + setY( index, y ) { + + if ( this.normalized ) y = normalize( y, this.array ); + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + } + + setZ( index, z ) { + + if ( this.normalized ) z = normalize( z, this.array ); + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + } + + setW( index, w ) { + + if ( this.normalized ) w = normalize( w, this.array ); + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + } + + getX( index ) { + + let x = this.data.array[ index * this.data.stride + this.offset ]; + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; + + } + + getY( index ) { + + let y = this.data.array[ index * this.data.stride + this.offset + 1 ]; + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; + + } + + getZ( index ) { + + let z = this.data.array[ index * this.data.stride + this.offset + 2 ]; + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; + + } + + getW( index ) { + + let w = this.data.array[ index * this.data.stride + this.offset + 3 ]; + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; + + } + + setXY( index, x, y ) { + + index = index * this.data.stride + this.offset; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + } + + setXYZ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + clone( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + return new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized ); + + } else { + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.clone( data ); + + } + + return new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized ); + + } + + } + + toJSON( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + // de-interleave data and save it as an ordinary buffer attribute for now + + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: array, + normalized: this.normalized + }; + + } else { + + // save as true interleaved attribute + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data ); + + } + + return { + isInterleavedBufferAttribute: true, + itemSize: this.itemSize, + data: this.data.uuid, + offset: this.offset, + normalized: this.normalized + }; + + } + + } + +} + +class SpriteMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isSpriteMaterial = true; + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.transparent = true; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + this.fog = source.fog; + + return this; + + } + +} + +let _geometry; + +const _intersectPoint = /*@__PURE__*/ new Vector3(); +const _worldScale = /*@__PURE__*/ new Vector3(); +const _mvPosition = /*@__PURE__*/ new Vector3(); + +const _alignedPosition = /*@__PURE__*/ new Vector2(); +const _rotatedPosition = /*@__PURE__*/ new Vector2(); +const _viewWorldMatrix = /*@__PURE__*/ new Matrix4(); + +const _vA = /*@__PURE__*/ new Vector3(); +const _vB = /*@__PURE__*/ new Vector3(); +const _vC = /*@__PURE__*/ new Vector3(); + +const _uvA = /*@__PURE__*/ new Vector2(); +const _uvB = /*@__PURE__*/ new Vector2(); +const _uvC = /*@__PURE__*/ new Vector2(); + +class Sprite extends Object3D { + + constructor( material = new SpriteMaterial() ) { + + super(); + + this.isSprite = true; + + this.type = 'Sprite'; + + if ( _geometry === undefined ) { + + _geometry = new BufferGeometry(); + + const float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + const interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + _geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + _geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + _geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = _geometry; + this.material = material; + + this.center = new Vector2( 0.5, 0.5 ); + + } + + raycast( raycaster, intersects ) { + + if ( raycaster.camera === null ) { + + console.error( 'THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.' ); + + } + + _worldScale.setFromMatrixScale( this.matrixWorld ); + + _viewWorldMatrix.copy( raycaster.camera.matrixWorld ); + this.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld ); + + _mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + if ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) { + + _worldScale.multiplyScalar( - _mvPosition.z ); + + } + + const rotation = this.material.rotation; + let sin, cos; + + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + const center = this.center; + + transformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + transformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + transformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + + _uvA.set( 0, 0 ); + _uvB.set( 1, 0 ); + _uvC.set( 1, 1 ); + + // check first triangle + let intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos ); + _uvB.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + const distance = raycaster.ray.origin.distanceTo( _intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: _intersectPoint.clone(), + uv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ), + face: null, + object: this + + } ); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + this.material = source.material; + + return this; + + } + +} + +function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + _alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + _rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y ); + _rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y ); + + } else { + + _rotatedPosition.copy( _alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += _rotatedPosition.x; + vertexPosition.y += _rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( _viewWorldMatrix ); + +} + +const _v1$2 = /*@__PURE__*/ new Vector3(); +const _v2$1 = /*@__PURE__*/ new Vector3(); + +class LOD extends Object3D { + + constructor() { + + super(); + + this._currentLevel = 0; + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + }, + isLOD: { + value: true, + } + } ); + + this.autoUpdate = true; + + } + + copy( source ) { + + super.copy( source, false ); + + const levels = source.levels; + + for ( let i = 0, l = levels.length; i < l; i ++ ) { + + const level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance, level.hysteresis ); + + } + + this.autoUpdate = source.autoUpdate; + + return this; + + } + + addLevel( object, distance = 0, hysteresis = 0 ) { + + distance = Math.abs( distance ); + + const levels = this.levels; + + let l; + + for ( l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } ); + + this.add( object ); + + return this; + + } + + getCurrentLevel() { + + return this._currentLevel; + + } + + + + getObjectForDistance( distance ) { + + const levels = this.levels; + + if ( levels.length > 0 ) { + + let i, l; + + for ( i = 1, l = levels.length; i < l; i ++ ) { + + let levelDistance = levels[ i ].distance; + + if ( levels[ i ].object.visible ) { + + levelDistance -= levelDistance * levels[ i ].hysteresis; + + } + + if ( distance < levelDistance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + } + + return null; + + } + + raycast( raycaster, intersects ) { + + const levels = this.levels; + + if ( levels.length > 0 ) { + + _v1$2.setFromMatrixPosition( this.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _v1$2 ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + } + + } + + update( camera ) { + + const levels = this.levels; + + if ( levels.length > 1 ) { + + _v1$2.setFromMatrixPosition( camera.matrixWorld ); + _v2$1.setFromMatrixPosition( this.matrixWorld ); + + const distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom; + + levels[ 0 ].object.visible = true; + + let i, l; + + for ( i = 1, l = levels.length; i < l; i ++ ) { + + let levelDistance = levels[ i ].distance; + + if ( levels[ i ].object.visible ) { + + levelDistance -= levelDistance * levels[ i ].hysteresis; + + } + + if ( distance >= levelDistance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + this._currentLevel = i - 1; + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.autoUpdate === false ) data.object.autoUpdate = false; + + data.object.levels = []; + + const levels = this.levels; + + for ( let i = 0, l = levels.length; i < l; i ++ ) { + + const level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance, + hysteresis: level.hysteresis + } ); + + } + + return data; + + } + +} + +const _basePosition = /*@__PURE__*/ new Vector3(); + +const _skinIndex = /*@__PURE__*/ new Vector4(); +const _skinWeight = /*@__PURE__*/ new Vector4(); + +const _vector3 = /*@__PURE__*/ new Vector3(); +const _matrix4 = /*@__PURE__*/ new Matrix4(); +const _vertex = /*@__PURE__*/ new Vector3(); + +const _sphere$4 = /*@__PURE__*/ new Sphere(); +const _inverseMatrix$2 = /*@__PURE__*/ new Matrix4(); +const _ray$2 = /*@__PURE__*/ new Ray(); + +class SkinnedMesh extends Mesh { + + constructor( geometry, material ) { + + super( geometry, material ); + + this.isSkinnedMesh = true; + + this.type = 'SkinnedMesh'; + + this.bindMode = AttachedBindMode; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + this.boundingBox = null; + this.boundingSphere = null; + + } + + computeBoundingBox() { + + const geometry = this.geometry; + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.makeEmpty(); + + const positionAttribute = geometry.getAttribute( 'position' ); + + for ( let i = 0; i < positionAttribute.count; i ++ ) { + + this.getVertexPosition( i, _vertex ); + this.boundingBox.expandByPoint( _vertex ); + + } + + } + + computeBoundingSphere() { + + const geometry = this.geometry; + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.makeEmpty(); + + const positionAttribute = geometry.getAttribute( 'position' ); + + for ( let i = 0; i < positionAttribute.count; i ++ ) { + + this.getVertexPosition( i, _vertex ); + this.boundingSphere.expandByPoint( _vertex ); + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.bindMode = source.bindMode; + this.bindMatrix.copy( source.bindMatrix ); + this.bindMatrixInverse.copy( source.bindMatrixInverse ); + + this.skeleton = source.skeleton; + + if ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone(); + if ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone(); + + return this; + + } + + raycast( raycaster, intersects ) { + + const material = this.material; + const matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // test with bounding sphere in world space + + if ( this.boundingSphere === null ) this.computeBoundingSphere(); + + _sphere$4.copy( this.boundingSphere ); + _sphere$4.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return; + + // convert ray to local space of skinned mesh + + _inverseMatrix$2.copy( matrixWorld ).invert(); + _ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 ); + + // test with bounding box in local space + + if ( this.boundingBox !== null ) { + + if ( _ray$2.intersectsBox( this.boundingBox ) === false ) return; + + } + + // test for intersections with geometry + + this._computeIntersections( raycaster, intersects, _ray$2 ); + + } + + getVertexPosition( index, target ) { + + super.getVertexPosition( index, target ); + + this.applyBoneTransform( index, target ); + + return target; + + } + + bind( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.copy( bindMatrix ).invert(); + + } + + pose() { + + this.skeleton.pose(); + + } + + normalizeSkinWeights() { + + const vector = new Vector4(); + + const skinWeight = this.geometry.attributes.skinWeight; + + for ( let i = 0, l = skinWeight.count; i < l; i ++ ) { + + vector.fromBufferAttribute( skinWeight, i ); + + const scale = 1.0 / vector.manhattanLength(); + + if ( scale !== Infinity ) { + + vector.multiplyScalar( scale ); + + } else { + + vector.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w ); + + } + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + if ( this.bindMode === AttachedBindMode ) { + + this.bindMatrixInverse.copy( this.matrixWorld ).invert(); + + } else if ( this.bindMode === DetachedBindMode ) { + + this.bindMatrixInverse.copy( this.bindMatrix ).invert(); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + } + + applyBoneTransform( index, vector ) { + + const skeleton = this.skeleton; + const geometry = this.geometry; + + _skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index ); + _skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index ); + + _basePosition.copy( vector ).applyMatrix4( this.bindMatrix ); + + vector.set( 0, 0, 0 ); + + for ( let i = 0; i < 4; i ++ ) { + + const weight = _skinWeight.getComponent( i ); + + if ( weight !== 0 ) { + + const boneIndex = _skinIndex.getComponent( i ); + + _matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] ); + + vector.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight ); + + } + + } + + return vector.applyMatrix4( this.bindMatrixInverse ); + + } + + boneTransform( index, vector ) { // @deprecated, r151 + + console.warn( 'THREE.SkinnedMesh: .boneTransform() was renamed to .applyBoneTransform() in r151.' ); + return this.applyBoneTransform( index, vector ); + + } + + +} + +class Bone extends Object3D { + + constructor() { + + super(); + + this.isBone = true; + + this.type = 'Bone'; + + } + +} + +class DataTexture extends Texture { + + constructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) { + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ); + + this.isDataTexture = true; + + this.image = { data: data, width: width, height: height }; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + +} + +const _offsetMatrix = /*@__PURE__*/ new Matrix4(); +const _identityMatrix$1 = /*@__PURE__*/ new Matrix4(); + +class Skeleton { + + constructor( bones = [], boneInverses = [] ) { + + this.uuid = generateUUID(); + + this.bones = bones.slice( 0 ); + this.boneInverses = boneInverses; + this.boneMatrices = null; + + this.boneTexture = null; + + this.init(); + + } + + init() { + + const bones = this.bones; + const boneInverses = this.boneInverses; + + this.boneMatrices = new Float32Array( bones.length * 16 ); + + // calculate inverse bone matrices if necessary + + if ( boneInverses.length === 0 ) { + + this.calculateInverses(); + + } else { + + // handle special case + + if ( bones.length !== boneInverses.length ) { + + console.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' ); + + this.boneInverses = []; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + calculateInverses() { + + this.boneInverses.length = 0; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.copy( this.bones[ i ].matrixWorld ).invert(); + + } + + this.boneInverses.push( inverse ); + + } + + } + + pose() { + + // recover the bind-time world matrices + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.copy( this.boneInverses[ i ] ).invert(); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.copy( bone.parent.matrixWorld ).invert(); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + } + + update() { + + const bones = this.bones; + const boneInverses = this.boneInverses; + const boneMatrices = this.boneMatrices; + const boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( let i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + const matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix$1; + + _offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + _offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== null ) { + + boneTexture.needsUpdate = true; + + } + + } + + clone() { + + return new Skeleton( this.bones, this.boneInverses ); + + } + + computeBoneTexture() { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + let size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = Math.ceil( size / 4 ) * 4; + size = Math.max( size, 4 ); + + const boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( this.boneMatrices ); // copy current values + + const boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + this.boneMatrices = boneMatrices; + this.boneTexture = boneTexture; + + return this; + + } + + getBoneByName( name ) { + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + dispose( ) { + + if ( this.boneTexture !== null ) { + + this.boneTexture.dispose(); + + this.boneTexture = null; + + } + + } + + fromJSON( json, bones ) { + + this.uuid = json.uuid; + + for ( let i = 0, l = json.bones.length; i < l; i ++ ) { + + const uuid = json.bones[ i ]; + let bone = bones[ uuid ]; + + if ( bone === undefined ) { + + console.warn( 'THREE.Skeleton: No bone found with UUID:', uuid ); + bone = new Bone(); + + } + + this.bones.push( bone ); + this.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) ); + + } + + this.init(); + + return this; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.6, + type: 'Skeleton', + generator: 'Skeleton.toJSON' + }, + bones: [], + boneInverses: [] + }; + + data.uuid = this.uuid; + + const bones = this.bones; + const boneInverses = this.boneInverses; + + for ( let i = 0, l = bones.length; i < l; i ++ ) { + + const bone = bones[ i ]; + data.bones.push( bone.uuid ); + + const boneInverse = boneInverses[ i ]; + data.boneInverses.push( boneInverse.toArray() ); + + } + + return data; + + } + +} + +class InstancedBufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized, meshPerAttribute = 1 ) { + + super( array, itemSize, normalized ); + + this.isInstancedBufferAttribute = true; + + this.meshPerAttribute = meshPerAttribute; + + } + + copy( source ) { + + super.copy( source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.meshPerAttribute = this.meshPerAttribute; + + data.isInstancedBufferAttribute = true; + + return data; + + } + +} + +const _instanceLocalMatrix = /*@__PURE__*/ new Matrix4(); +const _instanceWorldMatrix = /*@__PURE__*/ new Matrix4(); + +const _instanceIntersects = []; + +const _box3 = /*@__PURE__*/ new Box3(); +const _identity = /*@__PURE__*/ new Matrix4(); +const _mesh$1 = /*@__PURE__*/ new Mesh(); +const _sphere$3 = /*@__PURE__*/ new Sphere(); + +class InstancedMesh extends Mesh { + + constructor( geometry, material, count ) { + + super( geometry, material ); + + this.isInstancedMesh = true; + + this.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 ); + this.instanceColor = null; + + this.count = count; + + this.boundingBox = null; + this.boundingSphere = null; + + for ( let i = 0; i < count; i ++ ) { + + this.setMatrixAt( i, _identity ); + + } + + } + + computeBoundingBox() { + + const geometry = this.geometry; + const count = this.count; + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + if ( geometry.boundingBox === null ) { + + geometry.computeBoundingBox(); + + } + + this.boundingBox.makeEmpty(); + + for ( let i = 0; i < count; i ++ ) { + + this.getMatrixAt( i, _instanceLocalMatrix ); + + _box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix ); + + this.boundingBox.union( _box3 ); + + } + + } + + computeBoundingSphere() { + + const geometry = this.geometry; + const count = this.count; + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + if ( geometry.boundingSphere === null ) { + + geometry.computeBoundingSphere(); + + } + + this.boundingSphere.makeEmpty(); + + for ( let i = 0; i < count; i ++ ) { + + this.getMatrixAt( i, _instanceLocalMatrix ); + + _sphere$3.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix ); + + this.boundingSphere.union( _sphere$3 ); + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.instanceMatrix.copy( source.instanceMatrix ); + + if ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone(); + + this.count = source.count; + + if ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone(); + if ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone(); + + return this; + + } + + getColorAt( index, color ) { + + color.fromArray( this.instanceColor.array, index * 3 ); + + } + + getMatrixAt( index, matrix ) { + + matrix.fromArray( this.instanceMatrix.array, index * 16 ); + + } + + raycast( raycaster, intersects ) { + + const matrixWorld = this.matrixWorld; + const raycastTimes = this.count; + + _mesh$1.geometry = this.geometry; + _mesh$1.material = this.material; + + if ( _mesh$1.material === undefined ) return; + + // test with bounding sphere first + + if ( this.boundingSphere === null ) this.computeBoundingSphere(); + + _sphere$3.copy( this.boundingSphere ); + _sphere$3.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return; + + // now test each instance + + for ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) { + + // calculate the world matrix for each instance + + this.getMatrixAt( instanceId, _instanceLocalMatrix ); + + _instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix ); + + // the mesh represents this single instance + + _mesh$1.matrixWorld = _instanceWorldMatrix; + + _mesh$1.raycast( raycaster, _instanceIntersects ); + + // process the result of raycast + + for ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) { + + const intersect = _instanceIntersects[ i ]; + intersect.instanceId = instanceId; + intersect.object = this; + intersects.push( intersect ); + + } + + _instanceIntersects.length = 0; + + } + + } + + setColorAt( index, color ) { + + if ( this.instanceColor === null ) { + + this.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 ); + + } + + color.toArray( this.instanceColor.array, index * 3 ); + + } + + setMatrixAt( index, matrix ) { + + matrix.toArray( this.instanceMatrix.array, index * 16 ); + + } + + updateMorphTargets() { + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +function sortOpaque( a, b ) { + + return a.z - b.z; + +} + +function sortTransparent( a, b ) { + + return b.z - a.z; + +} + +class MultiDrawRenderList { + + constructor() { + + this.index = 0; + this.pool = []; + this.list = []; + + } + + push( drawRange, z ) { + + const pool = this.pool; + const list = this.list; + if ( this.index >= pool.length ) { + + pool.push( { + + start: - 1, + count: - 1, + z: - 1, + + } ); + + } + + const item = pool[ this.index ]; + list.push( item ); + this.index ++; + + item.start = drawRange.start; + item.count = drawRange.count; + item.z = z; + + } + + reset() { + + this.list.length = 0; + this.index = 0; + + } + +} + +const ID_ATTR_NAME = 'batchId'; +const _matrix = /*@__PURE__*/ new Matrix4(); +const _invMatrixWorld = /*@__PURE__*/ new Matrix4(); +const _identityMatrix = /*@__PURE__*/ new Matrix4(); +const _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4(); +const _frustum = /*@__PURE__*/ new Frustum(); +const _box$1 = /*@__PURE__*/ new Box3(); +const _sphere$2 = /*@__PURE__*/ new Sphere(); +const _vector$5 = /*@__PURE__*/ new Vector3(); +const _renderList = /*@__PURE__*/ new MultiDrawRenderList(); +const _mesh = /*@__PURE__*/ new Mesh(); +const _batchIntersects = []; + +// @TODO: SkinnedMesh support? +// @TODO: geometry.groups support? +// @TODO: geometry.drawRange support? +// @TODO: geometry.morphAttributes support? +// @TODO: Support uniform parameter per geometry +// @TODO: Add an "optimize" function to pack geometry and remove data gaps + +// copies data from attribute "src" into "target" starting at "targetOffset" +function copyAttributeData( src, target, targetOffset = 0 ) { + + const itemSize = target.itemSize; + if ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) { + + // use the component getters and setters if the array data cannot + // be copied directly + const vertexCount = src.count; + for ( let i = 0; i < vertexCount; i ++ ) { + + for ( let c = 0; c < itemSize; c ++ ) { + + target.setComponent( i + targetOffset, c, src.getComponent( i, c ) ); + + } + + } + + } else { + + // faster copy approach using typed array set function + target.array.set( src.array, targetOffset * itemSize ); + + } + + target.needsUpdate = true; + +} + +class BatchedMesh extends Mesh { + + get maxGeometryCount() { + + return this._maxGeometryCount; + + } + + constructor( maxGeometryCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) { + + super( new BufferGeometry(), material ); + + this.isBatchedMesh = true; + this.perObjectFrustumCulled = true; + this.sortObjects = true; + this.boundingBox = null; + this.boundingSphere = null; + this.customSort = null; + + this._drawRanges = []; + this._reservedRanges = []; + + this._visibility = []; + this._active = []; + this._bounds = []; + + this._maxGeometryCount = maxGeometryCount; + this._maxVertexCount = maxVertexCount; + this._maxIndexCount = maxIndexCount; + + this._geometryInitialized = false; + this._geometryCount = 0; + this._multiDrawCounts = new Int32Array( maxGeometryCount ); + this._multiDrawStarts = new Int32Array( maxGeometryCount ); + this._multiDrawCount = 0; + this._visibilityChanged = true; + + // Local matrix per geometry by using data texture + this._matricesTexture = null; + + this._initMatricesTexture(); + + } + + _initMatricesTexture() { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64) + + let size = Math.sqrt( this._maxGeometryCount * 4 ); // 4 pixels needed for 1 matrix + size = Math.ceil( size / 4 ) * 4; + size = Math.max( size, 4 ); + + const matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + const matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType ); + + this._matricesTexture = matricesTexture; + + } + + _initializeGeometry( reference ) { + + const geometry = this.geometry; + const maxVertexCount = this._maxVertexCount; + const maxGeometryCount = this._maxGeometryCount; + const maxIndexCount = this._maxIndexCount; + if ( this._geometryInitialized === false ) { + + for ( const attributeName in reference.attributes ) { + + const srcAttribute = reference.getAttribute( attributeName ); + const { array, itemSize, normalized } = srcAttribute; + + const dstArray = new array.constructor( maxVertexCount * itemSize ); + const dstAttribute = new srcAttribute.constructor( dstArray, itemSize, normalized ); + dstAttribute.setUsage( srcAttribute.usage ); + + geometry.setAttribute( attributeName, dstAttribute ); + + } + + if ( reference.getIndex() !== null ) { + + const indexArray = maxVertexCount > 65536 + ? new Uint32Array( maxIndexCount ) + : new Uint16Array( maxIndexCount ); + + geometry.setIndex( new BufferAttribute( indexArray, 1 ) ); + + } + + const idArray = maxGeometryCount > 65536 + ? new Uint32Array( maxVertexCount ) + : new Uint16Array( maxVertexCount ); + geometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) ); + + this._geometryInitialized = true; + + } + + } + + // Make sure the geometry is compatible with the existing combined geometry atributes + _validateGeometry( geometry ) { + + // check that the geometry doesn't have a version of our reserved id attribute + if ( geometry.getAttribute( ID_ATTR_NAME ) ) { + + throw new Error( `BatchedMesh: Geometry cannot use attribute "${ ID_ATTR_NAME }"` ); + + } + + // check to ensure the geometries are using consistent attributes and indices + const batchGeometry = this.geometry; + if ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) { + + throw new Error( 'BatchedMesh: All geometries must consistently have "index".' ); + + } + + for ( const attributeName in batchGeometry.attributes ) { + + if ( attributeName === ID_ATTR_NAME ) { + + continue; + + } + + if ( ! geometry.hasAttribute( attributeName ) ) { + + throw new Error( `BatchedMesh: Added geometry missing "${ attributeName }". All geometries must have consistent attributes.` ); + + } + + const srcAttribute = geometry.getAttribute( attributeName ); + const dstAttribute = batchGeometry.getAttribute( attributeName ); + if ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) { + + throw new Error( 'BatchedMesh: All attributes must have a consistent itemSize and normalized value.' ); + + } + + } + + } + + setCustomSort( func ) { + + this.customSort = func; + return this; + + } + + computeBoundingBox() { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + const geometryCount = this._geometryCount; + const boundingBox = this.boundingBox; + const active = this._active; + + boundingBox.makeEmpty(); + for ( let i = 0; i < geometryCount; i ++ ) { + + if ( active[ i ] === false ) continue; + + this.getMatrixAt( i, _matrix ); + this.getBoundingBoxAt( i, _box$1 ).applyMatrix4( _matrix ); + boundingBox.union( _box$1 ); + + } + + } + + computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + const geometryCount = this._geometryCount; + const boundingSphere = this.boundingSphere; + const active = this._active; + + boundingSphere.makeEmpty(); + for ( let i = 0; i < geometryCount; i ++ ) { + + if ( active[ i ] === false ) continue; + + this.getMatrixAt( i, _matrix ); + this.getBoundingSphereAt( i, _sphere$2 ).applyMatrix4( _matrix ); + boundingSphere.union( _sphere$2 ); + + } + + } + + addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) { + + this._initializeGeometry( geometry ); + + this._validateGeometry( geometry ); + + // ensure we're not over geometry + if ( this._geometryCount >= this._maxGeometryCount ) { + + throw new Error( 'BatchedMesh: Maximum geometry count reached.' ); + + } + + // get the necessary range fo the geometry + const reservedRange = { + vertexStart: - 1, + vertexCount: - 1, + indexStart: - 1, + indexCount: - 1, + }; + + let lastRange = null; + const reservedRanges = this._reservedRanges; + const drawRanges = this._drawRanges; + const bounds = this._bounds; + if ( this._geometryCount !== 0 ) { + + lastRange = reservedRanges[ reservedRanges.length - 1 ]; + + } + + if ( vertexCount === - 1 ) { + + reservedRange.vertexCount = geometry.getAttribute( 'position' ).count; + + } else { + + reservedRange.vertexCount = vertexCount; + + } + + if ( lastRange === null ) { + + reservedRange.vertexStart = 0; + + } else { + + reservedRange.vertexStart = lastRange.vertexStart + lastRange.vertexCount; + + } + + const index = geometry.getIndex(); + const hasIndex = index !== null; + if ( hasIndex ) { + + if ( indexCount === - 1 ) { + + reservedRange.indexCount = index.count; + + } else { + + reservedRange.indexCount = indexCount; + + } + + if ( lastRange === null ) { + + reservedRange.indexStart = 0; + + } else { + + reservedRange.indexStart = lastRange.indexStart + lastRange.indexCount; + + } + + } + + if ( + reservedRange.indexStart !== - 1 && + reservedRange.indexStart + reservedRange.indexCount > this._maxIndexCount || + reservedRange.vertexStart + reservedRange.vertexCount > this._maxVertexCount + ) { + + throw new Error( 'BatchedMesh: Reserved space request exceeds the maximum buffer size.' ); + + } + + const visibility = this._visibility; + const active = this._active; + const matricesTexture = this._matricesTexture; + const matricesArray = this._matricesTexture.image.data; + + // push new visibility states + visibility.push( true ); + active.push( true ); + + // update id + const geometryId = this._geometryCount; + this._geometryCount ++; + + // initialize matrix information + _identityMatrix.toArray( matricesArray, geometryId * 16 ); + matricesTexture.needsUpdate = true; + + // add the reserved range and draw range objects + reservedRanges.push( reservedRange ); + drawRanges.push( { + start: hasIndex ? reservedRange.indexStart : reservedRange.vertexStart, + count: - 1 + } ); + bounds.push( { + boxInitialized: false, + box: new Box3(), + + sphereInitialized: false, + sphere: new Sphere() + } ); + + // set the id for the geometry + const idAttribute = this.geometry.getAttribute( ID_ATTR_NAME ); + for ( let i = 0; i < reservedRange.vertexCount; i ++ ) { + + idAttribute.setX( reservedRange.vertexStart + i, geometryId ); + + } + + idAttribute.needsUpdate = true; + + // update the geometry + this.setGeometryAt( geometryId, geometry ); + + return geometryId; + + } + + setGeometryAt( id, geometry ) { + + if ( id >= this._geometryCount ) { + + throw new Error( 'BatchedMesh: Maximum geometry count reached.' ); + + } + + this._validateGeometry( geometry ); + + const batchGeometry = this.geometry; + const hasIndex = batchGeometry.getIndex() !== null; + const dstIndex = batchGeometry.getIndex(); + const srcIndex = geometry.getIndex(); + const reservedRange = this._reservedRanges[ id ]; + if ( + hasIndex && + srcIndex.count > reservedRange.indexCount || + geometry.attributes.position.count > reservedRange.vertexCount + ) { + + throw new Error( 'BatchedMesh: Reserved space not large enough for provided geometry.' ); + + } + + // copy geometry over + const vertexStart = reservedRange.vertexStart; + const vertexCount = reservedRange.vertexCount; + for ( const attributeName in batchGeometry.attributes ) { + + if ( attributeName === ID_ATTR_NAME ) { + + continue; + + } + + // copy attribute data + const srcAttribute = geometry.getAttribute( attributeName ); + const dstAttribute = batchGeometry.getAttribute( attributeName ); + copyAttributeData( srcAttribute, dstAttribute, vertexStart ); + + // fill the rest in with zeroes + const itemSize = srcAttribute.itemSize; + for ( let i = srcAttribute.count, l = vertexCount; i < l; i ++ ) { + + const index = vertexStart + i; + for ( let c = 0; c < itemSize; c ++ ) { + + dstAttribute.setComponent( index, c, 0 ); + + } + + } + + dstAttribute.needsUpdate = true; + + } + + // copy index + if ( hasIndex ) { + + const indexStart = reservedRange.indexStart; + + // copy index data over + for ( let i = 0; i < srcIndex.count; i ++ ) { + + dstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) ); + + } + + // fill the rest in with zeroes + for ( let i = srcIndex.count, l = reservedRange.indexCount; i < l; i ++ ) { + + dstIndex.setX( indexStart + i, vertexStart ); + + } + + dstIndex.needsUpdate = true; + + } + + // store the bounding boxes + const bound = this._bounds[ id ]; + if ( geometry.boundingBox !== null ) { + + bound.box.copy( geometry.boundingBox ); + bound.boxInitialized = true; + + } else { + + bound.boxInitialized = false; + + } + + if ( geometry.boundingSphere !== null ) { + + bound.sphere.copy( geometry.boundingSphere ); + bound.sphereInitialized = true; + + } else { + + bound.sphereInitialized = false; + + } + + // set drawRange count + const drawRange = this._drawRanges[ id ]; + const posAttr = geometry.getAttribute( 'position' ); + drawRange.count = hasIndex ? srcIndex.count : posAttr.count; + this._visibilityChanged = true; + + return id; + + } + + deleteGeometry( geometryId ) { + + // Note: User needs to call optimize() afterward to pack the data. + + const active = this._active; + if ( geometryId >= active.length || active[ geometryId ] === false ) { + + return this; + + } + + active[ geometryId ] = false; + this._visibilityChanged = true; + + return this; + + } + + // get bounding box and compute it if it doesn't exist + getBoundingBoxAt( id, target ) { + + const active = this._active; + if ( active[ id ] === false ) { + + return this; + + } + + // compute bounding box + const bound = this._bounds[ id ]; + const box = bound.box; + const geometry = this.geometry; + if ( bound.boxInitialized === false ) { + + box.makeEmpty(); + + const index = geometry.index; + const position = geometry.attributes.position; + const drawRange = this._drawRanges[ id ]; + for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) { + + let iv = i; + if ( index ) { + + iv = index.getX( iv ); + + } + + box.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) ); + + } + + bound.boxInitialized = true; + + } + + target.copy( box ); + return target; + + } + + // get bounding sphere and compute it if it doesn't exist + getBoundingSphereAt( id, target ) { + + const active = this._active; + if ( active[ id ] === false ) { + + return this; + + } + + // compute bounding sphere + const bound = this._bounds[ id ]; + const sphere = bound.sphere; + const geometry = this.geometry; + if ( bound.sphereInitialized === false ) { + + sphere.makeEmpty(); + + this.getBoundingBoxAt( id, _box$1 ); + _box$1.getCenter( sphere.center ); + + const index = geometry.index; + const position = geometry.attributes.position; + const drawRange = this._drawRanges[ id ]; + + let maxRadiusSq = 0; + for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) { + + let iv = i; + if ( index ) { + + iv = index.getX( iv ); + + } + + _vector$5.fromBufferAttribute( position, iv ); + maxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) ); + + } + + sphere.radius = Math.sqrt( maxRadiusSq ); + bound.sphereInitialized = true; + + } + + target.copy( sphere ); + return target; + + } + + setMatrixAt( geometryId, matrix ) { + + // @TODO: Map geometryId to index of the arrays because + // optimize() can make geometryId mismatch the index + + const active = this._active; + const matricesTexture = this._matricesTexture; + const matricesArray = this._matricesTexture.image.data; + const geometryCount = this._geometryCount; + if ( geometryId >= geometryCount || active[ geometryId ] === false ) { + + return this; + + } + + matrix.toArray( matricesArray, geometryId * 16 ); + matricesTexture.needsUpdate = true; + + return this; + + } + + getMatrixAt( geometryId, matrix ) { + + const active = this._active; + const matricesArray = this._matricesTexture.image.data; + const geometryCount = this._geometryCount; + if ( geometryId >= geometryCount || active[ geometryId ] === false ) { + + return null; + + } + + return matrix.fromArray( matricesArray, geometryId * 16 ); + + } + + setVisibleAt( geometryId, value ) { + + const visibility = this._visibility; + const active = this._active; + const geometryCount = this._geometryCount; + + // if the geometry is out of range, not active, or visibility state + // does not change then return early + if ( + geometryId >= geometryCount || + active[ geometryId ] === false || + visibility[ geometryId ] === value + ) { + + return this; + + } + + visibility[ geometryId ] = value; + this._visibilityChanged = true; + + return this; + + } + + getVisibleAt( geometryId ) { + + const visibility = this._visibility; + const active = this._active; + const geometryCount = this._geometryCount; + + // return early if the geometry is out of range or not active + if ( geometryId >= geometryCount || active[ geometryId ] === false ) { + + return false; + + } + + return visibility[ geometryId ]; + + } + + raycast( raycaster, intersects ) { + + const visibility = this._visibility; + const active = this._active; + const drawRanges = this._drawRanges; + const geometryCount = this._geometryCount; + const matrixWorld = this.matrixWorld; + const batchGeometry = this.geometry; + + // iterate over each geometry + _mesh.material = this.material; + _mesh.geometry.index = batchGeometry.index; + _mesh.geometry.attributes = batchGeometry.attributes; + if ( _mesh.geometry.boundingBox === null ) { + + _mesh.geometry.boundingBox = new Box3(); + + } + + if ( _mesh.geometry.boundingSphere === null ) { + + _mesh.geometry.boundingSphere = new Sphere(); + + } + + for ( let i = 0; i < geometryCount; i ++ ) { + + if ( ! visibility[ i ] || ! active[ i ] ) { + + continue; + + } + + const drawRange = drawRanges[ i ]; + _mesh.geometry.setDrawRange( drawRange.start, drawRange.count ); + + // ge the intersects + this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld ); + this.getBoundingBoxAt( i, _mesh.geometry.boundingBox ); + this.getBoundingSphereAt( i, _mesh.geometry.boundingSphere ); + _mesh.raycast( raycaster, _batchIntersects ); + + // add batch id to the intersects + for ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) { + + const intersect = _batchIntersects[ j ]; + intersect.object = this; + intersect.batchId = i; + intersects.push( intersect ); + + } + + _batchIntersects.length = 0; + + } + + _mesh.material = null; + _mesh.geometry.index = null; + _mesh.geometry.attributes = {}; + _mesh.geometry.setDrawRange( 0, Infinity ); + + } + + copy( source ) { + + super.copy( source ); + + this.geometry = source.geometry.clone(); + this.perObjectFrustumCulled = source.perObjectFrustumCulled; + this.sortObjects = source.sortObjects; + this.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null; + this.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null; + + this._drawRanges = source._drawRanges.map( range => ( { ...range } ) ); + this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) ); + + this._visibility = source._visibility.slice(); + this._active = source._active.slice(); + this._bounds = source._bounds.map( bound => ( { + boxInitialized: bound.boxInitialized, + box: bound.box.clone(), + + sphereInitialized: bound.sphereInitialized, + sphere: bound.sphere.clone() + } ) ); + + this._maxGeometryCount = source._maxGeometryCount; + this._maxVertexCount = source._maxVertexCount; + this._maxIndexCount = source._maxIndexCount; + + this._geometryInitialized = source._geometryInitialized; + this._geometryCount = source._geometryCount; + this._multiDrawCounts = source._multiDrawCounts.slice(); + this._multiDrawStarts = source._multiDrawStarts.slice(); + + this._matricesTexture = source._matricesTexture.clone(); + this._matricesTexture.image.data = this._matricesTexture.image.slice(); + + return this; + + } + + dispose() { + + // Assuming the geometry is not shared with other meshes + this.geometry.dispose(); + + this._matricesTexture.dispose(); + this._matricesTexture = null; + return this; + + } + + onBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) { + + // if visibility has not changed and frustum culling and object sorting is not required + // then skip iterating over all items + if ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) { + + return; + + } + + // the indexed version of the multi draw function requires specifying the start + // offset in bytes. + const index = geometry.getIndex(); + const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT; + + const visibility = this._visibility; + const multiDrawStarts = this._multiDrawStarts; + const multiDrawCounts = this._multiDrawCounts; + const drawRanges = this._drawRanges; + const perObjectFrustumCulled = this.perObjectFrustumCulled; + + // prepare the frustum in the local frame + if ( perObjectFrustumCulled ) { + + _projScreenMatrix$2 + .multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ) + .multiply( this.matrixWorld ); + _frustum.setFromProjectionMatrix( + _projScreenMatrix$2, + renderer.isWebGPURenderer ? WebGPUCoordinateSystem : WebGLCoordinateSystem + ); + + } + + let count = 0; + if ( this.sortObjects ) { + + // get the camera position in the local frame + _invMatrixWorld.copy( this.matrixWorld ).invert(); + _vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld ); + + for ( let i = 0, l = visibility.length; i < l; i ++ ) { + + if ( visibility[ i ] ) { + + // get the bounds in world space + this.getMatrixAt( i, _matrix ); + this.getBoundingSphereAt( i, _sphere$2 ).applyMatrix4( _matrix ); + + // determine whether the batched geometry is within the frustum + let culled = false; + if ( perObjectFrustumCulled ) { + + culled = ! _frustum.intersectsSphere( _sphere$2 ); + + } + + if ( ! culled ) { + + // get the distance from camera used for sorting + const z = _vector$5.distanceTo( _sphere$2.center ); + _renderList.push( drawRanges[ i ], z ); + + } + + } + + } + + // Sort the draw ranges and prep for rendering + const list = _renderList.list; + const customSort = this.customSort; + if ( customSort === null ) { + + list.sort( material.transparent ? sortTransparent : sortOpaque ); + + } else { + + customSort.call( this, list, camera ); + + } + + for ( let i = 0, l = list.length; i < l; i ++ ) { + + const item = list[ i ]; + multiDrawStarts[ count ] = item.start * bytesPerElement; + multiDrawCounts[ count ] = item.count; + count ++; + + } + + _renderList.reset(); + + } else { + + for ( let i = 0, l = visibility.length; i < l; i ++ ) { + + if ( visibility[ i ] ) { + + // determine whether the batched geometry is within the frustum + let culled = false; + if ( perObjectFrustumCulled ) { + + // get the bounds in world space + this.getMatrixAt( i, _matrix ); + this.getBoundingSphereAt( i, _sphere$2 ).applyMatrix4( _matrix ); + culled = ! _frustum.intersectsSphere( _sphere$2 ); + + } + + if ( ! culled ) { + + const range = drawRanges[ i ]; + multiDrawStarts[ count ] = range.start * bytesPerElement; + multiDrawCounts[ count ] = range.count; + count ++; + + } + + } + + } + + } + + this._multiDrawCount = count; + this._visibilityChanged = false; + + } + + onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) { + + this.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial ); + + } + +} + +class LineBasicMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isLineBasicMaterial = true; + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.fog = true; + + this.setValues( parameters ); + + } + + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + this.fog = source.fog; + + return this; + + } + +} + +const _start$1 = /*@__PURE__*/ new Vector3(); +const _end$1 = /*@__PURE__*/ new Vector3(); +const _inverseMatrix$1 = /*@__PURE__*/ new Matrix4(); +const _ray$1 = /*@__PURE__*/ new Ray(); +const _sphere$1 = /*@__PURE__*/ new Sphere(); + +class Line extends Object3D { + + constructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) { + + super(); + + this.isLine = true; + + this.type = 'Line'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.material = Array.isArray( source.material ) ? source.material.slice() : source.material; + this.geometry = source.geometry; + + return this; + + } + + computeLineDistances() { + + const geometry = this.geometry; + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = [ 0 ]; + + for ( let i = 1, l = positionAttribute.count; i < l; i ++ ) { + + _start$1.fromBufferAttribute( positionAttribute, i - 1 ); + _end$1.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += _start$1.distanceTo( _end$1 ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + return this; + + } + + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Line.threshold; + const drawRange = geometry.drawRange; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$1.copy( geometry.boundingSphere ); + _sphere$1.applyMatrix4( matrixWorld ); + _sphere$1.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return; + + // + + _inverseMatrix$1.copy( matrixWorld ).invert(); + _ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + const vStart = new Vector3(); + const vEnd = new Vector3(); + const interSegment = new Vector3(); + const interRay = new Vector3(); + const step = this.isLineSegments ? 2 : 1; + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end - 1; i < l; i += step ) { + + const a = index.getX( i ); + const b = index.getX( i + 1 ); + + vStart.fromBufferAttribute( positionAttribute, a ); + vEnd.fromBufferAttribute( positionAttribute, b ); + + const distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end - 1; i < l; i += step ) { + + vStart.fromBufferAttribute( positionAttribute, i ); + vEnd.fromBufferAttribute( positionAttribute, i + 1 ); + + const distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localThresholdSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } + + updateMorphTargets() { + + const geometry = this.geometry; + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } + +} + +const _start = /*@__PURE__*/ new Vector3(); +const _end = /*@__PURE__*/ new Vector3(); + +class LineSegments extends Line { + + constructor( geometry, material ) { + + super( geometry, material ); + + this.isLineSegments = true; + + this.type = 'LineSegments'; + + } + + computeLineDistances() { + + const geometry = this.geometry; + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = []; + + for ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + _start.fromBufferAttribute( positionAttribute, i ); + _end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + return this; + + } + +} + +class LineLoop extends Line { + + constructor( geometry, material ) { + + super( geometry, material ); + + this.isLineLoop = true; + + this.type = 'LineLoop'; + + } + +} + +class PointsMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isPointsMaterial = true; + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.fog = source.fog; + + return this; + + } + +} + +const _inverseMatrix = /*@__PURE__*/ new Matrix4(); +const _ray = /*@__PURE__*/ new Ray(); +const _sphere = /*@__PURE__*/ new Sphere(); +const _position$2 = /*@__PURE__*/ new Vector3(); + +class Points extends Object3D { + + constructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) { + + super(); + + this.isPoints = true; + + this.type = 'Points'; + + this.geometry = geometry; + this.material = material; + + this.updateMorphTargets(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.material = Array.isArray( source.material ) ? source.material.slice() : source.material; + this.geometry = source.geometry; + + return this; + + } + + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Points.threshold; + const drawRange = geometry.drawRange; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ); + _sphere.applyMatrix4( matrixWorld ); + _sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere ) === false ) return; + + // + + _inverseMatrix.copy( matrixWorld ).invert(); + _ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i ++ ) { + + const a = index.getX( i ); + + _position$2.fromBufferAttribute( positionAttribute, a ); + + testPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end; i < l; i ++ ) { + + _position$2.fromBufferAttribute( positionAttribute, i ); + + testPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } + + } + + updateMorphTargets() { + + const geometry = this.geometry; + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } + +} + +function testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) { + + const rayPointDistanceSq = _ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + const intersectPoint = new Vector3(); + + _ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint, + index: index, + face: null, + object: object + + } ); + + } + +} + +class VideoTexture extends Texture { + + constructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + super( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.isVideoTexture = true; + + this.minFilter = minFilter !== undefined ? minFilter : LinearFilter; + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + + this.generateMipmaps = false; + + const scope = this; + + function updateVideo() { + + scope.needsUpdate = true; + video.requestVideoFrameCallback( updateVideo ); + + } + + if ( 'requestVideoFrameCallback' in video ) { + + video.requestVideoFrameCallback( updateVideo ); + + } + + } + + clone() { + + return new this.constructor( this.image ).copy( this ); + + } + + update() { + + const video = this.image; + const hasVideoFrameCallback = 'requestVideoFrameCallback' in video; + + if ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + +} + +class FramebufferTexture extends Texture { + + constructor( width, height ) { + + super( { width, height } ); + + this.isFramebufferTexture = true; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.generateMipmaps = false; + + this.needsUpdate = true; + + } + +} + +class CompressedTexture extends Texture { + + constructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) { + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ); + + this.isCompressedTexture = true; + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + +} + +class CompressedArrayTexture extends CompressedTexture { + + constructor( mipmaps, width, height, depth, format, type ) { + + super( mipmaps, width, height, format, type ); + + this.isCompressedArrayTexture = true; + this.image.depth = depth; + this.wrapR = ClampToEdgeWrapping; + + } + +} + +class CompressedCubeTexture extends CompressedTexture { + + constructor( images, format, type ) { + + super( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping ); + + this.isCompressedCubeTexture = true; + this.isCubeTexture = true; + + this.image = images; + + } + +} + +class CanvasTexture extends Texture { + + constructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + super( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.isCanvasTexture = true; + + this.needsUpdate = true; + + } + +} + +/** + * Extensible curve object. + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + +class Curve { + + constructor() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + } + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + } + + // Get sequence of points using getPoint( t ) + + getPoints( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + } + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + } + + // Get total curve arc length + + getLength() { + + const lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + } + + // Get list of cumulative segment lengths + + getLengths( divisions = this.arcLengthDivisions ) { + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + const cache = []; + let current, last = this.getPoint( 0 ); + let sum = 0; + + cache.push( 0 ); + + for ( let p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + } + + updateArcLengths() { + + this.needsUpdate = true; + this.getLengths(); + + } + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping( u, distance ) { + + const arcLengths = this.getLengths(); + + let i = 0; + const il = arcLengths.length; + + let targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + let low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + const lengthBefore = arcLengths[ i ]; + const lengthAfter = arcLengths[ i + 1 ]; + + const segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + const segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + const t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + } + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent( t, optionalTarget ) { + + const delta = 0.0001; + let t1 = t - delta; + let t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + const pt1 = this.getPoint( t1 ); + const pt2 = this.getPoint( t2 ); + + const tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() ); + + tangent.copy( pt2 ).sub( pt1 ).normalize(); + + return tangent; + + } + + getTangentAt( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getTangent( t, optionalTarget ); + + } + + computeFrenetFrames( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + const normal = new Vector3(); + + const tangents = []; + const normals = []; + const binormals = []; + + const vec = new Vector3(); + const mat = new Matrix4(); + + // compute the tangent vectors for each segment on the curve + + for ( let i = 0; i <= segments; i ++ ) { + + const u = i / segments; + + tangents[ i ] = this.getTangentAt( u, new Vector3() ); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + let min = Number.MAX_VALUE; + const tx = Math.abs( tangents[ 0 ].x ); + const ty = Math.abs( tangents[ 0 ].y ); + const tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( let i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + const theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + let theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( let i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.6, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + } + + fromJSON( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + +} + +class EllipseCurve extends Curve { + + constructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) { + + super(); + + this.isEllipseCurve = true; + + this.type = 'EllipseCurve'; + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation; + + } + + getPoint( t, optionalTarget ) { + + const point = optionalTarget || new Vector2(); + + const twoPi = Math.PI * 2; + let deltaAngle = this.aEndAngle - this.aStartAngle; + const samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + const angle = this.aStartAngle + t * deltaAngle; + let x = this.aX + this.xRadius * Math.cos( angle ); + let y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + const cos = Math.cos( this.aRotation ); + const sin = Math.sin( this.aRotation ); + + const tx = x - this.aX; + const ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + } + + copy( source ) { + + super.copy( source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + } + +} + +class ArcCurve extends EllipseCurve { + + constructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + super( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.isArcCurve = true; + + this.type = 'ArcCurve'; + + } + +} + +/** + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + +/* +Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + +This CubicPoly class could be used for reusing some variables and calculations, +but for three.js curve use, it could be possible inlined and flatten into a single function call +which can be placed in CurveUtils. +*/ + +function CubicPoly() { + + let c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + let t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + let t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + const t2 = t * t; + const t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + +} + +// + +const tmp = /*@__PURE__*/ new Vector3(); +const px = /*@__PURE__*/ new CubicPoly(); +const py = /*@__PURE__*/ new CubicPoly(); +const pz = /*@__PURE__*/ new CubicPoly(); + +class CatmullRomCurve3 extends Curve { + + constructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) { + + super(); + + this.isCatmullRomCurve3 = true; + + this.type = 'CatmullRomCurve3'; + + this.points = points; + this.closed = closed; + this.curveType = curveType; + this.tension = tension; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const points = this.points; + const l = points.length; + + const p = ( l - ( this.closed ? 0 : 1 ) ) * t; + let intPoint = Math.floor( p ); + let weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + let p0, p3; // 4 points (p1 & p2 defined below) + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + const p1 = points[ intPoint % l ]; + const p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + const pow = this.curveType === 'chordal' ? 0.5 : 0.25; + let dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + let dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + let dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + } + +} + +/** + * Bezier Curves formulas obtained from + * https://en.wikipedia.org/wiki/B%C3%A9zier_curve + */ + +function CatmullRom( t, p0, p1, p2, p3 ) { + + const v0 = ( p2 - p0 ) * 0.5; + const v1 = ( p3 - p1 ) * 0.5; + const t2 = t * t; + const t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + +} + +// + +function QuadraticBezierP0( t, p ) { + + const k = 1 - t; + return k * k * p; + +} + +function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + +} + +function QuadraticBezierP2( t, p ) { + + return t * t * p; + +} + +function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + +} + +// + +function CubicBezierP0( t, p ) { + + const k = 1 - t; + return k * k * k * p; + +} + +function CubicBezierP1( t, p ) { + + const k = 1 - t; + return 3 * k * k * t * p; + +} + +function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + +} + +function CubicBezierP3( t, p ) { + + return t * t * t * p; + +} + +function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + +} + +class CubicBezierCurve extends Curve { + + constructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) { + + super(); + + this.isCubicBezierCurve = true; + + this.type = 'CubicBezierCurve'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + } + +} + +class CubicBezierCurve3 extends Curve { + + constructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) { + + super(); + + this.isCubicBezierCurve3 = true; + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + } + +} + +class LineCurve extends Curve { + + constructor( v1 = new Vector2(), v2 = new Vector2() ) { + + super(); + + this.isLineCurve = true; + + this.type = 'LineCurve'; + + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + } + + // Line curve is linear, so we can overwrite default getPointAt + getPointAt( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + } + + getTangent( t, optionalTarget = new Vector2() ) { + + return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + + } + + getTangentAt( u, optionalTarget ) { + + return this.getTangent( u, optionalTarget ); + + } + + copy( source ) { + + super.copy( source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +class LineCurve3 extends Curve { + + constructor( v1 = new Vector3(), v2 = new Vector3() ) { + + super(); + + this.isLineCurve3 = true; + + this.type = 'LineCurve3'; + + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + } + + // Line curve is linear, so we can overwrite default getPointAt + getPointAt( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + } + + getTangent( t, optionalTarget = new Vector3() ) { + + return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + + } + + getTangentAt( u, optionalTarget ) { + + return this.getTangent( u, optionalTarget ); + + } + + copy( source ) { + + super.copy( source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +class QuadraticBezierCurve extends Curve { + + constructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) { + + super(); + + this.isQuadraticBezierCurve = true; + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +class QuadraticBezierCurve3 extends Curve { + + constructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) { + + super(); + + this.isQuadraticBezierCurve3 = true; + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +class SplineCurve extends Curve { + + constructor( points = [] ) { + + super(); + + this.isSplineCurve = true; + + this.type = 'SplineCurve'; + + this.points = points; + + } + + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const points = this.points; + const p = ( points.length - 1 ) * t; + + const intPoint = Math.floor( p ); + const weight = p - intPoint; + + const p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + const p1 = points[ intPoint ]; + const p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + const p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + } + +} + +var Curves = /*#__PURE__*/Object.freeze({ + __proto__: null, + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve +}); + +/************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + +class CurvePath extends Curve { + + constructor() { + + super(); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + add( curve ) { + + this.curves.push( curve ); + + } + + closePath() { + + // Add a line curve if start and end of lines are not connected + const startPoint = this.curves[ 0 ].getPoint( 0 ); + const endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + const lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3'; + this.curves.push( new Curves[ lineType ]( endPoint, startPoint ) ); + + } + + return this; + + } + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint( t, optionalTarget ) { + + const d = t * this.getLength(); + const curveLengths = this.getCurveLengths(); + let i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + const diff = curveLengths[ i ] - d; + const curve = this.curves[ i ]; + + const segmentLength = curve.getLength(); + const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u, optionalTarget ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + } + + copy( source ) { + + super.copy( source ); + + this.curves = []; + + for ( let i = 0, l = source.curves.length; i < l; i ++ ) { + + const curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( let i = 0, l = this.curves.length; i < l; i ++ ) { + + const curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( let i = 0, l = json.curves.length; i < l; i ++ ) { + + const curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + +} + +class Path extends CurvePath { + + constructor( points ) { + + super(); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + setFromPoints( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( let i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + return this; + + } + + moveTo( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + return this; + + } + + lineTo( x, y ) { + + const curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + return this; + + } + + quadraticCurveTo( aCPx, aCPy, aX, aY ) { + + const curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + } + + bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + const curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + } + + splineThru( pts /*Array of Vector*/ ) { + + const npts = [ this.currentPoint.clone() ].concat( pts ); + + const curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + return this; + + } + + arc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + return this; + + } + + absarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + return this; + + } + + ellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + return this; + + } + + absellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + const firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + const lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + return this; + + } + + copy( source ) { + + super.copy( source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + +} + +class LatheGeometry extends BufferGeometry { + + constructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) { + + super(); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ); + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = clamp( phiLength, 0, Math.PI * 2 ); + + // buffers + + const indices = []; + const vertices = []; + const uvs = []; + const initNormals = []; + const normals = []; + + // helper variables + + const inverseSegments = 1.0 / segments; + const vertex = new Vector3(); + const uv = new Vector2(); + const normal = new Vector3(); + const curNormal = new Vector3(); + const prevNormal = new Vector3(); + let dx = 0; + let dy = 0; + + // pre-compute normals for initial "meridian" + + for ( let j = 0; j <= ( points.length - 1 ); j ++ ) { + + switch ( j ) { + + case 0: // special handling for 1st vertex on path + + dx = points[ j + 1 ].x - points[ j ].x; + dy = points[ j + 1 ].y - points[ j ].y; + + normal.x = dy * 1.0; + normal.y = - dx; + normal.z = dy * 0.0; + + prevNormal.copy( normal ); + + normal.normalize(); + + initNormals.push( normal.x, normal.y, normal.z ); + + break; + + case ( points.length - 1 ): // special handling for last Vertex on path + + initNormals.push( prevNormal.x, prevNormal.y, prevNormal.z ); + + break; + + default: // default handling for all vertices in between + + dx = points[ j + 1 ].x - points[ j ].x; + dy = points[ j + 1 ].y - points[ j ].y; + + normal.x = dy * 1.0; + normal.y = - dx; + normal.z = dy * 0.0; + + curNormal.copy( normal ); + + normal.x += prevNormal.x; + normal.y += prevNormal.y; + normal.z += prevNormal.z; + + normal.normalize(); + + initNormals.push( normal.x, normal.y, normal.z ); + + prevNormal.copy( curNormal ); + + } + + } + + // generate vertices, uvs and normals + + for ( let i = 0; i <= segments; i ++ ) { + + const phi = phiStart + i * inverseSegments * phiLength; + + const sin = Math.sin( phi ); + const cos = Math.cos( phi ); + + for ( let j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + // normal + + const x = initNormals[ 3 * j + 0 ] * sin; + const y = initNormals[ 3 * j + 1 ]; + const z = initNormals[ 3 * j + 0 ] * cos; + + normals.push( x, y, z ); + + } + + } + + // indices + + for ( let i = 0; i < segments; i ++ ) { + + for ( let j = 0; j < ( points.length - 1 ); j ++ ) { + + const base = j + i * points.length; + + const a = base; + const b = base + points.length; + const c = base + points.length + 1; + const d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( c, d, b ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength ); + + } + +} + +class CapsuleGeometry extends LatheGeometry { + + constructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) { + + const path = new Path(); + path.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 ); + path.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 ); + + super( path.getPoints( capSegments ), radialSegments ); + + this.type = 'CapsuleGeometry'; + + this.parameters = { + radius: radius, + length: length, + capSegments: capSegments, + radialSegments: radialSegments, + }; + + } + + static fromJSON( data ) { + + return new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments ); + + } + +} + +class CircleGeometry extends BufferGeometry { + + constructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + segments = Math.max( 3, segments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const vertex = new Vector3(); + const uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + const segment = thetaStart + s / segments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uvs + + uv.x = ( vertices[ i ] / radius + 1 ) / 2; + uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // indices + + for ( let i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength ); + + } + +} + +class CylinderGeometry extends BufferGeometry { + + constructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + const scope = this; + + radialSegments = Math.floor( radialSegments ); + heightSegments = Math.floor( heightSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let index = 0; + const indexArray = []; + const halfHeight = height / 2; + let groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + const normal = new Vector3(); + const vertex = new Vector3(); + + let groupCount = 0; + + // this will be used to calculate the normal + const slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( let y = 0; y <= heightSegments; y ++ ) { + + const indexRow = []; + + const v = y / heightSegments; + + // calculate the radius of the current row + + const radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( let x = 0; x <= radialSegments; x ++ ) { + + const u = x / radialSegments; + + const theta = u * thetaLength + thetaStart; + + const sinTheta = Math.sin( theta ); + const cosTheta = Math.cos( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + // save index of vertex in respective row + + indexRow.push( index ++ ); + + } + + // now save vertices of the row in our index array + + indexArray.push( indexRow ); + + } + + // generate indices + + for ( let x = 0; x < radialSegments; x ++ ) { + + for ( let y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + + const a = indexArray[ y ][ x ]; + const b = indexArray[ y + 1 ][ x ]; + const c = indexArray[ y + 1 ][ x + 1 ]; + const d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + function generateCap( top ) { + + // save the index of the first center vertex + const centerIndexStart = index; + + const uv = new Vector2(); + const vertex = new Vector3(); + + let groupCount = 0; + + const radius = ( top === true ) ? radiusTop : radiusBottom; + const sign = ( top === true ) ? 1 : - 1; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( let x = 1; x <= radialSegments; x ++ ) { + + // vertex + + vertices.push( 0, halfHeight * sign, 0 ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uvs.push( 0.5, 0.5 ); + + // increase index + + index ++; + + } + + // save the index of the last center vertex + const centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( let x = 0; x <= radialSegments; x ++ ) { + + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + + const cosTheta = Math.cos( theta ); + const sinTheta = Math.sin( theta ); + + // vertex + + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, sign, 0 ); + + // uv + + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.push( uv.x, uv.y ); + + // increase index + + index ++; + + } + + // generate indices + + for ( let x = 0; x < radialSegments; x ++ ) { + + const c = centerIndexStart + x; + const i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + + indices.push( i, i + 1, c ); + + } else { + + // face bottom + + indices.push( i + 1, i, c ); + + } + + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + + groupStart += groupCount; + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); + + } + +} + +class ConeGeometry extends CylinderGeometry { + + constructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + static fromJSON( data ) { + + return new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); + + } + +} + +class PolyhedronGeometry extends BufferGeometry { + + constructor( vertices = [], indices = [], radius = 1, detail = 0 ) { + + super(); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + // default buffer data + + const vertexBuffer = []; + const uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + applyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + + // iterate over all faces and apply a subdivision with the given detail value + + for ( let i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + const cols = detail + 1; + + // we use this multidimensional array as a data structure for creating the subdivision + + const v = []; + + // construct all of the vertices for this subdivision + + for ( let i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + const aj = a.clone().lerp( c, i / cols ); + const bj = b.clone().lerp( c, i / cols ); + + const rows = cols - i; + + for ( let j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( let i = 0; i < cols; i ++ ) { + + for ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + const k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function applyRadius( radius ) { + + const vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( let i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + const vertex = new Vector3(); + + for ( let i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + const u = azimuth( vertex ) / 2 / Math.PI + 0.5; + const v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( let i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + const x0 = uvBuffer[ i + 0 ]; + const x1 = uvBuffer[ i + 2 ]; + const x2 = uvBuffer[ i + 4 ]; + + const max = Math.max( x0, x1, x2 ); + const min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + const stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + + const centroid = new Vector3(); + + const uvA = new Vector2(); + const uvB = new Vector2(); + const uvC = new Vector2(); + + for ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + const azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details ); + + } + +} + +class DodecahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const t = ( 1 + Math.sqrt( 5 ) ) / 2; + const r = 1 / t; + + const vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + const indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new DodecahedronGeometry( data.radius, data.detail ); + + } + +} + +const _v0 = /*@__PURE__*/ new Vector3(); +const _v1$1 = /*@__PURE__*/ new Vector3(); +const _normal = /*@__PURE__*/ new Vector3(); +const _triangle = /*@__PURE__*/ new Triangle(); + +class EdgesGeometry extends BufferGeometry { + + constructor( geometry = null, thresholdAngle = 1 ) { + + super(); + + this.type = 'EdgesGeometry'; + + this.parameters = { + geometry: geometry, + thresholdAngle: thresholdAngle + }; + + if ( geometry !== null ) { + + const precisionPoints = 4; + const precision = Math.pow( 10, precisionPoints ); + const thresholdDot = Math.cos( DEG2RAD * thresholdAngle ); + + const indexAttr = geometry.getIndex(); + const positionAttr = geometry.getAttribute( 'position' ); + const indexCount = indexAttr ? indexAttr.count : positionAttr.count; + + const indexArr = [ 0, 0, 0 ]; + const vertKeys = [ 'a', 'b', 'c' ]; + const hashes = new Array( 3 ); + + const edgeData = {}; + const vertices = []; + for ( let i = 0; i < indexCount; i += 3 ) { + + if ( indexAttr ) { + + indexArr[ 0 ] = indexAttr.getX( i ); + indexArr[ 1 ] = indexAttr.getX( i + 1 ); + indexArr[ 2 ] = indexAttr.getX( i + 2 ); + + } else { + + indexArr[ 0 ] = i; + indexArr[ 1 ] = i + 1; + indexArr[ 2 ] = i + 2; + + } + + const { a, b, c } = _triangle; + a.fromBufferAttribute( positionAttr, indexArr[ 0 ] ); + b.fromBufferAttribute( positionAttr, indexArr[ 1 ] ); + c.fromBufferAttribute( positionAttr, indexArr[ 2 ] ); + _triangle.getNormal( _normal ); + + // create hashes for the edge from the vertices + hashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`; + hashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`; + hashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`; + + // skip degenerate triangles + if ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) { + + continue; + + } + + // iterate over every edge + for ( let j = 0; j < 3; j ++ ) { + + // get the first and next vertex making up the edge + const jNext = ( j + 1 ) % 3; + const vecHash0 = hashes[ j ]; + const vecHash1 = hashes[ jNext ]; + const v0 = _triangle[ vertKeys[ j ] ]; + const v1 = _triangle[ vertKeys[ jNext ] ]; + + const hash = `${ vecHash0 }_${ vecHash1 }`; + const reverseHash = `${ vecHash1 }_${ vecHash0 }`; + + if ( reverseHash in edgeData && edgeData[ reverseHash ] ) { + + // if we found a sibling edge add it into the vertex array if + // it meets the angle threshold and delete the edge from the map. + if ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) { + + vertices.push( v0.x, v0.y, v0.z ); + vertices.push( v1.x, v1.y, v1.z ); + + } + + edgeData[ reverseHash ] = null; + + } else if ( ! ( hash in edgeData ) ) { + + // if we've already got an edge here then skip adding a new one + edgeData[ hash ] = { + + index0: indexArr[ j ], + index1: indexArr[ jNext ], + normal: _normal.clone(), + + }; + + } + + } + + } + + // iterate over all remaining, unmatched edges and add them to the vertex array + for ( const key in edgeData ) { + + if ( edgeData[ key ] ) { + + const { index0, index1 } = edgeData[ key ]; + _v0.fromBufferAttribute( positionAttr, index0 ); + _v1$1.fromBufferAttribute( positionAttr, index1 ); + + vertices.push( _v0.x, _v0.y, _v0.z ); + vertices.push( _v1$1.x, _v1$1.y, _v1$1.z ); + + } + + } + + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + +} + +class Shape extends Path { + + constructor( points ) { + + super( points ); + + this.uuid = generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + getPointsHoles( divisions ) { + + const holesPts = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + } + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + } + + copy( source ) { + + super.copy( source ); + + this.holes = []; + + for ( let i = 0, l = source.holes.length; i < l; i ++ ) { + + const hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.uuid = this.uuid; + data.holes = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + const hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( let i = 0, l = json.holes.length; i < l; i ++ ) { + + const hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + +} + +/** + * Port from https://github.com/mapbox/earcut (v2.2.4) + */ + +const Earcut = { + + triangulate: function ( data, holeIndices, dim = 2 ) { + + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length; + let outerNode = linkedList( data, 0, outerLen, dim, true ); + const triangles = []; + + if ( ! outerNode || outerNode.next === outerNode.prev ) return triangles; + + let minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( let i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 32767 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 ); + + return triangles; + + } + +}; + +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList( data, start, end, dim, clockwise ) { + + let i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + +} + +// eliminate colinear or duplicate points +function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + let p = start, + again; + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) +function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + let stop = ear, + prev, next; + + // iterate through ears, slicing them one by one + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim | 0 ); + triangles.push( ear.i / dim | 0 ); + triangles.push( next.i / dim | 0 ); + + removeNode( ear ); + + // skipping the next vertex leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if ( ear === stop ) { + + // try filtering points and slicing again + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( filterPoints( ear ), triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + +} + +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar( ear ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + + // triangle bbox; min & max are calculated like this for speed + const x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ), + y0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ), + x1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ), + y1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy ); + + let p = c.next; + while ( p !== a ) { + + if ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && + pointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.next; + + } + + return true; + +} + +function isEarHashed( ear, minX, minY, invSize ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + + // triangle bbox; min & max are calculated like this for speed + const x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ), + y0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ), + x1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ), + y1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy ); + + // z-order range for the current triangle bbox; + const minZ = zOrder( x0, y0, minX, minY, invSize ), + maxZ = zOrder( x1, y1, minX, minY, invSize ); + + let p = ear.prevZ, + n = ear.nextZ; + + // look for points inside the triangle in both directions + while ( p && p.z >= minZ && n && n.z <= maxZ ) { + + if ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + if ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + // look for remaining points in decreasing z-order + while ( p && p.z >= minZ ) { + + if ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + } + + // look for remaining points in increasing z-order + while ( n && n.z <= maxZ ) { + + if ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + return true; + +} + +// go through all polygon nodes and cure small local self-intersections +function cureLocalIntersections( start, triangles, dim ) { + + let p = start; + do { + + const a = p.prev, + b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim | 0 ); + triangles.push( p.i / dim | 0 ); + triangles.push( b.i / dim | 0 ); + + // remove two nodes involved + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return filterPoints( p ); + +} + +// try splitting polygon into two and triangulate them independently +function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + let a = start; + do { + + let b = a.next.next; + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + let c = splitPolygon( a, b ); + + // filter colinear points around the cuts + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + earcutLinked( a, triangles, dim, minX, minY, invSize, 0 ); + earcutLinked( c, triangles, dim, minX, minY, invSize, 0 ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + +} + +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles( data, holeIndices, outerNode, dim ) { + + const queue = []; + let i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + for ( i = 0; i < queue.length; i ++ ) { + + outerNode = eliminateHole( queue[ i ], outerNode ); + + } + + return outerNode; + +} + +function compareX( a, b ) { + + return a.x - b.x; + +} + +// find a bridge between vertices that connects hole with an outer ring and link it +function eliminateHole( hole, outerNode ) { + + const bridge = findHoleBridge( hole, outerNode ); + if ( ! bridge ) { + + return outerNode; + + } + + const bridgeReverse = splitPolygon( bridge, hole ); + + // filter collinear points around the cuts + filterPoints( bridgeReverse, bridgeReverse.next ); + return filterPoints( bridge, bridge.next ); + +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge( hole, outerNode ) { + + let p = outerNode, + qx = - Infinity, + m; + + const hx = hole.x, hy = hole.y; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + const x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + if ( x <= hx && x > qx ) { + + qx = x; + m = p.x < p.next.x ? p : p.next; + if ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + const stop = m, + mx = m.x, + my = m.y; + let tanMin = Infinity, tan; + + p = m; + + do { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } while ( p !== stop ); + + return m; + +} + +// whether sector in vertex m contains sector in vertex p in the same coordinates +function sectorContainsSector( m, p ) { + + return area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0; + +} + +// interlink polygon nodes in z-order +function indexCurve( start, minX, minY, invSize ) { + + let p = start; + do { + + if ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked( list ) { + + let i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + +} + +// z-order of a point given coords and inverse of the longer side of data bbox +function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + x = ( x - minX ) * invSize | 0; + y = ( y - minY ) * invSize | 0; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + +} + +// find the leftmost node of a polygon ring +function getLeftmost( start ) { + + let p = start, + leftmost = start; + do { + + if ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + +} + +// check if a point lies within a convex triangle +function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) && + ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) && + ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py ); + +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges + ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible + ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors + equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case + +} + +// signed area of a triangle +function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + +} + +// check if two points are equal +function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + +} + +// check if two segments intersect +function intersects( p1, q1, p2, q2 ) { + + const o1 = sign( area( p1, q1, p2 ) ); + const o2 = sign( area( p1, q1, q2 ) ); + const o3 = sign( area( p2, q2, p1 ) ); + const o4 = sign( area( p2, q2, q1 ) ); + + if ( o1 !== o2 && o3 !== o4 ) return true; // general case + + if ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + + return false; + +} + +// for collinear points p, q, r, check if point q lies on segment pr +function onSegment( p, q, r ) { + + return q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y ); + +} + +function sign( num ) { + + return num > 0 ? 1 : num < 0 ? - 1 : 0; + +} + +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon( a, b ) { + + let p = a; + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) return true; + p = p.next; + + } while ( p !== a ); + + return false; + +} + +// check if a polygon diagonal is locally inside the polygon +function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + +} + +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside( a, b ) { + + let p = a, + inside = false; + const px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) + inside = ! inside; + p = p.next; + + } while ( p !== a ); + + return inside; + +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon( a, b ) { + + const a2 = new Node( a.i, a.x, a.y ), + b2 = new Node( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + +} + +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode( i, x, y, last ) { + + const p = new Node( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + +} + +function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + +} + +function Node( i, x, y ) { + + // vertex index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertex nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = 0; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + +} + +function signedArea( data, start, end, dim ) { + + let sum = 0; + for ( let i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + +} + +class ShapeUtils { + + // calculate area of the contour polygon + + static area( contour ) { + + const n = contour.length; + let a = 0.0; + + for ( let p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + } + + static isClockWise( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + static triangulateShape( contour, holes ) { + + const vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + const holeIndices = []; // array of hole indices + const faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + let holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( let i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + const triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( let i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + +} + +function removeDupEndPts( points ) { + + const l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + +} + +function addContour( vertices, contour ) { + + for ( let i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + +} + +/** + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline (including bevelOffset) is bevel + * bevelOffset: , // how far from shape outline does bevel start + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + +class ExtrudeGeometry extends BufferGeometry { + + constructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) { + + super(); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + const scope = this; + + const verticesArray = []; + const uvArray = []; + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + const placeholder = []; + + // options + + const curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + const steps = options.steps !== undefined ? options.steps : 1; + const depth = options.depth !== undefined ? options.depth : 1; + + let bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + let bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2; + let bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1; + let bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0; + let bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + const extrudePath = options.extrudePath; + + const uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // + + let extrudePts, extrudeByPath = false; + let splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + bevelOffset = 0; + + } + + // Variables initialization + + const shapePoints = shape.extractPoints( curveSegments ); + + let vertices = shapePoints.shape; + const holes = shapePoints.holes; + + const reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + const faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + const contour = vertices; // vertices has all points but contour has only points of circumference + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' ); + + return pt.clone().addScaledVector( vec, size ); + + } + + const vlen = vertices.length, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + let v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + const v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + const v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + const v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + const collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + const v_prev_len = Math.sqrt( v_prev_lensq ); + const v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + const ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + const ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + const ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + const ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + const sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + const v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + let direction_eq = false; // assumes: opposite + + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + const contourMovements = []; + + for ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + const holesMovements = []; + let oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( let b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + const t = b / bevelSegments; + const z = bevelThickness * Math.cos( t * Math.PI / 2 ); + const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset; + + // contract shape + + for ( let i = 0, il = contour.length; i < il; i ++ ) { + + const vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( let i = 0, il = ahole.length; i < il; i ++ ) { + + const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + const bs = bevelSize + bevelOffset; + + // Back facing vertices + + for ( let i = 0; i < vlen; i ++ ) { + + const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + for ( let s = 1; s <= steps; s ++ ) { + + for ( let i = 0; i < vlen; i ++ ) { + + const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( let b = bevelSegments - 1; b >= 0; b -- ) { + + const t = b / bevelSegments; + const z = bevelThickness * Math.cos( t * Math.PI / 2 ); + const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset; + + // contract shape + + for ( let i = 0, il = contour.length; i < il; i ++ ) { + + const vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( let i = 0, il = ahole.length; i < il; i ++ ) { + + const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + const start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + let layer = 0; // steps + 1 + let offset = vlen * layer; + + // Bottom faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( let i = 0; i < flen; i ++ ) { + + const face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + const start = verticesArray.length / 3; + let layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( let h = 0, hl = holes.length; h < hl; h ++ ) { + + const ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + let i = contour.length; + + while ( -- i >= 0 ) { + + const j = i; + let k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + for ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) { + + const slen1 = vlen * s; + const slen2 = vlen * ( s + 1 ); + + const a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + const shapes = this.parameters.shapes; + const options = this.parameters.options; + + return toJSON$1( shapes, options, data ); + + } + + static fromJSON( data, shapes ) { + + const geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + const extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + return new ExtrudeGeometry( geometryShapes, data.options ); + + } + +} + +const WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + const a_x = vertices[ indexA * 3 ]; + const a_y = vertices[ indexA * 3 + 1 ]; + const b_x = vertices[ indexB * 3 ]; + const b_y = vertices[ indexB * 3 + 1 ]; + const c_x = vertices[ indexC * 3 ]; + const c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + const a_x = vertices[ indexA * 3 ]; + const a_y = vertices[ indexA * 3 + 1 ]; + const a_z = vertices[ indexA * 3 + 2 ]; + const b_x = vertices[ indexB * 3 ]; + const b_y = vertices[ indexB * 3 + 1 ]; + const b_z = vertices[ indexB * 3 + 2 ]; + const c_x = vertices[ indexC * 3 ]; + const c_y = vertices[ indexC * 3 + 1 ]; + const c_z = vertices[ indexC * 3 + 2 ]; + const d_x = vertices[ indexD * 3 ]; + const d_y = vertices[ indexD * 3 + 1 ]; + const d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + +}; + +function toJSON$1( shapes, options, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + data.options = Object.assign( {}, options ); + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + +} + +class IcosahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const t = ( 1 + Math.sqrt( 5 ) ) / 2; + + const vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + const indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new IcosahedronGeometry( data.radius, data.detail ); + + } + +} + +class OctahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + const indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, + 0, 5, 2, 1, 2, 5, 1, 5, 3, + 1, 3, 4, 1, 4, 2 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new OctahedronGeometry( data.radius, data.detail ); + + } + +} + +class RingGeometry extends BufferGeometry { + + constructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) { + + super(); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + thetaSegments = Math.max( 3, thetaSegments ); + phiSegments = Math.max( 1, phiSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // some helper variables + + let radius = innerRadius; + const radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + const vertex = new Vector3(); + const uv = new Vector2(); + + // generate vertices, normals and uvs + + for ( let j = 0; j <= phiSegments; j ++ ) { + + for ( let i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + const segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normals.push( 0, 0, 1 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( let j = 0; j < phiSegments; j ++ ) { + + const thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( let i = 0; i < thetaSegments; i ++ ) { + + const segment = i + thetaSegmentLevel; + + const a = segment; + const b = segment + thetaSegments + 1; + const c = segment + thetaSegments + 2; + const d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); + + } + +} + +class ShapeGeometry extends BufferGeometry { + + constructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) { + + super(); + + this.type = 'ShapeGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let groupStart = 0; + let groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( let i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + const indexOffset = vertices.length / 3; + const points = shape.extractPoints( curveSegments ); + + let shapeVertices = points.shape; + const shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + } + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + const faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( let i = 0, l = shapeVertices.length; i < l; i ++ ) { + + const vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // indices + + for ( let i = 0, l = faces.length; i < l; i ++ ) { + + const face = faces[ i ]; + + const a = face[ 0 ] + indexOffset; + const b = face[ 1 ] + indexOffset; + const c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + const shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + } + + static fromJSON( data, shapes ) { + + const geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + return new ShapeGeometry( geometryShapes, data.curveSegments ); + + } + +} + +function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + +} + +class SphereGeometry extends BufferGeometry { + + constructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) { + + super(); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) ); + + const thetaEnd = Math.min( thetaStart + thetaLength, Math.PI ); + + let index = 0; + const grid = []; + + const vertex = new Vector3(); + const normal = new Vector3(); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // generate vertices, normals and uvs + + for ( let iy = 0; iy <= heightSegments; iy ++ ) { + + const verticesRow = []; + + const v = iy / heightSegments; + + // special case for the poles + + let uOffset = 0; + + if ( iy === 0 && thetaStart === 0 ) { + + uOffset = 0.5 / widthSegments; + + } else if ( iy === heightSegments && thetaEnd === Math.PI ) { + + uOffset = - 0.5 / widthSegments; + + } + + for ( let ix = 0; ix <= widthSegments; ix ++ ) { + + const u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.copy( vertex ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u + uOffset, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( let iy = 0; iy < heightSegments; iy ++ ) { + + for ( let ix = 0; ix < widthSegments; ix ++ ) { + + const a = grid[ iy ][ ix + 1 ]; + const b = grid[ iy ][ ix ]; + const c = grid[ iy + 1 ][ ix ]; + const d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); + + } + +} + +class TetrahedronGeometry extends PolyhedronGeometry { + + constructor( radius = 1, detail = 0 ) { + + const vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + const indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + super( vertices, indices, radius, detail ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + static fromJSON( data ) { + + return new TetrahedronGeometry( data.radius, data.detail ); + + } + +} + +class TorusGeometry extends BufferGeometry { + + constructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) { + + super(); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radialSegments = Math.floor( radialSegments ); + tubularSegments = Math.floor( tubularSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const center = new Vector3(); + const vertex = new Vector3(); + const normal = new Vector3(); + + // generate vertices, normals and uvs + + for ( let j = 0; j <= radialSegments; j ++ ) { + + for ( let i = 0; i <= tubularSegments; i ++ ) { + + const u = i / tubularSegments * arc; + const v = j / radialSegments * Math.PI * 2; + + // vertex + + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + normal.subVectors( vertex, center ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( let j = 1; j <= radialSegments; j ++ ) { + + for ( let i = 1; i <= tubularSegments; i ++ ) { + + // indices + + const a = ( tubularSegments + 1 ) * j + i - 1; + const b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + const c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + const d = ( tubularSegments + 1 ) * j + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); + + } + +} + +class TorusKnotGeometry extends BufferGeometry { + + constructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) { + + super(); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + tubularSegments = Math.floor( tubularSegments ); + radialSegments = Math.floor( radialSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + const vertex = new Vector3(); + const normal = new Vector3(); + + const P1 = new Vector3(); + const P2 = new Vector3(); + + const B = new Vector3(); + const T = new Vector3(); + const N = new Vector3(); + + // generate vertices, normals and uvs + + for ( let i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segment + + const u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( let j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + const v = j / radialSegments * Math.PI * 2; + const cx = - tube * Math.cos( v ); + const cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectors, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors( vertex, P1 ).normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( i / tubularSegments ); + uvs.push( j / radialSegments ); + + } + + } + + // generate indices + + for ( let j = 1; j <= tubularSegments; j ++ ) { + + for ( let i = 1; i <= radialSegments; i ++ ) { + + // indices + + const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + const b = ( radialSegments + 1 ) * j + ( i - 1 ); + const c = ( radialSegments + 1 ) * j + i; + const d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + const cu = Math.cos( u ); + const su = Math.sin( u ); + const quOverP = q / p * u; + const cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + static fromJSON( data ) { + + return new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); + + } + +} + +class TubeGeometry extends BufferGeometry { + + constructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) { + + super(); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + const frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + const vertex = new Vector3(); + const normal = new Vector3(); + const uv = new Vector2(); + let P = new Vector3(); + + // buffer + + const vertices = []; + const normals = []; + const uvs = []; + const indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( let i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + const N = frames.normals[ i ]; + const B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( let j = 0; j <= radialSegments; j ++ ) { + + const v = j / radialSegments * Math.PI * 2; + + const sin = Math.sin( v ); + const cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( let j = 1; j <= tubularSegments; j ++ ) { + + for ( let i = 1; i <= radialSegments; i ++ ) { + + const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + const b = ( radialSegments + 1 ) * j + ( i - 1 ); + const c = ( radialSegments + 1 ) * j + i; + const d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( let i = 0; i <= tubularSegments; i ++ ) { + + for ( let j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.path = this.parameters.path.toJSON(); + + return data; + + } + + static fromJSON( data ) { + + // This only works for built-in curves (e.g. CatmullRomCurve3). + // User defined curves or instances of CurvePath will not be deserialized. + return new TubeGeometry( + new Curves[ data.path.type ]().fromJSON( data.path ), + data.tubularSegments, + data.radius, + data.radialSegments, + data.closed + ); + + } + +} + +class WireframeGeometry extends BufferGeometry { + + constructor( geometry = null ) { + + super(); + + this.type = 'WireframeGeometry'; + + this.parameters = { + geometry: geometry + }; + + if ( geometry !== null ) { + + // buffer + + const vertices = []; + const edges = new Set(); + + // helper variables + + const start = new Vector3(); + const end = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + const position = geometry.attributes.position; + const indices = geometry.index; + let groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all edges without duplicates + + for ( let o = 0, ol = groups.length; o < ol; ++ o ) { + + const group = groups[ o ]; + + const groupStart = group.start; + const groupCount = group.count; + + for ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) { + + for ( let j = 0; j < 3; j ++ ) { + + const index1 = indices.getX( i + j ); + const index2 = indices.getX( i + ( j + 1 ) % 3 ); + + start.fromBufferAttribute( position, index1 ); + end.fromBufferAttribute( position, index2 ); + + if ( isUniqueEdge( start, end, edges ) === true ) { + + vertices.push( start.x, start.y, start.z ); + vertices.push( end.x, end.y, end.z ); + + } + + } + + } + + } + + } else { + + // non-indexed BufferGeometry + + const position = geometry.attributes.position; + + for ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( let j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + const index1 = 3 * i + j; + const index2 = 3 * i + ( ( j + 1 ) % 3 ); + + start.fromBufferAttribute( position, index1 ); + end.fromBufferAttribute( position, index2 ); + + if ( isUniqueEdge( start, end, edges ) === true ) { + + vertices.push( start.x, start.y, start.z ); + vertices.push( end.x, end.y, end.z ); + + } + + } + + } + + } + + // build geometry + + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + +} + +function isUniqueEdge( start, end, edges ) { + + const hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`; + const hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge + + if ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) { + + return false; + + } else { + + edges.add( hash1 ); + edges.add( hash2 ); + return true; + + } + +} + +var Geometries = /*#__PURE__*/Object.freeze({ + __proto__: null, + BoxGeometry: BoxGeometry, + CapsuleGeometry: CapsuleGeometry, + CircleGeometry: CircleGeometry, + ConeGeometry: ConeGeometry, + CylinderGeometry: CylinderGeometry, + DodecahedronGeometry: DodecahedronGeometry, + EdgesGeometry: EdgesGeometry, + ExtrudeGeometry: ExtrudeGeometry, + IcosahedronGeometry: IcosahedronGeometry, + LatheGeometry: LatheGeometry, + OctahedronGeometry: OctahedronGeometry, + PlaneGeometry: PlaneGeometry, + PolyhedronGeometry: PolyhedronGeometry, + RingGeometry: RingGeometry, + ShapeGeometry: ShapeGeometry, + SphereGeometry: SphereGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TorusGeometry: TorusGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TubeGeometry: TubeGeometry, + WireframeGeometry: WireframeGeometry +}); + +class ShadowMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isShadowMaterial = true; + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.fog = source.fog; + + return this; + + } + +} + +class RawShaderMaterial extends ShaderMaterial { + + constructor( parameters ) { + + super( parameters ); + + this.isRawShaderMaterial = true; + + this.type = 'RawShaderMaterial'; + + } + +} + +class MeshStandardMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshStandardMaterial = true; + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 1.0; + this.metalness = 0.0; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.flatShading = false; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.flatShading = source.flatShading; + + this.fog = source.fog; + + return this; + + } + +} + +class MeshPhysicalMaterial extends MeshStandardMaterial { + + constructor( parameters ) { + + super(); + + this.isMeshPhysicalMaterial = true; + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.type = 'MeshPhysicalMaterial'; + + this.anisotropyRotation = 0; + this.anisotropyMap = null; + + this.clearcoatMap = null; + this.clearcoatRoughness = 0.0; + this.clearcoatRoughnessMap = null; + this.clearcoatNormalScale = new Vector2( 1, 1 ); + this.clearcoatNormalMap = null; + + this.ior = 1.5; + + Object.defineProperty( this, 'reflectivity', { + get: function () { + + return ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) ); + + }, + set: function ( reflectivity ) { + + this.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity ); + + } + } ); + + this.iridescenceMap = null; + this.iridescenceIOR = 1.3; + this.iridescenceThicknessRange = [ 100, 400 ]; + this.iridescenceThicknessMap = null; + + this.sheenColor = new Color( 0x000000 ); + this.sheenColorMap = null; + this.sheenRoughness = 1.0; + this.sheenRoughnessMap = null; + + this.transmissionMap = null; + + this.thickness = 0; + this.thicknessMap = null; + this.attenuationDistance = Infinity; + this.attenuationColor = new Color( 1, 1, 1 ); + + this.specularIntensity = 1.0; + this.specularIntensityMap = null; + this.specularColor = new Color( 1, 1, 1 ); + this.specularColorMap = null; + + this._anisotropy = 0; + this._clearcoat = 0; + this._iridescence = 0; + this._sheen = 0.0; + this._transmission = 0; + + this.setValues( parameters ); + + } + + get anisotropy() { + + return this._anisotropy; + + } + + set anisotropy( value ) { + + if ( this._anisotropy > 0 !== value > 0 ) { + + this.version ++; + + } + + this._anisotropy = value; + + } + + get clearcoat() { + + return this._clearcoat; + + } + + set clearcoat( value ) { + + if ( this._clearcoat > 0 !== value > 0 ) { + + this.version ++; + + } + + this._clearcoat = value; + + } + + get iridescence() { + + return this._iridescence; + + } + + set iridescence( value ) { + + if ( this._iridescence > 0 !== value > 0 ) { + + this.version ++; + + } + + this._iridescence = value; + + } + + get sheen() { + + return this._sheen; + + } + + set sheen( value ) { + + if ( this._sheen > 0 !== value > 0 ) { + + this.version ++; + + } + + this._sheen = value; + + } + + get transmission() { + + return this._transmission; + + } + + set transmission( value ) { + + if ( this._transmission > 0 !== value > 0 ) { + + this.version ++; + + } + + this._transmission = value; + + } + + copy( source ) { + + super.copy( source ); + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.anisotropy = source.anisotropy; + this.anisotropyRotation = source.anisotropyRotation; + this.anisotropyMap = source.anisotropyMap; + + this.clearcoat = source.clearcoat; + this.clearcoatMap = source.clearcoatMap; + this.clearcoatRoughness = source.clearcoatRoughness; + this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; + this.clearcoatNormalMap = source.clearcoatNormalMap; + this.clearcoatNormalScale.copy( source.clearcoatNormalScale ); + + this.ior = source.ior; + + this.iridescence = source.iridescence; + this.iridescenceMap = source.iridescenceMap; + this.iridescenceIOR = source.iridescenceIOR; + this.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ]; + this.iridescenceThicknessMap = source.iridescenceThicknessMap; + + this.sheen = source.sheen; + this.sheenColor.copy( source.sheenColor ); + this.sheenColorMap = source.sheenColorMap; + this.sheenRoughness = source.sheenRoughness; + this.sheenRoughnessMap = source.sheenRoughnessMap; + + this.transmission = source.transmission; + this.transmissionMap = source.transmissionMap; + + this.thickness = source.thickness; + this.thicknessMap = source.thicknessMap; + this.attenuationDistance = source.attenuationDistance; + this.attenuationColor.copy( source.attenuationColor ); + + this.specularIntensity = source.specularIntensity; + this.specularIntensityMap = source.specularIntensityMap; + this.specularColor.copy( source.specularColor ); + this.specularColorMap = source.specularColorMap; + + return this; + + } + +} + +class MeshPhongMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshPhongMaterial = true; + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.flatShading = false; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.flatShading = source.flatShading; + + this.fog = source.fog; + + return this; + + } + +} + +class MeshToonMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshToonMaterial = true; + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + this.gradientMap = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + this.gradientMap = source.gradientMap; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.fog = source.fog; + + return this; + + } + +} + +class MeshNormalMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshNormalMaterial = true; + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.flatShading = false; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.flatShading = source.flatShading; + + return this; + + } + +} + +class MeshLambertMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshLambertMaterial = true; + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.flatShading = false; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.flatShading = source.flatShading; + + this.fog = source.fog; + + return this; + + } + +} + +class MeshMatcapMaterial extends Material { + + constructor( parameters ) { + + super(); + + this.isMeshMatcapMaterial = true; + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.flatShading = false; + + this.fog = true; + + this.setValues( parameters ); + + } + + + copy( source ) { + + super.copy( source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.flatShading = source.flatShading; + + this.fog = source.fog; + + return this; + + } + +} + +class LineDashedMaterial extends LineBasicMaterial { + + constructor( parameters ) { + + super(); + + this.isLineDashedMaterial = true; + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + } + +} + +// converts an array to a specific type +function convertArray( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + +} + +function isTypedArray( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + +} + +// returns an array by which times and values can be sorted +function getKeyframeOrder( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + const n = times.length; + const result = new Array( n ); + for ( let i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + +} + +// uses the array previously returned by 'getKeyframeOrder' to sort data +function sortedArray( values, stride, order ) { + + const nValues = values.length; + const result = new values.constructor( nValues ); + + for ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + const srcOffset = order[ i ] * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + +} + +// function for parsing AOS keyframe formats +function flattenJSON( jsonKeys, times, values, valuePropertyName ) { + + let i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + let value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + +} + +function subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) { + + const clip = sourceClip.clone(); + + clip.name = name; + + const tracks = []; + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + const track = clip.tracks[ i ]; + const valueSize = track.getValueSize(); + + const times = []; + const values = []; + + for ( let j = 0; j < track.times.length; ++ j ) { + + const frame = track.times[ j ] * fps; + + if ( frame < startFrame || frame >= endFrame ) continue; + + times.push( track.times[ j ] ); + + for ( let k = 0; k < valueSize; ++ k ) { + + values.push( track.values[ j * valueSize + k ] ); + + } + + } + + if ( times.length === 0 ) continue; + + track.times = convertArray( times, track.times.constructor ); + track.values = convertArray( values, track.values.constructor ); + + tracks.push( track ); + + } + + clip.tracks = tracks; + + // find minimum .times value across all tracks in the trimmed clip + + let minStartTime = Infinity; + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + if ( minStartTime > clip.tracks[ i ].times[ 0 ] ) { + + minStartTime = clip.tracks[ i ].times[ 0 ]; + + } + + } + + // shift all tracks such that clip begins at t=0 + + for ( let i = 0; i < clip.tracks.length; ++ i ) { + + clip.tracks[ i ].shift( - 1 * minStartTime ); + + } + + clip.resetDuration(); + + return clip; + +} + +function makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) { + + if ( fps <= 0 ) fps = 30; + + const numTracks = referenceClip.tracks.length; + const referenceTime = referenceFrame / fps; + + // Make each track's values relative to the values at the reference frame + for ( let i = 0; i < numTracks; ++ i ) { + + const referenceTrack = referenceClip.tracks[ i ]; + const referenceTrackType = referenceTrack.ValueTypeName; + + // Skip this track if it's non-numeric + if ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue; + + // Find the track in the target clip whose name and type matches the reference track + const targetTrack = targetClip.tracks.find( function ( track ) { + + return track.name === referenceTrack.name + && track.ValueTypeName === referenceTrackType; + + } ); + + if ( targetTrack === undefined ) continue; + + let referenceOffset = 0; + const referenceValueSize = referenceTrack.getValueSize(); + + if ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + referenceOffset = referenceValueSize / 3; + + } + + let targetOffset = 0; + const targetValueSize = targetTrack.getValueSize(); + + if ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + targetOffset = targetValueSize / 3; + + } + + const lastIndex = referenceTrack.times.length - 1; + let referenceValue; + + // Find the value to subtract out of the track + if ( referenceTime <= referenceTrack.times[ 0 ] ) { + + // Reference frame is earlier than the first keyframe, so just use the first keyframe + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + referenceValue = referenceTrack.values.slice( startIndex, endIndex ); + + } else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) { + + // Reference frame is after the last keyframe, so just use the last keyframe + const startIndex = lastIndex * referenceValueSize + referenceOffset; + const endIndex = startIndex + referenceValueSize - referenceOffset; + referenceValue = referenceTrack.values.slice( startIndex, endIndex ); + + } else { + + // Interpolate to the reference value + const interpolant = referenceTrack.createInterpolant(); + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + interpolant.evaluate( referenceTime ); + referenceValue = interpolant.resultBuffer.slice( startIndex, endIndex ); + + } + + // Conjugate the quaternion + if ( referenceTrackType === 'quaternion' ) { + + const referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate(); + referenceQuat.toArray( referenceValue ); + + } + + // Subtract the reference value from all of the track values + + const numTimes = targetTrack.times.length; + for ( let j = 0; j < numTimes; ++ j ) { + + const valueStart = j * targetValueSize + targetOffset; + + if ( referenceTrackType === 'quaternion' ) { + + // Multiply the conjugate for quaternion track types + Quaternion.multiplyQuaternionsFlat( + targetTrack.values, + valueStart, + referenceValue, + 0, + targetTrack.values, + valueStart + ); + + } else { + + const valueEnd = targetValueSize - targetOffset * 2; + + // Subtract each value for all other numeric track types + for ( let k = 0; k < valueEnd; ++ k ) { + + targetTrack.values[ valueStart + k ] -= referenceValue[ k ]; + + } + + } + + } + + } + + targetClip.blendMode = AdditiveAnimationBlendMode; + + return targetClip; + +} + +const AnimationUtils = { + convertArray: convertArray, + isTypedArray: isTypedArray, + getKeyframeOrder: getKeyframeOrder, + sortedArray: sortedArray, + flattenJSON: flattenJSON, + subclip: subclip, + makeClipAdditive: makeClipAdditive +}; + +/** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + */ + +class Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + this.settings = null; + this.DefaultSettings_ = {}; + + } + + evaluate( t ) { + + const pp = this.parameterPositions; + let i1 = this._cachedIndex, + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + let right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( let giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_( i1 - 1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + const t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( let giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.copySampleValue_( 0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + const mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.copySampleValue_( 0 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_( i1 - 1 ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + } + + getSettings_() { + + return this.settings || this.DefaultSettings_; + + } + + copySampleValue_( index ) { + + // copies a sample value to the result buffer + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + } + + // Template methods for derived classes: + + interpolate_( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + } + + intervalChanged_( /* i1, t0, t1 */ ) { + + // empty + + } + +} + +/** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + */ + +class CubicInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + this.DefaultSettings_ = { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }; + + } + + intervalChanged_( i1, t0, t1 ) { + + const pp = this.parameterPositions; + let iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + const halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + const sP = - wP * ppp + 2 * wP * pp - wP * p; + const s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + const s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + const sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + +} + +class LinearInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + +} + +/** + * + * Interpolant that evaluates to the sample value at the position preceding + * the parameter. + */ + +class DiscreteInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + +} + +class KeyframeTrack { + + constructor( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = convertArray( times, this.TimeBufferType ); + this.values = convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + } + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + static toJSON( track ) { + + const trackType = track.constructor; + + let json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== this.toJSON ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': convertArray( track.times, Array ), + 'values': convertArray( track.values, Array ) + + }; + + const interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + + InterpolantFactoryMethodDiscrete( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + InterpolantFactoryMethodLinear( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + InterpolantFactoryMethodSmooth( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + setInterpolation( interpolation ) { + + let factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + const message = 'unsupported interpolation for ' + + this.ValueTypeName + ' keyframe track named ' + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + } + + getInterpolation() { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + } + + getValueSize() { + + return this.values.length / this.times.length; + + } + + // move all keyframes either forwards or backwards in time + shift( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + } + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale( timeScale ) { + + if ( timeScale !== 1.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + } + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim( startTime, endTime ) { + + const times = this.times, + nKeys = times.length; + + let from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) { + + to = Math.max( to, 1 ); + from = to - 1; + + } + + const stride = this.getValueSize(); + this.times = times.slice( from, to ); + this.values = this.values.slice( from * stride, to * stride ); + + } + + return this; + + } + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate() { + + let valid = true; + + const valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + const times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + let prevTime = null; + + for ( let i = 0; i !== nKeys; i ++ ) { + + const currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( isTypedArray( values ) ) { + + for ( let i = 0, n = values.length; i !== n; ++ i ) { + + const value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + } + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize() { + + // times or values may be shared with other tracks, so overwriting is unsafe + const times = this.times.slice(), + values = this.values.slice(), + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + lastIndex = times.length - 1; + + let writeIndex = 1; + + for ( let i = 1; i < lastIndex; ++ i ) { + + let keep = false; + + const time = times[ i ]; + const timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + const offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( let j = 0; j !== stride; ++ j ) { + + const value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + const readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = times.slice( 0, writeIndex ); + this.values = values.slice( 0, writeIndex * stride ); + + } else { + + this.times = times; + this.values = values; + + } + + return this; + + } + + clone() { + + const times = this.times.slice(); + const values = this.values.slice(); + + const TypedKeyframeTrack = this.constructor; + const track = new TypedKeyframeTrack( this.name, times, values ); + + // Interpolant argument to constructor is not saved, so copy the factory method directly. + track.createInterpolant = this.createInterpolant; + + return track; + + } + +} + +KeyframeTrack.prototype.TimeBufferType = Float32Array; +KeyframeTrack.prototype.ValueBufferType = Float32Array; +KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; + +/** + * A Track of Boolean keyframe values. + */ +class BooleanKeyframeTrack extends KeyframeTrack {} + +BooleanKeyframeTrack.prototype.ValueTypeName = 'bool'; +BooleanKeyframeTrack.prototype.ValueBufferType = Array; +BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track of keyframe values that represent color. + */ +class ColorKeyframeTrack extends KeyframeTrack {} + +ColorKeyframeTrack.prototype.ValueTypeName = 'color'; + +/** + * A Track of numeric keyframe values. + */ +class NumberKeyframeTrack extends KeyframeTrack {} + +NumberKeyframeTrack.prototype.ValueTypeName = 'number'; + +/** + * Spherical linear unit quaternion interpolant. + */ + +class QuaternionLinearInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + let offset = i1 * stride; + + for ( let end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + +} + +/** + * A Track of quaternion keyframe values. + */ +class QuaternionKeyframeTrack extends KeyframeTrack { + + InterpolantFactoryMethodLinear( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + +} + +QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion'; +// ValueBufferType is inherited +QuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; +QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track that interpolates Strings + */ +class StringKeyframeTrack extends KeyframeTrack {} + +StringKeyframeTrack.prototype.ValueTypeName = 'string'; +StringKeyframeTrack.prototype.ValueBufferType = Array; +StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; +StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track of vectored keyframe values. + */ +class VectorKeyframeTrack extends KeyframeTrack {} + +VectorKeyframeTrack.prototype.ValueTypeName = 'vector'; + +class AnimationClip { + + constructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) { + + this.name = name; + this.tracks = tracks; + this.duration = duration; + this.blendMode = blendMode; + + this.uuid = generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + } + + + static parse( json ) { + + const tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + const clip = new this( json.name, json.duration, tracks, json.blendMode ); + clip.uuid = json.uuid; + + return clip; + + } + + static toJSON( clip ) { + + const tracks = [], + clipTracks = clip.tracks; + + const json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid, + 'blendMode': clip.blendMode + + }; + + for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + } + + static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) { + + const numMorphTargets = morphTargetSequence.length; + const tracks = []; + + for ( let i = 0; i < numMorphTargets; i ++ ) { + + let times = []; + let values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + const order = getKeyframeOrder( times ); + times = sortedArray( times, 1, order ); + values = sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new this( name, - 1, tracks ); + + } + + static findByName( objectOrClipArray, name ) { + + let clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + const o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( let i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + } + + static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) { + + const animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + const pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( let i = 0, il = morphTargets.length; i < il; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + const name = parts[ 1 ]; + + let animationMorphTargets = animationToMorphTargets[ name ]; + + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + const clips = []; + + for ( const name in animationToMorphTargets ) { + + clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + } + + // parse the animation.hierarchy format + static parseAnimation( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + const times = []; + const values = []; + + flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + const tracks = []; + + const clipName = animation.name || 'default'; + const fps = animation.fps || 30; + const blendMode = animation.blendMode; + + // automatic length determination in AnimationClip. + let duration = animation.length || - 1; + + const hierarchyTracks = animation.hierarchy || []; + + for ( let h = 0; h < hierarchyTracks.length; h ++ ) { + + const animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + const morphTargetNames = {}; + + let k; + + for ( k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( const morphTargetName in morphTargetNames ) { + + const times = []; + const values = []; + + for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + const animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * fps; + + } else { + + // ...assume skeletal animation + + const boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + const clip = new this( clipName, duration, tracks, blendMode ); + + return clip; + + } + + resetDuration() { + + const tracks = this.tracks; + let duration = 0; + + for ( let i = 0, n = tracks.length; i !== n; ++ i ) { + + const track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + } + + trim() { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + } + + validate() { + + let valid = true; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + } + + optimize() { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + clone() { + + const tracks = []; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + tracks.push( this.tracks[ i ].clone() ); + + } + + return new this.constructor( this.name, this.duration, tracks, this.blendMode ); + + } + + toJSON() { + + return this.constructor.toJSON( this ); + + } + +} + +function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + +} + +function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + const trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + const times = [], values = []; + + flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + +} + +const Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + +class LoadingManager { + + constructor( onLoad, onProgress, onError ) { + + const scope = this; + + let isLoading = false; + let itemsLoaded = 0; + let itemsTotal = 0; + let urlModifier = undefined; + const handlers = []; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + + return this; + + }; + + this.addHandler = function ( regex, loader ) { + + handlers.push( regex, loader ); + + return this; + + }; + + this.removeHandler = function ( regex ) { + + const index = handlers.indexOf( regex ); + + if ( index !== - 1 ) { + + handlers.splice( index, 2 ); + + } + + return this; + + }; + + this.getHandler = function ( file ) { + + for ( let i = 0, l = handlers.length; i < l; i += 2 ) { + + const regex = handlers[ i ]; + const loader = handlers[ i + 1 ]; + + if ( regex.global ) regex.lastIndex = 0; // see #17920 + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + }; + + } + +} + +const DefaultLoadingManager = /*@__PURE__*/ new LoadingManager(); + +class Loader { + + constructor( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.crossOrigin = 'anonymous'; + this.withCredentials = false; + this.path = ''; + this.resourcePath = ''; + this.requestHeader = {}; + + } + + load( /* url, onLoad, onProgress, onError */ ) {} + + loadAsync( url, onProgress ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.load( url, resolve, onProgress, reject ); + + } ); + + } + + parse( /* data */ ) {} + + setCrossOrigin( crossOrigin ) { + + this.crossOrigin = crossOrigin; + return this; + + } + + setWithCredentials( value ) { + + this.withCredentials = value; + return this; + + } + + setPath( path ) { + + this.path = path; + return this; + + } + + setResourcePath( resourcePath ) { + + this.resourcePath = resourcePath; + return this; + + } + + setRequestHeader( requestHeader ) { + + this.requestHeader = requestHeader; + return this; + + } + +} + +Loader.DEFAULT_MATERIAL_NAME = '__DEFAULT'; + +const loading = {}; + +class HttpError extends Error { + + constructor( message, response ) { + + super( message ); + this.response = response; + + } + +} + +class FileLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + this.manager.itemStart( url ); + + setTimeout( () => { + + if ( onLoad ) onLoad( cached ); + + this.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Initialise array for duplicate requests + loading[ url ] = []; + + loading[ url ].push( { + onLoad: onLoad, + onProgress: onProgress, + onError: onError, + } ); + + // create request + const req = new Request( url, { + headers: new Headers( this.requestHeader ), + credentials: this.withCredentials ? 'include' : 'same-origin', + // An abort controller could be added within a future PR + } ); + + // record states ( avoid data race ) + const mimeType = this.mimeType; + const responseType = this.responseType; + + // start the fetch + fetch( req ) + .then( response => { + + if ( response.status === 200 || response.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( response.status === 0 ) { + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + } + + // Workaround: Checking if response.body === undefined for Alipay browser #23548 + + if ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) { + + return response; + + } + + const callbacks = loading[ url ]; + const reader = response.body.getReader(); + + // Nginx needs X-File-Size check + // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content + const contentLength = response.headers.get( 'Content-Length' ) || response.headers.get( 'X-File-Size' ); + const total = contentLength ? parseInt( contentLength ) : 0; + const lengthComputable = total !== 0; + let loaded = 0; + + // periodically read data into the new stream tracking while download progress + const stream = new ReadableStream( { + start( controller ) { + + readData(); + + function readData() { + + reader.read().then( ( { done, value } ) => { + + if ( done ) { + + controller.close(); + + } else { + + loaded += value.byteLength; + + const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } ); + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + controller.enqueue( value ); + readData(); + + } + + } ); + + } + + } + + } ); + + return new Response( stream ); + + } else { + + throw new HttpError( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response ); + + } + + } ) + .then( response => { + + switch ( responseType ) { + + case 'arraybuffer': + + return response.arrayBuffer(); + + case 'blob': + + return response.blob(); + + case 'document': + + return response.text() + .then( text => { + + const parser = new DOMParser(); + return parser.parseFromString( text, mimeType ); + + } ); + + case 'json': + + return response.json(); + + default: + + if ( mimeType === undefined ) { + + return response.text(); + + } else { + + // sniff encoding + const re = /charset="?([^;"\s]*)"?/i; + const exec = re.exec( mimeType ); + const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined; + const decoder = new TextDecoder( label ); + return response.arrayBuffer().then( ab => decoder.decode( ab ) ); + + } + + } + + } ) + .then( data => { + + // Add to cache only on HTTP success, so that we do not cache + // error response bodies as proper responses to requests. + Cache.add( url, data ); + + const callbacks = loading[ url ]; + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( data ); + + } + + } ) + .catch( err => { + + // Abort errors and other errors are handled the same + + const callbacks = loading[ url ]; + + if ( callbacks === undefined ) { + + // When onLoad was called and url was deleted in `loading` + this.manager.itemError( url ); + throw err; + + } + + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( err ); + + } + + this.manager.itemError( url ); + + } ) + .finally( () => { + + this.manager.itemEnd( url ); + + } ); + + this.manager.itemStart( url ); + + } + + setResponseType( value ) { + + this.responseType = value; + return this; + + } + + setMimeType( value ) { + + this.mimeType = value; + return this; + + } + +} + +class AnimationLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( json ) { + + const animations = []; + + for ( let i = 0; i < json.length; i ++ ) { + + const clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + } + +} + +/** + * Abstract Base class to block based textures loader (dds, pvr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + +class CompressedTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const images = []; + + const texture = new CompressedTexture(); + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + + let loaded = 0; + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + const texDatas = scope.parse( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter; + + texture.image = images; + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + for ( let i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + const texDatas = scope.parse( buffer, true ); + + if ( texDatas.isCubemap ) { + + const faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( let f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( let i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + texture.image = images; + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + } + +} + +class ImageLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const image = createElementNS( 'img' ); + + function onImageLoad() { + + removeEventListeners(); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + removeEventListeners(); + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } + + function removeEventListeners() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.slice( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + } + +} + +class CubeTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( urls, onLoad, onProgress, onError ) { + + const texture = new CubeTexture(); + texture.colorSpace = SRGBColorSpace; + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + let loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( let i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + } + +} + +/** + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + +class DataTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const texture = new DataTexture(); + + const loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setPath( this.path ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( buffer ) { + + let texData; + + try { + + texData = scope.parse( buffer ); + + } catch ( error ) { + + if ( onError !== undefined ) { + + onError( error ); + + } else { + + console.error( error ); + return; + + } + + } + + if ( texData.image !== undefined ) { + + texture.image = texData.image; + + } else if ( texData.data !== undefined ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter; + texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter; + + texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1; + + if ( texData.colorSpace !== undefined ) { + + texture.colorSpace = texData.colorSpace; + + } else if ( texData.encoding !== undefined ) { // @deprecated, r152 + + texture.encoding = texData.encoding; + + } + + if ( texData.flipY !== undefined ) { + + texture.flipY = texData.flipY; + + } + + if ( texData.format !== undefined ) { + + texture.format = texData.format; + + } + + if ( texData.type !== undefined ) { + + texture.type = texData.type; + + } + + if ( texData.mipmaps !== undefined ) { + + texture.mipmaps = texData.mipmaps; + texture.minFilter = LinearMipmapLinearFilter; // presumably... + + } + + if ( texData.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + if ( texData.generateMipmaps !== undefined ) { + + texture.generateMipmaps = texData.generateMipmaps; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + +} + +class TextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const texture = new Texture(); + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + } + +} + +class Light extends Object3D { + + constructor( color, intensity = 1 ) { + + super(); + + this.isLight = true; + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity; + + } + + dispose() { + + // Empty here in base class; some subclasses override. + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + +} + +class HemisphereLight extends Light { + + constructor( skyColor, groundColor, intensity ) { + + super( skyColor, intensity ); + + this.isHemisphereLight = true; + + this.type = 'HemisphereLight'; + + this.position.copy( Object3D.DEFAULT_UP ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + +} + +const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4(); +const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3(); +const _lookTarget$1 = /*@__PURE__*/ new Vector3(); + +class LightShadow { + + constructor( camera ) { + + this.camera = camera; + + this.bias = 0; + this.normalBias = 0; + this.radius = 1; + this.blurSamples = 8; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.mapPass = null; + this.matrix = new Matrix4(); + + this.autoUpdate = true; + this.needsUpdate = false; + + this._frustum = new Frustum(); + this._frameExtents = new Vector2( 1, 1 ); + + this._viewportCount = 1; + + this._viewports = [ + + new Vector4( 0, 0, 1, 1 ) + + ]; + + } + + getViewportCount() { + + return this._viewportCount; + + } + + getFrustum() { + + return this._frustum; + + } + + updateMatrices( light ) { + + const shadowCamera = this.camera; + const shadowMatrix = this.matrix; + + _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld$1 ); + + _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget$1 ); + shadowCamera.updateMatrixWorld(); + + _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 ); + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( _projScreenMatrix$1 ); + + } + + getViewport( viewportIndex ) { + + return this._viewports[ viewportIndex ]; + + } + + getFrameExtents() { + + return this._frameExtents; + + } + + dispose() { + + if ( this.map ) { + + this.map.dispose(); + + } + + if ( this.mapPass ) { + + this.mapPass.dispose(); + + } + + } + + copy( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + toJSON() { + + const object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.normalBias !== 0 ) object.normalBias = this.normalBias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + +} + +class SpotLightShadow extends LightShadow { + + constructor() { + + super( new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + this.isSpotLightShadow = true; + + this.focus = 1; + + } + + updateMatrices( light ) { + + const camera = this.camera; + + const fov = RAD2DEG * 2 * light.angle * this.focus; + const aspect = this.mapSize.width / this.mapSize.height; + const far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + super.updateMatrices( light ); + + } + + copy( source ) { + + super.copy( source ); + + this.focus = source.focus; + + return this; + + } + +} + +class SpotLight extends Light { + + constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) { + + super( color, intensity ); + + this.isSpotLight = true; + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DEFAULT_UP ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.distance = distance; + this.angle = angle; + this.penumbra = penumbra; + this.decay = decay; + + this.map = null; + + this.shadow = new SpotLightShadow(); + + } + + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in candela) + // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd) + return this.intensity * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in candela) from the desired luminous power (in lumens) + this.intensity = power / Math.PI; + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); +const _lightPositionWorld = /*@__PURE__*/ new Vector3(); +const _lookTarget = /*@__PURE__*/ new Vector3(); + +class PointLightShadow extends LightShadow { + + constructor() { + + super( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + this.isPointLightShadow = true; + + this._frameExtents = new Vector2( 4, 2 ); + + this._viewportCount = 6; + + this._viewports = [ + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + new Vector4( 2, 1, 1, 1 ), + // negative X + new Vector4( 0, 1, 1, 1 ), + // positive Z + new Vector4( 3, 1, 1, 1 ), + // negative Z + new Vector4( 1, 1, 1, 1 ), + // positive Y + new Vector4( 3, 0, 1, 1 ), + // negative Y + new Vector4( 1, 0, 1, 1 ) + ]; + + this._cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + this._cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + } + + updateMatrices( light, viewportIndex = 0 ) { + + const camera = this.camera; + const shadowMatrix = this.matrix; + + const far = light.distance || camera.far; + + if ( far !== camera.far ) { + + camera.far = far; + camera.updateProjectionMatrix(); + + } + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + camera.position.copy( _lightPositionWorld ); + + _lookTarget.copy( camera.position ); + _lookTarget.add( this._cubeDirections[ viewportIndex ] ); + camera.up.copy( this._cubeUps[ viewportIndex ] ); + camera.lookAt( _lookTarget ); + camera.updateMatrixWorld(); + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( _projScreenMatrix ); + + } + +} + +class PointLight extends Light { + + constructor( color, intensity, distance = 0, decay = 2 ) { + + super( color, intensity ); + + this.isPointLight = true; + + this.type = 'PointLight'; + + this.distance = distance; + this.decay = decay; + + this.shadow = new PointLightShadow(); + + } + + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in candela) + // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd) + return this.intensity * 4 * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in candela) from the desired luminous power (in lumens) + this.intensity = power / ( 4 * Math.PI ); + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +class DirectionalLightShadow extends LightShadow { + + constructor() { + + super( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + this.isDirectionalLightShadow = true; + + } + +} + +class DirectionalLight extends Light { + + constructor( color, intensity ) { + + super( color, intensity ); + + this.isDirectionalLight = true; + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DEFAULT_UP ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source ) { + + super.copy( source ); + + this.target = source.target.clone(); + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +class AmbientLight extends Light { + + constructor( color, intensity ) { + + super( color, intensity ); + + this.isAmbientLight = true; + + this.type = 'AmbientLight'; + + } + +} + +class RectAreaLight extends Light { + + constructor( color, intensity, width = 10, height = 10 ) { + + super( color, intensity ); + + this.isRectAreaLight = true; + + this.type = 'RectAreaLight'; + + this.width = width; + this.height = height; + + } + + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in nits) + return this.intensity * this.width * this.height * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in nits) from the desired luminous power (in lumens) + this.intensity = power / ( this.width * this.height * Math.PI ); + + } + + copy( source ) { + + super.copy( source ); + + this.width = source.width; + this.height = source.height; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + +} + +/** + * Primary reference: + * https://graphics.stanford.edu/papers/envmap/envmap.pdf + * + * Secondary reference: + * https://www.ppsloan.org/publications/StupidSH36.pdf + */ + +// 3-band SH defined by 9 coefficients + +class SphericalHarmonics3 { + + constructor() { + + this.isSphericalHarmonics3 = true; + + this.coefficients = []; + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients.push( new Vector3() ); + + } + + } + + set( coefficients ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].copy( coefficients[ i ] ); + + } + + return this; + + } + + zero() { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].set( 0, 0, 0 ); + + } + + return this; + + } + + // get the radiance in the direction of the normal + // target is a Vector3 + getAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 ); + + // band 1 + target.addScaledVector( coeff[ 1 ], 0.488603 * y ); + target.addScaledVector( coeff[ 2 ], 0.488603 * z ); + target.addScaledVector( coeff[ 3 ], 0.488603 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) ); + target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) ); + target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) ); + target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) ); + target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) ); + + return target; + + } + + // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal + // target is a Vector3 + // https://graphics.stanford.edu/papers/envmap/envmap.pdf + getIrradianceAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095 + + // band 1 + target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603 + target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z ); + target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548 + target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z ); + target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3 + target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z ); + target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274 + + return target; + + } + + add( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].add( sh.coefficients[ i ] ); + + } + + return this; + + } + + addScaledSH( sh, s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s ); + + } + + return this; + + } + + scale( s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].multiplyScalar( s ); + + } + + return this; + + } + + lerp( sh, alpha ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha ); + + } + + return this; + + } + + equals( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) { + + return false; + + } + + } + + return true; + + } + + copy( sh ) { + + return this.set( sh.coefficients ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + fromArray( array, offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].fromArray( array, offset + ( i * 3 ) ); + + } + + return this; + + } + + toArray( array = [], offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].toArray( array, offset + ( i * 3 ) ); + + } + + return array; + + } + + // evaluate the basis functions + // shBasis is an Array[ 9 ] + static getBasisAt( normal, shBasis ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + // band 0 + shBasis[ 0 ] = 0.282095; + + // band 1 + shBasis[ 1 ] = 0.488603 * y; + shBasis[ 2 ] = 0.488603 * z; + shBasis[ 3 ] = 0.488603 * x; + + // band 2 + shBasis[ 4 ] = 1.092548 * x * y; + shBasis[ 5 ] = 1.092548 * y * z; + shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 ); + shBasis[ 7 ] = 1.092548 * x * z; + shBasis[ 8 ] = 0.546274 * ( x * x - y * y ); + + } + +} + +class LightProbe extends Light { + + constructor( sh = new SphericalHarmonics3(), intensity = 1 ) { + + super( undefined, intensity ); + + this.isLightProbe = true; + + this.sh = sh; + + } + + copy( source ) { + + super.copy( source ); + + this.sh.copy( source.sh ); + + return this; + + } + + fromJSON( json ) { + + this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON(); + this.sh.fromArray( json.sh ); + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.sh = this.sh.toArray(); + + return data; + + } + +} + +class MaterialLoader extends Loader { + + constructor( manager ) { + + super( manager ); + this.textures = {}; + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( json ) { + + const textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + const material = MaterialLoader.createMaterialFromType( json.type ); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.sheen !== undefined ) material.sheen = json.sheen; + if ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor ); + if ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness; + if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity; + if ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat; + if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness; + if ( json.iridescence !== undefined ) material.iridescence = json.iridescence; + if ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR; + if ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange; + if ( json.transmission !== undefined ) material.transmission = json.transmission; + if ( json.thickness !== undefined ) material.thickness = json.thickness; + if ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance; + if ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor ); + if ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy; + if ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash; + if ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc; + if ( json.blendDst !== undefined ) material.blendDst = json.blendDst; + if ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation; + if ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha; + if ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha; + if ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha; + if ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor ); + if ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha; + if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask; + if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc; + if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef; + if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask; + if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail; + if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail; + if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass; + if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite; + + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== undefined ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage; + if ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha; + if ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass; + + if ( json.visible !== undefined ) material.visible = json.visible; + + if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped; + + if ( json.userData !== undefined ) material.userData = json.userData; + + if ( json.vertexColors !== undefined ) { + + if ( typeof json.vertexColors === 'number' ) { + + material.vertexColors = ( json.vertexColors > 0 ) ? true : false; + + } else { + + material.vertexColors = json.vertexColors; + + } + + } + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( const name in json.uniforms ) { + + const uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm3': + material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion; + + if ( json.extensions !== undefined ) { + + for ( const key in json.extensions ) { + + material.extensions[ key ] = json.extensions[ key ]; + + } + + } + + if ( json.lights !== undefined ) material.lights = json.lights; + if ( json.clipping !== undefined ) material.clipping = json.clipping; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap ); + + if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap ); + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + let normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + if ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap ); + if ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap ); + if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap ); + if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap ); + if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale ); + + if ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap ); + if ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap ); + + if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap ); + if ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap ); + + if ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap ); + + if ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap ); + if ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap ); + + return material; + + } + + setTextures( value ) { + + this.textures = value; + return this; + + } + + static createMaterialFromType( type ) { + + const materialLib = { + ShadowMaterial, + SpriteMaterial, + RawShaderMaterial, + ShaderMaterial, + PointsMaterial, + MeshPhysicalMaterial, + MeshStandardMaterial, + MeshPhongMaterial, + MeshToonMaterial, + MeshNormalMaterial, + MeshLambertMaterial, + MeshDepthMaterial, + MeshDistanceMaterial, + MeshBasicMaterial, + MeshMatcapMaterial, + LineDashedMaterial, + LineBasicMaterial, + Material + }; + + return new materialLib[ type ](); + + } + +} + +class LoaderUtils { + + static decodeText( array ) { + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + let s = ''; + + for ( let i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + try { + + // merges multi-byte utf-8 characters. + + return decodeURIComponent( escape( s ) ); + + } catch ( e ) { // see #16358 + + return s; + + } + + } + + static extractUrlBase( url ) { + + const index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.slice( 0, index + 1 ); + + } + + static resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + + } + +} + +class InstancedBufferGeometry extends BufferGeometry { + + constructor() { + + super(); + + this.isInstancedBufferGeometry = true; + + this.type = 'InstancedBufferGeometry'; + this.instanceCount = Infinity; + + } + + copy( source ) { + + super.copy( source ); + + this.instanceCount = source.instanceCount; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.instanceCount = this.instanceCount; + + data.isInstancedBufferGeometry = true; + + return data; + + } + +} + +class BufferGeometryLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( json ) { + + const interleavedBufferMap = {}; + const arrayBufferMap = {}; + + function getInterleavedBuffer( json, uuid ) { + + if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ]; + + const interleavedBuffers = json.interleavedBuffers; + const interleavedBuffer = interleavedBuffers[ uuid ]; + + const buffer = getArrayBuffer( json, interleavedBuffer.buffer ); + + const array = getTypedArray( interleavedBuffer.type, buffer ); + const ib = new InterleavedBuffer( array, interleavedBuffer.stride ); + ib.uuid = interleavedBuffer.uuid; + + interleavedBufferMap[ uuid ] = ib; + + return ib; + + } + + function getArrayBuffer( json, uuid ) { + + if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ]; + + const arrayBuffers = json.arrayBuffers; + const arrayBuffer = arrayBuffers[ uuid ]; + + const ab = new Uint32Array( arrayBuffer ).buffer; + + arrayBufferMap[ uuid ] = ab; + + return ab; + + } + + const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); + + const index = json.data.index; + + if ( index !== undefined ) { + + const typedArray = getTypedArray( index.type, index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + const attributes = json.data.attributes; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + let bufferAttribute; + + if ( attribute.isInterleavedBufferAttribute ) { + + const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); + bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); + + } else { + + const typedArray = getTypedArray( attribute.type, attribute.array ); + const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; + bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized ); + + } + + if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; + if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage ); + + geometry.setAttribute( key, bufferAttribute ); + + } + + const morphAttributes = json.data.morphAttributes; + + if ( morphAttributes ) { + + for ( const key in morphAttributes ) { + + const attributeArray = morphAttributes[ key ]; + + const array = []; + + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { + + const attribute = attributeArray[ i ]; + let bufferAttribute; + + if ( attribute.isInterleavedBufferAttribute ) { + + const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); + bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); + + } else { + + const typedArray = getTypedArray( attribute.type, attribute.array ); + bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ); + + } + + if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; + array.push( bufferAttribute ); + + } + + geometry.morphAttributes[ key ] = array; + + } + + } + + const morphTargetsRelative = json.data.morphTargetsRelative; + + if ( morphTargetsRelative ) { + + geometry.morphTargetsRelative = true; + + } + + const groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( let i = 0, n = groups.length; i !== n; ++ i ) { + + const group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + const boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + const center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + if ( json.name ) geometry.name = json.name; + if ( json.userData ) geometry.userData = json.userData; + + return geometry; + + } + +} + +class ObjectLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + let json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + const metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + if ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\'t load ' + url ) ); + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + } + + async loadAsync( url, onProgress ) { + + const scope = this; + + const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + const loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + const text = await loader.loadAsync( url, onProgress ); + + const json = JSON.parse( text ); + + const metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url ); + + } + + return await scope.parseAsync( json ); + + } + + parse( json, onLoad ) { + + const animations = this.parseAnimations( json.animations ); + const shapes = this.parseShapes( json.shapes ); + const geometries = this.parseGeometries( json.geometries, shapes ); + + const images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + const textures = this.parseTextures( json.textures, images ); + const materials = this.parseMaterials( json.materials, textures ); + + const object = this.parseObject( json.object, geometries, materials, textures, animations ); + const skeletons = this.parseSkeletons( json.skeletons, object ); + + this.bindSkeletons( object, skeletons ); + + // + + if ( onLoad !== undefined ) { + + let hasImages = false; + + for ( const uuid in images ) { + + if ( images[ uuid ].data instanceof HTMLImageElement ) { + + hasImages = true; + break; + + } + + } + + if ( hasImages === false ) onLoad( object ); + + } + + return object; + + } + + async parseAsync( json ) { + + const animations = this.parseAnimations( json.animations ); + const shapes = this.parseShapes( json.shapes ); + const geometries = this.parseGeometries( json.geometries, shapes ); + + const images = await this.parseImagesAsync( json.images ); + + const textures = this.parseTextures( json.textures, images ); + const materials = this.parseMaterials( json.materials, textures ); + + const object = this.parseObject( json.object, geometries, materials, textures, animations ); + const skeletons = this.parseSkeletons( json.skeletons, object ); + + this.bindSkeletons( object, skeletons ); + + return object; + + } + + parseShapes( json ) { + + const shapes = {}; + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + } + + parseSkeletons( json, object ) { + + const skeletons = {}; + const bones = {}; + + // generate bone lookup table + + object.traverse( function ( child ) { + + if ( child.isBone ) bones[ child.uuid ] = child; + + } ); + + // create skeletons + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const skeleton = new Skeleton().fromJSON( json[ i ], bones ); + + skeletons[ skeleton.uuid ] = skeleton; + + } + + } + + return skeletons; + + } + + parseGeometries( json, shapes ) { + + const geometries = {}; + + if ( json !== undefined ) { + + const bufferGeometryLoader = new BufferGeometryLoader(); + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + let geometry; + const data = json[ i ]; + + switch ( data.type ) { + + case 'BufferGeometry': + case 'InstancedBufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + break; + + default: + + if ( data.type in Geometries ) { + + geometry = Geometries[ data.type ].fromJSON( data, shapes ); + + } else { + + console.warn( `THREE.ObjectLoader: Unsupported geometry type "${ data.type }"` ); + + } + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + } + + parseMaterials( json, textures ) { + + const cache = {}; // MultiMaterial + const materials = {}; + + if ( json !== undefined ) { + + const loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const data = json[ i ]; + + if ( cache[ data.uuid ] === undefined ) { + + cache[ data.uuid ] = loader.parse( data ); + + } + + materials[ data.uuid ] = cache[ data.uuid ]; + + } + + } + + return materials; + + } + + parseAnimations( json ) { + + const animations = {}; + + if ( json !== undefined ) { + + for ( let i = 0; i < json.length; i ++ ) { + + const data = json[ i ]; + + const clip = AnimationClip.parse( data ); + + animations[ clip.uuid ] = clip; + + } + + } + + return animations; + + } + + parseImages( json, onLoad ) { + + const scope = this; + const images = {}; + + let loader; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + } + + function deserializeImage( image ) { + + if ( typeof image === 'string' ) { + + const url = image; + + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; + + return loadImage( path ); + + } else { + + if ( image.data ) { + + return { + data: getTypedArray( image.type, image.data ), + width: image.width, + height: image.height + }; + + } else { + + return null; + + } + + } + + } + + if ( json !== undefined && json.length > 0 ) { + + const manager = new LoadingManager( onLoad ); + + loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( let i = 0, il = json.length; i < il; i ++ ) { + + const image = json[ i ]; + const url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + const imageArray = []; + + for ( let j = 0, jl = url.length; j < jl; j ++ ) { + + const currentUrl = url[ j ]; + + const deserializedImage = deserializeImage( currentUrl ); + + if ( deserializedImage !== null ) { + + if ( deserializedImage instanceof HTMLImageElement ) { + + imageArray.push( deserializedImage ); + + } else { + + // special case: handle array of data textures for cube textures + + imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); + + } + + } + + } + + images[ image.uuid ] = new Source( imageArray ); + + } else { + + // load single image + + const deserializedImage = deserializeImage( image.url ); + images[ image.uuid ] = new Source( deserializedImage ); + + + } + + } + + } + + return images; + + } + + async parseImagesAsync( json ) { + + const scope = this; + const images = {}; + + let loader; + + async function deserializeImage( image ) { + + if ( typeof image === 'string' ) { + + const url = image; + + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; + + return await loader.loadAsync( path ); + + } else { + + if ( image.data ) { + + return { + data: getTypedArray( image.type, image.data ), + width: image.width, + height: image.height + }; + + } else { + + return null; + + } + + } + + } + + if ( json !== undefined && json.length > 0 ) { + + loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( let i = 0, il = json.length; i < il; i ++ ) { + + const image = json[ i ]; + const url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + const imageArray = []; + + for ( let j = 0, jl = url.length; j < jl; j ++ ) { + + const currentUrl = url[ j ]; + + const deserializedImage = await deserializeImage( currentUrl ); + + if ( deserializedImage !== null ) { + + if ( deserializedImage instanceof HTMLImageElement ) { + + imageArray.push( deserializedImage ); + + } else { + + // special case: handle array of data textures for cube textures + + imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); + + } + + } + + } + + images[ image.uuid ] = new Source( imageArray ); + + } else { + + // load single image + + const deserializedImage = await deserializeImage( image.url ); + images[ image.uuid ] = new Source( deserializedImage ); + + } + + } + + } + + return images; + + } + + parseTextures( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + const textures = {}; + + if ( json !== undefined ) { + + for ( let i = 0, l = json.length; i < l; i ++ ) { + + const data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + const source = images[ data.image ]; + const image = source.data; + + let texture; + + if ( Array.isArray( image ) ) { + + texture = new CubeTexture(); + + if ( image.length === 6 ) texture.needsUpdate = true; + + } else { + + if ( image && image.data ) { + + texture = new DataTexture(); + + } else { + + texture = new Texture(); + + } + + if ( image ) texture.needsUpdate = true; // textures can have undefined image data + + } + + texture.source = source; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + if ( data.channel !== undefined ) texture.channel = data.channel; + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + if ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat; + if ( data.type !== undefined ) texture.type = data.type; + if ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace; + if ( data.encoding !== undefined ) texture.encoding = data.encoding; // @deprecated, r152 + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + if ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps; + if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha; + if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment; + if ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction; + + if ( data.userData !== undefined ) texture.userData = data.userData; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + } + + parseObject( data, geometries, materials, textures, animations ) { + + let object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + const array = []; + + for ( let i = 0, l = name.length; i < l; i ++ ) { + + const uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + function getTexture( uuid ) { + + if ( textures[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined texture', uuid ); + + } + + return textures[ uuid ]; + + } + + let geometry, material; + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } else { + + object.background = getTexture( data.background ); + + } + + } + + if ( data.environment !== undefined ) { + + object.environment = getTexture( data.environment ); + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + if ( data.fog.name !== '' ) { + + object.fog.name = data.fog.name; + + } + + } + + if ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness; + if ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity; + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'LightProbe': + + object = new LightProbe().fromJSON( data ); + + break; + + case 'SkinnedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new SkinnedMesh( geometry, material ); + + if ( data.bindMode !== undefined ) object.bindMode = data.bindMode; + if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix ); + if ( data.skeleton !== undefined ) object.skeleton = data.skeleton; + + break; + + case 'Mesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new Mesh( geometry, material ); + + break; + + case 'InstancedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + const count = data.count; + const instanceMatrix = data.instanceMatrix; + const instanceColor = data.instanceColor; + + object = new InstancedMesh( geometry, material, count ); + object.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 ); + if ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize ); + + break; + + case 'BatchedMesh': + + geometry = getGeometry( data.geometry ); + material = getMaterial( data.material ); + + object = new BatchedMesh( data.maxGeometryCount, data.maxVertexCount, data.maxIndexCount, material ); + object.geometry = geometry; + object.perObjectFrustumCulled = data.perObjectFrustumCulled; + object.sortObjects = data.sortObjects; + + object._drawRanges = data.drawRanges; + object._reservedRanges = data.reservedRanges; + + object._visibility = data.visibility; + object._active = data.active; + object._bounds = data.bounds.map( bound => { + + const box = new Box3(); + box.min.fromArray( bound.boxMin ); + box.max.fromArray( bound.boxMax ); + + const sphere = new Sphere(); + sphere.radius = bound.sphereRadius; + sphere.center.fromArray( bound.sphereCenter ); + + return { + boxInitialized: bound.boxInitialized, + box: box, + + sphereInitialized: bound.sphereInitialized, + sphere: sphere + }; + + } ); + + object._maxGeometryCount = data.maxGeometryCount; + object._maxVertexCount = data.maxVertexCount; + object._maxIndexCount = data.maxIndexCount; + + object._geometryInitialized = data.geometryInitialized; + object._geometryCount = data.geometryCount; + + object._matricesTexture = getTexture( data.matricesTexture.uuid ); + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + case 'Bone': + + object = new Bone(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.up !== undefined ) object.up.fromArray( data.up ); + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + const children = data.children; + + for ( let i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) ); + + } + + } + + if ( data.animations !== undefined ) { + + const objectAnimations = data.animations; + + for ( let i = 0; i < objectAnimations.length; i ++ ) { + + const uuid = objectAnimations[ i ]; + + object.animations.push( animations[ uuid ] ); + + } + + } + + if ( data.type === 'LOD' ) { + + if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate; + + const levels = data.levels; + + for ( let l = 0; l < levels.length; l ++ ) { + + const level = levels[ l ]; + const child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance, level.hysteresis ); + + } + + } + + } + + return object; + + } + + bindSkeletons( object, skeletons ) { + + if ( Object.keys( skeletons ).length === 0 ) return; + + object.traverse( function ( child ) { + + if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) { + + const skeleton = skeletons[ child.skeleton ]; + + if ( skeleton === undefined ) { + + console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton ); + + } else { + + child.bind( skeleton, child.bindMatrix ); + + } + + } + + } ); + + } + +} + +const TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping +}; + +const TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping +}; + +const TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipmapNearestFilter: NearestMipmapNearestFilter, + NearestMipmapLinearFilter: NearestMipmapLinearFilter, + LinearFilter: LinearFilter, + LinearMipmapNearestFilter: LinearMipmapNearestFilter, + LinearMipmapLinearFilter: LinearMipmapLinearFilter +}; + +class ImageBitmapLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.isImageBitmapLoader = true; + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.options = { premultiplyAlpha: 'none' }; + + } + + setOptions( options ) { + + this.options = options; + + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + // If cached is a promise, wait for it to resolve + if ( cached.then ) { + + cached.then( imageBitmap => { + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( e => { + + if ( onError ) onError( e ); + + } ); + return; + + } + + // If cached is not a promise (i.e., it's already an imageBitmap) + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const fetchOptions = {}; + fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include'; + fetchOptions.headers = this.requestHeader; + + const promise = fetch( url, fetchOptions ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + return imageBitmap; + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + Cache.remove( url ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + Cache.add( url, promise ); + scope.manager.itemStart( url ); + + } + +} + +let _context; + +class AudioContext { + + static getContext() { + + if ( _context === undefined ) { + + _context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return _context; + + } + + static setContext( value ) { + + _context = value; + + } + +} + +class AudioLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( buffer ) { + + try { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + const bufferCopy = buffer.slice( 0 ); + + const context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ).catch( handleError ); + + } catch ( e ) { + + handleError( e ); + + } + + }, onProgress, onError ); + + function handleError( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + } + +} + +const _eyeRight = /*@__PURE__*/ new Matrix4(); +const _eyeLeft = /*@__PURE__*/ new Matrix4(); +const _projectionMatrix = /*@__PURE__*/ new Matrix4(); + +class StereoCamera { + + constructor() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + this._cache = { + focus: null, + fov: null, + aspect: null, + near: null, + far: null, + zoom: null, + eyeSep: null + }; + + } + + update( camera ) { + + const cache = this._cache; + + const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || + cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || + cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + cache.focus = camera.focus; + cache.fov = camera.fov; + cache.aspect = camera.aspect * this.aspect; + cache.near = camera.near; + cache.far = camera.far; + cache.zoom = camera.zoom; + cache.eyeSep = this.eyeSep; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + _projectionMatrix.copy( camera.projectionMatrix ); + const eyeSepHalf = cache.eyeSep / 2; + const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; + const ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom; + let xmin, xmax; + + // translate xOffset + + _eyeLeft.elements[ 12 ] = - eyeSepHalf; + _eyeRight.elements[ 12 ] = eyeSepHalf; + + // for left eye + + xmin = - ymax * cache.aspect + eyeSepOnProjection; + xmax = ymax * cache.aspect + eyeSepOnProjection; + + _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); + _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( _projectionMatrix ); + + // for right eye + + xmin = - ymax * cache.aspect - eyeSepOnProjection; + xmax = ymax * cache.aspect - eyeSepOnProjection; + + _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); + _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( _projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight ); + + } + +} + +class Clock { + + constructor( autoStart = true ) { + + this.autoStart = autoStart; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + start() { + + this.startTime = now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + } + + stop() { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + } + + getElapsedTime() { + + this.getDelta(); + return this.elapsedTime; + + } + + getDelta() { + + let diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + const newTime = now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + +} + +function now() { + + return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + +} + +const _position$1 = /*@__PURE__*/ new Vector3(); +const _quaternion$1 = /*@__PURE__*/ new Quaternion(); +const _scale$1 = /*@__PURE__*/ new Vector3(); +const _orientation$1 = /*@__PURE__*/ new Vector3(); + +class AudioListener extends Object3D { + + constructor() { + + super(); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + this.timeDelta = 0; + + // private + + this._clock = new Clock(); + + } + + getInput() { + + return this.gain; + + } + + removeFilter() { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + } + + getFilter() { + + return this.filter; + + } + + setFilter( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + } + + getMasterVolume() { + + return this.gain.gain.value; + + } + + setMasterVolume( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + const listener = this.context.listener; + const up = this.up; + + this.timeDelta = this._clock.getDelta(); + + this.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 ); + + _orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 ); + + if ( listener.positionX ) { + + // code path for Chrome (see #14393) + + const endTime = this.context.currentTime + this.timeDelta; + + listener.positionX.linearRampToValueAtTime( _position$1.x, endTime ); + listener.positionY.linearRampToValueAtTime( _position$1.y, endTime ); + listener.positionZ.linearRampToValueAtTime( _position$1.z, endTime ); + listener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime ); + listener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime ); + listener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime ); + listener.upX.linearRampToValueAtTime( up.x, endTime ); + listener.upY.linearRampToValueAtTime( up.y, endTime ); + listener.upZ.linearRampToValueAtTime( up.z, endTime ); + + } else { + + listener.setPosition( _position$1.x, _position$1.y, _position$1.z ); + listener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z ); + + } + + } + +} + +class Audio extends Object3D { + + constructor( listener ) { + + super(); + + this.type = 'Audio'; + + this.listener = listener; + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.detune = 0; + this.loop = false; + this.loopStart = 0; + this.loopEnd = 0; + this.offset = 0; + this.duration = undefined; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.source = null; + this.sourceType = 'empty'; + + this._startedAt = 0; + this._progress = 0; + this._connected = false; + + this.filters = []; + + } + + getOutput() { + + return this.gain; + + } + + setNodeSource( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + } + + setMediaElementSource( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + } + + setMediaStreamSource( mediaStream ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaStreamNode'; + this.source = this.context.createMediaStreamSource( mediaStream ); + this.connect(); + + return this; + + } + + setBuffer( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + } + + play( delay = 0 ) { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this._startedAt = this.context.currentTime + delay; + + const source = this.context.createBufferSource(); + source.buffer = this.buffer; + source.loop = this.loop; + source.loopStart = this.loopStart; + source.loopEnd = this.loopEnd; + source.onended = this.onEnded.bind( this ); + source.start( this._startedAt, this._progress + this.offset, this.duration ); + + this.isPlaying = true; + + this.source = source; + + this.setDetune( this.detune ); + this.setPlaybackRate( this.playbackRate ); + + return this.connect(); + + } + + pause() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + // update current progress + + this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate; + + if ( this.loop === true ) { + + // ensure _progress does not exceed duration with looped audios + + this._progress = this._progress % ( this.duration || this.buffer.duration ); + + } + + this.source.stop(); + this.source.onended = null; + + this.isPlaying = false; + + } + + return this; + + } + + stop() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this._progress = 0; + + if ( this.source !== null ) { + + this.source.stop(); + this.source.onended = null; + + } + + this.isPlaying = false; + + return this; + + } + + connect() { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( let i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + this._connected = true; + + return this; + + } + + disconnect() { + + if ( this._connected === false ) { + + return; + + } + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( let i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + this._connected = false; + + return this; + + } + + getFilters() { + + return this.filters; + + } + + setFilters( value ) { + + if ( ! value ) value = []; + + if ( this._connected === true ) { + + this.disconnect(); + this.filters = value.slice(); + this.connect(); + + } else { + + this.filters = value.slice(); + + } + + return this; + + } + + setDetune( value ) { + + this.detune = value; + + if ( this.source.detune === undefined ) return; // only set detune when available + + if ( this.isPlaying === true ) { + + this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 ); + + } + + return this; + + } + + getDetune() { + + return this.detune; + + } + + getFilter() { + + return this.getFilters()[ 0 ]; + + } + + setFilter( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + } + + setPlaybackRate( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 ); + + } + + return this; + + } + + getPlaybackRate() { + + return this.playbackRate; + + } + + onEnded() { + + this.isPlaying = false; + + } + + getLoop() { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + } + + setLoop( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + } + + setLoopStart( value ) { + + this.loopStart = value; + + return this; + + } + + setLoopEnd( value ) { + + this.loopEnd = value; + + return this; + + } + + getVolume() { + + return this.gain.gain.value; + + } + + setVolume( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + +} + +const _position = /*@__PURE__*/ new Vector3(); +const _quaternion = /*@__PURE__*/ new Quaternion(); +const _scale = /*@__PURE__*/ new Vector3(); +const _orientation = /*@__PURE__*/ new Vector3(); + +class PositionalAudio extends Audio { + + constructor( listener ) { + + super( listener ); + + this.panner = this.context.createPanner(); + this.panner.panningModel = 'HRTF'; + this.panner.connect( this.gain ); + + } + + connect() { + + super.connect(); + + this.panner.connect( this.gain ); + + } + + disconnect() { + + super.disconnect(); + + this.panner.disconnect( this.gain ); + + } + + getOutput() { + + return this.panner; + + } + + getRefDistance() { + + return this.panner.refDistance; + + } + + setRefDistance( value ) { + + this.panner.refDistance = value; + + return this; + + } + + getRolloffFactor() { + + return this.panner.rolloffFactor; + + } + + setRolloffFactor( value ) { + + this.panner.rolloffFactor = value; + + return this; + + } + + getDistanceModel() { + + return this.panner.distanceModel; + + } + + setDistanceModel( value ) { + + this.panner.distanceModel = value; + + return this; + + } + + getMaxDistance() { + + return this.panner.maxDistance; + + } + + setMaxDistance( value ) { + + this.panner.maxDistance = value; + + return this; + + } + + setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + if ( this.hasPlaybackControl === true && this.isPlaying === false ) return; + + this.matrixWorld.decompose( _position, _quaternion, _scale ); + + _orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion ); + + const panner = this.panner; + + if ( panner.positionX ) { + + // code path for Chrome and Firefox (see #14393) + + const endTime = this.context.currentTime + this.listener.timeDelta; + + panner.positionX.linearRampToValueAtTime( _position.x, endTime ); + panner.positionY.linearRampToValueAtTime( _position.y, endTime ); + panner.positionZ.linearRampToValueAtTime( _position.z, endTime ); + panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime ); + panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime ); + panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime ); + + } else { + + panner.setPosition( _position.x, _position.y, _position.z ); + panner.setOrientation( _orientation.x, _orientation.y, _orientation.z ); + + } + + } + +} + +class AudioAnalyser { + + constructor( audio, fftSize = 2048 ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + + getFrequencyData() { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + } + + getAverageFrequency() { + + let value = 0; + const data = this.getFrequencyData(); + + for ( let i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + +} + +class PropertyMixer { + + constructor( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + let mixFunction, + mixFunctionAdditive, + setIdentity; + + // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + // + // 'add' is used for additive cumulative results + // + // 'work' is optional and is only present for quaternion types. It is used + // to store intermediate quaternion multiplication results + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + mixFunctionAdditive = this._slerpAdditive; + setIdentity = this._setAdditiveIdentityQuaternion; + + this.buffer = new Float64Array( valueSize * 6 ); + this._workIndex = 5; + break; + + case 'string': + case 'bool': + mixFunction = this._select; + + // Use the regular mix function and for additive on these types, + // additive is not relevant for non-numeric types + mixFunctionAdditive = this._select; + + setIdentity = this._setAdditiveIdentityOther; + + this.buffer = new Array( valueSize * 5 ); + break; + + default: + mixFunction = this._lerp; + mixFunctionAdditive = this._lerpAdditive; + setIdentity = this._setAdditiveIdentityNumeric; + + this.buffer = new Float64Array( valueSize * 5 ); + + } + + this._mixBufferRegion = mixFunction; + this._mixBufferRegionAdditive = mixFunctionAdditive; + this._setIdentity = setIdentity; + this._origIndex = 3; + this._addIndex = 4; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + // accumulate data in the 'incoming' region into 'accu' + accumulate( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + const buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride; + + let currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + const mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + } + + // accumulate data in the 'incoming' region into 'add' + accumulateAdditive( weight ) { + + const buffer = this.buffer, + stride = this.valueSize, + offset = stride * this._addIndex; + + if ( this.cumulativeWeightAdditive === 0 ) { + + // add = identity + + this._setIdentity(); + + } + + // add := add + incoming * weight + + this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride ); + this.cumulativeWeightAdditive += weight; + + } + + // apply the state of 'accu' to the binding when accus differ + apply( accuIndex ) { + + const stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + weightAdditive = this.cumulativeWeightAdditive, + + binding = this.binding; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + const originalValueOffset = stride * this._origIndex; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + if ( weightAdditive > 0 ) { + + // accuN := accuN + additive accuN + + this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride ); + + } + + for ( let i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + } + + // remember the state of the bound property and copy it to both accus + saveOriginalState() { + + const binding = this.binding; + + const buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * this._origIndex; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + // Add to identity for additive + this._setIdentity(); + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + } + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState() { + + const originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + } + + _setAdditiveIdentityNumeric() { + + const startIndex = this._addIndex * this.valueSize; + const endIndex = startIndex + this.valueSize; + + for ( let i = startIndex; i < endIndex; i ++ ) { + + this.buffer[ i ] = 0; + + } + + } + + _setAdditiveIdentityQuaternion() { + + this._setAdditiveIdentityNumeric(); + this.buffer[ this._addIndex * this.valueSize + 3 ] = 1; + + } + + _setAdditiveIdentityOther() { + + const startIndex = this._origIndex * this.valueSize; + const targetIndex = this._addIndex * this.valueSize; + + for ( let i = 0; i < this.valueSize; i ++ ) { + + this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ]; + + } + + } + + + // mix functions + + _select( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + } + + _slerp( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + } + + _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { + + const workOffset = this._workIndex * stride; + + // Store result in intermediate buffer offset + Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset ); + + // Slerp to the intermediate result + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t ); + + } + + _lerp( buffer, dstOffset, srcOffset, t, stride ) { + + const s = 1 - t; + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t; + + } + + } + +} + +// Characters [].:/ are reserved for track binding syntax. +const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; +const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' ); + +// Attempts to allow node names from any language. ES5's `\w` regexp matches +// only latin characters, and the unicode \p{L} is not yet supported. So +// instead, we exclude reserved characters and match everything else. +const _wordChar = '[^' + _RESERVED_CHARS_RE + ']'; +const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + +// Parent directories, delimited by '/' or ':'. Currently unused, but must +// be matched to parse the rest of the track name. +const _directoryRe = /*@__PURE__*/ /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar ); + +// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. +const _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot ); + +// Object on target node, and accessor. May not contain reserved +// characters. Accessor may contain any character except closing bracket. +const _objectRe = /*@__PURE__*/ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar ); + +// Property and accessor. May not contain reserved characters. Accessor may +// contain any non-bracket characters. +const _propertyRe = /*@__PURE__*/ /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar ); + +const _trackRe = new RegExp( '' + + '^' + + _directoryRe + + _nodeRe + + _objectRe + + _propertyRe + + '$' +); + +const _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ]; + +class Composite { + + constructor( targetGroup, path, optionalParsedPath ) { + + const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + getValue( array, offset ) { + + this.bind(); // bind all binding + + const firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + } + + setValue( array, offset ) { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + } + + bind() { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + } + + unbind() { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + +} + +// Note: This class uses a State pattern on a per-method basis: +// 'bind' sets 'this.getValue' / 'setValue' and shadows the +// prototype version of these methods with one that represents +// the bound state. When the property is not found, the methods +// become no-ops. +class PropertyBinding { + + constructor( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ); + + this.rootNode = rootNode; + + // initial state of these methods that calls 'bind' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + + static create( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + } + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + static sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( _reservedRe, '' ); + + } + + static parseTrackName( trackName ) { + + const matches = _trackRe.exec( trackName ); + + if ( matches === null ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + const results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + const objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against an allowlist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + } + + static findNode( root, nodeName ) { + + if ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + const bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + const searchNodeSubtree = function ( children ) { + + for ( let i = 0; i < children.length; i ++ ) { + + const childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + const result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + const subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + // these are used to "bind" a nonexistent property + _getValue_unavailable() {} + _setValue_unavailable() {} + + // Getters + + _getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.targetObject[ this.propertyName ]; + + } + + _getValue_array( buffer, offset ) { + + const source = this.resolvedProperty; + + for ( let i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + } + + _getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + } + + _getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + // Direct + + _setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + } + + _setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + } + + _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // EntireArray + + _setValue_array( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + } + + _setValue_array_setNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + } + + _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // ArrayElement + + _setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + } + + _setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + } + + _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // HasToFromArray + + _setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + } + + _setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + } + + _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + _getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + } + + _setValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + } + + // create getter / setter pair for a property in the scene graph + bind() { + + let targetObject = this.node; + const parsedPath = this.parsedPath; + + const objectName = parsedPath.objectName; + const propertyName = parsedPath.propertyName; + let propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ); + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.warn( 'THREE.PropertyBinding: No target node found for track: ' + this.path + '.' ); + return; + + } + + if ( objectName ) { + + let objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( let i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + case 'map': + + if ( 'map' in targetObject ) { + + targetObject = targetObject.map; + break; + + } + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.map ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this ); + return; + + } + + targetObject = targetObject.material.map; + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + const nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + const nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + let versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + let bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === 'morphTargetInfluences' ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) { + + propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ]; + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + } + + unbind() { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + +} + +PropertyBinding.Composite = Composite; + +PropertyBinding.prototype.BindingType = { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 +}; + +PropertyBinding.prototype.Versioning = { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 +}; + +PropertyBinding.prototype.GetterByBindingType = [ + + PropertyBinding.prototype._getValue_direct, + PropertyBinding.prototype._getValue_array, + PropertyBinding.prototype._getValue_arrayElement, + PropertyBinding.prototype._getValue_toArray, + +]; + +PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ + + [ + // Direct + PropertyBinding.prototype._setValue_direct, + PropertyBinding.prototype._setValue_direct_setNeedsUpdate, + PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate, + + ], [ + + // EntireArray + + PropertyBinding.prototype._setValue_array, + PropertyBinding.prototype._setValue_array_setNeedsUpdate, + PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate, + + ], [ + + // ArrayElement + PropertyBinding.prototype._setValue_arrayElement, + PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, + PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate, + + ], [ + + // HasToFromArray + PropertyBinding.prototype._setValue_fromArray, + PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, + PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate, + + ] + +]; + +/** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + */ + +class AnimationObjectGroup { + + constructor() { + + this.isAnimationObjectGroup = true; + + this.uuid = generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + const indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + const scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + add() { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + let knownObject = undefined, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid; + let index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + const firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ]; + + let binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + } + + remove() { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + let nCachedObjects = this.nCachedObjects_; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + const lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + } + + // remove & forget + uncache() { + + const objects = this._objects, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + let nCachedObjects = this.nCachedObjects_, + nObjects = objects.length; + + for ( let i = 0, n = arguments.length; i !== n; ++ i ) { + + const object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + const firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + const lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + if ( lastIndex > 0 ) { + + indicesByUUID[ lastObject.uuid ] = index; + + } + + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( let j = 0, m = nBindings; j !== m; ++ j ) { + + const bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + } + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + const indicesByPath = this._bindingsIndicesByPath; + let index = indicesByPath[ path ]; + const bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + const paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + const object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + } + + unsubscribe_( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + const indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + const paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + +} + +class AnimationAction { + + constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot; + this.blendMode = blendMode; + + const tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + const interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( let i = 0; i !== nTracks; ++ i ) { + + const interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false;// keep feeding the last frame? + + this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true;// clips for start, loop and end + + } + + // State & Scheduling + + play() { + + this._mixer._activateAction( this ); + + return this; + + } + + stop() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + } + + reset() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1;// forget previous loops + this._startTime = null;// forget scheduling + + return this.stopFading().stopWarping(); + + } + + isRunning() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + } + + // return true when play has been called + isScheduled() { + + return this._mixer._isActiveAction( this ); + + } + + startAt( time ) { + + this._startTime = time; + + return this; + + } + + setLoop( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + } + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + } + + // return the weight considering fading and .enabled + getEffectiveWeight() { + + return this._effectiveWeight; + + } + + fadeIn( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + } + + fadeOut( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + } + + crossFadeFrom( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + const fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + } + + crossFadeTo( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + } + + stopFading() { + + const weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + } + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + } + + // return the time scale considering warping and .paused + getEffectiveTimeScale() { + + return this._effectiveTimeScale; + + } + + setDuration( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + } + + syncWith( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + } + + halt( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + } + + warp( startTimeScale, endTimeScale, duration ) { + + const mixer = this._mixer, + now = mixer.time, + timeScale = this.timeScale; + + let interpolant = this._timeScaleInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + } + + stopWarping() { + + const timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + } + + // Object Accessors + + getMixer() { + + return this._mixer; + + } + + getClip() { + + return this._clip; + + } + + getRoot() { + + return this._localRoot || this._mixer._root; + + } + + // Interna + + _update( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + const startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + const timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + deltaTime = 0; + + } else { + + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + const clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + const weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + const interpolants = this._interpolants; + const propertyMixers = this._propertyBindings; + + switch ( this.blendMode ) { + + case AdditiveAnimationBlendMode: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulateAdditive( weight ); + + } + + break; + + case NormalAnimationBlendMode: + default: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + } + + } + + _updateWeight( time ) { + + let weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + const interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + } + + _updateTimeScale( time ) { + + let timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + const interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + } + + _updateTime( deltaTime ) { + + const duration = this._clip.duration; + const loop = this.loop; + + let time = this.time + deltaTime; + let loopCount = this._loopCount; + + const pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else { + + this.time = time; + + break handle_stop; + + } + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + const loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + const pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + const atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } else { + + this.time = time; + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + return duration - time; + + } + + } + + return time; + + } + + _setEndings( atStart, atEnd, pingPong ) { + + const settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + } + + _scheduleFading( duration, weightNow, weightThen ) { + + const mixer = this._mixer, now = mixer.time; + let interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + values[ 0 ] = weightNow; + times[ 1 ] = now + duration; + values[ 1 ] = weightThen; + + return this; + + } + +} + +const _controlInterpolantsResultBuffer = new Float32Array( 1 ); + + +class AnimationMixer extends EventDispatcher { + + constructor( root ) { + + super(); + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + this.time = 0; + this.timeScale = 1.0; + + } + + _bindAction( action, prototypeAction ) { + + const root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName; + + let bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( let i = 0; i !== nTracks; ++ i ) { + + const track = tracks[ i ], + trackName = track.name; + + let binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + ++ binding.referenceCount; + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + const path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + } + + _activateAction( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + const rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + const bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + } + + _deactivateAction( action ) { + + if ( this._isActiveAction( action ) ) { + + const bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + } + + // Memory manager + + _initMemoryManager() { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + const scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + } + + // Memory management for AnimationAction objects + + _isActiveAction( action ) { + + const index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + } + + _addInactiveAction( action, clipUuid, rootUuid ) { + + const actions = this._actions, + actionsByClip = this._actionsByClip; + + let actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + const knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + } + + _removeInactiveAction( action ) { + + const actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + const clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + const actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + } + + _removeInactiveBindingsForAction( action ) { + + const bindings = action._propertyBindings; + + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + } + + _lendAction( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + const actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + } + + _takeBackAction( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + const actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + } + + // Memory management for PropertyMixer objects + + _addInactiveBinding( binding, rootUuid, trackName ) { + + const bindingsByRoot = this._bindingsByRootAndName, + bindings = this._bindings; + + let bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + } + + _removeInactiveBinding( binding ) { + + const bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + if ( Object.keys( bindingByName ).length === 0 ) { + + delete bindingsByRoot[ rootUuid ]; + + } + + } + + _lendBinding( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + } + + _takeBackBinding( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + } + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant() { + + const interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++; + + let interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, _controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + } + + _takeBackControlInterpolant( interpolant ) { + + const interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + } + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction( clip, optionalRoot, blendMode ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid; + + let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip; + + const clipUuid = clipObject !== null ? clipObject.uuid : clip; + + const actionsForClip = this._actionsByClip[ clipUuid ]; + let prototypeAction = null; + + if ( blendMode === undefined ) { + + if ( clipObject !== null ) { + + blendMode = clipObject.blendMode; + + } else { + + blendMode = NormalAnimationBlendMode; + + } + + } + + if ( actionsForClip !== undefined ) { + + const existingAction = actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined && existingAction.blendMode === blendMode ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + } + + // get an existing action + existingAction( clip, optionalRoot ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + } + + // deactivates all previously scheduled actions + stopAllAction() { + + const actions = this._actions, + nActions = this._nActiveActions; + + for ( let i = nActions - 1; i >= 0; -- i ) { + + actions[ i ].stop(); + + } + + return this; + + } + + // advance the time and update apply the animation + update( deltaTime ) { + + deltaTime *= this.timeScale; + + const actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( let i = 0; i !== nActions; ++ i ) { + + const action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + const bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( let i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + } + + // Allows you to seek to a specific time in an animation. + setTime( timeInSeconds ) { + + this.time = 0; // Zero out time attribute for AnimationMixer object; + for ( let i = 0; i < this._actions.length; i ++ ) { + + this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects. + + } + + return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object. + + } + + // return this mixer's root target object + getRoot() { + + return this._root; + + } + + // free all resources specific to a particular clip + uncacheClip( clip ) { + + const actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + const actionsToRemove = actionsForClip.knownActions; + + for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + const action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + const cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + } + + // free all resources specific to a particular root target object + uncacheRoot( root ) { + + const rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( const clipUuid in actionsByClip ) { + + const actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + const bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( const trackName in bindingByName ) { + + const binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + } + + // remove a targeted clip from the cache + uncacheAction( clip, optionalRoot ) { + + const action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + +} + +class Uniform { + + constructor( value ) { + + this.value = value; + + } + + clone() { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + } + +} + +let _id = 0; + +class UniformsGroup extends EventDispatcher { + + constructor() { + + super(); + + this.isUniformsGroup = true; + + Object.defineProperty( this, 'id', { value: _id ++ } ); + + this.name = ''; + + this.usage = StaticDrawUsage; + this.uniforms = []; + + } + + add( uniform ) { + + this.uniforms.push( uniform ); + + return this; + + } + + remove( uniform ) { + + const index = this.uniforms.indexOf( uniform ); + + if ( index !== - 1 ) this.uniforms.splice( index, 1 ); + + return this; + + } + + setName( name ) { + + this.name = name; + + return this; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + return this; + + } + + copy( source ) { + + this.name = source.name; + this.usage = source.usage; + + const uniformsSource = source.uniforms; + + this.uniforms.length = 0; + + for ( let i = 0, l = uniformsSource.length; i < l; i ++ ) { + + const uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ]; + + for ( let j = 0; j < uniforms.length; j ++ ) { + + this.uniforms.push( uniforms[ j ].clone() ); + + } + + } + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +class InstancedInterleavedBuffer extends InterleavedBuffer { + + constructor( array, stride, meshPerAttribute = 1 ) { + + super( array, stride ); + + this.isInstancedInterleavedBuffer = true; + + this.meshPerAttribute = meshPerAttribute; + + } + + copy( source ) { + + super.copy( source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + clone( data ) { + + const ib = super.clone( data ); + + ib.meshPerAttribute = this.meshPerAttribute; + + return ib; + + } + + toJSON( data ) { + + const json = super.toJSON( data ); + + json.isInstancedInterleavedBuffer = true; + json.meshPerAttribute = this.meshPerAttribute; + + return json; + + } + +} + +class GLBufferAttribute { + + constructor( buffer, type, itemSize, elementSize, count ) { + + this.isGLBufferAttribute = true; + + this.name = ''; + + this.buffer = buffer; + this.type = type; + this.itemSize = itemSize; + this.elementSize = elementSize; + this.count = count; + + this.version = 0; + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + setBuffer( buffer ) { + + this.buffer = buffer; + + return this; + + } + + setType( type, elementSize ) { + + this.type = type; + this.elementSize = elementSize; + + return this; + + } + + setItemSize( itemSize ) { + + this.itemSize = itemSize; + + return this; + + } + + setCount( count ) { + + this.count = count; + + return this; + + } + +} + +class Raycaster { + + constructor( origin, direction, near = 0, far = Infinity ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near; + this.far = far; + this.camera = null; + this.layers = new Layers(); + + this.params = { + Mesh: {}, + Line: { threshold: 1 }, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + } + + set( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + } + + setFromCamera( coords, camera ) { + + if ( camera.isPerspectiveCamera ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + this.camera = camera; + + } else if ( camera.isOrthographicCamera ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + this.camera = camera; + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type ); + + } + + } + + intersectObject( object, recursive = true, intersects = [] ) { + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + } + + intersectObjects( objects, recursive = true, intersects = [] ) { + + for ( let i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + +} + +function ascSort( a, b ) { + + return a.distance - b.distance; + +} + +function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.layers.test( raycaster.layers ) ) { + + object.raycast( raycaster, intersects ); + + } + + if ( recursive === true ) { + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + +} + +/** + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axis. + */ + + +class Spherical { + + constructor( radius = 1, phi = 0, theta = 0 ) { + + this.radius = radius; + this.phi = phi; // polar angle + this.theta = theta; // azimuthal angle + + return this; + + } + + set( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + } + + copy( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + } + + // restrict phi to be between EPS and PI-EPS + makeSafe() { + + const EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + } + + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +/** + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + */ + +class Cylindrical { + + constructor( radius = 1, theta = 0, y = 0 ) { + + this.radius = radius; // distance from the origin to a point in the x-z plane + this.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = y; // height above the x-z plane + + return this; + + } + + set( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + } + + copy( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + } + + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$4 = /*@__PURE__*/ new Vector2(); + +class Box2 { + + constructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) { + + this.isBox2 = true; + + this.min = min; + this.max = max; + + } + + set( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + } + + setFromPoints( points ) { + + this.makeEmpty(); + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + } + + setFromCenterAndSize( center, size ) { + + const halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + } + + makeEmpty() { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + } + + isEmpty() { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + } + + getCenter( target ) { + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + } + + getSize( target ) { + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + } + + expandByPoint( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + } + + expandByVector( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + } + + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + } + + containsPoint( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + } + + containsBox( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + } + + getParameter( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + } + + intersectsBox( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + } + + clampPoint( point, target ) { + + return target.copy( point ).clamp( this.min, this.max ); + + } + + distanceToPoint( point ) { + + return this.clampPoint( point, _vector$4 ).distanceTo( point ); + + } + + intersect( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + } + + union( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + } + + translate( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + } + + equals( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} + +const _startP = /*@__PURE__*/ new Vector3(); +const _startEnd = /*@__PURE__*/ new Vector3(); + +class Line3 { + + constructor( start = new Vector3(), end = new Vector3() ) { + + this.start = start; + this.end = end; + + } + + set( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + } + + copy( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + } + + getCenter( target ) { + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + } + + delta( target ) { + + return target.subVectors( this.end, this.start ); + + } + + distanceSq() { + + return this.start.distanceToSquared( this.end ); + + } + + distance() { + + return this.start.distanceTo( this.end ); + + } + + at( t, target ) { + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + } + + closestPointToPointParameter( point, clampToLine ) { + + _startP.subVectors( point, this.start ); + _startEnd.subVectors( this.end, this.start ); + + const startEnd2 = _startEnd.dot( _startEnd ); + const startEnd_startP = _startEnd.dot( _startP ); + + let t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = clamp( t, 0, 1 ); + + } + + return t; + + } + + closestPointToPoint( point, clampToLine, target ) { + + const t = this.closestPointToPointParameter( point, clampToLine ); + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + } + + applyMatrix4( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + } + + equals( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$3 = /*@__PURE__*/ new Vector3(); + +class SpotLightHelper extends Object3D { + + constructor( light, color ) { + + super(); + + this.light = light; + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + this.type = 'SpotLightHelper'; + + const geometry = new BufferGeometry(); + + const positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + const p1 = ( i / l ) * Math.PI * 2; + const p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + dispose() { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + } + + update() { + + this.light.updateWorldMatrix( true, false ); + this.light.target.updateWorldMatrix( true, false ); + + const coneLength = this.light.distance ? this.light.distance : 1000; + const coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + _vector$3.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( _vector$3 ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + } + +} + +const _vector$2 = /*@__PURE__*/ new Vector3(); +const _boneMatrix = /*@__PURE__*/ new Matrix4(); +const _matrixWorldInv = /*@__PURE__*/ new Matrix4(); + + +class SkeletonHelper extends LineSegments { + + constructor( object ) { + + const bones = getBoneList( object ); + + const geometry = new BufferGeometry(); + + const vertices = []; + const colors = []; + + const color1 = new Color( 0, 0, 1 ); + const color2 = new Color( 0, 1, 0 ); + + for ( let i = 0; i < bones.length; i ++ ) { + + const bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + vertices.push( 0, 0, 0 ); + vertices.push( 0, 0, 0 ); + colors.push( color1.r, color1.g, color1.b ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } ); + + super( geometry, material ); + + this.isSkeletonHelper = true; + + this.type = 'SkeletonHelper'; + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + updateMatrixWorld( force ) { + + const bones = this.bones; + + const geometry = this.geometry; + const position = geometry.getAttribute( 'position' ); + + _matrixWorldInv.copy( this.root.matrixWorld ).invert(); + + for ( let i = 0, j = 0; i < bones.length; i ++ ) { + + const bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld ); + _vector$2.setFromMatrixPosition( _boneMatrix ); + position.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z ); + + _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld ); + _vector$2.setFromMatrixPosition( _boneMatrix ); + position.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + super.updateMatrixWorld( force ); + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + + +function getBoneList( object ) { + + const boneList = []; + + if ( object.isBone === true ) { + + boneList.push( object ); + + } + + for ( let i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + +} + +class PointLightHelper extends Mesh { + + constructor( light, sphereSize, color ) { + + const geometry = new SphereGeometry( sphereSize, 4, 2 ); + const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); + + super( geometry, material ); + + this.light = light; + + this.color = color; + + this.type = 'PointLightHelper'; + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + // TODO: delete this comment? + const distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + const d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + + update() { + + this.light.updateWorldMatrix( true, false ); + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + const d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + } + +} + +const _vector$1 = /*@__PURE__*/ new Vector3(); +const _color1 = /*@__PURE__*/ new Color(); +const _color2 = /*@__PURE__*/ new Color(); + +class HemisphereLightHelper extends Object3D { + + constructor( light, size, color ) { + + super(); + + this.light = light; + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + this.type = 'HemisphereLightHelper'; + + const geometry = new OctahedronGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); + if ( this.color === undefined ) this.material.vertexColors = true; + + const position = geometry.getAttribute( 'position' ); + const colors = new Float32Array( position.count * 3 ); + + geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + dispose() { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + } + + update() { + + const mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + const colors = mesh.geometry.getAttribute( 'color' ); + + _color1.copy( this.light.color ); + _color2.copy( this.light.groundColor ); + + for ( let i = 0, l = colors.count; i < l; i ++ ) { + + const color = ( i < ( l / 2 ) ) ? _color1 : _color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + this.light.updateWorldMatrix( true, false ); + + mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + } + +} + +class GridHelper extends LineSegments { + + constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) { + + color1 = new Color( color1 ); + color2 = new Color( color2 ); + + const center = divisions / 2; + const step = size / divisions; + const halfSize = size / 2; + + const vertices = [], colors = []; + + for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { + + vertices.push( - halfSize, 0, k, halfSize, 0, k ); + vertices.push( k, 0, - halfSize, k, 0, halfSize ); + + const color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'GridHelper'; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + +class PolarGridHelper extends LineSegments { + + constructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) { + + color1 = new Color( color1 ); + color2 = new Color( color2 ); + + const vertices = []; + const colors = []; + + // create the sectors + + if ( sectors > 1 ) { + + for ( let i = 0; i < sectors; i ++ ) { + + const v = ( i / sectors ) * ( Math.PI * 2 ); + + const x = Math.sin( v ) * radius; + const z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + const color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + } + + // create the rings + + for ( let i = 0; i < rings; i ++ ) { + + const color = ( i & 1 ) ? color1 : color2; + + const r = radius - ( radius / rings * i ); + + for ( let j = 0; j < divisions; j ++ ) { + + // first vertex + + let v = ( j / divisions ) * ( Math.PI * 2 ); + + let x = Math.sin( v ) * r; + let z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + // second vertex + + v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * r; + z = Math.cos( v ) * r; + + vertices.push( x, 0, z ); + colors.push( color.r, color.g, color.b ); + + } + + } + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'PolarGridHelper'; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + +const _v1 = /*@__PURE__*/ new Vector3(); +const _v2 = /*@__PURE__*/ new Vector3(); +const _v3 = /*@__PURE__*/ new Vector3(); + +class DirectionalLightHelper extends Object3D { + + constructor( light, size, color ) { + + super(); + + this.light = light; + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + this.type = 'DirectionalLightHelper'; + + if ( size === undefined ) size = 1; + + let geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + dispose() { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + } + + update() { + + this.light.updateWorldMatrix( true, false ); + this.light.target.updateWorldMatrix( true, false ); + + _v1.setFromMatrixPosition( this.light.matrixWorld ); + _v2.setFromMatrixPosition( this.light.target.matrixWorld ); + _v3.subVectors( _v2, _v1 ); + + this.lightPlane.lookAt( _v2 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( _v2 ); + this.targetLine.scale.z = _v3.length(); + + } + +} + +const _vector = /*@__PURE__*/ new Vector3(); +const _camera = /*@__PURE__*/ new Camera(); + +/** + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html + */ + +class CameraHelper extends LineSegments { + + constructor( camera ) { + + const geometry = new BufferGeometry(); + const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } ); + + const vertices = []; + const colors = []; + + const pointMap = {}; + + // near + + addLine( 'n1', 'n2' ); + addLine( 'n2', 'n4' ); + addLine( 'n4', 'n3' ); + addLine( 'n3', 'n1' ); + + // far + + addLine( 'f1', 'f2' ); + addLine( 'f2', 'f4' ); + addLine( 'f4', 'f3' ); + addLine( 'f3', 'f1' ); + + // sides + + addLine( 'n1', 'f1' ); + addLine( 'n2', 'f2' ); + addLine( 'n3', 'f3' ); + addLine( 'n4', 'f4' ); + + // cone + + addLine( 'p', 'n1' ); + addLine( 'p', 'n2' ); + addLine( 'p', 'n3' ); + addLine( 'p', 'n4' ); + + // up + + addLine( 'u1', 'u2' ); + addLine( 'u2', 'u3' ); + addLine( 'u3', 'u1' ); + + // target + + addLine( 'c', 't' ); + addLine( 'p', 'c' ); + + // cross + + addLine( 'cn1', 'cn2' ); + addLine( 'cn3', 'cn4' ); + + addLine( 'cf1', 'cf2' ); + addLine( 'cf3', 'cf4' ); + + function addLine( a, b ) { + + addPoint( a ); + addPoint( b ); + + } + + function addPoint( id ) { + + vertices.push( 0, 0, 0 ); + colors.push( 0, 0, 0 ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + super( geometry, material ); + + this.type = 'CameraHelper'; + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + // colors + + const colorFrustum = new Color( 0xffaa00 ); + const colorCone = new Color( 0xff0000 ); + const colorUp = new Color( 0x00aaff ); + const colorTarget = new Color( 0xffffff ); + const colorCross = new Color( 0x333333 ); + + this.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross ); + + } + + setColors( frustum, cone, up, target, cross ) { + + const geometry = this.geometry; + + const colorAttribute = geometry.getAttribute( 'color' ); + + // near + + colorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2 + colorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4 + colorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3 + colorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1 + + // far + + colorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2 + colorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4 + colorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3 + colorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1 + + // sides + + colorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1 + colorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2 + colorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3 + colorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4 + + // cone + + colorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1 + colorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2 + colorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3 + colorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4 + + // up + + colorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2 + colorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3 + colorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1 + + // target + + colorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t + colorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c + + // cross + + colorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2 + colorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4 + + colorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2 + colorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4 + + colorAttribute.needsUpdate = true; + + } + + update() { + + const geometry = this.geometry; + const pointMap = this.pointMap; + + const w = 1, h = 1; + + // we need just camera projection matrix inverse + // world matrix must be identity + + _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse ); + + // center / target + + setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 ); + setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 ); + + // near + + setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 ); + setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 ); + setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 ); + setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 ); + + // far + + setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 ); + setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 ); + setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 ); + setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 ); + + // up + + setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 ); + setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 ); + setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 ); + setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 ); + + setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 ); + setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 ); + setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 ); + setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + + +function setPoint( point, pointMap, geometry, camera, x, y, z ) { + + _vector.set( x, y, z ).unproject( camera ); + + const points = pointMap[ point ]; + + if ( points !== undefined ) { + + const position = geometry.getAttribute( 'position' ); + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z ); + + } + + } + +} + +const _box = /*@__PURE__*/ new Box3(); + +class BoxHelper extends LineSegments { + + constructor( object, color = 0xffff00 ) { + + const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + const positions = new Float32Array( 8 * 3 ); + + const geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.object = object; + this.type = 'BoxHelper'; + + this.matrixAutoUpdate = false; + + this.update(); + + } + + update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + _box.setFromObject( this.object ); + + } + + if ( _box.isEmpty() ) return; + + const min = _box.min; + const max = _box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + const position = this.geometry.attributes.position; + const array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + } + + setFromObject( object ) { + + this.object = object; + this.update(); + + return this; + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.object = source.object; + + return this; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + +class Box3Helper extends LineSegments { + + constructor( box, color = 0xffff00 ) { + + const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + + const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ]; + + const geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.box = box; + + this.type = 'Box3Helper'; + + this.geometry.computeBoundingSphere(); + + } + + updateMatrixWorld( force ) { + + const box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + super.updateMatrixWorld( force ); + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + +class PlaneHelper extends Line { + + constructor( plane, size = 1, hex = 0xffff00 ) { + + const color = hex; + + const positions = [ 1, - 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ]; + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = size; + + const positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ]; + + const geometry2 = new BufferGeometry(); + geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) ); + + } + + updateMatrixWorld( force ) { + + this.position.set( 0, 0, 0 ); + + this.scale.set( 0.5 * this.size, 0.5 * this.size, 1 ); + + this.lookAt( this.plane.normal ); + + this.translateZ( - this.plane.constant ); + + super.updateMatrixWorld( force ); + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + } + +} + +const _axis = /*@__PURE__*/ new Vector3(); +let _lineGeometry, _coneGeometry; + +class ArrowHelper extends Object3D { + + // dir is assumed to be normalized + + constructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) { + + super(); + + this.type = 'ArrowHelper'; + + if ( _lineGeometry === undefined ) { + + _lineGeometry = new BufferGeometry(); + _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + _coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 ); + _coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + _axis.set( dir.z, 0, - dir.x ).normalize(); + + const radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( _axis, radians ); + + } + + } + + setLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) { + + this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458 + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + } + + setColor( color ) { + + this.line.material.color.set( color ); + this.cone.material.color.set( color ); + + } + + copy( source ) { + + super.copy( source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + + } + + dispose() { + + this.line.geometry.dispose(); + this.line.material.dispose(); + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + } + +} + +class AxesHelper extends LineSegments { + + constructor( size = 1 ) { + + const vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + const colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); + + super( geometry, material ); + + this.type = 'AxesHelper'; + + } + + setColors( xAxisColor, yAxisColor, zAxisColor ) { + + const color = new Color(); + const array = this.geometry.attributes.color.array; + + color.set( xAxisColor ); + color.toArray( array, 0 ); + color.toArray( array, 3 ); + + color.set( yAxisColor ); + color.toArray( array, 6 ); + color.toArray( array, 9 ); + + color.set( zAxisColor ); + color.toArray( array, 12 ); + color.toArray( array, 15 ); + + this.geometry.attributes.color.needsUpdate = true; + + return this; + + } + + dispose() { + + this.geometry.dispose(); + this.material.dispose(); + + } + +} + +class ShapePath { + + constructor() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + moveTo( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + return this; + + } + + lineTo( x, y ) { + + this.currentPath.lineTo( x, y ); + + return this; + + } + + quadraticCurveTo( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + return this; + + } + + bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + return this; + + } + + splineThru( pts ) { + + this.currentPath.splineThru( pts ); + + return this; + + } + + toShapes( isCCW ) { + + function toShapesNoHoles( inSubpaths ) { + + const shapes = []; + + for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) { + + const tmpPath = inSubpaths[ i ]; + + const tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + const polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + let inside = false; + for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + let edgeLowPt = inPolygon[ p ]; + let edgeHighPt = inPolygon[ q ]; + + let edgeDx = edgeHighPt.x - edgeLowPt.x; + let edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + const isClockWise = ShapeUtils.isClockWise; + + const subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + let solid, tmpPath, tmpShape; + const shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + const betterShapeHoles = []; + const newShapes = []; + let newShapeHoles = []; + let mainIdx = 0; + let tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( let i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + let ambiguous = false; + let toChange = 0; + + for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + const sho = newShapeHoles[ sIdx ]; + + for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + const ho = sho[ hIdx ]; + let hole_unassigned = true; + + for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange ++; + + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + + if ( toChange > 0 && ambiguous === false ) { + + newShapeHoles = betterShapeHoles; + + } + + } + + let tmpHoles; + + for ( let i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + +} + +if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: { + revision: REVISION, + } } ) ); + +} + +if ( typeof window !== 'undefined' ) { + + if ( window.__THREE__ ) { + + console.warn( 'WARNING: Multiple instances of Three.js being imported.' ); + + } else { + + window.__THREE__ = REVISION; + + } + +} + +export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DisplayP3ColorSpace, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Float64BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearDisplayP3ColorSpace, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, P3Primaries, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, Rec709Primaries, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, TwoPassDoubleSide, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, createCanvasElement, sRGBEncoding }; diff --git a/install.sh b/install.sh new file mode 100644 index 0000000000000000000000000000000000000000..5b853eeaedb96a8c8754472859312972978b7943 --- /dev/null +++ b/install.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -e + +# SATA demo installation helper. +# +# Recommended environment: +# conda create -n sata python=3.11 +# conda activate sata +# bash install.sh +# +# This script targets PyTorch 2.5.1 with CUDA 12.1. If your machine uses a +# different CUDA/CPU setup, replace the PyTorch and PyG wheel lines below with +# versions from the official PyTorch and PyTorch Geometric installers. + +# PyTorch and PyTorch Geometric. Keep these versions aligned: +# torch 2.5.1 + cu121 requires the torch-2.5.1+cu121 PyG wheel index. +python -m pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121 +python -m pip install torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.5.1+cu121.html +python -m pip install torch_geometric + +# Common scientific, visualization, and utility packages used by the demo and +# training/evaluation helpers. +python -m pip install scipy tqdm IPython tensorboard matplotlib plotly pyyaml +python -m pip install nvidia-ml-py gputil +python -m pip install glfw imgui opencv-python +python -m pip install vector-quantize-pytorch +python -m pip install transformers + +# CLIP is installed from the upstream GitHub archive because it is not published +# as a regular pinned PyPI release. +python -m pip install https://github.com/openai/CLIP/archive/refs/heads/main.zip + +# Install this repository as an editable package so local src/ changes are used. +python -m pip install -e . + +# Generation/model helper dependencies. +python -m pip install einops +python -m pip install jupyter +python -m pip install imageio +python -m pip install torch_ema==0.3 +python -m pip install smplx==0.1.28 +python -m pip install huggingface-hub + +# chumpy 0.70 is required by the SMPL/MDM path, but it is not compatible with +# modern Python/NumPy out of the box: +# 1. normal pip build isolation can fail because chumpy's legacy setup imports pip +# 2. Python 3.11 removed inspect.getargspec +# 3. NumPy 2.x removed aliases such as np.int and np.float +# +# Install without build isolation, then patch the installed chumpy package in a +# visible, reproducible way. The patch script is idempotent. +python -m pip install --no-build-isolation chumpy==0.70 +python scripts/patch_chumpy.py + +# Optional: install h5py if you run scripts that load HDF5 assets. +# python -m pip install h5py + +# Gradio demo dependencies. +python -m pip install gradio +python -m pip install scikit-learn diff --git a/requirements-hf.txt b/requirements-hf.txt new file mode 100644 index 0000000000000000000000000000000000000000..19328c952d291f6dd163ec3b87eeabd35dc92f12 --- /dev/null +++ b/requirements-hf.txt @@ -0,0 +1,26 @@ +scipy +tqdm +IPython +tensorboard +matplotlib +plotly +pyyaml +nvidia-ml-py +gputil +glfw +imgui +opencv-python +vector-quantize-pytorch +transformers +einops +jupyter +imageio +torch_ema==0.3 +smplx==0.1.28 +huggingface-hub +gradio==6.14.0 +scikit-learn +gdown +ftfy +regex +pillow diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..526a5240992e6b7aed5b59ded9d0a229f925ad8d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,215 @@ +absl-py==2.4.0 +aiohappyeyeballs==2.6.1 +aiohttp==3.13.5 +aiosignal==1.4.0 +annotated-doc==0.0.4 +annotated-types==0.7.0 +anyio==4.13.0 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.4.0 +asttokens==3.0.1 +async-lru==2.3.0 +attrs==26.1.0 +babel==2.18.0 +beautifulsoup4==4.14.3 +black==26.3.1 +bleach==6.3.0 +brotli==1.2.0 +certifi==2026.4.22 +cffi==2.0.0 +charset-normalizer==3.4.7 +chumpy==0.70 +click==8.3.3 +clip @ https://github.com/openai/CLIP/archive/refs/heads/main.zip#sha256=7ced2e3a4fb6ea456f130f25fec2f7ccaff40fe47b56fdbf5eefd846b2bec1ee +comm==0.2.3 +contourpy==1.3.3 +cycler==0.12.1 +dataclasses==0.6 +debugpy==1.8.20 +decorator==5.2.1 +defusedxml==0.7.1 +einops==0.8.2 +einx==0.4.3 +executing==2.2.1 +fastapi==0.136.1 +fastjsonschema==2.21.2 +filelock==3.25.2 +fonttools==4.62.1 +fqdn==1.5.1 +frozendict==2.4.7 +frozenlist==1.8.0 +fsspec==2026.3.0 +ftfy==6.3.1 +gdown==6.0.0 +glfw==2.10.0 +GPUtil==1.4.0 +gradio==6.14.0 +gradio_client==2.5.0 +groovy==0.1.2 +grpcio==1.80.0 +h11==0.16.0 +hf-gradio==0.4.1 +hf-xet==1.5.0 +httpcore==1.0.9 +httpx==0.28.1 +huggingface_hub==1.14.0 +idna==3.13 +ImageIO==2.37.3 +imageio-ffmpeg==0.6.0 +imgui==2.0.0 +ipykernel==7.2.0 +ipython==9.10.1 +ipython_pygments_lexers==1.1.1 +ipywidgets==8.1.8 +isoduration==20.11.0 +jedi==0.19.2 +Jinja2==3.1.6 +joblib==1.5.3 +json5==0.14.0 +jsonpointer==3.1.1 +jsonschema==4.26.0 +jsonschema-specifications==2025.9.1 +jupyter==1.1.1 +jupyter-console==6.6.3 +jupyter-events==0.12.1 +jupyter-lsp==2.3.1 +jupyter_client==8.8.0 +jupyter_core==5.9.1 +jupyter_server==2.18.2 +jupyter_server_terminals==0.5.4 +jupyterlab==4.5.7 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.28.0 +jupyterlab_widgets==3.0.16 +kiwisolver==1.5.0 +lark==1.3.1 +Markdown==3.10.2 +markdown-it-py==4.2.0 +MarkupSafe==3.0.3 +matplotlib==3.10.8 +matplotlib-inline==0.2.1 +mdurl==0.1.2 +mistune==3.2.1 +mpmath==1.3.0 +multidict==6.7.1 +mypy_extensions==1.1.0 +narwhals==2.20.0 +nbclient==0.10.4 +nbconvert==7.17.1 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.6.1 +notebook==7.5.6 +notebook_shim==0.2.4 +numpy==2.4.4 +nvidia-cublas-cu12==12.1.3.1 +nvidia-cuda-cupti-cu12==12.1.105 +nvidia-cuda-nvrtc-cu12==12.1.105 +nvidia-cuda-runtime-cu12==12.1.105 +nvidia-cudnn-cu12==9.1.0.70 +nvidia-cufft-cu12==11.0.2.54 +nvidia-curand-cu12==10.3.2.106 +nvidia-cusolver-cu12==11.4.5.107 +nvidia-cusparse-cu12==12.1.0.106 +nvidia-ml-py==13.590.48 +nvidia-nccl-cu12==2.21.5 +nvidia-nvjitlink-cu12==12.9.86 +nvidia-nvtx-cu12==12.1.105 +nvitop==1.6.2 +opencv-python==4.13.0.92 +orjson==3.11.9 +overrides==7.7.0 +packaging==26.0 +pandas==3.0.3 +pandocfilters==1.5.1 +parso==0.8.6 +patchelf==0.18.0.0 +pathspec==1.1.0 +pexpect==4.9.0 +pillow==12.2.0 +platformdirs==4.9.6 +plotly==6.7.0 +prometheus_client==0.25.0 +prompt_toolkit==3.0.52 +propcache==0.4.1 +protobuf==7.34.1 +psutil==7.2.2 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pycparser==3.0 +pydantic==2.13.4 +pydantic_core==2.46.4 +pydub==0.25.1 +Pygments==2.20.0 +PyOpenGL==3.1.0 +pyparsing==3.3.2 +PySocks==1.7.1 +python-dateutil==2.9.0.post0 +python-json-logger==4.1.0 +python-multipart==0.0.28 +pytokens==0.4.1 +pytz==2026.2 +PyYAML==6.0.3 +pyzmq==27.1.0 +referencing==0.37.0 +regex==2026.5.9 +requests==2.33.1 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rich==15.0.0 +rpds-py==0.30.0 +safehttpx==0.1.7 +safetensors==0.7.0 +# Editable install with no version control (sata==1.0.0) +-e . +scikit-learn==1.8.0 +scipy==1.17.1 +semantic-version==2.10.0 +Send2Trash==2.1.0 +shellingham==1.5.4 +six==1.17.0 +smplx==0.1.28 +socksio==1.0.0 +soupsieve==2.8.3 +stack-data==0.6.3 +starlette==1.0.0 +sympy==1.13.1 +tensorboard==2.20.0 +tensorboard-data-server==0.7.2 +terminado==0.18.1 +threadpoolctl==3.6.0 +tinycss2==1.4.0 +tokenizers==0.22.2 +tomlkit==0.14.0 +torch==2.5.1+cu121 +torch-ema==0.3 +torch-geometric==2.7.0 +torch_cluster==1.6.3+pt25cu121 +torch_scatter==2.1.2+pt25cu121 +torch_sparse==0.6.18+pt25cu121 +torch_spline_conv==1.2.2+pt25cu121 +torchaudio==2.5.1+cu121 +torchvision==0.20.1+cu121 +tornado==6.5.5 +tqdm==4.67.3 +traitlets==5.14.3 +transformers==5.8.1 +triton==3.1.0 +typer==0.25.1 +typing-inspection==0.4.2 +typing_extensions==4.15.0 +tzdata==2026.2 +uri-template==1.3.0 +urllib3==2.6.3 +uvicorn==0.46.0 +vector-quantize-pytorch==1.28.2 +wcwidth==0.6.0 +webcolors==25.10.0 +webencodings==0.5.1 +websocket-client==1.9.0 +Werkzeug==3.1.8 +widgetsnbextension==4.0.15 +xxhash==3.6.0 +yarl==1.23.0 diff --git a/result/rvq_human/config.yaml b/result/rvq_human/config.yaml new file mode 100755 index 0000000000000000000000000000000000000000..ce6a503abb8777d1d2af4faa293fc94fa72ae0cf --- /dev/null +++ b/result/rvq_human/config.yaml @@ -0,0 +1,90 @@ +model: + Decoder: + attn_kwargs: + dropout: 0.1 + attn_type: multihead + heads: 4 + hidden_dim: 256 + max_seq_len: 300 + num_layers: 3 + pos_encoding_type: sinusoidal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 + temporal_num_heads: 4 + temporal_type: transformer + type: GPSDecTemporal + use_temporal_pos_encoding: true + Encoder: + attn_kwargs: + dropout: 0.1 + attn_type: multihead + heads: 4 + hidden_dim: 256 + max_seq_len: 300 + num_layers: 3 + pos_encoding_type: sinusoidal + sample_posterior: true + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 + temporal_num_heads: 4 + temporal_type: transformer + type: GPSEncTemporal + use_temporal_pos_encoding: true + VQ: + mu: 0.99 + nb_code: 1024 + num_quantizers: 6 + type: RVQ + z_dim: 256 +representation: + out: + - r + - q + - c + pose: + - q + - p + - r + - pv + - qv + - c + skel: + - lo + - go + - tf +test_data: + dir: zzy_test_recon_faceZ_mirror_wtextV3/motion/processed + sample_num: 50 +train: + batch_size: 32 + commit_weight: 0.1 + consq_n: 64 + copy_orig_contact: false + epoch_num: 300 + grad_max_norm: 0.5 + learning_rate: 0.0001 + loss: + c: 1 + cv: 6 + jerk: 0.2 + p: 0.01 + pen: 0.1 + pv: 1 + q: 5 + r: 10 + slide: 6 + lr_schedule: + gamma: 0.99 + min: 0.01 + metric: + - qR + - ra_xz + - pa + - slide + - jerk + - pen + save_per: 5 + weight_decay: 0 +train_data: + dir: zzy_train_faceZ_mirror_wtextV3/motion/processed + mask: [] diff --git a/result/rvq_human/last_model.pt b/result/rvq_human/last_model.pt new file mode 100755 index 0000000000000000000000000000000000000000..caf4a717831ae178bd641b53e261b1370076c1ea --- /dev/null +++ b/result/rvq_human/last_model.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db1dd0a8a6635494869b78f97206385974edfccb6530cf42b196ea806eadb022 +size 114253916 diff --git a/result/rvq_human/ms_dict.pt b/result/rvq_human/ms_dict.pt new file mode 100755 index 0000000000000000000000000000000000000000..648041f77fba5696491b9c2c695e11d12644bedd --- /dev/null +++ b/result/rvq_human/ms_dict.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a70b06625cb7f74094b022574a0bf54b00d57e659c46eea62788305362742318 +size 4902 diff --git a/result/vae_human/config.yaml b/result/vae_human/config.yaml new file mode 100755 index 0000000000000000000000000000000000000000..6c3ff34e5ec785e08aaa42fda766581c501b56fd --- /dev/null +++ b/result/vae_human/config.yaml @@ -0,0 +1,88 @@ +model: + Decoder: + attn_kwargs: + dropout: 0.1 + attn_type: multihead + consq_n: 64 + heads: 4 + hidden_dim: 256 + max_seq_len: 512 + num_layers: 3 + pos_encoding_type: sinusoidal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 + temporal_num_heads: 4 + temporal_type: transformer + type: GPSDecTemporal + use_temporal_pos_encoding: true + Encoder: + attn_kwargs: + dropout: 0.1 + attn_type: multihead + consq_n: 64 + heads: 4 + hidden_dim: 256 + max_seq_len: 512 + num_layers: 3 + pos_encoding_type: sinusoidal + sample_posterior: true + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 + temporal_num_heads: 4 + temporal_type: transformer + type: GPSEncTemporal + use_temporal_pos_encoding: true + z_dim: 128 +representation: + out: + - r + - q + - c + pose: + - q + - p + - r + - pv + - qv + - c + skel: + - lo + - go + - tf +test_data: + dir: zzy_test_recon_faceZ_mirror_wtextV3/motion/processed + sample_num: 50 +train: + batch_size: 16 + consq_n: 64 + copy_orig_contact: false + epoch_num: 300 + grad_max_norm: 0.5 + learning_rate: 0.0003 + loss: + c: 1 + cv: 6 + jerk: 0.2 + p: 0.01 + pen: 0.1 + pv: 1 + q: 5 + r: 10 + slide: 6 + lr_schedule: + gamma: 0.99 + min: 0.01 + metric: + - qR + - ra_xz + - pa + - slide + - jerk + - pen + save_per: 5 + vae_kl: + kl_weight: 1.0e-06 + nll_loss_type: null +train_data: + dir: zzy_train_faceZ_mirror_wtextV3/motion/processed + mask: [] diff --git a/result/vae_human/model_390.pt b/result/vae_human/model_390.pt new file mode 100644 index 0000000000000000000000000000000000000000..30f52ff163eedffbcfcf83b5fef7f945261bd636 --- /dev/null +++ b/result/vae_human/model_390.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c55271b63eb7bb0adfb1de4aad11967d2386e2dc02c086e8d2c9513802c0eb02 +size 101249914 diff --git a/result/vae_human/ms_dict.pt b/result/vae_human/ms_dict.pt new file mode 100644 index 0000000000000000000000000000000000000000..648041f77fba5696491b9c2c695e11d12644bedd --- /dev/null +++ b/result/vae_human/ms_dict.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a70b06625cb7f74094b022574a0bf54b00d57e659c46eea62788305362742318 +size 4902 diff --git a/result/vae_merge/config.yaml b/result/vae_merge/config.yaml new file mode 100755 index 0000000000000000000000000000000000000000..dc88b4bde730ece966e9404c5c04a2b0c9b6f417 --- /dev/null +++ b/result/vae_merge/config.yaml @@ -0,0 +1,88 @@ +model: + Decoder: + attn_kwargs: + dropout: 0.1 + attn_type: multihead + heads: 4 + hidden_dim: 256 + max_seq_len: 512 + num_layers: 3 + pos_encoding_type: sinusoidal + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 + temporal_num_heads: 4 + temporal_type: transformer + type: GPSDecTemporal + use_temporal_pos_encoding: true + Encoder: + attn_kwargs: + dropout: 0.1 + attn_type: multihead + heads: 4 + hidden_dim: 256 + max_seq_len: 512 + num_layers: 3 + pos_encoding_type: sinusoidal + sample_posterior: true + temporal_dropout: 0.1 + temporal_ff_dim_multiplier: 2 + temporal_num_heads: 4 + temporal_type: transformer + type: GPSEncTemporal + use_temporal_pos_encoding: true + z_dim: 128 +representation: + out: + - r + - q + - c + pose: + - q + - p + - r + - pv + - qv + - c + skel: + - lo + - go + - tf +test_data: + dir: zzy_test_recon_faceZ_mirror_wtextV3/motion/processed + sample_num: 50 +train: + batch_size: 12 + consq_n: 64 + copy_orig_contact: false + epoch_num: 300 + grad_max_norm: 0.5 + learning_rate: 0.0003 + loss: + c: 1 + cv: 6 + jerk: 0.2 + p: 0.01 + pen: 0.1 + pv: 1 + q: 5 + r: 10 + slide: 6 + lr_schedule: + gamma: 0.99 + min: 0.01 + metric: + - qR + - ra_xz + - pa + - slide + - jerk + - pen + min_motion_lens: 20 + num_workers: 2 + save_per: 5 + vae_kl: + kl_weight: 1.0e-06 + nll_loss_type: null +train_data: + dir: merge_zzy_train_faceZ_mirror_wtextV3_zooV2_train_wtextV2/motion/processed + mask: [] diff --git a/result/vae_merge/last_model.pt b/result/vae_merge/last_model.pt new file mode 100755 index 0000000000000000000000000000000000000000..fa0933b7e940e482a1f80f6f4d7c5932c89099a1 --- /dev/null +++ b/result/vae_merge/last_model.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce79b15dfaa3b3b1958b9f3c8241295bd0deb9dfcec8a5ce6ee9426c54c6bbf4 +size 101248332 diff --git a/result/vae_merge/ms_dict.pt b/result/vae_merge/ms_dict.pt new file mode 100755 index 0000000000000000000000000000000000000000..e2ba1f01c80fb2f4abcdee92a49a03b2a90f5b14 --- /dev/null +++ b/result/vae_merge/ms_dict.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45cbbbe33c5e7cb2460c7d6ee6b4db936b838b7f076545647a3757ed31fa0aeb +size 4902 diff --git a/scripts/download_artifacts.py b/scripts/download_artifacts.py new file mode 100755 index 0000000000000000000000000000000000000000..7adc4b4260cd7c6351e742da9ba7a10344314473 --- /dev/null +++ b/scripts/download_artifacts.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 +"""Download SATA demo artifacts. + +Models are downloaded from HuggingFace. Demo assets are downloaded from a +Google Drive/direct URL zip and extracted into the repository root. +""" + +import argparse +import os +import shutil +import sys +import tempfile +import urllib.parse +import urllib.request +import zipfile +from pathlib import Path +from typing import List, Optional + + +HF_REPO_ID = "SteveZh/sata_models" +DEFAULT_ASSETS_URL = os.environ.get("SATA_ASSETS_URL", "") +DEFAULT_ASSETS_GDRIVE_ID = os.environ.get("SATA_ASSETS_GDRIVE_ID", "") + +MODEL_PATTERNS = [ + "result/vae_merge/*", + "result/vae_human/*", + "result/rvq_human/*", + "src/mdm/save/paper_vae_human_0125/*", + "src/momask-preenc/checkpoints/t2m/t2m_base/*", + "src/momask-preenc/checkpoints/t2m/t2m_base/model/*", + "src/momask-preenc/checkpoints/t2m/t2m_rvq/*", + "src/momask-preenc/checkpoints/t2m/t2m_rvq/model/*", +] + +REQUIRED_MODEL_FILES = [ + "result/vae_merge/config.yaml", + "result/vae_merge/ms_dict.pt", + "result/vae_merge/last_model.pt", + "result/vae_human/config.yaml", + "result/vae_human/ms_dict.pt", + "result/vae_human/model_390.pt", + "result/rvq_human/config.yaml", + "result/rvq_human/ms_dict.pt", + "result/rvq_human/last_model.pt", + "src/mdm/save/paper_vae_human_0125/args.json", + "src/mdm/save/paper_vae_human_0125/model000100000.pt", + "src/momask-preenc/checkpoints/t2m/t2m_base/opt.txt", + "src/momask-preenc/checkpoints/t2m/t2m_base/model/latest.tar", + "src/momask-preenc/checkpoints/t2m/t2m_rvq/opt.txt", + "src/momask-preenc/checkpoints/t2m/t2m_rvq/model/latest.tar", +] + +REQUIRED_ASSET_FILES = [ + "data/gradio_human/bvh/000327.bvh", + "data/gradio_human/processed/000327.npz", + "data/gradio_animo/bvh/arctic_wolf_female_fightflee.bvh", + "data/gradio_skel/human/processed/guard.npz", + "data/gradio_skel/animo/processed/wisent_male_attackfence.npz", + "data/gradio_target_bvh/human/guard.bvh", + "data/gradio_target_bvh/animo/wisent_male_attackfence.bvh", + "data/gradio_z/human/000327.pt", + "data/gradio_z/animo/arctic_wolf_female_fightflee.pt", + "data/test/character/default.txt", +] + + +def repo_root() -> Path: + return Path(__file__).resolve().parents[1] + + +def missing_files(root: Path, files: List[str]) -> List[str]: + return [path for path in files if not (root / path).is_file()] + + +def verify(root: Path, *, models: bool, assets: bool) -> None: + missing = [] # type: List[str] + if models: + missing.extend(missing_files(root, REQUIRED_MODEL_FILES)) + if assets: + missing.extend(missing_files(root, REQUIRED_ASSET_FILES)) + + if missing: + print("Missing required artifact files:", file=sys.stderr) + for path in missing: + print(f" {path}", file=sys.stderr) + raise SystemExit(1) + + +def download_models(root: Path, repo_id: str) -> None: + try: + from huggingface_hub import snapshot_download + except ImportError as exc: + raise SystemExit( + "Missing dependency: huggingface_hub. Install it with:\n" + " python -m pip install huggingface-hub" + ) from exc + + print(f"Downloading model artifacts from HuggingFace: {repo_id}") + snapshot_download( + repo_id=repo_id, + repo_type="model", + local_dir=str(root), + allow_patterns=MODEL_PATTERNS, + ) + verify(root, models=True, assets=False) + print("Model artifacts are ready.") + + +def google_drive_url(file_id: str) -> str: + return f"https://drive.google.com/uc?export=download&id={file_id}" + + +def extract_google_drive_id(value: str) -> Optional[str]: + value = value.strip() + if not value: + return None + if "/" not in value and "?" not in value: + return value + + parsed = urllib.parse.urlparse(value) + query = urllib.parse.parse_qs(parsed.query) + if "id" in query and query["id"]: + return query["id"][0] + + parts = [part for part in parsed.path.split("/") if part] + if "d" in parts: + idx = parts.index("d") + if idx + 1 < len(parts): + return parts[idx + 1] + return None + + +def resolve_assets_url(url: str, gdrive_id: str) -> str: + if gdrive_id: + return google_drive_url(extract_google_drive_id(gdrive_id) or gdrive_id) + + if not url: + raise SystemExit( + "No assets URL configured. Pass --assets-url, pass --assets-gdrive-id, " + "or set SATA_ASSETS_URL after uploading sata_demo_assets.zip." + ) + + parsed = urllib.parse.urlparse(url) + if "drive.google.com" in parsed.netloc: + file_id = extract_google_drive_id(url) + if file_id: + return google_drive_url(file_id) + return url + + +def download_file(url: str, output_path: Path) -> None: + print(f"Downloading assets zip: {url}") + request = urllib.request.Request(url, headers={"User-Agent": "sata-artifact-downloader"}) + with urllib.request.urlopen(request) as response, output_path.open("wb") as handle: + shutil.copyfileobj(response, handle) + + +def download_assets(root: Path, assets_url: str, assets_gdrive_id: str) -> None: + url = resolve_assets_url(assets_url, assets_gdrive_id) + with tempfile.TemporaryDirectory(prefix="sata_assets_") as tmp: + zip_path = Path(tmp) / "sata_demo_assets.zip" + download_file(url, zip_path) + if not zipfile.is_zipfile(zip_path): + raise SystemExit( + "Downloaded assets file is not a valid zip. Check that the Google " + "Drive file is shared publicly and that the URL points directly to " + "sata_demo_assets.zip." + ) + print(f"Extracting {zip_path.name} into {root}") + with zipfile.ZipFile(zip_path) as archive: + archive.extractall(root) + + verify(root, models=False, assets=True) + print("Demo assets are ready.") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + actions = parser.add_argument_group("actions") + actions.add_argument("--all", action="store_true", help="Download both models and assets.") + actions.add_argument("--models", action="store_true", help="Download model checkpoints from HuggingFace.") + actions.add_argument("--assets", action="store_true", help="Download and extract demo assets.") + actions.add_argument("--check", action="store_true", help="Only verify required artifact files.") + + parser.add_argument("--hf-repo", default=HF_REPO_ID, help=f"HuggingFace repo id. Default: {HF_REPO_ID}") + parser.add_argument("--assets-url", default=DEFAULT_ASSETS_URL, help="Direct/Google Drive URL for sata_demo_assets.zip.") + parser.add_argument("--assets-gdrive-id", default=DEFAULT_ASSETS_GDRIVE_ID, help="Google Drive file id for sata_demo_assets.zip.") + return parser.parse_args() + + +def main() -> None: + args = parse_args() + root = repo_root() + + selected = args.all or args.models or args.assets or args.check + if not selected: + args.all = True + + want_models = args.all or args.models + want_assets = args.all or args.assets + + if args.check: + verify(root, models=want_models or not args.assets, assets=want_assets or not args.models) + print("Artifact check passed.") + return + + if want_models: + download_models(root, args.hf_repo) + if want_assets: + download_assets(root, args.assets_url, args.assets_gdrive_id) + + verify(root, models=want_models, assets=want_assets) + print("All requested artifacts are ready.") + + +if __name__ == "__main__": + main() diff --git a/scripts/package_assets.py b/scripts/package_assets.py new file mode 100755 index 0000000000000000000000000000000000000000..fe745dbe3c3e0f07167d34c5bf1132e06124c4bd --- /dev/null +++ b/scripts/package_assets.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Package demo assets for Google Drive distribution.""" + +import argparse +import zipfile +from pathlib import Path + + +REQUIRED_DIRS = [ + "data/gradio_human", + "data/gradio_animo", + "data/gradio_skel", + "data/gradio_target_bvh", + "data/gradio_z", + "data/test", +] + + +def repo_root() -> Path: + return Path(__file__).resolve().parents[1] + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--output", + default="/tmp/sata_demo_assets.zip", + help="Output zip path. Default: /tmp/sata_demo_assets.zip", + ) + return parser.parse_args() + + +def main() -> None: + args = parse_args() + root = repo_root() + output = Path(args.output).expanduser().resolve() + + missing = [path for path in REQUIRED_DIRS if not (root / path).is_dir()] + if missing: + raise SystemExit("Missing required asset directories:\n" + "\n".join(f" {path}" for path in missing)) + + output.parent.mkdir(parents=True, exist_ok=True) + data_dir = root / "data" + + with zipfile.ZipFile(output, "w", compression=zipfile.ZIP_DEFLATED) as archive: + for path in sorted(data_dir.rglob("*")): + if path.is_dir(): + continue + if "__pycache__" in path.parts: + continue + if path.suffix == ".pyc" or path.name == ".DS_Store": + continue + archive.write(path, path.relative_to(root)) + + print(output) + print(f"{output.stat().st_size / 1024 / 1024:.2f} MB") + + +if __name__ == "__main__": + main() diff --git a/scripts/patch_chumpy.py b/scripts/patch_chumpy.py new file mode 100644 index 0000000000000000000000000000000000000000..97202f23f8451a76e3b96eb34b450f7e2841d716 --- /dev/null +++ b/scripts/patch_chumpy.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +"""Patch chumpy 0.70 for Python 3.11 and NumPy 2.x. + +Run this after: + + pip install --no-build-isolation chumpy==0.70 + +The script intentionally avoids importing chumpy, because the unpatched package +can fail during import on modern Python/NumPy versions. +""" + +from __future__ import annotations + +import importlib.util +from pathlib import Path + + +GETARGSPEC_OLD = "inspect.getargspec(" +GETARGSPEC_NEW = "inspect.getfullargspec(" + +NUMPY_IMPORT_OLD = ( + "from numpy import bool, int, float, complex, object, unicode, str, nan, inf" +) +NUMPY_IMPORT_NEW = """from numpy import bool, nan, inf +import builtins as _builtins + +int = _builtins.int +float = _builtins.float +complex = _builtins.complex +object = _builtins.object +unicode = _builtins.str +str = _builtins.str""" + + +def find_chumpy_dir() -> Path: + spec = importlib.util.find_spec("chumpy") + if spec is None: + raise SystemExit( + "chumpy is not installed. Run: " + "pip install --no-build-isolation chumpy==0.70" + ) + if spec.submodule_search_locations: + return Path(next(iter(spec.submodule_search_locations))) + if spec.origin: + return Path(spec.origin).parent + raise SystemExit("Could not locate the installed chumpy package.") + + +def patch_file(path: Path, replacements: list[tuple[str, str]]) -> bool: + text = path.read_text(encoding="utf-8") + updated = text + for old, new in replacements: + updated = updated.replace(old, new) + if updated == text: + return False + path.write_text(updated, encoding="utf-8") + return True + + +def main() -> None: + chumpy_dir = find_chumpy_dir() + + changed = [] + ch_py = chumpy_dir / "ch.py" + init_py = chumpy_dir / "__init__.py" + + if patch_file(ch_py, [(GETARGSPEC_OLD, GETARGSPEC_NEW)]): + changed.append(str(ch_py)) + + if patch_file(init_py, [(NUMPY_IMPORT_OLD, NUMPY_IMPORT_NEW)]): + changed.append(str(init_py)) + + if changed: + print("Patched chumpy files:") + for path in changed: + print(f" {path}") + else: + print("chumpy is already patched.") + + +if __name__ == "__main__": + main() diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..b4d3d1eb12f42a0e0d14b69a90ccef4ce5e0c546 --- /dev/null +++ b/setup.py @@ -0,0 +1,23 @@ +import setuptools + +with open("README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() + +setuptools.setup( + name="sata", + version="1.0.0", + author="Zongye Zhang, Yuzhuo Cui", + author_email="", + description="SATA motion retargeting and generation demo", + long_description=long_description, + long_description_content_type="text/markdown", + license="Apache-2.0", + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + ], + package_dir={"": "src"}, + packages=setuptools.find_packages(where="src", include=["sata", "sata.*"]), + python_requires=">=3.8", +) diff --git a/src/Visualization/decode_z_sliding.py b/src/Visualization/decode_z_sliding.py new file mode 100644 index 0000000000000000000000000000000000000000..3d5dc88cc7b3befe67be14f4a1e276ee0aca8f69 --- /dev/null +++ b/src/Visualization/decode_z_sliding.py @@ -0,0 +1,477 @@ +""" +Batch decode latent vectors to BVH files. + +Supports sliding-window decoding and multiple input formats. The Gradio demo +uses decode_z_skel_to_bvh directly; the CLI keeps batch decoding support for +local debugging. +""" + +import argparse +import os +import numpy as np +import torch +from fairmotion.data import bvh +from torch_geometric.data import Batch + +# Required conversion helpers +from sata.conversions.graph_to_motion import hatD_recon_motion +from sata.skel_pose_graph import SkelPoseGraph +from sata.conversions.graph_to_motion import graph_2_skel +from fairmotion.core import motion as motion_class + +from sata.utils.model_loading import load_model_by_type +# Reuse shared SATA motion-data helpers. +from sata.utils.motion_data import ( + SkelData, + load_skeleton_and_tf_from_npz, + create_graph_list_from_skeleton, + fix_skeleton_coordinate_system, +) +from sata.utils.sliding_decode import decode_to_hatD_with_sliding_window + +# Default directory configuration +VISUAL_BASE_DIR = os.path.join(os.path.dirname(__file__), "visual") +Z_DIR = os.path.join(VISUAL_BASE_DIR, "z") +SKEL_DIR = os.path.join(VISUAL_BASE_DIR, "skel", "processed") +SKEL_TF_DIR = os.path.join(VISUAL_BASE_DIR, "skel", "joint_text_features") +OUTPUT_DIR = os.path.join(VISUAL_BASE_DIR, "bvh_output") + +# visual/z.txt contains one z file path per line. +# visual/skel.txt contains one skeleton npz path per line. +# The tf path is derived by replacing processed with joint_text_features. +# OUTPUT_DIR: visual/bvh_output + + +def decode_z_skel_to_bvh(z_path, skel_path, model_epoch, output_dir, + output_name="decoded_motion.bvh", device="cuda:0", + window_size=64, overlap=16, use_sliding_window=None, + model_type="vae", model_state=None): + """ + Decode a latent/code file with a target skeleton and save it as BVH. + + Args: + z_path: path to a latent/code file (.npy, .npz, or .pt) + - VAE: latent vectors [T, z_dim] + - RVQ: code_idx [T, Q] + skel_path: target skeleton .npz path. The matching tf file is loaded automatically. + model_epoch: model checkpoint name, for example "ckpt0" + output_dir: output directory path + output_name: output file stem, default "decoded_motion.bvh" + device: compute device, default "cuda:0" + window_size: sliding-window size, default 64 + overlap: sliding-window overlap, default 16 + use_sliding_window: force sliding-window decoding; None selects automatically + model_type: "vae" or "rvq", default "vae" + model_state: optional preloaded (model, cfg, ms_dict); loaded on demand when None + + Returns: + output_path: saved BVH path + """ + # 1. Load the model or reuse a preloaded model state. + if model_state is not None: + model, cfg, ms_dict = model_state + print(f"[Model] Reusing preloaded model ({model_type.upper()})") + else: + print(f"Loading model: {model_epoch} ({model_type.upper()})") + model, cfg, ms_dict = load_model_by_type(model_type, model_epoch, device) + model = model.to(device) + model.eval() + + # 2. Load latent vectors or code indices. + print(f"Loading {'latent vectors' if model_type == 'vae' else 'code_idx'}: {z_path}") + + if z_path.endswith('.npy'): + # NumPy .npy file + data = torch.from_numpy(np.load(z_path)).float().to(device) + + elif z_path.endswith('.npz'): + # NumPy .npz file, possibly with multiple arrays + data_loaded = np.load(z_path) + # Try common payload keys. + possible_keys = ['z', 'z_pred', 'sample', 'code_idx', 'codes', 'idx_pred'] + data_key = None + for key in possible_keys: + if key in data_loaded: + data_key = key + break + + if data_key is None: + # Fall back to the first key. + data_key = list(data_loaded.keys())[0] + print(f" Loaded key from npz: {data_key}") + else: + print(f" Loaded key from npz: {data_key}") + + data = torch.from_numpy(data_loaded[data_key]).float().to(device) + + elif z_path.endswith('.pt'): + # PyTorch .pt file compatible with gen_dec.py encoded data. + encoded_data = torch.load(z_path, map_location=device) + + # Extract the payload for the selected model type. + if model_type == "vae": + # VAE: prefer z_pred, then z, then sample. + if 'z_pred' in encoded_data: + data = encoded_data['z_pred'].float().to(device) + print(" Loaded key from pt: z_pred") + elif 'z' in encoded_data: + data = encoded_data['z'].float().to(device) + print(" Loaded key from pt: z") + elif 'sample' in encoded_data: + data = encoded_data['sample'].float().to(device) + print(" Loaded key from pt: sample") + else: + raise KeyError("pt file does not contain any of: z_pred, z, sample") + elif model_type == "rvq": + # RVQ: prefer idx_pred, then code_idx. + if 'idx_pred' in encoded_data: + data = encoded_data['idx_pred'].long().to(device) + print(" Loaded key from pt: idx_pred") + elif 'code_idx' in encoded_data: + data = encoded_data['code_idx'].long().to(device) + print(" Loaded key from pt: code_idx") + else: + raise KeyError("pt file does not contain either idx_pred or code_idx") + + # Print metadata when present. + if 'text' in encoded_data: + print(f" Text metadata: {encoded_data['text']}") + if 'm_len' in encoded_data: + print(f" Original length: {encoded_data['m_len']}") + if 'is_segment' in encoded_data and encoded_data['is_segment']: + print(" Note: this file contains a segment") + + else: + raise ValueError(f"Unsupported file format: {z_path}. Only .npy, .npz, and .pt are supported") + + # Normalize payload dtype for the selected model type. + if model_type == "vae": + z = data + data_length = z.shape[0] + print(f" z shape: {z.shape}") + elif model_type == "rvq": + code_idx = data.long() # RVQ code_idx must be long. + data_length = code_idx.shape[0] + print(f" code_idx shape: {code_idx.shape}") + + # 3. Load the skeleton and convert it to a graph. Only NPZ is supported. + if not skel_path.endswith('.npz'): + raise ValueError(f"Unsupported skeleton format: {skel_path}. Only .npz is supported") + + # NPZ format contains skeleton data and a matching tf file. + # Build the tf path by replacing processed with joint_text_features. + print(f"Loading skeleton from NPZ: {skel_path}") + tf_npz_path = skel_path.replace('/processed/', '/joint_text_features/') + + # If the path did not change, try the common parent directory pattern. + if tf_npz_path == skel_path: + import pathlib + path_obj = pathlib.Path(skel_path) + parent = path_obj.parent + if 'processed' in str(parent): + new_parent = str(parent).replace('processed', 'joint_text_features') + tf_npz_path = os.path.join(new_parent, path_obj.name) + + # Load through utils.py. + skel_data = load_skeleton_and_tf_from_npz(skel_path, tf_npz_path) + print(f" Skeleton joints: {skel_data.lo.shape[0]}") + print(f" tf shape: {skel_data.tf.shape}") + + skel_graph = SkelPoseGraph(skel_data, None) # Convert directly to a graph. + # Keep the skeleton for later BVH generation. + saved_skel = graph_2_skel(Batch.from_data_list([skel_graph]).to(device), 1)[0] + + # 4. Decide whether to use sliding-window decoding. + if use_sliding_window is None: + # Automatically use sliding windows for sequences longer than the window size. + use_sliding_window = (data_length > window_size) + + # 5. Decode to motion. + print("Decoding...") + out_rep_cfg = cfg["representation"]["out"] + + with torch.no_grad(): + if use_sliding_window and data_length > window_size: + # Decode with the shared sliding-window implementation. + print(f" Long sequence ({data_length} frames); using sliding-window decoding") + + # Prepare latent codes for the selected model type. + latent_codes = z if model_type == "vae" else code_idx + + # Create a graph list of the required length from one skeleton graph. + from sata.utils.motion_data import create_graph_list_from_single_graph + src_graphs_list = create_graph_list_from_single_graph(skel_graph, data_length) + + # Call the shared sliding-window decoder. + hatD_full, src_batch_full, actual_frames, num_nodes_per_frame = \ + decode_to_hatD_with_sliding_window( + model, latent_codes, src_graphs_list, + data_length, window_size, overlap, device, model_type + ) + + # Reconstruct motion with hatD_recon_motion. + out_motion_list, out_contact_list = hatD_recon_motion( + hatD_full, src_batch_full, out_rep_cfg, ms_dict, actual_frames + ) + out_motion = out_motion_list[0] + out_contact = out_contact_list[0] + else: + # Use single-pass decoding. + print(f" Short sequence ({data_length} frames); using single-pass decoding") + + if model_type == "vae": + # VAE single-pass decode. + skel_batch = Batch.from_data_list([skel_graph] * data_length).to(device) + hatD = model.decode(z, skel_batch, data_length) + elif model_type == "rvq": + # RVQ single-pass decode. + skel_batch = Batch.from_data_list([skel_graph] * data_length).to(device) + hatD, _ = model.decode_from_codes(code_idx, skel_batch, data_length) + + # Reconstruct motion. + out_motion_list, out_contact_list = hatD_recon_motion( + hatD, skel_batch, out_rep_cfg, ms_dict, data_length + ) + out_motion = out_motion_list[0] + out_contact = out_contact_list[0] + + print(f" Output motion frames: {out_motion.num_frames()}") + + # 6. Save the BVH file. + if not os.path.exists(output_dir): + os.makedirs(output_dir) + print(f"Created output directory: {output_dir}") + + # Set FPS to 20. + out_motion.fps = 20 + + # Fix coordinate system differences. + out_motion_fixed = fix_skeleton_coordinate_system(out_motion) + print(" [Info] Applied coordinate-system fix (Y-Z axis conversion)") + + output_path = os.path.join(output_dir, output_name + '.bvh') + bvh.save(out_motion_fixed, output_path, rot_order="XYZ") + # bvh.save(out_motion, output_path, rot_order="XYZ") + print(f"Saved to: {output_path}") + + return output_path + + +def scan_z_and_skeleton_files(visual_base_dir): + """ + Read z and skeleton path lists from txt files and build all pairings. + + Args: + visual_base_dir: visual root containing z.txt and skel.txt + + Returns: + pairs: list of tuple, [(z_path, z_name, skel_path, skel_name), ...] + """ + # Read z.txt. + z_files = [] + z_txt_path = os.path.join(visual_base_dir, "z.txt") + if os.path.exists(z_txt_path): + with open(z_txt_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line and not line.startswith('#'): # Skip empty lines and comments. + z_path = line + # Use the file stem as the display name. + z_name = os.path.splitext(os.path.basename(z_path))[0] + z_files.append((z_path, z_name)) + print(f" Read {len(z_files)} z files from {z_txt_path}") + else: + print(f" Not found: {z_txt_path}") + + # Read skel.txt. + skel_files = [] + skel_txt_path = os.path.join(visual_base_dir, "skel.txt") + if os.path.exists(skel_txt_path): + with open(skel_txt_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line and not line.startswith('#'): # Skip empty lines and comments. + skel_path = line + # Use the file stem as the display name. + skel_name = os.path.splitext(os.path.basename(skel_path))[0] + skel_files.append((skel_path, skel_name)) + print(f" Read {len(skel_files)} skeleton files from {skel_txt_path}") + else: + print(f" Not found: {skel_txt_path}") + + # Build the Cartesian product. + pairs = [] + for z_path, z_name in z_files: + for skel_path, skel_name in skel_files: + pairs.append((z_path, z_name, skel_path, skel_name)) + + return pairs + + +def batch_decode_all(model_epoch, visual_base_dir=VISUAL_BASE_DIR, + output_dir=OUTPUT_DIR, device="cuda:0", + window_size=64, overlap=16, model_type="vae"): + """ + Batch decode every z/skeleton pairing listed in txt files. + + Args: + model_epoch: model checkpoint name + visual_base_dir: visual root containing z.txt and skel.txt; default visual/ + output_dir: output directory; default visual/bvh_output + device: compute device + window_size: sliding-window size + overlap: sliding-window overlap + model_type: model type + + Returns: + results: list of per-pair result dictionaries + """ + # Read txt files and build pairings. + print("="*70) + print("Reading path lists...") + print(f" z.txt: {os.path.join(visual_base_dir, 'z.txt')}") + print(f" skel.txt: {os.path.join(visual_base_dir, 'skel.txt')}") + print("="*70) + + pairs = scan_z_and_skeleton_files(visual_base_dir) + + if len(pairs) == 0: + print("No z or skeleton files found. Check the directory configuration.") + return [] + + # Count source files. + z_count = len(set([p[1] for p in pairs])) + skel_count = len(set([p[3] for p in pairs])) + print(f"Found {z_count} z files x {skel_count} skeleton files = {len(pairs)} pairs") + print() + + # Show all pairings. + print("Pairings to process:") + for i, (z_path, z_name, skel_path, skel_name) in enumerate(pairs, 1): + output_name = f"{z_name}_{skel_name}" + print(f" [{i}/{len(pairs)}] {output_name}") + print("="*70) + print() + + # Process each pair. + results = [] + for i, (z_path, z_name, skel_path, skel_name) in enumerate(pairs, 1): + output_name = f"{z_name}_{skel_name}" + + print("="*70) + print(f"Processing pair [{i}/{len(pairs)}]: {output_name}") + print("="*70) + print(f" z file: {z_path}") + print(f" skeleton file: {skel_path}") + print() + + try: + output_path = decode_z_skel_to_bvh( + z_path=z_path, + skel_path=skel_path, + model_epoch=model_epoch, + output_dir=output_dir, + output_name=output_name, + device=device, + window_size=window_size, + overlap=overlap, + use_sliding_window=None, # Select automatically. + model_type=model_type + ) + + results.append({ + 'z_name': z_name, + 'skel_name': skel_name, + 'output_name': output_name, + 'output_path': output_path, + 'status': 'success' + }) + print(f"[{i}/{len(pairs)}] Success: {output_name}") + + except Exception as e: + print(f"[{i}/{len(pairs)}] Failed: {output_name}") + print(f" Error: {str(e)}") + results.append({ + 'z_name': z_name, + 'skel_name': skel_name, + 'output_name': output_name, + 'output_path': None, + 'status': 'failed', + 'error': str(e) + }) + + print() + + # Summary. + print("="*70) + print("Batch processing complete") + print("="*70) + success_count = sum(1 for r in results if r['status'] == 'success') + failed_count = sum(1 for r in results if r['status'] == 'failed') + print(f"Total pairs: {len(results)}") + print(f" Success: {success_count}") + print(f" Failed: {failed_count}") + + if failed_count > 0: + print() + print("Failed pairs:") + for r in results: + if r['status'] == 'failed': + print(f" - {r['output_name']}: {r.get('error', 'Unknown error')}") + + print("="*70) + + return results + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Batch decode latent vectors to BVH files", formatter_class=argparse.RawDescriptionHelpFormatter, epilog="") + + parser.add_argument("--model_type", type=str, default="vae", choices=["vae", "rvq"], help="Model type: vae or rvq (default: vae)") + parser.add_argument("--model_epoch", type=str, required=True, help="Model checkpoint name, for example ckpt0") + parser.add_argument("--visual_dir", type=str, default=VISUAL_BASE_DIR, help=f"Visual root containing z.txt and skel.txt (default: {VISUAL_BASE_DIR})") + parser.add_argument("--output_dir", type=str, default=OUTPUT_DIR, help=f"Output directory (default: {OUTPUT_DIR})") + parser.add_argument("--device", type=str, default="cuda:0", help="Compute device (default: cuda:0)") + parser.add_argument("--window_size", type=int, default=64, help="Sliding-window size in frames (default: 64)") + parser.add_argument("--overlap", type=int, default=16, help="Sliding-window overlap in frames (default: 16)") + + args = parser.parse_args() + + print("="*70) + print("Batch latent-vector decoder (reads path lists from txt files)") + print("="*70) + print(f"Model type: {args.model_type.upper()}") + print(f"Model: {args.model_epoch}") + print(f"z path list: {os.path.join(args.visual_dir, 'z.txt')}") + print(f"skeleton path list: {os.path.join(args.visual_dir, 'skel.txt')}") + print(f"Output directory: {args.output_dir}") + print(f"Device: {args.device}") + print(f"Sliding window: size={args.window_size}, overlap={args.overlap}") + print("="*70) + print() + + try: + results = batch_decode_all( + model_epoch=args.model_epoch, + visual_base_dir=args.visual_dir, + output_dir=args.output_dir, + device=args.device, + window_size=args.window_size, + overlap=args.overlap, + model_type=args.model_type + ) + + # Set exit status from the batch result. + failed_count = sum(1 for r in results if r['status'] == 'failed') + if failed_count > 0: + exit(1) + + except Exception as e: + print() + print("="*70) + print(f"Error: {str(e)}") + print("="*70) + import traceback + traceback.print_exc() + exit(1) + diff --git a/src/fairmotion/.circleci/config.yml b/src/fairmotion/.circleci/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..0851f57c292ad898c55e64482ca7eb473adfbde7 --- /dev/null +++ b/src/fairmotion/.circleci/config.yml @@ -0,0 +1,31 @@ +version: 2.1 +jobs: + fairmotion: + resource_class: large + docker: + - image: cimg/python:3.6 + + steps: + - checkout + - run: + name: Install fairmotion + command: | + cd ~/project + sudo apt-get update -y + sudo apt-get install freeglut3-dev + pip3 install virtualenv + virtualenv --python=python3 ./fairmotion_env + source ./fairmotion_env/bin/activate + pip install -e . + - run: + name: Run Tests + command: | + cd ~/project + source ./fairmotion_env/bin/activate + python setup.py test + +workflows: + version: 2 + install_and_test: + jobs: + - fairmotion diff --git a/src/fairmotion/.gitignore b/src/fairmotion/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5243921096eb540a7591cf3ead914e22bc8ba91c --- /dev/null +++ b/src/fairmotion/.gitignore @@ -0,0 +1,9 @@ +*/__pycache__/* +__pycache__/ +.vscode/ +.eggs/* +*.egg-info/ +*.ipynb_checkpoints/ +dist/ +build/ +fairmotion/tasks/motion_prediction/test_data/* diff --git a/src/fairmotion/.pylintrc b/src/fairmotion/.pylintrc new file mode 100644 index 0000000000000000000000000000000000000000..ef66b689fafa7555ada5a6dc6956315b74e53891 --- /dev/null +++ b/src/fairmotion/.pylintrc @@ -0,0 +1,399 @@ +# This Pylint rcfile contains a best-effort configuration to uphold the +# best-practices and style described in the Google Python style guide: +# https://google.github.io/styleguide/pyguide.html +# +# Its canonical open-source location is: +# https://google.github.io/styleguide/pylintrc + +[MAIN] + +# Files or directories to be skipped. They should be base names, not paths. +ignore=third_party + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. +ignore-patterns= + +# Pickle collected data for later comparisons. +persistent=no + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=4 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=R, + abstract-method, + apply-builtin, + arguments-differ, + attribute-defined-outside-init, + backtick, + bad-option-value, + basestring-builtin, + buffer-builtin, + c-extension-no-member, + consider-using-enumerate, + cmp-builtin, + cmp-method, + coerce-builtin, + coerce-method, + delslice-method, + div-method, + eq-without-hash, + execfile-builtin, + file-builtin, + filter-builtin-not-iterating, + fixme, + getslice-method, + global-statement, + hex-method, + idiv-method, + implicit-str-concat, + import-error, + import-self, + import-star-module-level, + input-builtin, + intern-builtin, + invalid-str-codec, + locally-disabled, + long-builtin, + long-suffix, + map-builtin-not-iterating, + misplaced-comparison-constant, + missing-function-docstring, + metaclass-assignment, + next-method-called, + next-method-defined, + no-absolute-import, + no-init, # added + no-member, + no-name-in-module, + no-self-use, + nonzero-method, + oct-method, + old-division, + old-ne-operator, + old-octal-literal, + old-raise-syntax, + parameter-unpacking, + print-statement, + raising-string, + range-builtin-not-iterating, + raw_input-builtin, + rdiv-method, + reduce-builtin, + relative-import, + reload-builtin, + round-builtin, + setslice-method, + signature-differs, + standarderror-builtin, + suppressed-message, + sys-max-int, + trailing-newlines, + unichr-builtin, + unicode-builtin, + unnecessary-pass, + unpacking-in-except, + useless-else-on-loop, + useless-suppression, + using-cmp-argument, + wrong-import-order, + xrange-builtin, + zip-builtin-not-iterating, + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[BASIC] + +# Good variable names which should always be accepted, separated by a comma +good-names=main,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl + +# Regular expression matching correct function names +function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ + +# Regular expression matching correct variable names +variable-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct constant names +const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct attribute names +attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ + +# Regular expression matching correct argument names +argument-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=^_?[A-Z][a-zA-Z0-9]*$ + +# Regular expression matching correct module names +module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$ + +# Regular expression matching correct method names +method-rgx=(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=12 + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# TODO(https://github.com/pylint-dev/pylint/issues/3352): Direct pylint to exempt +# lines made too long by directives to pytype. + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=(?x)( + ^\s*(\#\ )??$| + ^\s*(from\s+\S+\s+)?import\s+.+$) + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=yes + +# Maximum number of lines in a module +max-module-lines=99999 + +# String used as indentation unit. The internal Google style guide mandates 2 +# spaces. Google's externaly-published style guide says 4, consistent with +# PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google +# projects (like TensorFlow). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=TODO + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=yes + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging,absl.logging,tensorflow.io.logging + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub, + TERMIOS, + Bastion, + rexec, + sets + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant, absl + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls, + class_ + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs \ No newline at end of file diff --git a/src/fairmotion/CHANGELOG.md b/src/fairmotion/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..f8a032f21549365970479563e1f79c7f933693d9 --- /dev/null +++ b/src/fairmotion/CHANGELOG.md @@ -0,0 +1 @@ +Initial release diff --git a/src/fairmotion/CODE_OF_CONDUCT.md b/src/fairmotion/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000000000000000000000000000000000..c7540fd2966e9a20ea7e0aef311c8b611de5a487 --- /dev/null +++ b/src/fairmotion/CODE_OF_CONDUCT.md @@ -0,0 +1,45 @@ +# Open Source Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +Using welcoming and inclusive language +Being respectful of differing viewpoints and experiences +Gracefully accepting constructive criticism +Focusing on what is best for the community +Showing empathy towards other community members +Examples of unacceptable behavior by participants include: + +The use of sexualized language or imagery and unwelcome sexual attention or advances +Trolling, insulting/derogatory comments, and personal or political attacks +Public or private harassment +Publishing others’ private information, such as a physical or electronic address, without explicit permission +Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at opensource-conduct@fb.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org \ No newline at end of file diff --git a/src/fairmotion/CONTRIBUTING.md b/src/fairmotion/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..5910e886282a0b931a3bcce8229b4b9ef645d69c --- /dev/null +++ b/src/fairmotion/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing to fairmotion +We want to make contributing to this project as easy and transparent as +possible. + +## Pull Requests +We actively welcome your pull requests. + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. If you've changed APIs, update the documentation. +4. Ensure the test suite passes. +5. Make sure your code lints. +6. If you haven't already, complete the Contributor License Agreement ("CLA"). + +## Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Facebook's open source projects. + +Complete your CLA here: + +## Issues +We use GitHub issues to track public bugs. Please ensure your description is +clear and has sufficient instructions to be able to reproduce the issue. + +Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page and do not file a public issue. + +## Coding Style +* 4 spaces for indentation rather than tabs +* 80 character line length +* For more python style principles, see +[pyguide](https://google.github.io/styleguide/pyguide.html) + +## License +By contributing to fairmotion, you agree that your contributions will be +licensed under the LICENSE file in the root directory of this source tree. \ No newline at end of file diff --git a/src/fairmotion/LICENSE b/src/fairmotion/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..005442f6ea2fb7b253c837f5d0a94464d9a70af1 --- /dev/null +++ b/src/fairmotion/LICENSE @@ -0,0 +1,30 @@ +BSD License + +For fairmotion software + +Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/src/fairmotion/README.md b/src/fairmotion/README.md new file mode 100644 index 0000000000000000000000000000000000000000..066d0549d2ad88264a04ac3dc827063470bc6b8d --- /dev/null +++ b/src/fairmotion/README.md @@ -0,0 +1,105 @@ +# fairmotion + +This fork is maintained specifically for use with the SATA repository. + +fairmotion provides easy-to-use interfaces and tools to work with motion capture data. The objective of the library is to manage the complexity of motion representation, 3D transformations, file formats and visualization, and let users focus on high level learning tasks. + +Users can take advantage of large high-quality motion capture datasets like the [CMU](http://mocap.cs.cmu.edu/) and [AMASS](https://amass.is.tue.mpg.de/) datasets without deep knowledge of the domain or handling the idiosyncrasies of individual datasets. We implement baselines for research tasks using building blocks from the library to demonstrate its utility. + + + +## Getting Started + +### Installation + +farmotion is available on PyPI for easy installation +``` +pip install fairmotion +``` + +To install fairmotion from source, first clone the git repository, use pip to download dependencies and build the project. +``` +$ git clone https://github.com/facebookresearch/fairmotion.git +$ cd fairmotion +$ pip install -e . +``` +### Data Loading + +Here, we load a motion capture file in the BVH file format in a python console. Similarly, there are loaders to import files from [ASF/AMC](https://research.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/ASF-AMC.html), [AMASS](https://amass.is.tue.mpg.de/dataset) and [AMASS DIP](http://dip.is.tuebingen.mpg.de/pre_download) formats. +``` +from fairmotion.data import bvh + +BVH_FILENAME = “PATH_TO_BVH_FILE” +motion = bvh.load(BVH_FILENAME) +``` + +If you recieve errors like the ones below, you can find the workaround [here](https://stackoverflow.com/questions/65202395/pyopengl-on-macos-bigsur-and-opengl-error-nullfunctionerror#:~:text=if%20name%20%3D%3D%20%27OpenGL%27%3A%0A%20%20%20%20fullName%20%3D%20%27/System/Library/Frameworks/OpenGL.framework/OpenGL%27%0Aelif%20name%20%3D%3D%20%27GLUT%27%3A%0A%20%20%20%20fullName%20%3D%20%27/System/Library/Frameworks/GLUT.framework/GLUT%27). +``` +ImportError: ('Unable to load OpenGL library', 'dlopen(OpenGL, 10): image not found', 'OpenGL', None) +or +OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling +``` +### Motion manipulation + +The motion object can be manipulated in both modular and matrix forms. Here, we translate the object to a fixed global position `[1, 1, 1]` and select a time slice from frame `20` to frame `30`. +``` +from fairmotion.ops import motion as motion_ops + +translated_motion = motion_ops.translate(motion, np.array([1, 1, 1])) +sliced_motion = motion_ops.cut(translated_motion, 10, 20) +``` +We can perform the same operations in the matrix representation of motion. +``` +from fairmotion.core.motion import Motion + +# motion_matrix has shape (num_frames, num_joints, 4, 4) where 4x4 is transformation matrix +motion_matrix = motion.to_matrix() + +translation_matrix = np.zeros((4, 4)) +translation_matrix[3, :3] = np.array([1, 1, 1]) + +translated_motion_matrix = motion_matrix + translation_matrix +sliced_motion_matrix = translated_motion_matrix[10:20] +sliced_motion = Motion.from_matrix(sliced_motion_matrix, motion.skel) +``` +### Data saving + +We can save the manipulated motion object back into the bvh file format for us to visualize the result. +``` +NEW_BVH_FILENAME = "PATH_TO_NEW_BVH_FILE" +bvh.save(sliced_motion, NEW_BVH_FILENAME) +``` +### Visualization + +We visualize the results using the `bvh_visualizer` tool. +``` +$ python fairmotion/viz/bvh_visualizer.py --bvh-files $NEW_BVH_FILENAME +``` + +## Tasks +The `tasks` module showcases practical usage of fairmotion modules as building blocks in developing projects. + +- [Motion Prediction](https://github.com/facebookresearch/fairmotion/tree/master/fairmotion/tasks/motion_prediction) +- [Motion Graph](https://github.com/facebookresearch/fairmotion/tree/master/fairmotion/tasks/motion_graph) +- [Clustering of motion capture dataset](https://github.com/facebookresearch/fairmotion/tree/master/fairmotion/tasks/clustering) +- [Changepoint Detection](https://github.com/facebookresearch/fairmotion/tree/master/fairmotion/tasks/changepoint_detection) + +fairmotion has been used in some form in the following works: + +* Jungdam Won, Deepak Gopinath, and Jessica Hodgins. “A Scalable Approach to Control Diverse Behaviors for Physically Simulated Characters” to be presented at SIGGRAPH 2020 [[Project page with code and paper](https://research.fb.com/publications/a-scalable-approach-to-control-diverse-behaviors-for-physically-simulated-characters/)] +* Tanmay Shankar, and Abhinav Gupta. "Learning Robot Skills with Temporal Variational Inference." ICML 2020 +* Jungdam Won, and Jehee Lee. "Learning body shape variation in physics-based characters." ACM Transactions on Graphics (TOG) 2019 + +## Citation +If you find fairmotion useful in your research, please cite our repository using the following BibTeX entry. +``` +@Misc{gopinath2020fairmotion, + author = {Gopinath, Deepak and Won, Jungdam}, + title = {fairmotion - Tools to load, process and visualize motion capture data}, + howpublished = {Github}, + year = {2020}, + url = {https://github.com/facebookresearch/fairmotion} +} +``` +## License +fairmotion is released under the [BSD-3-Clause License](https://github.com/facebookresearch/fairmotion/blob/master/LICENSE). diff --git a/src/fairmotion/fairmotion/__init__.py b/src/fairmotion/fairmotion/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9020c2df23e2af280b7bb168b996ae9eaf312eb8 --- /dev/null +++ b/src/fairmotion/fairmotion/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. diff --git a/src/fairmotion/fairmotion/core/__init__.py b/src/fairmotion/fairmotion/core/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9020c2df23e2af280b7bb168b996ae9eaf312eb8 --- /dev/null +++ b/src/fairmotion/fairmotion/core/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. diff --git a/src/fairmotion/fairmotion/core/motion.py b/src/fairmotion/fairmotion/core/motion.py new file mode 100644 index 0000000000000000000000000000000000000000..e017f2a267838c2716ddc6734d9886792dea8ebe --- /dev/null +++ b/src/fairmotion/fairmotion/core/motion.py @@ -0,0 +1,749 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np +import random + +from fairmotion.ops import math, quaternion +from fairmotion.utils import constants +from fairmotion.ops import conversions +from fairmotion.utils import utils + + +class Joint(object): + """Defines a joint. A hierarchy of joints form a skeleton. + + Joint object stores information about child/parent joints, base position + transforms, and additional information in a dictionary. + + Attributes: + name: Optional: Name of the joint. By default, we assign a randomized + name to the joint. + dof: Optional: Number of degrees of freedom. By default, we assume a + fixed ball joint (dof=3). This information is stored in an + unstructured `info` dictionary. + parent_joint: Joint object that is parent in the skeleton. + Set None if joint is root. + xform_from_parent_joint: Transformation matrix indicating position and + orientation of joint relative to parent in the character's base + position. Defaults to identity rotation and zero position offset. + xform_global: Transformation matrix indicating global position and + orientation of the joint. xform_global is calculated automatically + when parent joint is set. + child_joints: List of child joints. Use `add_child_joints` to add joints + to this list. + """ + + def __init__( + self, + name=None, + dof=3, + xform_from_parent_joint=constants.eye_T(), + parent_joint=None, + limits=None, + direction=None, + length=None, + axis=None, + ): + self.name = name if name else f"joint_{random.getrandbits(32)}" + self.child_joints = [] + self.index_child_joint = {} + self.xform_global = constants.eye_T() + self.xform_from_parent_joint = xform_from_parent_joint + self.set_parent_joint( + parent_joint + ) # set joint.parent_joint, joint.xform_global # this does not call add_child_joint (no change on parent_joint side) + self.info = {"dof": dof} # set ball joint by default + + self.length = length + + if axis is not None: + axis = np.deg2rad(axis) + self.C = conversions.E2R(axis) + self.Cinv = np.linalg.inv(self.C) + self.matrix = None + self.degree = np.zeros(3) + self.coordinate = None + if direction is not None: + self.direction = direction.squeeze() + if limits is not None: + self.limits = np.zeros([3, 2]) + for lm, nm in zip(limits, dof): + if nm == "rx": + self.limits[0] = lm + elif nm == "ry": + self.limits[1] = lm + else: + self.limits[2] = lm + + # SM) for non-joint end-effectors + self.extra_links = dict() + + def get_child_joint(self, key): + return self.child_joints[utils.get_index(self.index_child_joint, key)] + + def get_child_joint_recursive(self): + """ + This could have duplicated joints if there exists loops in the chain + """ + joints = [] + for j in self.child_joints: + joints.append(j) + joints += j.get_all_child_joint() + return joints + + def add_child_joint(self, joint): + assert isinstance(joint, Joint) + assert joint.name not in self.index_child_joint.keys() + self.index_child_joint[joint.name] = len(self.child_joints) + self.child_joints.append(joint) + joint.set_parent_joint(self) + + def set_parent_joint(self, joint): + if joint is None: + self.parent_joint = None + return + assert isinstance(joint, Joint) + self.parent_joint = joint + self.xform_global = np.dot( + self.parent_joint.xform_global, + self.xform_from_parent_joint, + ) + + def __eq__(self, other): + if self.name != other.name: + return False + if (self.xform_from_parent_joint != other.xform_from_parent_joint).any(): + return False + if (self.xform_global != other.xform_global).any(): + return False + if "dof" in self.info and "dof" in other.info: + if self.info["dof"] != other.info["dof"]: + return False + if len(self.child_joints) != len(other.child_joints): + return False + return True + + # SM) + def add_extra_links(self, name, T): + assert name not in self.extra_links + # self.extra_links[name] = T + mid_p = 0.5 * T[:3, 3] + z_dir_R = math.R_from_vectors(np.array([0, 0, 1]), mid_p) + self.extra_links[name] = conversions.Rp2T(z_dir_R, mid_p) + + # SM) + def set_xform_global_recursive(self, xform_global): + self.xform_global = xform_global + for child in self.child_joints: + child.set_xform_global_recursive( + np.dot(self.xform_global, child.xform_from_parent_joint) + ) + + +class Skeleton(object): + """Defines a skeleton. A hierarchy of joints form a skeleton. + + Attributes: + name: Optional: Name of the joint. By default, we assign "skeleton" as + the name. + v_up: Defines the up vector of the skeleton. Defaults to y-axis. + v_face: Defines the facing direction of the skeleton in its base pose. + Defaults to z-axis. + v_up_env: Defines the up-vector of the environment in which motion data + was recorded. Defaults to y-axis. + + Use `add_joint` method to add joints to the Skeleton object so that + relevant attributes are populated appropriately. + + In the default setting, the skeleton and the environment use y-axis as + the up-vector, and x-axis as the initial skeleton facing direction. + """ + + def __init__( + self, + name="skeleton", + v_up=np.array([0.0, 1.0, 0.0]), + v_face=np.array([0.0, 0.0, 1.0]), + v_up_env=np.array([0.0, 1.0, 0.0]), + ): + self.name = name + self.joints = [] + self.index_joint = {} + self.root_joint = None + self.num_dofs = 0 + self.v_up = v_up + self.v_face = v_face + self.v_up_env = v_up_env + + def get_index_joint(self, key): + return utils.get_index(self.index_joint, key) + + def get_joint(self, key): + return self.joints[self.get_index_joint(key)] + + def add_joint(self, joint, parent_joint): + if parent_joint is None: + assert self.num_joints() == 0 + self.root_joint = joint + else: + parent_joint = self.get_joint(parent_joint) + parent_joint.add_child_joint(joint) + # SM) calculate body_T + mid_p = 0.5 * joint.xform_from_parent_joint[:3, 3] + z_dir_R = math.R_from_vectors(np.array([0, 0, 1]), mid_p) + joint.body_T = conversions.Rp2T(z_dir_R, mid_p) + + self.index_joint[joint.name] = len(self.joints) + self.joints.append(joint) + self.num_dofs += joint.info["dof"] + + def add_joint_inbetween( + self, + parent_joint_name, + joint_name, + childs_to_move, + xform_from_parent_joint=None, + ): + """parent_joint - joint - childjoints""" + """ CAUTION : should also add zero-rotations for motion.poses.data """ + + parent_joint = self.get_joint(parent_joint_name) + assert parent_joint, "parent can't be null for `add_joint_inbetween`" + + # add_child_joint will do normally, + # but we want to keep the joint.child_joints order and self(skel).joints order, so we manually loop over and tuck inbetweem + if childs_to_move == "all": + childs_to_move = [child.name for child in parent_joint.child_joints] + + if xform_from_parent_joint is None: + v = np.zeros(3) + for child in childs_to_move: + v += self.get_joint(child).xform_from_parent_joint[:3, 3] + v /= len(childs_to_move) + xform_from_parent_joint = constants.eye_T() + xform_from_parent_joint[:3, 3] = v / 2.0 + + for child in childs_to_move: + child_joint = self.get_joint(child) + child_joint.xform_from_parent_joint[:3, 3] = ( + child_joint.xform_from_parent_joint[:3, 3] + - xform_from_parent_joint[:3, 3] + ) + + joint = Joint( + joint_name, + dof=3, + parent_joint=parent_joint, + xform_from_parent_joint=xform_from_parent_joint, + ) + + # calculate body_T + mid_p = 0.5 * joint.xform_from_parent_joint[:3, 3] + z_dir_R = math.R_from_vectors(np.array([0, 0, 1]), mid_p) + joint.body_T = conversions.Rp2T(z_dir_R, mid_p) + + # add_child_joint will do normally, + # but we want to keep the joint.child_joints order and self(skel).joints order, so we manually loop over and tuck inbetweem + if childs_to_move == "all": + childs_to_move = [child.name for child in parent_joint.child_joints] + + if len(childs_to_move) == 0: + self.add_joint(joint, parent_joint) + else: + + min_id_child = 1e4 + argmin_id_child_name = None + for child_name in childs_to_move: + if parent_joint.index_child_joint[child_name] < min_id_child: + min_id_child = parent_joint.index_child_joint[child_name] + argmin_id_child_name = child_name + + parent_joint.child_joints = ( + parent_joint.child_joints[:min_id_child] + + [joint] + + parent_joint.child_joints[min_id_child:] + ) + for child_name in childs_to_move: + child = self.get_joint(child_name) + joint.add_child_joint(child) + parent_joint.child_joints.remove(child) + + parent_joint.index_child_joint = {} + for i, child in enumerate(parent_joint.child_joints): + parent_joint.index_child_joint[child.name] = i + + min_cidx = self.get_index_joint(argmin_id_child_name) + self.joints = self.joints[:min_cidx] + [joint] + self.joints[min_cidx:] + for i, ji in enumerate(self.joints): + self.index_joint[ji.name] = i + self.num_dofs += joint.info["dof"] + + def num_joints(self): + return len(self.joints) + + def num_end_effectors(self): + self.end_effectors = [] + for j in self.joints: + if len(j.child_joints) == 0: + self.end_effectors.append(j) + return len(self.end_effectors) + + def __eq__(self, other): + if self.num_joints() != other.num_joints(): + return False + if sorted(self.index_joint.keys()) != sorted(self.index_joint.keys()): + return False + return True + + # SM) + def change_joint_offset(self, joint_id, new_offset): + joint = self.get_joint(joint_id) + assert joint.parent_joint is not None + joint.xform_from_parent_joint[:3, 3] = new_offset + xform_global = np.dot( + joint.parent_joint.xform_global, joint.xform_from_parent_joint + ) + joint.set_xform_global_recursive(xform_global) + + mid_p = 0.5 * joint.xform_from_parent_joint[:3, 3] + z_dir_R = math.R_from_vectors(np.array([0, 0, 1]), mid_p) + joint.body_T = conversions.Rp2T(z_dir_R, mid_p) + + def get_offsets(self): + offsets = [] + for joint in self.joints: + offsets.append(joint.xform_from_parent_joint[:3, 3]) + return np.vstack(offsets) + + def get_parent_idx_in_order(self): + parents = [] + for joint in self.joints: + if joint.parent_joint is None: + parents.append(-1) + else: + parents.append(self.get_index_joint(joint.parent_joint)) + return np.array(parents) + + def get_names_in_order(self): + names = [] + for joint in self.joints: + names.append(joint.name) + return names + + def change_joint_name(self, joint_i, new_name): + assert type(joint_i) == int + self.index_joint[new_name] = joint_i + self.index_joint.pop(self.joints[joint_i].name) + self.joints[joint_i].name = new_name + + # SM) + def _recursive_joint_idx_name(self, joint_name, recursive_names, recursive_ids): + joint = self.get_joint(joint_name) + for child in joint.child_joints: + self._recursive_joint_idx_name(child.name, recursive_names, recursive_ids) + recursive_names.append(joint_name) + recursive_ids.append(self.get_index_joint(joint_name)) + + # SM) + def remove_joint_and_childs(self, joint_name): + remove_names, remove_idxs = [], [] + self._recursive_joint_idx_name(joint_name, remove_names, remove_idxs) + + # remove (parent, child=joint_name) relationship + for joint in self.joints: + for ci, child in enumerate(joint.child_joints): + if child.name == joint_name: + del joint.child_joints[ci] + break + + for rm_joint_name in remove_names: + del self.joints[self.get_index_joint(rm_joint_name)] + # update + for jidx, joint_i in enumerate(self.joints): + self.index_joint[joint_i.name] = jidx + + return remove_idxs + + # SM) + def remove_childs_except(self, joint_name, exceptions): + joint = self.get_joint(joint_name) + remove_names, remove_idxs = [], [] + for child in joint.child_joints: + if child.name in exceptions: + continue + self._recursive_joint_idx_name(child.name, remove_names, remove_idxs) + + for rm_joint_name in remove_names: + del self.joints[self.get_index_joint(rm_joint_name)] + # update + for jidx, joint_i in enumerate(self.joints): + self.index_joint[joint_i.name] = jidx + + joint.child_joints = [ + child for child in joint.child_joints if (child.name in exceptions) + ] + + return remove_idxs + + +class Pose(object): + """Defines a pose. A list of poses forms a motion sequence. + + Each pose contains position and orientation of joints, in the form of + transformation matrices, for a particular time step. The position and + orientation information are relative to base pose. Pose object also + stores skeleton information it is associated with, in order to access + base pose joint data. + + Attributes: + skel: Skeleton object of the character associated with the pose + data: Pose data must be provided with an np.array of shape + (num_joints, 4, 4). The order of joints must be the same as the + order of joints in `skel.joints`. + + Use the `to_matrix()` to convert the pose object to numpy matrix form, + and `from_matrix(data, skel)` to convert numpy matrix to pose object. This + is useful for serializing/deserializing data for batch processing, or to + create batched tensor data for ML model inputs. + + Use `get_transform(key, local)` to get joint transformation matrices, in + either global or local (with respect to parent) form. + """ + + def __init__(self, skel, data=None): + assert isinstance(skel, Skeleton) + if data is None: + data = [ + constants.eye_T() for _ in range(skel.num_joints()) + ] # SM) typo fixed: eye_T (ftn) -> eye_T() + assert skel.num_joints() == len(data), "{} vs. {}".format( + skel.num_joints(), len(data) + ) + self.skel = skel + self.data = data + + def get_transform(self, key, local): + skel = self.skel + if local: + return self.data[skel.get_index_joint(key)] + else: + joint = skel.get_joint(key) + T = np.dot( + joint.xform_from_parent_joint, + self.data[skel.get_index_joint(joint)], + ) + while joint.parent_joint is not None: + T_j = np.dot( + joint.parent_joint.xform_from_parent_joint, + self.data[skel.get_index_joint(joint.parent_joint)], + ) + T = np.dot(T_j, T) + joint = joint.parent_joint + return T + + def set_transform(self, key, T, local, do_ortho_norm=True): + if local: + T1 = T + else: + T0 = self.skel.get_joint(key).xform_global + T1 = np.dot(math.invertT(T0), T) + if do_ortho_norm: + """ + This insures that the rotation part of + the given transformation is valid + """ + Q, p = conversions.T2Qp(T1) + Q = quaternion.Q_op(Q, op=["normalize"]) + T1 = conversions.Qp2T(Q, p) + self.data[self.skel.get_index_joint(key)] = T1 + + def get_root_transform(self): + root_idx = self.skel.get_index_joint(self.skel.root_joint) + return self.get_transform(root_idx, local=False) + + def set_root_transform(self, T, local): + root_idx = self.skel.get_index_joint(self.skel.root_joint) + self.set_transform(root_idx, T, local) + + def get_facing_transform(self): + d, p = self.get_facing_direction_position() + z = d + y = self.skel.v_up_env + x = np.cross(y, z) + return conversions.Rp2T(np.array([x, y, z]).transpose(), p) + + def get_facing_position(self): + d, p = self.get_facing_direction_position() + return p + + def get_facing_direction(self): + d, p = self.get_facing_direction_position() + return d + + def get_facing_direction_position(self): + R, p = conversions.T2Rp(self.get_root_transform()) + d = np.dot(R, self.skel.v_face) + d = d - math.projectionOnVector(d, self.skel.v_up_env) + p = p - math.projectionOnVector(p, self.skel.v_up_env) + return d / np.linalg.norm(d), p + + def set_skeleton(self, skel): + assert skel.num_joints() == len(self.data) + self.skel = skel + + def to_matrix(self, local=True): + """ + Returns pose data in transformation matrix format, with shape + (num_joints, 4, 4) + """ + transforms = [] + for joint in self.skel.joints: + transforms.append(self.get_transform(joint, local)) + return np.array(transforms) + + @classmethod + def from_matrix(cls, data, skel, local=True): + """ + Expects pose data in transformation matrix format, with shape + (num_joints, 4, 4) + """ + num_joints, T_0, T_1 = data.shape + assert ( + num_joints == skel.num_joints() + ), "Data for all joints not provided" + assert T_0 == 4 and T_1 == 4, ( + "Data not provided in 4x4 transformation matrix format. Use " + "fairmotion.utils.constants.eye_T() for template identity " + "matrix" + ) + pose = cls(skel) + for joint_id in range(len(skel.joints)): + pose.set_transform(joint_id, data[joint_id], local) + return pose + + @classmethod + def interpolate(cls, pose1, pose2, alpha): + skel = pose1.skel + data = [] + for j in skel.joints: + R1, p1 = conversions.T2Rp(pose1.get_transform(j, local=True)) + R2, p2 = conversions.T2Rp(pose2.get_transform(j, local=True)) + R, p = ( + math.slerp(R1, R2, alpha), + math.lerp(p1, p2, alpha), + ) + data.append(conversions.Rp2T(R, p)) + return Pose(pose1.skel, data) + + # SM) + def get_root_facing_transform_byRoot(self, use_height=False): + body_T = constants.eye_T() + rootR = self.get_transform(0, local=True)[:3, :3] + yAngle = math.project_rotation_1D(rootR, axis=self.skel.v_up_env) + body_T[:3, :3] = conversions.Ay2R(yAngle) + body_T[:3, 3] = self.get_transform(0, local=False)[:3, 3] + if not use_height: + body_T[1, 3] = 0 + return body_T + + # SM) + def positions(self, local=True): + return self.to_matrix(local)[..., :3, 3] + + def remove_joints(self, joint_idxs): + self.data = [di for i, di in enumerate(self.data) if i not in joint_idxs] + # remove_jidx = np.zeros(len(self.data), dtype=bool) + # remove_jidx[joint_idxs] = True + # self.data = self.data[~remove_jidx] + + +class Motion(object): + """Defines a motion sequence. + + Motion consists of the following components: + - skeleton: Skeleton object containing information about joints and + base pose of the subject. + - poses: List of Pose objects. Each frame of motion is defined by a pose. + Attributes: + skel: Skeleton object of the character associated with the pose + poses: List of pose objects, one for each frame of motion + fps: Rendering frequency in Hz + info: Free form dictionary to include more information about the motion + sequence. + + Use the `to_matrix()` to convert the motion object to numpy matrix form + with shape (num_frames, num_joints, 4, 4), and `from_matrix(data, skel)` to + convert numpy matrix to pose object. This is useful for + serializing/deserializing data for batch processing, or to create batched + tensor data for ML model inputs. + """ + + def __init__( + self, + name="motion", + skel=None, + fps=30, # SM) default fps 60->30 + ): + self.name = name + self.skel = skel + self.poses = [] + self.fps = fps + self.fps_inv = 1.0 / fps + self.info = {} + + def clear(self): + self.poses = [] + self.info = {} + + def set_fps(self, fps): + self.fps = fps + self.fps_inv = 1.0 / fps + + def set_skeleton(self, skel): + self.skel = skel + for idx in range(len(self.poses)): + self.poses[idx].set_skeleton(skel) + + def add_one_frame(self, pose_data=None): + """Adds a pose at the end of motion object. + + Args: + pose_data: List of pose data, where each pose + None means zero-pose (Identity for all joints) + """ + self.poses.append(Pose(self.skel, pose_data)) + + def frame_to_time(self, frame): + frame = np.clip(frame, 0, len(self.poses) - 1) + return frame * self.fps_inv + + def time_to_frame(self, time): + """ + Adding small value is necessary to prevent error + arised from floating point precision + """ + return int(time * self.fps + 1e-05) + + def get_pose_by_frame(self, frame): + assert frame < self.num_frames(), f"{frame} vs. {self.num_frames()}" + return self.poses[frame] + + def get_pose_by_time(self, time): + """ + If specified time is close to an integral multiple of (1/fps), returns + the pose at that time. Else, returns an interpolated version + """ + time = np.clip(time, 0, self.length()) + frame1 = self.time_to_frame(time) + frame2 = min(frame1 + 1, self.num_frames() - 1) + if frame1 == frame2: + return self.poses[frame1] + + t1 = self.frame_to_time(frame1) + t2 = self.frame_to_time(frame2) + alpha = np.clip((time - t1) / (t2 - t1), 0.0, 1.0) + + return Pose.interpolate(self.poses[frame1], self.poses[frame2], alpha) + + def num_frames(self): + return len(self.poses) + + def length(self): + """ + Returns time length of motion in seconds. The first frame is considered + to be at time 0, and the last frame at time self.length(). + Example: If fps is 60Hz and there are 120 frames, length() returns + 1.9833. In case there are 121 frames, length() is 2. + """ + return (len(self.poses) - 1) * self.fps_inv + + def to_matrix(self, local=True): + """ + Returns pose data in transformation matrix format, with shape + (seq_len, num_joints, 4, 4) + """ + data = [] + for pose in self.poses: + data.append(pose.to_matrix(local)) + return np.array(data) + + def rotations(self, local=True): + """ + Returns joint rotations in rotation matrix format, with shape + (seq_len, num_joints, 3, 3) + """ + return self.to_matrix(local)[..., :3, :3] + + def positions(self, local=True): + """ + Returns joint positions with shape (seq_len, num_joints, 3) + """ + return self.to_matrix(local)[..., :3, 3] + + @classmethod + def from_matrix(cls, data, skel, local=True, fps=None): + """ + Expects pose data in transformation matrix format, with shape + (seq_len, num_joints, 4, 4) + """ + assert data.ndim == 4, ( + "Data must be provided in transformation matrix format, with shape" + " (seq_len, num_joints, 4, 4)" + ) + seq_len, num_joints, T_0, T_1 = data.shape + assert ( + num_joints == skel.num_joints() + ), "Data for all joints not provided" + assert T_0 == 4 and T_1 == 4, ( + "Data not provided in 4x4 transformation matrix format. Use " + "fairmotion.utils.constants.eye_T() for template identity " + "matrix" + ) + if fps is None: + fps = 60 + motion = cls(skel=skel, fps=fps) + for pose_data in data: + pose = Pose.from_matrix(pose_data, skel, local) + motion.poses.append(pose) + return motion + + # SM) + def get_joint_transforms(self, key, local=True): + """ + Returns joint pose data in transformation matrix format, with shape + (seq_len, 4, 4) + """ + data = [] + for pose in self.poses: + data.append(pose.get_transform(key, local)) + return np.array(data) + + def remove_childs_except(self, joint_name, exceptions): + remove_idxs = self.skel.remove_childs_except(joint_name, exceptions) + for pose in self.poses: + pose.remove_joints(remove_idxs) + + def remove_joint_and_childs(self, joint_name): + remove_idxs = self.skel.remove_joint_and_childs(joint_name) + for pose in self.poses: + pose.remove_joints(remove_idxs) + + def add_joint_inbetween( + self, + parent_joint_name, + name=None, + childs_to_move="all", + xform_from_parent_joint=None, + ): + joint_name = name if name else parent_joint_name + "_dummy" + + self.skel.add_joint_inbetween( + parent_joint_name, joint_name, childs_to_move, xform_from_parent_joint + ) + new_joint_id = self.skel.get_index_joint(joint_name) + for pose in self.poses: + pose.data = ( + pose.data[:new_joint_id] + + [constants.eye_T()] + + pose.data[new_joint_id:] + ) diff --git a/src/fairmotion/fairmotion/core/similarity.py b/src/fairmotion/fairmotion/core/similarity.py new file mode 100644 index 0000000000000000000000000000000000000000..bfec396210b075c6b9caad1e9d0f47a5840c3a44 --- /dev/null +++ b/src/fairmotion/fairmotion/core/similarity.py @@ -0,0 +1,196 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import math +import numpy as np + +from fairmotion.ops import conversions, math as math_ops, quaternion + + +def root_ee_similarity( + pose1, + pose2, + vel1=None, + vel2=None, + w_root_pos=1.0, + w_root_vel=1.0, + w_ee_pos=1.0, + w_ee_vel=1.0, + T_ref_1=None, + T_ref_2=None, + auto_weight=True, + auto_weight_sigma=0.02, + verbose=False, +): + """ + This computes similarity between end_effectors and root for two poses + + Parameters + ---------- + """ + + assert pose1.skel.num_end_effectors() == pose2.skel.num_end_effectors() + + if w_root_vel > 0.0 or w_ee_vel > 0.0: + assert vel1 is not None and vel2 is not None + assert vel1.skel.num_end_effectors() == vel2.skel.num_end_effectors() + + skel = pose1.skel + + diff_root_pos = 0.0 + diff_root_vel = 0.0 + diff_ee_pos = 0.0 + diff_ee_vel = 0.0 + + """ + Differencse will be computed w.r.t. its own facing frame + if the reference frame is not given + """ + + if T_ref_1 is None: + R_face_1, p_face_1 = conversions.T2Rp(pose1.get_facing_transform()) + else: + R_face_1, p_face_1 = conversions.T2Rp(T_ref_1) + if T_ref_2 is None: + R_face_2, p_face_2 = conversions.T2Rp(pose2.get_facing_transform()) + else: + R_face_2, p_face_2 = conversions.T2Rp(T_ref_2) + + R_face_1_inv = R_face_1.transpose() + R_face_2_inv = R_face_2.transpose() + + R_root_1, p_root_1 = conversions.T2Rp(pose1.get_root_transform()) + R_root_2, p_root_2 = conversions.T2Rp(pose2.get_root_transform()) + + if w_root_pos > 0.0: + p_root_1_local = np.dot(R_face_1_inv, p_root_1 - p_face_1) + p_root_2_local = np.dot(R_face_2_inv, p_root_2 - p_face_2) + + diff_root_pos = p_root_2_local - p_root_1_local + diff_root_pos = np.dot(diff_root_pos, diff_root_pos) + + """ Root Velocity Difference w.r.t. Facing Frame """ + + if w_root_vel > 0.0: + v_root_1 = vel1.get_linear(skel.root_joint, False, R_root_1) + v_root_2 = vel2.get_linear(skel.root_joint, False, R_root_2) + + v_root_1_local = np.dot(R_face_1_inv, v_root_1) + v_root_2_local = np.dot(R_face_2_inv, v_root_2) + + diff_root_vel = v_root_2_local - v_root_1_local + diff_root_vel = np.dot(diff_root_vel, diff_root_vel) + + """ End Effector Position and Velocity Differences w.r.t. Facing Frame """ + + num_ee = skel.num_end_effectors() + + if num_ee > 0: + if w_ee_pos > 0.0 or w_ee_vel > 0.0: + R1s, p1s = [], [] + R2s, p2s = [], [] + ee_weights = [] + for j in skel.end_effectors: + R1, p1 = conversions.T2Rp(pose1.get_transform(j, local=False)) + R2, p2 = conversions.T2Rp(pose2.get_transform(j, local=False)) + R1s.append(R1) + R2s.append(R2) + p1s.append(p1) + p2s.append(p2) + if auto_weight: + h = math_ops.projectionOnVector(p1, skel.v_up_env) + ee_weights.append( + math.exp(-np.dot(h, h) / auto_weight_sigma) + ) + else: + ee_weights.append(1.0) + ee_weights = np.array(ee_weights)/np.sum(ee_weights) + if w_ee_pos > 0.0: + for j in range(len(skel.end_effectors)): + p1_local = np.dot(R_face_1_inv, p1s[j] - p_face_1) + p2_local = np.dot(R_face_2_inv, p2s[j] - p_face_2) + dp = p2_local - p1_local + diff_ee_pos += ee_weights[j] * np.dot(dp, dp) + if w_ee_vel > 0.0: + for j in range(len(skel.end_effectors)): + v1 = vel1.get_linear(j, False, R1s[j]) + v2 = vel2.get_linear(j, False, R2s[j]) + v1_local = np.dot(R_face_1_inv, v1) + v2_local = np.dot(R_face_2_inv, v2) + dv = v2_local - v1_local + diff_ee_vel += ee_weights[j] * np.dot(dv, dv) + + if verbose: + print("diff_root_pos:", diff_root_pos) + print("diff_root_vel:", diff_root_vel) + print("diff_ee_pos:", diff_ee_pos) + print("diff_ee_vel:", diff_ee_vel) + + diff = ( + w_root_pos * diff_root_pos + + w_root_vel * diff_root_vel + + w_ee_pos * diff_ee_pos + + w_ee_vel * diff_ee_vel + ) + + return diff + + +def pose_similarity( + pose1, + pose2, + vel1=None, + vel2=None, + w_joint_pos=0.9, + w_joint_vel=0.1, + w_joints=None, + apply_root_correction=True, + verbose=False, +): + """ + This only measure joint angle difference (i.e. root translation will + not be considered). + If 'apply_root_correction' is True, then pose2 will be rotated + automatically + in a way that its root rotation is closest to the root rotation of pose1, + where'root_correction_axis' defines the geodesic curve. + """ + assert pose1.skel.num_joints() == pose2.skel.num_joints() + skel = pose1.skel + if vel1 is not None: + assert vel2 is not None + assert vel1.skel.num_joints() == vel2.skel.num_joints() + + if w_joints is None: + w_joints = np.ones(skel.num_joints()) + + """ joint angle difference """ + diff_pos = 0.0 + if w_joint_pos > 0.0: + root_idx = skel.get_index_joint(skel.root_joint) + v_up_env = pose1.skel.v_up_env + for j in range(skel.num_joints()): + R1, p1 = conversions.T2Rp(pose1.get_transform(j, local=True)) + R2, p2 = conversions.T2Rp(pose2.get_transform(j, local=True)) + if apply_root_correction and j == root_idx: + Q1 = conversions.R2Q(R1) + Q2 = conversions.R2Q(R2) + Q2, _ = quaternion.Q_closest(Q1, Q2, v_up_env) + R2 = conversions.Q2R(Q2) + # TODO: Verify if logSO3 is same as R2A + dR = conversions.R2A(np.dot(np.transpose(R1), R2)) + diff_pos += w_joints[j] * np.dot(dR, dR) + """ joint angular velocity difference """ + diff_vel = 0.0 + if vel1 is not None and w_joint_vel > 0.0: + skel = vel1.skel + for j in range(skel.num_joints()): + dw = vel2.get_angular(j, local=True) - vel1.get_angular( + j, local=True + ) + diff_vel += w_joints[j] * np.dot(dw, dw) + if verbose: + print("diff_pos:", diff_pos) + print("diff_vel:", diff_vel) + return ( + w_joint_pos * diff_pos + w_joint_vel * diff_vel + ) / skel.num_joints() diff --git a/src/fairmotion/fairmotion/core/velocity.py b/src/fairmotion/fairmotion/core/velocity.py new file mode 100644 index 0000000000000000000000000000000000000000..4c553decdaa97cf5bd0048e83f53ba6ac69e64f3 --- /dev/null +++ b/src/fairmotion/fairmotion/core/velocity.py @@ -0,0 +1,206 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np + +from fairmotion.utils import constants +from fairmotion.ops import conversions, math +from fairmotion.core.motion import Pose, Motion + + +class Velocity(object): + """Velocity class to compute angular and linear velocity of joints. All + velocities are represented w.r.t. the joint frame (local). + + Attributes: + pose1, pose2: Objects of Pose class between which velocity is + computed. + dt: Time between poses + """ + + def __init__(self, pose1=None, pose2=None, dt=None): + self.data_local = None + self.data_global = None + if pose1: + assert pose2 and dt + assert isinstance(pose1, Pose) and isinstance(pose2, Pose) + self.skel = pose1.skel + self.data_local, self.data_global = Velocity.compute( + pose1, pose2, dt, + ) + + def set_skel(self, skel): + self.skel = skel + + def set_data_local(self, data): + self.data_local = data + + def set_data_global(self, data): + self.data_global = data + + @classmethod + def compute(cls, pose1, pose2, dt): + assert pose1.skel == pose2.skel + data_local = [] + data_global = [] + assert dt > constants.EPSILON + for joint in pose1.skel.joints: + T1 = pose1.get_transform(joint, local=True) + T2 = pose2.get_transform(joint, local=True) + dR, dp = conversions.T2Rp(np.dot(math.invertT(T1), T2)) + w, v = conversions.R2A(dR) / dt, dp / dt + data_local.append(np.hstack((w, v))) + T1 = pose1.get_transform(joint, local=False) + T2 = pose2.get_transform(joint, local=False) + dR, dp = conversions.T2Rp(np.dot(math.invertT(T1), T2)) + w, v = conversions.R2A(dR) / dt, dp / dt + data_global.append(np.hstack((w, v))) + return np.array(data_local), np.array(data_global) + + def get_all(self, key, local, R_ref=None): + """Returns both linear and angular velocity stacked together""" + return np.hstack( + [ + self.get_angular(key, local, R_ref), + self.get_linear(key, local, R_ref), + ] + ) + + def get_angular(self, key, local, R_ref=None): + data = self.data_local if local else self.data_global + w = data[self.skel.get_index_joint(key), 0:3] + if R_ref is not None: + w = np.dot(R_ref, w) + return w + + def get_linear(self, key, local, R_ref=None): + data = self.data_local if local else self.data_global + v = data[self.skel.get_index_joint(key), 3:6] + if R_ref is not None: + v = np.dot(R_ref, v) + return v + + def rotate(self, R): + # TODO: Add documentation + data_global_new = [] + for joint in self.skel.joints: + w = self.get_angular(key=joint, local=False) + v = self.get_linear(key=joint, local=False) + w = np.dot(R, w) + v = np.dot(R, v) + data_global_new.append(np.hstack([w, v])) + self.data_global = np.array(data_global_new) + + def to_matrix(self, local=True): + if local: + return self.data_local + else: + return self.data_global + + @classmethod + def interpolate(cls, v1, v2, alpha): + """Returns interpolated velocity object between two velocity objects. + Typically, each velocity object is associated with a frame. + `interpolate` could be used to calculated interpolated angular and + linear velocity for any frame between them. + + Args: + v1, v2: Velocity objects associated with frame between which + interpolated velocity is calculated + alpha: Value between 0 and 1 denoting the blending ratio. alpha=0 + returns v1, and alpha=1 returns v2 + """ + data_local = math.lerp(v1.data_local, v2.data_local, alpha) + data_global = math.lerp(v1.data_global, v2.data_global, alpha) + v = cls() + v.set_skel(v1.skel) + v.set_data_local(data_local) + v.set_data_global(data_global) + return v + + +class MotionWithVelocity(Motion): + """ + Extension of `Motion` class to additionally pre-compute angular and linear + velocity of joints. + + Instantiating a `MotionWithVelocity` object uses the constructor of the + `Motion` class and creates an empty velocity list. After populating the + empty `MotionWithVelocity` object with poses, use `compute_velocities()` + to make velocity information available. + + To instantiate `MotionWithVelocity` object from a `Motion` object, use + the `from_motion` method. + ``` + from fairmotion.data import bvh + from fairmotion.core.velocity import MotionWithVelocity + + motion = bvh.load(bvh_filename) + motion_with_velcoty = MotionWithVelocity.from_motion(motion) + ``` + + Attributes: + name: Optional; String name of MotionWithVelocity object + skel: Skeleton object of the character associated with the motion + sequence + fps: Rendering frequency in Hz + """ + + def __init__(self, name="motion", skel=None, fps=60): + super().__init__(name, skel, fps) + self.vels = [] + + def compute_velocities(self): + self.vels = self._compute_velocities() + + def _compute_velocities(self, frame_start=None, frame_end=None): + vels = [] + if frame_start is None: + frame_start = 0 + if frame_end is None: + frame_end = self.num_frames() + for i in range(frame_start, frame_end): + frame1 = max(0, (i - 1)) + frame2 = min(self.num_frames() - 1, (i + 1)) + dt = (frame2 - frame1) / float(self.fps) + pose1 = self.get_pose_by_frame(frame1) + pose2 = self.get_pose_by_frame(frame2) + vels.append(Velocity(pose1, pose2, dt)) + # print(vels[-1].get_linear('root', local=True)) + return vels + + def get_velocity_by_time(self, time): + assert len(self.vels) > 0, ( + "Velocity was not computed yet.", + "Please call self.compute_velocities() first", + ) + + time = np.clip(time, 0, self.length()) + frame1 = self.time_to_frame(time) + frame2 = min(frame1 + 1, self.num_frames() - 1) + if frame1 == frame2: + return self.vels[frame1] + + t1 = self.frame_to_time(frame1) + t2 = self.frame_to_time(frame2) + alpha = (time - t1) / (t2 - t1) + alpha = np.clip((time - t1) / (t2 - t1), 0.0, 1.0) + + v1 = self.get_velocity_by_frame(frame1) + v2 = self.get_velocity_by_frame(frame2) + return Velocity.interpolate(v1, v2, alpha) + + def get_velocity_by_frame(self, frame): + assert len(self.vels) > 0, ( + "Velocity was not computed yet.", + "Please call self.compute_velocities() first", + ) + assert frame < self.num_frames() + return self.vels[frame] + + @classmethod + def from_motion(cls, m): + mv = cls(m.name, m.skel, m.fps) + mv.poses = m.poses + mv.info = m.info + mv.compute_velocities() + return mv diff --git a/src/fairmotion/fairmotion/data/__init__.py b/src/fairmotion/fairmotion/data/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9020c2df23e2af280b7bb168b996ae9eaf312eb8 --- /dev/null +++ b/src/fairmotion/fairmotion/data/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. diff --git a/src/fairmotion/fairmotion/data/amass.py b/src/fairmotion/fairmotion/data/amass.py new file mode 100644 index 0000000000000000000000000000000000000000..dc94929dd1bf7968dd013755286da58ed80fa726 --- /dev/null +++ b/src/fairmotion/fairmotion/data/amass.py @@ -0,0 +1,151 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import torch +import numpy as np +from human_body_prior.body_model.body_model import BodyModel +from fairmotion.core import motion as motion_class +from fairmotion.ops import conversions +from fairmotion.utils import utils + +""" +Structure of npz file in AMASS dataset is as follows. +- trans (num_frames, 3): translation (x, y, z) of root joint +- gender str: Gender of actor +- mocap_framerate int: Framerate in Hz +- betas (16): Shape parameters of body. See https://smpl.is.tue.mpg.de/ +- dmpls (num_frames, 8): DMPL parameters +- poses (num_frames, 156): Pose data. Each pose is represented as 156-sized + array. The mapping of indices encoding data is as follows: + 0-2 Root orientation + 3-65 Body joint orientations + 66-155 Finger articulations +""" + +# Custom names for 22 joints in AMASS data +joint_names = [ + "root", + "lhip", + "rhip", + "lowerback", + "lknee", + "rknee", + "upperback", + "lankle", + "rankle", + "chest", + "ltoe", + "rtoe", + "lowerneck", + "lclavicle", + "rclavicle", + "upperneck", + "lshoulder", + "rshoulder", + "lelbow", + "relbow", + "lwrist", + "rwrist", +] + + +def create_skeleton_from_amass_bodymodel(bm, betas, num_joints, joint_names): + pose_body_zeros = torch.zeros((1, 3 * (num_joints - 1))) + body = bm(pose_body=pose_body_zeros, betas=betas) + base_position = body.Jtr.detach().numpy()[0, 0:num_joints] + parents = bm.kintree_table[0].long()[:num_joints] + + joints = [] + for i in range(num_joints): + joint = motion_class.Joint(name=joint_names[i]) + if i == 0: + joint.info["dof"] = 6 + joint.xform_from_parent_joint = conversions.p2T(np.zeros(3)) + else: + joint.info["dof"] = 3 + joint.xform_from_parent_joint = conversions.p2T( + base_position[i] - base_position[parents[i]] + ) + joints.append(joint) + + parent_joints = [] + for i in range(num_joints): + parent_joint = None if parents[i] < 0 else joints[parents[i]] + parent_joints.append(parent_joint) + + skel = motion_class.Skeleton() + for i in range(num_joints): + skel.add_joint(joints[i], parent_joints[i]) + + return skel + + +def create_motion_from_amass_data(filename, bm, override_betas=None): + bdata = np.load(filename) + + if override_betas is not None: + betas = torch.Tensor(override_betas[:10][np.newaxis]).to("cpu") + else: + betas = torch.Tensor(bdata["betas"][:10][np.newaxis]).to("cpu") + + skel = create_skeleton_from_amass_bodymodel( + bm, betas, len(joint_names), joint_names, + ) + + fps = float(bdata["mocap_framerate"]) + root_orient = bdata["poses"][:, :3] # controls the global root orientation + pose_body = bdata["poses"][:, 3:66] # controls body joint angles + trans = bdata["trans"][:, :3] # controls the finger articulation + + motion = motion_class.Motion(skel=skel, fps=fps) + + num_joints = skel.num_joints() + parents = bm.kintree_table[0].long()[:num_joints] + + for frame in range(pose_body.shape[0]): + pose_body_frame = pose_body[frame] + root_orient_frame = root_orient[frame] + root_trans_frame = trans[frame] + pose_data = [] + for j in range(num_joints): + if j == 0: + T = conversions.Rp2T( + conversions.A2R(root_orient_frame), root_trans_frame + ) + else: + T = conversions.R2T( + conversions.A2R( + pose_body_frame[(j - 1) * 3 : (j - 1) * 3 + 3] + ) + ) + pose_data.append(T) + motion.add_one_frame(pose_data) + + return motion + + +def load_body_model(bm_path, num_betas=10, model_type="smplh"): + comp_device = torch.device("cpu") + bm = BodyModel( + bm_fname=bm_path, + num_betas=num_betas, + # model_type=model_type + ).to(comp_device) + return bm + + +def load(file, bm=None, bm_path=None, num_betas=10, model_type="smplh", override_betas=None): + if bm is None: + # Download the required body model. For SMPL-H download it from + # http://mano.is.tue.mpg.de/. + assert bm_path is not None, "Please provide SMPL body model path" + bm = load_body_model(bm_path, num_betas, model_type) + return create_motion_from_amass_data( + filename=file, bm=bm, override_betas=override_betas) + + +def save(): + raise NotImplementedError("Using bvh.save() is recommended") + + +def load_parallel(files, cpus=20, **kwargs): + return utils.run_parallel(load, files, num_cpus=cpus, **kwargs) diff --git a/src/fairmotion/fairmotion/data/amass_dip.py b/src/fairmotion/fairmotion/data/amass_dip.py new file mode 100644 index 0000000000000000000000000000000000000000..61d88550eaf5ba1ecc40d479a24285141a4a05a6 --- /dev/null +++ b/src/fairmotion/fairmotion/data/amass_dip.py @@ -0,0 +1,164 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np +import pickle as pkl +from fairmotion.core import motion as motion_class +from fairmotion.utils import constants +from fairmotion.ops import conversions + + +SMPL_MAJOR_JOINTS = [1, 2, 3, 4, 5, 6, 9, 12, 13, 14, 15, 16, 17, 18, 19] +SMPL_NR_JOINTS = 24 +SMPL_PARENTS = [ + -1, + 0, + 0, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 9, + 9, + 12, + 13, + 14, + 16, + 17, + 18, + 19, + 20, + 21, +] +SMPL_JOINTS = [ + "pelvis", + "l_hip", + "r_hip", + "spine1", + "l_knee", + "r_knee", + "spine2", + "l_ankle", + "r_ankle", + "spine3", + "l_foot", + "r_foot", + "neck", + "l_collar", + "r_collar", + "head", + "l_shoulder", + "r_shoulder", + "l_elbow", + "r_elbow", + "l_wrist", + "r_wrist", + "l_hand", + "r_hand", +] +SMPL_JOINT_MAPPING = {i: x for i, x in enumerate(SMPL_JOINTS)} + +# this are the offsets stored under `J` in the SMPL model pickle file +OFFSETS = np.array( + [ + [-8.76308970e-04, -2.11418723e-01, 2.78211200e-02], + [7.04848876e-02, -3.01002533e-01, 1.97749280e-02], + [-6.98883278e-02, -3.00379160e-01, 2.30254335e-02], + [-3.38451650e-03, -1.08161861e-01, 5.63597909e-03], + [1.01153808e-01, -6.65211904e-01, 1.30860155e-02], + [-1.06040718e-01, -6.71029623e-01, 1.38401121e-02], + [1.96440985e-04, 1.94957852e-02, 3.92296547e-03], + [8.95999143e-02, -1.04856032e00, -3.04155922e-02], + [-9.20120818e-02, -1.05466743e00, -2.80514913e-02], + [2.22362284e-03, 6.85680141e-02, 3.17901760e-02], + [1.12937580e-01, -1.10320516e00, 8.39545265e-02], + [-1.14055299e-01, -1.10107698e00, 8.98482216e-02], + [2.60992373e-04, 2.76811197e-01, -1.79753042e-02], + [7.75218998e-02, 1.86348444e-01, -5.08464100e-03], + [-7.48091986e-02, 1.84174211e-01, -1.00204779e-02], + [3.77815350e-03, 3.39133394e-01, 3.22299558e-02], + [1.62839013e-01, 2.18087461e-01, -1.23774789e-02], + [-1.64012068e-01, 2.16959041e-01, -1.98226746e-02], + [4.14086325e-01, 2.06120683e-01, -3.98959248e-02], + [-4.10001734e-01, 2.03806676e-01, -3.99843890e-02], + [6.52105424e-01, 2.15127546e-01, -3.98521818e-02], + [-6.55178550e-01, 2.12428626e-01, -4.35159074e-02], + [7.31773168e-01, 2.05445019e-01, -5.30577698e-02], + [-7.35578759e-01, 2.05180646e-01, -5.39352281e-02], + ] +) + + +def load( + file, + motion=None, + scale=1.0, + load_skel=True, + load_motion=True, + v_up_skel=np.array([0.0, 1.0, 0.0]), + v_face_skel=np.array([0.0, 0.0, 1.0]), + v_up_env=np.array([0.0, 1.0, 0.0]), +): + if not motion: + motion = motion_class.Motion(fps=60) + + if load_skel: + skel = motion_class.Skeleton( + v_up=v_up_skel, v_face=v_face_skel, v_up_env=v_up_env, + ) + smpl_offsets = np.zeros([24, 3]) + smpl_offsets[0] = OFFSETS[0] + for idx, pid in enumerate(SMPL_PARENTS[1:]): + smpl_offsets[idx + 1] = OFFSETS[idx + 1] - OFFSETS[pid] + for joint_name, parent_joint, offset in zip( + SMPL_JOINTS, SMPL_PARENTS, smpl_offsets + ): + joint = motion_class.Joint(name=joint_name) + if parent_joint == -1: + parent_joint_name = None + joint.info["dof"] = 6 # root joint is free + offset -= offset + else: + parent_joint_name = SMPL_JOINTS[parent_joint] + offset = offset / np.linalg.norm(smpl_offsets[4]) + T1 = conversions.p2T(scale * offset) + joint.xform_from_parent_joint = T1 + skel.add_joint(joint, parent_joint_name) + motion.skel = skel + else: + assert motion.skel is not None + + if load_motion: + assert motion.skel is not None + # Assume 60fps + motion.set_fps(60.0) + dt = float(1 / motion.fps) + with open(file, "rb") as f: + data = pkl.load(f, encoding="latin1") + poses = np.array(data["poses"]) # shape (seq_length, 135) + assert len(poses) > 0, "file is empty" + poses = poses.reshape((-1, len(SMPL_MAJOR_JOINTS), 3, 3)) + + for pose_id, pose in enumerate(poses): + pose_data = [ + constants.eye_T() for _ in range(len(SMPL_JOINTS)) + ] + major_joint_id = 0 + for joint_id, joint_name in enumerate(SMPL_JOINTS): + if joint_id in SMPL_MAJOR_JOINTS: + pose_data[ + motion.skel.get_index_joint(joint_name) + ] = conversions.R2T(pose[major_joint_id]) + major_joint_id += 1 + motion.add_one_frame(pose_data) + + return motion + + +def save(): + raise NotImplementedError("Using bvh.save() is recommended") diff --git a/src/fairmotion/fairmotion/data/asfamc.py b/src/fairmotion/fairmotion/data/asfamc.py new file mode 100644 index 0000000000000000000000000000000000000000..891201278c82b845714cf57ac5a312c3f4fd6f4e --- /dev/null +++ b/src/fairmotion/fairmotion/data/asfamc.py @@ -0,0 +1,232 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import torch +import numpy as np +from fairmotion.core import motion as motion_class +from fairmotion.core.motion import Joint +from fairmotion.ops import conversions +from fairmotion.utils import constants + +from mpl_toolkits.mplot3d import Axes3D + + +def read_line(stream, idx): + if idx >= len(stream): + return None, idx + line = stream[idx].strip().split() + idx += 1 + return line, idx + + +def parse_asf(file_path): + """read joint data only""" + with open(file_path) as f: + content = f.read().splitlines() + + for idx, line in enumerate(content): + # meta infomation is ignored + if line == ":bonedata": + content = content[idx + 1 :] + break + + # read joints + joints = { + "root": Joint( + "root", + direction=np.zeros(3), + length=0, + axis=np.zeros(3), + dof=[], + limits=[], + ) + } + + idx = 0 + while True: + # the order of each section is hard-coded + + line, idx = read_line(content, idx) + + if line[0] == ":hierarchy": + break + + assert line[0] == "begin" + + line, idx = read_line(content, idx) + assert line[0] == "id" + + line, idx = read_line(content, idx) + assert line[0] == "name" + name = line[1] + + line, idx = read_line(content, idx) + assert line[0] == "direction" + direction = np.array([float(axis) for axis in line[1:]]) + + # skip length + line, idx = read_line(content, idx) + assert line[0] == "length" + length = float(line[1]) + + line, idx = read_line(content, idx) + assert line[0] == "axis" + assert line[4] == "XYZ" + + axis = np.array([float(axis) for axis in line[1:-1]]) + + dof = [] + limits = [] + + line, idx = read_line(content, idx) + if line[0] == "dof": + dof = line[1:] + for i in range(len(dof)): + line, idx = read_line(content, idx) + if i == 0: + assert line[0] == "limits" + line = line[1:] + assert len(line) == 2 + mini = float(line[0][1:]) + maxi = float(line[1][:-1]) + limits.append((mini, maxi)) + + line, idx = read_line(content, idx) + + assert line[0] == "end" + joints[name] = Joint( + name, + direction=direction, + length=length, + axis=axis, + dof=dof, + limits=limits, + ) + + # read hierarchy + assert line[0] == ":hierarchy" + + line, idx = read_line(content, idx) + + assert line[0] == "begin" + + while True: + line, idx = read_line(content, idx) + if line[0] == "end": + break + assert len(line) >= 2 + for joint_name in line[1:]: + joints[line[0]].child_joints.append(joints[joint_name]) + for nm in line[1:]: + joints[nm].parent_joint = joints[line[0]] + + return joints + + +def set_rotation(joint): + if "root" in joint.name: + joint.matrix = joint.C.dot(conversions.E2R(joint.degree)).dot( + joint.Cinv + ) + else: + joint.matrix = joint.C.dot(conversions.E2R(joint.degree)).dot( + joint.Cinv + ) + joint.coordinate = joint.length * joint.matrix.dot(joint.direction) + for child in joint.child_joints: + set_rotation(child) + + +def parse_amc(file_path, joints, skel): + with open(file_path) as f: + content = f.read().splitlines() + + for idx, line in enumerate(content): + if line == ":DEGREES": + content = content[idx + 1 :] + break + + motion = motion_class.Motion(skel=skel) + frames = [] + idx = 0 + line, idx = read_line(content, idx) + assert line[0].isnumeric(), line + EOF = False + frame = 0 + translation_data = [] + while not EOF: + # joint_degree = {} + while True: + line, idx = read_line(content, idx) + if line is None: + EOF = True + break + if line[0].isnumeric(): + break + line_idx = 1 + if "root" in line[0]: + degree = np.array([float(line[i]) for i in range(4, 7)]) + joints[line[0]].coordinate = np.array( + [float(line[i]) for i in range(1, 4)] + ) + else: + degree = [] + for lm in joints[line[0]].limits: + if lm[0] != lm[1]: + degree.append(float(line[line_idx])) + line_idx += 1 + else: + degree.append(0) + joints[line[0]].degree = np.deg2rad(np.array(degree).squeeze()) + pose_data = [] + set_rotation(joints["root"]) + for key in joints.keys(): + if joints[key].matrix is None: + pose_data.append(constants.eye_T()) + else: + pose_data.append( + conversions.Rp2T( + joints[key].matrix.squeeze(), + joints[key].coordinate.squeeze(), + ) + ) + + fps = 60 + motion.add_one_frame(pose_data) + frame += 1 + return motion + + +def load(file, motion=None, scale=1.0, load_skel=True, load_motion=True): + if load_skel: + tmp_joints = parse_asf(file) + + # convert format + joints = [] + parent_joints = [] + for k, v in tmp_joints.items(): + joint = motion_class.Joint(name=k) + if v.parent_joint is None: + joint.info["dof"] = 6 + parent_joint = None + joint.xform_from_parent_joint = conversions.p2T(np.zeros(3)) + else: + joint.info["dof"] = 3 + parent_joint = v.parent_joint + joint.xform_from_parent_joint = conversions.p2T( + parent_joint.direction.squeeze() * parent_joint.length + ) + joints.append(joint) + parent_joints.append(parent_joint) + + skel = motion_class.Skeleton() + for i in range(len(joints)): + skel.add_joint(joints[i], parent_joints[i]) + + if load_motion: + return parse_amc(motion, tmp_joints, skel) + return skel + raise NotImplementedError + + +def save(motion, filename, scale=1.0): + raise NotImplementedError("Using bvh.save() is recommended") diff --git a/src/fairmotion/fairmotion/data/bvh.py b/src/fairmotion/fairmotion/data/bvh.py new file mode 100644 index 0000000000000000000000000000000000000000..651f578714f7049ed06ccacfe8ecd9a86e0bc754 --- /dev/null +++ b/src/fairmotion/fairmotion/data/bvh.py @@ -0,0 +1,403 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np +import os +from fairmotion.core import motion as motion_classes +from fairmotion.core.velocity import MotionWithVelocity +from fairmotion.utils import constants, utils +from fairmotion.ops import conversions +from fairmotion.utils.contact_utils import get_foot_indices, get_foot_contact_ratio + + +def load( + file, + motion=None, + scale=1.0, + load_skel=True, + load_motion=True, + load_velocity=False, + v_up_skel=np.array([0.0, 1.0, 0.0]), + v_face_skel=np.array([0.0, 0.0, 1.0]), + v_up_env=np.array([0.0, 1.0, 0.0]), + ignore_root_skel=True, # SM) + ee_as_joint=True, # SM) +): + if not motion: + motion = motion_classes.Motion() + words = None + with open(file, "rb") as f: + words = [word.decode() for line in f for word in line.split()] + f.close() + assert words is not None and len(words) > 0 + motion.name = os.path.normpath(file) + cnt = 0 + total_depth = 0 + joint_stack = [None, None] + joint_list = [] + parent_joint_list = [] + + if load_skel: + assert motion.skel is None + motion.skel = motion_classes.Skeleton( + v_up=v_up_skel, v_face=v_face_skel, v_up_env=v_up_env, + ) + + if load_skel: + end_extra_link = False + while cnt < len(words): + # joint_prev = joint_stack[-2] + joint_cur = joint_stack[-1] + word = words[cnt].lower() + if word == "root" or word == "joint": + parent_joint_list.append(joint_cur) + name = words[cnt + 1] + joint = motion_classes.Joint(name=name) + joint_stack.append(joint) + joint_list.append(joint) + cnt += 2 + elif word == "offset": + x, y, z = ( + float(words[cnt + 1]), + float(words[cnt + 2]), + float(words[cnt + 3]), + ) + T1 = conversions.p2T(scale * np.array([x, y, z])) + joint_cur.xform_from_parent_joint = T1 + + # SM) + if len(joint_list) == 1 and ignore_root_skel: + x, y, z= (0.0, 0.0, 0.0) + T1 = conversions.p2T(scale * np.array([x, y, z])) + joint_cur.xform_from_parent_joint = T1 + + if end_extra_link and (not ee_as_joint): + parent_extra.add_extra_links(parent_extra.name+"_End", T1) + end_extra_link = False + + + cnt += 4 + elif word == "channels": + ndofs = int(words[cnt + 1]) + if ndofs == 6: + joint_cur.info["type"] = "free" + elif ndofs == 3: + joint_cur.info["type"] = "ball" + elif ndofs == 1: + joint_cur.info["type"] = "revolute" + else: + raise Exception("Undefined") + joint_cur.info["dof"] = ndofs + joint_cur.info["bvh_channels"] = [] + for i in range(ndofs): + joint_cur.info["bvh_channels"].append( + words[cnt + 2 + i].lower() + ) + cnt += ndofs + 2 + elif word == "end": + # SM) + if ee_as_joint: + parent_joint_list.append(joint_cur) + joint = motion_classes.Joint(name=joint_cur.name+'_End') + joint.info["dof"] = 0 + joint.info["bvh_channels"] = [] + joint_stack.append(joint) + joint_list.append(joint) + + else: + parent_extra = joint_cur + joint_dummy = motion_classes.Joint(name=joint_cur.name+"_End") + end_extra_link = True + joint_stack.append(joint_dummy) + # joint_dummy = motion_classes.Joint(name="END") + # joint_stack.append(joint_dummy) + cnt += 2 + elif word == "{": + total_depth += 1 + cnt += 1 + elif word == "}": + joint_stack.pop() + total_depth -= 1 + cnt += 1 + if total_depth == 0: + for i in range(len(joint_list)): + motion.skel.add_joint( + joint_list[i], parent_joint_list[i], + ) + break + elif word == "hierarchy": + cnt += 1 + else: + raise Exception(f"Unknown Token {word} at token {cnt}") + + if load_motion: + assert motion.skel is not None + assert np.allclose(motion.skel.v_up, v_up_skel) + assert np.allclose(motion.skel.v_face, v_face_skel) + assert np.allclose(motion.skel.v_up_env, v_up_env) + while cnt < len(words): + word = words[cnt].lower() + if word == "motion": + num_frames = int(words[cnt + 2]) + dt = float(words[cnt + 5]) + motion.set_fps(round(1 / dt)) + cnt += 6 + t = 0.0 + range_num_dofs = range(motion.skel.num_dofs) + positions = np.zeros( + (num_frames, motion.skel.num_joints(), 3, 3) + ) + rotations = np.zeros((num_frames, motion.skel.num_joints(), 3)) + T = np.zeros((num_frames, motion.skel.num_joints(), 4, 4)) + T[...] = constants.eye_T() + position_channels = { + "xposition": 0, + "yposition": 1, + "zposition": 2, + } + rotation_channels = { + "xrotation": 0, + "yrotation": 1, + "zrotation": 2, + } + for frame_idx in range(num_frames): + # if frame_idx == 1: + # break + raw_values = [ + float(words[cnt + j]) for j in range_num_dofs + ] + cnt += motion.skel.num_dofs + cnt_channel = 0 + for joint_idx, joint in enumerate(motion.skel.joints): + for channel in joint.info["bvh_channels"]: + value = raw_values[cnt_channel] + if channel in position_channels: + value = scale * value + positions[frame_idx][joint_idx][ + position_channels[channel] + ][position_channels[channel]] = value + elif channel in rotation_channels: + value = conversions.deg2rad(value) + rotations[frame_idx][joint_idx][ + rotation_channels[channel] + ] = value + else: + raise Exception("Unknown Channel") + cnt_channel += 1 + + for joint_idx, joint in enumerate(motion.skel.joints): + for channel in joint.info["bvh_channels"]: + if channel in position_channels: + T[:, joint_idx] = T[:, joint_idx] @ conversions.p2T( + positions[ + :, + joint_idx, + position_channels[channel], + :, + ] + ) + elif channel == "xrotation": + T[:, joint_idx] = T[:, joint_idx] @ conversions.R2T( + conversions.Ax2R( + rotations[ + :, + joint_idx, + rotation_channels[channel], + ] + ) + ) + elif channel == "yrotation": + T[:, joint_idx] = T[:, joint_idx] @ conversions.R2T( + conversions.Ay2R( + rotations[ + :, + joint_idx, + rotation_channels[channel], + ] + ) + ) + elif channel == "zrotation": + T[:, joint_idx] = T[:, joint_idx] @ conversions.R2T( + conversions.Az2R( + rotations[ + :, + joint_idx, + rotation_channels[channel], + ] + ) + ) + + for i in range(num_frames): + motion.add_one_frame(list(T[i])) + t += dt + else: + cnt += 1 + if load_velocity: + motion = MotionWithVelocity.from_motion(motion) + assert motion.num_frames() > 0 + + ### ad-hoc remove prefix from 'prefix:joint_name' (e.g. mixamorig:Spine) + for ji, joint in enumerate(motion.skel.joints): + if ':' in joint.name: + motion.skel.change_joint_name(ji, joint.name.split(':')[-1]) + + return motion + + +def _write_hierarchy(motion, file, joint, scale=1.0, rot_order="XYZ", tab=""): + def rot_order_to_str(order): + if order == "xyz" or order == "XYZ": + return "Xrotation Yrotation Zrotation" + elif order == "zyx" or order == "ZYX": + return "Zrotation Yrotation Xrotation" + elif order == "zxy" or order == "ZXY": # SM) + return "Zrotation Xrotation Yrotation" + else: + raise NotImplementedError + + joint_order = [joint.name] + is_root_joint = joint.parent_joint is None + if is_root_joint: + file.write(tab + "ROOT %s\n" % joint.name) + else: + file.write(tab + "JOINT %s\n" % joint.name) + file.write(tab + "{\n") + R, p = conversions.T2Rp(joint.xform_from_parent_joint) + p *= scale + file.write(tab + "\tOFFSET %f %f %f\n" % (p[0], p[1], p[2])) + if is_root_joint: + file.write( + tab + + "\tCHANNELS 6 Xposition Yposition Zposition %s\n" + % rot_order_to_str(rot_order) + ) + else: + file.write(tab + "\tCHANNELS 3 %s\n" % rot_order_to_str(rot_order)) + for child_joint in joint.child_joints: + child_joint_order = _write_hierarchy( + motion, file, child_joint, scale, rot_order, tab + "\t" + ) + joint_order.extend(child_joint_order) + if len(joint.child_joints) == 0: + file.write(tab + "\tEnd Site\n") + file.write(tab + "\t{\n") + file.write(tab + "\t\tOFFSET %f %f %f\n" % (0.0, 0.0, 0.0)) + file.write(tab + "\t}\n") + file.write(tab + "}\n") + return joint_order + + +def save(motion, filename, scale=1.0, rot_order="XYZ", verbose=False, ee_as_joint=True, root_motion_local=False): + if verbose: + print(" > > Save BVH file: %s" % filename) + with open(filename, "w") as f: + """ Write hierarchy """ + if verbose: + print(" > > > > Write BVH hierarchy") + f.write("HIERARCHY\n") + if ee_as_joint: # SM) + joint_order = _write_hierarchy_ee_as_joint( + motion, f, motion.skel.root_joint, scale, rot_order + ) + else: + joint_order = _write_hierarchy( + motion, f, motion.skel.root_joint, scale, rot_order + ) + """ Write data """ + if verbose: + print(" > > > > Write BVH data") + t_start = 0 + dt = 1.0 / motion.fps + num_frames = motion.num_frames() + f.write("MOTION\n") + f.write("Frames: %d\n" % num_frames) + f.write("Frame Time: %f\n" % dt) + t = t_start + + for i in range(num_frames): + if verbose and i % motion.fps == 0: + print( + "\r > > > > %d/%d processed (%d FPS)" + % (i + 1, num_frames, motion.fps), + end=" ", + ) + pose = motion.get_pose_by_frame(i) + + for joint_name in joint_order: + joint = motion.skel.get_joint(joint_name) + if joint == motion.skel.root_joint: + R, p = conversions.T2Rp(pose.get_transform(joint, local=root_motion_local)) + p *= scale + R1, R2, R3 = conversions.R2E(R, order=rot_order, degrees=True) + f.write( + "%f %f %f %f %f %f " % (p[0], p[1], p[2], R1, R2, R3) + ) + elif joint.info["dof"] == 0: + continue + else: + R, p = conversions.T2Rp(pose.get_transform(joint, local=True)) + p *= scale + R1, R2, R3 = conversions.R2E(R, order=rot_order, degrees=True) + f.write("%f %f %f " % (R1, R2, R3)) + f.write("\n") + t += dt + if verbose and i == num_frames - 1: + print( + "\r > > > > %d/%d processed (%d FPS)" + % (i + 1, num_frames, motion.fps) + ) + f.close() + + +def load_parallel(files, cpus=20, **kwargs): + return utils.run_parallel(load, files, num_cpus=cpus, **kwargs) + + +# SM) +def _write_hierarchy_ee_as_joint(motion, file, joint, scale=1.0, rot_order="XYZ", tab=""): + def rot_order_to_str(order): + if order == "xyz" or order == "XYZ": + return "Xrotation Yrotation Zrotation" + elif order == "zyx" or order == "ZYX": + return "Zrotation Yrotation Xrotation" + elif order == "zxy" or order == "ZXY": #SM + return "Zrotation Xrotation Yrotation" + else: + raise NotImplementedError + + # print(joint.name, joint.info['dof']) + if joint.info["dof"] == 0: + file.write(tab + "End Site\n") + file.write(tab + "{\n") + R, p = conversions.T2Rp(joint.xform_from_parent_joint) + p *= scale + file.write(tab + "\tOFFSET %f %f %f\n" % (p[0], p[1], p[2])) + file.write(tab + "}\n") + return [] + + joint_order = [joint.name] + is_root_joint = joint.parent_joint is None + if is_root_joint: + file.write(tab + "ROOT %s\n" % joint.name) + else: + file.write(tab + "JOINT %s\n" % joint.name) + + file.write(tab + "{\n") + R, p = conversions.T2Rp(joint.xform_from_parent_joint) + p *= scale + file.write(tab + "\tOFFSET %f %f %f\n" % (p[0], p[1], p[2])) + if is_root_joint: + file.write( + tab + + "\tCHANNELS 6 Xposition Yposition Zposition %s\n" + % rot_order_to_str(rot_order) + ) + else: + file.write(tab + "\tCHANNELS 3 %s\n" % rot_order_to_str(rot_order)) + for child_joint in joint.child_joints: + child_joint_order = _write_hierarchy_ee_as_joint( + motion, file, child_joint, scale, rot_order, tab + "\t" + ) + joint_order.extend(child_joint_order) + file.write(tab + "}\n") + return joint_order + diff --git a/src/fairmotion/fairmotion/data/frankmocap.py b/src/fairmotion/fairmotion/data/frankmocap.py new file mode 100644 index 0000000000000000000000000000000000000000..0d1a7a59f6cdaa63fd8fc2d8ddacfb8681213688 --- /dev/null +++ b/src/fairmotion/fairmotion/data/frankmocap.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np +import pickle +import torch + +from fairmotion.data import amass +from fairmotion.core import motion as motion_classes +from fairmotion.utils import constants, utils +from fairmotion.ops import conversions + + +def load( + file, + motion=None, + bm_path=None, + motion_key=None, + scale=1.0, + load_skel=True, + load_motion=True, + v_up_skel=np.array([0.0, 1.0, 0.0]), + v_face_skel=np.array([0.0, 0.0, 1.0]), + v_up_env=np.array([0.0, 1.0, 0.0]), +): + all_data = pickle.load(open(file, "rb")) + if motion_key is None: + motion_key = list(all_data.keys())[0] + motion_data = all_data[motion_key] + bm = amass.load_body_model(bm_path) + betas = torch.Tensor(np.array(motion_data[0]["parm_shape"])[:][np.newaxis]).to("cpu") + num_joints = len(amass.joint_names) + skel = amass.create_skeleton_from_amass_bodymodel(bm, betas, len(amass.joint_names), amass.joint_names) + joint_names = [j.name for j in skel.joints] + + num_frames = len(motion_data) + T = np.random.rand(num_frames, num_joints, 4, 4) + T[:] = constants.EYE_T + for i in range(num_frames): + for j in range(num_joints): + T[i][joint_names.index(amass.joint_names[j])] = conversions.R2T(np.array(motion_data[i]['parm_pose'])[j]) + motion = motion_classes.Motion.from_matrix(T, skel) + motion.set_fps(30) + return motion \ No newline at end of file diff --git a/src/fairmotion/fairmotion/models/__init__.py b/src/fairmotion/fairmotion/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9020c2df23e2af280b7bb168b996ae9eaf312eb8 --- /dev/null +++ b/src/fairmotion/fairmotion/models/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. diff --git a/src/fairmotion/fairmotion/models/decoders.py b/src/fairmotion/fairmotion/models/decoders.py new file mode 100644 index 0000000000000000000000000000000000000000..92fe77fee4fe6bbd2e9999ee0875d71cd08c6f12 --- /dev/null +++ b/src/fairmotion/fairmotion/models/decoders.py @@ -0,0 +1,159 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import torch +import torch.nn as nn +import torch.nn.functional as F +import random + + +class DecoderStep(nn.Module): + def __init__(self, input_dim, output_dim, hidden_dim, lstm=None): + super(DecoderStep, self).__init__() + self.lstm = ( + nn.LSTM(input_size=input_dim, hidden_size=hidden_dim) + if not lstm + else lstm + ) + self.out = nn.Linear(hidden_dim, output_dim) + + def forward(self, input, hidden=None, cell=None, encoder_outputs=None): + if (hidden is None) and (cell is None): + output, (hidden, cell) = self.lstm(input) + else: + output, (hidden, cell) = self.lstm(input, (hidden, cell)) + output = output.squeeze(0) + output = self.out(output) + return output, hidden, cell + + +class LSTMDecoder(nn.Module): + """Decoder to generate sequences using LSTM cells. Decoding is done in a + greedy manner without attention mechanism. + + Attributes: + input_dim: Size of input vector + output_dim: Size of output to be generated at each time step + hidden_dim: Size of hidden state vector + device: Optional; Device to be used "cuda" or "cpu" + lstm: Optional; If provided, the lstm cell will be used in the decoder. + This is useful for sharing lstm parameters from encoder. + """ + + def __init__( + self, input_dim, output_dim, hidden_dim, device="cuda", lstm=None + ): + super(LSTMDecoder, self).__init__() + self.input_dim = input_dim + self.decoder_step = DecoderStep( + input_dim=input_dim, + output_dim=output_dim, + hidden_dim=hidden_dim, + lstm=lstm, + ) + self.device = device + + def forward( + self, + tgt, + hidden=None, + cell=None, + max_len=None, + teacher_forcing_ratio=0.5, + ): + """ + Inputs: + tgt: Target sequence provided as input to the decoder. During + training, provide reference target sequence. For inference, + provide only last frame of source. + Expected shape: (seq_len, batch_size, input_dim) + hidden, cell: Hidden state and cell state to be used in LSTM cell + max_len: Optional; Length of sequence to be generated. By default, + the decoder generates sequence with same length as `tgt` + (training). + teacher_forcing_ratio: Probability of feeding gold target pose as + decoder input instead of predicted pose from previous time step + """ + tgt = tgt.transpose(0, 1) + max_len = max_len if max_len is not None else tgt.shape[0] + batch_size = tgt.shape[1] + + input = tgt[0, :] + outputs = torch.zeros(max_len, batch_size, self.input_dim,).to( + self.device + ) + for t in range(max_len): + input = input.unsqueeze(0) + output, hidden, cell = self.decoder_step(input, hidden, cell) + outputs[t] = output + teacher_force = random.random() < teacher_forcing_ratio + input = tgt[t] if teacher_force else output + + outputs = outputs.transpose(0, 1) + return outputs + + +class DecoderStepWithAttention(nn.Module): + def __init__( + self, input_dim, output_dim, hidden_dim, source_length, device="cuda", + ): + super(DecoderStepWithAttention, self).__init__() + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.output_dim = output_dim + self.source_length = source_length + self.device = device + + self.attn = nn.Linear( + self.hidden_dim + self.input_dim, self.source_length, + ) + self.attn_combine = nn.Linear( + self.hidden_dim + self.input_dim, self.input_dim, + ) + self.lstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_dim) + self.out = nn.Linear(self.hidden_dim, self.output_dim) + + def forward(self, input, hidden, cell, encoder_outputs): + attn_weights = F.softmax( + self.attn(torch.cat((input, hidden), 2)), dim=2, + ) + attn_applied = torch.bmm(attn_weights.transpose(0, 1), encoder_outputs) + + output = torch.cat((input, attn_applied.transpose(0, 1)), 2) + output = self.attn_combine(output) + output = F.relu(output) + + if (hidden is None) and (cell is None): + output, (hidden, cell) = self.lstm(output) + else: + output, (hidden, cell) = self.lstm(output, (hidden, cell)) + output = output.squeeze(0) + output = self.out(output) + return output, hidden, cell + + +class LSTMDecoderWithAttention(LSTMDecoder): + def __init__( + self, + input_dim, + output_dim, + max_source_length, + hidden_dim=128, + device="cuda", + ): + """Extension of LSTMDecoder that uses attention mechanism to generate + sequences. + + Attributes: + input_dim: Size of input vector + output_dim: Size of output to be generated at each time step + max_source_length: Length of source sequence + hidden_dim: Size of hidden state vector + device: Optional; Device to be used "cuda" or "cpu" + """ + super(LSTMDecoderWithAttention, self).__init__( + input_dim, output_dim, hidden_dim, device + ) + self.decoder_step = DecoderStepWithAttention( + input_dim, output_dim, hidden_dim, max_source_length + ) + self.device = device diff --git a/src/fairmotion/fairmotion/models/encoders.py b/src/fairmotion/fairmotion/models/encoders.py new file mode 100644 index 0000000000000000000000000000000000000000..3a9c62648ee96b1abf566252e453f749a9304165 --- /dev/null +++ b/src/fairmotion/fairmotion/models/encoders.py @@ -0,0 +1,38 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import torch.nn as nn + + +class LSTMEncoder(nn.Module): + def __init__( + self, input_dim=None, hidden_dim=1024, num_layers=1, lstm=None, + ): + """LSTMEncoder encodes input vector using LSTM cells. + + Attributes: + input_dim: Size of input vector + hidden_dim: Size of hidden state vector + num_layers: Number of layers of LSTM units + lstm: Optional; If provided, the lstm cell will be used in the + encoder. This is useful for sharing lstm parameters with + decoder. + """ + super(LSTMEncoder, self).__init__() + self.lstm = lstm + if not lstm: + assert input_dim is not None + self.lstm = nn.LSTM( + input_size=input_dim, + hidden_size=hidden_dim, + num_layers=num_layers, + ) + + def forward(self, input): + """ + Input: + input: Input vector to be encoded. + Expected shape is (batch_size, seq_len, input_dim) + """ + input = input.transpose(0, 1) + outputs, (lstm_hidden, lstm_cell) = self.lstm(input) + return lstm_hidden, lstm_cell, outputs.transpose(0, 1) diff --git a/src/fairmotion/fairmotion/models/optimizer.py b/src/fairmotion/fairmotion/models/optimizer.py new file mode 100644 index 0000000000000000000000000000000000000000..bfdd790bd7aeec4db34d9f0853fbde4776575d17 --- /dev/null +++ b/src/fairmotion/fairmotion/models/optimizer.py @@ -0,0 +1,75 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import torch +import torch.optim as optim + + +class Opt: + def __init__(self): + pass + + def step(self): + pass + + def rate(self): + pass + + def epoch_step(self, **kwargs): + pass + + +class NoamOpt(Opt): + "Optim wrapper that implements rate." + + def __init__(self, model, model_size=512, factor=2, warmup=4000): + self._step = 0 + self.warmup = warmup + self.factor = factor + self.model_size = model_size + self._rate = 0 + self.optimizer = torch.optim.Adam( + model.parameters(), lr=0, betas=(0.9, 0.98), eps=1e-9 + ) + + def step(self): + "Update parameters and rate" + self._step += 1 + rate = self.rate() + for p in self.optimizer.param_groups: + p["lr"] = rate + self._rate = rate + self.optimizer.step() + + def rate(self, step=None): + "Implement `lrate` above" + if step is None: + step = self._step + return self.factor * ( + self.model_size ** (-0.5) + * min(step ** (-0.5), step * self.warmup ** (-1.5)) + ) + + +class SGDOpt(Opt): + def __init__(self, model, lr=0.1): + self.optimizer = optim.SGD(model.parameters(), lr=lr) + self.scheduler = optim.lr_scheduler.ReduceLROnPlateau( + self.optimizer, "min", factor=0.5, patience=5 + ) + self.model = model + + def step(self): + self.optimizer.step() + # TODO: Without clipping/Manually look at gradient values + torch.nn.utils.clip_grad_norm_(self.model.parameters(), 1) + + def epoch_step(self, val_loss): + self.scheduler.step(val_loss) + + +class AdamOpt(Opt): + def __init__(self, model, lr=0.0001): + self.optimizer = optim.Adam(model.parameters(), lr=lr) + + def step(self): + self.optimizer.step() diff --git a/src/fairmotion/fairmotion/models/rnn.py b/src/fairmotion/fairmotion/models/rnn.py new file mode 100644 index 0000000000000000000000000000000000000000..36cc7676da66b82167a4bb837df7a7928d20b8ef --- /dev/null +++ b/src/fairmotion/fairmotion/models/rnn.py @@ -0,0 +1,119 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import random +import torch +import torch.nn as nn + + +class RNN(nn.Module): + """RNN model for sequence prediction. The model uses a single RNN module to + take an input pose, and generates a pose prediction for the next time step. + + Attributes: + input_dim: Size of input vector for each time step + hidden_dim: RNN hidden size + num_layers: Number of layers of RNN cells + dropout: Probability of an element to be zeroed + device: Device on which to run the RNN module + """ + + def __init__( + self, + input_dim, + hidden_dim=1024, + num_layers=1, + dropout=0.1, + device="cpu", + ): + super(RNN, self).__init__() + self.dropout = nn.Dropout(p=dropout) + self.lstm = nn.LSTM( + input_size=input_dim, + hidden_size=hidden_dim, + num_layers=num_layers, + ) + self.project_to_output = nn.Linear(hidden_dim, input_dim) + + def init_weights(self): + for name, param in self.named_parameters(): + nn.init.uniform_(param.data, -0.08, 0.08) + + def run_lstm( + self, + inputs, + outputs, + max_len=None, + state=None, + teacher_forcing_ratio=0, + ): + output = torch.zeros(inputs[0].shape).unsqueeze(0) + if max_len is None: + max_len = inputs.shape[0] + else: + teacher_forcing_ratio = 0 + + for t in range(max_len): + if t >= inputs.shape[0]: + input = output.unsqueeze(0) + else: + input = inputs[t].unsqueeze(0) + teacher_force = random.random() < teacher_forcing_ratio + if t > 0 and not teacher_force: + input = output.unsqueeze(0) + output, state = self.lstm(input, state) + output = self.project_to_output(output) + output = output.squeeze(0) + outputs[t] = output + return outputs, state + + def forward(self, src, tgt, max_len=None, teacher_forcing_ratio=0.5): + """ + Inputs: + src, tgt: Tensors of shape (batch_size, seq_len, input_dim) + max_len: Maximum length of sequence to be generated during + inference. Set None during training. + teacher_forcing_ratio: Probability of feeding gold target pose as + decoder input instead of predicted pose from previous time step + """ + # convert src, tgt to (seq_len, batch_size, input_dim) format + src = src.transpose(0, 1) + tgt = tgt.transpose(0, 1) + + lstm_input = self.dropout(src) + state = None + # Generate as many poses as in tgt during training + max_len = tgt.shape[0] if max_len is None else max_len + encoder_outputs = torch.zeros(src.shape).to(src.device) + _, state = self.run_lstm( + lstm_input, + encoder_outputs, + state=None, + teacher_forcing_ratio=teacher_forcing_ratio, + ) + + if self.training: + decoder_outputs = torch.zeros( + max_len - 1, src.shape[1], src.shape[2] + ).to(src.device) + tgt = self.dropout(tgt) + decoder_outputs, _ = self.run_lstm( + tgt[:-1], + decoder_outputs, + state=state, + teacher_forcing_ratio=teacher_forcing_ratio, + ) + outputs = torch.cat((encoder_outputs, decoder_outputs)) + else: + del encoder_outputs + outputs = torch.zeros(max_len, src.shape[1], src.shape[2]).to( + src.device + ) + inputs = lstm_input[-1].unsqueeze(0) + outputs, _ = self.run_lstm( + inputs, + outputs, + state=state, + max_len=max_len, + teacher_forcing_ratio=0, + ) + return outputs.transpose(0, 1) diff --git a/src/fairmotion/fairmotion/models/seq2seq.py b/src/fairmotion/fairmotion/models/seq2seq.py new file mode 100644 index 0000000000000000000000000000000000000000..4dbfb4b8dbe8bde18016c364881388bc44e8663a --- /dev/null +++ b/src/fairmotion/fairmotion/models/seq2seq.py @@ -0,0 +1,85 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import torch.nn as nn +from fairmotion.models import decoders, encoders + + +class Seq2Seq(nn.Module): + """Seq2Seq model for sequence generation. The interface takes predefined + encoder and decoder as input. + + Attributes: + encoder: Pre-built encoder + decoder: Pre-built decoder + """ + + def __init__(self, encoder, decoder): + super(Seq2Seq, self).__init__() + self.encoder = encoder + self.decoder = decoder + + def init_weights(self): + for name, param in self.named_parameters(): + nn.init.uniform_(param.data, -0.08, 0.08) + + def forward(self, src, tgt, max_len=None, teacher_forcing_ratio=0.5): + """ + Inputs: + src: Source sequence provided as input to the encoder. + Expected shape: (batch_size, seq_len, input_dim) + tgt: Target sequence provided as input to the decoder. During + training, provide reference target sequence. For inference, + provide only last frame of source. + Expected shape: (batch_size, seq_len, input_dim) + max_len: Optional; Length of sequence to be generated. By default, + the decoder generates sequence with same length as `tgt` + (training). + teacher_forcing_ratio: Probability of feeding gold target pose as + decoder input instead of predicted pose from previous time step + """ + hidden, cell, outputs = self.encoder(src) + outputs = self.decoder( + tgt, hidden, cell, max_len, teacher_forcing_ratio, + ) + return outputs + + +class TiedSeq2Seq(nn.Module): + """Seq2Seq model that uses the same LSTM unit in the encoder and decoder. + The shared LSTM is created inside this class. + + Attributes: + input_dim: Size of input vector + hidden_dim: Size of hidden state vector + num_layers: Number of layers in the shared LSTM unit + device: Optional; Device to be used "cuda" or "cpu" + """ + + def __init__(self, input_dim, hidden_dim, num_layers, device): + super(TiedSeq2Seq, self).__init__() + tied_lstm = nn.LSTM( + input_size=input_dim, + hidden_size=hidden_dim, + num_layers=num_layers, + ).to(device) + self.encoder = encoders.LSTMEncoder( + input_dim=input_dim, lstm=tied_lstm + ).to(device) + self.decoder = decoders.LSTMDecoder( + input_dim=input_dim, + hidden_dim=hidden_dim, + output_dim=input_dim, + device=device, + lstm=tied_lstm, + ).to(device) + + def init_weights(self): + for name, param in self.named_parameters(): + nn.init.uniform_(param.data, -0.08, 0.08) + + def forward(self, src, tgt, max_len=None, teacher_forcing_ratio=0.5): + hidden, cell, outputs = self.encoder(src) + outputs = self.decoder( + tgt, hidden, cell, outputs, max_len, teacher_forcing_ratio, + ) + return outputs diff --git a/src/fairmotion/fairmotion/models/transformer.py b/src/fairmotion/fairmotion/models/transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..e78504ac8549ce976b55d122784e13033af4915f --- /dev/null +++ b/src/fairmotion/fairmotion/models/transformer.py @@ -0,0 +1,187 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np +import torch +import torch.nn as nn +from torch.nn import LayerNorm +from torch.nn import TransformerEncoder, TransformerEncoderLayer +from torch.nn import TransformerDecoder, TransformerDecoderLayer +from torch.nn.init import xavier_uniform_ + +from fairmotion.models import decoders + + +class PositionalEncoding(nn.Module): + def __init__(self, d_model, dropout=0.5, max_len=5000): + super(PositionalEncoding, self).__init__() + self.dropout = nn.Dropout(p=dropout) + + pe = torch.zeros(max_len, d_model) + position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) + div_term = torch.exp( + torch.arange(0, d_model, 2).float() * (-np.log(10000.0) / d_model) + ) + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + pe = pe.unsqueeze(0).transpose(0, 1) + self.register_buffer("pe", pe) + + def forward(self, x): + x = x + self.pe[: x.size(0), :] + return self.dropout(x) + + +class TransformerLSTMModel(nn.Module): + def __init__( + self, ntoken, ninp, num_heads, hidden_dim, num_layers, dropout=0.5 + ): + super(TransformerLSTMModel, self).__init__() + self.pos_encoder = PositionalEncoding(ninp, dropout) + encoder_layers = TransformerEncoderLayer( + ninp, num_heads, hidden_dim, dropout + ) + self.transformer_encoder = TransformerEncoder( + encoder_layers, num_layers + ) + # Use Linear instead of Embedding for continuous valued input + self.encoder = nn.Linear(ntoken, ninp) + self.ninp = ninp + self.decoder = decoders.LSTMDecoder( + input_dim=ntoken, hidden_dim=hidden_dim, output_dim=ntoken, + ) + self.num_layers = num_layers + + self.init_weights() + + def _generate_square_subsequent_mask(self, sz): + mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1) + mask = ( + mask.float() + .masked_fill(mask == 0, float("-inf")) + .masked_fill(mask == 1, float(0.0)) + ) + return mask + + def init_weights(self): + initrange = 0.1 + self.encoder.weight.data.uniform_(-initrange, initrange) + for name, param in self.decoder.named_parameters(): + nn.init.uniform_(param.data, -0.08, 0.08) + + def forward(self, src, tgt, max_len=None, teacher_forcing_ratio=None): + src = self.encoder(src) * np.sqrt(self.ninp) + src = self.pos_encoder(src) + output = self.transformer_encoder(src, mask=None) + final_encoder_state = output[:, -1].unsqueeze(0).contiguous() + output = self.decoder( + tgt, + hidden=final_encoder_state, + cell=final_encoder_state, + max_len=max_len, + teacher_forcing_ratio=teacher_forcing_ratio, + ) + return output + + +class TransformerModel(nn.Module): + def __init__( + self, ntoken, ninp, num_heads, hidden_dim, num_layers, dropout=0.5 + ): + super(TransformerModel, self).__init__() + self.model_type = "Transformer" + self.src_mask = None + + self.pos_encoder = PositionalEncoding(ninp, dropout) + encoder_layer = TransformerEncoderLayer( + ninp, num_heads, hidden_dim, dropout + ) + self.transformer_encoder = TransformerEncoder( + encoder_layer=encoder_layer, + num_layers=num_layers, + norm=LayerNorm(ninp), + ) + decoder_layer = TransformerDecoderLayer( + ninp, num_heads, hidden_dim, dropout + ) + self.transformer_decoder = TransformerDecoder( + decoder_layer=decoder_layer, + num_layers=num_layers, + norm=LayerNorm(ninp), + ) + + # Use Linear instead of Embedding for continuous valued input + self.encoder = nn.Linear(ntoken, ninp) + self.project = nn.Linear(ninp, ntoken) + self.ninp = ninp + + self.init_weights() + + def _generate_square_subsequent_mask(self, sz): + mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1) + mask = ( + mask.float() + .masked_fill(mask == 0, float("-inf")) + .masked_fill(mask == 1, float(0.0)) + ) + return mask + + def init_weights(self): + """Initiate parameters in the transformer model.""" + for p in self.parameters(): + if p.dim() > 1: + xavier_uniform_(p) + + def forward(self, src, tgt, max_len=None, teacher_forcing_ratio=None): + # Transformer expects src and tgt in format (len, batch_size, dim) + src = src.transpose(0, 1) + tgt = tgt.transpose(0, 1) + + # src and tgt are now (T, B, E) + if max_len is None: + max_len = tgt.shape[0] + + projected_src = self.encoder(src) * np.sqrt(self.ninp) + pos_encoded_src = self.pos_encoder(projected_src) + encoder_output = self.transformer_encoder(pos_encoded_src) + + if self.training: + + # Create mask for training + tgt_mask = self._generate_square_subsequent_mask(tgt.shape[0]).to( + device=tgt.device, + ) + + # Use last source pose as first input to decoder + tgt = torch.cat((src[-1].unsqueeze(0), tgt[:-1])) + pos_encoder_tgt = self.pos_encoder( + self.encoder(tgt) * np.sqrt(self.ninp) + ) + output = self.transformer_decoder( + pos_encoder_tgt, encoder_output, tgt_mask=tgt_mask, + ) + output = self.project(output) + else: + # greedy decoding + decoder_input = torch.zeros( + max_len, src.shape[1], src.shape[-1], + ).type_as(src.data) + next_pose = tgt[0].clone() + + # Create mask for greedy encoding across the decoded output + tgt_mask = self._generate_square_subsequent_mask(max_len).to( + device=tgt.device + ) + + for i in range(max_len): + decoder_input[i] = next_pose + pos_encoded_input = self.pos_encoder( + self.encoder(decoder_input) * np.sqrt(self.ninp) + ) + decoder_outputs = self.transformer_decoder( + pos_encoded_input, encoder_output, tgt_mask=tgt_mask, + ) + output = self.project(decoder_outputs) + next_pose = output[i].clone() + del output + output = decoder_input + return output.transpose(0, 1) diff --git a/src/fairmotion/fairmotion/ops/__init__.py b/src/fairmotion/fairmotion/ops/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9020c2df23e2af280b7bb168b996ae9eaf312eb8 --- /dev/null +++ b/src/fairmotion/fairmotion/ops/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. diff --git a/src/fairmotion/fairmotion/ops/conversions.py b/src/fairmotion/fairmotion/ops/conversions.py new file mode 100644 index 0000000000000000000000000000000000000000..8620139337bfb01ee21bfa3a59577f20509f79a8 --- /dev/null +++ b/src/fairmotion/fairmotion/ops/conversions.py @@ -0,0 +1,401 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np + +from fairmotion.utils import constants, utils +from scipy.spatial.transform import Rotation + +import warnings + +""" +Glossary: +p: position (3,) +rad: radians +deg: degrees +A: Axis angle (3,) +E: Euler angle (3,) +Q: Quaternion (4,) +R: Rotation matrix (3,3) +T: Transition matrix (4,4) + +Quaternion uses the xyzw order +Rotation matrix matrix is column-wise +""" + +""" +TODO: +Euler Angle order correction for Test +""" + + +def batch_auto_reshape(x, fn, shape_in, shape_out): + reshape = x.ndim - len(shape_in) > 1 + xx = x.reshape(-1, *shape_in) if reshape else x + y = fn(xx) + return y.reshape(x.shape[: -len(shape_in)] + shape_out) if reshape else y + + +""" +Angle conversions +""" + + +def rad2deg(rad): + """Convert from radians to degrees.""" + return rad * 180.0 / np.pi + + +def deg2rad(deg): + """Convert from degrees to radians.""" + return deg * np.pi / 180.0 + + +""" +From A to other representations +""" + + +def A2A(A): + """ + The same 3D orientation could be represented by the two different + axis-angle representatons -- (axis, angle) and (-axis, 2pi - angle) where + we assume 0 <= angle <= pi. This method forces that the representation of + orientation strictly uses an angle between 0 and pi. + """ + + def a2a(a): + angle = np.linalg.norm(a) + if angle <= constants.EPSILON: + return a + if angle > 2 * np.pi: + angle = angle % 2 * np.pi + warnings.warn("!!!Angle is larger than 2PI!!!") + if angle > np.pi: + return (-a / angle) * (2 * np.pi - angle) + else: + return a + + return batch_auto_reshape( + A, + lambda x: utils._apply_fn_agnostic_to_vec_mat(x, a2a), + (3,), + (3,), + ) + + +def A2E(A, order="xyz", degrees=False): + return batch_auto_reshape( + A, + lambda x: Rotation.from_rotvec(x).as_euler(order, degrees=degrees), + (3,), + (3,), + ) + + +def A2Q(A): + return batch_auto_reshape( + A, + lambda x: Rotation.from_rotvec(x).as_quat(), + (3,), + (4,), + ) + + +def A2R(A): + return batch_auto_reshape( + A, + lambda x: Rotation.from_rotvec(x).as_matrix(), + (3,), + (3, 3), + ) + + +def A2T(A): + return batch_auto_reshape( + A, + lambda x: Rp2T(A2R(x), constants.zero_p()), + (3,), + (4, 4), + ) + + +def Ax2R(theta): + """ + Convert (axis) angle along x axis Ax to rotation matrix R + """ + if isinstance(theta, np.ndarray): + x = np.zeros((theta.shape + (3,))) + else: + x = np.zeros(3) + x[..., 0] = theta + return A2R(x) + + +def Ay2R(theta): + """ + Convert (axis) angle along y axis Ay to rotation matrix R + """ + if isinstance(theta, np.ndarray): + R = np.zeros(theta.shape + (3, 3)) + R[...] = constants.eye_R() + else: + R = constants.eye_R() + c = np.cos(theta) + s = np.sin(theta) + R[..., 0, 0] = c + R[..., 0, 2] = s + R[..., 2, 0] = -s + R[..., 2, 2] = c + return R + + +def Az2R(theta): + """ + Convert (axis) angle along z axis Az to rotation matrix R + """ + if isinstance(theta, np.ndarray): + R = np.zeros(theta.shape + (3, 3)) + R[...] = constants.eye_R() + else: + R = constants.eye_R() + c = np.cos(theta) + s = np.sin(theta) + R[..., 0, 0] = c + R[..., 0, 1] = -s + R[..., 1, 0] = s + R[..., 1, 1] = c + return R + + +""" +From R to other representations +""" + + +def R2A(R): + return batch_auto_reshape( + R, + lambda x: Rotation.from_matrix(x).as_rotvec(), + (3, 3), + (3,), + ) + + +def R2E(R, order="XYZ", degrees=False): + return batch_auto_reshape( + R, + lambda x: Rotation.from_matrix(x).as_euler(order, degrees=degrees), + (3, 3), + (3,), + ) + + +def R2Q(R): + return batch_auto_reshape( + R, + lambda x: Rotation.from_matrix(x).as_quat(), + (3, 3), + (4,), + ) + + +def R2R6D(R): + return R[..., 0:2] + + +def R6D2R(R6D): + R3D = np.cross(R6D[..., 0], R6D[..., 1]) + R = np.concatenate((R6D, np.expand_dims(R3D, axis=-1)), axis=-1) + return R + + +def R2R(R): + """ + This returns valid (corrected) rotation if input + rotations are invalid. Otherwise returns the same values. + """ + return batch_auto_reshape( + R, + lambda x: Rotation.from_matrix(x).as_matrix(), + (3, 3), + (3, 3), + ) + + +def R2T(R): + return Rp2T(R, constants.zero_p()) + + +""" +From Q to other representations +""" + + +def Q2A(Q): + return batch_auto_reshape( + Q, + lambda x: Rotation.from_quat(x).as_rotvec(), + (4,), + (3,), + ) + + +def Q2E(Q, order="xyz", degrees=False): + return batch_auto_reshape( + Q, + lambda x: Rotation.from_quat(x).as_euler(order, degrees=degrees), + (4,), + (3,), + ) + + +def Q2Q(Q, op, xyzw_in=True): + """ + This returns valid (corrected) rotation if input rotations are invalid. + Otherwise returns the same values. + """ + return batch_auto_reshape( + Q, + lambda x: Rotation.from_quat(x).as_quat(), + (4,), + (4,), + ) + + +def Q2R(Q): + return batch_auto_reshape( + Q, + lambda x: Rotation.from_quat(x).as_matrix(), + (4,), + (3, 3), + ) + + +def Q2T(Q): + return batch_auto_reshape( + Q, + lambda x: Rp2T(Q2R(x), constants.zero_p()), + (4,), + (4, 4), + ) + + +""" +From T to other representations +""" + + +def T2p(T): + _, p = T2Rp(T) + return p + + +def T2R(T): + R, _ = T2Rp(T) + return R + + +def T2Rp(T): + R = T[..., :3, :3] + p = T[..., :3, 3] + return R, p + + +def T2Qp(T): + R, p = T2Rp(T) + Q = R2Q(R) + return Q, p + + +def Ap2T(A, p): + return Rp2T(A2R(A), p) + + +def E2R(theta): + return Rotation.from_euler("xyz", theta).as_matrix() + + +def Ep2T(E, p, order="xyz", degrees=False): + return Rp2T(E2R(E, order, degrees), p) + + +""" +From some representations to T +""" + + +def Qp2T(Q, p): + R = Q2R(Q) + return Rp2T(R, p) + + +def Rp2T(R, p): + input_shape = R.shape[:-2] if R.ndim > 2 else p.shape[:-1] + R_flat = R.reshape((-1, 3, 3)) + p_flat = p.reshape((-1, 3)) + T = np.zeros((int(np.prod(input_shape)), 4, 4)) + T[...] = constants.eye_T() + T[..., :3, :3] = R_flat + T[..., :3, 3] = p_flat + return T.reshape(list(input_shape) + [4, 4]) + + +def p2T(p): + return Rp2T(constants.eye_R(), np.array(p)) + + +# SM) +def R2Rsix(R): + def _r2rsix(_r): + return _r[..., [0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1]] + + return batch_auto_reshape( + R, + lambda x: _r2rsix(x), + ( + 3, + 3, + ), + (6,), + ) + + +# SM) +def proj(u, v): + # u, v: [B, D] + # projet v to u + B, D = u.shape[0], u.shape[1] + uv = np.sum(u * v, axis=-1) + uu = np.sum(u * u, axis=-1) + a = (uv / uu).reshape(B, 1) + a = np.repeat(a, D, axis=1) + return a * u + + +# SM) +from sklearn.preprocessing import normalize + + +def Rsix2R(Rsix): + def GramSchmidt(_rsix): + # 0 3 ? + # 1 4 ? + # 2 5 ? + v1 = _rsix[..., :3].copy() + v2 = _rsix[..., 3:].copy() + u1 = v1 + e1 = normalize(u1, axis=1, norm="l2") + u2 = v2 - proj(u1, v2) + e2 = normalize(u2, axis=1, norm="l2") + e3 = np.cross(e1, e2) + return np.stack([e1, e2, e3], axis=-1) + + return batch_auto_reshape( + Rsix, + lambda x: GramSchmidt(x), + (6,), + ( + 3, + 3, + ), + ) diff --git a/src/fairmotion/fairmotion/ops/math.py b/src/fairmotion/fairmotion/ops/math.py new file mode 100644 index 0000000000000000000000000000000000000000..487378106f4afe308df5c53d4169972f5e6280d8 --- /dev/null +++ b/src/fairmotion/fairmotion/ops/math.py @@ -0,0 +1,312 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import math +import numpy as np +import warnings +from scipy import stats + +from fairmotion.ops import conversions, quaternion +from fairmotion.utils import constants, utils + + +def normalize(v): + """ + Divide vector by its norm. The method handles vectors with type list and + np.array. + """ + is_list = type(v) == list + length = np.linalg.norm(v) + if length > constants.EPSILON: + norm_v = np.array(v) / length + if is_list: + return list(norm_v) + else: + return norm_v + else: + # warnings.warn("!!!The length of input vector is almost zero!!!") + return v + + +def slerp(R1, R2, t): + """ + Spherical linear interpolation (https://en.wikipedia.org/wiki/Slerp) + between R1 and R2 with parameter t, 0 ≤ t ≤ 1 + """ + return np.dot(R1, conversions.A2R(t * conversions.R2A(np.dot(R1.transpose(), R2)))) + + +def lerp(v0, v1, t): + """ + Simple linear interpolation between v0 and v1 with parameter t, 0 ≤ t ≤ 1 + """ + return v0 + (v1 - v0) * t + + +def invertT(T): + R = T[:3, :3] + p = T[:3, 3] + invT = constants.eye_T() + R_trans = R.transpose() + R_trans_p = np.dot(R_trans, p) + invT[:3, :3] = R_trans + invT[:3, 3] = -R_trans_p + return invT + + +def componentOnVector(inputVector, directionVector): + return np.inner(directionVector, inputVector) / np.dot( + directionVector, directionVector + ) + + +def projectionOnVector(inputVector, directionVector): + return componentOnVector(inputVector, directionVector) * directionVector + + +def R_from_vectors(vec1, vec2): + """ + Returns R such that R dot vec1 = vec2 + """ + vec1 = normalize(vec1) + vec2 = normalize(vec2) + + rot_axis = normalize(np.cross(vec1, vec2)) + inner = np.inner(vec1, vec2) + theta = math.acos(inner) + + if rot_axis[0] == 0 and rot_axis[1] == 0 and rot_axis[2] == 0: + rot_axis = [0, 1, 0] + + x, y, z = rot_axis + c = inner + s = math.sin(theta) + R = np.array( + [ + [ + c + (1.0 - c) * x * x, + (1.0 - c) * x * y - s * z, + (1 - c) * x * z + s * y, + ], + [ + (1.0 - c) * x * y + s * z, + c + (1.0 - c) * y * y, + (1.0 - c) * y * z - s * x, + ], + [ + (1.0 - c) * z * x - s * y, + (1.0 - c) * z * y + s * x, + c + (1.0 - c) * z * z, + ], + ] + ) + return R + + +def project_rotation_1D(R, axis): + """ + Project a 3D rotation matrix to the closest 1D rotation + when a rotational axis is given + >>>>>>> CAUTION >>>>>>> + Quaternion is expressed in "xyzw" order as default in scipy.transform, thus identity is [0,0,0,1] + # verified by: + theta_0 = project_rotation_1D(constants.eye_R(), np.array([0,1,0])) # must be 0 + theta_y = project_rotation_1D(conversions.Ay2R(0.6), np.array([0,1,0])) # must be 0.6 + theta_z = project_rotation_1D(conversions.Az2R(0.6), np.array([0,0,1])) # must be 0.6 + """ + + # Q, angle = quaternion.Q_closest( + # conversions.R2Q(R), [1.0, 0.0, 0.0, 0.0], axis, + # ) + Q, angle = quaternion.Q_closest( + conversions.R2Q(R), + [0.0, 0.0, 0.0, 1.0], + axis, + ) + + return angle + + +def project_rotation_2D(R, axis1, axis2, order="zyx"): + """ + Project a 3D rotation matrix to the 2D rotation + when two rotational axes are given + """ + zyx = conversions.R2E(R, order) + index1 = utils.axis_to_index(axis1) + index2 = utils.axis_to_index(axis2) + if index1 == 0 and index2 == 1: + return np.array(zyx[2], zyx[1]) + elif index1 == 0 and index2 == 2: + return np.array(zyx[2], zyx[0]) + elif index1 == 1 and index2 == 0: + return np.array(zyx[1], zyx[2]) + elif index1 == 1 and index2 == 2: + return np.array(zyx[1], zyx[0]) + elif index1 == 2 and index2 == 0: + return np.array(zyx[0], zyx[2]) + elif index1 == 2 and index2 == 1: + return np.array(zyx[0], zyx[1]) + else: + raise Exception + + +def project_rotation_3D(R): + """ + Project a 3D rotation matrix to the 3D rotation. + It will just returns corresponding axis-angle. + """ + return conversions.R2A(R) + + +def project_angular_vel_1D(w, axis): + """ + Project a 3D angular velocity to 1d angular velocity. + """ + return np.linalg.norm(np.dot(w, axis)) + + +def project_angular_vel_2D(w, axis1, axis2): + """ + Project a 3D angular velocity to 2d angular velocity. + """ + index1 = utils.axis_to_index(axis1) + index2 = utils.axis_to_index(axis2) + return np.array([w[index1], w[index2]]) + + +def project_angular_vel_3D(w): + """ + Project a 3D angular velocity to 3d angular velocity. + """ + return w + + +def truncnorm(mu, sigma, lower, upper): + """ + Generate a sample from a truncated normal districution + """ + return np.atleast_1d( + stats.truncnorm( + (lower - mu) / sigma, (upper - mu) / sigma, loc=mu, scale=sigma + ).rvs() + ) + + +def random_unit_vector(dim=3): + """ + Generate a random unit-vector (whose length is 1.0) + """ + while True: + v = np.random.uniform(-1.0, 1.0, size=dim) + l = np.linalg.norm(v) + if l < constants.EPSILON: + continue + v = v / l + break + return v + + +def random_position(mu_l, sigma_l, lower_l, upper_l, dim=3): + """ + Generate a random position by a truncated normal districution + """ + l = truncnorm(mu=mu_l, sigma=sigma_l, lower=lower_l, upper=upper_l) + return random_unit_vector(dim) * l + + +def random_rotation(mu_theta, sigma_theta, lower_theta, upper_theta): + """ + Generate a random position by a truncated normal districution + """ + theta = truncnorm( + mu=mu_theta, sigma=sigma_theta, lower=lower_theta, upper=upper_theta + ) + return conversions.A2R(random_unit_vector() * theta) + + +def lerp_from_paired_list(x, xy_pairs, clamp=True): + """ + Given a list of data points in the shape of [[x0,y0][x1,y1],...,[xN,yN]], + this returns an interpolated y value that correspoinds to a given x value + """ + x0, y0 = xy_pairs[0] + xN, yN = xy_pairs[-1] + # if clamp is false, then check if x is inside of the given x range + if not clamp: + assert x0 <= x <= xN + # Return the boundary values if the value is outside """ + if x <= x0: + return y0 + elif x >= xN: + return yN + else: + """Otherwise, return linearly interpolated values""" + for i in range(len(xy_pairs) - 1): + x1, y1 = xy_pairs[i] + x2, y2 = xy_pairs[i + 1] + if x1 <= x < x2: + alpha = (x - x1) / (x2 - x1) + return (1.0 - alpha) * y1 + alpha * y2 + raise Exception("This should not be reached!!!") + + +class Normalizer: + """ + Helper class for the normalization between two sets of values. + (real_val_max, real_val_min) <--> (norm_val_max, norm_val_min) + """ + + def __init__( + self, + real_val_max, + real_val_min, + norm_val_max, + norm_val_min, + apply_clamp=True, + ): + self.set_real_range(real_val_max, real_val_min) + self.set_norm_range(norm_val_max, norm_val_min) + self.apply_clamp = apply_clamp + self.dim = len(real_val_max) + + def set_real_range(self, real_val_max, real_val_min): + self.real_val_max = real_val_max + self.real_val_min = real_val_min + self.real_val_diff = real_val_max - real_val_min + self.real_val_diff_inv = 1.0 / self.real_val_diff + # + # Check if wrong values exist in the setting + # e.g. min <= max or abs(max-min) is too small + # + for v in self.real_val_diff: + if v <= 0.0 or abs(v) < 1.0e-08: + raise Exception("Normalizer", "wrong values") + + def set_norm_range(self, norm_val_max, norm_val_min): + self.norm_val_max = norm_val_max + self.norm_val_min = norm_val_min + self.norm_val_diff = norm_val_max - norm_val_min + self.norm_val_diff_inv = 1.0 / self.norm_val_diff + # + # Check if wrong values exist in the setting + # e.g. min <= max or abs(max-min) is too small + # + for v in self.norm_val_diff: + if v <= 0.0 or abs(v) < 1.0e-08: + raise Exception("Normalizer", "wrong values") + + def real_to_norm(self, val): + val_0_1 = (val - self.real_val_min) * self.real_val_diff_inv + if self.apply_clamp: + self._clip(val_0_1) + return self.norm_val_min + self.norm_val_diff * val_0_1 + + def norm_to_real(self, val): + val_0_1 = (val - self.norm_val_min) * self.norm_val_diff_inv + if self.apply_clamp: + self._clip(val_0_1) + return self.real_val_min + self.real_val_diff * val_0_1 + + def _clip(self, val): + for i in range(len(val)): + val[i] = np.clip(val[i], 0.0, 1.0) diff --git a/src/fairmotion/fairmotion/ops/motion.py b/src/fairmotion/fairmotion/ops/motion.py new file mode 100644 index 0000000000000000000000000000000000000000..35e4bbd230a6ab91c368f3e89699cd7b9e639d2d --- /dev/null +++ b/src/fairmotion/fairmotion/ops/motion.py @@ -0,0 +1,329 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import copy +import numpy as np + +from fairmotion.core import motion as motion_class +from fairmotion.core import velocity as vel_class +from fairmotion.ops import conversions, math, quaternion + + +def blend(pose1, pose2, alpha=0.5, skel_preserve=False): + """ + Blends two poses, return (1-alpha)*pose1 + alpha*pose2 + + Args: + pose1, pose2: Poses to be blended. + alpha: Ratio of interpolation which ranges from 0 to 1. + """ + assert 0.0 <= alpha <= 1.0 + pose_new = copy.deepcopy(pose1) + if skel_preserve: + pose_new.skel = pose1.skel + + for j in range(pose1.skel.num_joints()): + R0, p0 = conversions.T2Rp(pose1.get_transform(j, local=True)) + R1, p1 = conversions.T2Rp(pose2.get_transform(j, local=True)) + R, p = math.slerp(R0, R1, alpha), math.lerp(p0, p1, alpha) + pose_new.set_transform(j, conversions.Rp2T(R, p), local=True) + return pose_new + + +def stitch( + motion1, + motion2, + pivot_offset1=0, + pivot_offset2=0, + blend_length=0, + blend_method="overlapping", +): + """ + Combines two motion sequences into one, motion2 is appended to motion1. + Blending is done if requested. The operation is not done in place. + The second motion is rotate and translated so that they are connected smoothly. + This method is a subset of the append method + + Args: + motion1: Previous motion + motion2: New motions to be added + pivot_offset1: Pivot frame offset (sec) to access the pivot pose for motion1. + The pose at [motion1.length()-pivot_offset1] will be the pivot pose + pivot_offset2: Pivot frame offset (sec) to access the pivot pose for motion2. + The pose at [pivot_offset2] will be the pivot pose. + blend_length: lentgh of blending for stiched area + blend_method: blending methods 'propagation', 'overlapping', and 'inertialization'. + """ + return append( + motion1, motion2, pivot_offset1, pivot_offset2, True, blend_length, blend_method + ) + + +def append( + motion1, + motion2, + pivot_offset1=0, + pivot_offset2=0, + pivot_alignment=False, + blend_length=0, + blend_method="overlapping", +): + """ + Combines two motion sequences into one, motion2 is appended to motion1. + Blending is done if requested. The operation is not done in place. + + Args: + motion1: Previous motion + motion2: New motions to be added + pivot_offset1: Pivot frame offset (sec) to access the pivot pose for motion1. + The pose at [motion1.length()-pivot_offset1] will be the pivot pose + pivot_offset2: Pivot frame offset (sec) to access the pivot pose for motion2. + The pose at [pivot_offset2] will be the pivot pose. + pivot_alignment: Whether motion2 will be aligned to motion1 or not + blend_length: lentgh of blending for stiched area + blend_method: blending methods 'propagation', 'overlapping', and 'inertialization'. + """ + assert isinstance(motion1, (motion_class.Motion, vel_class.MotionWithVelocity)) + assert isinstance(motion2, (motion_class.Motion, vel_class.MotionWithVelocity)) + assert motion1.fps == motion2.fps + assert motion1.skel.num_joints() == motion2.skel.num_joints() + assert motion1.num_frames() > 0 or motion2.num_frames() > 0 + + if motion1.num_frames() == 0: + combined_motion = copy.deepcopy(motion2) + combined_motion.name = f"{motion1.name}+{motion2.name}" + return combined_motion + + if motion2.num_frames() == 0: + combined_motion = copy.deepcopy(motion1) + combined_motion.name = f"{motion1.name}+{motion2.name}" + return combined_motion + + frame_source = motion1.time_to_frame(motion1.length() - pivot_offset1) + frame_target = motion2.time_to_frame(pivot_offset2) + + # Translate and rotate motion2 to location of frame_source + pose1 = motion1.get_pose_by_frame(frame_source) + pose2 = motion2.get_pose_by_frame(frame_target) + + R1, p1 = conversions.T2Rp(pose1.get_root_transform()) + R2, p2 = conversions.T2Rp(pose2.get_root_transform()) + + v_up_env = motion1.skel.v_up_env + + # Remove the translation of the pivot of the motion2 + # so that rotation works correctly + dp = -(p2 - math.projectionOnVector(p2, v_up_env)) + motion2 = translate(motion2, dp) + + # Translation to be applied + dp = p1 - math.projectionOnVector(p1, v_up_env) + + # Rotation to be applied + Q1 = conversions.R2Q(R1) + Q2 = conversions.R2Q(R2) + _, theta = quaternion.Q_closest(Q1, Q2, v_up_env) + dR = conversions.A2R(v_up_env * theta) + + motion2 = transform(motion2, conversions.Rp2T(dR, dp), pivot=0, local=False) + + combined_motion = copy.deepcopy(motion1) + combined_motion.name = f"{motion1.name}+{motion2.name}" + del combined_motion.poses[frame_source + 1 :] + + t_start = motion1.length() - blend_length + t_processed = 0.0 + dt = 1 / motion2.fps + for i in range(frame_target, motion2.num_frames()): + t_processed += dt + if blend_length > 0.0: + alpha = min(1.0, t_processed / float(blend_length)) + else: + alpha = 1.0 + # Do blending for a while (blend_length) + if alpha < 1.0: + if blend_method == "propagation": + pose_out = blend( + motion1.get_pose_by_time(t_start), + motion2.get_pose_by_frame(i), + alpha, + ) + elif blend_method == "overlapping": + pose_out = blend( + motion1.get_pose_by_time(t_start + t_processed), + motion2.get_pose_by_frame(i), + alpha, + ) + elif blend_method == "inertialization": + # TODO + raise NotImplementedError + else: + raise NotImplementedError + else: + pose_out = copy.deepcopy(motion2.get_pose_by_frame(i)) + combined_motion.add_one_frame(pose_out.data) + + # Recompute velocities if exists + if isinstance(combined_motion, vel_class.MotionWithVelocity): + combined_motion.compute_velocities() + + return combined_motion + + +def transform(motion, T, pivot=0, local=False): + """ + Apply transform to all poses of a motion sequence. The operation is done + in-place. + + Args: + motion: Motion sequence to be transformed + T: Transformation matrix of shape (4, 4) to be applied to poses of + motion + pivot: Optional; The pivot frame number for the transformation. + For example, if it is 0 and the transformation is pure rotation, + the entire motion rotates w.r.t. the first frame. + local: Optional; Set local=True if the transformations are to be + applied locally, relative to parent of each joint. + """ + pose_pivot = motion.poses[pivot] + T_root = pose_pivot.get_root_transform() + T_root_inv = math.invertT(T_root) + # Save the relative transform of each pose w.r.t. the pivot pose + T_rel_wrt_pivot = [] + for pose_id in range(len(motion.poses)): + T_rel = np.dot(T_root_inv, motion.poses[pose_id].get_root_transform()) + T_rel_wrt_pivot.append(T_rel) + # Transform the pivot pose + T_root_new = np.dot(T_root, T) if local else np.dot(T, T_root) + pose_pivot.set_root_transform(T_root_new, local=False) + # Transform the remaining poses by using the transformed pivot pose + for pose_id in range(len(motion.poses)): + T_new = np.dot(T_root_new, T_rel_wrt_pivot[pose_id]) + motion.poses[pose_id].set_root_transform(T_new, local=False) + # Recompute velocities if exists + if isinstance(motion, vel_class.MotionWithVelocity): + motion.compute_velocities() + return motion + + +def translate(motion, v, pivot=0, local=False): + """ + Apply translation to motion sequence. + + Args: + motion: Motion sequence to be translated + v: Array of shape (3,) indicating translation vector to be applied to + all poses of motion sequence + pivot: Optional; The pivot frame number for the traslation. + In translation, it is only meaningful when local==True. + local: Optional; Set local=True if the translation is to be applied + locally, relative to root position. + """ + return transform(motion, conversions.p2T(v), pivot, local) + + +def rotate(motion, R, pivot=0, local=False): + """ + Apply rotation to motion sequence. + + Args: + motion: Motion sequence to be rotated + R: Array of shape (3, 3) indicating rotation matrix to be applied + pivot: Optional; The pivot frame number for the rotation. + For example, if it is 0 then the entire motion rotates + w.r.t. the first frame. + local: Optional; Set local=True if the translation is to be applied + locally, relative to root position. + """ + return transform(motion, conversions.R2T(R), pivot, local) + + +def cut(motion, frame_start, frame_end): + """ + Returns motion object with poses from [frame_start, frame_end) only. The + operation is not done in-place. + + Args: + motion: Motion sequence to be cut + frame_start, frame_end: Frame number range that defines the boundary of + motion to be cut. Pose at frame_start is included, and pose at + frame_end is excluded in the returned motion object + """ + cut_motion = copy.deepcopy(motion) + cut_motion.name = f"{motion.name}_{frame_start}_{frame_end}" + cut_motion.poses = cut_motion.poses[frame_start:frame_end] + + # Recompute velocities if exists + if isinstance(cut_motion, vel_class.MotionWithVelocity): + cut_motion.vels = cut_motion.vels[frame_start:frame_end] + + return cut_motion + + +def resample(motion, fps): + """ + Upsample/downsample frame rate of motion object to `fps` Hz. For + upsampling, poses are interpolated using `Pose.interpolate` method to + fill in the gaps. + + Args: + motion: Motion sequence to be resampled + fps: Frequency of motion desired + """ + poses_new = [] + + dt = 1.0 / fps + t = 0.0 + while t <= motion.length(): + pose = motion.get_pose_by_time(t) + pose.skel = motion.skel + poses_new.append(pose) + t += dt + + motion.poses = poses_new + motion.set_fps(fps) + + # Recompute velocities if exists + if isinstance(motion, vel_class.MotionWithVelocity): + motion.compute_velocities() + + return motion + + +def position_wrt_root(motion): + """ + Returns position of joints with respect to the root, for all poses in the + motion sequence. + """ + matrix = motion.to_matrix(local=False) + # Extract positions + matrix = matrix[:, :, :3, 3] + # Subtract root position from all joint positions + matrix = matrix - matrix[:, np.newaxis, 0] + return matrix + + +# SM) +def transform_poses(poses, T, pivot=0, local=False): + """ + poses version of transform ftn + - inplace + """ + pose_pivot = poses[pivot] + T_root = pose_pivot.get_root_transform() + T_root_inv = math.invertT(T_root) + # Save the relative transform of each pose w.r.t. the pivot pose + T_rel_wrt_pivot = [] + for pose_id in range(len(poses)): + T_rel = np.dot(T_root_inv, poses[pose_id].get_root_transform()) + T_rel_wrt_pivot.append(T_rel) + # Transform the pivot pose + T_root_new = np.dot(T_root, T) if local else np.dot(T, T_root) + pose_pivot.set_root_transform(T_root_new, local=False) + # Transform the remaining poses by using the transformed pivot pose + for pose_id in range(len(poses)): + T_new = np.dot(T_root_new, T_rel_wrt_pivot[pose_id]) + poses[pose_id].set_root_transform(T_new, local=False) + # Recompute velocities if exists + # if isinstance(motion, vel_class.MotionWithVelocity): + # motion.compute_velocities() + return poses diff --git a/src/fairmotion/fairmotion/ops/quaternion.py b/src/fairmotion/fairmotion/ops/quaternion.py new file mode 100644 index 0000000000000000000000000000000000000000..7e3b1007c3c7fa9bedbe60a83ca31a18ca7a051f --- /dev/null +++ b/src/fairmotion/fairmotion/ops/quaternion.py @@ -0,0 +1,88 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import math +import numpy as np + +from fairmotion.utils import constants, utils +from fairmotion.ops import conversions, math as math_ops + +from scipy.spatial.transform import Rotation + + +def Q_op(Q, op, xyzw_in=True): + """ + Perform operations on quaternion. The operations currently supported are + "change_order", "normalize" and "halfspace". + + `change_order` changes order of quaternion to xyzw if it's in wxyz and + vice-versa + `normalize` divides the quaternion by its norm + `half-space` negates the quaternion if w < 0 + + Args: + Q: Numpy array of shape (..., 4) + op: String; The operation to be performed on the quaternion. `op` can + take values "change_order", "normalize" and "halfspace" + xyzw_in: Set to True if input order is "xyzw". Otherwise, the order + "wxyz" is assumed. + """ + + def q2q(q): + result = q.copy() + if "normalize" in op: + norm = np.linalg.norm(result) + if norm < constants.EPSILON: + raise Exception("Invalid input with zero length") + result /= norm + if "halfspace" in op: + w_idx = 3 if xyzw_in else 0 + if result[w_idx] < 0.0: + result *= -1.0 + if "change_order" in op: + result = result[[3, 0, 1, 2]] if xyzw_in else result[[1, 2, 3, 0]] + return result + + return utils._apply_fn_agnostic_to_vec_mat(Q, q2q) + + +def Q_diff(Q1, Q2): + raise NotImplementedError + + +def Q_mult(Q1, Q2): + """ + Multiply two quaternions. + """ + R1 = Rotation.from_quat(Q1) + R2 = Rotation.from_quat(Q2) + return (R1 * R2).as_quat() + + +def Q_closest(Q1, Q2, axis): + """ + This computes optimal-in-place orientation given a target orientation Q1 + and a geodesic curve (Q2, axis). In tutively speaking, the optimal-in-place + orientation is the closest orientation to Q1 when we are able to rotate Q2 + along the given axis. We assume Q is given in the order of xyzw. + """ + ws, vs = Q1[3], Q1[0:3] + w0, v0 = Q2[3], Q2[0:3] + u = math_ops.normalize(axis) + + a = ws * w0 + np.dot(vs, v0) + b = -ws * np.dot(u, v0) + w0 * np.dot(vs, u) + np.dot(vs, np.cross(u, v0)) + alpha = math.atan2(a, b) + + theta1 = -2 * alpha + math.pi + theta2 = -2 * alpha - math.pi + G1 = conversions.A2Q(theta1 * u) + G2 = conversions.A2Q(theta2 * u) + + if np.dot(Q1, G1) > np.dot(Q1, G2): + theta = theta1 + Qnearest = Q_mult(G1, Q2) + else: + theta = theta2 + Qnearest = Q_mult(G1, Q2) + + return Qnearest, theta diff --git a/src/fairmotion/fairmotion/utils/__init__.py b/src/fairmotion/fairmotion/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9020c2df23e2af280b7bb168b996ae9eaf312eb8 --- /dev/null +++ b/src/fairmotion/fairmotion/utils/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. diff --git a/src/fairmotion/fairmotion/utils/constants.py b/src/fairmotion/fairmotion/utils/constants.py new file mode 100644 index 0000000000000000000000000000000000000000..8e041c0b8bff9af136b7b62833dca827e752528d --- /dev/null +++ b/src/fairmotion/fairmotion/utils/constants.py @@ -0,0 +1,38 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np + + +EPSILON = np.finfo(float).eps + +EYE_R = np.array([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], float) + +EYE_T = np.array( + [ + [1.0, 0.0, 0.0, 0.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [0.0, 0.0, 0.0, 1.0], + ], + float, +) + +ZERO_P = np.array([0.0, 0.0, 0.0], float) + +ZERO_R = np.zeros((3, 3)) + + +def eye_T(): + return EYE_T.copy() + + +def eye_R(): + return EYE_R.copy() + + +def zero_p(): + return ZERO_P.copy() + + +def zero_R(): + return ZERO_R.copy() diff --git a/src/fairmotion/fairmotion/utils/contact_utils.py b/src/fairmotion/fairmotion/utils/contact_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..041c7789a3c14bd413bdfa5e77548655747b4afc --- /dev/null +++ b/src/fairmotion/fairmotion/utils/contact_utils.py @@ -0,0 +1,733 @@ +import numpy as np +from scipy.spatial.transform import Rotation +from IPython import embed + +from fairmotion.utils.spring_utils import inertialize_update, inertialize_transition + +# from fairmotion.core import motion as motion_classes +from fairmotion.ops import motion as motion_ops +from fairmotion.ops import conversions + +# from fairmotion.ops.spring import * +import scipy.ndimage as ndimage +from sata.utils.data_utils import safe_normalize_to_one as normalize # shortcut name alias + + +def get_foot_indices( + skel, toe_only=False, skip_if_missing=False, print_if_missing=True +): + joint_names = [j.name for j in skel.joints] + lte = "LeftToeBase_End" if "LeftToeBase_End" in joint_names else "LeftToe_End" + rte = "RightToeBase_End" if "RightToeBase_End" in joint_names else "RightToe_End" + if not (lte in joint_names) or not (rte in joint_names): + if print_if_missing: + print("get_foot_indices: no such feet name") + if not skip_if_missing: + embed() + return + + lt = skel.get_joint(lte).parent_joint + rt = skel.get_joint(rte).parent_joint + if toe_only: + return [skel.get_index_joint(lt), skel.get_index_joint(rt)] + else: + return [ + skel.get_index_joint(lt), + skel.get_index_joint(lte), + skel.get_index_joint(rt), + skel.get_index_joint(rte), + ] + + +def get_default_fc_thres(skel, foot_indices): + # p_thres = [2* tpose.get_transform(f_idx, local=False)[1, 3] for f_idx in foot_indices] + # p_thres = [4.2] * len(foot_indices) + """assumption: skel is in tpose""" + """ CAUTION: should call this after motion normalization""" + # ex) stunt_loco: [left: -16, right: +16], thus max(h,0)+4: [4, 20] + # before normalize: p_thres: [4.0, 4.0, 20.0463, 19.04634] v_thres: [0.4, 0.4, 0.4, 0.4] + # after normalize: p_thres: [6.1102, 5.1563, 6.1123, 7.0662] v_thres: [0.4, 0.4, 0.4, 0.4] + + p_thres = [ + max(skel.get_joint(fi).xform_global[1, 3], 0) + 4.0 for fi in foot_indices + ] + # v_thres = [0.18] * len(p_thres) + v_thres = [0.4] * len(p_thres) + return p_thres, v_thres + + +def get_foot_contact(poses, foot_indices, p_thres, v_thres, use_filter=True): + + if (p_thres == None) or (v_thres == None): + try: + p_thres_auto, v_thres_auto = get_default_fc_thres( + poses[0].skel, foot_indices + ) + if p_thres is None: + p_thres = p_thres_auto + if v_thres is None: + v_thres = v_thres_auto + except: + print("get foot contact") + from IPython import embed + + embed() + + # print("p_thres: ", p_thres, "\tv_thres:", v_thres) + contacts = np.zeros((len(poses), len(foot_indices)), dtype=bool) + for frame, pose in enumerate(poses): + foot_position = np.array( + [pose.get_transform(f_idx, local=False)[:3, 3] for f_idx in foot_indices] + ) + ct_p = [fp[1] < p_thres_i for fp, p_thres_i in zip(foot_position, p_thres)] + if frame > 0: + prev_pose = poses[frame - 1] + prev_foot_position = np.array( + [ + prev_pose.get_transform(f_idx, local=False)[:3, 3] + for f_idx in foot_indices + ] + ) + ct_v = [ + np.linalg.norm(fp - prev_fp) * 30.0 / 100.0 < v_thres_i + for fp, prev_fp, v_thres_i in zip( + foot_position, prev_foot_position, v_thres + ) + ] + contacts[frame] = [ct_p_i & ct_v_i for ct_p_i, ct_v_i in zip(ct_p, ct_v)] + else: + contacts[frame] = ct_p + + if use_filter: + for ci in range(contacts.shape[1]): + contacts[:, ci] = ndimage.median_filter( + contacts[:, ci], size=4, mode="nearest" + ) + + return contacts + + +def get_foot_contact_ratio(poses, foot_indices, p_thres=None, v_thres=None, raw=True): + foot_contact_bool = get_foot_contact(poses, foot_indices, p_thres, v_thres) + n_frames = foot_contact_bool.shape[0] + if raw: # do not avg over each side(left, right), just use raw value for all joints + foot_contact_ratio = foot_contact_bool.astype("float32") + else: + n_feet = len(foot_indices) + foot_contact_ratio = ( + np.sum(foot_contact_bool.reshape(n_frames, int(n_feet // 2), 2), axis=-1) + / 2.0 + ) + + return foot_contact_ratio + + +def get_all_joint_ground_contact(motion, p_thres=5, v_thres=0.4): + positions = motion.positions(local=False) + positions_y = positions[..., 1] + velocities = np.linalg.norm(positions[1:] - positions[:-1], axis=-1) * 30.0 / 100.0 + contact = np.zeros((motion.num_frames(), motion.skel.num_joints())) + contact[0] = positions_y[0] < p_thres + contact[1:] = (positions_y[1:] < p_thres) & (velocities < v_thres) + return contact + + +# Rotate a joint to look toward some +# given target position +def ik_look_at( + bone_rotation, # quat& + global_parent_rotation, # const quat + global_rotation, # const quat + global_position, # const vec3 + child_position, # const vec3 + target_position, # const vec3 + eps=1e-5, # const float +): + curr_dir = normalize(child_position - global_position) + targ_dir = normalize(target_position - global_position) + + if np.abs(1.0 - np.dot(curr_dir, targ_dir) > eps): + curr_to_target = Rotation.from_rotvec(np.cross(curr_dir, targ_dir)) + bone_rotation = ( + Rotation.inv(global_parent_rotation) * curr_to_target * global_rotation + ) + + return bone_rotation.as_matrix() + + +def ik_look_at_idx( + pose, + parent_id, + joint_id, + child_id, + target_position, # const vec3 + eps=1e-5, # const float +): + parent_global_T = pose.get_transform(parent_id, local=False) + parent_global_R = Rotation.from_matrix(parent_global_T[:3, :3]) + + joint_global_T = pose.get_transform(joint_id, local=False) + joint_global_R = Rotation.from_matrix(joint_global_T[:3, :3]) + joint_global_p = joint_global_T[:3, 3] + + child_global_T = pose.get_transform(child_id, local=False) + child_global_p = child_global_T[:3, 3] + + joint_local_R = Rotation.from_matrix( + pose.get_transform(joint_id, local=True)[:3, :3] + ) + + return ik_look_at( + joint_local_R, + parent_global_R, + joint_global_R, + joint_global_p, + child_global_p, + target_position, + eps, + ) + + +# Basic two-joint IK in the style of https://theorangeduck.com/page/simple-two-joint +# Here I add a basic "forward vector" which acts like a kind of pole-vetor +# to control the bending direction +def ik_two_bone( + bone_joint, # const vec3 + bone_mid, # const vec3 + bone_end, # const vec3 + target, # const vec3 + fwd, # const vec3 + bone_joint_gr, # const quat + bone_mid_gr, # const quat + bone_par_gr, # const quat + max_length_buffer, # const float +): + from utils.data_utils import ( + safe_normalize_to_one as normalize, + ) # shortcut name alias + + max_extension = ( + np.linalg.norm(bone_joint - bone_mid) + + np.linalg.norm(bone_mid - bone_end) + - max_length_buffer + ) + + target_clamp = target # [vec3] + if np.linalg.norm(target - bone_joint) > max_extension: + target_clamp = bone_joint + max_extension * normalize(target - bone_joint) + + axis_dwn = normalize(bone_end - bone_joint) # TODO + fwd = normalize(bone_mid - bone_joint) + axis_rot = normalize(np.cross(axis_dwn, fwd)) + + a = bone_joint + b = bone_mid + c = bone_end + t = target_clamp + + lab = np.linalg.norm(b - a) + lcb = np.linalg.norm(b - c) + lat = np.linalg.norm(t - a) + + ac_ab_0 = np.arccos(np.clip(np.dot(normalize(c - a), normalize(b - a)), -1.0, 1.0)) + ba_bc_0 = np.arccos(np.clip(np.dot(normalize(a - b), normalize(c - b)), -1.0, 1.0)) + + ac_ab_1 = np.arccos( + np.clip((lab * lab + lat * lat - lcb * lcb) / (2.0 * lab * lat), -1.0, 1.0) + ) + ba_bc_1 = np.arccos( + np.clip((lab * lab + lcb * lcb - lat * lat) / (2.0 * lab * lcb), -1.0, 1.0) + ) + + r0 = Rotation.from_rotvec((ac_ab_1 - ac_ab_0) * axis_rot) + r1 = Rotation.from_rotvec((ba_bc_1 - ba_bc_0) * axis_rot) + + c_a = normalize(bone_end - bone_joint) + t_a = normalize(target_clamp - bone_joint) + + ac_at_0 = np.arccos(np.clip(np.dot(c_a, t_a), -1.0, 1.0)) + r2 = Rotation.from_rotvec(ac_at_0 * normalize(np.cross(c_a, t_a))) + + bone_joint_lr = Rotation.inv(bone_par_gr) * (r2 * (r0 * bone_joint_gr)) + + bone_mid_lr = Rotation.inv(bone_joint_gr) * (r1 * bone_mid_gr) + + return bone_joint_lr.as_matrix(), bone_mid_lr.as_matrix() + + +def ik_two_bone_idx( + pose, + parent_id, + joint_id, + mid_id, + end_id, + target, # const vec3 + fwd, # const vec3 + max_length_buffer, # const float +): + parent_global_T = pose.get_transform(parent_id, local=False) + parent_global_R = Rotation.from_matrix(parent_global_T[:3, :3]) + + joint_global_T = pose.get_transform(joint_id, local=False) + joint_global_R = Rotation.from_matrix(joint_global_T[:3, :3]) + joint_global_p = joint_global_T[:3, 3] + + mid_global_T = pose.get_transform(mid_id, local=False) + mid_global_R = Rotation.from_matrix(mid_global_T[:3, :3]) + mid_global_p = mid_global_T[:3, 3] + + end_global_T = pose.get_transform(end_id, local=False) + end_global_p = end_global_T[:3, 3] + + return ik_two_bone( + joint_global_p, + mid_global_p, + end_global_p, + target, + fwd, + joint_global_R, + mid_global_R, + parent_global_R, + max_length_buffer, + ) + + +# https:#github.com/orangeduck/Motion-Matching/blob/47f4adbec4f2ac1c282f996f7e02ae97e64772c0/controller.cpp +class Contact: + # static class variables + meter_conversion_scale = 100 + ik_max_length_buffer = 0.015 * meter_conversion_scale + # ik_unlock_radius = 0.10 * meter_conversion_scale + ik_unlock_radius = 0.10 * meter_conversion_scale + ik_blending_halflife = 0.1 + # contact_label_thres = 0.6 + contact_label_thres = 0.75 + + # self.ik_max_length_buffer = 0.015 * meter_conversion_scale + # self.ik_unlock_radius = 0.20 * meter_conversion_scale + # self.ik_blending_halflife = 0.1 + + def __init__(self, ik_toe_length=5, ik_foot_height=1) -> None: + self.ik_enabled = True + self.ik_toe_length = ik_toe_length + self.ik_foot_height = ik_foot_height + + def contact_ratio_to_bool_state(self, contact_state): + if type(contact_state) == bool: + return contact_state + else: + return contact_state > self.contact_label_thres # float, np.float, ... + + def reset( + self, input_contact_position, input_contact_velocity, input_contact_state + ): + self.contact_state = False # input_contact_state + self.contact_lock = False + self.contact_position = input_contact_position # vec3& + self.contact_velocity = input_contact_velocity # vec3& + self.contact_point = input_contact_position # vec3& + self.contact_target = input_contact_position # vec3& + self.contact_offset_position = np.zeros(3) # vec3& + self.contact_offset_velocity = np.zeros(3) # vec3& + self.contact_log = [self.contact_ratio_to_bool_state(input_contact_state)] + + self.contact_point_log = [self.contact_point] + self.contact_position_log = [self.contact_position] + + def update( + self, + input_contact_position, # const vec3 + input_contact_state, # const bool + dt, # const float + eps=1e-8, # const float + debug_frame=None, + ): + unlock_radius = self.ik_unlock_radius + foot_height = self.ik_foot_height + halflife = self.ik_blending_halflife + input_contact_state = self.contact_ratio_to_bool_state(input_contact_state) + + # First compute the input contact position velocity via finite difference + input_contact_velocity = (input_contact_position - self.contact_target) / ( + dt + eps + ) # [3] + self.contact_target = input_contact_position + + # Update the inertializer to tick forward in time + ( + self.contact_position, + self.contact_velocity, + self.contact_offset_position, + self.contact_offset_velocity, + ) = inertialize_update( + self.contact_position, + self.contact_velocity, + self.contact_offset_position, + self.contact_offset_velocity, + # If locked we feed the contact point and zero velocity, + # otherwise we feed the input from the animation + self.contact_point if self.contact_lock else input_contact_position, + np.zeros(3) if self.contact_lock else input_contact_velocity, + halflife, + dt, + ) + + # If the contact point is too far from the current input position + # then we need to unlock the contact + unlock_contact = self.contact_lock and ( + np.linalg.norm(self.contact_point - input_contact_position) > unlock_radius + ) + if debug_frame is not None: + # if (not self.contact_state) and input_contact_state: + # print(debug_frame, '/', np.linalg.norm(self.contact_point - input_contact_position)) + if unlock_contact: + print( + debug_frame, + "/ unlock: ", + np.linalg.norm(self.contact_point - input_contact_position), + ) + + # If the contact was previously inactive but is now active we + # need to transition to the locked contact state + if (not self.contact_state) and input_contact_state: + # Contact point is given by the current position of + # the foot projected onto the ground plus foot height + self.contact_lock = True + self.contact_point = self.contact_position + self.contact_point[1] = ( + self.contact_position[1] + foot_height + ) / 2.0 # foot_height + + self.contact_offset_position, self.contact_offset_velocity = ( + inertialize_transition( + self.contact_offset_position, + self.contact_offset_velocity, + input_contact_position, + input_contact_velocity, + self.contact_point, + np.zeros(3), + ) + ) + # self.contact_offset_position = self.contact_offset_position + input_contact_position - self.contact_point + # self.contact_offset_velocity = self.contact_offset_velocity + input_contact_velocity - np.zeros(3) + + if debug_frame is not None: + print( + debug_frame, + "/ lock ", + self.contact_point, + self.contact_offset_position, + self.contact_offset_velocity, + ) + + # Otherwise if we need to unlock or we were previously in + # contact but are no longer we transition to just taking + # the input position as-is + elif ( + self.contact_lock and self.contact_state and (not input_contact_state) + ) or (unlock_contact): + self.contact_lock = False + + self.contact_offset_position, self.contact_offset_velocity = ( + inertialize_transition( + self.contact_offset_position, + self.contact_offset_velocity, + self.contact_point, + np.zeros(3), + input_contact_position, + input_contact_velocity, + ) + ) + # self.contact_offset_position = self.contact_offset_position + self.contact_point - input_contact_position + # self.contact_offset_velocity = self.contact_offset_velocity + np.zeros(3) - input_contact_velocity + + # if self.contact_state and input_contact_state: + # print(self.contact_point, self.contact_position, input_contact_position) + + # Update contact state + self.contact_state = input_contact_state + self.contact_log.append(self.contact_state) + self.contact_point_log.append(self.contact_point) + self.contact_position_log.append(self.contact_position) + + +def init_contact(motion, frame, c_idx, foot_height=None): + motion.contacts = {} + # assert len(c_idx) == len(state) + for i, ci in enumerate(c_idx): + if foot_height is not None: + contact_i = Contact(ik_foot_height=foot_height[i]) + else: + contact_i = Contact() + + pose_f = motion.poses[frame] + ci_f_position = pose_f.get_transform(ci, local=False)[:3, 3] + ci_fprev_position = ( + motion.poses[frame - 1].get_transform(ci, local=False)[:3, 3] + if frame != 0 + else ci_f_position + ) + ci_f_velocity = (ci_f_position - ci_fprev_position) * 30 + contact_i.reset(ci_f_position, ci_f_velocity, False) + motion.contacts[ci] = contact_i + + +def foot_cleanup_exact_point( + pose, + toe_contact_position, + toe_chains, + toe_i, + ik_toe_vector, + ik_foot_height, + ik_max_length_buffer, +): + assert toe_contact_position is not None + assert ik_toe_vector is not None + assert ik_foot_height is not None + + root_i, hip_i, knee_i, heel_i = toe_chains + """ Perform simple two-joint IK to place heel """ + heel_global_p = pose.get_transform(heel_i, local=False)[:3, 3] + toe_global_p = pose.get_transform(toe_i, local=False)[:3, 3] + heel_target = toe_contact_position + heel_global_p - toe_global_p + + knee_global_R = pose.get_transform(knee_i, local=False)[:3, :3] + knee_global_R_y = knee_global_R @ np.array([0.0, 1.0, 0.0]) + + hip_local_rot, knee_local_rot = ik_two_bone_idx( + pose, + root_i, + hip_i, + knee_i, + heel_i, + heel_target, + knee_global_R_y, + ik_max_length_buffer, + ) + pose.set_transform(hip_i, conversions.R2T(hip_local_rot), local=True) + pose.set_transform(knee_i, conversions.R2T(knee_local_rot), local=True) + + """ Rotate heel so toe is facing toward contact point """ + heel_local_R = ik_look_at_idx(pose, knee_i, heel_i, toe_i, toe_contact_position) + pose.set_transform(heel_i, conversions.R2T(heel_local_R), local=True) + + """ Rotate toe bone so that the end of the toe does not intersect with the ground """ + heel_global_Rot = Rotation.from_matrix( + pose.get_transform(heel_i, local=False)[:3, :3] + ) + + toe_global_T = pose.get_transform(toe_i, local=False) + toe_global_R = toe_global_T[:3, :3] + toe_global_p = toe_global_T[:3, 3] + toe_global_Rot = Rotation.from_matrix(toe_global_R) + # toe_end_curr = toe_global_R @ (np.array([ik_toe_length, 0,0]) + toe_global_p) + toe_end_curr = toe_global_R @ (ik_toe_vector + toe_global_p) + toe_end_targ = toe_end_curr + toe_end_targ[1] = max(toe_end_targ[1], ik_foot_height) + + toe_local_Rot = Rotation.from_matrix(pose.get_transform(toe_i, local=True)[:3, :3]) + toe_local_R = ik_look_at( + toe_local_Rot, + heel_global_Rot, + toe_global_Rot, + toe_global_p, + toe_end_curr, + toe_end_targ, + ) + pose.set_transform(toe_i, conversions.R2T(toe_local_R), local=True) + + +def pose_foot_cleanup( + pose, contacts, fc_info, toe_chains, dt=1 / 30.0, debug_frame=None +): + for ci, (toe_i, contact) in enumerate(contacts.items()): + cur_joint_position = pose.get_transform(toe_i, local=False)[:3, 3] + cur_contact = fc_info[ci] + contact.update(cur_joint_position, cur_contact, dt=dt, debug_frame=debug_frame) + + """ Ensure contact position never goes through floor """ + contact_position_clamped = contact.contact_position + contact_position_clamped[1] = max( + contact_position_clamped[1], contact.ik_foot_height + ) + toe_vector = ( + pose.skel.get_joint(toe_i).child_joints[0].xform_from_parent_joint[:3, 3] + ) + # foot_cleanup_exact_point(pose, contact_position_clamped, toe_chains[ci], toe_i, contact.ik_toe_length, contact.ik_foot_height, contact.ik_max_length_buffer) + foot_cleanup_exact_point( + pose, + contact_position_clamped, + toe_chains[ci], + toe_i, + toe_vector, + contact.ik_foot_height, + contact.ik_max_length_buffer, + ) + + +def motion_foot_cleanup(motion, ref_foot_contact): + toe_chains = [] + for ci, (joint_i, contact) in enumerate(motion.contacts.items()): + toe_chain_i = [] + joint = motion.skel.joints[joint_i] + for _ in range(4): + parent = joint.parent_joint + parent_idx = motion.skel.get_index_joint(parent.name) + toe_chain_i.append(parent_idx) + joint = parent + + toe_chains.append(list(reversed(toe_chain_i))) + + for frame in range(motion.num_frames()): + pose = motion.poses[frame] + pose_foot_cleanup(pose, motion.contacts, ref_foot_contact[frame], toe_chains) + + +def poses_foot_cleanup(poses, contacts, ref_foot_contact): + skel = poses[0].skel + toe_chains = [] + for ci, (joint_i, contact) in enumerate(contacts.items()): + toe_chain_i = [] + joint = skel.joints[joint_i] + for _ in range(4): + parent = joint.parent_joint + parent_idx = skel.get_index_joint(parent.name) + toe_chain_i.append(parent_idx) + joint = parent + + toe_chains.append(list(reversed(toe_chain_i))) + + # print(toe_chains) + for frame, pose in enumerate(poses): + pose_foot_cleanup(pose, contacts, ref_foot_contact[frame], toe_chains) + + +# ====================== offline cleanup ====================== +def glue_foot( + motion, toe_chains, toe_i, mid, start, end, ik_foot_height=1, ik_toe_length=15 +): + bvh_scale = 100 + ik_max_length_buffer = 0.015 * bvh_scale + # ik_foot_height = 0.01 * bvh_scale + # ik_toe_length = 0.15 * bvh_scale + + contact_position_clamped = motion.poses[mid].get_transform(toe_i, local=False)[ + :3, 3 + ] + contact_position_clamped[1] = max(contact_position_clamped[1], ik_foot_height) + + for fi in range(start, end): + foot_cleanup_exact_point( + motion.poses[fi], + contact_position_clamped, + toe_chains, + toe_i, + ik_toe_length, + ik_foot_height, + ik_max_length_buffer, + ) + + +import copy + + +def foot_smooth_before( + motion, toe_chains, toe_i, start, mid, d, ik_foot_height=1, ik_toe_length=15 +): + bvh_scale = 100 + ik_max_length_buffer = 0.015 * bvh_scale + # ik_foot_height = 0.01 * bvh_scale + # ik_toe_length = 0.15 * bvh_scale + contact_position_clamped = motion.poses[mid].get_transform(toe_i, local=False)[ + :3, 3 + ] + contact_position_clamped[1] = max(contact_position_clamped[1], ik_foot_height) + + for i in range(1, d): + p = motion.poses[start - d + i] + glue_p = copy.deepcopy(p) + foot_cleanup_exact_point( + glue_p, + contact_position_clamped, + toe_chains, + toe_i, + ik_toe_length, + ik_foot_height, + ik_max_length_buffer, + ) + + t = 0.5 + 0.5 * np.cos(np.pi * i / d) + blend_p = motion_ops.blend(glue_p, p, t) + motion.poses[start - d + i] = blend_p + + +def foot_smooth_after( + motion, toe_chains, toe_i, end, mid, d, ik_foot_height=1, ik_toe_length=15 +): + bvh_scale = 100 + ik_max_length_buffer = 0.015 * bvh_scale + # ik_foot_height = 0.01 * bvh_scale + # ik_toe_length = 0.15 * bvh_scale + contact_position_clamped = motion.poses[mid].get_transform(toe_i, local=False)[ + :3, 3 + ] + contact_position_clamped[1] = max(contact_position_clamped[1], ik_foot_height) + + for i in range(1, d): + p = motion.poses[end + i - 1] + glue_p = copy.deepcopy(p) + foot_cleanup_exact_point( + glue_p, + contact_position_clamped, + toe_chains, + toe_i, + ik_toe_length, + ik_foot_height, + ik_max_length_buffer, + ) + + t = 0.5 - 0.5 * np.cos(np.pi * i / d) + blend_p = motion_ops.blend(glue_p, p, t) + motion.poses[end + i - 1] = blend_p + + +def motion_post_foot_cleanup(motion, contacts, toe_i): + sDuration, eDuration = 5, 5 + margin = 0 + + F = contacts.shape[0] + frameStart = 0 + mid = 0 + + joint = motion.skel.joints[toe_i] + toe_chains = [] + for _ in range(4): + parent = joint.parent_joint + parent_idx = motion.skel.get_index_joint(parent.name) + toe_chains.append(parent_idx) + joint = parent + + toe_chains = list(reversed(toe_chains)) + + for fi in range(1, F + 1): + conBefore = contacts[fi - 1] + conCurrent = (fi < F) and contacts[fi] + + if conBefore and (not conCurrent): + frameEnd = fi - 1 + mid = (frameStart + frameEnd) // 2 + start = min(mid, frameStart + margin) + end = max(mid, frameEnd + margin) + + print("foot glue: ", start, mid, end) + glue_foot(motion, toe_chains, toe_i, mid, start, end) + foot_smooth_before( + motion, toe_chains, toe_i, start, mid, min(start, sDuration) + ) + foot_smooth_after( + motion, toe_chains, toe_i, end, mid, min(F - 1 - end, eDuration) + ) + + elif (not conBefore) and conCurrent: + frameStart = fi + # in-place diff --git a/src/fairmotion/fairmotion/utils/spring_utils.py b/src/fairmotion/fairmotion/utils/spring_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..07ead9ce4fb15396068d82c2a8f4f1b512c425bb --- /dev/null +++ b/src/fairmotion/fairmotion/utils/spring_utils.py @@ -0,0 +1,171 @@ +# https://github.com/orangeduck/Motion-Matching/blob/main/spring.h + +PIf = 3.14159265358979323846 +LN2f = 0.69314718056 +from numpy.core.fromnumeric import repeat +from scipy.spatial.transform import Rotation +import numpy as np + + +def fast_negexp(x): + return 1.0 / (1.0 + x + 0.48 * x * x + 0.235 * x * x * x) + + +def halflife_to_damping(halflife, eps=1e-5): + return (4.0 * LN2f) / (halflife + eps) + + +def simple_spring_damper_implicit( + x, # vector + v, # vector + x_goal, # const float + halflife, # const float + dt, # const float +): + y = halflife_to_damping(halflife) / 2.0 + j0 = x - x_goal + j1 = v + j0 * y + eydt = fast_negexp(y * dt) + + x = eydt * (j0 + j1 * dt) + x_goal + v = eydt * (v - j1 * y * dt) + return x, v + + +def simple_spring_damper_implicit_a( + x, # vector + v, # vector + a, # vector + v_goal, # vector + halflife, # float + dt, # float +): + y = halflife_to_damping(halflife) / 2.0 + j0 = v - v_goal + j1 = a + j0 * y + eydt = fast_negexp(y * dt) + + x = ( + eydt * (((-j1) / (y * y)) + ((-j0 - j1 * dt) / y)) + + (j1 / (y * y)) + + j0 / y + + v_goal * dt + + x + ) + v = eydt * (j0 + j1 * dt) + v_goal + a = eydt * (a - j1 * y * dt) + + return x, v, a + + +def simple_spring_damper_implicit_quat( + x, # quat& + v, # vec3& + x_goal, # const quat + halflife, # const float + dt, # const float +): + y = halflife_to_damping(halflife) / 2.0 + j0 = Rotation.from_matrix(x @ np.linalg.inv(x_goal)).as_rotvec() + # j0 = quat_to_scaled_angle_axis(quat_abs(quat_mul(x, quat_inv(x_goal)))) + j1 = v + j0 * y + + eydt = fast_negexp(y * dt) + + x = Rotation.from_rotvec(eydt * (j0 + j1 * dt)).as_matrix() @ x_goal + # x = quat_mul(quat_from_scaled_angle_axis(eydt*(j0 + j1*dt)), x_goal) + v = eydt * (v - j1 * y * dt) + return x, v + + +def decay_spring_damper_implicit_vector( + x, v, halflife, dt # vec3& # vec3& # const float # const float +): + y = halflife_to_damping(halflife) / 2.0 + j1 = v + x * y # [3] + eydt = fast_negexp(y * dt) + + x = eydt * (x + j1 * dt) + v = eydt * (v - j1 * y * dt) + return x, v + + +def inertialize_transition( + off_x, # vec3& + off_v, # vec3& + src_x, # const vec3 + src_v, # const vec3 + dst_x, # const vec3 + dst_v, # const vec3 +): + off_x = (src_x + off_x) - dst_x + off_v = (src_v + off_v) - dst_v + return off_x, off_v + + +def inertialize_update( + out_x, # vec3& + out_v, # vec3& + off_x, # vec3& + off_v, # vec3& + in_x, # const vec3 + in_v, # const vec3 + halflife, # const float + dt, # const float +): + off_x, off_v = decay_spring_damper_implicit_vector(off_x, off_v, halflife, dt) + out_x = in_x + off_x + out_v = in_v + off_v + return out_x, out_v, off_x, off_v + + +def spring_character_predict_pos(x, v, count, x_goal, halflife, dt): + px = x[None, ...].repeat(count, 0) + pv = v[None, ...].repeat(count, 0) + + for i in range(count): + px[i], pv[i] = simple_spring_damper_implicit( + px[i], pv[i], x_goal, halflife, (i + 1) * dt + ) + + return px, pv + + +def spring_character_predict_vel( + x, # vector + v, # vector + a, # vector + count, # int + v_goal, # vector + halflife, # float + dt, # float +): + px = x[None, ...].repeat(count, 0) + pv = v[None, ...].repeat(count, 0) + pa = a[None, ...].repeat(count, 0) + + for i in range(count): + px[i], pv[i], pa[i] = simple_spring_damper_implicit_a( + px[i], pv[i], pa[i], v_goal, halflife, (i + 1) * dt + ) + + return px, pv, pa + + +def spring_character_predict_quat( + x, # quat + v, # vector + count, # int + x_goal, # quat + halflife, # float + dt, # float +): + px = x[None, ...].repeat(count, 0) + pv = v[None, ...].repeat(count, 0) + + for i in range(count): + px[i], pv[i] = simple_spring_damper_implicit_quat( + px[i], pv[i], x_goal, halflife, (i + 1) * dt + ) + + return px, pv diff --git a/src/fairmotion/fairmotion/utils/utils.py b/src/fairmotion/fairmotion/utils/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..0503bc18e0fab91349c00456d2f4b88bc6d42837 --- /dev/null +++ b/src/fairmotion/fairmotion/utils/utils.py @@ -0,0 +1,130 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +import numpy as np +import os +from functools import partial +from multiprocessing import Pool +import random + + +def str_to_axis(s): + if s == "x": + return np.array([1.0, 0.0, 0.0]) + elif s == "y": + return np.array([0.0, 1.0, 0.0]) + elif s == "z": + return np.array([0.0, 0.0, 1.0]) + else: + raise Exception + + +def axis_to_str(a): + if np.array_equal(a, [1.0, 0.0, 0.0]): + return "x" + elif np.array_equal(a, [0.0, 1.0, 0.0]): + return "y" + elif np.array_equal(a, [0.0, 0.0, 1.0]): + return "z" + else: + raise Exception + + +def get_index(index_dict, key): + if isinstance(key, int): + return key + elif isinstance(key, str): + return index_dict[key] + else: + return index_dict[key.name] + + +def run_parallel(func, iterable, num_cpus=20, **kwargs): + """ + Run function over multiple cpus. The function must be written such that + it processes single input value. + + Args: + func: Method that is run in parallel. The first argument of func + accepts input values from iterable. + iterable: List of input values that func is executed over. + num_cpus: Number of cpus used by multiprocessing. + kwargs: Dictionary of keyword arguments that is passed on to each + parallel call to the function + + Returns: + Flattened list of results from running the function on iterable + arguments + """ + func_with_kwargs = partial(func, **kwargs) + with Pool(processes=num_cpus) as pool: + results = pool.map(func_with_kwargs, iterable) + return results + + +def files_in_dir( + path, + ext=None, + keyword=None, + sort=False, + sample_mode=None, + sample_num=None, + keywords_exclude=[], +): + """Returns list of files in `path` directory. + + Args: + path: Path to directory to list files from + ext: Extension of files to be listed + keyword: Return file if filename contains `keyword` + sort: Sort files by filename in the returned list + sample_mode: str; Use this option to return subset of files from `path` + directory. `sample_mode` takes values 'sequential' to return first + `sample_num` files, or 'shuffle' to return `sample_num` number of + files randomly + sample_num: Number of files to return + exclude: the files in this this are excluded + """ + files = [] + # r=root, d=directories, f = files + for r, d, f in os.walk(path): + for file in f: + add = True + if ext is not None and not file.endswith(ext): + add = False + if keyword is not None and keyword not in file: + add = False + for ke in keywords_exclude: + if ke in file: + add = False + break + if add: + files.append(os.path.join(r, file)) + if sort: + files.sort() + + if sample_num is None: + sample_num = len(files) + else: + sample_num = min(sample_num, len(files)) + + if sample_mode is None: + pass + elif sample_mode == "sequential": + files = files[:sample_num] + elif sample_mode == "shuffle": + files = random.shuffle(files)[:sample_num] + else: + raise NotImplementedError + + return files + + +def _apply_fn_agnostic_to_vec_mat(input, fn): + output = np.array([input]) if input.ndim == 1 else input + output = np.apply_along_axis(fn, 1, output) + return output[0] if input.ndim == 1 else output + + +def create_dir_if_absent(path): + if not os.path.exists(path): + os.makedirs(path) diff --git a/src/fairmotion/setup.py b/src/fairmotion/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..2a0eaf9ce5d2d7b49651ef594eaa2aff32c68115 --- /dev/null +++ b/src/fairmotion/setup.py @@ -0,0 +1,33 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +from setuptools import find_packages, setup + +setup( + name="fairmotion", + version="0.0.4", + description="fairmotion is FAIR's library for human motion research", + url="https://github.com/facebookresearch/fairmotion", + author="FAIR Pittsburgh", + author_email="dgopinath@fb.com", + install_requires=[ + "black", + "dataclasses", # py3.6 backport required by human_body_prior + # "matplotlib", + "numpy", + "pillow", + # pyrender==0.1.39", + "scikit-learn", + "scipy", + "torch", # ==1.6.0", + "tqdm", + "PyOpenGL==3.1.0", + # "body_visualizer",# @ git+https://github.com/nghorbani/body_visualizer.git@be9cf756f8d1daed870d4c7ad1aa5cc3478a546c", + # "human_body_prior",# @ git+https://github.com/nghorbani/human_body_prior.git@0278cb45180992e4d39ba1a11601f5ecc53ee148", + ], + packages=find_packages(exclude=["tests"]), + classifiers=[ + "License :: OSI Approved :: BSD License", + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", + ], +) diff --git a/src/mdm/.gitignore b/src/mdm/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e19082bd7e7aedb91984a18b6ad9fc4319f7b8ca --- /dev/null +++ b/src/mdm/.gitignore @@ -0,0 +1,142 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +save/ +wandb/ +t2m/ +body_models/ +glove/ +slurm**/ +*.out +*.err +*.slurm +.vscode/ + +output/ \ No newline at end of file diff --git a/src/mdm/DiP.md b/src/mdm/DiP.md new file mode 100644 index 0000000000000000000000000000000000000000..08849e9a5e7ad3dfa3df87dd5c5afafc96d03561 --- /dev/null +++ b/src/mdm/DiP.md @@ -0,0 +1,192 @@ +# DiP + + +Diffusion Planner (DiP) is an ultra-fast text-to-motion diffusion model. It is our newest version of [MDM](README.md)! It was published in the CLoSD paper [ICLR 2025 Spotlight]. To read more about it, check out the [CLoSD project page](https://guytevet.github.io/CLoSD-page/) and [code](https://github.com/GuyTevet/CLoSD). + + +![DiP](https://github.com/GuyTevet/mdm-page/raw/main/static/figures/dip_vis_caption_small.gif) + + + + +## Performance + + +![dip_spec](assets/dip_spec.png) + + +### Why is DiP so fast? Here's the TL;DR: + + +- DiP is autoregressive, it predicts the next 2 seconds of motion at each call. +- DiP uses only 10 diffusion steps (It performs well even with 5 steps). + + +## Results + + +The official results of MDM and DiP to cite in your paper: + + +![fixed_results](assets/fixed_results.png) + + +- Blue marks entries from the original paper that have been corrected. +- You can use [this](assets/fixed_results.tex) `.tex` file. + + + + +## Bibtex + + + + +``` +MDM: + + +@inproceedings{ +tevet2023human, +title={Human Motion Diffusion Model}, +author={Guy Tevet and Sigal Raab and Brian Gordon and Yoni Shafir and Daniel Cohen-or and Amit Haim Bermano}, +booktitle={The Eleventh International Conference on Learning Representations }, +year={2023}, +url={https://openreview.net/forum?id=SJ1kSyO2jwu} +} + + +DiP and CLoSD: + + +@article{tevet2024closd, + title={CLoSD: Closing the Loop between Simulation and Diffusion for multi-task character control}, + author={Tevet, Guy and Raab, Sigal and Cohan, Setareh and Reda, Daniele and Luo, Zhengyi and Peng, Xue Bin and Bermano, Amit H and van de Panne, Michiel}, + journal={arXiv preprint arXiv:2410.03441}, + year={2024} +} +``` + + + + + + +## Architecture + + +- DiP is a transformer decoder. +- It encode the text using a fixed [DistilBERT](https://huggingface.co/docs/transformers/en/model_doc/distilbert). +- It enables additional target location condition, that was used in [CLoSD](https://guytevet.github.io/CLoSD-page/) for object interaction. +- At each diffusion step, it gets the prefix (clean) and the prediction, noised to `t`. +- For the full implementation details, check out [the paper](https://arxiv.org/abs/2410.03441). + + +![dip_spec](assets/dip_arch_small.png) + + + + + + +## Setup + + +Follow the setup instructions of [MDM](README.md), then download the checkpoints and place them at `save/` + + +### Model Checkpoints + + +[DiP](https://huggingface.co/guytevet/CLoSD/tree/main/checkpoints/dip/DiP_no-target_10steps_context20_predict40) For text-to-motion. +- Identical to the one in CLoSD. + + +[DiP with target conditioning](https://drive.google.com/file/d/1PsilP2xhcOHHXkmtxtOwNbWeI0njU2ic/view?usp=sharing) For the CLoSD applications. +- Slightly different from the one in CLoSD, as it supports both with and without target conditioning. + + +- **Note:** DiP code is also included in the [CLoSD code base](https://github.com/GuyTevet/CLoSD). If you would like to run the full CLoSD system you better use it instead. + + + + +## Demo + +It would be amazing to have one (we don’t yet 😬). Create one, and eternal glory shall be yours! + + +## Generate + + +```shell +python -m sample.generate \ + --model_path save/target_10steps_context20_predict40/model000200000.pt \ + --autoregressive --guidance_param 7.5 +``` + + +- This will use prompts from the dataset. +- In case you want to use your own prompt, add `--text_prompt "A person throws a ball."`. +- In case you want to change the prompt on the fly, add `--dynamic_text_path assets/example_dynamic_text_prompts.txt`. Here, each line corresponds to a single prediction, i.e. two seconds of motion. +- **Note:** The initial prefix will still be sampled from the data. For example, if you ask the person to throw a ball and you happen to sample a sitting prefix, it will first need to get up before throwing. + + +**You may also define:** + + +* `--num_samples` (default is 10) / `--num_repetitions` (default is 3). +* `--device` id. +* `--seed` to sample different prompts. +* `--motion_length` (text-to-motion only) in seconds. + + +**Running those will get you:** + + +* `results.npy` file with text prompts and xyz positions of the generated animation +* `sample##_rep##.mp4` - a stick figure animation for each generated motion. + + +## Evaluate + + +The evaluation results can be found in the `.log` file of each checkpoint dir. +To reproduce it, run: + + +```shell +python -m eval.eval_humanml --model_path save/DiP_no-target_10steps_context20_predict40/model000600343.pt --autoregressive --guidance_param 7.5 +``` + + +**You may also define:** +* `--train_platform_type WandBPlatform` to log the results in WanDB. +* `--eval_mode mm_short` to calculate the multimodality metric. + + + + +## Train your own DiP + + +To reproduce DiP, run: + + +```shell +python -m train.train_mdm\ +--save_dir save/my_humanml_DiP \ +--dataset humanml --arch trans_dec --text_encoder_type bert \ +--diffusion_steps 10 --context_len 20 --pred_len 40 \ +--mask_frames --use_ema --autoregressive --gen_guidance_param 7.5 +``` + + +* **Recommended:** Add `--eval_during_training` and `--gen_during_training` to evaluate and generate motions for each saved checkpoint. + This will slow down training but will give you better monitoring. +* **Recommended:** Add `--use_ema` for Exponential Moving Average, and `--mask_frames` to fix a masking bug. Both improve performance. +* To add target conditioning for the CLoSD applications, add `--lambda_target_loc 1.`. +* Use `--device` to define GPU id. +* Use `--arch` to choose one of the architectures reported in the paper `{trans_enc, trans_dec, gru}` (`trans_enc` is the default). +* Use `--text_encoder_type` to choose the text encoder `{clip, bert}` (`clip` is default). +* Add `--train_platform_type {WandBPlatform, TensorboardPlatform}` to track results with either [WandB](https://wandb.ai/site/) or [Tensorboard](https://www.tensorflow.org/tensorboard). diff --git a/src/mdm/LICENSE b/src/mdm/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..54055df7f1b68c2a10a2de314e160182de405e91 --- /dev/null +++ b/src/mdm/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Guy Tevet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/mdm/README.md b/src/mdm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..30fbcf2e24c261c1396a01fa4db766f5013f9623 --- /dev/null +++ b/src/mdm/README.md @@ -0,0 +1,577 @@ +# MDM: Human Motion Diffusion Model + +## About This Modified Version + +This repository is a modified version of the original Motion Diffusion Model (MDM) codebase. +The main purpose of this version is to train and sample diffusion models over preprocessed latent `z` features, rather than directly using the original MDM motion-space training pipeline. + +The added latent-z workflow includes: + +- `train/train_mdm_preproc.py`: trains MDM on preprocessed posterior `.pt` files. +- `data_loaders/preprocessed_posterior_loader.py`: loads posterior samples and converts them to the tensor format expected by MDM. +- `sample/sample_z.py`: samples raw latent `z` features from text prompts for use with an external decoder. +- `eval/eval_humanml_preproc.py`: generates predicted latent `z` files for offline evaluation. + +### Latent-z Training + +Work in progress. + +### Latent-z Evaluation + +The evaluation script generates predicted latent `z` files. These files are intended for the downstream decoder/evaluation pipeline. + +Work in progress. + +The original MDM README is kept below for environment setup, dependency downloads, and background reference. +For external assets such as SMPL files, GloVe files, and T2M evaluators, please follow the original setup instructions in the **Getting started** section below: + +```bash +bash prepare/download_smpl_files.sh +bash prepare/download_glove.sh +bash prepare/download_t2m_evaluators.sh +``` + +These scripts create the expected asset directories, including `body_models/smpl/`, `glove/`, `t2m/`, and `kit/`. +Do not commit local symbolic links such as `smpl`, `glove`, or `t2m`; they are machine-specific and can be regenerated from the original MDM setup scripts. + + +[![arXiv](https://img.shields.io/badge/arXiv-<2209.14916>-.svg)](https://arxiv.org/abs/2209.14916) + + +The official PyTorch implementation of the paper [**"Human Motion Diffusion Model"**](https://arxiv.org/abs/2209.14916). + +Please visit our [**webpage**](https://guytevet.github.io/mdm-page/) for more details. + +![teaser](https://github.com/GuyTevet/mdm-page/raw/main/static/figures/github.gif) + +## MDM is now 40X faster 🤩🤩🤩 (~0.4 sec/sample) + +### How come?!? + +(1) We released the [50 diffusion steps model](https://drive.google.com/file/d/1cfadR1eZ116TIdXK7qDX1RugAerEiJXr/view?usp=sharing) (instead of 1000 steps) which runs 20X faster with comparable results. + +(2) [Calling CLIP just once and caching the result](https://github.com/GuyTevet/motion-diffusion-model/commit/94c173ff8bb11362e45dd9262751f07bf9293660) runs 2X faster for all models. Please pull. + +## MDM results on *HumanML3D* to cite in your paper (The original model used in the MDM paper) + +Performance improvement is due to an evaluation bug fix. BLUE marks fixed entries compared to the paper. +![fixed_results](assets/fixed_results.png) + +- You can use [this](assets/fixed_results.tex) `.tex` file. +- The fixed **KIT** results are available [here](https://github.com/GuyTevet/motion-diffusion-model/issues/211#issue-2369160290). + + +## [NEW] DiP: Ultra-fast Text-to-motion + +### DiP is now part of the MDM code base! + +### [Here's how to use it](DiP.md) + +![DiP](https://github.com/GuyTevet/mdm-page/raw/main/static/figures/dip_vis_caption_small.gif) + + + +## Bibtex + +If you find this code useful in your research, please cite: + +``` +MDM: + +@inproceedings{ +tevet2023human, +title={Human Motion Diffusion Model}, +author={Guy Tevet and Sigal Raab and Brian Gordon and Yoni Shafir and Daniel Cohen-or and Amit Haim Bermano}, +booktitle={The Eleventh International Conference on Learning Representations }, +year={2023}, +url={https://openreview.net/forum?id=SJ1kSyO2jwu} +} + +DiP and CLoSD: + +@article{tevet2024closd, + title={CLoSD: Closing the Loop between Simulation and Diffusion for multi-task character control}, + author={Tevet, Guy and Raab, Sigal and Cohan, Setareh and Reda, Daniele and Luo, Zhengyi and Peng, Xue Bin and Bermano, Amit H and van de Panne, Michiel}, + journal={arXiv preprint arXiv:2410.03441}, + year={2024} +} +``` + +## News + +📢 **12/Feb/25** - Added many things: + * [The DiP model](DiP.md) + * MDM with DistilBERT text encoder (Add `--text_encoder_type bert`) + * Developed by the legendary [Roy Kapon](https://scholar.google.com/citations?user=FAQOuSgAAAAJ&hl=en)! + * `--gen_during_training` feature. + * `--mask_frames` bug fix. + * `--use_ema` Weight averaging using Exponential Moving Average. + * Dataset caching for faster loading (by default). + * `eval_humanml` script can be logged with WanDB. + +📢 **29/Jan/25** - Added WandB support with `--train_platform_type WandBPlatform`. + +📢 **15/Apr/24** - Released a [50 diffusion steps model](https://drive.google.com/file/d/1cfadR1eZ116TIdXK7qDX1RugAerEiJXr/view?usp=sharing) (instead of 1000 steps) which runs 20X faster 🤩🤩🤩 with comparable results. + +📢 **12/Apr/24** - MDM inference is now 2X faster 🤩🤩🤩 This was made possible by [calling CLIP just once and caching the result](https://github.com/GuyTevet/motion-diffusion-model/commit/94c173ff8bb11362e45dd9262751f07bf9293660), and is backward compatible with older models. + +📢 **25/Jan/24** - Fixed bug in evalutation code (#182) - Please use the fixed results when citing MDM.
+ +📢 **1/Jun/23** - Fixed generation issue (#104) - Please pull to improve generation results. + +📢 **23/Nov/22** - Fixed evaluation issue (#42) - Please pull and run `bash prepare/download_t2m_evaluators.sh` from the top of the repo to adapt. + +📢 **4/Nov/22** - Added sampling, training and evaluation of unconstrained tasks. + Note slight env changes adapting to the new code. If you already have an installed environment, run `bash prepare/download_unconstrained_assets.sh; conda install -y -c anaconda scikit-learn +` to adapt. + +📢 **3/Nov/22** - Added in-between and upper-body editing. + +📢 **31/Oct/22** - Added sampling, training and evaluation of action-to-motion tasks. + +📢 **9/Oct/22** - Added training and evaluation scripts. + Note slight env changes adapting to the new code. If you already have an installed environment, run `bash prepare/download_glove.sh; pip install clearml` to adapt. + +📢 **6/Oct/22** - First release - sampling and rendering using pre-trained models. + + +## Checkout MDM Follow-ups (partial list) + +🐔 [LoRA-MDM](https://haimsaw.github.io/LoRA-MDM/) - Promptly adapt MDM for stylized text-to-motion. + +🦩 [AnyTop](https://anytop2025.github.io/Anytop-page/) - Character Animation Diffusion with Any Topology. + +🥋 [CLoSD](https://guytevet.github.io/CLoSD-page/) - Real-time MDM controls the character in a physical simulation. + +🐉 [SinMDM](https://sinmdm.github.io/SinMDM-page/) - Learns single motion motifs - even for non-humanoid characters. + +👯 [PriorMDM](https://priormdm.github.io/priorMDM-page/) - Uses MDM as a generative prior, enabling new generation tasks with few examples or even no data at all. + +💃 [MAS](https://guytevet.github.io/mas-page/) - Generating intricate 3D motions (including non-humanoid) using 2D diffusion models trained on in-the-wild videos. + +🐒 [MoMo](https://monkeyseedocg.github.io/) - Monkey See, Monkey Do: Harnessing Self-attention in Motion Diffusion +for Zero-shot Motion Transfer + +🏃 [CAMDM](https://github.com/AIGAnimation/CAMDM) - Taming Diffusion Probabilistic Models for Character Control - a real-time version of MDM. + + +## Getting started + +This code was tested on `Ubuntu 18.04.5 LTS` and requires: + +* Python 3.7 +* conda3 or miniconda3 +* CUDA capable GPU (one is enough) + +### 1. Setup environment + +Install ffmpeg (if not already installed): + +```shell +sudo apt update +sudo apt install ffmpeg +``` +For windows use [this](https://www.geeksforgeeks.org/how-to-install-ffmpeg-on-windows/) instead. + +Setup conda env: +```shell +conda env create -f environment.yml +conda activate mdm +python -m spacy download en_core_web_sm +pip install git+https://github.com/openai/CLIP.git +``` + +Download dependencies: + +
+ Text to Motion + +```bash +bash prepare/download_smpl_files.sh +bash prepare/download_glove.sh +bash prepare/download_t2m_evaluators.sh +``` +
+ +
+ Action to Motion + +```bash +bash prepare/download_smpl_files.sh +bash prepare/download_recognition_models.sh +``` +
+ +
+ Unconstrained + +```bash +bash prepare/download_smpl_files.sh +bash prepare/download_recognition_models.sh +bash prepare/download_recognition_unconstrained_models.sh +``` +
+ +### 2. Get data + +**Text to Motion** + +[Download HumanML3D](https://drive.google.com/drive/folders/1OZrTlAGRvLjXhXwnRiOC-oxYry1vf-Uu?usp=drive_link) + +Or, alternatively, parse the data yourself according to the original instructions: + + +
+ Original Text to Motion instructions + +There are two paths to get the data: + +(a) **Go the easy way if** you just want to generate text-to-motion (excluding editing which does require motion capture data) + +(b) **Get full data** to train and evaluate the model. + + +#### a. The easy way (text only) + +**HumanML3D** - Clone HumanML3D, then copy the data dir to our repository: + +```shell +cd .. +git clone https://github.com/EricGuo5513/HumanML3D.git +unzip ./HumanML3D/HumanML3D/texts.zip -d ./HumanML3D/HumanML3D/ +cp -r HumanML3D/HumanML3D motion-diffusion-model/dataset/HumanML3D +cd motion-diffusion-model +``` + + +#### b. Full data (text + motion capture) + +**HumanML3D** - Follow the instructions in [HumanML3D](https://github.com/EricGuo5513/HumanML3D.git), +then copy the result dataset to our repository: + +```shell +cp -r ../HumanML3D/HumanML3D ./dataset/HumanML3D +``` + +**KIT** - Download from [HumanML3D](https://github.com/EricGuo5513/HumanML3D.git) (no processing needed this time) and the place result in `./dataset/KIT-ML` +
+ +
+ Action to Motion + +**UESTC, HumanAct12** +```bash +bash prepare/download_a2m_datasets.sh +``` +
+ +
+ Unconstrained + +**HumanAct12** +```bash +bash prepare/download_unconstrained_datasets.sh +``` +
+ +### 3. Download the pretrained models + +Download the model(s) you wish to use, then unzip and place them in `./save/`. + +
+ Text to Motion + +**You need only the first one.** + +**HumanML3D** + +[NEW!] [humanml_trans_dec_512_bert-50steps](https://drive.google.com/file/d/1z5IW5Qa9u9UdkckKylkcSXCwIYgLPhIC/view?usp=sharing) - Runs 20X faster with improved precision! + +[NEW!] [humanml-encoder-512-50steps](https://drive.google.com/file/d/1cfadR1eZ116TIdXK7qDX1RugAerEiJXr/view?usp=sharing) - Runs 20X faster with comparable performance! + +[humanml-encoder-512](https://drive.google.com/file/d/1PE0PK8e5a5j-7-Xhs5YET5U5pGh0c821/view?usp=sharing) (best model used in the paper) + +[humanml-decoder-512](https://drive.google.com/file/d/1q3soLadvVh7kJuJPd2cegMNY2xVuVudj/view?usp=sharing) + +[humanml-decoder-with-emb-512](https://drive.google.com/file/d/1GnsW0K3UjuOkNkAWmjrGIUmeDDZrmPE5/view?usp=sharing) + +**KIT** + +[kit-encoder-512](https://drive.google.com/file/d/1SHCRcE0es31vkJMLGf9dyLe7YsWj7pNL/view?usp=sharing) + +
+ +
+ Action to Motion + +**UESTC** + +[uestc](https://drive.google.com/file/d/1goB2DJK4B-fLu2QmqGWKAqWGMTAO6wQ6/view?usp=sharing) + +[uestc_no_fc](https://drive.google.com/file/d/1fpv3mR-qP9CYCsi9CrQhFqlLavcSQky6/view?usp=sharing) + +**HumanAct12** + +[humanact12](https://drive.google.com/file/d/154X8_Lgpec6Xj0glEGql7FVKqPYCdBFO/view?usp=sharing) + +[humanact12_no_fc](https://drive.google.com/file/d/1frKVMBYNiN5Mlq7zsnhDBzs9vGJvFeiQ/view?usp=sharing) + +
+ +
+ Unconstrained + +**HumanAct12** + +[humanact12_unconstrained](https://drive.google.com/file/d/1uG68m200pZK3pD-zTmPXu5XkgNpx_mEx/view?usp=share_link) + +
+ + +## Motion Synthesis +
+ Text to Motion + +### Generate from test set prompts + +```shell +python -m sample.generate --model_path ./save/humanml_trans_enc_512/model000200000.pt --num_samples 10 --num_repetitions 3 +``` + +### Generate from your text file + +```shell +python -m sample.generate --model_path ./save/humanml_trans_enc_512/model000200000.pt --input_text ./assets/example_text_prompts.txt +``` + +### Generate a single prompt + +```shell +python -m sample.generate --model_path ./save/humanml_trans_enc_512/model000200000.pt --text_prompt "the person walked forward and is picking up his toolbox." +``` +
+ +
+ Action to Motion + +### Generate from test set actions + +```shell +python -m sample.generate --model_path ./save/humanact12/model000350000.pt --num_samples 10 --num_repetitions 3 +``` + +### Generate from your actions file + +```shell +python -m sample.generate --model_path ./save/humanact12/model000350000.pt --action_file ./assets/example_action_names_humanact12.txt +``` + +### Generate a single action + +```shell +python -m sample.generate --model_path ./save/humanact12/model000350000.pt --action_name "drink" +``` +
+ +
+ Unconstrained + +```shell +python -m sample.generate --model_path ./save/unconstrained/model000450000.pt --num_samples 10 --num_repetitions 3 +``` + +By abuse of notation, (num_samples * num_repetitions) samples are created, and are visually organized in a display of num_samples rows and num_repetitions columns. + +
+ +**You may also define:** +* `--device` id. +* `--seed` to sample different prompts. +* `--motion_length` (text-to-motion only) in seconds (maximum is 9.8[sec]). + +**Running those will get you:** + +* `results.npy` file with text prompts and xyz positions of the generated animation +* `sample##_rep##.mp4` - a stick figure animation for each generated motion. + +It will look something like this: + +![example](assets/example_stick_fig.gif) + +You can stop here, or render the SMPL mesh using the following script. + +### Render SMPL mesh + +To create SMPL mesh per frame run: + +```shell +python -m visualize.render_mesh --input_path /path/to/mp4/stick/figure/file +``` + +**This script outputs:** +* `sample##_rep##_smpl_params.npy` - SMPL parameters (thetas, root translations, vertices and faces) +* `sample##_rep##_obj` - Mesh per frame in `.obj` format. + +**Notes:** +* The `.obj` can be integrated into Blender/Maya/3DS-MAX and rendered using them. +* This script is running [SMPLify](https://smplify.is.tue.mpg.de/) and needs GPU as well (can be specified with the `--device` flag). +* **Important** - Do not change the original `.mp4` path before running the script. + +**Notes for 3d makers:** +* You have two ways to animate the sequence: + 1. Use the [SMPL add-on](https://smpl.is.tue.mpg.de/index.html) and the theta parameters saved to `sample##_rep##_smpl_params.npy` (we always use beta=0 and the gender-neutral model). + 1. A more straightforward way is using the mesh data itself. All meshes have the same topology (SMPL), so you just need to keyframe vertex locations. + Since the OBJs are not preserving vertices order, we also save this data to the `sample##_rep##_smpl_params.npy` file for your convenience. + +## Motion Editing + +* This feature is available for text-to-motion datasets (HumanML3D and KIT). +* In order to use it, you need to acquire the full data (not just the texts). +* We support the two modes presented in the paper: `in_between` and `upper_body`. + +### Unconditioned editing + +```shell +python -m sample.edit --model_path ./save/humanml_trans_enc_512/model000200000.pt --edit_mode in_between +``` + +**You may also define:** +* `--num_samples` (default is 10) / `--num_repetitions` (default is 3). +* `--device` id. +* `--seed` to sample different prompts. +* `--edit_mode upper_body` For upper body editing (lower body is fixed). + + +The output will look like this (blue frames are from the input motion; orange were generated by the model): + +![example](assets/in_between_edit.gif) + +* As in *Motion Synthesis*, you may follow the **Render SMPL mesh** section to obtain meshes for your edited motions. + +### Text conditioned editing + +Just add the text conditioning using `--text_condition`. For example: + +```shell +python -m sample.edit --model_path ./save/humanml_trans_enc_512/model000200000.pt --edit_mode upper_body --text_condition "A person throws a ball" +``` + +The output will look like this (blue joints are from the input motion; orange were generated by the model): + +![example](assets/upper_body_edit.gif) + +## Train your own MDM + +
+ Text to Motion + +**HumanML3D** + +To reproduce the original paper model, run: + +```shell +python -m train.train_mdm --save_dir save/my_humanml_trans_enc_512 --dataset humanml +``` + +To reproduce MDM-50 steps, Run: + +```shell +python -m train.train_mdm --save_dir save/my_humanml_trans_enc_512_50steps --dataset humanml --diffusion_steps 50 --mask_frames --use_ema +``` + +To reproduce MDM+DistilBERT, Run: + +```shell +python -m train.train_mdm --save_dir save/my_humanml_trans_dec_bert_512 --dataset humanml --diffusion_steps 50 --arch trans_dec --text_encoder_type bert --mask_frames --use_ema +``` + + +**KIT** +```shell +python -m train.train_mdm --save_dir save/my_kit_trans_enc_512 --dataset kit +``` +
+
+ Action to Motion + +```shell +python -m train.train_mdm --save_dir save/my_name --dataset {humanact12,uestc} --cond_mask_prob 0 --lambda_rcxyz 1 --lambda_vel 1 --lambda_fc 1 +``` +
+ +
+ Unconstrained + +```shell +python -m train.train_mdm --save_dir save/my_name --dataset humanact12 --cond_mask_prob 0 --lambda_rcxyz 1 --lambda_vel 1 --lambda_fc 1 --unconstrained +``` +
+ + +* **Recommended:** Add `--eval_during_training` and `--gen_during_training` to evaluate and generate motions for each saved checkpoint. + This will slow down training but will give you better monitoring. +* **Recommended:** Add `--use_ema` for Exponential Moving Average, and `--mask_frames` to fix a masking bug. Both improve performance. +* Use `--diffusion_steps 50` to train the faster model with less diffusion steps. +* Use `--device` to define GPU id. +* Use `--arch` to choose one of the architectures reported in the paper `{trans_enc, trans_dec, gru}` (`trans_enc` is default). +* Use `--text_encoder_type` to choose the text encoder `{clip, bert}` (`clip` is default). +* Add `--train_platform_type {WandBPlatform, TensorboardPlatform}` to track results with either [WandB](https://wandb.ai/site/) or [Tensorboard](https://www.tensorflow.org/tensorboard). + + +## Evaluate + +
+ Text to Motion + + +* The output of this script for the pre-trained models (as was reported in the paper) is provided in the checkpoints zip file. + +**HumanML3D** +```shell +python -m eval.eval_humanml --model_path ./save/humanml_trans_enc_512/model000475000.pt +``` + +**KIT** +```shell +python -m eval.eval_humanml --model_path ./save/kit_trans_enc_512/model000400000.pt +``` +
+ +
+ Action to Motion + +* Takes about 7 hours for UESTC and 2 hours for HumanAct12 (on a single GPU) +* The output of this script for the pre-trained models (as was reported in the paper) is provided in the checkpoints zip file. + +```shell +python -m eval.eval_humanact12_uestc --model --eval_mode full +``` +where `path-to-model-ckpt` can be a path to any of the pretrained action-to-motion models listed above, or to a checkpoint trained by the user. + +
+ + +
+ Unconstrained + +* Takes about 3 hours (on a single GPU) + +```shell +python -m eval.eval_humanact12_uestc --model ./save/unconstrained/model000450000.pt --eval_mode full +``` + +Precision and recall are not computed to save computing time. If you wish to compute them, edit the file eval/a2m/gru_eval.py and change the string `fast=True` to `fast=False`. + +
+ +## Acknowledgments + +This code is standing on the shoulders of giants. We want to thank the following contributors +that our code is based on: + +[guided-diffusion](https://github.com/openai/guided-diffusion), [MotionCLIP](https://github.com/GuyTevet/MotionCLIP), [text-to-motion](https://github.com/EricGuo5513/text-to-motion), [actor](https://github.com/Mathux/ACTOR), [joints2smpl](https://github.com/wangsen1312/joints2smpl), [MoDi](https://github.com/sigal-raab/MoDi). + +## License +This code is distributed under an [MIT LICENSE](LICENSE). + +Note that our code depends on other libraries, including CLIP, SMPL, SMPL-X, PyTorch3D, and uses datasets that each have their own respective licenses that must also be followed. diff --git a/src/mdm/assets/dip_arch_small.png b/src/mdm/assets/dip_arch_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7372ac503ba8cdb9e55f4b5adc439e49c7e2a616 --- /dev/null +++ b/src/mdm/assets/dip_arch_small.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3677a0c51dfeef0feccb797bbe40f88fd3629be4cbba73f80f1bd54a0ff7e981 +size 253113 diff --git a/src/mdm/assets/dip_spec.png b/src/mdm/assets/dip_spec.png new file mode 100644 index 0000000000000000000000000000000000000000..e07a3df09473f8267ca41e15650da205b009985f --- /dev/null +++ b/src/mdm/assets/dip_spec.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae1355795369f52580f50bc915e8a9fd845cde00b6b1194d7be87a698e5224d2 +size 53886 diff --git a/src/mdm/assets/example_action_names_humanact12.txt b/src/mdm/assets/example_action_names_humanact12.txt new file mode 100644 index 0000000000000000000000000000000000000000..31b0728a52f155e585a1d5c4afe63e5d9dc8bdf5 --- /dev/null +++ b/src/mdm/assets/example_action_names_humanact12.txt @@ -0,0 +1,2 @@ +drink +lift_dumbbell diff --git a/src/mdm/assets/example_action_names_uestc.txt b/src/mdm/assets/example_action_names_uestc.txt new file mode 100644 index 0000000000000000000000000000000000000000..a3095abdecfed8cd63c4b73e8cf2d20cad606872 --- /dev/null +++ b/src/mdm/assets/example_action_names_uestc.txt @@ -0,0 +1,7 @@ +jumping-jack +left-lunging +left-stretching +raising-hand-and-jumping +rotation-clapping +front-raising +pulling-chest-expanders diff --git a/src/mdm/assets/example_dynamic_text_prompts.txt b/src/mdm/assets/example_dynamic_text_prompts.txt new file mode 100644 index 0000000000000000000000000000000000000000..e08381532182ec85c06e06569bece3ddd9ea6943 --- /dev/null +++ b/src/mdm/assets/example_dynamic_text_prompts.txt @@ -0,0 +1,12 @@ +A person is walking. +A person is walking. +A person walks forward, bends down to pick something up off the ground. +A person walks forward, bends down to pick something up off the ground. +A person is getting up and perform jumping jacks. +A person is getting up and perform jumping jacks. +A person is running. +A person is running. +A person punches in a manner consistent with martial arts. +A person punches in a manner consistent with martial arts. +A person punches in a manner consistent with martial arts. +A person punches in a manner consistent with martial arts. \ No newline at end of file diff --git a/src/mdm/assets/example_stick_fig.gif b/src/mdm/assets/example_stick_fig.gif new file mode 100644 index 0000000000000000000000000000000000000000..58b4279f3a9f792ca0ef363806606172a0b6ffa9 --- /dev/null +++ b/src/mdm/assets/example_stick_fig.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a7a1516259deaa9135a7e4e055dfb0aa25ed1085bcea8779dc3b908d0133494 +size 439424 diff --git a/src/mdm/assets/example_text_prompts.txt b/src/mdm/assets/example_text_prompts.txt new file mode 100644 index 0000000000000000000000000000000000000000..57e6ed42fc8810ab071edef9fc310f988c10d2e3 --- /dev/null +++ b/src/mdm/assets/example_text_prompts.txt @@ -0,0 +1,8 @@ +person got down and is crawling across the floor. +a person walks forward with wide steps. +a person drops their hands then brings them together in front of their face clasped. +a person lifts their right arm and slaps something, then repeats the motion again. +a person walks forward and stops. +a person marches forward, turns around, and then marches back. +a person is stretching their arms. +person is making attention gesture \ No newline at end of file diff --git a/src/mdm/assets/fixed_results.png b/src/mdm/assets/fixed_results.png new file mode 100644 index 0000000000000000000000000000000000000000..6d137fd3263b4b5e459ae02d834948a202f50ff1 --- /dev/null +++ b/src/mdm/assets/fixed_results.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af0dd1744e51bdd4808b69f401367316587ef93b895cd8812bf2ef09692b74a2 +size 120157 diff --git a/src/mdm/assets/fixed_results.tex b/src/mdm/assets/fixed_results.tex new file mode 100644 index 0000000000000000000000000000000000000000..c5037228538063e1c5495215ef862f547206d530 --- /dev/null +++ b/src/mdm/assets/fixed_results.tex @@ -0,0 +1,29 @@ +% add the following to main: +% \usepackage{xcolor} +% \usepackage{soul} +% \newcommand{\hlfancy}[2]{\sethlcolor{#1}\hl{#2}} +% \definecolor{beaublue}{rgb}{0.74, 0.83, 0.9} + + +\begin{tabular}{lccccccc} +\toprule +\multirow{2}{2.cm}{\centering Method} & +\multirow{2}{2.cm}{\centering R Precision top 1$\uparrow$} & +\multirow{2}{2.cm}{\centering R Precision top 2$\uparrow$} & +\multirow{2}{2.cm}{\centering R Precision top 3$\uparrow$} & +\multirow{2}{1.5cm}{\centering FID$\downarrow$} & \multirow{2}{2.5cm}{\centering Multimodal Dist$\downarrow$} & \multirow{2}{2cm}{\centering Diversity$\rightarrow$} & \multirow{2}{2cm}{\centering Multimodality$\uparrow$} \\ +\\ + +\midrule +Real & $0.512^{\pm.002}$ & $0.702^{\pm.002}$ & $0.797^{\pm.002}$ & $0.002^{\pm.000}$ & $2.97^{\pm.008}$ & $9.50^{\pm.065}$ & -\\ + +MDM (paper model) & $0.418^{\pm.005}$ & $0.604^{\pm.005}$ & \hlfancy{beaublue}{${{0.707^{\pm.004}}}$} & $0.489^{\pm.025}$ & \hlfancy{beaublue}{${3.63^{\pm.023}}$} & $9.45^{\pm.066}$ & ${2.87^{\pm.111}}$ \\ +MDM-50steps (20X faster) & $0.455^{\pm.006}$ & $0.645^{\pm.007}$ & {${{0.749^{\pm.006}}}$} & $0.489^{\pm.047}$ & {${3.33^{\pm.025}}$} & $9.92^{\pm.083}$ & ${2.29^{\pm.07}}$ \\ +\;\;\; with DistilBERT & $0.491^{\pm.006}$ & $0.709^{\pm.006}$ & {${{0.815^{\pm.005}}}$} & $0.495^{\pm.041}$ & {${3.04^{\pm.016}}$} & $9.88^{\pm.098}$ & ${1.67^{\pm.12}}$ \\ +\midrule + +DiP & $0.458^{\pm.006}$ & $0.664^{\pm.005}$ & {${{0.768^{\pm.004}}}$} & $0.228^{\pm.027}$ & {${3.23^{\pm.019}}$} & $9.41^{\pm.067}$ & ${1.04^{\pm.08}}$ \\ +\;\;\; with target cond & $0.452^{\pm.006}$ & $0.661^{\pm.006}$ & {${{0.772^{\pm.006}}}$} & $0.232^{\pm.029}$ & {${3.22^{\pm.019}}$} & $9.47^{\pm.108}$ & ${1.14^{\pm.05}}$ \\ + +\bottomrule +\end{tabular} \ No newline at end of file diff --git a/src/mdm/assets/fixed_results_caplen_bug.png b/src/mdm/assets/fixed_results_caplen_bug.png new file mode 100644 index 0000000000000000000000000000000000000000..9617925e351c482b711483f94900cd3850fd1a5d --- /dev/null +++ b/src/mdm/assets/fixed_results_caplen_bug.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6026b65ba309654da7332555e04afe2a204c2d4fd2809e77be4104db33cbf699 +size 57400 diff --git a/src/mdm/assets/in_between_edit.gif b/src/mdm/assets/in_between_edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..ead5432f68670a17c347bf445777a3135a8fadd6 --- /dev/null +++ b/src/mdm/assets/in_between_edit.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1ed52e9f08d96500c8a414830065f263d6305e803d0ddec393f5dbb3981ecd0 +size 1518198 diff --git a/src/mdm/assets/upper_body_edit.gif b/src/mdm/assets/upper_body_edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7928019b71634516480b4d84cd787a9915d4a6f --- /dev/null +++ b/src/mdm/assets/upper_body_edit.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0919824174dfef2f86c03a7a85b00d5564e83a301a531618699b5132cddaf784 +size 532243 diff --git a/src/mdm/body_models/README.md b/src/mdm/body_models/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e63996a323ce132e06a343e7ba109ab970affab2 --- /dev/null +++ b/src/mdm/body_models/README.md @@ -0,0 +1,3 @@ +## Body models + +Put SMPL models here (full instractions in the main README) \ No newline at end of file diff --git a/src/mdm/cog.yaml b/src/mdm/cog.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3d5da63358ebab9e5fd3d4f6f92275087c05ad48 --- /dev/null +++ b/src/mdm/cog.yaml @@ -0,0 +1,38 @@ +build: + gpu: true + cuda: "11.3" + python_version: 3.8 + system_packages: + - libgl1-mesa-glx + - libglib2.0-0 + + python_packages: + - imageio==2.22.2 + - matplotlib==3.1.3 + - spacy==3.3.1 + - smplx==0.1.28 + - chumpy==0.70 + - blis==0.7.8 + - click==8.1.3 + - confection==0.0.2 + - ftfy==6.1.1 + - importlib-metadata==5.0.0 + - lxml==4.9.1 + - murmurhash==1.0.8 + - preshed==3.0.7 + - pycryptodomex==3.15.0 + - regex==2022.9.13 + - srsly==2.4.4 + - thinc==8.0.17 + - typing-extensions==4.1.1 + - urllib3==1.26.12 + - wasabi==0.10.1 + - wcwidth==0.2.5 + + run: + - apt update -y && apt-get install ffmpeg -y +# - python -m spacy download en_core_web_sm + - git clone https://github.com/openai/CLIP.git sub_modules/CLIP + - pip install -e sub_modules/CLIP + +predict: "sample/predict.py:Predictor" diff --git a/src/mdm/data_loaders/a2m/dataset.py b/src/mdm/data_loaders/a2m/dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..b34ce34362f98f3d0158cb0ca2912df35f512bd5 --- /dev/null +++ b/src/mdm/data_loaders/a2m/dataset.py @@ -0,0 +1,255 @@ +import random + +import numpy as np +import torch +# from utils.action_label_to_idx import action_label_to_idx +from data_loaders.tensors import collate +from utils.misc import to_torch +import utils.rotation_conversions as geometry + +class Dataset(torch.utils.data.Dataset): + def __init__(self, num_frames=1, sampling="conseq", sampling_step=1, split="train", + pose_rep="rot6d", translation=True, glob=True, max_len=-1, min_len=-1, num_seq_max=-1, **kwargs): + self.num_frames = num_frames + self.sampling = sampling + self.sampling_step = sampling_step + self.split = split + self.pose_rep = pose_rep + self.translation = translation + self.glob = glob + self.max_len = max_len + self.min_len = min_len + self.num_seq_max = num_seq_max + + self.align_pose_frontview = kwargs.get('align_pose_frontview', False) + self.use_action_cat_as_text_labels = kwargs.get('use_action_cat_as_text_labels', False) + self.only_60_classes = kwargs.get('only_60_classes', False) + self.leave_out_15_classes = kwargs.get('leave_out_15_classes', False) + self.use_only_15_classes = kwargs.get('use_only_15_classes', False) + + if self.split not in ["train", "val", "test"]: + raise ValueError(f"{self.split} is not a valid split") + + super().__init__() + + # to remove shuffling + self._original_train = None + self._original_test = None + + def action_to_label(self, action): + return self._action_to_label[action] + + def label_to_action(self, label): + import numbers + if isinstance(label, numbers.Integral): + return self._label_to_action[label] + else: # if it is one hot vector + label = np.argmax(label) + return self._label_to_action[label] + + def get_pose_data(self, data_index, frame_ix): + pose = self._load(data_index, frame_ix) + label = self.get_label(data_index) + return pose, label + + def get_label(self, ind): + action = self.get_action(ind) + return self.action_to_label(action) + + def get_action(self, ind): + return self._actions[ind] + + def action_to_action_name(self, action): + return self._action_classes[action] + + def action_name_to_action(self, action_name): + # self._action_classes is either a list or a dictionary. If it's a dictionary, we 1st convert it to a list + all_action_names = self._action_classes + if isinstance(all_action_names, dict): + all_action_names = list(all_action_names.values()) + assert list(self._action_classes.keys()) == list(range(len(all_action_names))) # the keys should be ordered from 0 to num_actions + + sorter = np.argsort(all_action_names) + actions = sorter[np.searchsorted(all_action_names, action_name, sorter=sorter)] + return actions + + def __getitem__(self, index): + if self.split == 'train': + data_index = self._train[index] + else: + data_index = self._test[index] + + # inp, target = self._get_item_data_index(data_index) + # return inp, target + return self._get_item_data_index(data_index) + + def _load(self, ind, frame_ix): + pose_rep = self.pose_rep + if pose_rep == "xyz" or self.translation: + if getattr(self, "_load_joints3D", None) is not None: + # Locate the root joint of initial pose at origin + joints3D = self._load_joints3D(ind, frame_ix) + joints3D = joints3D - joints3D[0, 0, :] + ret = to_torch(joints3D) + if self.translation: + ret_tr = ret[:, 0, :] + else: + if pose_rep == "xyz": + raise ValueError("This representation is not possible.") + if getattr(self, "_load_translation") is None: + raise ValueError("Can't extract translations.") + ret_tr = self._load_translation(ind, frame_ix) + ret_tr = to_torch(ret_tr - ret_tr[0]) + + if pose_rep != "xyz": + if getattr(self, "_load_rotvec", None) is None: + raise ValueError("This representation is not possible.") + else: + pose = self._load_rotvec(ind, frame_ix) + if not self.glob: + pose = pose[:, 1:, :] + pose = to_torch(pose) + if self.align_pose_frontview: + first_frame_root_pose_matrix = geometry.axis_angle_to_matrix(pose[0][0]) + all_root_poses_matrix = geometry.axis_angle_to_matrix(pose[:, 0, :]) + aligned_root_poses_matrix = torch.matmul(torch.transpose(first_frame_root_pose_matrix, 0, 1), + all_root_poses_matrix) + pose[:, 0, :] = geometry.matrix_to_axis_angle(aligned_root_poses_matrix) + + if self.translation: + ret_tr = torch.matmul(torch.transpose(first_frame_root_pose_matrix, 0, 1).float(), + torch.transpose(ret_tr, 0, 1)) + ret_tr = torch.transpose(ret_tr, 0, 1) + + if pose_rep == "rotvec": + ret = pose + elif pose_rep == "rotmat": + ret = geometry.axis_angle_to_matrix(pose).view(*pose.shape[:2], 9) + elif pose_rep == "rotquat": + ret = geometry.axis_angle_to_quaternion(pose) + elif pose_rep == "rot6d": + ret = geometry.matrix_to_rotation_6d(geometry.axis_angle_to_matrix(pose)) + if pose_rep != "xyz" and self.translation: + padded_tr = torch.zeros((ret.shape[0], ret.shape[2]), dtype=ret.dtype) + padded_tr[:, :3] = ret_tr + ret = torch.cat((ret, padded_tr[:, None]), 1) + ret = ret.permute(1, 2, 0).contiguous() + return ret.float() + + def _get_item_data_index(self, data_index): + nframes = self._num_frames_in_video[data_index] + + if self.num_frames == -1 and (self.max_len == -1 or nframes <= self.max_len): + frame_ix = np.arange(nframes) + else: + if self.num_frames == -2: + if self.min_len <= 0: + raise ValueError("You should put a min_len > 0 for num_frames == -2 mode") + if self.max_len != -1: + max_frame = min(nframes, self.max_len) + else: + max_frame = nframes + + num_frames = random.randint(self.min_len, max(max_frame, self.min_len)) + else: + num_frames = self.num_frames if self.num_frames != -1 else self.max_len + + if num_frames > nframes: + fair = False # True + if fair: + # distills redundancy everywhere + choices = np.random.choice(range(nframes), + num_frames, + replace=True) + frame_ix = sorted(choices) + else: + # adding the last frame until done + ntoadd = max(0, num_frames - nframes) + lastframe = nframes - 1 + padding = lastframe * np.ones(ntoadd, dtype=int) + frame_ix = np.concatenate((np.arange(0, nframes), + padding)) + + elif self.sampling in ["conseq", "random_conseq"]: + step_max = (nframes - 1) // (num_frames - 1) + if self.sampling == "conseq": + if self.sampling_step == -1 or self.sampling_step * (num_frames - 1) >= nframes: + step = step_max + else: + step = self.sampling_step + elif self.sampling == "random_conseq": + step = random.randint(1, step_max) + + lastone = step * (num_frames - 1) + shift_max = nframes - lastone - 1 + shift = random.randint(0, max(0, shift_max - 1)) + frame_ix = shift + np.arange(0, lastone + 1, step) + + elif self.sampling == "random": + choices = np.random.choice(range(nframes), + num_frames, + replace=False) + frame_ix = sorted(choices) + + else: + raise ValueError("Sampling not recognized.") + + inp, action = self.get_pose_data(data_index, frame_ix) + + + output = {'inp': inp, 'action': action} + + if hasattr(self, '_actions') and hasattr(self, '_action_classes'): + output['action_text'] = self.action_to_action_name(self.get_action(data_index)) + + return output + + + def get_mean_length_label(self, label): + if self.num_frames != -1: + return self.num_frames + + if self.split == 'train': + index = self._train + else: + index = self._test + + action = self.label_to_action(label) + choices = np.argwhere(self._actions[index] == action).squeeze(1) + lengths = self._num_frames_in_video[np.array(index)[choices]] + + if self.max_len == -1: + return np.mean(lengths) + else: + # make the lengths less than max_len + lengths[lengths > self.max_len] = self.max_len + return np.mean(lengths) + + def __len__(self): + num_seq_max = getattr(self, "num_seq_max", -1) + if num_seq_max == -1: + from math import inf + num_seq_max = inf + + if self.split == 'train': + return min(len(self._train), num_seq_max) + else: + return min(len(self._test), num_seq_max) + + def shuffle(self): + if self.split == 'train': + random.shuffle(self._train) + else: + random.shuffle(self._test) + + def reset_shuffle(self): + if self.split == 'train': + if self._original_train is None: + self._original_train = self._train + else: + self._train = self._original_train + else: + if self._original_test is None: + self._original_test = self._test + else: + self._test = self._original_test diff --git a/src/mdm/data_loaders/a2m/humanact12poses.py b/src/mdm/data_loaders/a2m/humanact12poses.py new file mode 100644 index 0000000000000000000000000000000000000000..d9b8894a5e7435f0f35aee1d326fead5a3123bae --- /dev/null +++ b/src/mdm/data_loaders/a2m/humanact12poses.py @@ -0,0 +1,57 @@ +import pickle as pkl +import numpy as np +import os +from .dataset import Dataset + + +class HumanAct12Poses(Dataset): + dataname = "humanact12" + + def __init__(self, datapath="dataset/HumanAct12Poses", split="train", **kargs): + self.datapath = datapath + + super().__init__(**kargs) + + pkldatafilepath = os.path.join(datapath, "humanact12poses.pkl") + data = pkl.load(open(pkldatafilepath, "rb")) + + self._pose = [x for x in data["poses"]] + self._num_frames_in_video = [p.shape[0] for p in self._pose] + self._joints = [x for x in data["joints3D"]] + + self._actions = [x for x in data["y"]] + + total_num_actions = 12 + self.num_actions = total_num_actions + + self._train = list(range(len(self._pose))) + + keep_actions = np.arange(0, total_num_actions) + + self._action_to_label = {x: i for i, x in enumerate(keep_actions)} + self._label_to_action = {i: x for i, x in enumerate(keep_actions)} + + self._action_classes = humanact12_coarse_action_enumerator + + def _load_joints3D(self, ind, frame_ix): + return self._joints[ind][frame_ix] + + def _load_rotvec(self, ind, frame_ix): + pose = self._pose[ind][frame_ix].reshape(-1, 24, 3) + return pose + + +humanact12_coarse_action_enumerator = { + 0: "warm_up", + 1: "walk", + 2: "run", + 3: "jump", + 4: "drink", + 5: "lift_dumbbell", + 6: "sit", + 7: "eat", + 8: "turn steering wheel", + 9: "phone", + 10: "boxing", + 11: "throw", +} diff --git a/src/mdm/data_loaders/a2m/uestc.py b/src/mdm/data_loaders/a2m/uestc.py new file mode 100644 index 0000000000000000000000000000000000000000..e818b9831f587b360cf90f134074855ee5100484 --- /dev/null +++ b/src/mdm/data_loaders/a2m/uestc.py @@ -0,0 +1,226 @@ +import os +from tqdm import tqdm +import numpy as np +import pickle as pkl +import utils.rotation_conversions as geometry +import torch + +from .dataset import Dataset +# from torch.utils.data import Dataset + +action2motion_joints = [8, 1, 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 14, 21, 24, 38] + + +def get_z(cam_s, cam_pos, joints, img_size, flength): + """ + Solves for the depth offset of the model to approx. orth with persp camera. + """ + # Translate the model itself: Solve the best z that maps to orth_proj points + joints_orth_target = (cam_s * (joints[:, :2] + cam_pos) + 1) * 0.5 * img_size + height3d = np.linalg.norm(np.max(joints[:, :2], axis=0) - np.min(joints[:, :2], axis=0)) + height2d = np.linalg.norm(np.max(joints_orth_target, axis=0) - np.min(joints_orth_target, axis=0)) + tz = np.array(flength * (height3d / height2d)) + return float(tz) + + +def get_trans_from_vibe(vibe, index, use_z=True): + alltrans = [] + for t in range(vibe["joints3d"][index].shape[0]): + # Convert crop cam to orig cam + # No need! Because `convert_crop_cam_to_orig_img` from demoutils of vibe + # does this already for us :) + # Its format is: [sx, sy, tx, ty] + cam_orig = vibe["orig_cam"][index][t] + x = cam_orig[2] + y = cam_orig[3] + if use_z: + z = get_z(cam_s=cam_orig[0], # TODO: There are two scales instead of 1. + cam_pos=cam_orig[2:4], + joints=vibe['joints3d'][index][t], + img_size=540, + flength=500) + # z = 500 / (0.5 * 480 * cam_orig[0]) + else: + z = 0 + trans = [x, y, z] + alltrans.append(trans) + alltrans = np.array(alltrans) + return alltrans - alltrans[0] + + +class UESTC(Dataset): + dataname = "uestc" + + def __init__(self, datapath="dataset/uestc", method_name="vibe", view="all", **kargs): + + self.datapath = datapath + self.method_name = method_name + self.view = view + super().__init__(**kargs) + + # Load pre-computed #frames data + with open(os.path.join(datapath, 'info', 'num_frames_min.txt'), 'r') as f: + num_frames_video = np.asarray([int(s) for s in f.read().splitlines()]) + + # Out of 118 subjects -> 51 training, 67 in test + all_subjects = np.arange(1, 119) + self._tr_subjects = [ + 1, 2, 6, 12, 13, 16, 21, 24, 28, 29, 30, 31, 33, 35, 39, 41, 42, 45, 47, 50, + 52, 54, 55, 57, 59, 61, 63, 64, 67, 69, 70, 71, 73, 77, 81, 84, 86, 87, 88, + 90, 91, 93, 96, 99, 102, 103, 104, 107, 108, 112, 113] + self._test_subjects = [s for s in all_subjects if s not in self._tr_subjects] + + # Load names of 25600 videos + with open(os.path.join(datapath, 'info', 'names.txt'), 'r') as f: + videos = f.read().splitlines() + + self._videos = videos + + if self.method_name == "vibe": + vibe_data_path = os.path.join(datapath, "vibe_cache_refined.pkl") + vibe_data = pkl.load(open(vibe_data_path, "rb")) + + self._pose = vibe_data["pose"] + num_frames_method = [p.shape[0] for p in self._pose] + globpath = os.path.join(datapath, "globtrans_usez.pkl") + + if os.path.exists(globpath): + self._globtrans = pkl.load(open(globpath, "rb")) + else: + self._globtrans = [] + for index in tqdm(range(len(self._pose))): + self._globtrans.append(get_trans_from_vibe(vibe_data, index, use_z=True)) + pkl.dump(self._globtrans, open("globtrans_usez.pkl", "wb")) + self._joints = vibe_data["joints3d"] + self._jointsIx = action2motion_joints + else: + raise ValueError("This method name is not recognized.") + + num_frames_video = np.minimum(num_frames_video, num_frames_method) + num_frames_video = num_frames_video.astype(int) + self._num_frames_in_video = [x for x in num_frames_video] + + N = len(videos) + self._actions = np.zeros(N, dtype=int) + for ind in range(N): + self._actions[ind] = self.parse_action(videos[ind]) + + self._actions = [x for x in self._actions] + + total_num_actions = 40 + self.num_actions = total_num_actions + keep_actions = np.arange(0, total_num_actions) + + self._action_to_label = {x: i for i, x in enumerate(keep_actions)} + self._label_to_action = {i: x for i, x in enumerate(keep_actions)} + self.num_classes = len(keep_actions) + + self._train = [] + self._test = [] + + self.info_actions = [] + + def get_rotation(view): + theta = - view * np.pi/4 + axis = torch.tensor([0, 1, 0], dtype=torch.float) + axisangle = theta*axis + matrix = geometry.axis_angle_to_matrix(axisangle) + return matrix + + # 0 is identity if needed + rotations = {key: get_rotation(key) for key in [0, 1, 2, 3, 4, 5, 6, 7]} + + for index, video in enumerate(tqdm(videos, desc='Preparing UESTC data..')): + act, view, subject, side = self._get_action_view_subject_side(video) + self.info_actions.append({"action": act, + "view": view, + "subject": subject, + "side": side}) + if self.view == "frontview": + if side != 1: + continue + # rotate to front view + if side != 1: + # don't take the view 8 in side 2 + if view == 8: + continue + rotation = rotations[view] + global_matrix = geometry.axis_angle_to_matrix(torch.from_numpy(self._pose[index][:, :3])) + # rotate the global pose + self._pose[index][:, :3] = geometry.matrix_to_axis_angle(rotation @ global_matrix).numpy() + # rotate the joints + self._joints[index] = self._joints[index] @ rotation.T.numpy() + self._globtrans[index] = (self._globtrans[index] @ rotation.T.numpy()) + + # add the global translation to the joints + self._joints[index] = self._joints[index] + self._globtrans[index][:, None] + + if subject in self._tr_subjects: + self._train.append(index) + elif subject in self._test_subjects: + self._test.append(index) + else: + raise ValueError("This subject doesn't belong to any set.") + + # if index > 200: + # break + + # Select only sequences which have a minimum number of frames + if self.num_frames > 0: + threshold = self.num_frames*3/4 + else: + threshold = 0 + + method_extracted_ix = np.where(num_frames_video >= threshold)[0].tolist() + self._train = list(set(self._train) & set(method_extracted_ix)) + # keep the test set without modification + self._test = list(set(self._test)) + + action_classes_file = os.path.join(datapath, "info/action_classes.txt") + with open(action_classes_file, 'r') as f: + self._action_classes = np.array(f.read().splitlines()) + + # with open(processd_path, 'wb') as file: + # pkl.dump(xxx, file) + + def _load_joints3D(self, ind, frame_ix): + if len(self._joints[ind]) == 0: + raise ValueError( + f"Cannot load index {ind} in _load_joints3D function.") + if self._jointsIx is not None: + joints3D = self._joints[ind][frame_ix][:, self._jointsIx] + else: + joints3D = self._joints[ind][frame_ix] + + return joints3D + + def _load_rotvec(self, ind, frame_ix): + # 72 dim smpl + pose = self._pose[ind][frame_ix, :].reshape(-1, 24, 3) + return pose + + def _get_action_view_subject_side(self, videopath): + # TODO: Can be moved to tools.py + spl = videopath.split('_') + action = int(spl[0][1:]) + view = int(spl[1][1:]) + subject = int(spl[2][1:]) + side = int(spl[3][1:]) + return action, view, subject, side + + def _get_videopath(self, action, view, subject, side): + # Unused function + return 'a{:d}_d{:d}_p{:03d}_c{:d}_color.avi'.format( + action, view, subject, side) + + def parse_action(self, path, return_int=True): + # Override parent method + info, _, _, _ = self._get_action_view_subject_side(path) + if return_int: + return int(info) + else: + return info + + +if __name__ == "__main__": + dataset = UESTC() diff --git a/src/mdm/data_loaders/get_data.py b/src/mdm/data_loaders/get_data.py new file mode 100644 index 0000000000000000000000000000000000000000..ce1eec77a903fe17c8820cd0508541284db47446 --- /dev/null +++ b/src/mdm/data_loaders/get_data.py @@ -0,0 +1,126 @@ +from torch.utils.data import DataLoader +from data_loaders.tensors import collate as all_collate +from data_loaders.tensors import t2m_collate, t2m_prefix_collate + +def get_dataset_class(name): + if name == "amass": + from .amass import AMASS + return AMASS + elif name == "uestc": + from .a2m.uestc import UESTC + return UESTC + elif name == "humanact12": + from .a2m.humanact12poses import HumanAct12Poses + return HumanAct12Poses + elif name == "humanml": + from data_loaders.humanml.data.dataset import HumanML3D + return HumanML3D + elif name == "kit": + from data_loaders.humanml.data.dataset import KIT + return KIT + elif name == "preprocessed_posterior": + from data_loaders.preprocessed_posterior_loader import PreprocessedPosteriorDataset + return PreprocessedPosteriorDataset + else: + raise ValueError(f'Unsupported dataset name [{name}]') + +def get_collate_fn(name, hml_mode='train', pred_len=0, batch_size=1): + if hml_mode == 'gt': + from data_loaders.humanml.data.dataset import collate_fn as t2m_eval_collate + return t2m_eval_collate + if name in ["humanml", "kit"]: + if pred_len > 0: + return lambda x: t2m_prefix_collate(x, pred_len=pred_len) + return lambda x: t2m_collate(x, batch_size) + elif name == "preprocessed_posterior": + from data_loaders.preprocessed_posterior_loader import collate_preprocessed_posterior + return collate_preprocessed_posterior + else: + return all_collate + + +def get_dataset(name, num_frames, split='train', hml_mode='train', abs_path='.', fixed_len=0, + device=None, autoregressive=False, cache_path=None, posterior_dir=None, + max_samples=None, resample=False): + DATA = get_dataset_class(name) + if name in ["humanml", "kit"]: + dataset = DATA(split=split, num_frames=num_frames, mode=hml_mode, abs_path=abs_path, fixed_len=fixed_len, + device=device, autoregressive=autoregressive) + elif name == "preprocessed_posterior": + dataset = DATA(posterior_dir=posterior_dir, max_samples=max_samples, resample=resample) + else: + dataset = DATA(split=split, num_frames=num_frames) + return dataset + + +def get_dataset_loader(name, batch_size, num_frames, split='train', hml_mode='train', fixed_len=0, pred_len=0, + device=None, autoregressive=False, posterior_dir=None, max_samples=None, resample=False, + num_workers=8, shuffle=True): + """ + Get a data loader. + + Args: + name: dataset name; supports 'humanml', 'kit', 'preprocessed_posterior', etc. + batch_size: batch size + num_frames: number of frames + split: dataset split (train/val/test) + hml_mode: HumanML mode + fixed_len: fixed length + pred_len: prediction length + device: device + autoregressive: whether to use autoregressive mode + posterior_dir: directory path for the preprocessed_posterior dataset + max_samples: maximum number of samples (for preprocessed_posterior) + resample: whether to resample (for preprocessed_posterior) + num_workers: number of data loading workers + shuffle: whether to shuffle data + + Returns: + DataLoader object + """ + dataset = get_dataset(name, num_frames, split=split, hml_mode=hml_mode, fixed_len=fixed_len, + device=device, autoregressive=autoregressive, posterior_dir=posterior_dir, + max_samples=max_samples, resample=resample) + + collate = get_collate_fn(name, hml_mode, pred_len, batch_size) + + loader = DataLoader( + dataset, batch_size=batch_size, shuffle=shuffle, + num_workers=num_workers, drop_last=True, collate_fn=collate + ) + + return loader + + +def get_preprocessed_posterior_loader(posterior_dir, batch_size=32, shuffle=True, + num_workers=8, max_samples=None, resample=False, + mean=None, std=None, drop_last=True): + """ + Convenience function for creating a preprocessed posterior data loader. + + Args: + posterior_dir: directory containing preprocessed posterior files + batch_size: batch size + shuffle: whether to shuffle + num_workers: number of data loading workers + max_samples: maximum number of samples + resample: whether to resample the latent while loading + mean: mean used for normalization + std: standard deviation used for normalization + drop_last: whether to drop the last incomplete batch + + Returns: + DataLoader object with a dataset attribute + """ + from data_loaders.preprocessed_posterior_loader import get_preprocessed_posterior_loader as _get_loader + return _get_loader( + posterior_dir=posterior_dir, + batch_size=batch_size, + shuffle=shuffle, + num_workers=num_workers, + max_samples=max_samples, + resample=resample, + mean=mean, + std=std, + drop_last=drop_last + ) \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/README.md b/src/mdm/data_loaders/humanml/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4bf224f6b341e21f549a27a000d8400c4909c6c1 --- /dev/null +++ b/src/mdm/data_loaders/humanml/README.md @@ -0,0 +1 @@ +This code is based on https://github.com/EricGuo5513/text-to-motion.git \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/common/quaternion.py b/src/mdm/data_loaders/humanml/common/quaternion.py new file mode 100644 index 0000000000000000000000000000000000000000..1e414a63a790b0b3b78d734b89f0d08dac2e8378 --- /dev/null +++ b/src/mdm/data_loaders/humanml/common/quaternion.py @@ -0,0 +1,425 @@ +# Copyright (c) 2018-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# + +import torch +import numpy as np + +_EPS4 = np.finfo(float).eps * 4.0 + +_FLOAT_EPS = np.finfo(float).eps + +# PyTorch-backed implementations +def qinv(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + mask = torch.ones_like(q) + mask[..., 1:] = -mask[..., 1:] + return q * mask + + +def qinv_np(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + return qinv(torch.from_numpy(q).float()).numpy() + + +def qnormalize(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + q[..., -1] += 1e-4 # Guy - for safty, avoid zero devision + return q / torch.norm(q, dim=-1, keepdim=True) + + +def qmul(q, r): + """ + Multiply quaternion(s) q with quaternion(s) r. + Expects two equally-sized tensors of shape (*, 4), where * denotes any number of dimensions. + Returns q*r as a tensor of shape (*, 4). + """ + assert q.shape[-1] == 4 + assert r.shape[-1] == 4 + + original_shape = q.shape + + # Compute outer product + # terms = torch.bmm(r.view(-1, 4, 1), q.view(-1, 1, 4)) + terms = torch.bmm(r.reshape(-1, 4, 1), q.reshape(-1, 1, 4)) + + w = terms[:, 0, 0] - terms[:, 1, 1] - terms[:, 2, 2] - terms[:, 3, 3] + x = terms[:, 0, 1] + terms[:, 1, 0] - terms[:, 2, 3] + terms[:, 3, 2] + y = terms[:, 0, 2] + terms[:, 1, 3] + terms[:, 2, 0] - terms[:, 3, 1] + z = terms[:, 0, 3] - terms[:, 1, 2] + terms[:, 2, 1] + terms[:, 3, 0] + return torch.stack((w, x, y, z), dim=1).view(original_shape) + + +def qrot(q, v): + """ + Rotate vector(s) v about the rotation described by quaternion(s) q. + Expects a tensor of shape (*, 4) for q and a tensor of shape (*, 3) for v, + where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + assert q.shape[-1] == 4 + assert v.shape[-1] == 3 + assert q.shape[:-1] == v.shape[:-1] + + original_shape = list(v.shape) + # print(q.shape) + q = q.contiguous().view(-1, 4) + v = v.contiguous().view(-1, 3) + + qvec = q[:, 1:].to(v.device) + uv = torch.cross(qvec, v, dim=1) + uuv = torch.cross(qvec, uv, dim=1) + return (v + 2 * (q[:, :1] * uv + uuv)).view(original_shape) + + +def qeuler(q, order, epsilon=0, deg=True): + """ + Convert quaternion(s) q to Euler angles. + Expects a tensor of shape (*, 4), where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + assert q.shape[-1] == 4 + + original_shape = list(q.shape) + original_shape[-1] = 3 + q = q.view(-1, 4) + + q0 = q[:, 0] + q1 = q[:, 1] + q2 = q[:, 2] + q3 = q[:, 3] + + if order == 'xyz': + x = torch.atan2(2 * (q0 * q1 - q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + y = torch.asin(torch.clamp(2 * (q1 * q3 + q0 * q2), -1 + epsilon, 1 - epsilon)) + z = torch.atan2(2 * (q0 * q3 - q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + elif order == 'yzx': + x = torch.atan2(2 * (q0 * q1 - q2 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + y = torch.atan2(2 * (q0 * q2 - q1 * q3), 1 - 2 * (q2 * q2 + q3 * q3)) + z = torch.asin(torch.clamp(2 * (q1 * q2 + q0 * q3), -1 + epsilon, 1 - epsilon)) + elif order == 'zxy': + x = torch.asin(torch.clamp(2 * (q0 * q1 + q2 * q3), -1 + epsilon, 1 - epsilon)) + y = torch.atan2(2 * (q0 * q2 - q1 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + z = torch.atan2(2 * (q0 * q3 - q1 * q2), 1 - 2 * (q1 * q1 + q3 * q3)) + elif order == 'xzy': + x = torch.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + y = torch.atan2(2 * (q0 * q2 + q1 * q3), 1 - 2 * (q2 * q2 + q3 * q3)) + z = torch.asin(torch.clamp(2 * (q0 * q3 - q1 * q2), -1 + epsilon, 1 - epsilon)) + elif order == 'yxz': + x = torch.asin(torch.clamp(2 * (q0 * q1 - q2 * q3), -1 + epsilon, 1 - epsilon)) + y = torch.atan2(2 * (q1 * q3 + q0 * q2), 1 - 2 * (q1 * q1 + q2 * q2)) + z = torch.atan2(2 * (q1 * q2 + q0 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + elif order == 'zyx': + x = torch.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + y = torch.asin(torch.clamp(2 * (q0 * q2 - q1 * q3), -1 + epsilon, 1 - epsilon)) + z = torch.atan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + else: + raise + + if deg: + return torch.stack((x, y, z), dim=1).view(original_shape) * 180 / np.pi + else: + return torch.stack((x, y, z), dim=1).view(original_shape) + + +# Numpy-backed implementations + +def qmul_np(q, r): + q = torch.from_numpy(q).contiguous().float() + r = torch.from_numpy(r).contiguous().float() + return qmul(q, r).numpy() + + +def qrot_np(q, v): + q = torch.from_numpy(q).contiguous().float() + v = torch.from_numpy(v).contiguous().float() + return qrot(q, v).numpy() + + +def qeuler_np(q, order, epsilon=0, use_gpu=False): + if use_gpu: + q = torch.from_numpy(q).cuda().float() + return qeuler(q, order, epsilon).cpu().numpy() + else: + q = torch.from_numpy(q).contiguous().float() + return qeuler(q, order, epsilon).numpy() + + +def qfix(q): + """ + Enforce quaternion continuity across the time dimension by selecting + the representation (q or -q) with minimal distance (or, equivalently, maximal dot product) + between two consecutive frames. + + Expects a tensor of shape (L, J, 4), where L is the sequence length and J is the number of joints. + Returns a tensor of the same shape. + """ + assert len(q.shape) == 3 + assert q.shape[-1] == 4 + + result = q.copy() + dot_products = np.sum(q[1:] * q[:-1], axis=2) + mask = dot_products < 0 + mask = (np.cumsum(mask, axis=0) % 2).astype(bool) + result[1:][mask] *= -1 + return result + + +def euler2quat(e, order, deg=True): + """ + Convert Euler angles to quaternions. + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + + e = e.view(-1, 3) + + ## if euler angles in degrees + if deg: + e = e * np.pi / 180. + + x = e[:, 0] + y = e[:, 1] + z = e[:, 2] + + rx = torch.stack((torch.cos(x / 2), torch.sin(x / 2), torch.zeros_like(x), torch.zeros_like(x)), dim=1) + ry = torch.stack((torch.cos(y / 2), torch.zeros_like(y), torch.sin(y / 2), torch.zeros_like(y)), dim=1) + rz = torch.stack((torch.cos(z / 2), torch.zeros_like(z), torch.zeros_like(z), torch.sin(z / 2)), dim=1) + + result = None + for coord in order: + if coord == 'x': + r = rx + elif coord == 'y': + r = ry + elif coord == 'z': + r = rz + else: + raise + if result is None: + result = r + else: + result = qmul(result, r) + + # Reverse antipodal representation to have a non-negative "w" + if order in ['xyz', 'yzx', 'zxy']: + result *= -1 + + return result.view(original_shape) + + +def expmap_to_quaternion(e): + """ + Convert axis-angle rotations (aka exponential maps) to quaternions. + Stable formula from "Practical Parameterization of Rotations Using the Exponential Map". + Expects a tensor of shape (*, 3), where * denotes any number of dimensions. + Returns a tensor of shape (*, 4). + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + e = e.reshape(-1, 3) + + theta = np.linalg.norm(e, axis=1).reshape(-1, 1) + w = np.cos(0.5 * theta).reshape(-1, 1) + xyz = 0.5 * np.sinc(0.5 * theta / np.pi) * e + return np.concatenate((w, xyz), axis=1).reshape(original_shape) + + +def euler_to_quaternion(e, order): + """ + Convert Euler angles to quaternions. + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + + e = e.reshape(-1, 3) + + x = e[:, 0] + y = e[:, 1] + z = e[:, 2] + + rx = np.stack((np.cos(x / 2), np.sin(x / 2), np.zeros_like(x), np.zeros_like(x)), axis=1) + ry = np.stack((np.cos(y / 2), np.zeros_like(y), np.sin(y / 2), np.zeros_like(y)), axis=1) + rz = np.stack((np.cos(z / 2), np.zeros_like(z), np.zeros_like(z), np.sin(z / 2)), axis=1) + + result = None + for coord in order: + if coord == 'x': + r = rx + elif coord == 'y': + r = ry + elif coord == 'z': + r = rz + else: + raise + if result is None: + result = r + else: + result = qmul_np(result, r) + + # Reverse antipodal representation to have a non-negative "w" + if order in ['xyz', 'yzx', 'zxy']: + result *= -1 + + return result.reshape(original_shape) + + +def quaternion_to_matrix(quaternions): + """ + Convert rotations given as quaternions to rotation matrices. + Args: + quaternions: quaternions with real part first, + as tensor of shape (..., 4). + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + r, i, j, k = torch.unbind(quaternions, -1) + two_s = 2.0 / (quaternions * quaternions).sum(-1) + + o = torch.stack( + ( + 1 - two_s * (j * j + k * k), + two_s * (i * j - k * r), + two_s * (i * k + j * r), + two_s * (i * j + k * r), + 1 - two_s * (i * i + k * k), + two_s * (j * k - i * r), + two_s * (i * k - j * r), + two_s * (j * k + i * r), + 1 - two_s * (i * i + j * j), + ), + -1, + ) + return o.reshape(quaternions.shape[:-1] + (3, 3)) + + +def quaternion_to_matrix_np(quaternions): + q = torch.from_numpy(quaternions).contiguous().float() + return quaternion_to_matrix(q).numpy() + + +def quaternion_to_cont6d_np(quaternions): + rotation_mat = quaternion_to_matrix_np(quaternions) + cont_6d = np.concatenate([rotation_mat[..., 0], rotation_mat[..., 1]], axis=-1) + return cont_6d + + +def quaternion_to_cont6d(quaternions): + rotation_mat = quaternion_to_matrix(quaternions) + cont_6d = torch.cat([rotation_mat[..., 0], rotation_mat[..., 1]], dim=-1) + return cont_6d + + +def cont6d_to_matrix(cont6d): + assert cont6d.shape[-1] == 6, "The last dimension must be 6" + x_raw = cont6d[..., 0:3] + y_raw = cont6d[..., 3:6] + + x = x_raw / torch.norm(x_raw, dim=-1, keepdim=True) + z = torch.cross(x, y_raw, dim=-1) + z = z / torch.norm(z, dim=-1, keepdim=True) + + y = torch.cross(z, x, dim=-1) + + x = x[..., None] + y = y[..., None] + z = z[..., None] + + mat = torch.cat([x, y, z], dim=-1) + return mat + + +def cont6d_to_matrix_np(cont6d): + q = torch.from_numpy(cont6d).contiguous().float() + return cont6d_to_matrix(q).numpy() + + +def qpow(q0, t, dtype=torch.float): + ''' q0 : tensor of quaternions + t: tensor of powers + ''' + q0 = qnormalize(q0) + theta0 = torch.acos(q0[..., 0]) + + ## if theta0 is close to zero, add epsilon to avoid NaNs + mask = (theta0 <= 10e-10) * (theta0 >= -10e-10) + theta0 = (1 - mask) * theta0 + mask * 10e-10 + v0 = q0[..., 1:] / torch.sin(theta0).view(-1, 1) + + if isinstance(t, torch.Tensor): + q = torch.zeros(t.shape + q0.shape) + theta = t.view(-1, 1) * theta0.view(1, -1) + else: ## if t is a number + q = torch.zeros(q0.shape) + theta = t * theta0 + + q[..., 0] = torch.cos(theta) + q[..., 1:] = v0 * torch.sin(theta).unsqueeze(-1) + + return q.to(dtype) + + +def qslerp(q0, q1, t): + ''' + q0: starting quaternion + q1: ending quaternion + t: array of points along the way + + Returns: + Tensor of Slerps: t.shape + q0.shape + ''' + + q0 = qnormalize(q0) + q1 = qnormalize(q1) + q_ = qpow(qmul(q1, qinv(q0)), t) + + return qmul(q_, + q0.contiguous().view(torch.Size([1] * len(t.shape)) + q0.shape).expand(t.shape + q0.shape).contiguous()) + + +def qbetween(v0, v1): + ''' + find the quaternion used to rotate v0 to v1 + ''' + assert v0.shape[-1] == 3, 'v0 must be of the shape (*, 3)' + assert v1.shape[-1] == 3, 'v1 must be of the shape (*, 3)' + + v = torch.cross(v0, v1) + w = torch.sqrt((v0 ** 2).sum(dim=-1, keepdim=True) * (v1 ** 2).sum(dim=-1, keepdim=True)) + (v0 * v1).sum(dim=-1, + keepdim=True) + return qnormalize(torch.cat([w, v], dim=-1)) + + +def qbetween_np(v0, v1): + ''' + find the quaternion used to rotate v0 to v1 + ''' + assert v0.shape[-1] == 3, 'v0 must be of the shape (*, 3)' + assert v1.shape[-1] == 3, 'v1 must be of the shape (*, 3)' + + v0 = torch.from_numpy(v0).float() + v1 = torch.from_numpy(v1).float() + return qbetween(v0, v1).numpy() + + +def lerp(p0, p1, t): + if not isinstance(t, torch.Tensor): + t = torch.Tensor([t]) + + new_shape = t.shape + p0.shape + new_view_t = t.shape + torch.Size([1] * len(p0.shape)) + new_view_p = torch.Size([1] * len(t.shape)) + p0.shape + p0 = p0.view(new_view_p).expand(new_shape) + p1 = p1.view(new_view_p).expand(new_shape) + t = t.view(new_view_t).expand(new_shape) + + return p0 + t * (p1 - p0) diff --git a/src/mdm/data_loaders/humanml/common/skeleton.py b/src/mdm/data_loaders/humanml/common/skeleton.py new file mode 100644 index 0000000000000000000000000000000000000000..3e5a46ec14dc659e92f675ece60d115262c54449 --- /dev/null +++ b/src/mdm/data_loaders/humanml/common/skeleton.py @@ -0,0 +1,202 @@ +from data_loaders.humanml.common.quaternion import * +import scipy.ndimage.filters as filters + +class Skeleton(object): + def __init__(self, offset, kinematic_tree, device): + self.device = device + self._raw_offset_np = offset.numpy() + self._raw_offset = offset.clone().detach().to(device).float() + self._kinematic_tree = kinematic_tree + self._offset = None + self._parents = [0] * len(self._raw_offset) + self._parents[0] = -1 + for chain in self._kinematic_tree: + for j in range(1, len(chain)): + self._parents[chain[j]] = chain[j-1] + + def njoints(self): + return len(self._raw_offset) + + def offset(self): + return self._offset + + def set_offset(self, offsets): + self._offset = offsets.clone().detach().to(self.device).float() + + def kinematic_tree(self): + return self._kinematic_tree + + def parents(self): + return self._parents + + # joints (batch_size, joints_num, 3) + def get_offsets_joints_batch(self, joints): + assert len(joints.shape) == 3 + _offsets = self._raw_offset.expand(joints.shape[0], -1, -1).clone() + for i in range(1, self._raw_offset.shape[0]): + _offsets[:, i] = torch.norm(joints[:, i] - joints[:, self._parents[i]], p=2, dim=1)[:, None] * _offsets[:, i] + + self._offset = _offsets.detach() + return _offsets + + # joints (joints_num, 3) + def get_offsets_joints(self, joints): + assert len(joints.shape) == 2 + _offsets = self._raw_offset.clone() + for i in range(1, self._raw_offset.shape[0]): + # print(joints.shape) + _offsets[i] = torch.norm(joints[i] - joints[self._parents[i]], p=2, dim=0) * _offsets[i] + + self._offset = _offsets.detach() + return _offsets + + # face_joint_idx should follow the order of right hip, left hip, right shoulder, left shoulder + # joints (batch_size, joints_num, 3) + def inverse_kinematics_np(self, joints, face_joint_idx, smooth_forward=False, fix_bug=False): + assert len(face_joint_idx) == 4 + '''Get Forward Direction''' + if fix_bug: + r_hip, l_hip, sdr_r, sdr_l = face_joint_idx + else: + l_hip, r_hip, sdr_r, sdr_l = face_joint_idx + across1 = joints[:, r_hip] - joints[:, l_hip] + across2 = joints[:, sdr_r] - joints[:, sdr_l] + across = across1 + across2 + across = across / np.sqrt((across**2).sum(axis=-1))[:, np.newaxis] + # print(across1.shape, across2.shape) + + # forward (batch_size, 3) + forward = np.cross(np.array([[0, 1, 0]]), across, axis=-1) + if smooth_forward: + forward = filters.gaussian_filter1d(forward, 20, axis=0, mode='nearest') + # forward (batch_size, 3) + forward = forward / np.sqrt((forward**2).sum(axis=-1))[..., np.newaxis] + + '''Get Root Rotation''' + target = np.array([[0,0,1]]).repeat(len(forward), axis=0) + root_quat = qbetween_np(forward, target) # angle from root to Z+ (= how much to rotate root such that it faces Z+) + + '''Inverse Kinematics''' + # quat_params (batch_size, joints_num, 4) + # print(joints.shape[:-1]) + quat_params = np.zeros(joints.shape[:-1] + (4,)) + # print(quat_params.shape) + # root_quat[0] = np.array([[1.0, 0.0, 0.0, 0.0]]) # this is a bug: the rotation of next joint in chain is computed wrt the root joint, which is now 0, but the next joint was not moved so it is like a huge rotation + quat_params[:, 0] = root_quat + # quat_params[0, 0] = np.array([[1.0, 0.0, 0.0, 0.0]]) + for chain in self._kinematic_tree: + R = root_quat + for j in range(len(chain) - 1): + # (batch, 3) + u = self._raw_offset_np[chain[j+1]][np.newaxis,...].repeat(len(joints), axis=0) # rest-pose bone direction for joint j in the chain + # print(u.shape) + # (batch, 3) + v = joints[:, chain[j+1]] - joints[:, chain[j]] # data bone direction for joint j+1 in the chain + v = v / np.sqrt((v**2).sum(axis=-1))[:, np.newaxis] + # print(u.shape, v.shape) + rot_u_v = qbetween_np(u, v) # angle betweem rest-pose bone and data bone (bone is j to j+1) + + R_loc = qmul_np(qinv_np(R), rot_u_v) # bring angle to be local coordinate system, i.e., relative to the parent bone + + quat_params[:,chain[j + 1], :] = R_loc + R = qmul_np(R, R_loc) + + return quat_params + + # Be sure root joint is at the beginning of kinematic chains + def forward_kinematics(self, quat_params, root_pos, skel_joints=None, do_root_R=True): + # quat_params (batch_size, joints_num, 4) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(quat_params.shape[0], -1, -1) + joints = torch.zeros(quat_params.shape[:-1] + (3,)).to(self.device) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + R = quat_params[:, 0] + else: + R = torch.tensor([[1.0, 0.0, 0.0, 0.0]]).expand(len(quat_params), -1).detach().to(self.device) + for i in range(1, len(chain)): + R = qmul(R, quat_params[:, chain[i]]) + offset_vec = offsets[:, chain[i]] + joints[:, chain[i]] = qrot(R, offset_vec) + joints[:, chain[i-1]] + return joints + + # Be sure root joint is at the beginning of kinematic chains + def forward_kinematics_np(self, quat_params, root_pos, skel_joints=None, do_root_R=True): + # quat_params (batch_size, joints_num, 4) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(quat_params.shape[0], -1, -1) + offsets = offsets.numpy() + joints = np.zeros(quat_params.shape[:-1] + (3,)) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + R = quat_params[:, 0] + else: + R = np.array([[1.0, 0.0, 0.0, 0.0]]).repeat(len(quat_params), axis=0) + for i in range(1, len(chain)): + R = qmul_np(R, quat_params[:, chain[i]]) + offset_vec = offsets[:, chain[i]] + joints[:, chain[i]] = qrot_np(R, offset_vec) + joints[:, chain[i - 1]] + return joints + + def forward_kinematics_cont6d_np(self, cont6d_params, root_pos, skel_joints=None, do_root_R=True): + # cont6d_params (batch_size, joints_num, 6) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(cont6d_params.shape[0], -1, -1) + offsets = offsets.numpy() + joints = np.zeros(cont6d_params.shape[:-1] + (3,)) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + matR = cont6d_to_matrix_np(cont6d_params[:, 0]) + else: + matR = np.eye(3)[np.newaxis, :].repeat(len(cont6d_params), axis=0) + for i in range(1, len(chain)): + matR = np.matmul(matR, cont6d_to_matrix_np(cont6d_params[:, chain[i]])) + offset_vec = offsets[:, chain[i]][..., np.newaxis] + # print(matR.shape, offset_vec.shape) + joints[:, chain[i]] = np.matmul(matR, offset_vec).squeeze(-1) + joints[:, chain[i-1]] + return joints + + def forward_kinematics_cont6d(self, cont6d_params, root_pos, skel_joints=None, do_root_R=True): + # cont6d_params (batch_size, joints_num, 6) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + # skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(cont6d_params.shape[0], -1, -1) + joints = torch.zeros(cont6d_params.shape[:-1] + (3,)).to(cont6d_params.device) + joints[..., 0, :] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + matR = cont6d_to_matrix(cont6d_params[:, 0]) + else: + matR = torch.eye(3).expand((len(cont6d_params), -1, -1)).detach().to(cont6d_params.device) + for i in range(1, len(chain)): + matR = torch.matmul(matR, cont6d_to_matrix(cont6d_params[:, chain[i]])) + offset_vec = offsets[:, chain[i]].unsqueeze(-1) + # print(matR.shape, offset_vec.shape) + joints[:, chain[i]] = torch.matmul(matR, offset_vec).squeeze(-1) + joints[:, chain[i-1]] + return joints + + + + + diff --git a/src/mdm/data_loaders/humanml/data/__init__.py b/src/mdm/data_loaders/humanml/data/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/mdm/data_loaders/humanml/data/dataset.py b/src/mdm/data_loaders/humanml/data/dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..eeed96557d9842a33486fa5c861bf27393839145 --- /dev/null +++ b/src/mdm/data_loaders/humanml/data/dataset.py @@ -0,0 +1,823 @@ +import torch +from torch.utils import data +import numpy as np +import os +from os.path import join as pjoin +import random +import codecs as cs +from tqdm import tqdm +import spacy + +from torch.utils.data._utils.collate import default_collate +from data_loaders.humanml.utils.word_vectorizer import WordVectorizer +from data_loaders.humanml.utils.get_opt import get_opt + +# import spacy + +def collate_fn(batch): + batch.sort(key=lambda x: x[3], reverse=True) + return default_collate(batch) + + +'''For use of training text-2-motion generative model''' +class Text2MotionDataset(data.Dataset): + def __init__(self, opt, mean, std, split_file, w_vectorizer): + self.opt = opt + self.w_vectorizer = w_vectorizer + self.max_length = 20 + self.pointer = 0 + min_motion_len = 40 if self.opt.dataset_name =='t2m' else 24 + + joints_num = opt.joints_num + + data_dict = {} + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + + new_name_list = [] + length_list = [] + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if (len(motion)) < min_motion_len or (len(motion) >= 200): + continue + text_data = [] + flag = False + with cs.open(pjoin(opt.text_dir, name + '.txt')) as f: + for line in f.readlines(): + text_dict = {} + line_split = line.strip().split('#') + caption = line_split[0] + tokens = line_split[1].split(' ') + f_tag = float(line_split[2]) + to_tag = float(line_split[3]) + f_tag = 0.0 if np.isnan(f_tag) else f_tag + to_tag = 0.0 if np.isnan(to_tag) else to_tag + + text_dict['caption'] = caption + text_dict['tokens'] = tokens + if f_tag == 0.0 and to_tag == 0.0: + flag = True + text_data.append(text_dict) + else: + try: + n_motion = motion[int(f_tag*20) : int(to_tag*20)] + if (len(n_motion)) < min_motion_len or (len(n_motion) >= 200): + continue + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + while new_name in data_dict: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + data_dict[new_name] = {'motion': n_motion, + 'length': len(n_motion), + 'text':[text_dict]} + new_name_list.append(new_name) + length_list.append(len(n_motion)) + except: + print(line_split) + print(line_split[2], line_split[3], f_tag, to_tag, name) + # break + + if flag: + data_dict[name] = {'motion': motion, + 'length': len(motion), + 'text':text_data} + new_name_list.append(name) + length_list.append(len(motion)) + except: + # Some motion may not exist in KIT dataset + pass + + + name_list, length_list = zip(*sorted(zip(new_name_list, length_list), key=lambda x: x[1])) + + if opt.is_train: + # root_rot_velocity (B, seq_len, 1) + std[0:1] = std[0:1] / opt.feat_bias + # root_linear_velocity (B, seq_len, 2) + std[1:3] = std[1:3] / opt.feat_bias + # root_y (B, seq_len, 1) + std[3:4] = std[3:4] / opt.feat_bias + # ric_data (B, seq_len, (joint_num - 1)*3) + std[4: 4 + (joints_num - 1) * 3] = std[4: 4 + (joints_num - 1) * 3] / 1.0 + # rot_data (B, seq_len, (joint_num - 1)*6) + std[4 + (joints_num - 1) * 3: 4 + (joints_num - 1) * 9] = std[4 + (joints_num - 1) * 3: 4 + ( + joints_num - 1) * 9] / 1.0 + # local_velocity (B, seq_len, joint_num*3) + std[4 + (joints_num - 1) * 9: 4 + (joints_num - 1) * 9 + joints_num * 3] = std[ + 4 + (joints_num - 1) * 9: 4 + ( + joints_num - 1) * 9 + joints_num * 3] / 1.0 + # foot contact (B, seq_len, 4) + std[4 + (joints_num - 1) * 9 + joints_num * 3:] = std[ + 4 + (joints_num - 1) * 9 + joints_num * 3:] / opt.feat_bias + + assert 4 + (joints_num - 1) * 9 + joints_num * 3 + 4 == mean.shape[-1] + np.save(pjoin(opt.meta_dir, 'mean.npy'), mean) + np.save(pjoin(opt.meta_dir, 'std.npy'), std) + + self.mean = mean + self.std = std + self.length_arr = np.array(length_list) + self.data_dict = data_dict + self.name_list = name_list + self.reset_max_len(self.max_length) + + def reset_max_len(self, length): + assert length <= self.opt.max_motion_length + self.pointer = np.searchsorted(self.length_arr, length) + print("Pointer Pointing at %d"%self.pointer) + self.max_length = length + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) - self.pointer + + def __getitem__(self, item): + idx = self.pointer + item + data = self.data_dict[self.name_list[idx]] + motion, m_length, text_list = data['motion'], data['length'], data['text'] + # Randomly select a caption + text_data = random.choice(text_list) + caption, tokens = text_data['caption'], text_data['tokens'] + + if len(tokens) < self.opt.max_text_len: + # pad with "unk" + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + tokens = tokens + ['unk/OTHER'] * (self.opt.max_text_len + 2 - sent_len) + else: + # crop + tokens = tokens[:self.opt.max_text_len] + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + len_gap = (m_length - self.max_length) // self.opt.unit_length + + if self.opt.is_train: + if m_length != self.max_length: + # print("Motion original length:%d_%d"%(m_length, len(motion))) + if self.opt.unit_length < 10: + coin2 = np.random.choice(['single', 'single', 'double']) + else: + coin2 = 'single' + if len_gap == 0 or (len_gap == 1 and coin2 == 'double'): + m_length = self.max_length + idx = random.randint(0, m_length - self.max_length) + motion = motion[idx:idx+self.max_length] + else: + if coin2 == 'single': + n_m_length = self.max_length + self.opt.unit_length * len_gap + else: + n_m_length = self.max_length + self.opt.unit_length * (len_gap - 1) + idx = random.randint(0, m_length - n_m_length) + motion = motion[idx:idx + self.max_length] + m_length = n_m_length + # print(len_gap, idx, coin2) + else: + if self.opt.unit_length < 10: + coin2 = np.random.choice(['single', 'single', 'double']) + else: + coin2 = 'single' + + if coin2 == 'double': + m_length = (m_length // self.opt.unit_length - 1) * self.opt.unit_length + elif coin2 == 'single': + m_length = (m_length // self.opt.unit_length) * self.opt.unit_length + idx = random.randint(0, len(motion) - m_length) + motion = motion[idx:idx+m_length] + + "Z Normalization" + motion = (motion - self.mean) / self.std + + return word_embeddings, pos_one_hots, caption, sent_len, motion, m_length + + +'''For use of training text motion matching model, and evaluations''' +class Text2MotionDatasetV2(data.Dataset): + def __init__(self, opt, mean, std, split_file, w_vectorizer): + self.opt = opt + self.w_vectorizer = w_vectorizer + self.max_length = 20 + if self.opt.fixed_len > 0: + self.max_length = self.opt.fixed_len + self.pointer = 0 + self.max_motion_length = opt.max_motion_length + min_motion_len = 40 if self.opt.dataset_name =='t2m' else 24 + + data_dict = {} + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + # id_list = id_list[:200] + + new_name_list = [] + length_list = [] + + _split = os.path.basename(split_file).replace('.txt', '') + _name ='' + # cache_path = os.path.join(opt.meta_dir, self.opt.dataset_name + '_' + _split + _name + '.npy') + cache_path = os.path.join(opt.cache_dir, 'dataset', self.opt.dataset_name + '_' + _split + _name + '.npy') + if opt.use_cache and os.path.exists(cache_path): + print(f'Loading motions from cache file [{cache_path}]...') + _cache = np.load(cache_path, allow_pickle=True)[None][0] + name_list, length_list, data_dict = _cache['name_list'], _cache['length_list'], _cache['data_dict'] + # name_list = name_list[:15]; length_list = length_list[:15] + # data_dict = {key: data_dict[key] for key in name_list} + else: + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if (len(motion)) < min_motion_len or (len(motion) >= 200): + continue + text_data = [] + flag = False + with cs.open(pjoin(opt.text_dir, name + '.txt')) as f: + for line in f.readlines(): + text_dict = {} + line_split = line.strip().split('#') + caption = line_split[0] + tokens = line_split[1].split(' ') + f_tag = float(line_split[2]) + to_tag = float(line_split[3]) + f_tag = 0.0 if np.isnan(f_tag) else f_tag + to_tag = 0.0 if np.isnan(to_tag) else to_tag + + text_dict['caption'] = caption + text_dict['tokens'] = tokens + if f_tag == 0.0 and to_tag == 0.0: + flag = True + text_data.append(text_dict) + else: + try: + n_motion = motion[int(f_tag*20) : int(to_tag*20)] + if (len(n_motion)) < min_motion_len or (len(n_motion) >= 200): + continue + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + while new_name in data_dict: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + data_dict[new_name] = {'motion': n_motion, + 'length': len(n_motion), + 'text':[text_dict]} + new_name_list.append(new_name) + length_list.append(len(n_motion)) + except: + print(line_split) + print(line_split[2], line_split[3], f_tag, to_tag, name) + # break + + if flag: + data_dict[name] = {'motion': motion, + 'length': len(motion), + 'text': text_data} + new_name_list.append(name) + length_list.append(len(motion)) + except: + pass + + name_list, length_list = zip(*sorted(zip(new_name_list, length_list), key=lambda x: x[1])) + print(f'Saving motions to cache file [{cache_path}]...') + np.save(cache_path, { + 'name_list': name_list, + 'length_list': length_list, + 'data_dict': data_dict}) + + self.mean = mean + self.std = std + self.length_arr = np.array(length_list) + self.data_dict = data_dict + self.name_list = name_list + self.reset_max_len(self.max_length) + + def reset_max_len(self, length): + assert length <= self.max_motion_length + self.pointer = np.searchsorted(self.length_arr, length) + print("Pointer Pointing at %d"%self.pointer) + self.max_length = length + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) - self.pointer + + def __getitem__(self, item): + idx = self.pointer + item + key = self.name_list[idx] + data = self.data_dict[key] + motion, m_length, text_list = data['motion'], data['length'], data['text'] + # Randomly select a caption + text_data = random.choice(text_list) + caption, tokens = text_data['caption'], text_data['tokens'] + + if len(tokens) < self.opt.max_text_len: + # pad with "unk" + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + tokens = tokens + ['unk/OTHER'] * (self.opt.max_text_len + 2 - sent_len) + else: + # crop + tokens = tokens[:self.opt.max_text_len] + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + # Crop the motions in to times of 4, and introduce small variations + if self.opt.unit_length < 10: + coin2 = np.random.choice(['single', 'single', 'double']) + else: + coin2 = 'single' + + if coin2 == 'double': + m_length = (m_length // self.opt.unit_length - 1) * self.opt.unit_length + elif coin2 == 'single': + m_length = (m_length // self.opt.unit_length) * self.opt.unit_length + + original_length = None + if self.opt.fixed_len > 0: + # Crop fixed_len + original_length = m_length + m_length = self.opt.fixed_len + + idx = random.randint(0, len(motion) - m_length) + if self.opt.disable_offset_aug: + idx = random.randint(0, self.opt.unit_length) + motion = motion[idx:idx+m_length] + + "Z Normalization" + motion = (motion - self.mean) / self.std + + if m_length < self.max_motion_length: + motion = np.concatenate([motion, + np.zeros((self.max_motion_length - m_length, motion.shape[1])) + ], axis=0) + # print(word_embeddings.shape, motion.shape) + # print(tokens) + + length = (original_length, m_length) if self.opt.fixed_len > 0 else m_length + + return word_embeddings, pos_one_hots, caption, sent_len, motion, length, '_'.join(tokens) + + +'''For use of training baseline''' +class Text2MotionDatasetBaseline(data.Dataset): + def __init__(self, opt, mean, std, split_file, w_vectorizer): + self.opt = opt + self.w_vectorizer = w_vectorizer + self.max_length = 20 + self.pointer = 0 + self.max_motion_length = opt.max_motion_length + min_motion_len = 40 if self.opt.dataset_name =='t2m' else 24 + + data_dict = {} + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + # id_list = id_list[:200] + + new_name_list = [] + length_list = [] + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if (len(motion)) < min_motion_len or (len(motion) >= 200): + continue + text_data = [] + flag = False + with cs.open(pjoin(opt.text_dir, name + '.txt')) as f: + for line in f.readlines(): + text_dict = {} + line_split = line.strip().split('#') + caption = line_split[0] + tokens = line_split[1].split(' ') + f_tag = float(line_split[2]) + to_tag = float(line_split[3]) + f_tag = 0.0 if np.isnan(f_tag) else f_tag + to_tag = 0.0 if np.isnan(to_tag) else to_tag + + text_dict['caption'] = caption + text_dict['tokens'] = tokens + if f_tag == 0.0 and to_tag == 0.0: + flag = True + text_data.append(text_dict) + else: + try: + n_motion = motion[int(f_tag*20) : int(to_tag*20)] + if (len(n_motion)) < min_motion_len or (len(n_motion) >= 200): + continue + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + while new_name in data_dict: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + data_dict[new_name] = {'motion': n_motion, + 'length': len(n_motion), + 'text':[text_dict]} + new_name_list.append(new_name) + length_list.append(len(n_motion)) + except: + print(line_split) + print(line_split[2], line_split[3], f_tag, to_tag, name) + # break + + if flag: + data_dict[name] = {'motion': motion, + 'length': len(motion), + 'text': text_data} + new_name_list.append(name) + length_list.append(len(motion)) + except: + pass + + name_list, length_list = zip(*sorted(zip(new_name_list, length_list), key=lambda x: x[1])) + + self.mean = mean + self.std = std + self.length_arr = np.array(length_list) + self.data_dict = data_dict + self.name_list = name_list + self.reset_max_len(self.max_length) + + def reset_max_len(self, length): + assert length <= self.max_motion_length + self.pointer = np.searchsorted(self.length_arr, length) + print("Pointer Pointing at %d"%self.pointer) + self.max_length = length + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) - self.pointer + + def __getitem__(self, item): + idx = self.pointer + item + data = self.data_dict[self.name_list[idx]] + motion, m_length, text_list = data['motion'], data['length'], data['text'] + # Randomly select a caption + text_data = random.choice(text_list) + caption, tokens = text_data['caption'], text_data['tokens'] + + if len(tokens) < self.opt.max_text_len: + # pad with "unk" + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + tokens = tokens + ['unk/OTHER'] * (self.opt.max_text_len + 2 - sent_len) + else: + # crop + tokens = tokens[:self.opt.max_text_len] + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + len_gap = (m_length - self.max_length) // self.opt.unit_length + + if m_length != self.max_length: + # print("Motion original length:%d_%d"%(m_length, len(motion))) + if self.opt.unit_length < 10: + coin2 = np.random.choice(['single', 'single', 'double']) + else: + coin2 = 'single' + if len_gap == 0 or (len_gap == 1 and coin2 == 'double'): + m_length = self.max_length + s_idx = random.randint(0, m_length - self.max_length) + else: + if coin2 == 'single': + n_m_length = self.max_length + self.opt.unit_length * len_gap + else: + n_m_length = self.max_length + self.opt.unit_length * (len_gap - 1) + s_idx = random.randint(0, m_length - n_m_length) + m_length = n_m_length + else: + s_idx = 0 + + src_motion = motion[s_idx: s_idx + m_length] + tgt_motion = motion[s_idx: s_idx + self.max_length] + + "Z Normalization" + src_motion = (src_motion - self.mean) / self.std + tgt_motion = (tgt_motion - self.mean) / self.std + + if m_length < self.max_motion_length: + src_motion = np.concatenate([src_motion, + np.zeros((self.max_motion_length - m_length, motion.shape[1])) + ], axis=0) + # print(m_length, src_motion.shape, tgt_motion.shape) + # print(word_embeddings.shape, motion.shape) + # print(tokens) + return word_embeddings, caption, sent_len, src_motion, tgt_motion, m_length + + +class MotionDatasetV2(data.Dataset): + def __init__(self, opt, mean, std, split_file): + self.opt = opt + joints_num = opt.joints_num + + self.data = [] + self.lengths = [] + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if motion.shape[0] < opt.window_size: + continue + self.lengths.append(motion.shape[0] - opt.window_size) + self.data.append(motion) + except: + # Some motion may not exist in KIT dataset + pass + + self.cumsum = np.cumsum([0] + self.lengths) + + if opt.is_train: + # root_rot_velocity (B, seq_len, 1) + std[0:1] = std[0:1] / opt.feat_bias + # root_linear_velocity (B, seq_len, 2) + std[1:3] = std[1:3] / opt.feat_bias + # root_y (B, seq_len, 1) + std[3:4] = std[3:4] / opt.feat_bias + # ric_data (B, seq_len, (joint_num - 1)*3) + std[4: 4 + (joints_num - 1) * 3] = std[4: 4 + (joints_num - 1) * 3] / 1.0 + # rot_data (B, seq_len, (joint_num - 1)*6) + std[4 + (joints_num - 1) * 3: 4 + (joints_num - 1) * 9] = std[4 + (joints_num - 1) * 3: 4 + ( + joints_num - 1) * 9] / 1.0 + # local_velocity (B, seq_len, joint_num*3) + std[4 + (joints_num - 1) * 9: 4 + (joints_num - 1) * 9 + joints_num * 3] = std[ + 4 + (joints_num - 1) * 9: 4 + ( + joints_num - 1) * 9 + joints_num * 3] / 1.0 + # foot contact (B, seq_len, 4) + std[4 + (joints_num - 1) * 9 + joints_num * 3:] = std[ + 4 + (joints_num - 1) * 9 + joints_num * 3:] / opt.feat_bias + + assert 4 + (joints_num - 1) * 9 + joints_num * 3 + 4 == mean.shape[-1] + np.save(pjoin(opt.meta_dir, 'mean.npy'), mean) + np.save(pjoin(opt.meta_dir, 'std.npy'), std) + + self.mean = mean + self.std = std + print("Total number of motions {}, snippets {}".format(len(self.data), self.cumsum[-1])) + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return self.cumsum[-1] + + def __getitem__(self, item): + if item != 0: + motion_id = np.searchsorted(self.cumsum, item) - 1 + idx = item - self.cumsum[motion_id] - 1 + else: + motion_id = 0 + idx = 0 + motion = self.data[motion_id][idx:idx+self.opt.window_size] + "Z Normalization" + motion = (motion - self.mean) / self.std + + return motion + + +class RawTextDataset(data.Dataset): + def __init__(self, opt, mean, std, text_file, w_vectorizer): + self.mean = mean + self.std = std + self.opt = opt + self.data_dict = [] + self.nlp = spacy.load('en_core_web_sm') + + with cs.open(text_file) as f: + for line in f.readlines(): + word_list, pos_list = self.process_text(line.strip()) + tokens = ['%s/%s'%(word_list[i], pos_list[i]) for i in range(len(word_list))] + self.data_dict.append({'caption':line.strip(), "tokens":tokens}) + + self.w_vectorizer = w_vectorizer + print("Total number of descriptions {}".format(len(self.data_dict))) + + + def process_text(self, sentence): + sentence = sentence.replace('-', '') + doc = self.nlp(sentence) + word_list = [] + pos_list = [] + for token in doc: + word = token.text + if not word.isalpha(): + continue + if (token.pos_ == 'NOUN' or token.pos_ == 'VERB') and (word != 'left'): + word_list.append(token.lemma_) + else: + word_list.append(word) + pos_list.append(token.pos_) + return word_list, pos_list + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) + + def __getitem__(self, item): + data = self.data_dict[item] + caption, tokens = data['caption'], data['tokens'] + + if len(tokens) < self.opt.max_text_len: + # pad with "unk" + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + tokens = tokens + ['unk/OTHER'] * (self.opt.max_text_len + 2 - sent_len) + else: + # crop + tokens = tokens[:self.opt.max_text_len] + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + return word_embeddings, pos_one_hots, caption, sent_len + +class TextOnlyDataset(data.Dataset): + def __init__(self, opt, mean, std, split_file): + self.mean = mean + self.std = std + self.opt = opt + self.data_dict = [] + self.max_length = 20 + self.pointer = 0 + self.fixed_length = 120 + + + data_dict = {} + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + # id_list = id_list[:200] + + new_name_list = [] + length_list = [] + for name in tqdm(id_list): + try: + text_data = [] + flag = False + with cs.open(pjoin(opt.text_dir, name + '.txt')) as f: + for line in f.readlines(): + text_dict = {} + line_split = line.strip().split('#') + caption = line_split[0] + tokens = line_split[1].split(' ') + f_tag = float(line_split[2]) + to_tag = float(line_split[3]) + f_tag = 0.0 if np.isnan(f_tag) else f_tag + to_tag = 0.0 if np.isnan(to_tag) else to_tag + + text_dict['caption'] = caption + text_dict['tokens'] = tokens + if f_tag == 0.0 and to_tag == 0.0: + flag = True + text_data.append(text_dict) + else: + try: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + while new_name in data_dict: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + data_dict[new_name] = {'text':[text_dict]} + new_name_list.append(new_name) + except: + print(line_split) + print(line_split[2], line_split[3], f_tag, to_tag, name) + # break + + if flag: + data_dict[name] = {'text': text_data} + new_name_list.append(name) + except: + pass + + self.length_arr = np.array(length_list) + self.data_dict = data_dict + self.name_list = new_name_list + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) + + def __getitem__(self, item): + idx = self.pointer + item + data = self.data_dict[self.name_list[idx]] + text_list = data['text'] + + # Randomly select a caption + text_data = random.choice(text_list) + caption, tokens = text_data['caption'], text_data['tokens'] + return None, None, caption, None, np.array([0]), self.fixed_length, None + # fixed_length can be set from outside before sampling + +# A wrapper class for t2m original dataset for MDM purposes +class HumanML3D(data.Dataset): + def __init__(self, mode, datapath='./dataset/humanml_opt.txt', split="train", **kwargs): + self.mode = mode + + self.dataset_name = 't2m' + self.dataname = 't2m' + + # Configurations of T2M dataset and KIT dataset is almost the same + abs_base_path = kwargs.get('abs_path', '.') + dataset_opt_path = pjoin(abs_base_path, datapath) + device = kwargs.get('device', None) + opt = get_opt(dataset_opt_path, device) + # opt.meta_dir = pjoin(abs_base_path, opt.meta_dir) + opt.cache_dir = kwargs.get('cache_path', '.') + opt.motion_dir = pjoin(abs_base_path, opt.motion_dir) + opt.text_dir = pjoin(abs_base_path, opt.text_dir) + opt.model_dir = pjoin(abs_base_path, opt.model_dir) + opt.checkpoints_dir = pjoin(abs_base_path, opt.checkpoints_dir) + opt.data_root = pjoin(abs_base_path, opt.data_root) + opt.save_root = pjoin(abs_base_path, opt.save_root) + opt.meta_dir = pjoin(abs_base_path, './dataset') + opt.use_cache = kwargs.get('use_cache', True) + opt.fixed_len = kwargs.get('fixed_len', 0) + if opt.fixed_len > 0: + opt.max_motion_length = opt.fixed_len + is_autoregressive = kwargs.get('autoregressive', False) + opt.disable_offset_aug = is_autoregressive and (opt.fixed_len > 0) and (mode == 'eval') # for autoregressive evaluation, use the start of the motion and not something from the middle + self.opt = opt + print('Loading dataset %s ...' % opt.dataset_name) + + if mode == 'gt': + # used by T2M models (including evaluators) + self.mean = np.load(pjoin(opt.meta_dir, f'{opt.dataset_name}_mean.npy')) + self.std = np.load(pjoin(opt.meta_dir, f'{opt.dataset_name}_std.npy')) + elif mode in ['train', 'eval', 'text_only']: + # used by our models + self.mean = np.load(pjoin(opt.data_root, 'Mean.npy')) + self.std = np.load(pjoin(opt.data_root, 'Std.npy')) + + if mode == 'eval': + # used by T2M models (including evaluators) + # this is to translate their norms to ours + self.mean_for_eval = np.load(pjoin(opt.meta_dir, f'{opt.dataset_name}_mean.npy')) + self.std_for_eval = np.load(pjoin(opt.meta_dir, f'{opt.dataset_name}_std.npy')) + + self.split_file = pjoin(opt.data_root, f'{split}.txt') + if mode == 'text_only': + self.t2m_dataset = TextOnlyDataset(self.opt, self.mean, self.std, self.split_file) + else: + self.w_vectorizer = WordVectorizer(pjoin(opt.cache_dir, 'glove'), 'our_vab') + self.t2m_dataset = Text2MotionDatasetV2(self.opt, self.mean, self.std, self.split_file, self.w_vectorizer) + self.num_actions = 1 # dummy placeholder + + self.mean_gpu = torch.tensor(self.mean).to(device)[None, :, None, None] + self.std_gpu = torch.tensor(self.std).to(device)[None, :, None, None] + + assert len(self.t2m_dataset) > 1, 'You loaded an empty dataset, ' \ + 'it is probably because your data dir has only texts and no motions.\n' \ + 'To train and evaluate MDM you should get the FULL data as described ' \ + 'in the README file.' + + def __getitem__(self, item): + return self.t2m_dataset.__getitem__(item) + + def __len__(self): + return self.t2m_dataset.__len__() + +# A wrapper class for t2m original dataset for MDM purposes +class KIT(HumanML3D): + def __init__(self, mode, datapath='./dataset/kit_opt.txt', split="train", **kwargs): + super(KIT, self).__init__(mode, datapath, split, **kwargs) \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/motion_loaders/__init__.py b/src/mdm/data_loaders/humanml/motion_loaders/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/mdm/data_loaders/humanml/motion_loaders/comp_v6_model_dataset.py b/src/mdm/data_loaders/humanml/motion_loaders/comp_v6_model_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..53d5e57e8e2cd536695f5d806a1a5cd4143bf7a8 --- /dev/null +++ b/src/mdm/data_loaders/humanml/motion_loaders/comp_v6_model_dataset.py @@ -0,0 +1,285 @@ +import torch +from data_loaders.humanml.networks.modules import * +from data_loaders.humanml.networks.trainers import CompTrainerV6 +from torch.utils.data import Dataset, DataLoader +from os.path import join as pjoin +from tqdm import tqdm +from utils import dist_util +from utils.sampler_util import AutoRegressiveSampler + + +def build_models(opt): + if opt.text_enc_mod == 'bigru': + text_encoder = TextEncoderBiGRU(word_size=opt.dim_word, + pos_size=opt.dim_pos_ohot, + hidden_size=opt.dim_text_hidden, + device=opt.device) + text_size = opt.dim_text_hidden * 2 + else: + raise Exception("Text Encoder Mode not Recognized!!!") + + seq_prior = TextDecoder(text_size=text_size, + input_size=opt.dim_att_vec + opt.dim_movement_latent, + output_size=opt.dim_z, + hidden_size=opt.dim_pri_hidden, + n_layers=opt.n_layers_pri) + + + seq_decoder = TextVAEDecoder(text_size=text_size, + input_size=opt.dim_att_vec + opt.dim_z + opt.dim_movement_latent, + output_size=opt.dim_movement_latent, + hidden_size=opt.dim_dec_hidden, + n_layers=opt.n_layers_dec) + + att_layer = AttLayer(query_dim=opt.dim_pos_hidden, + key_dim=text_size, + value_dim=opt.dim_att_vec) + + movement_enc = MovementConvEncoder(opt.dim_pose - 4, opt.dim_movement_enc_hidden, opt.dim_movement_latent) + movement_dec = MovementConvDecoder(opt.dim_movement_latent, opt.dim_movement_dec_hidden, opt.dim_pose) + + len_estimator = MotionLenEstimatorBiGRU(opt.dim_word, opt.dim_pos_ohot, 512, opt.num_classes) + + # latent_dis = LatentDis(input_size=opt.dim_z * 2) + checkpoints = torch.load(pjoin(opt.checkpoints_dir, opt.dataset_name, 'length_est_bigru', 'model', 'latest.tar'), map_location=opt.device) + len_estimator.load_state_dict(checkpoints['estimator']) + len_estimator.to(opt.device) + len_estimator.eval() + + # return text_encoder, text_decoder, att_layer, vae_pri, vae_dec, vae_pos, motion_dis, movement_dis, latent_dis + return text_encoder, seq_prior, seq_decoder, att_layer, movement_enc, movement_dec, len_estimator + +class CompV6GeneratedDataset(Dataset): + + def __init__(self, opt, dataset, w_vectorizer, mm_num_samples, mm_num_repeats): + assert mm_num_samples < len(dataset) + print(opt.model_dir) + + dataloader = DataLoader(dataset, batch_size=1, num_workers=1, shuffle=True) + text_enc, seq_pri, seq_dec, att_layer, mov_enc, mov_dec, len_estimator = build_models(opt) + trainer = CompTrainerV6(opt, text_enc, seq_pri, seq_dec, att_layer, mov_dec, mov_enc=mov_enc) + epoch, it, sub_ep, schedule_len = trainer.load(pjoin(opt.model_dir, opt.which_epoch + '.tar')) + generated_motion = [] + mm_generated_motions = [] + mm_idxs = np.random.choice(len(dataset), mm_num_samples, replace=False) + mm_idxs = np.sort(mm_idxs) + min_mov_length = 10 if opt.dataset_name == 't2m' else 6 + # print(mm_idxs) + + print('Loading model: Epoch %03d Schedule_len %03d' % (epoch, schedule_len)) + trainer.eval_mode() + trainer.to(opt.device) + with torch.no_grad(): + for i, data in tqdm(enumerate(dataloader)): + word_emb, pos_ohot, caption, cap_lens, motions, m_lens, tokens = data + tokens = tokens[0].split('_') + word_emb = word_emb.detach().to(opt.device).float() + pos_ohot = pos_ohot.detach().to(opt.device).float() + + pred_dis = len_estimator(word_emb, pos_ohot, cap_lens) + pred_dis = nn.Softmax(-1)(pred_dis).squeeze() + + mm_num_now = len(mm_generated_motions) + is_mm = True if ((mm_num_now < mm_num_samples) and (i == mm_idxs[mm_num_now])) else False + + repeat_times = mm_num_repeats if is_mm else 1 + mm_motions = [] + for t in range(repeat_times): + mov_length = torch.multinomial(pred_dis, 1, replacement=True) + if mov_length < min_mov_length: + mov_length = torch.multinomial(pred_dis, 1, replacement=True) + if mov_length < min_mov_length: + mov_length = torch.multinomial(pred_dis, 1, replacement=True) + + m_lens = mov_length * opt.unit_length + pred_motions, _, _ = trainer.generate(word_emb, pos_ohot, cap_lens, m_lens, + m_lens[0]//opt.unit_length, opt.dim_pose) + if t == 0: + # print(m_lens) + # print(text_data) + sub_dict = {'motion': pred_motions[0].cpu().numpy(), + 'length': m_lens[0].item(), + 'cap_len': cap_lens[0].item(), + 'caption': caption[0], + 'tokens': tokens} + generated_motion.append(sub_dict) + + if is_mm: + mm_motions.append({ + 'motion': pred_motions[0].cpu().numpy(), + 'length': m_lens[0].item() + }) + if is_mm: + mm_generated_motions.append({'caption': caption[0], + 'tokens': tokens, + 'cap_len': cap_lens[0].item(), + 'mm_motions': mm_motions}) + + self.generated_motion = generated_motion + self.mm_generated_motion = mm_generated_motions + self.opt = opt + self.w_vectorizer = w_vectorizer + + + def __len__(self): + return len(self.generated_motion) + + + def __getitem__(self, item): + data = self.generated_motion[item] + motion, m_length, caption, tokens = data['motion'], data['length'], data['caption'], data['tokens'] + sent_len = data['cap_len'] + + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + if m_length < self.opt.max_motion_length: + motion = np.concatenate([motion, + np.zeros((self.opt.max_motion_length - m_length, motion.shape[1])) + ], axis=0) + return word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, '_'.join(tokens) + +class CompMDMGeneratedDataset(Dataset): + + def __init__(self, args, model, diffusion, dataloader, mm_num_samples, mm_num_repeats, max_motion_length, num_samples_limit, scale=1.): + self.args = args + self.dataloader = dataloader + self.dataset = dataloader.dataset + self.model = model + assert mm_num_samples < len(dataloader.dataset) + use_ddim = False # FIXME - hardcoded + clip_denoised = False # FIXME - hardcoded + self.max_motion_length = max_motion_length + sample_fn = ( + diffusion.p_sample_loop if not use_ddim else diffusion.ddim_sample_loop + ) + if self.args.autoregressive: + sample_cls = AutoRegressiveSampler(args, sample_fn) + sample_fn = sample_cls.sample + + + real_num_batches = len(dataloader) + if num_samples_limit is not None: + real_num_batches = min(num_samples_limit // dataloader.batch_size + 1, real_num_batches) + print('real_num_batches', real_num_batches) + + generated_motion = [] + mm_generated_motions = [] + if mm_num_samples > 0: + mm_idxs = np.random.choice(real_num_batches, mm_num_samples // dataloader.batch_size +1, replace=False) + mm_idxs = np.sort(mm_idxs) + else: + mm_idxs = [] + print('mm_idxs', mm_idxs) + + model.eval() + + + with torch.no_grad(): + for i, (motion, model_kwargs) in tqdm(enumerate(dataloader)): + + if num_samples_limit is not None and len(generated_motion) >= num_samples_limit: + break + + model_kwargs['y'] = {key: val.to(dist_util.dev()) if torch.is_tensor(val) else val for key, val in model_kwargs['y'].items()} + motion = motion.to(dist_util.dev()) + + tokens = [t.split('_') for t in model_kwargs['y']['tokens']] + + # add CFG scale to batch + if scale != 1.: + model_kwargs['y']['scale'] = torch.ones(motion.shape[0], + device=dist_util.dev()) * scale + + mm_num_now = len(mm_generated_motions) // dataloader.batch_size + is_mm = i in mm_idxs + repeat_times = mm_num_repeats if is_mm else 1 + mm_motions = [] + for t in range(repeat_times): + + sample = sample_fn( + model, + motion.shape, + clip_denoised=clip_denoised, + model_kwargs=model_kwargs, + skip_timesteps=0, # 0 is the default value - i.e. don't skip any step + init_image=None, + progress=False, + dump_steps=None, + noise=None, + const_noise=False, + # when experimenting guidance_scale we want to nutrileze the effect of noise on generation + ) + + if 'prefix' in model_kwargs['y'].keys(): + model_kwargs['y']['lengths'] = model_kwargs['y']['orig_lengths'] + + if t == 0: + sub_dicts = [{ + 'motion': sample[bs_i].squeeze().permute(1, 0).cpu().numpy(), + 'length': model_kwargs['y']['lengths'][bs_i].cpu().numpy(), + 'caption': model_kwargs['y']['text'][bs_i], + 'tokens': tokens[bs_i], + # Fixed cap_len calculation, changed from len(tokens[bs_i]) + # Lead to improved R-precision and Multimodal Dist. + # issue: https://github.com/GuyTevet/motion-diffusion-model/issues/182 + 'cap_len': tokens[bs_i].index('eos/OTHER') + 1, + } for bs_i in range(dataloader.batch_size)] + generated_motion += sub_dicts + + if is_mm: + for bs_i in range(dataloader.batch_size): + mm_motion = sample[bs_i].squeeze().permute(1, 0).cpu().numpy() + if self.dataset.mode == 'eval': + mm_motion = self.dataset.t2m_dataset.inv_transform(mm_motion) + mm_motion = (mm_motion - self.dataset.mean_for_eval) / self.dataset.std_for_eval # according to T2M norms + + mm_motions.append({'motion': mm_motion, + 'length': model_kwargs['y']['lengths'][bs_i].cpu().numpy(), + }) + if is_mm: + mm_generated_motions += [{ + 'caption': model_kwargs['y']['text'][bs_i], + 'tokens': tokens[bs_i], + 'cap_len': len(tokens[bs_i]), + 'mm_motions': mm_motions[bs_i::dataloader.batch_size], # collect all 10 repeats from the (32*10) generated motions + } for bs_i in range(dataloader.batch_size)] + + + self.generated_motion = generated_motion + self.mm_generated_motion = mm_generated_motions + self.w_vectorizer = dataloader.dataset.w_vectorizer + + + def __len__(self): + return len(self.generated_motion) + + + def __getitem__(self, item): + data = self.generated_motion[item] + motion, m_length, caption, tokens = data['motion'], data['length'], data['caption'], data['tokens'] + sent_len = data['cap_len'] + + if self.dataset.mode == 'eval': + normed_motion = motion + denormed_motion = self.dataset.t2m_dataset.inv_transform(normed_motion) + renormed_motion = (denormed_motion - self.dataset.mean_for_eval) / self.dataset.std_for_eval # according to T2M norms + motion = renormed_motion + # This step is needed because T2M evaluators expect their norm convention + + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + return word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, '_'.join(tokens) \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/motion_loaders/dataset_motion_loader.py b/src/mdm/data_loaders/humanml/motion_loaders/dataset_motion_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..37fff1d8d7a61a26cdb4df1572bfb6fea22c34bf --- /dev/null +++ b/src/mdm/data_loaders/humanml/motion_loaders/dataset_motion_loader.py @@ -0,0 +1,27 @@ +from t2m.data.dataset import Text2MotionDatasetV2, collate_fn +from t2m.utils.word_vectorizer import WordVectorizer +import numpy as np +from os.path import join as pjoin +from torch.utils.data import DataLoader +from t2m.utils.get_opt import get_opt + +def get_dataset_motion_loader(opt_path, batch_size, device): + opt = get_opt(opt_path, device) + + # Configurations of T2M dataset and KIT dataset is almost the same + if opt.dataset_name == 't2m' or opt.dataset_name == 'kit': + print('Loading dataset %s ...' % opt.dataset_name) + + mean = np.load(pjoin(opt.meta_dir, 'mean.npy')) + std = np.load(pjoin(opt.meta_dir, 'std.npy')) + + w_vectorizer = WordVectorizer('./glove', 'our_vab') + split_file = pjoin(opt.data_root, 'test.txt') + dataset = Text2MotionDatasetV2(opt, mean, std, split_file, w_vectorizer) + dataloader = DataLoader(dataset, batch_size=batch_size, num_workers=4, drop_last=True, + collate_fn=collate_fn, shuffle=True) + else: + raise KeyError('Dataset not Recognized !!') + + print('Ground Truth Dataset Loading Completed!!!') + return dataloader, dataset \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/motion_loaders/model_motion_loaders.py b/src/mdm/data_loaders/humanml/motion_loaders/model_motion_loaders.py new file mode 100644 index 0000000000000000000000000000000000000000..3a7bacbeee26c0ac9a8fc22bf8d0493d0c2b7b49 --- /dev/null +++ b/src/mdm/data_loaders/humanml/motion_loaders/model_motion_loaders.py @@ -0,0 +1,91 @@ +from torch.utils.data import DataLoader, Dataset +from data_loaders.humanml.utils.get_opt import get_opt +from data_loaders.humanml.motion_loaders.comp_v6_model_dataset import CompMDMGeneratedDataset +from data_loaders.humanml.utils.word_vectorizer import WordVectorizer +import numpy as np +from torch.utils.data._utils.collate import default_collate + + +def collate_fn(batch): + batch.sort(key=lambda x: x[3], reverse=True) + return default_collate(batch) + + +class MMGeneratedDataset(Dataset): + def __init__(self, opt, motion_dataset, w_vectorizer): + self.opt = opt + self.dataset = motion_dataset.mm_generated_motion + self.w_vectorizer = w_vectorizer + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, item): + data = self.dataset[item] + mm_motions = data['mm_motions'] + m_lens = [] + motions = [] + for mm_motion in mm_motions: + m_lens.append(mm_motion['length']) + motion = mm_motion['motion'] + # We don't need the following logic because our sample func generates the full tensor anyway: + # if len(motion) < self.opt.max_motion_length: + # motion = np.concatenate([motion, + # np.zeros((self.opt.max_motion_length - len(motion), motion.shape[1])) + # ], axis=0) + motion = motion[None, :] + motions.append(motion) + m_lens = np.array(m_lens, dtype=np.int) + motions = np.concatenate(motions, axis=0) + sort_indx = np.argsort(m_lens)[::-1].copy() + # print(m_lens) + # print(sort_indx) + # print(m_lens[sort_indx]) + m_lens = m_lens[sort_indx] + motions = motions[sort_indx] + return motions, m_lens + + + +def get_motion_loader(opt_path, batch_size, ground_truth_dataset, mm_num_samples, mm_num_repeats, device): + opt = get_opt(opt_path, device) + + # Currently the configurations of two datasets are almost the same + if opt.dataset_name == 't2m' or opt.dataset_name == 'kit': + w_vectorizer = WordVectorizer('./glove', 'our_vab') + else: + raise KeyError('Dataset not recognized!!') + print('Generating %s ...' % opt.name) + + if 'v6' in opt.name: + dataset = CompV6GeneratedDataset(opt, ground_truth_dataset, w_vectorizer, mm_num_samples, mm_num_repeats) + else: + raise KeyError('Dataset not recognized!!') + + mm_dataset = MMGeneratedDataset(opt, dataset, w_vectorizer) + + motion_loader = DataLoader(dataset, batch_size=batch_size, collate_fn=collate_fn, drop_last=True, num_workers=4) + mm_motion_loader = DataLoader(mm_dataset, batch_size=1, num_workers=1) + + print('Generated Dataset Loading Completed!!!') + + return motion_loader, mm_motion_loader + +# our loader +def get_mdm_loader(args, model, diffusion, batch_size, ground_truth_loader, mm_num_samples, mm_num_repeats, max_motion_length, num_samples_limit, scale): + opt = { + 'name': 'test', # FIXME + } + print('Generating %s ...' % opt['name']) + # dataset = CompMDMGeneratedDataset(opt, ground_truth_dataset, ground_truth_dataset.w_vectorizer, mm_num_samples, mm_num_repeats) + dataset = CompMDMGeneratedDataset(args, model, diffusion, ground_truth_loader, mm_num_samples, mm_num_repeats, max_motion_length, num_samples_limit, scale) + + mm_dataset = MMGeneratedDataset(opt, dataset, ground_truth_loader.dataset.w_vectorizer) + + # NOTE: bs must not be changed! this will cause a bug in R precision calc! + motion_loader = DataLoader(dataset, batch_size=batch_size, collate_fn=collate_fn, drop_last=True, num_workers=4) + mm_motion_loader = DataLoader(mm_dataset, batch_size=1, num_workers=1) + + print('Generated Dataset Loading Completed!!!') + + return motion_loader, mm_motion_loader \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/networks/__init__.py b/src/mdm/data_loaders/humanml/networks/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/mdm/data_loaders/humanml/networks/evaluator_wrapper.py b/src/mdm/data_loaders/humanml/networks/evaluator_wrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..87f9d569c67ad00cd265654c03afc38f152029cb --- /dev/null +++ b/src/mdm/data_loaders/humanml/networks/evaluator_wrapper.py @@ -0,0 +1,187 @@ +from data_loaders.humanml.networks.modules import * +from data_loaders.humanml.utils.word_vectorizer import POS_enumerator +from os.path import join as pjoin + +def build_models(opt): + movement_enc = MovementConvEncoder(opt.dim_pose-4, opt.dim_movement_enc_hidden, opt.dim_movement_latent) + text_enc = TextEncoderBiGRUCo(word_size=opt.dim_word, + pos_size=opt.dim_pos_ohot, + hidden_size=opt.dim_text_hidden, + output_size=opt.dim_coemb_hidden, + device=opt.device) + + motion_enc = MotionEncoderBiGRUCo(input_size=opt.dim_movement_latent, + hidden_size=opt.dim_motion_hidden, + output_size=opt.dim_coemb_hidden, + device=opt.device) + + checkpoint = torch.load(pjoin(opt.checkpoints_dir, opt.dataset_name, 'text_mot_match', 'model', 'finest.tar'), + map_location=opt.device) + movement_enc.load_state_dict(checkpoint['movement_encoder']) + text_enc.load_state_dict(checkpoint['text_encoder']) + motion_enc.load_state_dict(checkpoint['motion_encoder']) + print('Loading Evaluation Model Wrapper (Epoch %d) Completed!!' % (checkpoint['epoch'])) + return text_enc, motion_enc, movement_enc + + +class EvaluatorModelWrapper(object): + + def __init__(self, opt): + + if opt.dataset_name == 't2m': + opt.dim_pose = 263 + elif opt.dataset_name == 'kit': + opt.dim_pose = 251 + else: + raise KeyError('Dataset not Recognized!!!') + + opt.dim_word = 300 + opt.max_motion_length = 196 + opt.dim_pos_ohot = len(POS_enumerator) + opt.dim_motion_hidden = 1024 + opt.max_text_len = 20 + opt.dim_text_hidden = 512 + opt.dim_coemb_hidden = 512 + + self.text_encoder, self.motion_encoder, self.movement_encoder = build_models(opt) + self.opt = opt + self.device = opt.device + + self.text_encoder.to(opt.device) + self.motion_encoder.to(opt.device) + self.movement_encoder.to(opt.device) + + self.text_encoder.eval() + self.motion_encoder.eval() + self.movement_encoder.eval() + + # Please note that the results does not following the order of inputs + def get_co_embeddings(self, word_embs, pos_ohot, cap_lens, motions, m_lens): + with torch.no_grad(): + word_embs = word_embs.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt.unit_length + motion_embedding = self.motion_encoder(movements, m_lens) + + '''Text Encoding''' + text_embedding = self.text_encoder(word_embs, pos_ohot, cap_lens) + text_embedding = text_embedding[align_idx] + return text_embedding, motion_embedding + + # Please note that the results does not following the order of inputs + def get_motion_embeddings(self, motions, m_lens): + with torch.no_grad(): + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt.unit_length + motion_embedding = self.motion_encoder(movements, m_lens) + return motion_embedding + +# our version +def build_evaluators(opt): + movement_enc = MovementConvEncoder(opt['dim_pose']-4, opt['dim_movement_enc_hidden'], opt['dim_movement_latent']) + text_enc = TextEncoderBiGRUCo(word_size=opt['dim_word'], + pos_size=opt['dim_pos_ohot'], + hidden_size=opt['dim_text_hidden'], + output_size=opt['dim_coemb_hidden'], + device=opt['device']) + + motion_enc = MotionEncoderBiGRUCo(input_size=opt['dim_movement_latent'], + hidden_size=opt['dim_motion_hidden'], + output_size=opt['dim_coemb_hidden'], + device=opt['device']) + + ckpt_dir = opt['dataset_name'] + if opt['dataset_name'] == 'humanml': + ckpt_dir = 't2m' + + checkpoint = torch.load(pjoin(opt['checkpoints_dir'], ckpt_dir, 'text_mot_match', 'model', 'finest.tar'), + map_location=opt['device']) + movement_enc.load_state_dict(checkpoint['movement_encoder']) + text_enc.load_state_dict(checkpoint['text_encoder']) + motion_enc.load_state_dict(checkpoint['motion_encoder']) + print('Loading Evaluation Model Wrapper (Epoch %d) Completed!!' % (checkpoint['epoch'])) + return text_enc, motion_enc, movement_enc + +# our wrapper +class EvaluatorMDMWrapper(object): + + def __init__(self, dataset_name, device): + opt = { + 'dataset_name': dataset_name, + 'device': device, + 'dim_word': 300, + 'max_motion_length': 196, + 'dim_pos_ohot': len(POS_enumerator), + 'dim_motion_hidden': 1024, + 'max_text_len': 20, + 'dim_text_hidden': 512, + 'dim_coemb_hidden': 512, + 'dim_pose': 263 if dataset_name == 'humanml' else 251, + 'dim_movement_enc_hidden': 512, + 'dim_movement_latent': 512, + 'checkpoints_dir': '.', + 'unit_length': 4, + } + + self.text_encoder, self.motion_encoder, self.movement_encoder = build_evaluators(opt) + self.opt = opt + self.device = opt['device'] + + self.text_encoder.to(opt['device']) + self.motion_encoder.to(opt['device']) + self.movement_encoder.to(opt['device']) + + self.text_encoder.eval() + self.motion_encoder.eval() + self.movement_encoder.eval() + + # Please note that the results does not following the order of inputs + def get_co_embeddings(self, word_embs, pos_ohot, cap_lens, motions, m_lens): + with torch.no_grad(): + word_embs = word_embs.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt['unit_length'] + motion_embedding = self.motion_encoder(movements, m_lens) + + '''Text Encoding''' + text_embedding = self.text_encoder(word_embs, pos_ohot, cap_lens) + text_embedding = text_embedding[align_idx] + return text_embedding, motion_embedding + + # Please note that the results does not following the order of inputs + def get_motion_embeddings(self, motions, m_lens): + with torch.no_grad(): + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt['unit_length'] + motion_embedding = self.motion_encoder(movements, m_lens) + return motion_embedding \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/networks/modules.py b/src/mdm/data_loaders/humanml/networks/modules.py new file mode 100644 index 0000000000000000000000000000000000000000..3177738d3f029a65fb4b26538d607d95fb1c84b7 --- /dev/null +++ b/src/mdm/data_loaders/humanml/networks/modules.py @@ -0,0 +1,438 @@ +import torch +import torch.nn as nn +import numpy as np +import time +import math +from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence +# from networks.layers import * +import torch.nn.functional as F + + +class ContrastiveLoss(torch.nn.Module): + """ + Contrastive loss function. + Based on: http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf + """ + def __init__(self, margin=3.0): + super(ContrastiveLoss, self).__init__() + self.margin = margin + + def forward(self, output1, output2, label): + euclidean_distance = F.pairwise_distance(output1, output2, keepdim=True) + loss_contrastive = torch.mean((1-label) * torch.pow(euclidean_distance, 2) + + (label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min=0.0), 2)) + return loss_contrastive + + +def init_weight(m): + if isinstance(m, nn.Conv1d) or isinstance(m, nn.Linear) or isinstance(m, nn.ConvTranspose1d): + nn.init.xavier_normal_(m.weight) + # m.bias.data.fill_(0.01) + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + +def reparameterize(mu, logvar): + s_var = logvar.mul(0.5).exp_() + eps = s_var.data.new(s_var.size()).normal_() + return eps.mul(s_var).add_(mu) + + +# batch_size, dimension and position +# output: (batch_size, dim) +def positional_encoding(batch_size, dim, pos): + assert batch_size == pos.shape[0] + positions_enc = np.array([ + [pos[j] / np.power(10000, (i-i%2)/dim) for i in range(dim)] + for j in range(batch_size) + ], dtype=np.float32) + positions_enc[:, 0::2] = np.sin(positions_enc[:, 0::2]) + positions_enc[:, 1::2] = np.cos(positions_enc[:, 1::2]) + return torch.from_numpy(positions_enc).float() + + +def get_padding_mask(batch_size, seq_len, cap_lens): + cap_lens = cap_lens.data.tolist() + mask_2d = torch.ones((batch_size, seq_len, seq_len), dtype=torch.float32) + for i, cap_len in enumerate(cap_lens): + mask_2d[i, :, :cap_len] = 0 + return mask_2d.bool(), 1 - mask_2d[:, :, 0].clone() + + +class PositionalEncoding(nn.Module): + + def __init__(self, d_model, max_len=300): + super(PositionalEncoding, self).__init__() + + pe = torch.zeros(max_len, d_model) + position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) + div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + # pe = pe.unsqueeze(0).transpose(0, 1) + self.register_buffer('pe', pe) + + def forward(self, pos): + return self.pe[pos] + + +class MovementConvEncoder(nn.Module): + def __init__(self, input_size, hidden_size, output_size): + super(MovementConvEncoder, self).__init__() + self.main = nn.Sequential( + nn.Conv1d(input_size, hidden_size, 4, 2, 1), + nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + nn.Conv1d(hidden_size, output_size, 4, 2, 1), + nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + ) + self.out_net = nn.Linear(output_size, output_size) + self.main.apply(init_weight) + self.out_net.apply(init_weight) + + def forward(self, inputs): + inputs = inputs.permute(0, 2, 1) + outputs = self.main(inputs).permute(0, 2, 1) + # print(outputs.shape) + return self.out_net(outputs) + + +class MovementConvDecoder(nn.Module): + def __init__(self, input_size, hidden_size, output_size): + super(MovementConvDecoder, self).__init__() + self.main = nn.Sequential( + nn.ConvTranspose1d(input_size, hidden_size, 4, 2, 1), + # nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + nn.ConvTranspose1d(hidden_size, output_size, 4, 2, 1), + # nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + ) + self.out_net = nn.Linear(output_size, output_size) + + self.main.apply(init_weight) + self.out_net.apply(init_weight) + + def forward(self, inputs): + inputs = inputs.permute(0, 2, 1) + outputs = self.main(inputs).permute(0, 2, 1) + return self.out_net(outputs) + + +class TextVAEDecoder(nn.Module): + def __init__(self, text_size, input_size, output_size, hidden_size, n_layers): + super(TextVAEDecoder, self).__init__() + self.input_size = input_size + self.output_size = output_size + self.hidden_size = hidden_size + self.n_layers = n_layers + self.emb = nn.Sequential( + nn.Linear(input_size, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True)) + + self.z2init = nn.Linear(text_size, hidden_size * n_layers) + self.gru = nn.ModuleList([nn.GRUCell(hidden_size, hidden_size) for i in range(self.n_layers)]) + self.positional_encoder = PositionalEncoding(hidden_size) + + + self.output = nn.Sequential( + nn.Linear(hidden_size, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(hidden_size, output_size) + ) + + # + # self.output = nn.Sequential( + # nn.Linear(hidden_size, hidden_size), + # nn.LayerNorm(hidden_size), + # nn.LeakyReLU(0.2, inplace=True), + # nn.Linear(hidden_size, output_size-4) + # ) + + # self.contact_net = nn.Sequential( + # nn.Linear(output_size-4, 64), + # nn.LayerNorm(64), + # nn.LeakyReLU(0.2, inplace=True), + # nn.Linear(64, 4) + # ) + + self.output.apply(init_weight) + self.emb.apply(init_weight) + self.z2init.apply(init_weight) + # self.contact_net.apply(init_weight) + + def get_init_hidden(self, latent): + hidden = self.z2init(latent) + hidden = torch.split(hidden, self.hidden_size, dim=-1) + return list(hidden) + + def forward(self, inputs, last_pred, hidden, p): + h_in = self.emb(inputs) + pos_enc = self.positional_encoder(p).to(inputs.device).detach() + h_in = h_in + pos_enc + for i in range(self.n_layers): + # print(h_in.shape) + hidden[i] = self.gru[i](h_in, hidden[i]) + h_in = hidden[i] + pose_pred = self.output(h_in) + # pose_pred = self.output(h_in) + last_pred.detach() + # contact = self.contact_net(pose_pred) + # return torch.cat([pose_pred, contact], dim=-1), hidden + return pose_pred, hidden + + +class TextDecoder(nn.Module): + def __init__(self, text_size, input_size, output_size, hidden_size, n_layers): + super(TextDecoder, self).__init__() + self.input_size = input_size + self.output_size = output_size + self.hidden_size = hidden_size + self.n_layers = n_layers + self.emb = nn.Sequential( + nn.Linear(input_size, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True)) + + self.gru = nn.ModuleList([nn.GRUCell(hidden_size, hidden_size) for i in range(self.n_layers)]) + self.z2init = nn.Linear(text_size, hidden_size * n_layers) + self.positional_encoder = PositionalEncoding(hidden_size) + + self.mu_net = nn.Linear(hidden_size, output_size) + self.logvar_net = nn.Linear(hidden_size, output_size) + + self.emb.apply(init_weight) + self.z2init.apply(init_weight) + self.mu_net.apply(init_weight) + self.logvar_net.apply(init_weight) + + def get_init_hidden(self, latent): + + hidden = self.z2init(latent) + hidden = torch.split(hidden, self.hidden_size, dim=-1) + + return list(hidden) + + def forward(self, inputs, hidden, p): + # print(inputs.shape) + x_in = self.emb(inputs) + pos_enc = self.positional_encoder(p).to(inputs.device).detach() + x_in = x_in + pos_enc + + for i in range(self.n_layers): + hidden[i] = self.gru[i](x_in, hidden[i]) + h_in = hidden[i] + mu = self.mu_net(h_in) + logvar = self.logvar_net(h_in) + z = reparameterize(mu, logvar) + return z, mu, logvar, hidden + +class AttLayer(nn.Module): + def __init__(self, query_dim, key_dim, value_dim): + super(AttLayer, self).__init__() + self.W_q = nn.Linear(query_dim, value_dim) + self.W_k = nn.Linear(key_dim, value_dim, bias=False) + self.W_v = nn.Linear(key_dim, value_dim) + + self.softmax = nn.Softmax(dim=1) + self.dim = value_dim + + self.W_q.apply(init_weight) + self.W_k.apply(init_weight) + self.W_v.apply(init_weight) + + def forward(self, query, key_mat): + ''' + query (batch, query_dim) + key (batch, seq_len, key_dim) + ''' + # print(query.shape) + query_vec = self.W_q(query).unsqueeze(-1) # (batch, value_dim, 1) + val_set = self.W_v(key_mat) # (batch, seq_len, value_dim) + key_set = self.W_k(key_mat) # (batch, seq_len, value_dim) + + weights = torch.matmul(key_set, query_vec) / np.sqrt(self.dim) + + co_weights = self.softmax(weights) # (batch, seq_len, 1) + values = val_set * co_weights # (batch, seq_len, value_dim) + pred = values.sum(dim=1) # (batch, value_dim) + return pred, co_weights + + def short_cut(self, querys, keys): + return self.W_q(querys), self.W_k(keys) + + +class TextEncoderBiGRU(nn.Module): + def __init__(self, word_size, pos_size, hidden_size, device): + super(TextEncoderBiGRU, self).__init__() + self.device = device + + self.pos_emb = nn.Linear(pos_size, word_size) + self.input_emb = nn.Linear(word_size, hidden_size) + self.gru = nn.GRU(hidden_size, hidden_size, batch_first=True, bidirectional=True) + # self.linear2 = nn.Linear(hidden_size, output_size) + + self.input_emb.apply(init_weight) + self.pos_emb.apply(init_weight) + # self.linear2.apply(init_weight) + # self.batch_size = batch_size + self.hidden_size = hidden_size + self.hidden = nn.Parameter(torch.randn((2, 1, self.hidden_size), requires_grad=True)) + + # input(batch_size, seq_len, dim) + def forward(self, word_embs, pos_onehot, cap_lens): + num_samples = word_embs.shape[0] + + pos_embs = self.pos_emb(pos_onehot) + inputs = word_embs + pos_embs + input_embs = self.input_emb(inputs) + hidden = self.hidden.repeat(1, num_samples, 1) + + cap_lens = cap_lens.data.tolist() + emb = pack_padded_sequence(input_embs, cap_lens, batch_first=True) + + gru_seq, gru_last = self.gru(emb, hidden) + + gru_last = torch.cat([gru_last[0], gru_last[1]], dim=-1) + gru_seq = pad_packed_sequence(gru_seq, batch_first=True)[0] + forward_seq = gru_seq[..., :self.hidden_size] + backward_seq = gru_seq[..., self.hidden_size:].clone() + + # Concate the forward and backward word embeddings + for i, length in enumerate(cap_lens): + backward_seq[i:i+1, :length] = torch.flip(backward_seq[i:i+1, :length].clone(), dims=[1]) + gru_seq = torch.cat([forward_seq, backward_seq], dim=-1) + + return gru_seq, gru_last + + +class TextEncoderBiGRUCo(nn.Module): + def __init__(self, word_size, pos_size, hidden_size, output_size, device): + super(TextEncoderBiGRUCo, self).__init__() + self.device = device + + self.pos_emb = nn.Linear(pos_size, word_size) + self.input_emb = nn.Linear(word_size, hidden_size) + self.gru = nn.GRU(hidden_size, hidden_size, batch_first=True, bidirectional=True) + self.output_net = nn.Sequential( + nn.Linear(hidden_size * 2, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(hidden_size, output_size) + ) + + self.input_emb.apply(init_weight) + self.pos_emb.apply(init_weight) + self.output_net.apply(init_weight) + # self.linear2.apply(init_weight) + # self.batch_size = batch_size + self.hidden_size = hidden_size + self.hidden = nn.Parameter(torch.randn((2, 1, self.hidden_size), requires_grad=True)) + + # input(batch_size, seq_len, dim) + def forward(self, word_embs, pos_onehot, cap_lens): + num_samples = word_embs.shape[0] + + pos_embs = self.pos_emb(pos_onehot) + inputs = word_embs + pos_embs + input_embs = self.input_emb(inputs) + hidden = self.hidden.repeat(1, num_samples, 1) + + cap_lens = cap_lens.data.tolist() + emb = pack_padded_sequence(input_embs, cap_lens, batch_first=True) + + gru_seq, gru_last = self.gru(emb, hidden) + + gru_last = torch.cat([gru_last[0], gru_last[1]], dim=-1) + + return self.output_net(gru_last) + + +class MotionEncoderBiGRUCo(nn.Module): + def __init__(self, input_size, hidden_size, output_size, device): + super(MotionEncoderBiGRUCo, self).__init__() + self.device = device + + self.input_emb = nn.Linear(input_size, hidden_size) + self.gru = nn.GRU(hidden_size, hidden_size, batch_first=True, bidirectional=True) + self.output_net = nn.Sequential( + nn.Linear(hidden_size*2, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(hidden_size, output_size) + ) + + self.input_emb.apply(init_weight) + self.output_net.apply(init_weight) + self.hidden_size = hidden_size + self.hidden = nn.Parameter(torch.randn((2, 1, self.hidden_size), requires_grad=True)) + + # input(batch_size, seq_len, dim) + def forward(self, inputs, m_lens): + num_samples = inputs.shape[0] + + input_embs = self.input_emb(inputs) + hidden = self.hidden.repeat(1, num_samples, 1) + + cap_lens = m_lens.data.tolist() + emb = pack_padded_sequence(input_embs, cap_lens, batch_first=True) + + gru_seq, gru_last = self.gru(emb, hidden) + + gru_last = torch.cat([gru_last[0], gru_last[1]], dim=-1) + + return self.output_net(gru_last) + + +class MotionLenEstimatorBiGRU(nn.Module): + def __init__(self, word_size, pos_size, hidden_size, output_size): + super(MotionLenEstimatorBiGRU, self).__init__() + + self.pos_emb = nn.Linear(pos_size, word_size) + self.input_emb = nn.Linear(word_size, hidden_size) + self.gru = nn.GRU(hidden_size, hidden_size, batch_first=True, bidirectional=True) + nd = 512 + self.output = nn.Sequential( + nn.Linear(hidden_size*2, nd), + nn.LayerNorm(nd), + nn.LeakyReLU(0.2, inplace=True), + + nn.Linear(nd, nd // 2), + nn.LayerNorm(nd // 2), + nn.LeakyReLU(0.2, inplace=True), + + nn.Linear(nd // 2, nd // 4), + nn.LayerNorm(nd // 4), + nn.LeakyReLU(0.2, inplace=True), + + nn.Linear(nd // 4, output_size) + ) + # self.linear2 = nn.Linear(hidden_size, output_size) + + self.input_emb.apply(init_weight) + self.pos_emb.apply(init_weight) + self.output.apply(init_weight) + # self.linear2.apply(init_weight) + # self.batch_size = batch_size + self.hidden_size = hidden_size + self.hidden = nn.Parameter(torch.randn((2, 1, self.hidden_size), requires_grad=True)) + + # input(batch_size, seq_len, dim) + def forward(self, word_embs, pos_onehot, cap_lens): + num_samples = word_embs.shape[0] + + pos_embs = self.pos_emb(pos_onehot) + inputs = word_embs + pos_embs + input_embs = self.input_emb(inputs) + hidden = self.hidden.repeat(1, num_samples, 1) + + cap_lens = cap_lens.data.tolist() + emb = pack_padded_sequence(input_embs, cap_lens, batch_first=True) + + gru_seq, gru_last = self.gru(emb, hidden) + + gru_last = torch.cat([gru_last[0], gru_last[1]], dim=-1) + + return self.output(gru_last) diff --git a/src/mdm/data_loaders/humanml/networks/trainers.py b/src/mdm/data_loaders/humanml/networks/trainers.py new file mode 100644 index 0000000000000000000000000000000000000000..123f497a7893cc85d915fde63add9338738f1d03 --- /dev/null +++ b/src/mdm/data_loaders/humanml/networks/trainers.py @@ -0,0 +1,1089 @@ +import torch +import torch.nn.functional as F +import random +from data_loaders.humanml.networks.modules import * +from torch.utils.data import DataLoader +import torch.optim as optim +from torch.nn.utils import clip_grad_norm_ +# import tensorflow as tf +from collections import OrderedDict +from data_loaders.humanml.utils.utils import * +from os.path import join as pjoin +from data_loaders.humanml.data.dataset import collate_fn +import codecs as cs + + +class Logger(object): + def __init__(self, log_dir): + self.writer = tf.summary.create_file_writer(log_dir) + + def scalar_summary(self, tag, value, step): + with self.writer.as_default(): + tf.summary.scalar(tag, value, step=step) + self.writer.flush() + +class DecompTrainerV3(object): + def __init__(self, args, movement_enc, movement_dec): + self.opt = args + self.movement_enc = movement_enc + self.movement_dec = movement_dec + self.device = args.device + + if args.is_train: + self.logger = Logger(args.log_dir) + self.sml1_criterion = torch.nn.SmoothL1Loss() + self.l1_criterion = torch.nn.L1Loss() + self.mse_criterion = torch.nn.MSELoss() + + + @staticmethod + def zero_grad(opt_list): + for opt in opt_list: + opt.zero_grad() + + @staticmethod + def clip_norm(network_list): + for network in network_list: + clip_grad_norm_(network.parameters(), 0.5) + + @staticmethod + def step(opt_list): + for opt in opt_list: + opt.step() + + def forward(self, batch_data): + motions = batch_data + self.motions = motions.detach().to(self.device).float() + self.latents = self.movement_enc(self.motions[..., :-4]) + self.recon_motions = self.movement_dec(self.latents) + + def backward(self): + self.loss_rec = self.l1_criterion(self.recon_motions, self.motions) + # self.sml1_criterion(self.recon_motions[:, 1:] - self.recon_motions[:, :-1], + # self.motions[:, 1:] - self.recon_motions[:, :-1]) + self.loss_sparsity = torch.mean(torch.abs(self.latents)) + self.loss_smooth = self.l1_criterion(self.latents[:, 1:], self.latents[:, :-1]) + self.loss = self.loss_rec + self.loss_sparsity * self.opt.lambda_sparsity +\ + self.loss_smooth*self.opt.lambda_smooth + + def update(self): + # time0 = time.time() + self.zero_grad([self.opt_movement_enc, self.opt_movement_dec]) + # time1 = time.time() + # print('\t Zero_grad Time: %.5f s' % (time1 - time0)) + self.backward() + # time2 = time.time() + # print('\t Backward Time: %.5f s' % (time2 - time1)) + self.loss.backward() + # time3 = time.time() + # print('\t Loss backward Time: %.5f s' % (time3 - time2)) + # self.clip_norm([self.movement_enc, self.movement_dec]) + # time4 = time.time() + # print('\t Clip_norm Time: %.5f s' % (time4 - time3)) + self.step([self.opt_movement_enc, self.opt_movement_dec]) + # time5 = time.time() + # print('\t Step Time: %.5f s' % (time5 - time4)) + + loss_logs = OrderedDict({}) + loss_logs['loss'] = self.loss_rec.item() + loss_logs['loss_rec'] = self.loss_rec.item() + loss_logs['loss_sparsity'] = self.loss_sparsity.item() + loss_logs['loss_smooth'] = self.loss_smooth.item() + return loss_logs + + def save(self, file_name, ep, total_it): + state = { + 'movement_enc': self.movement_enc.state_dict(), + 'movement_dec': self.movement_dec.state_dict(), + + 'opt_movement_enc': self.opt_movement_enc.state_dict(), + 'opt_movement_dec': self.opt_movement_dec.state_dict(), + + 'ep': ep, + 'total_it': total_it, + } + torch.save(state, file_name) + return + + def resume(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + + self.movement_dec.load_state_dict(checkpoint['movement_dec']) + self.movement_enc.load_state_dict(checkpoint['movement_enc']) + + self.opt_movement_enc.load_state_dict(checkpoint['opt_movement_enc']) + self.opt_movement_dec.load_state_dict(checkpoint['opt_movement_dec']) + + return checkpoint['ep'], checkpoint['total_it'] + + def train(self, train_dataloader, val_dataloader, plot_eval): + self.movement_enc.to(self.device) + self.movement_dec.to(self.device) + + self.opt_movement_enc = optim.Adam(self.movement_enc.parameters(), lr=self.opt.lr) + self.opt_movement_dec = optim.Adam(self.movement_dec.parameters(), lr=self.opt.lr) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_dataloader) + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_dataloader), len(val_dataloader))) + val_loss = 0 + logs = OrderedDict() + while epoch < self.opt.max_epoch: + # time0 = time.time() + for i, batch_data in enumerate(train_dataloader): + self.movement_dec.train() + self.movement_enc.train() + + # time1 = time.time() + # print('DataLoader Time: %.5f s'%(time1-time0) ) + self.forward(batch_data) + # time2 = time.time() + # print('Forward Time: %.5f s'%(time2-time1)) + log_dict = self.update() + # time3 = time.time() + # print('Update Time: %.5f s' % (time3 - time2)) + # time0 = time3 + for k, v in log_dict.items(): + if k not in logs: + logs[k] = v + else: + logs[k] += v + + it += 1 + if it % self.opt.log_every == 0: + mean_loss = OrderedDict({'val_loss': val_loss}) + self.logger.scalar_summary('val_loss', val_loss, it) + + for tag, value in logs.items(): + self.logger.scalar_summary(tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = OrderedDict() + print_current_loss_decomp(start_time, it, total_iters, mean_loss, epoch, i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + if epoch % self.opt.save_every_e == 0: + self.save(pjoin(self.opt.model_dir, 'E%04d.tar' % (epoch)), epoch, total_it=it) + + print('Validation time:') + + val_loss = 0 + val_rec_loss = 0 + val_sparcity_loss = 0 + val_smooth_loss = 0 + with torch.no_grad(): + for i, batch_data in enumerate(val_dataloader): + self.forward(batch_data) + self.backward() + val_rec_loss += self.loss_rec.item() + val_smooth_loss += self.loss.item() + val_sparcity_loss += self.loss_sparsity.item() + val_smooth_loss += self.loss_smooth.item() + val_loss += self.loss.item() + + val_loss = val_loss / (len(val_dataloader) + 1) + val_rec_loss = val_rec_loss / (len(val_dataloader) + 1) + val_sparcity_loss = val_sparcity_loss / (len(val_dataloader) + 1) + val_smooth_loss = val_smooth_loss / (len(val_dataloader) + 1) + print('Validation Loss: %.5f Reconstruction Loss: %.5f ' + 'Sparsity Loss: %.5f Smooth Loss: %.5f' % (val_loss, val_rec_loss, val_sparcity_loss, \ + val_smooth_loss)) + + if epoch % self.opt.eval_every_e == 0: + data = torch.cat([self.recon_motions[:4], self.motions[:4]], dim=0).detach().cpu().numpy() + save_dir = pjoin(self.opt.eval_dir, 'E%04d' % (epoch)) + os.makedirs(save_dir, exist_ok=True) + plot_eval(data, save_dir) + + +# VAE Sequence Decoder/Prior/Posterior latent by latent +class CompTrainerV6(object): + + def __init__(self, args, text_enc, seq_pri, seq_dec, att_layer, mov_dec, mov_enc=None, seq_post=None): + self.opt = args + self.text_enc = text_enc + self.seq_pri = seq_pri + self.att_layer = att_layer + self.device = args.device + self.seq_dec = seq_dec + self.mov_dec = mov_dec + self.mov_enc = mov_enc + + if args.is_train: + self.seq_post = seq_post + # self.motion_dis + self.logger = Logger(args.log_dir) + self.l1_criterion = torch.nn.SmoothL1Loss() + self.gan_criterion = torch.nn.BCEWithLogitsLoss() + self.mse_criterion = torch.nn.MSELoss() + + @staticmethod + def reparametrize(mu, logvar): + s_var = logvar.mul(0.5).exp_() + eps = s_var.data.new(s_var.size()).normal_() + return eps.mul(s_var).add_(mu) + + @staticmethod + def ones_like(tensor, val=1.): + return torch.FloatTensor(tensor.size()).fill_(val).to(tensor.device).requires_grad_(False) + + @staticmethod + def zeros_like(tensor, val=0.): + return torch.FloatTensor(tensor.size()).fill_(val).to(tensor.device).requires_grad_(False) + + @staticmethod + def zero_grad(opt_list): + for opt in opt_list: + opt.zero_grad() + + @staticmethod + def clip_norm(network_list): + for network in network_list: + clip_grad_norm_(network.parameters(), 0.5) + + @staticmethod + def step(opt_list): + for opt in opt_list: + opt.step() + + @staticmethod + def kl_criterion(mu1, logvar1, mu2, logvar2): + # KL( N(mu1, sigma2_1) || N(mu_2, sigma2_2)) + # loss = log(sigma2/sigma1) + (sigma1^2 + (mu1 - mu2)^2)/(2*sigma2^2) - 1/2 + sigma1 = logvar1.mul(0.5).exp() + sigma2 = logvar2.mul(0.5).exp() + kld = torch.log(sigma2 / sigma1) + (torch.exp(logvar1) + (mu1 - mu2) ** 2) / ( + 2 * torch.exp(logvar2)) - 1 / 2 + return kld.sum() / mu1.shape[0] + + @staticmethod + def kl_criterion_unit(mu, logvar): + # KL( N(mu1, sigma2_1) || N(mu_2, sigma2_2)) + # loss = log(sigma2/sigma1) + (sigma1^2 + (mu1 - mu2)^2)/(2*sigma2^2) - 1/2 + kld = ((torch.exp(logvar) + mu ** 2) - logvar - 1) / 2 + return kld.sum() / mu.shape[0] + + def forward(self, batch_data, tf_ratio, mov_len, eval_mode=False): + word_emb, pos_ohot, caption, cap_lens, motions, m_lens = batch_data + word_emb = word_emb.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + motions = motions.detach().to(self.device).float() + self.cap_lens = cap_lens + self.caption = caption + + # print(motions.shape) + # (batch_size, motion_len, pose_dim) + self.motions = motions + + '''Movement Encoding''' + self.movements = self.mov_enc(self.motions[..., :-4]).detach() + # Initially input a mean vector + mov_in = self.mov_enc( + torch.zeros((self.motions.shape[0], self.opt.unit_length, self.motions.shape[-1] - 4), device=self.device) + ).squeeze(1).detach() + assert self.movements.shape[1] == mov_len + + teacher_force = True if random.random() < tf_ratio else False + + '''Text Encoding''' + # time0 = time.time() + # text_input = torch.cat([word_emb, pos_ohot], dim=-1) + word_hids, hidden = self.text_enc(word_emb, pos_ohot, cap_lens) + # print(word_hids.shape, hidden.shape) + + if self.opt.text_enc_mod == 'bigru': + hidden_pos = self.seq_post.get_init_hidden(hidden) + hidden_pri = self.seq_pri.get_init_hidden(hidden) + hidden_dec = self.seq_dec.get_init_hidden(hidden) + elif self.opt.text_enc_mod == 'transformer': + hidden_pos = self.seq_post.get_init_hidden(hidden.detach()) + hidden_pri = self.seq_pri.get_init_hidden(hidden.detach()) + hidden_dec = self.seq_dec.get_init_hidden(hidden) + + mus_pri = [] + logvars_pri = [] + mus_post = [] + logvars_post = [] + fake_mov_batch = [] + + query_input = [] + + # time1 = time.time() + # print("\t Text Encoder Cost:%5f" % (time1 - time0)) + # print(self.movements.shape) + + for i in range(mov_len): + # print("\t Sequence Measure") + # print(mov_in.shape) + mov_tgt = self.movements[:, i] + '''Local Attention Vector''' + att_vec, _ = self.att_layer(hidden_dec[-1], word_hids) + query_input.append(hidden_dec[-1]) + + tta = m_lens // self.opt.unit_length - i + + if self.opt.text_enc_mod == 'bigru': + pos_in = torch.cat([mov_in, mov_tgt, att_vec], dim=-1) + pri_in = torch.cat([mov_in, att_vec], dim=-1) + + elif self.opt.text_enc_mod == 'transformer': + pos_in = torch.cat([mov_in, mov_tgt, att_vec.detach()], dim=-1) + pri_in = torch.cat([mov_in, att_vec.detach()], dim=-1) + + '''Posterior''' + z_pos, mu_pos, logvar_pos, hidden_pos = self.seq_post(pos_in, hidden_pos, tta) + + '''Prior''' + z_pri, mu_pri, logvar_pri, hidden_pri = self.seq_pri(pri_in, hidden_pri, tta) + + '''Decoder''' + if eval_mode: + dec_in = torch.cat([mov_in, att_vec, z_pri], dim=-1) + else: + dec_in = torch.cat([mov_in, att_vec, z_pos], dim=-1) + fake_mov, hidden_dec = self.seq_dec(dec_in, mov_in, hidden_dec, tta) + + # print(fake_mov.shape) + + mus_post.append(mu_pos) + logvars_post.append(logvar_pos) + mus_pri.append(mu_pri) + logvars_pri.append(logvar_pri) + fake_mov_batch.append(fake_mov.unsqueeze(1)) + + if teacher_force: + mov_in = self.movements[:, i].detach() + else: + mov_in = fake_mov.detach() + + + self.fake_movements = torch.cat(fake_mov_batch, dim=1) + + # print(self.fake_movements.shape) + + self.fake_motions = self.mov_dec(self.fake_movements) + + self.mus_post = torch.cat(mus_post, dim=0) + self.mus_pri = torch.cat(mus_pri, dim=0) + self.logvars_post = torch.cat(logvars_post, dim=0) + self.logvars_pri = torch.cat(logvars_pri, dim=0) + + def generate(self, word_emb, pos_ohot, cap_lens, m_lens, mov_len, dim_pose): + word_emb = word_emb.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + self.cap_lens = cap_lens + + # print(motions.shape) + # (batch_size, motion_len, pose_dim) + + '''Movement Encoding''' + # Initially input a mean vector + mov_in = self.mov_enc( + torch.zeros((word_emb.shape[0], self.opt.unit_length, dim_pose - 4), device=self.device) + ).squeeze(1).detach() + + '''Text Encoding''' + # time0 = time.time() + # text_input = torch.cat([word_emb, pos_ohot], dim=-1) + word_hids, hidden = self.text_enc(word_emb, pos_ohot, cap_lens) + # print(word_hids.shape, hidden.shape) + + hidden_pri = self.seq_pri.get_init_hidden(hidden) + hidden_dec = self.seq_dec.get_init_hidden(hidden) + + mus_pri = [] + logvars_pri = [] + fake_mov_batch = [] + att_wgt = [] + + # time1 = time.time() + # print("\t Text Encoder Cost:%5f" % (time1 - time0)) + # print(self.movements.shape) + + for i in range(mov_len): + # print("\t Sequence Measure") + # print(mov_in.shape) + '''Local Attention Vector''' + att_vec, co_weights = self.att_layer(hidden_dec[-1], word_hids) + + tta = m_lens // self.opt.unit_length - i + # tta = m_lens - i + + '''Prior''' + pri_in = torch.cat([mov_in, att_vec], dim=-1) + z_pri, mu_pri, logvar_pri, hidden_pri = self.seq_pri(pri_in, hidden_pri, tta) + + '''Decoder''' + dec_in = torch.cat([mov_in, att_vec, z_pri], dim=-1) + + fake_mov, hidden_dec = self.seq_dec(dec_in, mov_in, hidden_dec, tta) + + # print(fake_mov.shape) + mus_pri.append(mu_pri) + logvars_pri.append(logvar_pri) + fake_mov_batch.append(fake_mov.unsqueeze(1)) + att_wgt.append(co_weights) + + mov_in = fake_mov.detach() + + fake_movements = torch.cat(fake_mov_batch, dim=1) + att_wgts = torch.cat(att_wgt, dim=-1) + + # print(self.fake_movements.shape) + + fake_motions = self.mov_dec(fake_movements) + + mus_pri = torch.cat(mus_pri, dim=0) + logvars_pri = torch.cat(logvars_pri, dim=0) + + return fake_motions, mus_pri, att_wgts + + def backward_G(self): + self.loss_mot_rec = self.l1_criterion(self.fake_motions, self.motions) + self.loss_mov_rec = self.l1_criterion(self.fake_movements, self.movements) + + self.loss_kld = self.kl_criterion(self.mus_post, self.logvars_post, self.mus_pri, self.logvars_pri) + + self.loss_gen = self.loss_mot_rec * self.opt.lambda_rec_mov + self.loss_mov_rec * self.opt.lambda_rec_mot + \ + self.loss_kld * self.opt.lambda_kld + loss_logs = OrderedDict({}) + loss_logs['loss_gen'] = self.loss_gen.item() + loss_logs['loss_mot_rec'] = self.loss_mot_rec.item() + loss_logs['loss_mov_rec'] = self.loss_mov_rec.item() + loss_logs['loss_kld'] = self.loss_kld.item() + + return loss_logs + # self.loss_gen = self.loss_rec_mov + + # self.loss_gen = self.loss_rec_mov * self.opt.lambda_rec_mov + self.loss_rec_mot + \ + # self.loss_kld * self.opt.lambda_kld + \ + # self.loss_mtgan_G * self.opt.lambda_gan_mt + self.loss_mvgan_G * self.opt.lambda_gan_mv + + + def update(self): + + self.zero_grad([self.opt_text_enc, self.opt_seq_dec, self.opt_seq_post, + self.opt_seq_pri, self.opt_att_layer, self.opt_mov_dec]) + # time2_0 = time.time() + # print("\t\t Zero Grad:%5f" % (time2_0 - time1)) + loss_logs = self.backward_G() + + # time2_1 = time.time() + # print("\t\t Backward_G :%5f" % (time2_1 - time2_0)) + self.loss_gen.backward() + + # time2_2 = time.time() + # print("\t\t Backward :%5f" % (time2_2 - time2_1)) + self.clip_norm([self.text_enc, self.seq_dec, self.seq_post, self.seq_pri, + self.att_layer, self.mov_dec]) + + # time2_3 = time.time() + # print("\t\t Clip Norm :%5f" % (time2_3 - time2_2)) + self.step([self.opt_text_enc, self.opt_seq_dec, self.opt_seq_post, + self.opt_seq_pri, self.opt_att_layer, self.opt_mov_dec]) + + # time2_4 = time.time() + # print("\t\t Step :%5f" % (time2_4 - time2_3)) + + # time2 = time.time() + # print("\t Update Generator Cost:%5f" % (time2 - time1)) + + # self.zero_grad([self.opt_att_layer]) + # self.backward_Att() + # self.loss_lgan_G_.backward() + # self.clip_norm([self.att_layer]) + # self.step([self.opt_att_layer]) + # # time3 = time.time() + # # print("\t Update Att Cost:%5f" % (time3 - time2)) + + # self.loss_gen += self.loss_lgan_G_ + + return loss_logs + + def to(self, device): + if self.opt.is_train: + self.gan_criterion.to(device) + self.mse_criterion.to(device) + self.l1_criterion.to(device) + self.seq_post.to(device) + self.mov_enc.to(device) + self.text_enc.to(device) + self.mov_dec.to(device) + self.seq_pri.to(device) + self.att_layer.to(device) + self.seq_dec.to(device) + + def train_mode(self): + if self.opt.is_train: + self.seq_post.train() + self.mov_enc.eval() + # self.motion_dis.train() + # self.movement_dis.train() + self.mov_dec.train() + self.text_enc.train() + self.seq_pri.train() + self.att_layer.train() + self.seq_dec.train() + + + def eval_mode(self): + if self.opt.is_train: + self.seq_post.eval() + self.mov_enc.eval() + # self.motion_dis.train() + # self.movement_dis.train() + self.mov_dec.eval() + self.text_enc.eval() + self.seq_pri.eval() + self.att_layer.eval() + self.seq_dec.eval() + + + def save(self, file_name, ep, total_it, sub_ep, sl_len): + state = { + # 'latent_dis': self.latent_dis.state_dict(), + # 'motion_dis': self.motion_dis.state_dict(), + 'text_enc': self.text_enc.state_dict(), + 'seq_post': self.seq_post.state_dict(), + 'att_layer': self.att_layer.state_dict(), + 'seq_dec': self.seq_dec.state_dict(), + 'seq_pri': self.seq_pri.state_dict(), + 'mov_enc': self.mov_enc.state_dict(), + 'mov_dec': self.mov_dec.state_dict(), + + # 'opt_motion_dis': self.opt_motion_dis.state_dict(), + 'opt_mov_dec': self.opt_mov_dec.state_dict(), + 'opt_text_enc': self.opt_text_enc.state_dict(), + 'opt_seq_pri': self.opt_seq_pri.state_dict(), + 'opt_att_layer': self.opt_att_layer.state_dict(), + 'opt_seq_post': self.opt_seq_post.state_dict(), + 'opt_seq_dec': self.opt_seq_dec.state_dict(), + # 'opt_movement_dis': self.opt_movement_dis.state_dict(), + + 'ep': ep, + 'total_it': total_it, + 'sub_ep': sub_ep, + 'sl_len': sl_len + } + torch.save(state, file_name) + return + + def load(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + if self.opt.is_train: + self.seq_post.load_state_dict(checkpoint['seq_post']) + # self.opt_latent_dis.load_state_dict(checkpoint['opt_latent_dis']) + + self.opt_text_enc.load_state_dict(checkpoint['opt_text_enc']) + self.opt_seq_post.load_state_dict(checkpoint['opt_seq_post']) + self.opt_att_layer.load_state_dict(checkpoint['opt_att_layer']) + self.opt_seq_pri.load_state_dict(checkpoint['opt_seq_pri']) + self.opt_seq_dec.load_state_dict(checkpoint['opt_seq_dec']) + self.opt_mov_dec.load_state_dict(checkpoint['opt_mov_dec']) + + self.text_enc.load_state_dict(checkpoint['text_enc']) + self.mov_dec.load_state_dict(checkpoint['mov_dec']) + self.seq_pri.load_state_dict(checkpoint['seq_pri']) + self.att_layer.load_state_dict(checkpoint['att_layer']) + self.seq_dec.load_state_dict(checkpoint['seq_dec']) + self.mov_enc.load_state_dict(checkpoint['mov_enc']) + + return checkpoint['ep'], checkpoint['total_it'], checkpoint['sub_ep'], checkpoint['sl_len'] + + def train(self, train_dataset, val_dataset, plot_eval): + self.to(self.device) + + self.opt_text_enc = optim.Adam(self.text_enc.parameters(), lr=self.opt.lr) + self.opt_seq_post = optim.Adam(self.seq_post.parameters(), lr=self.opt.lr) + self.opt_seq_pri = optim.Adam(self.seq_pri.parameters(), lr=self.opt.lr) + self.opt_att_layer = optim.Adam(self.att_layer.parameters(), lr=self.opt.lr) + self.opt_seq_dec = optim.Adam(self.seq_dec.parameters(), lr=self.opt.lr) + + self.opt_mov_dec = optim.Adam(self.mov_dec.parameters(), lr=self.opt.lr*0.1) + + epoch = 0 + it = 0 + if self.opt.dataset_name == 't2m': + schedule_len = 10 + elif self.opt.dataset_name == 'kit': + schedule_len = 6 + sub_ep = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it, sub_ep, schedule_len = self.load(model_dir) + + invalid = True + start_time = time.time() + val_loss = 0 + is_continue_and_first = self.opt.is_continue + while invalid: + train_dataset.reset_max_len(schedule_len * self.opt.unit_length) + val_dataset.reset_max_len(schedule_len * self.opt.unit_length) + + train_loader = DataLoader(train_dataset, batch_size=self.opt.batch_size, drop_last=True, num_workers=4, + shuffle=True, collate_fn=collate_fn, pin_memory=True) + val_loader = DataLoader(val_dataset, batch_size=self.opt.batch_size, drop_last=True, num_workers=4, + shuffle=True, collate_fn=collate_fn, pin_memory=True) + print("Max_Length:%03d Training Split:%05d Validation Split:%04d" % (schedule_len, len(train_loader), len(val_loader))) + + min_val_loss = np.inf + stop_cnt = 0 + logs = OrderedDict() + for sub_epoch in range(sub_ep, self.opt.max_sub_epoch): + self.train_mode() + + if is_continue_and_first: + sub_ep = 0 + is_continue_and_first = False + + tf_ratio = self.opt.tf_ratio + + time1 = time.time() + for i, batch_data in enumerate(train_loader): + time2 = time.time() + self.forward(batch_data, tf_ratio, schedule_len) + time3 = time.time() + log_dict = self.update() + for k, v in log_dict.items(): + if k not in logs: + logs[k] = v + else: + logs[k] += v + time4 = time.time() + + + it += 1 + if it % self.opt.log_every == 0: + mean_loss = OrderedDict({'val_loss': val_loss}) + self.logger.scalar_summary('val_loss', val_loss, it) + self.logger.scalar_summary('scheduled_length', schedule_len, it) + + for tag, value in logs.items(): + self.logger.scalar_summary(tag, value/self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = OrderedDict() + print_current_loss(start_time, it, mean_loss, epoch, sub_epoch=sub_epoch, inner_iter=i, + tf_ratio=tf_ratio, sl_steps=schedule_len) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it, sub_epoch, schedule_len) + + time5 = time.time() + # print("Data Loader Time: %5f s" % ((time2 - time1))) + # print("Forward Time: %5f s" % ((time3 - time2))) + # print("Update Time: %5f s" % ((time4 - time3))) + # print('Per Iteration: %5f s' % ((time5 - time1))) + time1 = time5 + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it, sub_epoch, schedule_len) + + epoch += 1 + if epoch % self.opt.save_every_e == 0: + self.save(pjoin(self.opt.model_dir, 'E%03d_SE%02d_SL%02d.tar'%(epoch, sub_epoch, schedule_len)), + epoch, total_it=it, sub_ep=sub_epoch, sl_len=schedule_len) + + print('Validation time:') + + loss_mot_rec = 0 + loss_mov_rec = 0 + loss_kld = 0 + val_loss = 0 + with torch.no_grad(): + for i, batch_data in enumerate(val_loader): + self.forward(batch_data, 0, schedule_len) + self.backward_G() + loss_mot_rec += self.loss_mot_rec.item() + loss_mov_rec += self.loss_mov_rec.item() + loss_kld += self.loss_kld.item() + val_loss += self.loss_gen.item() + + loss_mot_rec /= len(val_loader) + 1 + loss_mov_rec /= len(val_loader) + 1 + loss_kld /= len(val_loader) + 1 + val_loss /= len(val_loader) + 1 + print('Validation Loss: %.5f Movement Recon Loss: %.5f Motion Recon Loss: %.5f KLD Loss: %.5f:' % + (val_loss, loss_mov_rec, loss_mot_rec, loss_kld)) + + if epoch % self.opt.eval_every_e == 0: + reco_data = self.fake_motions[:4] + with torch.no_grad(): + self.forward(batch_data, 0, schedule_len, eval_mode=True) + fake_data = self.fake_motions[:4] + gt_data = self.motions[:4] + data = torch.cat([fake_data, reco_data, gt_data], dim=0).cpu().numpy() + captions = self.caption[:4] * 3 + save_dir = pjoin(self.opt.eval_dir, 'E%03d_SE%02d_SL%02d'%(epoch, sub_epoch, schedule_len)) + os.makedirs(save_dir, exist_ok=True) + plot_eval(data, save_dir, captions) + + # if cl_ratio == 1: + if val_loss < min_val_loss: + min_val_loss = val_loss + stop_cnt = 0 + elif stop_cnt < self.opt.early_stop_count: + stop_cnt += 1 + elif stop_cnt >= self.opt.early_stop_count: + break + if val_loss - min_val_loss >= 0.1: + break + + schedule_len += 1 + + if schedule_len > 49: + invalid = False + + +class LengthEstTrainer(object): + + def __init__(self, args, estimator): + self.opt = args + self.estimator = estimator + self.device = args.device + + if args.is_train: + # self.motion_dis + self.logger = Logger(args.log_dir) + self.mul_cls_criterion = torch.nn.CrossEntropyLoss() + + def resume(self, model_dir): + checkpoints = torch.load(model_dir, map_location=self.device) + self.estimator.load_state_dict(checkpoints['estimator']) + self.opt_estimator.load_state_dict(checkpoints['opt_estimator']) + return checkpoints['epoch'], checkpoints['iter'] + + def save(self, model_dir, epoch, niter): + state = { + 'estimator': self.estimator.state_dict(), + 'opt_estimator': self.opt_estimator.state_dict(), + 'epoch': epoch, + 'niter': niter, + } + torch.save(state, model_dir) + + @staticmethod + def zero_grad(opt_list): + for opt in opt_list: + opt.zero_grad() + + @staticmethod + def clip_norm(network_list): + for network in network_list: + clip_grad_norm_(network.parameters(), 0.5) + + @staticmethod + def step(opt_list): + for opt in opt_list: + opt.step() + + def train(self, train_dataloader, val_dataloader): + self.estimator.to(self.device) + + self.opt_estimator = optim.Adam(self.estimator.parameters(), lr=self.opt.lr) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_dataloader) + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_dataloader), len(val_dataloader))) + val_loss = 0 + min_val_loss = np.inf + logs = OrderedDict({'loss': 0}) + while epoch < self.opt.max_epoch: + # time0 = time.time() + for i, batch_data in enumerate(train_dataloader): + self.estimator.train() + + word_emb, pos_ohot, _, cap_lens, _, m_lens = batch_data + word_emb = word_emb.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + + pred_dis = self.estimator(word_emb, pos_ohot, cap_lens) + + self.zero_grad([self.opt_estimator]) + + gt_labels = m_lens // self.opt.unit_length + gt_labels = gt_labels.long().to(self.device) + # print(gt_labels) + # print(pred_dis) + loss = self.mul_cls_criterion(pred_dis, gt_labels) + + loss.backward() + + self.clip_norm([self.estimator]) + self.step([self.opt_estimator]) + + logs['loss'] += loss.item() + + it += 1 + if it % self.opt.log_every == 0: + mean_loss = OrderedDict({'val_loss': val_loss}) + self.logger.scalar_summary('val_loss', val_loss, it) + + for tag, value in logs.items(): + self.logger.scalar_summary(tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = OrderedDict({'loss': 0}) + print_current_loss_decomp(start_time, it, total_iters, mean_loss, epoch, i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + if epoch % self.opt.save_every_e == 0: + self.save(pjoin(self.opt.model_dir, 'E%04d.tar' % (epoch)), epoch, it) + + print('Validation time:') + + val_loss = 0 + with torch.no_grad(): + for i, batch_data in enumerate(val_dataloader): + word_emb, pos_ohot, _, cap_lens, _, m_lens = batch_data + word_emb = word_emb.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + + pred_dis = self.estimator(word_emb, pos_ohot, cap_lens) + + gt_labels = m_lens // self.opt.unit_length + gt_labels = gt_labels.long().to(self.device) + loss = self.mul_cls_criterion(pred_dis, gt_labels) + + val_loss += loss.item() + + val_loss = val_loss / (len(val_dataloader) + 1) + print('Validation Loss: %.5f' % (val_loss)) + + if val_loss < min_val_loss: + self.save(pjoin(self.opt.model_dir, 'finest.tar'), epoch, it) + min_val_loss = val_loss + + +class TextMotionMatchTrainer(object): + + def __init__(self, args, text_encoder, motion_encoder, movement_encoder): + self.opt = args + self.text_encoder = text_encoder + self.motion_encoder = motion_encoder + self.movement_encoder = movement_encoder + self.device = args.device + + if args.is_train: + # self.motion_dis + self.logger = Logger(args.log_dir) + self.contrastive_loss = ContrastiveLoss(self.opt.negative_margin) + + def resume(self, model_dir): + checkpoints = torch.load(model_dir, map_location=self.device) + self.text_encoder.load_state_dict(checkpoints['text_encoder']) + self.motion_encoder.load_state_dict(checkpoints['motion_encoder']) + self.movement_encoder.load_state_dict(checkpoints['movement_encoder']) + + self.opt_text_encoder.load_state_dict(checkpoints['opt_text_encoder']) + self.opt_motion_encoder.load_state_dict(checkpoints['opt_motion_encoder']) + return checkpoints['epoch'], checkpoints['iter'] + + def save(self, model_dir, epoch, niter): + state = { + 'text_encoder': self.text_encoder.state_dict(), + 'motion_encoder': self.motion_encoder.state_dict(), + 'movement_encoder': self.movement_encoder.state_dict(), + + 'opt_text_encoder': self.opt_text_encoder.state_dict(), + 'opt_motion_encoder': self.opt_motion_encoder.state_dict(), + 'epoch': epoch, + 'iter': niter, + } + torch.save(state, model_dir) + + @staticmethod + def zero_grad(opt_list): + for opt in opt_list: + opt.zero_grad() + + @staticmethod + def clip_norm(network_list): + for network in network_list: + clip_grad_norm_(network.parameters(), 0.5) + + @staticmethod + def step(opt_list): + for opt in opt_list: + opt.step() + + def to(self, device): + self.text_encoder.to(device) + self.motion_encoder.to(device) + self.movement_encoder.to(device) + + def train_mode(self): + self.text_encoder.train() + self.motion_encoder.train() + self.movement_encoder.eval() + + def forward(self, batch_data): + word_emb, pos_ohot, caption, cap_lens, motions, m_lens, _ = batch_data + word_emb = word_emb.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + motions = motions.detach().to(self.device).float() + + # Sort the length of motions in descending order, (length of text has been sorted) + self.align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + # print(self.align_idx) + # print(m_lens[self.align_idx]) + motions = motions[self.align_idx] + m_lens = m_lens[self.align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt.unit_length + self.motion_embedding = self.motion_encoder(movements, m_lens) + + '''Text Encoding''' + # time0 = time.time() + # text_input = torch.cat([word_emb, pos_ohot], dim=-1) + self.text_embedding = self.text_encoder(word_emb, pos_ohot, cap_lens) + self.text_embedding = self.text_embedding.clone()[self.align_idx] + + + def backward(self): + + batch_size = self.text_embedding.shape[0] + '''Positive pairs''' + pos_labels = torch.zeros(batch_size).to(self.text_embedding.device) + self.loss_pos = self.contrastive_loss(self.text_embedding, self.motion_embedding, pos_labels) + + '''Negative Pairs, shifting index''' + neg_labels = torch.ones(batch_size).to(self.text_embedding.device) + shift = np.random.randint(0, batch_size-1) + new_idx = np.arange(shift, batch_size + shift) % batch_size + self.mis_motion_embedding = self.motion_embedding.clone()[new_idx] + self.loss_neg = self.contrastive_loss(self.text_embedding, self.mis_motion_embedding, neg_labels) + self.loss = self.loss_pos + self.loss_neg + + loss_logs = OrderedDict({}) + loss_logs['loss'] = self.loss.item() + loss_logs['loss_pos'] = self.loss_pos.item() + loss_logs['loss_neg'] = self.loss_neg.item() + return loss_logs + + + def update(self): + + self.zero_grad([self.opt_motion_encoder, self.opt_text_encoder]) + loss_logs = self.backward() + self.loss.backward() + self.clip_norm([self.text_encoder, self.motion_encoder]) + self.step([self.opt_text_encoder, self.opt_motion_encoder]) + + return loss_logs + + + def train(self, train_dataloader, val_dataloader): + self.to(self.device) + + self.opt_motion_encoder = optim.Adam(self.motion_encoder.parameters(), lr=self.opt.lr) + self.opt_text_encoder = optim.Adam(self.text_encoder.parameters(), lr=self.opt.lr) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_dataloader) + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_dataloader), len(val_dataloader))) + val_loss = 0 + logs = OrderedDict() + + min_val_loss = np.inf + while epoch < self.opt.max_epoch: + # time0 = time.time() + for i, batch_data in enumerate(train_dataloader): + self.train_mode() + + self.forward(batch_data) + # time3 = time.time() + log_dict = self.update() + for k, v in log_dict.items(): + if k not in logs: + logs[k] = v + else: + logs[k] += v + + + it += 1 + if it % self.opt.log_every == 0: + mean_loss = OrderedDict({'val_loss': val_loss}) + self.logger.scalar_summary('val_loss', val_loss, it) + + for tag, value in logs.items(): + self.logger.scalar_summary(tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = OrderedDict() + print_current_loss_decomp(start_time, it, total_iters, mean_loss, epoch, i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + if epoch % self.opt.save_every_e == 0: + self.save(pjoin(self.opt.model_dir, 'E%04d.tar' % (epoch)), epoch, it) + + print('Validation time:') + + loss_pos_pair = 0 + loss_neg_pair = 0 + val_loss = 0 + with torch.no_grad(): + for i, batch_data in enumerate(val_dataloader): + self.forward(batch_data) + self.backward() + loss_pos_pair += self.loss_pos.item() + loss_neg_pair += self.loss_neg.item() + val_loss += self.loss.item() + + loss_pos_pair /= len(val_dataloader) + 1 + loss_neg_pair /= len(val_dataloader) + 1 + val_loss /= len(val_dataloader) + 1 + print('Validation Loss: %.5f Positive Loss: %.5f Negative Loss: %.5f' % + (val_loss, loss_pos_pair, loss_neg_pair)) + + if val_loss < min_val_loss: + self.save(pjoin(self.opt.model_dir, 'finest.tar'), epoch, it) + min_val_loss = val_loss + + if epoch % self.opt.eval_every_e == 0: + pos_dist = F.pairwise_distance(self.text_embedding, self.motion_embedding) + neg_dist = F.pairwise_distance(self.text_embedding, self.mis_motion_embedding) + + pos_str = ' '.join(['%.3f' % (pos_dist[i]) for i in range(pos_dist.shape[0])]) + neg_str = ' '.join(['%.3f' % (neg_dist[i]) for i in range(neg_dist.shape[0])]) + + save_path = pjoin(self.opt.eval_dir, 'E%03d.txt' % (epoch)) + with cs.open(save_path, 'w') as f: + f.write('Positive Pairs Distance\n') + f.write(pos_str + '\n') + f.write('Negative Pairs Distance\n') + f.write(neg_str + '\n') diff --git a/src/mdm/data_loaders/humanml/scripts/motion_process.py b/src/mdm/data_loaders/humanml/scripts/motion_process.py new file mode 100644 index 0000000000000000000000000000000000000000..6fb0c40ceffb270c70415845aeeb4f260704d894 --- /dev/null +++ b/src/mdm/data_loaders/humanml/scripts/motion_process.py @@ -0,0 +1,669 @@ +from os.path import join as pjoin + +from data_loaders.humanml.common.skeleton import Skeleton +import numpy as np +import os +from data_loaders.humanml.common.quaternion import * +from data_loaders.humanml.utils.paramUtil import * + +import torch +from tqdm import tqdm +from data_loaders.humanml_utils import HML_JOINT_NAMES, HML_EE_JOINT_NAMES + +import random +from copy import copy, deepcopy + +# positions (batch, joint_num, 3) +def uniform_skeleton(positions, target_offset): + src_skel = Skeleton(n_raw_offsets, kinematic_chain, 'cpu') + src_offset = src_skel.get_offsets_joints(torch.from_numpy(positions[0])) + src_offset = src_offset.numpy() + tgt_offset = target_offset.numpy() + # print(src_offset) + # print(tgt_offset) + '''Calculate Scale Ratio as the ratio of legs''' + src_leg_len = np.abs(src_offset[l_idx1]).max() + np.abs(src_offset[l_idx2]).max() + tgt_leg_len = np.abs(tgt_offset[l_idx1]).max() + np.abs(tgt_offset[l_idx2]).max() + + scale_rt = tgt_leg_len / src_leg_len + # print(scale_rt) + src_root_pos = positions[:, 0] + tgt_root_pos = src_root_pos * scale_rt + + '''Inverse Kinematics''' + quat_params = src_skel.inverse_kinematics_np(positions, face_joint_indx) + # print(quat_params.shape) + + '''Forward Kinematics''' + src_skel.set_offset(target_offset) + new_joints = src_skel.forward_kinematics_np(quat_params, tgt_root_pos) + return new_joints + + +def extract_features(positions, feet_thre, n_raw_offsets, kinematic_chain, face_joint_indx, fid_r, fid_l): + global_positions = positions.copy() + """ Get Foot Contacts """ + + def foot_detect(positions, thres): + velfactor, heightfactor = np.array([thres, thres]), np.array([3.0, 2.0]) + + feet_l_x = (positions[1:, fid_l, 0] - positions[:-1, fid_l, 0]) ** 2 + feet_l_y = (positions[1:, fid_l, 1] - positions[:-1, fid_l, 1]) ** 2 + feet_l_z = (positions[1:, fid_l, 2] - positions[:-1, fid_l, 2]) ** 2 + # feet_l_h = positions[:-1,fid_l,1] + # feet_l = (((feet_l_x + feet_l_y + feet_l_z) < velfactor) & (feet_l_h < heightfactor)).astype(np.float) + feet_l = ((feet_l_x + feet_l_y + feet_l_z) < velfactor).astype(np.float) + + feet_r_x = (positions[1:, fid_r, 0] - positions[:-1, fid_r, 0]) ** 2 + feet_r_y = (positions[1:, fid_r, 1] - positions[:-1, fid_r, 1]) ** 2 + feet_r_z = (positions[1:, fid_r, 2] - positions[:-1, fid_r, 2]) ** 2 + # feet_r_h = positions[:-1,fid_r,1] + # feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor) & (feet_r_h < heightfactor)).astype(np.float) + feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor)).astype(np.float) + return feet_l, feet_r + + # + feet_l, feet_r = foot_detect(positions, feet_thre) + # feet_l, feet_r = foot_detect(positions, 0.002) + + '''Quaternion and Cartesian representation''' + r_rot = None + + def get_rifke(positions): + '''Local pose''' + positions[..., 0] -= positions[:, 0:1, 0] + positions[..., 2] -= positions[:, 0:1, 2] + '''All pose face Z+''' + positions = qrot_np(np.repeat(r_rot[:, None], positions.shape[1], axis=1), positions) + return positions + + def get_quaternion(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=False) + + '''Fix Quaternion Discontinuity''' + quat_params = qfix(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + quat_params[1:, 0] = r_velocity + # (seq_len, joints_num, 4) + return quat_params, r_velocity, velocity, r_rot + + def get_cont6d_params(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=True) + + '''Quaternion to continuous 6D''' + cont_6d_params = quaternion_to_cont6d_np(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + # (seq_len, joints_num, 4) + return cont_6d_params, r_velocity, velocity, r_rot + + cont_6d_params, r_velocity, velocity, r_rot = get_cont6d_params(positions) + positions = get_rifke(positions) + + # trejec = np.cumsum(np.concatenate([np.array([[0, 0, 0]]), velocity], axis=0), axis=0) + # r_rotations, r_pos = recover_ric_glo_np(r_velocity, velocity[:, [0, 2]]) + + # plt.plot(positions_b[:, 0, 0], positions_b[:, 0, 2], marker='*') + # plt.plot(ground_positions[:, 0, 0], ground_positions[:, 0, 2], marker='o', color='r') + # plt.plot(trejec[:, 0], trejec[:, 2], marker='^', color='g') + # plt.plot(r_pos[:, 0], r_pos[:, 2], marker='s', color='y') + # plt.xlabel('x') + # plt.ylabel('z') + # plt.axis('equal') + # plt.show() + + '''Root height''' + root_y = positions[:, 0, 1:2] + + '''Root rotation and linear velocity''' + # (seq_len-1, 1) rotation velocity along y-axis + # (seq_len-1, 2) linear velovity on xz plane + r_velocity = np.arcsin(r_velocity[:, 2:3]) + l_velocity = velocity[:, [0, 2]] + # print(r_velocity.shape, l_velocity.shape, root_y.shape) + root_data = np.concatenate([r_velocity, l_velocity, root_y[:-1]], axis=-1) + + '''Get Joint Rotation Representation''' + # (seq_len, (joints_num-1) *6) quaternion for skeleton joints + rot_data = cont_6d_params[:, 1:].reshape(len(cont_6d_params), -1) + + '''Get Joint Rotation Invariant Position Represention''' + # (seq_len, (joints_num-1)*3) local joint position + ric_data = positions[:, 1:].reshape(len(positions), -1) + + '''Get Joint Velocity Representation''' + # (seq_len-1, joints_num*3) + local_vel = qrot_np(np.repeat(r_rot[:-1, None], global_positions.shape[1], axis=1), + global_positions[1:] - global_positions[:-1]) + local_vel = local_vel.reshape(len(local_vel), -1) + + data = root_data + data = np.concatenate([data, ric_data[:-1]], axis=-1) + data = np.concatenate([data, rot_data[:-1]], axis=-1) + # print(dataset.shape, local_vel.shape) + data = np.concatenate([data, local_vel], axis=-1) + data = np.concatenate([data, feet_l, feet_r], axis=-1) + + return data + + +def process_file(positions, feet_thre): + # (seq_len, joints_num, 3) + # '''Down Sample''' + # positions = positions[::ds_num] + + '''Uniform Skeleton''' + positions = uniform_skeleton(positions, tgt_offsets) + + '''Put on Floor''' + floor_height = positions.min(axis=0).min(axis=0)[1] + positions[:, :, 1] -= floor_height + # print(floor_height) + + # plot_3d_motion("./positions_1.mp4", kinematic_chain, positions, 'title', fps=20) + + '''XZ at origin''' + root_pos_init = positions[0] + root_pose_init_xz = root_pos_init[0] * np.array([1, 0, 1]) + positions = positions - root_pose_init_xz + + # '''Move the first pose to origin ''' + # root_pos_init = positions[0] + # positions = positions - root_pos_init[0] + + '''All initially face Z+''' + r_hip, l_hip, sdr_r, sdr_l = face_joint_indx + across1 = root_pos_init[r_hip] - root_pos_init[l_hip] + across2 = root_pos_init[sdr_r] - root_pos_init[sdr_l] + across = across1 + across2 + across = across / np.sqrt((across ** 2).sum(axis=-1))[..., np.newaxis] + + # forward (3,), rotate around y-axis + forward_init = np.cross(np.array([[0, 1, 0]]), across, axis=-1) + # forward (3,) + forward_init = forward_init / np.sqrt((forward_init ** 2).sum(axis=-1))[..., np.newaxis] + + # print(forward_init) + + target = np.array([[0, 0, 1]]) + root_quat_init = qbetween_np(forward_init, target) + root_quat_init = np.ones(positions.shape[:-1] + (4,)) * root_quat_init + + positions_b = positions.copy() + + positions = qrot_np(root_quat_init, positions) + + # plot_3d_motion("./positions_2.mp4", kinematic_chain, positions, 'title', fps=20) + + '''New ground truth positions''' + global_positions = positions.copy() + + # plt.plot(positions_b[:, 0, 0], positions_b[:, 0, 2], marker='*') + # plt.plot(positions[:, 0, 0], positions[:, 0, 2], marker='o', color='r') + # plt.xlabel('x') + # plt.ylabel('z') + # plt.axis('equal') + # plt.show() + + """ Get Foot Contacts """ + + def foot_detect(positions, thres): + velfactor, heightfactor = np.array([thres, thres]), np.array([3.0, 2.0]) + + feet_l_x = (positions[1:, fid_l, 0] - positions[:-1, fid_l, 0]) ** 2 + feet_l_y = (positions[1:, fid_l, 1] - positions[:-1, fid_l, 1]) ** 2 + feet_l_z = (positions[1:, fid_l, 2] - positions[:-1, fid_l, 2]) ** 2 + # feet_l_h = positions[:-1,fid_l,1] + # feet_l = (((feet_l_x + feet_l_y + feet_l_z) < velfactor) & (feet_l_h < heightfactor)).astype(np.float) + feet_l = ((feet_l_x + feet_l_y + feet_l_z) < velfactor).astype(np.float) + + feet_r_x = (positions[1:, fid_r, 0] - positions[:-1, fid_r, 0]) ** 2 + feet_r_y = (positions[1:, fid_r, 1] - positions[:-1, fid_r, 1]) ** 2 + feet_r_z = (positions[1:, fid_r, 2] - positions[:-1, fid_r, 2]) ** 2 + # feet_r_h = positions[:-1,fid_r,1] + # feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor) & (feet_r_h < heightfactor)).astype(np.float) + feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor)).astype(np.float) + return feet_l, feet_r + # + feet_l, feet_r = foot_detect(positions, feet_thre) + # feet_l, feet_r = foot_detect(positions, 0.002) + + '''Quaternion and Cartesian representation''' + r_rot = None + + def get_rifke(positions): + '''Local pose''' + positions[..., 0] -= positions[:, 0:1, 0] + positions[..., 2] -= positions[:, 0:1, 2] + '''All pose face Z+''' + positions = qrot_np(np.repeat(r_rot[:, None], positions.shape[1], axis=1), positions) + return positions + + def get_quaternion(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=False) + + '''Fix Quaternion Discontinuity''' + quat_params = qfix(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + quat_params[1:, 0] = r_velocity + # (seq_len, joints_num, 4) + return quat_params, r_velocity, velocity, r_rot + + def get_cont6d_params(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=True) + + '''Quaternion to continuous 6D''' + cont_6d_params = quaternion_to_cont6d_np(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + # (seq_len, joints_num, 4) + return cont_6d_params, r_velocity, velocity, r_rot + + cont_6d_params, r_velocity, velocity, r_rot = get_cont6d_params(positions) + positions = get_rifke(positions) + + # trejec = np.cumsum(np.concatenate([np.array([[0, 0, 0]]), velocity], axis=0), axis=0) + # r_rotations, r_pos = recover_ric_glo_np(r_velocity, velocity[:, [0, 2]]) + + # plt.plot(positions_b[:, 0, 0], positions_b[:, 0, 2], marker='*') + # plt.plot(ground_positions[:, 0, 0], ground_positions[:, 0, 2], marker='o', color='r') + # plt.plot(trejec[:, 0], trejec[:, 2], marker='^', color='g') + # plt.plot(r_pos[:, 0], r_pos[:, 2], marker='s', color='y') + # plt.xlabel('x') + # plt.ylabel('z') + # plt.axis('equal') + # plt.show() + + '''Root height''' + root_y = positions[:, 0, 1:2] + + '''Root rotation and linear velocity''' + # (seq_len-1, 1) rotation velocity along y-axis + # (seq_len-1, 2) linear velovity on xz plane + r_velocity = np.arcsin(r_velocity[:, 2:3]) + l_velocity = velocity[:, [0, 2]] + # print(r_velocity.shape, l_velocity.shape, root_y.shape) + root_data = np.concatenate([r_velocity, l_velocity, root_y[:-1]], axis=-1) + + '''Get Joint Rotation Representation''' + # (seq_len, (joints_num-1) *6) quaternion for skeleton joints + rot_data = cont_6d_params[:, 1:].reshape(len(cont_6d_params), -1) + + '''Get Joint Rotation Invariant Position Represention''' + # (seq_len, (joints_num-1)*3) local joint position + ric_data = positions[:, 1:].reshape(len(positions), -1) + + '''Get Joint Velocity Representation''' + # (seq_len-1, joints_num*3) + local_vel = qrot_np(np.repeat(r_rot[:-1, None], global_positions.shape[1], axis=1), + global_positions[1:] - global_positions[:-1]) + local_vel = local_vel.reshape(len(local_vel), -1) + + data = root_data + data = np.concatenate([data, ric_data[:-1]], axis=-1) + data = np.concatenate([data, rot_data[:-1]], axis=-1) + # print(dataset.shape, local_vel.shape) + data = np.concatenate([data, local_vel], axis=-1) + data = np.concatenate([data, feet_l, feet_r], axis=-1) + + return data, global_positions, positions, l_velocity + + +# Recover global angle and positions for rotation dataset +# root_rot_velocity (B, seq_len, 1) +# root_linear_velocity (B, seq_len, 2) +# root_y (B, seq_len, 1) +# ric_data (B, seq_len, (joint_num - 1)*3) +# rot_data (B, seq_len, (joint_num - 1)*6) +# local_velocity (B, seq_len, joint_num*3) +# foot contact (B, seq_len, 4) +def recover_root_rot_pos(data): + rot_vel = data[..., 0] + r_rot_ang = torch.zeros_like(rot_vel).to(data.device) + '''Get Y-axis rotation from rotation velocity''' + r_rot_ang[..., 1:] = rot_vel[..., :-1] + r_rot_ang = torch.cumsum(r_rot_ang, dim=-1) + + r_rot_quat = torch.zeros(data.shape[:-1] + (4,)).to(data.device) + r_rot_quat[..., 0] = torch.cos(r_rot_ang) + r_rot_quat[..., 2] = torch.sin(r_rot_ang) + + r_pos = torch.zeros(data.shape[:-1] + (3,)).to(data.device) + r_pos[..., 1:, [0, 2]] = data[..., :-1, 1:3] + '''Add Y-axis rotation to root position''' + r_pos = qrot(qinv(r_rot_quat), r_pos) + + r_pos = torch.cumsum(r_pos, dim=-2) + + r_pos[..., 1] = data[..., 3] + return r_rot_quat, r_pos + + +def recover_root_rot_heading_ang(joints): + + '''Get Forward Direction''' + face_joint_idx = [2, 1, 17, 16] + # l_hip, r_hip, sdr_r, sdr_l = face_joint_idx + r_hip, l_hip, sdr_r, sdr_l = face_joint_idx # Note the bugfix + across1 = joints[:, r_hip] - joints[:, l_hip] + across2 = joints[:, sdr_r] - joints[:, sdr_l] + across = across1 + across2 + across = torch.nn.functional.normalize(across, dim=1) + # print(across1.shape, across2.shape) + + # forward (batch_size, 3) + forward = torch.cross(torch.tensor([[[0], [1], [0]]], dtype=across.dtype, device=across.device), across, axis=1) + forward = torch.nn.functional.normalize(forward, dim=1) + + return torch.atan2(forward[:, 0], forward[:, 2])[:, None] + +def recover_from_rot(data, joints_num, skeleton): + r_rot_quat, r_pos = recover_root_rot_pos(data) + + r_rot_cont6d = quaternion_to_cont6d(r_rot_quat) + + start_indx = 1 + 2 + 1 + (joints_num - 1) * 3 + end_indx = start_indx + (joints_num - 1) * 6 + cont6d_params = data[..., start_indx:end_indx] + # print(r_rot_cont6d.shape, cont6d_params.shape, r_pos.shape) + cont6d_params = torch.cat([r_rot_cont6d, cont6d_params], dim=-1) + cont6d_params = cont6d_params.view(-1, joints_num, 6) + + positions = skeleton.forward_kinematics_cont6d(cont6d_params, r_pos) + + return positions + +def recover_rot(data): + # dataset [bs, seqlen, 263/251] HumanML/KIT + joints_num = 22 if data.shape[-1] == 263 else 21 + r_rot_quat, r_pos = recover_root_rot_pos(data) + r_pos_pad = torch.cat([r_pos, torch.zeros_like(r_pos)], dim=-1).unsqueeze(-2) + r_rot_cont6d = quaternion_to_cont6d(r_rot_quat) + start_indx = 1 + 2 + 1 + (joints_num - 1) * 3 + end_indx = start_indx + (joints_num - 1) * 6 + cont6d_params = data[..., start_indx:end_indx] + cont6d_params = torch.cat([r_rot_cont6d, cont6d_params], dim=-1) + cont6d_params = cont6d_params.view(-1, joints_num, 6) + cont6d_params = torch.cat([cont6d_params, r_pos_pad], dim=-2) + return cont6d_params + + +def recover_from_ric(data, joints_num): + r_rot_quat, r_pos = recover_root_rot_pos(data) + positions = data[..., 4:(joints_num - 1) * 3 + 4] + positions = positions.view(positions.shape[:-1] + (-1, 3)) + + '''Add Y-axis rotation to local joints''' + positions = qrot(qinv(r_rot_quat[..., None, :]).expand(positions.shape[:-1] + (4,)), positions) + + '''Add root XZ to joints''' + positions[..., 0] += r_pos[..., 0:1] + positions[..., 2] += r_pos[..., 2:3] + + '''Concate root and joints''' + positions = torch.cat([r_pos.unsqueeze(-2), positions], dim=-2) + + return positions +''' +For Text2Motion Dataset +''' +''' +if __name__ == "__main__": + example_id = "000021" + # Lower legs + l_idx1, l_idx2 = 5, 8 + # Right/Left foot + fid_r, fid_l = [8, 11], [7, 10] + # Face direction, r_hip, l_hip, sdr_r, sdr_l + face_joint_indx = [2, 1, 17, 16] + # l_hip, r_hip + r_hip, l_hip = 2, 1 + joints_num = 22 + # ds_num = 8 + data_dir = '../dataset/pose_data_raw/joints/' + save_dir1 = '../dataset/pose_data_raw/new_joints/' + save_dir2 = '../dataset/pose_data_raw/new_joint_vecs/' + + n_raw_offsets = torch.from_numpy(t2m_raw_offsets) + kinematic_chain = t2m_kinematic_chain + + # Get offsets of target skeleton + example_data = np.load(os.path.join(data_dir, example_id + '.npy')) + example_data = example_data.reshape(len(example_data), -1, 3) + example_data = torch.from_numpy(example_data) + tgt_skel = Skeleton(n_raw_offsets, kinematic_chain, 'cpu') + # (joints_num, 3) + tgt_offsets = tgt_skel.get_offsets_joints(example_data[0]) + # print(tgt_offsets) + + source_list = os.listdir(data_dir) + frame_num = 0 + for source_file in tqdm(source_list): + source_data = np.load(os.path.join(data_dir, source_file))[:, :joints_num] + try: + dataset, ground_positions, positions, l_velocity = process_file(source_data, 0.002) + rec_ric_data = recover_from_ric(torch.from_numpy(dataset).unsqueeze(0).float(), joints_num) + np.save(pjoin(save_dir1, source_file), rec_ric_data.squeeze().numpy()) + np.save(pjoin(save_dir2, source_file), dataset) + frame_num += dataset.shape[0] + except Exception as e: + print(source_file) + print(e) + + print('Total clips: %d, Frames: %d, Duration: %fm' % + (len(source_list), frame_num, frame_num / 20 / 60)) +''' + +if __name__ == "__main__": + example_id = "03950_gt" + # Lower legs + l_idx1, l_idx2 = 17, 18 + # Right/Left foot + fid_r, fid_l = [14, 15], [19, 20] + # Face direction, r_hip, l_hip, sdr_r, sdr_l + face_joint_indx = [11, 16, 5, 8] + # l_hip, r_hip + r_hip, l_hip = 11, 16 + joints_num = 21 + # ds_num = 8 + data_dir = '../dataset/kit_mocap_dataset/joints/' + save_dir1 = '../dataset/kit_mocap_dataset/new_joints/' + save_dir2 = '../dataset/kit_mocap_dataset/new_joint_vecs/' + + n_raw_offsets = torch.from_numpy(kit_raw_offsets) + kinematic_chain = kit_kinematic_chain + + '''Get offsets of target skeleton''' + example_data = np.load(os.path.join(data_dir, example_id + '.npy')) + example_data = example_data.reshape(len(example_data), -1, 3) + example_data = torch.from_numpy(example_data) + tgt_skel = Skeleton(n_raw_offsets, kinematic_chain, 'cpu') + # (joints_num, 3) + tgt_offsets = tgt_skel.get_offsets_joints(example_data[0]) + # print(tgt_offsets) + + source_list = os.listdir(data_dir) + frame_num = 0 + '''Read source dataset''' + for source_file in tqdm(source_list): + source_data = np.load(os.path.join(data_dir, source_file))[:, :joints_num] + try: + name = ''.join(source_file[:-7].split('_')) + '.npy' + data, ground_positions, positions, l_velocity = process_file(source_data, 0.05) + rec_ric_data = recover_from_ric(torch.from_numpy(data).unsqueeze(0).float(), joints_num) + if np.isnan(rec_ric_data.numpy()).any(): + print(source_file) + continue + np.save(pjoin(save_dir1, name), rec_ric_data.squeeze().numpy()) + np.save(pjoin(save_dir2, name), data) + frame_num += data.shape[0] + except Exception as e: + print(source_file) + print(e) + + print('Total clips: %d, Frames: %d, Duration: %fm' % + (len(source_list), frame_num, frame_num / 12.5 / 60)) + + +def traj_global2vel(traj_positions, traj_rot): + + # traj_positions [bs, 2 (x,z), seqlen] + # traj_positions [bs, 1 (z+, rad), seqlen] + # return first 3 hml enries [bs, 3, seqlen-1] + + # skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # # (seq_len, joints_num, 4) + # quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=True) + + bs, _, seqlen = traj_positions.shape + traj_positions = traj_positions.permute(0, 2, 1) + euler = torch.zeros([bs, 3, seqlen], dtype=traj_rot.dtype, device=traj_rot.device) + euler[:, 1:2] = traj_rot + euler = euler.permute(0, 2, 1).contiguous() + traj_rot_quat = euler2quat(euler, 'yxz', deg=False) + + # '''Quaternion to continuous 6D''' + # cont_6d_params = quaternion_to_cont6d_np(quat_params) + # # (seq_len, 4) + r_rot = traj_rot_quat.clone() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = torch.zeros_like(euler[:, 1:, :]) + velocity[:, :, [0,2]] = (traj_positions[:, 1:, :] - traj_positions[:, :-1, :]).clone() + # print(r_rot.shape, velocity.shape) + velocity = qrot(r_rot[:, 1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul(r_rot[:, 1:].contiguous(), qinv(r_rot[:, :-1])) + # (seq_len, joints_num, 4) + + r_velocity = torch.arcsin(r_velocity[:, :, 2:3]) + l_velocity = velocity[:, :, [0, 2]] + # print(r_velocity.shape, l_velocity.shape, root_y.shape) + root_data = torch.cat([r_velocity, l_velocity], axis=-1).permute(0, 2, 1)[:, :, None] + + return root_data + +def get_target_location(motion, mean, std, lengths, joints_num, all_goal_joint_names, target_joint_names, is_heading): + assert (lengths == lengths[0]).all(), 'currently supporting only fixed length' + batch_size = motion.shape[0] + extended_goal_joint_names = all_goal_joint_names + ['traj', 'heading'] # todo: fix hardcoded indexing that assumes traj and heading are last + + # output tensor + target_loc = torch.zeros((batch_size, len(extended_goal_joint_names), 3, lengths[0]), dtype=motion.dtype, device=motion.device) # n_samples x (n_target_joints+1) x 3 x n_frames + + # hml to abs loc (all joints, not only the requested ones) + joints_loc = hml_to_abs_loc(motion, mean, std, joints_num) + pelvis_loc = HML_JOINT_NAMES.index('pelvis') + joints_loc = torch.concat([joints_loc, joints_loc[:, pelvis_loc:pelvis_loc+1]], dim=1) # concatenate the pelvis location to be used for traj + + # joint names to indices + HML_JOINT_NAMES_w_traj = HML_JOINT_NAMES + ['traj'] + for sample_idx in range(batch_size): + req_joint_idx_in = [HML_JOINT_NAMES_w_traj.index(name) for name in target_joint_names[sample_idx]] + req_joint_idx_out = [extended_goal_joint_names.index(name) for name in target_joint_names[sample_idx]] + + target_loc[sample_idx, req_joint_idx_out] = joints_loc[sample_idx, req_joint_idx_in] # assign joints loc to output tensor + + target_loc[:, -2, 1] = 0 # zero the y axis for the trajectory + + # last entry is the heading + heading = recover_root_rot_heading_ang(joints_loc) + target_loc[:, -1:, 0][is_heading] = heading[is_heading] + + return target_loc[..., -1] # return last frame only + + +def hml_to_abs_loc(motion, mean, std, joints_num): + # hml to abs loc (all joints, not only the requested ones) + unnormed_motion = (motion * std + mean).permute(0, 2, 3, 1).float() + joints_loc = recover_from_ric(unnormed_motion, joints_num) + joints_loc = joints_loc.view(-1, *joints_loc.shape[2:]).permute(0, 2, 3, 1) # n_samples x n_joints x 3 x n_frames + return joints_loc + + +def sample_goal(batch_size, device, force_joints=None): + if force_joints is None: + choices = np.array(['None', 'traj', 'pelvis'] + HML_EE_JOINT_NAMES) # todo: fix hardcoded 'pelvis' ('traj' is ok because it's our convention) + none_prob = 0.5 # todo: maybe convert to an argument + probabilities = torch.ones(len(choices)) * (1-none_prob) / (len(choices) -1) + probabilities[0] = none_prob # None's probability + assert probabilities.sum() - 1 < 1e-6, 'probabilities should sum to 1' + max_goal_joints_per_sample = 2 + # target_cond_idx = torch.randint(low=0, high=len(choices), size=(batch_size,max_goal_joints_per_sample)) + target_cond_idx = torch.multinomial(probabilities, max_goal_joints_per_sample * batch_size, replacement=True).view(batch_size, max_goal_joints_per_sample) + names = choices[target_cond_idx] + names = np.array([np.unique(name) for name in names]) + names = np.array([np.delete(name, np.argwhere(name=='None')) for name in names]) + is_heading = torch.bernoulli(torch.ones(batch_size, device=device) * .5).to(bool) + else: + options = get_allowed_joint_options(force_joints) + names = [copy(random.choice(options)) for _ in range(batch_size)] + is_heading = torch.zeros(batch_size, device=device).to(bool) + for i, n in enumerate(names): + if 'heading' in n: + is_heading[i] = True + del n[n.index('heading')] + return names, is_heading + +def get_allowed_joint_options(config_name): + if config_name == 'DIMP_FULL': + return [['pelvis', 'heading'], ['pelvis', 'head'], ['traj', 'heading'], ['right_wrist', 'heading'], ['left_wrist', 'heading'], ['right_foot', 'heading'], ['left_foot', 'heading']] + elif config_name == 'DIMP_FINAL': + return [['pelvis', 'heading'], ['traj', 'heading'], ['right_wrist', 'heading'], ['left_wrist', 'heading'], ['right_foot', 'heading'], ['left_foot', 'heading'], []] + elif config_name == 'DIMP_SLIM': + return [['pelvis', 'heading'], ['pelvis', 'head'], ['traj', 'heading'], ['left_wrist', 'heading'], ['left_foot', 'heading']] + elif config_name == 'DIMP_BENCH': + return [['pelvis', 'heading'], ['pelvis', 'head']] + elif config_name == 'PURE_T2M': + return [[]] + else: + return [config_name.split(',')] + diff --git a/src/mdm/data_loaders/humanml/utils/get_opt.py b/src/mdm/data_loaders/humanml/utils/get_opt.py new file mode 100644 index 0000000000000000000000000000000000000000..7c03555913ccc5e87af530c3359cd13c2d5be892 --- /dev/null +++ b/src/mdm/data_loaders/humanml/utils/get_opt.py @@ -0,0 +1,81 @@ +import os +from argparse import Namespace +import re +from os.path import join as pjoin +from data_loaders.humanml.utils.word_vectorizer import POS_enumerator + + +def is_float(numStr): + flag = False + numStr = str(numStr).strip().lstrip('-').lstrip('+') # Remove positive/negative signs. + try: + reg = re.compile(r'^[-+]?[0-9]+\.[0-9]+$') + res = reg.match(str(numStr)) + if res: + flag = True + except Exception as ex: + print("is_float() - error: " + str(ex)) + return flag + + +def is_number(numStr): + flag = False + numStr = str(numStr).strip().lstrip('-').lstrip('+') # Remove positive/negative signs. + if str(numStr).isdigit(): + flag = True + return flag + + +def get_opt(opt_path, device): + opt = Namespace() + opt_dict = vars(opt) + + skip = ('-------------- End ----------------', + '------------ Options -------------', + '\n') + print('Reading', opt_path) + with open(opt_path) as f: + for line in f: + if line.strip() not in skip: + # print(line.strip()) + key, value = line.strip().split(': ') + if value in ('True', 'False'): + opt_dict[key] = bool(value) + elif is_float(value): + opt_dict[key] = float(value) + elif is_number(value): + opt_dict[key] = int(value) + else: + opt_dict[key] = str(value) + + # print(opt) + opt_dict['which_epoch'] = 'latest' + opt.save_root = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + opt.model_dir = pjoin(opt.save_root, 'model') + opt.meta_dir = pjoin(opt.save_root, 'meta') + + if opt.dataset_name == 't2m': + opt.data_root = './dataset/HumanML3D' + opt.motion_dir = pjoin(opt.data_root, 'new_joint_vecs') + opt.text_dir = pjoin(opt.data_root, 'texts') + opt.joints_num = 22 + opt.dim_pose = 263 + opt.max_motion_length = 196 + elif opt.dataset_name == 'kit': + opt.data_root = './dataset/KIT-ML' + opt.motion_dir = pjoin(opt.data_root, 'new_joint_vecs') + opt.text_dir = pjoin(opt.data_root, 'texts') + opt.joints_num = 21 + opt.dim_pose = 251 + opt.max_motion_length = 196 + else: + raise KeyError('Dataset not recognized') + + opt.dim_word = 300 + opt.num_classes = 200 // opt.unit_length + opt.dim_pos_ohot = len(POS_enumerator) + opt.is_train = False + opt.is_continue = False + opt.device = device + + return opt \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/utils/metrics.py b/src/mdm/data_loaders/humanml/utils/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..4d6c68192ccecc3a1d739d2e4e53ffb12800efc1 --- /dev/null +++ b/src/mdm/data_loaders/humanml/utils/metrics.py @@ -0,0 +1,146 @@ +import numpy as np +from scipy import linalg + + +# (X - X_train)*(X - X_train) = -2X*X_train + X*X + X_train*X_train +def euclidean_distance_matrix(matrix1, matrix2): + """ + Params: + -- matrix1: N1 x D + -- matrix2: N2 x D + Returns: + -- dist: N1 x N2 + dist[i, j] == distance(matrix1[i], matrix2[j]) + """ + assert matrix1.shape[1] == matrix2.shape[1] + d1 = -2 * np.dot(matrix1, matrix2.T) # shape (num_test, num_train) + d2 = np.sum(np.square(matrix1), axis=1, keepdims=True) # shape (num_test, 1) + d3 = np.sum(np.square(matrix2), axis=1) # shape (num_train, ) + dists = np.sqrt(d1 + d2 + d3) # broadcasting + return dists + +def calculate_top_k(mat, top_k): + size = mat.shape[0] + gt_mat = np.expand_dims(np.arange(size), 1).repeat(size, 1) + bool_mat = (mat == gt_mat) + correct_vec = False + top_k_list = [] + for i in range(top_k): +# print(correct_vec, bool_mat[:, i]) + correct_vec = (correct_vec | bool_mat[:, i]) + # print(correct_vec) + top_k_list.append(correct_vec[:, None]) + top_k_mat = np.concatenate(top_k_list, axis=1) + return top_k_mat + + +def calculate_R_precision(embedding1, embedding2, top_k, sum_all=False): + dist_mat = euclidean_distance_matrix(embedding1, embedding2) + argmax = np.argsort(dist_mat, axis=1) + top_k_mat = calculate_top_k(argmax, top_k) + if sum_all: + return top_k_mat.sum(axis=0) + else: + return top_k_mat + + +def calculate_matching_score(embedding1, embedding2, sum_all=False): + assert len(embedding1.shape) == 2 + assert embedding1.shape[0] == embedding2.shape[0] + assert embedding1.shape[1] == embedding2.shape[1] + + dist = linalg.norm(embedding1 - embedding2, axis=1) + if sum_all: + return dist.sum(axis=0) + else: + return dist + + + +def calculate_activation_statistics(activations): + """ + Params: + -- activation: num_samples x dim_feat + Returns: + -- mu: dim_feat + -- sigma: dim_feat x dim_feat + """ + mu = np.mean(activations, axis=0) + cov = np.cov(activations, rowvar=False) + return mu, cov + + +def calculate_diversity(activation, diversity_times): + assert len(activation.shape) == 2 + assert activation.shape[0] > diversity_times + num_samples = activation.shape[0] + + first_indices = np.random.choice(num_samples, diversity_times, replace=False) + second_indices = np.random.choice(num_samples, diversity_times, replace=False) + dist = linalg.norm(activation[first_indices] - activation[second_indices], axis=1) + return dist.mean() + + +def calculate_multimodality(activation, multimodality_times): + assert len(activation.shape) == 3 + assert activation.shape[1] > multimodality_times + num_per_sent = activation.shape[1] + + first_dices = np.random.choice(num_per_sent, multimodality_times, replace=False) + second_dices = np.random.choice(num_per_sent, multimodality_times, replace=False) + dist = linalg.norm(activation[:, first_dices] - activation[:, second_dices], axis=2) + return dist.mean() + + +def calculate_frechet_distance(mu1, sigma1, mu2, sigma2, eps=1e-6): + """Numpy implementation of the Frechet Distance. + The Frechet distance between two multivariate Gaussians X_1 ~ N(mu_1, C_1) + and X_2 ~ N(mu_2, C_2) is + d^2 = ||mu_1 - mu_2||^2 + Tr(C_1 + C_2 - 2*sqrt(C_1*C_2)). + Stable version by Dougal J. Sutherland. + Params: + -- mu1 : Numpy array containing the activations of a layer of the + inception net (like returned by the function 'get_predictions') + for generated samples. + -- mu2 : The sample mean over activations, precalculated on an + representative dataset set. + -- sigma1: The covariance matrix over activations for generated samples. + -- sigma2: The covariance matrix over activations, precalculated on an + representative dataset set. + Returns: + -- : The Frechet Distance. + """ + + mu1 = np.atleast_1d(mu1) + mu2 = np.atleast_1d(mu2) + + sigma1 = np.atleast_2d(sigma1) + sigma2 = np.atleast_2d(sigma2) + + assert mu1.shape == mu2.shape, \ + 'Training and test mean vectors have different lengths' + assert sigma1.shape == sigma2.shape, \ + 'Training and test covariances have different dimensions' + + diff = mu1 - mu2 + + # Product might be almost singular + covmean, _ = linalg.sqrtm(sigma1.dot(sigma2), disp=False) + if not np.isfinite(covmean).all(): + msg = ('fid calculation produces singular product; ' + 'adding %s to diagonal of cov estimates') % eps + print(msg) + offset = np.eye(sigma1.shape[0]) * eps + covmean = linalg.sqrtm((sigma1 + offset).dot(sigma2 + offset)) + + # Numerical error might give slight imaginary component + if np.iscomplexobj(covmean): + if not np.allclose(np.diagonal(covmean).imag, 0, atol=1e-3): + m = np.max(np.abs(covmean.imag)) + raise ValueError('Imaginary component {}'.format(m)) + covmean = covmean.real + + tr_covmean = np.trace(covmean) + + return (diff.dot(diff) + np.trace(sigma1) + + np.trace(sigma2) - 2 * tr_covmean) \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/utils/paramUtil.py b/src/mdm/data_loaders/humanml/utils/paramUtil.py new file mode 100644 index 0000000000000000000000000000000000000000..a9f1708b85ca80a9051cb3675cec9b999a0d0e2b --- /dev/null +++ b/src/mdm/data_loaders/humanml/utils/paramUtil.py @@ -0,0 +1,63 @@ +import numpy as np + +# Define a kinematic tree for the skeletal struture +kit_kinematic_chain = [[0, 11, 12, 13, 14, 15], [0, 16, 17, 18, 19, 20], [0, 1, 2, 3, 4], [3, 5, 6, 7], [3, 8, 9, 10]] + +kit_raw_offsets = np.array( + [ + [0, 0, 0], + [0, 1, 0], + [0, 1, 0], + [0, 1, 0], + [0, 1, 0], + [1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [-1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [0, 0, 1], + [0, 0, 1], + [-1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [0, 0, 1], + [0, 0, 1] + ] +) + +t2m_raw_offsets = np.array([[0,0,0], + [1,0,0], + [-1,0,0], + [0,1,0], + [0,-1,0], + [0,-1,0], + [0,1,0], + [0,-1,0], + [0,-1,0], + [0,1,0], + [0,0,1], + [0,0,1], + [0,1,0], + [1,0,0], + [-1,0,0], + [0,0,1], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0]]) + +t2m_kinematic_chain = [[0, 2, 5, 8, 11], [0, 1, 4, 7, 10], [0, 3, 6, 9, 12, 15], [9, 14, 17, 19, 21], [9, 13, 16, 18, 20]] +t2m_left_hand_chain = [[20, 22, 23, 24], [20, 34, 35, 36], [20, 25, 26, 27], [20, 31, 32, 33], [20, 28, 29, 30]] +t2m_right_hand_chain = [[21, 43, 44, 45], [21, 46, 47, 48], [21, 40, 41, 42], [21, 37, 38, 39], [21, 49, 50, 51]] + + +kit_tgt_skel_id = '03950' + +t2m_tgt_skel_id = '000021' + diff --git a/src/mdm/data_loaders/humanml/utils/plot_script.py b/src/mdm/data_loaders/humanml/utils/plot_script.py new file mode 100644 index 0000000000000000000000000000000000000000..91e4c02b487f4a5d17a80a11d199ee815ea7d53c --- /dev/null +++ b/src/mdm/data_loaders/humanml/utils/plot_script.py @@ -0,0 +1,148 @@ +import math +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.animation import FuncAnimation, FFMpegFileWriter +from mpl_toolkits.mplot3d.art3d import Poly3DCollection +import mpl_toolkits.mplot3d.axes3d as p3 +# import cv2 +from textwrap import wrap +from moviepy.editor import VideoClip +from moviepy.video.io.bindings import mplfig_to_npimage + +def list_cut_average(ll, intervals): + if intervals == 1: + return ll + + bins = math.ceil(len(ll) * 1.0 / intervals) + ll_new = [] + for i in range(bins): + l_low = intervals * i + l_high = l_low + intervals + l_high = l_high if l_high < len(ll) else len(ll) + ll_new.append(np.mean(ll[l_low:l_high])) + return ll_new + + +def plot_3d_motion(save_path, kinematic_tree, joints, title, dataset, figsize=(3, 3), fps=120, radius=3, + vis_mode='default', gt_frames=[]): + matplotlib.use('Agg') + + title_per_frame = type(title) == list + if title_per_frame: + assert len(title) == len(joints), 'Title length should match the number of frames' + title = ['\n'.join(wrap(s, 20)) for s in title] + else: + title = '\n'.join(wrap(title, 20)) + + def init(): + ax.set_xlim3d([-radius / 2, radius / 2]) + ax.set_ylim3d([0, radius]) + ax.set_zlim3d([-radius / 3., radius * 2 / 3.]) + # print(title) + # fig.suptitle(title, fontsize=10) # Using dynamic title instead + ax.grid(b=False) + + def plot_xzPlane(minx, maxx, miny, minz, maxz): + ## Plot a plane XZ + verts = [ + [minx, miny, minz], + [minx, miny, maxz], + [maxx, miny, maxz], + [maxx, miny, minz] + ] + xz_plane = Poly3DCollection([verts]) + xz_plane.set_facecolor((0.5, 0.5, 0.5, 0.5)) + ax.add_collection3d(xz_plane) + + # return ax + + # (seq_len, joints_num, 3) + data = joints.copy().reshape(len(joints), -1, 3) + + # preparation related to specific datasets + if dataset == 'kit': + data *= 0.003 # scale for visualization + elif dataset == 'humanml': + data *= 1.3 # scale for visualization + elif dataset in ['humanact12', 'uestc']: + data *= -1.5 # reverse axes, scale for visualization + + fig = plt.figure(figsize=figsize) + plt.tight_layout() + ax = p3.Axes3D(fig) + init() + MINS = data.min(axis=0).min(axis=0) + MAXS = data.max(axis=0).max(axis=0) + colors_blue = ["#4D84AA", "#5B9965", "#61CEB9", "#34C1E2", "#80B79A"] # GT color + colors_orange = ["#DD5A37", "#D69E00", "#B75A39", "#FF6D00", "#DDB50E"] # Generation color + colors = colors_orange + if vis_mode == 'upper_body': # lower body taken fixed to input motion + colors[0] = colors_blue[0] + colors[1] = colors_blue[1] + elif vis_mode == 'gt': + colors = colors_blue + + n_frames = data.shape[0] + # print(dataset.shape) + + height_offset = MINS[1] + data[:, :, 1] -= height_offset + trajec = data[:, 0, [0, 2]] # memorize original x,z pelvis values + + # locate x,z pelvis values of ** each frame ** at zero + data[..., 0] -= data[:, 0:1, 0] + data[..., 2] -= data[:, 0:1, 2] + + # print(trajec.shape) + + def update(index): + # sometimes index is equal to n_frames/fps due to floating point issues. in such case, we duplicate the last frame + index = min(n_frames-1, int(index*fps)) + ax.clear() + ax.view_init(elev=120, azim=-90) + ax.dist = 7.5 + + # Dynamic title + if title_per_frame: + _title = title[index] + else: + _title = title + _title += f' [{index}]' + fig.suptitle(_title, fontsize=10) + + plot_xzPlane(MINS[0] - trajec[index, 0], MAXS[0] - trajec[index, 0], 0, MINS[2] - trajec[index, 1], + MAXS[2] - trajec[index, 1]) + + used_colors = colors_blue if index in gt_frames else colors + for i, (chain, color) in enumerate(zip(kinematic_tree, used_colors)): + if i < 5: + linewidth = 4.0 + else: + linewidth = 2.0 + ax.plot3D(data[index, chain, 0], data[index, chain, 1], data[index, chain, 2], linewidth=linewidth, + color=color) + # print(trajec[:index, 0].shape) + + plt.axis('off') + ax.set_axis_off() + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_zticklabels([]) + + # Hide grid lines + ax.grid(False) + + # Hide axes ticks + ax.set_xticks([]) + ax.set_yticks([]) + ax.set_zticks([]) + + + return mplfig_to_npimage(fig) + + ani = VideoClip(update) + + plt.close() + return ani \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml/utils/utils.py b/src/mdm/data_loaders/humanml/utils/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..34ae37ea45b27355546140306e1079d2031a838e --- /dev/null +++ b/src/mdm/data_loaders/humanml/utils/utils.py @@ -0,0 +1,167 @@ +import os +import numpy as np +# import cv2 +from PIL import Image +from data_loaders.humanml.utils import paramUtil +import math +import time +import matplotlib.pyplot as plt +from scipy.ndimage import gaussian_filter + + +def mkdir(path): + if not os.path.exists(path): + os.makedirs(path) + +COLORS = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0], + [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255], + [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] + +MISSING_VALUE = -1 + +def save_image(image_numpy, image_path): + img_pil = Image.fromarray(image_numpy) + img_pil.save(image_path) + + +def save_logfile(log_loss, save_path): + with open(save_path, 'wt') as f: + for k, v in log_loss.items(): + w_line = k + for digit in v: + w_line += ' %.3f' % digit + f.write(w_line + '\n') + + +def print_current_loss(start_time, niter_state, losses, epoch=None, sub_epoch=None, + inner_iter=None, tf_ratio=None, sl_steps=None): + + def as_minutes(s): + m = math.floor(s / 60) + s -= m * 60 + return '%dm %ds' % (m, s) + + def time_since(since, percent): + now = time.time() + s = now - since + es = s / percent + rs = es - s + return '%s (- %s)' % (as_minutes(s), as_minutes(rs)) + + if epoch is not None: + print('epoch: %3d niter: %6d sub_epoch: %2d inner_iter: %4d' % (epoch, niter_state, sub_epoch, inner_iter), end=" ") + + # message = '%s niter: %d completed: %3d%%)' % (time_since(start_time, niter_state / total_niters), + # niter_state, niter_state / total_niters * 100) + now = time.time() + message = '%s'%(as_minutes(now - start_time)) + + for k, v in losses.items(): + message += ' %s: %.4f ' % (k, v) + message += ' sl_length:%2d tf_ratio:%.2f'%(sl_steps, tf_ratio) + print(message) + +def print_current_loss_decomp(start_time, niter_state, total_niters, losses, epoch=None, inner_iter=None): + + def as_minutes(s): + m = math.floor(s / 60) + s -= m * 60 + return '%dm %ds' % (m, s) + + def time_since(since, percent): + now = time.time() + s = now - since + es = s / percent + rs = es - s + return '%s (- %s)' % (as_minutes(s), as_minutes(rs)) + + print('epoch: %03d inner_iter: %5d' % (epoch, inner_iter), end=" ") + # now = time.time() + message = '%s niter: %07d completed: %3d%%)'%(time_since(start_time, niter_state / total_niters), niter_state, niter_state / total_niters * 100) + for k, v in losses.items(): + message += ' %s: %.4f ' % (k, v) + print(message) + + +def compose_gif_img_list(img_list, fp_out, duration): + img, *imgs = [Image.fromarray(np.array(image)) for image in img_list] + img.save(fp=fp_out, format='GIF', append_images=imgs, optimize=False, + save_all=True, loop=0, duration=duration) + + +def save_images(visuals, image_path): + if not os.path.exists(image_path): + os.makedirs(image_path) + + for i, (label, img_numpy) in enumerate(visuals.items()): + img_name = '%d_%s.jpg' % (i, label) + save_path = os.path.join(image_path, img_name) + save_image(img_numpy, save_path) + + +def save_images_test(visuals, image_path, from_name, to_name): + if not os.path.exists(image_path): + os.makedirs(image_path) + + for i, (label, img_numpy) in enumerate(visuals.items()): + img_name = "%s_%s_%s" % (from_name, to_name, label) + save_path = os.path.join(image_path, img_name) + save_image(img_numpy, save_path) + + +def compose_and_save_img(img_list, save_dir, img_name, col=4, row=1, img_size=(256, 200)): + # print(col, row) + compose_img = compose_image(img_list, col, row, img_size) + if not os.path.exists(save_dir): + os.makedirs(save_dir) + img_path = os.path.join(save_dir, img_name) + # print(img_path) + compose_img.save(img_path) + + +def compose_image(img_list, col, row, img_size): + to_image = Image.new('RGB', (col * img_size[0], row * img_size[1])) + for y in range(0, row): + for x in range(0, col): + from_img = Image.fromarray(img_list[y * col + x]) + # print((x * img_size[0], y*img_size[1], + # (x + 1) * img_size[0], (y + 1) * img_size[1])) + paste_area = (x * img_size[0], y*img_size[1], + (x + 1) * img_size[0], (y + 1) * img_size[1]) + to_image.paste(from_img, paste_area) + # to_image[y*img_size[1]:(y + 1) * img_size[1], x * img_size[0] :(x + 1) * img_size[0]] = from_img + return to_image + + +def plot_loss_curve(losses, save_path, intervals=500): + plt.figure(figsize=(10, 5)) + plt.title("Loss During Training") + for key in losses.keys(): + plt.plot(list_cut_average(losses[key], intervals), label=key) + plt.xlabel("Iterations/" + str(intervals)) + plt.ylabel("Loss") + plt.legend() + plt.savefig(save_path) + plt.show() + + +def list_cut_average(ll, intervals): + if intervals == 1: + return ll + + bins = math.ceil(len(ll) * 1.0 / intervals) + ll_new = [] + for i in range(bins): + l_low = intervals * i + l_high = l_low + intervals + l_high = l_high if l_high < len(ll) else len(ll) + ll_new.append(np.mean(ll[l_low:l_high])) + return ll_new + + +def motion_temporal_filter(motion, sigma=1): + motion = motion.reshape(motion.shape[0], -1) + for i in range(motion.shape[1]): + motion[:, i] = gaussian_filter(motion[:, i], sigma=sigma, mode="nearest") + return motion.reshape(motion.shape[0], -1, 3) + diff --git a/src/mdm/data_loaders/humanml/utils/word_vectorizer.py b/src/mdm/data_loaders/humanml/utils/word_vectorizer.py new file mode 100644 index 0000000000000000000000000000000000000000..68c5956ff39f840d03c9a352e65291d26e2dfbd4 --- /dev/null +++ b/src/mdm/data_loaders/humanml/utils/word_vectorizer.py @@ -0,0 +1,80 @@ +import numpy as np +import pickle +from os.path import join as pjoin + +POS_enumerator = { + 'VERB': 0, + 'NOUN': 1, + 'DET': 2, + 'ADP': 3, + 'NUM': 4, + 'AUX': 5, + 'PRON': 6, + 'ADJ': 7, + 'ADV': 8, + 'Loc_VIP': 9, + 'Body_VIP': 10, + 'Obj_VIP': 11, + 'Act_VIP': 12, + 'Desc_VIP': 13, + 'OTHER': 14, +} + +Loc_list = ('left', 'right', 'clockwise', 'counterclockwise', 'anticlockwise', 'forward', 'back', 'backward', + 'up', 'down', 'straight', 'curve') + +Body_list = ('arm', 'chin', 'foot', 'feet', 'face', 'hand', 'mouth', 'leg', 'waist', 'eye', 'knee', 'shoulder', 'thigh') + +Obj_List = ('stair', 'dumbbell', 'chair', 'window', 'floor', 'car', 'ball', 'handrail', 'baseball', 'basketball') + +Act_list = ('walk', 'run', 'swing', 'pick', 'bring', 'kick', 'put', 'squat', 'throw', 'hop', 'dance', 'jump', 'turn', + 'stumble', 'dance', 'stop', 'sit', 'lift', 'lower', 'raise', 'wash', 'stand', 'kneel', 'stroll', + 'rub', 'bend', 'balance', 'flap', 'jog', 'shuffle', 'lean', 'rotate', 'spin', 'spread', 'climb') + +Desc_list = ('slowly', 'carefully', 'fast', 'careful', 'slow', 'quickly', 'happy', 'angry', 'sad', 'happily', + 'angrily', 'sadly') + +VIP_dict = { + 'Loc_VIP': Loc_list, + 'Body_VIP': Body_list, + 'Obj_VIP': Obj_List, + 'Act_VIP': Act_list, + 'Desc_VIP': Desc_list, +} + + +class WordVectorizer(object): + def __init__(self, meta_root, prefix): + vectors = np.load(pjoin(meta_root, '%s_data.npy'%prefix)) + words = pickle.load(open(pjoin(meta_root, '%s_words.pkl'%prefix), 'rb')) + word2idx = pickle.load(open(pjoin(meta_root, '%s_idx.pkl'%prefix), 'rb')) + self.word2vec = {w: vectors[word2idx[w]] for w in words} + + def _get_pos_ohot(self, pos): + pos_vec = np.zeros(len(POS_enumerator)) + if pos in POS_enumerator: + pos_vec[POS_enumerator[pos]] = 1 + else: + pos_vec[POS_enumerator['OTHER']] = 1 + return pos_vec + + def __len__(self): + return len(self.word2vec) + + def __getitem__(self, item): + word, pos = item.split('/') + if word in self.word2vec: + word_vec = self.word2vec[word] + vip_pos = None + for key, values in VIP_dict.items(): + if word in values: + vip_pos = key + break + if vip_pos is not None: + pos_vec = self._get_pos_ohot(vip_pos) + else: + pos_vec = self._get_pos_ohot(pos) + else: + word_vec = self.word2vec['unk'] + pos_vec = self._get_pos_ohot('OTHER') + return word_vec, pos_vec \ No newline at end of file diff --git a/src/mdm/data_loaders/humanml_utils.py b/src/mdm/data_loaders/humanml_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..34d92297790e6ea19dc367dbd53965b58aef5e57 --- /dev/null +++ b/src/mdm/data_loaders/humanml_utils.py @@ -0,0 +1,60 @@ +import numpy as np + +HML_JOINT_NAMES = [ + 'pelvis', + 'left_hip', + 'right_hip', + 'spine1', + 'left_knee', + 'right_knee', + 'spine2', + 'left_ankle', + 'right_ankle', + 'spine3', + 'left_foot', + 'right_foot', + 'neck', + 'left_collar', + 'right_collar', + 'head', + 'left_shoulder', + 'right_shoulder', + 'left_elbow', + 'right_elbow', + 'left_wrist', + 'right_wrist', +] + +NUM_HML_JOINTS = len(HML_JOINT_NAMES) # 22 SMPLH body joints + +HML_EE_JOINT_NAMES = ['left_foot', 'right_foot', 'left_wrist', 'right_wrist', 'head'] +HML_LOWER_BODY_JOINTS = [HML_JOINT_NAMES.index(name) for name in ['pelvis', 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle', 'left_foot', 'right_foot',]] +SMPL_UPPER_BODY_JOINTS = [i for i in range(len(HML_JOINT_NAMES)) if i not in HML_LOWER_BODY_JOINTS] + + +# Recover global angle and positions for rotation data +# root_rot_velocity (B, seq_len, 1) +# root_linear_velocity (B, seq_len, 2) +# root_y (B, seq_len, 1) +# ric_data (B, seq_len, (joint_num - 1)*3) +# rot_data (B, seq_len, (joint_num - 1)*6) +# local_velocity (B, seq_len, joint_num*3) +# foot contact (B, seq_len, 4) +HML_ROOT_BINARY = np.array([True] + [False] * (NUM_HML_JOINTS-1)) +HML_ROOT_MASK = np.concatenate(([True]*(1+2+1), + HML_ROOT_BINARY[1:].repeat(3), + HML_ROOT_BINARY[1:].repeat(6), + HML_ROOT_BINARY.repeat(3), + [False] * 4)) +HML_ROOT_HORIZONTAL_MASK = np.concatenate(([True]*(1+2) + [False], + np.zeros_like(HML_ROOT_BINARY[1:].repeat(3)), + np.zeros_like(HML_ROOT_BINARY[1:].repeat(6)), + np.zeros_like(HML_ROOT_BINARY.repeat(3)), + [False] * 4)) +HML_LOWER_BODY_JOINTS_BINARY = np.array([i in HML_LOWER_BODY_JOINTS for i in range(NUM_HML_JOINTS)]) +HML_LOWER_BODY_MASK = np.concatenate(([True]*(1+2+1), + HML_LOWER_BODY_JOINTS_BINARY[1:].repeat(3), + HML_LOWER_BODY_JOINTS_BINARY[1:].repeat(6), + HML_LOWER_BODY_JOINTS_BINARY.repeat(3), + [True]*4)) +HML_UPPER_BODY_MASK = ~HML_LOWER_BODY_MASK \ No newline at end of file diff --git a/src/mdm/data_loaders/preprocessed_posterior_loader.py b/src/mdm/data_loaders/preprocessed_posterior_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..4a5af9bd44c6c6f66643b341106d4a43a519889d --- /dev/null +++ b/src/mdm/data_loaders/preprocessed_posterior_loader.py @@ -0,0 +1,350 @@ +""" +DataLoader for loading data from preprocessed posterior files. +Adapted to this repository's training flow and compatible with train_mdm.py. +Based on the external preprocessed_posterior_loader.py. + +The output format matches the original t2m_collate and can be used directly by existing training code. +""" + +import os +import torch +import numpy as np +from torch.utils.data import Dataset, DataLoader +from pathlib import Path +from os.path import join as pjoin +from data_loaders.tensors import collate as mdm_collate + + +class PreprocessedPosteriorDataset(Dataset): + """ + Dataset for loading data from preprocessed posterior files. + Adapts the data format to the MDM training flow. + + The output format matches datasets such as HumanML3D and can use the existing collate function directly. + """ + def __init__(self, posterior_dir, max_samples=None, resample=False, + mean=None, std=None): + """ + Args: + posterior_dir: directory containing preprocessed posterior files + max_samples: maximum number of samples; None loads all samples + resample: whether to resample the latent while loading; False uses the preprocessed sample + mean: mean used for normalization (optional, for compatibility) + std: standard deviation used for normalization (optional, for compatibility) + """ + self.posterior_dir = posterior_dir + self.resample = resample + + # Scan the directory and collect posterior file paths, excluding meta_info.pt and preprocess_config.pt. + all_files = os.listdir(posterior_dir) + posterior_files = sorted([ + f for f in all_files + if f.endswith('.pt') and f not in ['meta_info.pt', 'preprocess_config.pt'] + ]) + + # Save the file path list. + self.file_paths = [pjoin(posterior_dir, f) for f in posterior_files] + self.total_samples = len(self.file_paths) + + print(f"Scanned directory: found {self.total_samples} posterior files") + print(f"Scanned directory: found {self.total_samples} posterior files") + + # Limit the number of samples. + if max_samples is not None: + self.total_samples = min(self.total_samples, max_samples) + self.file_paths = self.file_paths[:max_samples] + print(f"Limited to the first {self.total_samples} samples") + + # Try to load metadata if available. + meta_path = pjoin(posterior_dir, 'meta_info.pt') + if os.path.exists(meta_path): + meta_info = torch.load(meta_path) + self.config = meta_info.get('config', {}) + print("Loaded metadata configuration") + else: + self.config = {} + + # Store mean and std for compatibility with dataset interfaces such as HumanML3D. + self.mean = mean + self.std = std + + print(f"PreprocessedPosteriorDataset initialized with {self.total_samples} samples") + if self.resample: + print("Resampling mode enabled: resampling latent from posterior on each load") + + def sample_from_posterior(self, mean, logvar): + """ + Sample from the posterior distribution. + Uses the reparameterization trick: z = mean + std * eps. + + Args: + mean: posterior mean + logvar: posterior log variance + + Returns: + sampled latent + """ + std = torch.exp(0.5 * logvar) + eps = torch.randn_like(std) + return mean + eps * std + + def inv_transform(self, data): + """Inverse transform for compatibility.""" + if self.mean is not None and self.std is not None: + return data * self.std + self.mean + return data + + def __len__(self): + return self.total_samples + + def __getitem__(self, idx): + """ + Load posterior data for sample idx. + + Returns: + dict: matches the format expected by the original t2m_collate and contains: + - inp: motion data with shape (C, 1, T) + - text: text description (string) + - tokens: token list if available + - lengths: motion length (integer) + """ + posterior_path = self.file_paths[idx] + + if not os.path.exists(posterior_path): + raise FileNotFoundError(f"Posterior file not found: {posterior_path}") + + posterior_data = torch.load(posterior_path) + + # Get data. + text_info = posterior_data['text'] + m_len = posterior_data['m_len'] + + # If resampling is enabled, resample from mean and logvar. + if self.resample: + mean = posterior_data['mean'] # (T, C) + logvar = posterior_data['logvar'] # (T, C) + sample = self.sample_from_posterior(mean, logvar) + else: + if 'sample' in posterior_data: + sample = posterior_data['sample'] # (T, C) + elif 'z' in posterior_data: + sample = posterior_data['z'] # (T, C) + else: + raise KeyError(f"Posterior file is missing the 'sample' or 'z' key: {posterior_path}") + + # Convert to the format expected by MDM: (T, C) -> (C, 1, T). + # Align with the conversion in t2m_collate: torch.tensor(b[4].T).float().unsqueeze(1). + inp = sample.T.unsqueeze(1).float() # (C, 1, T) + + # Handle length. + if isinstance(m_len, (int, np.integer)): + length = int(m_len) + elif hasattr(m_len, 'item'): + length = int(m_len.item()) + else: + length = int(m_len) + + # Handle text information across multiple formats. + # text_info may be a string, dict, or another format. + if isinstance(text_info, dict): + text = text_info.get('caption', str(text_info)) + tokens = text_info.get('tokens', None) + elif isinstance(text_info, str): + text = text_info + tokens = None + else: + text = str(text_info) + tokens = None + + # Build the return dictionary to match the format expected by t2m_collate. + result = { + 'inp': inp, + 'text': text, + 'lengths': length, + } + + # Add tokens if available. + if tokens is not None: + result['tokens'] = tokens + + return result + + +def collate_preprocessed_posterior(batch): + """ + Use the original collate function directly to keep the output format identical. + + Args: + batch: list of dicts, each containing inp, text, lengths, etc. + + Returns: + motion: (B, C, 1, T_max) tensor + cond: dict containing a 'y' key with mask, lengths, text, etc. + + Output format exactly matches t2m_collate: + - motion: (B, C, 1, T_max) + - cond['y']['mask']: (B, 1, 1, T_max) + - cond['y']['lengths']: (B,) + - cond['y']['text']: list of str + """ + # Use the original collate function directly. + return mdm_collate(batch) + + +class PreprocessedPosteriorDataLoader: + """ + DataLoader wrapper for preprocessed posterior data. + Provides an interface compatible with existing data loaders. + + This class emulates the original DataLoader interface, including dataset attribute access. + """ + def __init__(self, posterior_dir, batch_size=32, shuffle=True, + num_workers=4, max_samples=None, resample=False, + mean=None, std=None, drop_last=True): + """ + Create a DataLoader for preprocessed posterior data. + + Args: + posterior_dir: directory containing preprocessed posterior files + batch_size: batch size + shuffle: whether to shuffle + num_workers: number of data loading workers + max_samples: maximum number of samples + resample: whether to resample the latent while loading + mean: mean used for normalization + std: standard deviation used for normalization + drop_last: whether to drop the last incomplete batch + """ + self.dataset = PreprocessedPosteriorDataset( + posterior_dir, + max_samples=max_samples, + resample=resample, + mean=mean, + std=std + ) + + self.dataloader = DataLoader( + self.dataset, + batch_size=batch_size, + shuffle=shuffle, + num_workers=num_workers, + collate_fn=collate_preprocessed_posterior, + pin_memory=True, + drop_last=drop_last, + ) + + # Store attributes for external access and training_loop.py compatibility. + self.batch_size = batch_size + # These attributes are used for compatibility with target_cond_modifier in training_loop. + # preprocessed_posterior may not need these, but keep the interface. + self.mean = mean + self.std = std + + def __iter__(self): + return iter(self.dataloader) + + def __len__(self): + return len(self.dataloader) + + +def get_preprocessed_posterior_loader(posterior_dir, batch_size=32, shuffle=True, + num_workers=4, max_samples=None, resample=False, + mean=None, std=None, drop_last=True): + """ + Convenience function for creating a DataLoader for preprocessed posterior data. + + Args: + posterior_dir: directory containing preprocessed posterior files + batch_size: batch size + shuffle: whether to shuffle + num_workers: number of data loading workers + max_samples: maximum number of samples + resample: whether to resample the latent while loading + mean: mean used for normalization + std: standard deviation used for normalization + drop_last: whether to drop the last incomplete batch + + Returns: + PreprocessedPosteriorDataLoader object + """ + return PreprocessedPosteriorDataLoader( + posterior_dir=posterior_dir, + batch_size=batch_size, + shuffle=shuffle, + num_workers=num_workers, + max_samples=max_samples, + resample=resample, + mean=mean, + std=std, + drop_last=drop_last + ) + + + +# Test code +if __name__ == '__main__': + import argparse + + parser = argparse.ArgumentParser(description='Test the preprocessed posterior data loader (MDM-compatible version)') + parser.add_argument('--posterior_dir', type=str, required=True, + help='Directory containing preprocessed posterior files') + parser.add_argument('--batch_size', type=int, default=4, + help='Batch size') + parser.add_argument('--max_samples', type=int, default=None, + help='Maximum number of samples for testing') + parser.add_argument('--resample', action='store_true', + help='Enable resampling mode') + args = parser.parse_args() + + print("="*50) + print("Testing preprocessed posterior data loader (MDM-compatible version)") + print("="*50) + + # Create dataloader. + dataloader = get_preprocessed_posterior_loader( + args.posterior_dir, + batch_size=args.batch_size, + shuffle=False, + num_workers=0, # Use a single process for testing. + max_samples=args.max_samples, + resample=args.resample + ) + + print(f"\nDataLoader created with {len(dataloader)} batches") + print(f"Resampling mode: {'enabled' if args.resample else 'disabled'}") + + # Test loading the first batch. + print("\nTesting first batch load...") + for batch_idx, (motion, cond) in enumerate(dataloader): + print(f"\nBatch {batch_idx}:") + print(f" motion shape: {motion.shape}") # Expected: (B, C, 1, T_max) + print(f" mask shape: {cond['y']['mask'].shape}") # Expected: (B, 1, 1, T_max) + print(f" lengths: {cond['y']['lengths']}") + print(f" texts: {len(cond['y']['text'])} text entries") + + # Only test the first batch. + if batch_idx == 0: + print("\nText information for the first sample:") + print(f" {cond['y']['text'][0]}") + + # Show motion statistics. + print("\nMotion statistics for the first sample:") + first_len = cond['y']['lengths'][0].item() + first_motion_valid = motion[0, :, :, :first_len] # Only inspect the valid part. + print(f" valid length: {first_len}") + print(f" mean: {first_motion_valid.mean().item():.6f}") + print(f" std: {first_motion_valid.std().item():.6f}") + print(f" min: {first_motion_valid.min().item():.6f}") + print(f" max: {first_motion_valid.max().item():.6f}") + + break + + print("\nTest completed!") + print("\nUsage example:") + print(" from data_loaders.preprocessed_posterior_loader import get_preprocessed_posterior_loader") + print(" data = get_preprocessed_posterior_loader(posterior_dir, batch_size=32)") + print(" for motion, cond in data:") + print(" # motion: (B, C, 1, T)") + print(" # cond['y']['mask']: (B, 1, 1, T)") + print(" # cond['y']['lengths']: (B,)") + print(" # cond['y']['text']: list of texts") diff --git a/src/mdm/data_loaders/tensors.py b/src/mdm/data_loaders/tensors.py new file mode 100644 index 0000000000000000000000000000000000000000..7fbfbcec31faeecc8ef1463eeb8dd89982f633de --- /dev/null +++ b/src/mdm/data_loaders/tensors.py @@ -0,0 +1,94 @@ +import torch + +def lengths_to_mask(lengths, max_len): + # max_len = max(lengths) + mask = torch.arange(max_len, device=lengths.device).expand(len(lengths), max_len) < lengths.unsqueeze(1) + return mask + + +def collate_tensors(batch): + dims = batch[0].dim() + max_size = [max([b.size(i) for b in batch]) for i in range(dims)] + size = (len(batch),) + tuple(max_size) + canvas = batch[0].new_zeros(size=size) + for i, b in enumerate(batch): + sub_tensor = canvas[i] + for d in range(dims): + sub_tensor = sub_tensor.narrow(d, 0, b.size(d)) + sub_tensor.add_(b) + return canvas + + +def collate(batch): + notnone_batches = [b for b in batch if b is not None] + databatch = [b['inp'] for b in notnone_batches] + if 'lengths' in notnone_batches[0]: + lenbatch = [b['lengths'] for b in notnone_batches] + else: + lenbatch = [len(b['inp'][0][0]) for b in notnone_batches] + + + databatchTensor = collate_tensors(databatch) + lenbatchTensor = torch.as_tensor(lenbatch) + maskbatchTensor = lengths_to_mask(lenbatchTensor, databatchTensor.shape[-1]).unsqueeze(1).unsqueeze(1) # unqueeze for broadcasting + + motion = databatchTensor + cond = {'y': {'mask': maskbatchTensor, 'lengths': lenbatchTensor}} + + if 'text' in notnone_batches[0]: + textbatch = [b['text'] for b in notnone_batches] + cond['y'].update({'text': textbatch}) + + if 'tokens' in notnone_batches[0]: + textbatch = [b['tokens'] for b in notnone_batches] + cond['y'].update({'tokens': textbatch}) + + if 'action' in notnone_batches[0]: + actionbatch = [b['action'] for b in notnone_batches] + cond['y'].update({'action': torch.as_tensor(actionbatch).unsqueeze(1)}) + + # collate action textual names + if 'action_text' in notnone_batches[0]: + action_text = [b['action_text']for b in notnone_batches] + cond['y'].update({'action_text': action_text}) + + if 'prefix' in notnone_batches[0]: + cond['y'].update({'prefix': collate_tensors([b['prefix'] for b in notnone_batches])}) + + if 'orig_lengths' in notnone_batches[0]: + cond['y'].update({'orig_lengths': torch.as_tensor([b['orig_lengths'] for b in notnone_batches])}) + + if 'key' in notnone_batches[0]: + cond['y'].update({'db_key': [b['key'] for b in notnone_batches]}) + + return motion, cond + +# an adapter to our collate func +def t2m_collate(batch, target_batch_size): + repeat_factor = -(-target_batch_size // len(batch)) # Ceiling division + repeated_batch = batch * repeat_factor + full_batch = repeated_batch[:target_batch_size] # Truncate to the target batch size + # batch.sort(key=lambda x: x[3], reverse=True) + adapted_batch = [{ + 'inp': torch.tensor(b[4].T).float().unsqueeze(1), # [seqlen, J] -> [J, 1, seqlen] + 'text': b[2], #b[0]['caption'] + 'tokens': b[6], + 'lengths': b[5], + 'key': b[7] if len(b) > 7 else None, + } for b in full_batch] + return collate(adapted_batch) + + +def t2m_prefix_collate(batch, pred_len): + # batch.sort(key=lambda x: x[3], reverse=True) + adapted_batch = [{ + 'inp': torch.tensor(b[4].T).float().unsqueeze(1)[..., -pred_len:], # [seqlen, J] -> [J, 1, seqlen] + 'prefix': torch.tensor(b[4].T).float().unsqueeze(1)[..., :-pred_len], + 'text': b[2], #b[0]['caption'] + 'tokens': b[6], + 'lengths': pred_len, # b[5], + 'orig_lengths': b[5][0], # For evaluation + 'key': b[7] if len(b) > 7 else None, + } for b in batch] + return collate(adapted_batch) + diff --git a/src/mdm/dataset/README.md b/src/mdm/dataset/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e51284f58429966777ca38b455822873dfa8b4fc --- /dev/null +++ b/src/mdm/dataset/README.md @@ -0,0 +1,6 @@ +## Data + +* Data dirs should be placed here. + +* The `opt` files are configurations for how to read the data according to [text-to-motion](https://github.com/EricGuo5513/text-to-motion). +* The `*_mean.npy` and `*_std.npy` files, are stats used for evaluation only, according to [text-to-motion](https://github.com/EricGuo5513/text-to-motion). \ No newline at end of file diff --git a/src/mdm/dataset/humanml_opt.txt b/src/mdm/dataset/humanml_opt.txt new file mode 100644 index 0000000000000000000000000000000000000000..718bce2887942d2237c8a561ec996792be329314 --- /dev/null +++ b/src/mdm/dataset/humanml_opt.txt @@ -0,0 +1,54 @@ +------------ Options ------------- +batch_size: 32 +checkpoints_dir: ./checkpoints +dataset_name: t2m +decomp_name: Decomp_SP001_SM001_H512 +dim_att_vec: 512 +dim_dec_hidden: 1024 +dim_movement2_dec_hidden: 512 +dim_movement_dec_hidden: 512 +dim_movement_enc_hidden: 512 +dim_movement_latent: 512 +dim_msd_hidden: 512 +dim_pos_hidden: 1024 +dim_pri_hidden: 1024 +dim_seq_de_hidden: 512 +dim_seq_en_hidden: 512 +dim_text_hidden: 512 +dim_z: 128 +early_stop_count: 3 +estimator_mod: bigru +eval_every_e: 5 +feat_bias: 5 +fixed_steps: 5 +gpu_id: 3 +input_z: False +is_continue: True +is_train: True +lambda_fake: 10 +lambda_gan_l: 0.1 +lambda_gan_mt: 0.1 +lambda_gan_mv: 0.1 +lambda_kld: 0.01 +lambda_rec: 1 +lambda_rec_init: 1 +lambda_rec_mot: 1 +lambda_rec_mov: 1 +log_every: 50 +lr: 0.0002 +max_sub_epoch: 50 +max_text_len: 20 +n_layers_dec: 1 +n_layers_msd: 2 +n_layers_pos: 1 +n_layers_pri: 1 +n_layers_seq_de: 2 +n_layers_seq_en: 1 +name: Comp_v6_KLD01 +num_experts: 4 +save_every_e: 10 +save_latest: 500 +text_enc_mod: bigru +tf_ratio: 0.4 +unit_length: 4 +-------------- End ---------------- diff --git a/src/mdm/dataset/kit_mean.npy b/src/mdm/dataset/kit_mean.npy new file mode 100644 index 0000000000000000000000000000000000000000..c1f076c473eaabf4e6c0144d3e6db8b6a3c7e976 --- /dev/null +++ b/src/mdm/dataset/kit_mean.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e23fac51db2215ab5666324226be48f27efd6a6e7b22ebd17c28e0f056a7c22 +size 2136 diff --git a/src/mdm/dataset/kit_opt.txt b/src/mdm/dataset/kit_opt.txt new file mode 100644 index 0000000000000000000000000000000000000000..805c8ecb40568f1d06c6b0b266d7bffc81d69b3c --- /dev/null +++ b/src/mdm/dataset/kit_opt.txt @@ -0,0 +1,54 @@ +------------ Options ------------- +batch_size: 32 +checkpoints_dir: ./checkpoints +dataset_name: kit +decomp_name: Decomp_SP001_SM001_H512 +dim_att_vec: 512 +dim_dec_hidden: 1024 +dim_movement2_dec_hidden: 512 +dim_movement_dec_hidden: 512 +dim_movement_enc_hidden: 512 +dim_movement_latent: 512 +dim_msd_hidden: 512 +dim_pos_hidden: 1024 +dim_pri_hidden: 1024 +dim_seq_de_hidden: 512 +dim_seq_en_hidden: 512 +dim_text_hidden: 512 +dim_z: 128 +early_stop_count: 3 +estimator_mod: bigru +eval_every_e: 5 +feat_bias: 5 +fixed_steps: 5 +gpu_id: 2 +input_z: False +is_continue: True +is_train: True +lambda_fake: 10 +lambda_gan_l: 0.1 +lambda_gan_mt: 0.1 +lambda_gan_mv: 0.1 +lambda_kld: 0.005 +lambda_rec: 1 +lambda_rec_init: 1 +lambda_rec_mot: 1 +lambda_rec_mov: 1 +log_every: 50 +lr: 0.0002 +max_sub_epoch: 50 +max_text_len: 20 +n_layers_dec: 1 +n_layers_msd: 2 +n_layers_pos: 1 +n_layers_pri: 1 +n_layers_seq_de: 2 +n_layers_seq_en: 1 +name: Comp_v6_KLD005 +num_experts: 4 +save_every_e: 10 +save_latest: 500 +text_enc_mod: bigru +tf_ratio: 0.4 +unit_length: 4 +-------------- End ---------------- diff --git a/src/mdm/dataset/kit_std.npy b/src/mdm/dataset/kit_std.npy new file mode 100644 index 0000000000000000000000000000000000000000..02a4c81095a331998ae0c95e3b01dc48c6d37b77 --- /dev/null +++ b/src/mdm/dataset/kit_std.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:296a60656cea07e65ee64512d73d47c0412df0698b35194116330661be32fa90 +size 2136 diff --git a/src/mdm/dataset/t2m_mean.npy b/src/mdm/dataset/t2m_mean.npy new file mode 100644 index 0000000000000000000000000000000000000000..6c57414d9cf6242bb4b4bab4c33df5e2cc9d2f91 --- /dev/null +++ b/src/mdm/dataset/t2m_mean.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bdb5ba69a3a9e34d71990db15bc535ebc024c8d95ddb5574196f96058faa7d3 +size 2232 diff --git a/src/mdm/dataset/t2m_std.npy b/src/mdm/dataset/t2m_std.npy new file mode 100644 index 0000000000000000000000000000000000000000..93c6b7ae4c2fa23dd21c10a27da1b6966168b35b --- /dev/null +++ b/src/mdm/dataset/t2m_std.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a5f7d60301c9465972fc225f8ad0ee8f957e7720431189123eb6d15873a9557 +size 2232 diff --git a/src/mdm/diffusion/fp16_util.py b/src/mdm/diffusion/fp16_util.py new file mode 100644 index 0000000000000000000000000000000000000000..1ccb93e4843b6257c3151b763356ef501f1acec8 --- /dev/null +++ b/src/mdm/diffusion/fp16_util.py @@ -0,0 +1,236 @@ +""" +Helpers to train with 16-bit precision. +""" + +import numpy as np +import torch as th +import torch.nn as nn +from torch._utils import _flatten_dense_tensors, _unflatten_dense_tensors + +from diffusion import logger + +INITIAL_LOG_LOSS_SCALE = 20.0 + + +def convert_module_to_f16(l): + """ + Convert primitive modules to float16. + """ + if isinstance(l, (nn.Conv1d, nn.Conv2d, nn.Conv3d)): + l.weight.data = l.weight.data.half() + if l.bias is not None: + l.bias.data = l.bias.data.half() + + +def convert_module_to_f32(l): + """ + Convert primitive modules to float32, undoing convert_module_to_f16(). + """ + if isinstance(l, (nn.Conv1d, nn.Conv2d, nn.Conv3d)): + l.weight.data = l.weight.data.float() + if l.bias is not None: + l.bias.data = l.bias.data.float() + + +def make_master_params(param_groups_and_shapes): + """ + Copy model parameters into a (differently-shaped) list of full-precision + parameters. + """ + master_params = [] + for param_group, shape in param_groups_and_shapes: + master_param = nn.Parameter( + _flatten_dense_tensors( + [param.detach().float() for (_, param) in param_group] + ).view(shape) + ) + master_param.requires_grad = True + master_params.append(master_param) + return master_params + + +def model_grads_to_master_grads(param_groups_and_shapes, master_params): + """ + Copy the gradients from the model parameters into the master parameters + from make_master_params(). + """ + for master_param, (param_group, shape) in zip( + master_params, param_groups_and_shapes + ): + master_param.grad = _flatten_dense_tensors( + [param_grad_or_zeros(param) for (_, param) in param_group] + ).view(shape) + + +def master_params_to_model_params(param_groups_and_shapes, master_params): + """ + Copy the master parameter data back into the model parameters. + """ + # Without copying to a list, if a generator is passed, this will + # silently not copy any parameters. + for master_param, (param_group, _) in zip(master_params, param_groups_and_shapes): + for (_, param), unflat_master_param in zip( + param_group, unflatten_master_params(param_group, master_param.view(-1)) + ): + param.detach().copy_(unflat_master_param) + + +def unflatten_master_params(param_group, master_param): + return _unflatten_dense_tensors(master_param, [param for (_, param) in param_group]) + + +def get_param_groups_and_shapes(named_model_params): + named_model_params = list(named_model_params) + scalar_vector_named_params = ( + [(n, p) for (n, p) in named_model_params if p.ndim <= 1], + (-1), + ) + matrix_named_params = ( + [(n, p) for (n, p) in named_model_params if p.ndim > 1], + (1, -1), + ) + return [scalar_vector_named_params, matrix_named_params] + + +def master_params_to_state_dict( + model, param_groups_and_shapes, master_params, use_fp16 +): + if use_fp16: + state_dict = model.state_dict() + for master_param, (param_group, _) in zip( + master_params, param_groups_and_shapes + ): + for (name, _), unflat_master_param in zip( + param_group, unflatten_master_params(param_group, master_param.view(-1)) + ): + assert name in state_dict + state_dict[name] = unflat_master_param + else: + state_dict = model.state_dict() + for i, (name, _value) in enumerate(model.named_parameters()): + assert name in state_dict + state_dict[name] = master_params[i] + return state_dict + + +def state_dict_to_master_params(model, state_dict, use_fp16): + if use_fp16: + named_model_params = [ + (name, state_dict[name]) for name, _ in model.named_parameters() + ] + param_groups_and_shapes = get_param_groups_and_shapes(named_model_params) + master_params = make_master_params(param_groups_and_shapes) + else: + master_params = [state_dict[name] for name, _ in model.named_parameters()] + return master_params + + +def zero_master_grads(master_params): + for param in master_params: + param.grad = None + + +def zero_grad(model_params): + for param in model_params: + # Taken from https://pytorch.org/docs/stable/_modules/torch/optim/optimizer.html#Optimizer.add_param_group + if param.grad is not None: + param.grad.detach_() + param.grad.zero_() + + +def param_grad_or_zeros(param): + if param.grad is not None: + return param.grad.data.detach() + else: + return th.zeros_like(param) + + +class MixedPrecisionTrainer: + def __init__( + self, + *, + model, + use_fp16=False, + fp16_scale_growth=1e-3, + initial_lg_loss_scale=INITIAL_LOG_LOSS_SCALE, + ): + self.model = model + self.use_fp16 = use_fp16 + self.fp16_scale_growth = fp16_scale_growth + + self.model_params = list(self.model.parameters()) + self.master_params = self.model_params + self.param_groups_and_shapes = None + self.lg_loss_scale = initial_lg_loss_scale + + if self.use_fp16: + self.param_groups_and_shapes = get_param_groups_and_shapes( + self.model.named_parameters() + ) + self.master_params = make_master_params(self.param_groups_and_shapes) + self.model.convert_to_fp16() + + def zero_grad(self): + zero_grad(self.model_params) + + def backward(self, loss: th.Tensor): + if self.use_fp16: + loss_scale = 2 ** self.lg_loss_scale + (loss * loss_scale).backward() + else: + loss.backward() + + def optimize(self, opt: th.optim.Optimizer): + if self.use_fp16: + return self._optimize_fp16(opt) + else: + return self._optimize_normal(opt) + + def _optimize_fp16(self, opt: th.optim.Optimizer): + logger.logkv_mean("lg_loss_scale", self.lg_loss_scale) + model_grads_to_master_grads(self.param_groups_and_shapes, self.master_params) + grad_norm, param_norm = self._compute_norms(grad_scale=2 ** self.lg_loss_scale) + if check_overflow(grad_norm): + self.lg_loss_scale -= 1 + logger.log(f"Found NaN, decreased lg_loss_scale to {self.lg_loss_scale}") + zero_master_grads(self.master_params) + return False + + logger.logkv_mean("grad_norm", grad_norm) + logger.logkv_mean("param_norm", param_norm) + + self.master_params[0].grad.mul_(1.0 / (2 ** self.lg_loss_scale)) + opt.step() + zero_master_grads(self.master_params) + master_params_to_model_params(self.param_groups_and_shapes, self.master_params) + self.lg_loss_scale += self.fp16_scale_growth + return True + + def _optimize_normal(self, opt: th.optim.Optimizer): + grad_norm, param_norm = self._compute_norms() + logger.logkv_mean("grad_norm", grad_norm) + logger.logkv_mean("param_norm", param_norm) + opt.step() + return True + + def _compute_norms(self, grad_scale=1.0): + grad_norm = 0.0 + param_norm = 0.0 + for p in self.master_params: + with th.no_grad(): + param_norm += th.norm(p, p=2, dtype=th.float32).item() ** 2 + if p.grad is not None: + grad_norm += th.norm(p.grad, p=2, dtype=th.float32).item() ** 2 + return np.sqrt(grad_norm) / grad_scale, np.sqrt(param_norm) + + def master_params_to_state_dict(self, master_params): + return master_params_to_state_dict( + self.model, self.param_groups_and_shapes, master_params, self.use_fp16 + ) + + def state_dict_to_master_params(self, state_dict): + return state_dict_to_master_params(self.model, state_dict, self.use_fp16) + + +def check_overflow(value): + return (value == float("inf")) or (value == -float("inf")) or (value != value) diff --git a/src/mdm/diffusion/gaussian_diffusion.py b/src/mdm/diffusion/gaussian_diffusion.py new file mode 100644 index 0000000000000000000000000000000000000000..3917a3207a64225cee911e4fe19decdd291bbcaa --- /dev/null +++ b/src/mdm/diffusion/gaussian_diffusion.py @@ -0,0 +1,1615 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +This code started out as a PyTorch port of Ho et al's diffusion models: +https://github.com/hojonathanho/diffusion/blob/1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/diffusion_utils_2.py + +Docstrings have been added, as well as DDIM sampling and a new collection of beta schedules. +""" + +import enum +import math + +import numpy as np +import torch +import torch as th +from copy import deepcopy +from diffusion.nn import mean_flat, sum_flat +from diffusion.losses import normal_kl, discretized_gaussian_log_likelihood +from data_loaders.humanml.scripts import motion_process +from utils.loss_util import masked_l2, masked_goal_l2 +from data_loaders.humanml.scripts.motion_process import get_target_location + +def get_named_beta_schedule(schedule_name, num_diffusion_timesteps, scale_betas=1.): + """ + Get a pre-defined beta schedule for the given name. + + The beta schedule library consists of beta schedules which remain similar + in the limit of num_diffusion_timesteps. + Beta schedules may be added, but should not be removed or changed once + they are committed to maintain backwards compatibility. + """ + if schedule_name == "linear": + # Linear schedule from Ho et al, extended to work for any number of + # diffusion steps. + scale = scale_betas * 1000 / num_diffusion_timesteps + beta_start = scale * 0.0001 + beta_end = scale * 0.02 + return np.linspace( + beta_start, beta_end, num_diffusion_timesteps, dtype=np.float64 + ) + elif schedule_name == "cosine": + return betas_for_alpha_bar( + num_diffusion_timesteps, + lambda t: math.cos((t + 0.008) / 1.008 * math.pi / 2) ** 2, + ) + else: + raise NotImplementedError(f"unknown beta schedule: {schedule_name}") + + +def betas_for_alpha_bar(num_diffusion_timesteps, alpha_bar, max_beta=0.999): + """ + Create a beta schedule that discretizes the given alpha_t_bar function, + which defines the cumulative product of (1-beta) over time from t = [0,1]. + + :param num_diffusion_timesteps: the number of betas to produce. + :param alpha_bar: a lambda that takes an argument t from 0 to 1 and + produces the cumulative product of (1-beta) up to that + part of the diffusion process. + :param max_beta: the maximum beta to use; use values lower than 1 to + prevent singularities. + """ + betas = [] + for i in range(num_diffusion_timesteps): + t1 = i / num_diffusion_timesteps + t2 = (i + 1) / num_diffusion_timesteps + betas.append(min(1 - alpha_bar(t2) / alpha_bar(t1), max_beta)) + return np.array(betas) + + +class ModelMeanType(enum.Enum): + """ + Which type of output the model predicts. + """ + + PREVIOUS_X = enum.auto() # the model predicts x_{t-1} + START_X = enum.auto() # the model predicts x_0 + EPSILON = enum.auto() # the model predicts epsilon + + +class ModelVarType(enum.Enum): + """ + What is used as the model's output variance. + + The LEARNED_RANGE option has been added to allow the model to predict + values between FIXED_SMALL and FIXED_LARGE, making its job easier. + """ + + LEARNED = enum.auto() + FIXED_SMALL = enum.auto() + FIXED_LARGE = enum.auto() + LEARNED_RANGE = enum.auto() + + +class LossType(enum.Enum): + MSE = enum.auto() # use raw MSE loss (and KL when learning variances) + RESCALED_MSE = ( + enum.auto() + ) # use raw MSE loss (with RESCALED_KL when learning variances) + KL = enum.auto() # use the variational lower-bound + RESCALED_KL = enum.auto() # like KL, but rescale to estimate the full VLB + + def is_vb(self): + return self == LossType.KL or self == LossType.RESCALED_KL + + +class GaussianDiffusion: + """ + Utilities for training and sampling diffusion models. + + Ported directly from here, and then adapted over time to further experimentation. + https://github.com/hojonathanho/diffusion/blob/1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/diffusion_utils_2.py#L42 + + :param betas: a 1-D numpy array of betas for each diffusion timestep, + starting at T and going to 1. + :param model_mean_type: a ModelMeanType determining what the model outputs. + :param model_var_type: a ModelVarType determining how variance is output. + :param loss_type: a LossType determining the loss function to use. + :param rescale_timesteps: if True, pass floating point timesteps into the + model so that they are always scaled like in the + original paper (0 to 1000). + """ + + def __init__( + self, + *, + betas, + model_mean_type, + model_var_type, + loss_type, + rescale_timesteps=False, + lambda_rcxyz=0., + lambda_vel=0., + lambda_pose=1., + lambda_orient=1., + lambda_loc=1., + data_rep='rot6d', + lambda_root_vel=0., + lambda_vel_rcxyz=0., + lambda_fc=0., + lambda_target_loc=0., + **kargs, + ): + self.model_mean_type = model_mean_type + self.model_var_type = model_var_type + self.loss_type = loss_type + self.rescale_timesteps = rescale_timesteps + self.data_rep = data_rep + + if data_rep != 'rot_vel' and lambda_pose != 1.: + raise ValueError('lambda_pose is relevant only when training on velocities!') + self.lambda_pose = lambda_pose + self.lambda_orient = lambda_orient + self.lambda_loc = lambda_loc + + self.lambda_rcxyz = lambda_rcxyz + self.lambda_target_loc = lambda_target_loc + self.lambda_vel = lambda_vel + self.lambda_root_vel = lambda_root_vel + self.lambda_vel_rcxyz = lambda_vel_rcxyz + self.lambda_fc = lambda_fc + + if self.lambda_rcxyz > 0. or self.lambda_vel > 0. or self.lambda_root_vel > 0. or \ + self.lambda_vel_rcxyz > 0. or self.lambda_fc > 0. or self.lambda_target_loc > 0.: + assert self.loss_type == LossType.MSE, 'Geometric losses are supported by MSE loss type only!' + + # Use float64 for accuracy. + betas = np.array(betas, dtype=np.float64) + self.betas = betas + assert len(betas.shape) == 1, "betas must be 1-D" + assert (betas > 0).all() and (betas <= 1).all() + + self.num_timesteps = int(betas.shape[0]) + + alphas = 1.0 - betas + self.alphas_cumprod = np.cumprod(alphas, axis=0) + self.alphas_cumprod_prev = np.append(1.0, self.alphas_cumprod[:-1]) + self.alphas_cumprod_next = np.append(self.alphas_cumprod[1:], 0.0) + assert self.alphas_cumprod_prev.shape == (self.num_timesteps,) + + # calculations for diffusion q(x_t | x_{t-1}) and others + self.sqrt_alphas_cumprod = np.sqrt(self.alphas_cumprod) + self.sqrt_one_minus_alphas_cumprod = np.sqrt(1.0 - self.alphas_cumprod) + self.log_one_minus_alphas_cumprod = np.log(1.0 - self.alphas_cumprod) + self.sqrt_recip_alphas_cumprod = np.sqrt(1.0 / self.alphas_cumprod) + self.sqrt_recipm1_alphas_cumprod = np.sqrt(1.0 / self.alphas_cumprod - 1) + + # calculations for posterior q(x_{t-1} | x_t, x_0) + self.posterior_variance = ( + betas * (1.0 - self.alphas_cumprod_prev) / (1.0 - self.alphas_cumprod) + ) + # log calculation clipped because the posterior variance is 0 at the + # beginning of the diffusion chain. + self.posterior_log_variance_clipped = np.log( + np.append(self.posterior_variance[1], self.posterior_variance[1:]) + ) + self.posterior_mean_coef1 = ( + betas * np.sqrt(self.alphas_cumprod_prev) / (1.0 - self.alphas_cumprod) + ) + self.posterior_mean_coef2 = ( + (1.0 - self.alphas_cumprod_prev) + * np.sqrt(alphas) + / (1.0 - self.alphas_cumprod) + ) + + # self.l2_loss = lambda a, b: (a - b) ** 2 # th.nn.MSELoss(reduction='none') # must be None for handling mask later on. + self.masked_l2 = masked_l2 + + + + def q_mean_variance(self, x_start, t): + """ + Get the distribution q(x_t | x_0). + + :param x_start: the [N x C x ...] tensor of noiseless inputs. + :param t: the number of diffusion steps (minus 1). Here, 0 means one step. + :return: A tuple (mean, variance, log_variance), all of x_start's shape. + """ + mean = ( + _extract_into_tensor(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start + ) + variance = _extract_into_tensor(1.0 - self.alphas_cumprod, t, x_start.shape) + log_variance = _extract_into_tensor( + self.log_one_minus_alphas_cumprod, t, x_start.shape + ) + return mean, variance, log_variance + + def q_sample(self, x_start, t, noise=None): + """ + Diffuse the dataset for a given number of diffusion steps. + + In other words, sample from q(x_t | x_0). + + :param x_start: the initial dataset batch. + :param t: the number of diffusion steps (minus 1). Here, 0 means one step. + :param noise: if specified, the split-out normal noise. + :return: A noisy version of x_start. + """ + if noise is None: + noise = th.randn_like(x_start) + assert noise.shape == x_start.shape + return ( + _extract_into_tensor(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start + + _extract_into_tensor(self.sqrt_one_minus_alphas_cumprod, t, x_start.shape) + * noise + ) + + def q_posterior_mean_variance(self, x_start, x_t, t): + """ + Compute the mean and variance of the diffusion posterior: + + q(x_{t-1} | x_t, x_0) + + """ + assert x_start.shape == x_t.shape + posterior_mean = ( + _extract_into_tensor(self.posterior_mean_coef1, t, x_t.shape) * x_start + + _extract_into_tensor(self.posterior_mean_coef2, t, x_t.shape) * x_t + ) + posterior_variance = _extract_into_tensor(self.posterior_variance, t, x_t.shape) + posterior_log_variance_clipped = _extract_into_tensor( + self.posterior_log_variance_clipped, t, x_t.shape + ) + assert ( + posterior_mean.shape[0] + == posterior_variance.shape[0] + == posterior_log_variance_clipped.shape[0] + == x_start.shape[0] + ) + return posterior_mean, posterior_variance, posterior_log_variance_clipped + + def p_mean_variance( + self, model, x, t, clip_denoised=True, denoised_fn=None, model_kwargs=None + ): + """ + Apply the model to get p(x_{t-1} | x_t), as well as a prediction of + the initial x, x_0. + + :param model: the model, which takes a signal and a batch of timesteps + as input. + :param x: the [N x C x ...] tensor at time t. + :param t: a 1-D Tensor of timesteps. + :param clip_denoised: if True, clip the denoised signal into [-1, 1]. + :param denoised_fn: if not None, a function which applies to the + x_start prediction before it is used to sample. Applies before + clip_denoised. + :param model_kwargs: if not None, a dict of extra keyword arguments to + pass to the model. This can be used for conditioning. + :return: a dict with the following keys: + - 'mean': the model mean output. + - 'variance': the model variance output. + - 'log_variance': the log of 'variance'. + - 'pred_xstart': the prediction for x_0. + """ + if model_kwargs is None: + model_kwargs = {} + + B, C = x.shape[:2] + assert t.shape == (B,) + model_output = model(x, self._scale_timesteps(t), **model_kwargs) + + if 'inpainting_mask' in model_kwargs['y'].keys() and 'inpainted_motion' in model_kwargs['y'].keys(): + inpainting_mask, inpainted_motion = model_kwargs['y']['inpainting_mask'], model_kwargs['y']['inpainted_motion'] + assert self.model_mean_type == ModelMeanType.START_X, 'This feature supports only X_start pred for mow!' + assert model_output.shape == inpainting_mask.shape == inpainted_motion.shape + model_output = (model_output * ~inpainting_mask) + (inpainted_motion * inpainting_mask) + # print('model_output', model_output.shape, model_output) + # print('inpainting_mask', inpainting_mask.shape, inpainting_mask[0,0,0,:]) + # print('inpainted_motion', inpainted_motion.shape, inpainted_motion) + + if self.model_var_type in [ModelVarType.LEARNED, ModelVarType.LEARNED_RANGE]: + assert model_output.shape == (B, C * 2, *x.shape[2:]) + model_output, model_var_values = th.split(model_output, C, dim=1) + if self.model_var_type == ModelVarType.LEARNED: + model_log_variance = model_var_values + model_variance = th.exp(model_log_variance) + else: + min_log = _extract_into_tensor( + self.posterior_log_variance_clipped, t, x.shape + ) + max_log = _extract_into_tensor(np.log(self.betas), t, x.shape) + # The model_var_values is [-1, 1] for [min_var, max_var]. + frac = (model_var_values + 1) / 2 + model_log_variance = frac * max_log + (1 - frac) * min_log + model_variance = th.exp(model_log_variance) + else: + model_variance, model_log_variance = { + # for fixedlarge, we set the initial (log-)variance like so + # to get a better decoder log likelihood. + ModelVarType.FIXED_LARGE: ( + np.append(self.posterior_variance[1], self.betas[1:]), + np.log(np.append(self.posterior_variance[1], self.betas[1:])), + ), + ModelVarType.FIXED_SMALL: ( + self.posterior_variance, + self.posterior_log_variance_clipped, + ), + }[self.model_var_type] + # print('model_variance', model_variance) + # print('model_log_variance',model_log_variance) + # print('self.posterior_variance', self.posterior_variance) + # print('self.posterior_log_variance_clipped', self.posterior_log_variance_clipped) + # print('self.model_var_type', self.model_var_type) + + + model_variance = _extract_into_tensor(model_variance, t, x.shape) + model_log_variance = _extract_into_tensor(model_log_variance, t, x.shape) + + def process_xstart(x): + if denoised_fn is not None: + x = denoised_fn(x) + if clip_denoised: + # print('clip_denoised', clip_denoised) + return x.clamp(-1, 1) + return x + + if self.model_mean_type == ModelMeanType.PREVIOUS_X: + pred_xstart = process_xstart( + self._predict_xstart_from_xprev(x_t=x, t=t, xprev=model_output) + ) + model_mean = model_output + elif self.model_mean_type in [ModelMeanType.START_X, ModelMeanType.EPSILON]: # THIS IS US! + if self.model_mean_type == ModelMeanType.START_X: + pred_xstart = process_xstart(model_output) + else: + pred_xstart = process_xstart( + self._predict_xstart_from_eps(x_t=x, t=t, eps=model_output) + ) + model_mean, _, _ = self.q_posterior_mean_variance( + x_start=pred_xstart, x_t=x, t=t + ) + else: + raise NotImplementedError(self.model_mean_type) + + assert ( + model_mean.shape == model_log_variance.shape == pred_xstart.shape == x.shape + ) + return { + "mean": model_mean, + "variance": model_variance, + "log_variance": model_log_variance, + "pred_xstart": pred_xstart, + } + + def _predict_xstart_from_eps(self, x_t, t, eps): + assert x_t.shape == eps.shape + return ( + _extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t + - _extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x_t.shape) * eps + ) + + def _predict_xstart_from_xprev(self, x_t, t, xprev): + assert x_t.shape == xprev.shape + return ( # (xprev - coef2*x_t) / coef1 + _extract_into_tensor(1.0 / self.posterior_mean_coef1, t, x_t.shape) * xprev + - _extract_into_tensor( + self.posterior_mean_coef2 / self.posterior_mean_coef1, t, x_t.shape + ) + * x_t + ) + + def _predict_eps_from_xstart(self, x_t, t, pred_xstart): + return ( + _extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t + - pred_xstart + ) / _extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x_t.shape) + + def _scale_timesteps(self, t): + if self.rescale_timesteps: + return t.float() * (1000.0 / self.num_timesteps) + return t + + def condition_mean(self, cond_fn, p_mean_var, x, t, model_kwargs=None): + """ + Compute the mean for the previous step, given a function cond_fn that + computes the gradient of a conditional log probability with respect to + x. In particular, cond_fn computes grad(log(p(y|x))), and we want to + condition on y. + + This uses the conditioning strategy from Sohl-Dickstein et al. (2015). + """ + gradient = cond_fn(x, self._scale_timesteps(t), **model_kwargs) + new_mean = ( + p_mean_var["mean"].float() + p_mean_var["variance"] * gradient.float() + ) + return new_mean + + def condition_mean_with_grad(self, cond_fn, p_mean_var, x, t, model_kwargs=None): + """ + Compute the mean for the previous step, given a function cond_fn that + computes the gradient of a conditional log probability with respect to + x. In particular, cond_fn computes grad(log(p(y|x))), and we want to + condition on y. + + This uses the conditioning strategy from Sohl-Dickstein et al. (2015). + """ + gradient = cond_fn(x, t, p_mean_var, **model_kwargs) + new_mean = ( + p_mean_var["mean"].float() + p_mean_var["variance"] * gradient.float() + ) + return new_mean + + def condition_score(self, cond_fn, p_mean_var, x, t, model_kwargs=None): + """ + Compute what the p_mean_variance output would have been, should the + model's score function be conditioned by cond_fn. + + See condition_mean() for details on cond_fn. + + Unlike condition_mean(), this instead uses the conditioning strategy + from Song et al (2020). + """ + alpha_bar = _extract_into_tensor(self.alphas_cumprod, t, x.shape) + + eps = self._predict_eps_from_xstart(x, t, p_mean_var["pred_xstart"]) + eps = eps - (1 - alpha_bar).sqrt() * cond_fn( + x, self._scale_timesteps(t), **model_kwargs + ) + + out = p_mean_var.copy() + out["pred_xstart"] = self._predict_xstart_from_eps(x, t, eps) + out["mean"], _, _ = self.q_posterior_mean_variance( + x_start=out["pred_xstart"], x_t=x, t=t + ) + return out + + def condition_score_with_grad(self, cond_fn, p_mean_var, x, t, model_kwargs=None): + """ + Compute what the p_mean_variance output would have been, should the + model's score function be conditioned by cond_fn. + + See condition_mean() for details on cond_fn. + + Unlike condition_mean(), this instead uses the conditioning strategy + from Song et al (2020). + """ + alpha_bar = _extract_into_tensor(self.alphas_cumprod, t, x.shape) + + eps = self._predict_eps_from_xstart(x, t, p_mean_var["pred_xstart"]) + eps = eps - (1 - alpha_bar).sqrt() * cond_fn( + x, t, p_mean_var, **model_kwargs + ) + + out = p_mean_var.copy() + out["pred_xstart"] = self._predict_xstart_from_eps(x, t, eps) + out["mean"], _, _ = self.q_posterior_mean_variance( + x_start=out["pred_xstart"], x_t=x, t=t + ) + return out + + def p_sample( + self, + model, + x, + t, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + const_noise=False, + ): + """ + Sample x_{t-1} from the model at the given timestep. + + :param model: the model to sample from. + :param x: the current tensor at x_{t-1}. + :param t: the value of t, starting at 0 for the first diffusion step. + :param clip_denoised: if True, clip the x_start prediction to [-1, 1]. + :param denoised_fn: if not None, a function which applies to the + x_start prediction before it is used to sample. + :param cond_fn: if not None, this is a gradient function that acts + similarly to the model. + :param model_kwargs: if not None, a dict of extra keyword arguments to + pass to the model. This can be used for conditioning. + :return: a dict containing the following keys: + - 'sample': a random sample from the model. + - 'pred_xstart': a prediction of x_0. + """ + out = self.p_mean_variance( + model, + x, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + model_kwargs=model_kwargs, + ) + noise = th.randn_like(x) + # print('const_noise', const_noise) + if const_noise: + noise = noise[[0]].repeat(x.shape[0], 1, 1, 1) + + nonzero_mask = ( + (t != 0).float().view(-1, *([1] * (len(x.shape) - 1))) + ) # no noise when t == 0 + if cond_fn is not None: + out["mean"] = self.condition_mean( + cond_fn, out, x, t, model_kwargs=model_kwargs + ) + # print('mean', out["mean"].shape, out["mean"]) + # print('log_variance', out["log_variance"].shape, out["log_variance"]) + # print('nonzero_mask', nonzero_mask.shape, nonzero_mask) + sample = out["mean"] + nonzero_mask * th.exp(0.5 * out["log_variance"]) * noise + return {"sample": sample, "pred_xstart": out["pred_xstart"]} + + def p_sample_with_grad( + self, + model, + x, + t, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + ): + """ + Sample x_{t-1} from the model at the given timestep. + + :param model: the model to sample from. + :param x: the current tensor at x_{t-1}. + :param t: the value of t, starting at 0 for the first diffusion step. + :param clip_denoised: if True, clip the x_start prediction to [-1, 1]. + :param denoised_fn: if not None, a function which applies to the + x_start prediction before it is used to sample. + :param cond_fn: if not None, this is a gradient function that acts + similarly to the model. + :param model_kwargs: if not None, a dict of extra keyword arguments to + pass to the model. This can be used for conditioning. + :return: a dict containing the following keys: + - 'sample': a random sample from the model. + - 'pred_xstart': a prediction of x_0. + """ + with th.enable_grad(): + x = x.detach().requires_grad_() + out = self.p_mean_variance( + model, + x, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + model_kwargs=model_kwargs, + ) + noise = th.randn_like(x) + nonzero_mask = ( + (t != 0).float().view(-1, *([1] * (len(x.shape) - 1))) + ) # no noise when t == 0 + if cond_fn is not None: + out["mean"] = self.condition_mean_with_grad( + cond_fn, out, x, t, model_kwargs=model_kwargs + ) + sample = out["mean"] + nonzero_mask * th.exp(0.5 * out["log_variance"]) * noise + return {"sample": sample, "pred_xstart": out["pred_xstart"].detach()} + + def p_sample_loop( + self, + model, + shape, + noise=None, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + device=None, + progress=False, + skip_timesteps=0, + init_image=None, + randomize_class=False, + cond_fn_with_grad=False, + dump_steps=None, + const_noise=False, + ): + """ + Generate samples from the model. + + :param model: the model module. + :param shape: the shape of the samples, (N, C, H, W). + :param noise: if specified, the noise from the encoder to sample. + Should be of the same shape as `shape`. + :param clip_denoised: if True, clip x_start predictions to [-1, 1]. + :param denoised_fn: if not None, a function which applies to the + x_start prediction before it is used to sample. + :param cond_fn: if not None, this is a gradient function that acts + similarly to the model. + :param model_kwargs: if not None, a dict of extra keyword arguments to + pass to the model. This can be used for conditioning. + :param device: if specified, the device to create the samples on. + If not specified, use a model parameter's device. + :param progress: if True, show a tqdm progress bar. + :param const_noise: If True, will noise all samples with the same noise throughout sampling + :return: a non-differentiable batch of samples. + """ + final = None + if dump_steps is not None: + dump = [] + + if 'text' in model_kwargs['y'].keys(): + # encoding once instead of each iteration saves lots of time + model_kwargs['y']['text_embed'] = model.encode_text(model_kwargs['y']['text']) + + for i, sample in enumerate(self.p_sample_loop_progressive( + model, + shape, + noise=noise, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + cond_fn=cond_fn, + model_kwargs=model_kwargs, + device=device, + progress=progress, + skip_timesteps=skip_timesteps, + init_image=init_image, + randomize_class=randomize_class, + cond_fn_with_grad=cond_fn_with_grad, + const_noise=const_noise, + )): + if dump_steps is not None and i in dump_steps: + dump.append(deepcopy(sample["sample"])) + final = sample + if dump_steps is not None: + return dump + return final["sample"] + + def p_sample_loop_progressive( + self, + model, + shape, + noise=None, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + device=None, + progress=False, + skip_timesteps=0, + init_image=None, + randomize_class=False, + cond_fn_with_grad=False, + const_noise=False, + ): + """ + Generate samples from the model and yield intermediate samples from + each timestep of diffusion. + + Arguments are the same as p_sample_loop(). + Returns a generator over dicts, where each dict is the return value of + p_sample(). + """ + if device is None: + device = next(model.parameters()).device + assert isinstance(shape, (tuple, list)) + if noise is not None: + img = noise + else: + img = th.randn(*shape, device=device) + + if skip_timesteps and init_image is None: + init_image = th.zeros_like(img) + + indices = list(range(self.num_timesteps - skip_timesteps))[::-1] + + if init_image is not None: + my_t = th.ones([shape[0]], device=device, dtype=th.long) * indices[0] + img = self.q_sample(init_image, my_t, img) + + if progress: + # Lazy import so that we don't depend on tqdm. + from tqdm.auto import tqdm + + indices = tqdm(indices) + + for i in indices: + t = th.tensor([i] * shape[0], device=device) + if randomize_class and 'y' in model_kwargs: + model_kwargs['y'] = th.randint(low=0, high=model.num_classes, + size=model_kwargs['y'].shape, + device=model_kwargs['y'].device) + with th.no_grad(): + sample_fn = self.p_sample_with_grad if cond_fn_with_grad else self.p_sample + out = sample_fn( + model, + img, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + cond_fn=cond_fn, + model_kwargs=model_kwargs, + const_noise=const_noise, + ) + yield out + img = out["sample"] + + def ddim_sample( + self, + model, + x, + t, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + eta=0.0, + ): + """ + Sample x_{t-1} from the model using DDIM. + + Same usage as p_sample(). + """ + out_orig = self.p_mean_variance( + model, + x, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + model_kwargs=model_kwargs, + ) + if cond_fn is not None: + out = self.condition_score(cond_fn, out_orig, x, t, model_kwargs=model_kwargs) + else: + out = out_orig + + # Usually our model outputs epsilon, but we re-derive it + # in case we used x_start or x_prev prediction. + eps = self._predict_eps_from_xstart(x, t, out["pred_xstart"]) + + alpha_bar = _extract_into_tensor(self.alphas_cumprod, t, x.shape) + alpha_bar_prev = _extract_into_tensor(self.alphas_cumprod_prev, t, x.shape) + sigma = ( + eta + * th.sqrt((1 - alpha_bar_prev) / (1 - alpha_bar)) + * th.sqrt(1 - alpha_bar / alpha_bar_prev) + ) + # Equation 12. + noise = th.randn_like(x) + mean_pred = ( + out["pred_xstart"] * th.sqrt(alpha_bar_prev) + + th.sqrt(1 - alpha_bar_prev - sigma ** 2) * eps + ) + nonzero_mask = ( + (t != 0).float().view(-1, *([1] * (len(x.shape) - 1))) + ) # no noise when t == 0 + sample = mean_pred + nonzero_mask * sigma * noise + return {"sample": sample, "pred_xstart": out_orig["pred_xstart"]} + + def ddim_sample_with_grad( + self, + model, + x, + t, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + eta=0.0, + ): + """ + Sample x_{t-1} from the model using DDIM. + + Same usage as p_sample(). + """ + with th.enable_grad(): + x = x.detach().requires_grad_() + out_orig = self.p_mean_variance( + model, + x, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + model_kwargs=model_kwargs, + ) + if cond_fn is not None: + out = self.condition_score_with_grad(cond_fn, out_orig, x, t, + model_kwargs=model_kwargs) + else: + out = out_orig + + out["pred_xstart"] = out["pred_xstart"].detach() + + # Usually our model outputs epsilon, but we re-derive it + # in case we used x_start or x_prev prediction. + eps = self._predict_eps_from_xstart(x, t, out["pred_xstart"]) + + alpha_bar = _extract_into_tensor(self.alphas_cumprod, t, x.shape) + alpha_bar_prev = _extract_into_tensor(self.alphas_cumprod_prev, t, x.shape) + sigma = ( + eta + * th.sqrt((1 - alpha_bar_prev) / (1 - alpha_bar)) + * th.sqrt(1 - alpha_bar / alpha_bar_prev) + ) + # Equation 12. + noise = th.randn_like(x) + mean_pred = ( + out["pred_xstart"] * th.sqrt(alpha_bar_prev) + + th.sqrt(1 - alpha_bar_prev - sigma ** 2) * eps + ) + nonzero_mask = ( + (t != 0).float().view(-1, *([1] * (len(x.shape) - 1))) + ) # no noise when t == 0 + sample = mean_pred + nonzero_mask * sigma * noise + return {"sample": sample, "pred_xstart": out_orig["pred_xstart"].detach()} + + def ddim_reverse_sample( + self, + model, + x, + t, + clip_denoised=True, + denoised_fn=None, + model_kwargs=None, + eta=0.0, + ): + """ + Sample x_{t+1} from the model using DDIM reverse ODE. + """ + assert eta == 0.0, "Reverse ODE only for deterministic path" + out = self.p_mean_variance( + model, + x, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + model_kwargs=model_kwargs, + ) + # Usually our model outputs epsilon, but we re-derive it + # in case we used x_start or x_prev prediction. + eps = ( + _extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x.shape) * x + - out["pred_xstart"] + ) / _extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x.shape) + alpha_bar_next = _extract_into_tensor(self.alphas_cumprod_next, t, x.shape) + + # Equation 12. reversed + mean_pred = ( + out["pred_xstart"] * th.sqrt(alpha_bar_next) + + th.sqrt(1 - alpha_bar_next) * eps + ) + + return {"sample": mean_pred, "pred_xstart": out["pred_xstart"]} + + def ddim_sample_loop( + self, + model, + shape, + noise=None, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + device=None, + progress=False, + eta=0.0, + skip_timesteps=0, + init_image=None, + randomize_class=False, + cond_fn_with_grad=False, + dump_steps=None, + const_noise=False, + ): + """ + Generate samples from the model using DDIM. + + Same usage as p_sample_loop(). + """ + if dump_steps is not None: + raise NotImplementedError() + if const_noise == True: + raise NotImplementedError() + + final = None + for sample in self.ddim_sample_loop_progressive( + model, + shape, + noise=noise, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + cond_fn=cond_fn, + model_kwargs=model_kwargs, + device=device, + progress=progress, + eta=eta, + skip_timesteps=skip_timesteps, + init_image=init_image, + randomize_class=randomize_class, + cond_fn_with_grad=cond_fn_with_grad, + ): + final = sample + return final["sample"] + + def ddim_sample_loop_progressive( + self, + model, + shape, + noise=None, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + device=None, + progress=False, + eta=0.0, + skip_timesteps=0, + init_image=None, + randomize_class=False, + cond_fn_with_grad=False, + ): + """ + Use DDIM to sample from the model and yield intermediate samples from + each timestep of DDIM. + + Same usage as p_sample_loop_progressive(). + """ + if device is None: + device = next(model.parameters()).device + assert isinstance(shape, (tuple, list)) + if noise is not None: + img = noise + else: + img = th.randn(*shape, device=device) + + if skip_timesteps and init_image is None: + init_image = th.zeros_like(img) + + indices = list(range(self.num_timesteps - skip_timesteps))[::-1] + + if init_image is not None: + my_t = th.ones([shape[0]], device=device, dtype=th.long) * indices[0] + img = self.q_sample(init_image, my_t, img) + + if progress: + # Lazy import so that we don't depend on tqdm. + from tqdm.auto import tqdm + + indices = tqdm(indices) + + for i in indices: + t = th.tensor([i] * shape[0], device=device) + if randomize_class and 'y' in model_kwargs: + model_kwargs['y'] = th.randint(low=0, high=model.num_classes, + size=model_kwargs['y'].shape, + device=model_kwargs['y'].device) + with th.no_grad(): + sample_fn = self.ddim_sample_with_grad if cond_fn_with_grad else self.ddim_sample + out = sample_fn( + model, + img, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + cond_fn=cond_fn, + model_kwargs=model_kwargs, + eta=eta, + ) + yield out + img = out["sample"] + + def plms_sample( + self, + model, + x, + t, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + cond_fn_with_grad=False, + order=2, + old_out=None, + ): + """ + Sample x_{t-1} from the model using Pseudo Linear Multistep. + + Same usage as p_sample(). + """ + if not int(order) or not 1 <= order <= 4: + raise ValueError('order is invalid (should be int from 1-4).') + + def get_model_output(x, t): + with th.set_grad_enabled(cond_fn_with_grad and cond_fn is not None): + x = x.detach().requires_grad_() if cond_fn_with_grad else x + out_orig = self.p_mean_variance( + model, + x, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + model_kwargs=model_kwargs, + ) + if cond_fn is not None: + if cond_fn_with_grad: + out = self.condition_score_with_grad(cond_fn, out_orig, x, t, model_kwargs=model_kwargs) + x = x.detach() + else: + out = self.condition_score(cond_fn, out_orig, x, t, model_kwargs=model_kwargs) + else: + out = out_orig + + # Usually our model outputs epsilon, but we re-derive it + # in case we used x_start or x_prev prediction. + eps = self._predict_eps_from_xstart(x, t, out["pred_xstart"]) + return eps, out, out_orig + + alpha_bar = _extract_into_tensor(self.alphas_cumprod, t, x.shape) + alpha_bar_prev = _extract_into_tensor(self.alphas_cumprod_prev, t, x.shape) + eps, out, out_orig = get_model_output(x, t) + + if order > 1 and old_out is None: + # Pseudo Improved Euler + old_eps = [eps] + mean_pred = out["pred_xstart"] * th.sqrt(alpha_bar_prev) + th.sqrt(1 - alpha_bar_prev) * eps + eps_2, _, _ = get_model_output(mean_pred, t - 1) + eps_prime = (eps + eps_2) / 2 + pred_prime = self._predict_xstart_from_eps(x, t, eps_prime) + mean_pred = pred_prime * th.sqrt(alpha_bar_prev) + th.sqrt(1 - alpha_bar_prev) * eps_prime + else: + # Pseudo Linear Multistep (Adams-Bashforth) + old_eps = old_out["old_eps"] + old_eps.append(eps) + cur_order = min(order, len(old_eps)) + if cur_order == 1: + eps_prime = old_eps[-1] + elif cur_order == 2: + eps_prime = (3 * old_eps[-1] - old_eps[-2]) / 2 + elif cur_order == 3: + eps_prime = (23 * old_eps[-1] - 16 * old_eps[-2] + 5 * old_eps[-3]) / 12 + elif cur_order == 4: + eps_prime = (55 * old_eps[-1] - 59 * old_eps[-2] + 37 * old_eps[-3] - 9 * old_eps[-4]) / 24 + else: + raise RuntimeError('cur_order is invalid.') + pred_prime = self._predict_xstart_from_eps(x, t, eps_prime) + mean_pred = pred_prime * th.sqrt(alpha_bar_prev) + th.sqrt(1 - alpha_bar_prev) * eps_prime + + if len(old_eps) >= order: + old_eps.pop(0) + + nonzero_mask = (t != 0).float().view(-1, *([1] * (len(x.shape) - 1))) + sample = mean_pred * nonzero_mask + out["pred_xstart"] * (1 - nonzero_mask) + + return {"sample": sample, "pred_xstart": out_orig["pred_xstart"], "old_eps": old_eps} + + def plms_sample_loop( + self, + model, + shape, + noise=None, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + device=None, + progress=False, + skip_timesteps=0, + init_image=None, + randomize_class=False, + cond_fn_with_grad=False, + order=2, + ): + """ + Generate samples from the model using Pseudo Linear Multistep. + + Same usage as p_sample_loop(). + """ + final = None + for sample in self.plms_sample_loop_progressive( + model, + shape, + noise=noise, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + cond_fn=cond_fn, + model_kwargs=model_kwargs, + device=device, + progress=progress, + skip_timesteps=skip_timesteps, + init_image=init_image, + randomize_class=randomize_class, + cond_fn_with_grad=cond_fn_with_grad, + order=order, + ): + final = sample + return final["sample"] + + def plms_sample_loop_progressive( + self, + model, + shape, + noise=None, + clip_denoised=True, + denoised_fn=None, + cond_fn=None, + model_kwargs=None, + device=None, + progress=False, + skip_timesteps=0, + init_image=None, + randomize_class=False, + cond_fn_with_grad=False, + order=2, + ): + """ + Use PLMS to sample from the model and yield intermediate samples from each + timestep of PLMS. + + Same usage as p_sample_loop_progressive(). + """ + if device is None: + device = next(model.parameters()).device + assert isinstance(shape, (tuple, list)) + if noise is not None: + img = noise + else: + img = th.randn(*shape, device=device) + + if skip_timesteps and init_image is None: + init_image = th.zeros_like(img) + + indices = list(range(self.num_timesteps - skip_timesteps))[::-1] + + if init_image is not None: + my_t = th.ones([shape[0]], device=device, dtype=th.long) * indices[0] + img = self.q_sample(init_image, my_t, img) + + if progress: + # Lazy import so that we don't depend on tqdm. + from tqdm.auto import tqdm + + indices = tqdm(indices) + + old_out = None + + for i in indices: + t = th.tensor([i] * shape[0], device=device) + if randomize_class and 'y' in model_kwargs: + model_kwargs['y'] = th.randint(low=0, high=model.num_classes, + size=model_kwargs['y'].shape, + device=model_kwargs['y'].device) + with th.no_grad(): + out = self.plms_sample( + model, + img, + t, + clip_denoised=clip_denoised, + denoised_fn=denoised_fn, + cond_fn=cond_fn, + model_kwargs=model_kwargs, + cond_fn_with_grad=cond_fn_with_grad, + order=order, + old_out=old_out, + ) + yield out + old_out = out + img = out["sample"] + + def _vb_terms_bpd( + self, model, x_start, x_t, t, clip_denoised=True, model_kwargs=None + ): + """ + Get a term for the variational lower-bound. + + The resulting units are bits (rather than nats, as one might expect). + This allows for comparison to other papers. + + :return: a dict with the following keys: + - 'output': a shape [N] tensor of NLLs or KLs. + - 'pred_xstart': the x_0 predictions. + """ + true_mean, _, true_log_variance_clipped = self.q_posterior_mean_variance( + x_start=x_start, x_t=x_t, t=t + ) + out = self.p_mean_variance( + model, x_t, t, clip_denoised=clip_denoised, model_kwargs=model_kwargs + ) + kl = normal_kl( + true_mean, true_log_variance_clipped, out["mean"], out["log_variance"] + ) + kl = mean_flat(kl) / np.log(2.0) + + decoder_nll = -discretized_gaussian_log_likelihood( + x_start, means=out["mean"], log_scales=0.5 * out["log_variance"] + ) + assert decoder_nll.shape == x_start.shape + decoder_nll = mean_flat(decoder_nll) / np.log(2.0) + + # At the first timestep return the decoder NLL, + # otherwise return KL(q(x_{t-1}|x_t,x_0) || p(x_{t-1}|x_t)) + output = th.where((t == 0), decoder_nll, kl) + return {"output": output, "pred_xstart": out["pred_xstart"]} + + def training_losses(self, model, x_start, t, model_kwargs=None, noise=None, dataset=None): + """ + Compute training losses for a single timestep. + + :param model: the model to evaluate loss on. + :param x_start: the [N x C x ...] tensor of inputs. + :param t: a batch of timestep indices. + :param model_kwargs: if not None, a dict of extra keyword arguments to + pass to the model. This can be used for conditioning. + :param noise: if specified, the specific Gaussian noise to try to remove. + :return: a dict with the key "loss" containing a tensor of shape [N]. + Some mean or variance settings may also have other keys. + """ + + # enc = model.model._modules['module'] + enc = model.model + mask = model_kwargs['y']['mask'] + get_xyz = lambda sample: enc.rot2xyz(sample, mask=None, pose_rep=enc.pose_rep, translation=enc.translation, + glob=enc.glob, + # jointstype='vertices', # 3.4 iter/sec # USED ALSO IN MotionCLIP + jointstype='smpl', # 3.4 iter/sec + vertstrans=False) + + if model_kwargs is None: + model_kwargs = {} + if noise is None: + noise = th.randn_like(x_start) + x_t = self.q_sample(x_start, t, noise=noise) + + terms = {} + + if self.loss_type == LossType.KL or self.loss_type == LossType.RESCALED_KL: + terms["loss"] = self._vb_terms_bpd( + model=model, + x_start=x_start, + x_t=x_t, + t=t, + clip_denoised=False, + model_kwargs=model_kwargs, + )["output"] + if self.loss_type == LossType.RESCALED_KL: + terms["loss"] *= self.num_timesteps + elif self.loss_type == LossType.MSE or self.loss_type == LossType.RESCALED_MSE: + model_output = model(x_t, self._scale_timesteps(t), **model_kwargs) + + if self.model_var_type in [ + ModelVarType.LEARNED, + ModelVarType.LEARNED_RANGE, + ]: + B, C = x_t.shape[:2] + assert model_output.shape == (B, C * 2, *x_t.shape[2:]) + model_output, model_var_values = th.split(model_output, C, dim=1) + # Learn the variance using the variational bound, but don't let + # it affect our mean prediction. + frozen_out = th.cat([model_output.detach(), model_var_values], dim=1) + terms["vb"] = self._vb_terms_bpd( + model=lambda *args, r=frozen_out: r, + x_start=x_start, + x_t=x_t, + t=t, + clip_denoised=False, + )["output"] + if self.loss_type == LossType.RESCALED_MSE: + # Divide by 1000 for equivalence with initial implementation. + # Without a factor of 1/1000, the VB term hurts the MSE term. + terms["vb"] *= self.num_timesteps / 1000.0 + + target = { + ModelMeanType.PREVIOUS_X: self.q_posterior_mean_variance( + x_start=x_start, x_t=x_t, t=t + )[0], + ModelMeanType.START_X: x_start, + ModelMeanType.EPSILON: noise, + }[self.model_mean_type] + assert model_output.shape == target.shape == x_start.shape # [bs, njoints, nfeats, nframes] + + terms["rot_mse"] = self.masked_l2(target, model_output, mask) # mean_flat(rot_mse) + + target_xyz, model_output_xyz = None, None + + if self.lambda_rcxyz > 0.: + target_xyz = get_xyz(target) # [bs, nvertices(vertices)/njoints(smpl), 3, nframes] + model_output_xyz = get_xyz(model_output) # [bs, nvertices, 3, nframes] + terms["rcxyz_mse"] = self.masked_l2(target_xyz, model_output_xyz, mask) # mean_flat((target_xyz - model_output_xyz) ** 2) + + if self.lambda_vel_rcxyz > 0.: + if self.data_rep == 'rot6d' and dataset.dataname in ['humanact12', 'uestc']: + target_xyz = get_xyz(target) if target_xyz is None else target_xyz + model_output_xyz = get_xyz(model_output) if model_output_xyz is None else model_output_xyz + target_xyz_vel = (target_xyz[:, :, :, 1:] - target_xyz[:, :, :, :-1]) + model_output_xyz_vel = (model_output_xyz[:, :, :, 1:] - model_output_xyz[:, :, :, :-1]) + terms["vel_xyz_mse"] = self.masked_l2(target_xyz_vel, model_output_xyz_vel, mask[:, :, :, 1:]) + + if self.lambda_fc > 0.: + with torch.autograd.set_detect_anomaly(True): + if self.data_rep == 'rot6d' and dataset.dataname in ['humanact12', 'uestc']: + target_xyz = get_xyz(target) if target_xyz is None else target_xyz + model_output_xyz = get_xyz(model_output) if model_output_xyz is None else model_output_xyz + # 'L_Ankle', # 7, 'R_Ankle', # 8 , 'L_Foot', # 10, 'R_Foot', # 11 + l_ankle_idx, r_ankle_idx, l_foot_idx, r_foot_idx = 7, 8, 10, 11 + relevant_joints = [l_ankle_idx, l_foot_idx, r_ankle_idx, r_foot_idx] + gt_joint_xyz = target_xyz[:, relevant_joints, :, :] # [BatchSize, 4, 3, Frames] + gt_joint_vel = torch.linalg.norm(gt_joint_xyz[:, :, :, 1:] - gt_joint_xyz[:, :, :, :-1], axis=2) # [BatchSize, 4, Frames] + fc_mask = torch.unsqueeze((gt_joint_vel <= 0.01), dim=2).repeat(1, 1, 3, 1) + pred_joint_xyz = model_output_xyz[:, relevant_joints, :, :] # [BatchSize, 4, 3, Frames] + pred_vel = pred_joint_xyz[:, :, :, 1:] - pred_joint_xyz[:, :, :, :-1] + pred_vel[~fc_mask] = 0 + terms["fc"] = self.masked_l2(pred_vel, + torch.zeros(pred_vel.shape, device=pred_vel.device), + mask[:, :, :, 1:]) + if self.lambda_vel > 0.: + target_vel = (target[..., 1:] - target[..., :-1]) + model_output_vel = (model_output[..., 1:] - model_output[..., :-1]) + terms["vel_mse"] = self.masked_l2(target_vel[:, :-1, :, :], # Remove last joint, is the root location! + model_output_vel[:, :-1, :, :], + mask[:, :, :, 1:]) # mean_flat((target_vel - model_output_vel) ** 2) + + if self.lambda_target_loc > 0.: + assert self.model_mean_type == ModelMeanType.START_X, 'This feature supports only X_start pred for now!' + ref_target = model_kwargs['y']['target_cond'] + pred_target = get_target_location(model_output, dataset.mean_gpu, dataset.std_gpu, + model_kwargs['y']['lengths'], dataset.t2m_dataset.opt.joints_num, model.all_goal_joint_names, + model_kwargs['y']['target_joint_names'], model_kwargs['y']['is_heading']) + terms["target_loc"] = masked_goal_l2(pred_target, ref_target, model_kwargs['y'], model.all_goal_joint_names) + + + terms["loss"] = terms["rot_mse"] + terms.get('vb', 0.) +\ + (self.lambda_vel * terms.get('vel_mse', 0.)) +\ + (self.lambda_rcxyz * terms.get('rcxyz_mse', 0.)) + \ + (self.lambda_target_loc * terms.get('target_loc', 0.)) + \ + (self.lambda_fc * terms.get('fc', 0.)) + + else: + raise NotImplementedError(self.loss_type) + + return terms + + def fc_loss_rot_repr(self, gt_xyz, pred_xyz, mask): + def to_np_cpu(x): + return x.detach().cpu().numpy() + """ + pose_xyz: SMPL batch tensor of shape: [BatchSize, 24, 3, Frames] + """ + # 'L_Ankle', # 7, 'R_Ankle', # 8 , 'L_Foot', # 10, 'R_Foot', # 11 + + l_ankle_idx, r_ankle_idx = 7, 8 + l_foot_idx, r_foot_idx = 10, 11 + """ Contact calculated by 'Kfir Method' Commented code)""" + # contact_signal = torch.zeros((pose_xyz.shape[0], pose_xyz.shape[3], 2), device=pose_xyz.device) # [BatchSize, Frames, 2] + # left_xyz = 0.5 * (pose_xyz[:, l_ankle_idx, :, :] + pose_xyz[:, l_foot_idx, :, :]) # [BatchSize, 3, Frames] + # right_xyz = 0.5 * (pose_xyz[:, r_ankle_idx, :, :] + pose_xyz[:, r_foot_idx, :, :]) + # left_z, right_z = left_xyz[:, 2, :], right_xyz[:, 2, :] # [BatchSize, Frames] + # left_velocity = torch.linalg.norm(left_xyz[:, :, 2:] - left_xyz[:, :, :-2], axis=1) # [BatchSize, Frames] + # right_velocity = torch.linalg.norm(left_xyz[:, :, 2:] - left_xyz[:, :, :-2], axis=1) + # + # left_z_mask = left_z <= torch.mean(torch.sort(left_z)[0][:, :left_z.shape[1] // 5], axis=-1) + # left_z_mask = torch.stack([left_z_mask, left_z_mask], dim=-1) # [BatchSize, Frames, 2] + # left_z_mask[:, :, 1] = False # Blank right side + # contact_signal[left_z_mask] = 0.4 + # + # right_z_mask = right_z <= torch.mean(torch.sort(right_z)[0][:, :right_z.shape[1] // 5], axis=-1) + # right_z_mask = torch.stack([right_z_mask, right_z_mask], dim=-1) # [BatchSize, Frames, 2] + # right_z_mask[:, :, 0] = False # Blank left side + # contact_signal[right_z_mask] = 0.4 + # contact_signal[left_z <= (torch.mean(torch.sort(left_z)[:left_z.shape[0] // 5]) + 20), 0] = 1 + # contact_signal[right_z <= (torch.mean(torch.sort(right_z)[:right_z.shape[0] // 5]) + 20), 1] = 1 + + # plt.plot(to_np_cpu(left_z[0]), label='left_z') + # plt.plot(to_np_cpu(left_velocity[0]), label='left_velocity') + # plt.plot(to_np_cpu(contact_signal[0, :, 0]), label='left_fc') + # plt.grid() + # plt.legend() + # plt.show() + # plt.plot(to_np_cpu(right_z[0]), label='right_z') + # plt.plot(to_np_cpu(right_velocity[0]), label='right_velocity') + # plt.plot(to_np_cpu(contact_signal[0, :, 1]), label='right_fc') + # plt.grid() + # plt.legend() + # plt.show() + + gt_joint_xyz = gt_xyz[:, [l_ankle_idx, l_foot_idx, r_ankle_idx, r_foot_idx], :, :] # [BatchSize, 4, 3, Frames] + gt_joint_vel = torch.linalg.norm(gt_joint_xyz[:, :, :, 1:] - gt_joint_xyz[:, :, :, :-1], axis=2) # [BatchSize, 4, Frames] + fc_mask = (gt_joint_vel <= 0.01) + pred_joint_xyz = pred_xyz[:, [l_ankle_idx, l_foot_idx, r_ankle_idx, r_foot_idx], :, :] # [BatchSize, 4, 3, Frames] + pred_joint_vel = torch.linalg.norm(pred_joint_xyz[:, :, :, 1:] - pred_joint_xyz[:, :, :, :-1], axis=2) # [BatchSize, 4, Frames] + pred_joint_vel[~fc_mask] = 0 # Blank non-contact velocities frames. [BS,4,FRAMES] + pred_joint_vel = torch.unsqueeze(pred_joint_vel, dim=2) + + """DEBUG CODE""" + # print(f'mask: {mask.shape}') + # print(f'pred_joint_vel: {pred_joint_vel.shape}') + # plt.title(f'Joint: {joint_idx}') + # plt.plot(to_np_cpu(gt_joint_vel[0]), label='velocity') + # plt.plot(to_np_cpu(fc_mask[0]), label='fc') + # plt.grid() + # plt.legend() + # plt.show() + return self.masked_l2(pred_joint_vel, torch.zeros(pred_joint_vel.shape, device=pred_joint_vel.device), + mask[:, :, :, 1:]) + # TODO - NOT USED YET, JUST COMMITING TO NOT DELETE THIS AND KEEP INITIAL IMPLEMENTATION, NOT DONE! + def foot_contact_loss_humanml3d(self, target, model_output): + # root_rot_velocity (B, seq_len, 1) + # root_linear_velocity (B, seq_len, 2) + # root_y (B, seq_len, 1) + # ric_data (B, seq_len, (joint_num - 1)*3) , XYZ + # rot_data (B, seq_len, (joint_num - 1)*6) , 6D + # local_velocity (B, seq_len, joint_num*3) , XYZ + # foot contact (B, seq_len, 4) , + + target_fc = target[:, -4:, :, :] + root_rot_velocity = target[:, :1, :, :] + root_linear_velocity = target[:, 1:3, :, :] + root_y = target[:, 3:4, :, :] + ric_data = target[:, 4:67, :, :] # 4+(3*21)=67 + rot_data = target[:, 67:193, :, :] # 67+(6*21)=193 + local_velocity = target[:, 193:259, :, :] # 193+(3*22)=259 + contact = target[:, 259:, :, :] # 193+(3*22)=259 + contact_mask_gt = contact > 0.5 # contact mask order for indexes are fid_l [7, 10], fid_r [8, 11] + vel_lf_7 = local_velocity[:, 7 * 3:8 * 3, :, :] + vel_rf_8 = local_velocity[:, 8 * 3:9 * 3, :, :] + vel_lf_10 = local_velocity[:, 10 * 3:11 * 3, :, :] + vel_rf_11 = local_velocity[:, 11 * 3:12 * 3, :, :] + + calc_vel_lf_7 = ric_data[:, 6 * 3:7 * 3, :, 1:] - ric_data[:, 6 * 3:7 * 3, :, :-1] + calc_vel_rf_8 = ric_data[:, 7 * 3:8 * 3, :, 1:] - ric_data[:, 7 * 3:8 * 3, :, :-1] + calc_vel_lf_10 = ric_data[:, 9 * 3:10 * 3, :, 1:] - ric_data[:, 9 * 3:10 * 3, :, :-1] + calc_vel_rf_11 = ric_data[:, 10 * 3:11 * 3, :, 1:] - ric_data[:, 10 * 3:11 * 3, :, :-1] + + # vel_foots = torch.stack([vel_lf_7, vel_lf_10, vel_rf_8, vel_rf_11], dim=1) + for chosen_vel_foot_calc, chosen_vel_foot, joint_idx, contact_mask_idx in zip( + [calc_vel_lf_7, calc_vel_rf_8, calc_vel_lf_10, calc_vel_rf_11], + [vel_lf_7, vel_lf_10, vel_rf_8, vel_rf_11], + [7, 10, 8, 11], + [0, 1, 2, 3]): + tmp_mask_gt = contact_mask_gt[:, contact_mask_idx, :, :].cpu().detach().numpy().reshape(-1).astype(int) + chosen_vel_norm = np.linalg.norm(chosen_vel_foot.cpu().detach().numpy().reshape((3, -1)), axis=0) + chosen_vel_calc_norm = np.linalg.norm(chosen_vel_foot_calc.cpu().detach().numpy().reshape((3, -1)), + axis=0) + + print(tmp_mask_gt.shape) + print(chosen_vel_foot.shape) + print(chosen_vel_calc_norm.shape) + import matplotlib.pyplot as plt + plt.plot(tmp_mask_gt, label='FC mask') + plt.plot(chosen_vel_norm, label='Vel. XYZ norm (from vector)') + plt.plot(chosen_vel_calc_norm, label='Vel. XYZ norm (calculated diff XYZ)') + + plt.title(f'FC idx {contact_mask_idx}, Joint Index {joint_idx}') + plt.legend() + plt.show() + # print(vel_foots.shape) + return 0 + # TODO - NOT USED YET, JUST COMMITING TO NOT DELETE THIS AND KEEP INITIAL IMPLEMENTATION, NOT DONE! + def velocity_consistency_loss_humanml3d(self, target, model_output): + # root_rot_velocity (B, seq_len, 1) + # root_linear_velocity (B, seq_len, 2) + # root_y (B, seq_len, 1) + # ric_data (B, seq_len, (joint_num - 1)*3) , XYZ + # rot_data (B, seq_len, (joint_num - 1)*6) , 6D + # local_velocity (B, seq_len, joint_num*3) , XYZ + # foot contact (B, seq_len, 4) , + + target_fc = target[:, -4:, :, :] + root_rot_velocity = target[:, :1, :, :] + root_linear_velocity = target[:, 1:3, :, :] + root_y = target[:, 3:4, :, :] + ric_data = target[:, 4:67, :, :] # 4+(3*21)=67 + rot_data = target[:, 67:193, :, :] # 67+(6*21)=193 + local_velocity = target[:, 193:259, :, :] # 193+(3*22)=259 + contact = target[:, 259:, :, :] # 193+(3*22)=259 + + calc_vel_from_xyz = ric_data[:, :, :, 1:] - ric_data[:, :, :, :-1] + velocity_from_vector = local_velocity[:, 3:, :, 1:] # Slicing out root + r_rot_quat, r_pos = motion_process.recover_root_rot_pos(target.permute(0, 2, 3, 1).type(th.FloatTensor)) + print(f'r_rot_quat: {r_rot_quat.shape}') + print(f'calc_vel_from_xyz: {calc_vel_from_xyz.shape}') + calc_vel_from_xyz = calc_vel_from_xyz.permute(0, 2, 3, 1) + calc_vel_from_xyz = calc_vel_from_xyz.reshape((1, 1, -1, 21, 3)).type(th.FloatTensor) + r_rot_quat_adapted = r_rot_quat[..., :-1, None, :].repeat((1,1,1,21,1)).to(calc_vel_from_xyz.device) + print(f'calc_vel_from_xyz: {calc_vel_from_xyz.shape} , {calc_vel_from_xyz.device}') + print(f'r_rot_quat_adapted: {r_rot_quat_adapted.shape}, {r_rot_quat_adapted.device}') + + calc_vel_from_xyz = motion_process.qrot(r_rot_quat_adapted, calc_vel_from_xyz) + calc_vel_from_xyz = calc_vel_from_xyz.reshape((1, 1, -1, 21 * 3)) + calc_vel_from_xyz = calc_vel_from_xyz.permute(0, 3, 1, 2) + print(f'calc_vel_from_xyz: {calc_vel_from_xyz.shape} , {calc_vel_from_xyz.device}') + + import matplotlib.pyplot as plt + for i in range(21): + plt.plot(np.linalg.norm(calc_vel_from_xyz[:,i*3:(i+1)*3,:,:].cpu().detach().numpy().reshape((3, -1)), axis=0), label='Calc Vel') + plt.plot(np.linalg.norm(velocity_from_vector[:,i*3:(i+1)*3,:,:].cpu().detach().numpy().reshape((3, -1)), axis=0), label='Vector Vel') + plt.title(f'Joint idx: {i}') + plt.legend() + plt.show() + print(calc_vel_from_xyz.shape) + print(velocity_from_vector.shape) + diff = calc_vel_from_xyz-velocity_from_vector + print(np.linalg.norm(diff.cpu().detach().numpy().reshape((63, -1)), axis=0)) + + return 0 + + + def _prior_bpd(self, x_start): + """ + Get the prior KL term for the variational lower-bound, measured in + bits-per-dim. + + This term can't be optimized, as it only depends on the encoder. + + :param x_start: the [N x C x ...] tensor of inputs. + :return: a batch of [N] KL values (in bits), one per batch element. + """ + batch_size = x_start.shape[0] + t = th.tensor([self.num_timesteps - 1] * batch_size, device=x_start.device) + qt_mean, _, qt_log_variance = self.q_mean_variance(x_start, t) + kl_prior = normal_kl( + mean1=qt_mean, logvar1=qt_log_variance, mean2=0.0, logvar2=0.0 + ) + return mean_flat(kl_prior) / np.log(2.0) + + def calc_bpd_loop(self, model, x_start, clip_denoised=True, model_kwargs=None): + """ + Compute the entire variational lower-bound, measured in bits-per-dim, + as well as other related quantities. + + :param model: the model to evaluate loss on. + :param x_start: the [N x C x ...] tensor of inputs. + :param clip_denoised: if True, clip denoised samples. + :param model_kwargs: if not None, a dict of extra keyword arguments to + pass to the model. This can be used for conditioning. + + :return: a dict containing the following keys: + - total_bpd: the total variational lower-bound, per batch element. + - prior_bpd: the prior term in the lower-bound. + - vb: an [N x T] tensor of terms in the lower-bound. + - xstart_mse: an [N x T] tensor of x_0 MSEs for each timestep. + - mse: an [N x T] tensor of epsilon MSEs for each timestep. + """ + device = x_start.device + batch_size = x_start.shape[0] + + vb = [] + xstart_mse = [] + mse = [] + for t in list(range(self.num_timesteps))[::-1]: + t_batch = th.tensor([t] * batch_size, device=device) + noise = th.randn_like(x_start) + x_t = self.q_sample(x_start=x_start, t=t_batch, noise=noise) + # Calculate VLB term at the current timestep + with th.no_grad(): + out = self._vb_terms_bpd( + model, + x_start=x_start, + x_t=x_t, + t=t_batch, + clip_denoised=clip_denoised, + model_kwargs=model_kwargs, + ) + vb.append(out["output"]) + xstart_mse.append(mean_flat((out["pred_xstart"] - x_start) ** 2)) + eps = self._predict_eps_from_xstart(x_t, t_batch, out["pred_xstart"]) + mse.append(mean_flat((eps - noise) ** 2)) + + vb = th.stack(vb, dim=1) + xstart_mse = th.stack(xstart_mse, dim=1) + mse = th.stack(mse, dim=1) + + prior_bpd = self._prior_bpd(x_start) + total_bpd = vb.sum(dim=1) + prior_bpd + return { + "total_bpd": total_bpd, + "prior_bpd": prior_bpd, + "vb": vb, + "xstart_mse": xstart_mse, + "mse": mse, + } + + +def _extract_into_tensor(arr, timesteps, broadcast_shape): + """ + Extract values from a 1-D numpy array for a batch of indices. + + :param arr: the 1-D numpy array. + :param timesteps: a tensor of indices into the array to extract. + :param broadcast_shape: a larger shape of K dimensions with the batch + dimension equal to the length of timesteps. + :return: a tensor of shape [batch_size, 1, ...] where the shape has K dims. + """ + res = th.from_numpy(arr).to(device=timesteps.device)[timesteps].float() + while len(res.shape) < len(broadcast_shape): + res = res[..., None] + return res.expand(broadcast_shape) diff --git a/src/mdm/diffusion/logger.py b/src/mdm/diffusion/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..b1d856dcfea6b56a2ee8d37b286887430dbfac30 --- /dev/null +++ b/src/mdm/diffusion/logger.py @@ -0,0 +1,495 @@ +""" +Logger copied from OpenAI baselines to avoid extra RL-based dependencies: +https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/logger.py +""" + +import os +import sys +import shutil +import os.path as osp +import json +import time +import datetime +import tempfile +import warnings +from collections import defaultdict +from contextlib import contextmanager + +DEBUG = 10 +INFO = 20 +WARN = 30 +ERROR = 40 + +DISABLED = 50 + + +class KVWriter(object): + def writekvs(self, kvs): + raise NotImplementedError + + +class SeqWriter(object): + def writeseq(self, seq): + raise NotImplementedError + + +class HumanOutputFormat(KVWriter, SeqWriter): + def __init__(self, filename_or_file): + if isinstance(filename_or_file, str): + self.file = open(filename_or_file, "wt") + self.own_file = True + else: + assert hasattr(filename_or_file, "read"), ( + "expected file or str, got %s" % filename_or_file + ) + self.file = filename_or_file + self.own_file = False + + def writekvs(self, kvs): + # Create strings for printing + key2str = {} + for (key, val) in sorted(kvs.items()): + if hasattr(val, "__float__"): + valstr = "%-8.3g" % val + else: + valstr = str(val) + key2str[self._truncate(key)] = self._truncate(valstr) + + # Find max widths + if len(key2str) == 0: + print("WARNING: tried to write empty key-value dict") + return + else: + keywidth = max(map(len, key2str.keys())) + valwidth = max(map(len, key2str.values())) + + # Write out the data + dashes = "-" * (keywidth + valwidth + 7) + lines = [dashes] + for (key, val) in sorted(key2str.items(), key=lambda kv: kv[0].lower()): + lines.append( + "| %s%s | %s%s |" + % (key, " " * (keywidth - len(key)), val, " " * (valwidth - len(val))) + ) + lines.append(dashes) + self.file.write("\n".join(lines) + "\n") + + # Flush the output to the file + self.file.flush() + + def _truncate(self, s): + maxlen = 30 + return s[: maxlen - 3] + "..." if len(s) > maxlen else s + + def writeseq(self, seq): + seq = list(seq) + for (i, elem) in enumerate(seq): + self.file.write(elem) + if i < len(seq) - 1: # add space unless this is the last one + self.file.write(" ") + self.file.write("\n") + self.file.flush() + + def close(self): + if self.own_file: + self.file.close() + + +class JSONOutputFormat(KVWriter): + def __init__(self, filename): + self.file = open(filename, "wt") + + def writekvs(self, kvs): + for k, v in sorted(kvs.items()): + if hasattr(v, "dtype"): + kvs[k] = float(v) + self.file.write(json.dumps(kvs) + "\n") + self.file.flush() + + def close(self): + self.file.close() + + +class CSVOutputFormat(KVWriter): + def __init__(self, filename): + self.file = open(filename, "w+t") + self.keys = [] + self.sep = "," + + def writekvs(self, kvs): + # Add our current row to the history + extra_keys = list(kvs.keys() - self.keys) + extra_keys.sort() + if extra_keys: + self.keys.extend(extra_keys) + self.file.seek(0) + lines = self.file.readlines() + self.file.seek(0) + for (i, k) in enumerate(self.keys): + if i > 0: + self.file.write(",") + self.file.write(k) + self.file.write("\n") + for line in lines[1:]: + self.file.write(line[:-1]) + self.file.write(self.sep * len(extra_keys)) + self.file.write("\n") + for (i, k) in enumerate(self.keys): + if i > 0: + self.file.write(",") + v = kvs.get(k) + if v is not None: + self.file.write(str(v)) + self.file.write("\n") + self.file.flush() + + def close(self): + self.file.close() + + +class TensorBoardOutputFormat(KVWriter): + """ + Dumps key/value pairs into TensorBoard's numeric format. + """ + + def __init__(self, dir): + os.makedirs(dir, exist_ok=True) + self.dir = dir + self.step = 1 + prefix = "events" + path = osp.join(osp.abspath(dir), prefix) + import tensorflow as tf + from tensorflow.python import pywrap_tensorflow + from tensorflow.core.util import event_pb2 + from tensorflow.python.util import compat + + self.tf = tf + self.event_pb2 = event_pb2 + self.pywrap_tensorflow = pywrap_tensorflow + self.writer = pywrap_tensorflow.EventsWriter(compat.as_bytes(path)) + + def writekvs(self, kvs): + def summary_val(k, v): + kwargs = {"tag": k, "simple_value": float(v)} + return self.tf.Summary.Value(**kwargs) + + summary = self.tf.Summary(value=[summary_val(k, v) for k, v in kvs.items()]) + event = self.event_pb2.Event(wall_time=time.time(), summary=summary) + event.step = ( + self.step + ) # is there any reason why you'd want to specify the step? + self.writer.WriteEvent(event) + self.writer.Flush() + self.step += 1 + + def close(self): + if self.writer: + self.writer.Close() + self.writer = None + + +def make_output_format(format, ev_dir, log_suffix=""): + os.makedirs(ev_dir, exist_ok=True) + if format == "stdout": + return HumanOutputFormat(sys.stdout) + elif format == "log": + return HumanOutputFormat(osp.join(ev_dir, "log%s.txt" % log_suffix)) + elif format == "json": + return JSONOutputFormat(osp.join(ev_dir, "progress%s.json" % log_suffix)) + elif format == "csv": + return CSVOutputFormat(osp.join(ev_dir, "progress%s.csv" % log_suffix)) + elif format == "tensorboard": + return TensorBoardOutputFormat(osp.join(ev_dir, "tb%s" % log_suffix)) + else: + raise ValueError("Unknown format specified: %s" % (format,)) + + +# ================================================================ +# API +# ================================================================ + + +def logkv(key, val): + """ + Log a value of some diagnostic + Call this once for each diagnostic quantity, each iteration + If called many times, last value will be used. + """ + get_current().logkv(key, val) + + +def logkv_mean(key, val): + """ + The same as logkv(), but if called many times, values averaged. + """ + get_current().logkv_mean(key, val) + + +def logkvs(d): + """ + Log a dictionary of key-value pairs + """ + for (k, v) in d.items(): + logkv(k, v) + + +def dumpkvs(): + """ + Write all of the diagnostics from the current iteration + """ + return get_current().dumpkvs() + + +def getkvs(): + return get_current().name2val + + +def log(*args, level=INFO): + """ + Write the sequence of args, with no separators, to the console and output files (if you've configured an output file). + """ + get_current().log(*args, level=level) + + +def debug(*args): + log(*args, level=DEBUG) + + +def info(*args): + log(*args, level=INFO) + + +def warn(*args): + log(*args, level=WARN) + + +def error(*args): + log(*args, level=ERROR) + + +def set_level(level): + """ + Set logging threshold on current logger. + """ + get_current().set_level(level) + + +def set_comm(comm): + get_current().set_comm(comm) + + +def get_dir(): + """ + Get directory that log files are being written to. + will be None if there is no output directory (i.e., if you didn't call start) + """ + return get_current().get_dir() + + +record_tabular = logkv +dump_tabular = dumpkvs + + +@contextmanager +def profile_kv(scopename): + logkey = "wait_" + scopename + tstart = time.time() + try: + yield + finally: + get_current().name2val[logkey] += time.time() - tstart + + +def profile(n): + """ + Usage: + @profile("my_func") + def my_func(): code + """ + + def decorator_with_name(func): + def func_wrapper(*args, **kwargs): + with profile_kv(n): + return func(*args, **kwargs) + + return func_wrapper + + return decorator_with_name + + +# ================================================================ +# Backend +# ================================================================ + + +def get_current(): + if Logger.CURRENT is None: + _configure_default_logger() + + return Logger.CURRENT + + +class Logger(object): + DEFAULT = None # A logger with no output files. (See right below class definition) + # So that you can still log to the terminal without setting up any output files + CURRENT = None # Current logger being used by the free functions above + + def __init__(self, dir, output_formats, comm=None): + self.name2val = defaultdict(float) # values this iteration + self.name2cnt = defaultdict(int) + self.level = INFO + self.dir = dir + self.output_formats = output_formats + self.comm = comm + + # Logging API, forwarded + # ---------------------------------------- + def logkv(self, key, val): + self.name2val[key] = val + + def logkv_mean(self, key, val): + oldval, cnt = self.name2val[key], self.name2cnt[key] + self.name2val[key] = oldval * cnt / (cnt + 1) + val / (cnt + 1) + self.name2cnt[key] = cnt + 1 + + def dumpkvs(self): + if self.comm is None: + d = self.name2val + else: + d = mpi_weighted_mean( + self.comm, + { + name: (val, self.name2cnt.get(name, 1)) + for (name, val) in self.name2val.items() + }, + ) + if self.comm.rank != 0: + d["dummy"] = 1 # so we don't get a warning about empty dict + out = d.copy() # Return the dict for unit testing purposes + for fmt in self.output_formats: + if isinstance(fmt, KVWriter): + fmt.writekvs(d) + self.name2val.clear() + self.name2cnt.clear() + return out + + def log(self, *args, level=INFO): + if self.level <= level: + self._do_log(args) + + # Configuration + # ---------------------------------------- + def set_level(self, level): + self.level = level + + def set_comm(self, comm): + self.comm = comm + + def get_dir(self): + return self.dir + + def close(self): + for fmt in self.output_formats: + fmt.close() + + # Misc + # ---------------------------------------- + def _do_log(self, args): + for fmt in self.output_formats: + if isinstance(fmt, SeqWriter): + fmt.writeseq(map(str, args)) + + +def get_rank_without_mpi_import(): + # check environment variables here instead of importing mpi4py + # to avoid calling MPI_Init() when this module is imported + for varname in ["PMI_RANK", "OMPI_COMM_WORLD_RANK"]: + if varname in os.environ: + return int(os.environ[varname]) + return 0 + + +def mpi_weighted_mean(comm, local_name2valcount): + """ + Copied from: https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/mpi_util.py#L110 + Perform a weighted average over dicts that are each on a different node + Input: local_name2valcount: dict mapping key -> (value, count) + Returns: key -> mean + """ + all_name2valcount = comm.gather(local_name2valcount) + if comm.rank == 0: + name2sum = defaultdict(float) + name2count = defaultdict(float) + for n2vc in all_name2valcount: + for (name, (val, count)) in n2vc.items(): + try: + val = float(val) + except ValueError: + if comm.rank == 0: + warnings.warn( + "WARNING: tried to compute mean on non-float {}={}".format( + name, val + ) + ) + else: + name2sum[name] += val * count + name2count[name] += count + return {name: name2sum[name] / name2count[name] for name in name2sum} + else: + return {} + + +def configure(dir=None, format_strs=None, comm=None, log_suffix=""): + """ + If comm is provided, average all numerical stats across that comm + """ + if dir is None: + dir = os.getenv("OPENAI_LOGDIR") + if dir is None: + dir = osp.join( + tempfile.gettempdir(), + datetime.datetime.now().strftime("openai-%Y-%m-%d-%H-%M-%S-%f"), + ) + assert isinstance(dir, str) + dir = os.path.expanduser(dir) + os.makedirs(os.path.expanduser(dir), exist_ok=True) + + rank = get_rank_without_mpi_import() + if rank > 0: + log_suffix = log_suffix + "-rank%03i" % rank + + if format_strs is None: + if rank == 0: + format_strs = os.getenv("OPENAI_LOG_FORMAT", "stdout,log,csv").split(",") + else: + format_strs = os.getenv("OPENAI_LOG_FORMAT_MPI", "log").split(",") + format_strs = filter(None, format_strs) + output_formats = [make_output_format(f, dir, log_suffix) for f in format_strs] + + Logger.CURRENT = Logger(dir=dir, output_formats=output_formats, comm=comm) + if output_formats: + log("Logging to %s" % dir) + + +def _configure_default_logger(): + configure() + Logger.DEFAULT = Logger.CURRENT + + +def reset(): + if Logger.CURRENT is not Logger.DEFAULT: + Logger.CURRENT.close() + Logger.CURRENT = Logger.DEFAULT + log("Reset logger") + + +@contextmanager +def scoped_configure(dir=None, format_strs=None, comm=None): + prevlogger = Logger.CURRENT + configure(dir=dir, format_strs=format_strs, comm=comm) + try: + yield + finally: + Logger.CURRENT.close() + Logger.CURRENT = prevlogger + diff --git a/src/mdm/diffusion/losses.py b/src/mdm/diffusion/losses.py new file mode 100644 index 0000000000000000000000000000000000000000..e3fded1953584eaaf183f3d2399be545a5003e0a --- /dev/null +++ b/src/mdm/diffusion/losses.py @@ -0,0 +1,77 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Helpers for various likelihood-based losses. These are ported from the original +Ho et al. diffusion models codebase: +https://github.com/hojonathanho/diffusion/blob/1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/utils.py +""" + +import numpy as np +import torch as th + + +def normal_kl(mean1, logvar1, mean2, logvar2): + """ + Compute the KL divergence between two gaussians. + + Shapes are automatically broadcasted, so batches can be compared to + scalars, among other use cases. + """ + tensor = None + for obj in (mean1, logvar1, mean2, logvar2): + if isinstance(obj, th.Tensor): + tensor = obj + break + assert tensor is not None, "at least one argument must be a Tensor" + + # Force variances to be Tensors. Broadcasting helps convert scalars to + # Tensors, but it does not work for th.exp(). + logvar1, logvar2 = [ + x if isinstance(x, th.Tensor) else th.tensor(x).to(tensor) + for x in (logvar1, logvar2) + ] + + return 0.5 * ( + -1.0 + + logvar2 + - logvar1 + + th.exp(logvar1 - logvar2) + + ((mean1 - mean2) ** 2) * th.exp(-logvar2) + ) + + +def approx_standard_normal_cdf(x): + """ + A fast approximation of the cumulative distribution function of the + standard normal. + """ + return 0.5 * (1.0 + th.tanh(np.sqrt(2.0 / np.pi) * (x + 0.044715 * th.pow(x, 3)))) + + +def discretized_gaussian_log_likelihood(x, *, means, log_scales): + """ + Compute the log-likelihood of a Gaussian distribution discretizing to a + given image. + + :param x: the target images. It is assumed that this was uint8 values, + rescaled to the range [-1, 1]. + :param means: the Gaussian mean Tensor. + :param log_scales: the Gaussian log stddev Tensor. + :return: a tensor like x of log probabilities (in nats). + """ + assert x.shape == means.shape == log_scales.shape + centered_x = x - means + inv_stdv = th.exp(-log_scales) + plus_in = inv_stdv * (centered_x + 1.0 / 255.0) + cdf_plus = approx_standard_normal_cdf(plus_in) + min_in = inv_stdv * (centered_x - 1.0 / 255.0) + cdf_min = approx_standard_normal_cdf(min_in) + log_cdf_plus = th.log(cdf_plus.clamp(min=1e-12)) + log_one_minus_cdf_min = th.log((1.0 - cdf_min).clamp(min=1e-12)) + cdf_delta = cdf_plus - cdf_min + log_probs = th.where( + x < -0.999, + log_cdf_plus, + th.where(x > 0.999, log_one_minus_cdf_min, th.log(cdf_delta.clamp(min=1e-12))), + ) + assert log_probs.shape == x.shape + return log_probs diff --git a/src/mdm/diffusion/nn.py b/src/mdm/diffusion/nn.py new file mode 100644 index 0000000000000000000000000000000000000000..41c18e7dd3d8cae1e719638e87c27f718f6a94e6 --- /dev/null +++ b/src/mdm/diffusion/nn.py @@ -0,0 +1,197 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Various utilities for neural networks. +""" + +import math + +import torch as th +import torch.nn as nn + + +# PyTorch 1.7 has SiLU, but we support PyTorch 1.5. +class SiLU(nn.Module): + def forward(self, x): + return x * th.sigmoid(x) + + +class GroupNorm32(nn.GroupNorm): + def forward(self, x): + return super().forward(x.float()).type(x.dtype) + + +def conv_nd(dims, *args, **kwargs): + """ + Create a 1D, 2D, or 3D convolution module. + """ + if dims == 1: + return nn.Conv1d(*args, **kwargs) + elif dims == 2: + return nn.Conv2d(*args, **kwargs) + elif dims == 3: + return nn.Conv3d(*args, **kwargs) + raise ValueError(f"unsupported dimensions: {dims}") + + +def linear(*args, **kwargs): + """ + Create a linear module. + """ + return nn.Linear(*args, **kwargs) + + +def avg_pool_nd(dims, *args, **kwargs): + """ + Create a 1D, 2D, or 3D average pooling module. + """ + if dims == 1: + return nn.AvgPool1d(*args, **kwargs) + elif dims == 2: + return nn.AvgPool2d(*args, **kwargs) + elif dims == 3: + return nn.AvgPool3d(*args, **kwargs) + raise ValueError(f"unsupported dimensions: {dims}") + + +def update_ema(target_params, source_params, rate=0.99): + """ + Update target parameters to be closer to those of source parameters using + an exponential moving average. + + :param target_params: the target parameter sequence. + :param source_params: the source parameter sequence. + :param rate: the EMA rate (closer to 1 means slower). + """ + for targ, src in zip(target_params, source_params): + targ.detach().mul_(rate).add_(src, alpha=1 - rate) + + +def zero_module(module): + """ + Zero out the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().zero_() + return module + + +def scale_module(module, scale): + """ + Scale the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().mul_(scale) + return module + + +def mean_flat(tensor): + """ + Take the mean over all non-batch dimensions. + """ + return tensor.mean(dim=list(range(1, len(tensor.shape)))) + +def sum_flat(tensor): + """ + Take the sum over all non-batch dimensions. + """ + return tensor.sum(dim=list(range(1, len(tensor.shape)))) + + +def normalization(channels): + """ + Make a standard normalization layer. + + :param channels: number of input channels. + :return: an nn.Module for normalization. + """ + return GroupNorm32(32, channels) + + +def timestep_embedding(timesteps, dim, max_period=10000): + """ + Create sinusoidal timestep embeddings. + + :param timesteps: a 1-D Tensor of N indices, one per batch element. + These may be fractional. + :param dim: the dimension of the output. + :param max_period: controls the minimum frequency of the embeddings. + :return: an [N x dim] Tensor of positional embeddings. + """ + half = dim // 2 + freqs = th.exp( + -math.log(max_period) * th.arange(start=0, end=half, dtype=th.float32) / half + ).to(device=timesteps.device) + args = timesteps[:, None].float() * freqs[None] + embedding = th.cat([th.cos(args), th.sin(args)], dim=-1) + if dim % 2: + embedding = th.cat([embedding, th.zeros_like(embedding[:, :1])], dim=-1) + return embedding + + +def checkpoint(func, inputs, params, flag): + """ + Evaluate a function without caching intermediate activations, allowing for + reduced memory at the expense of extra compute in the backward pass. + :param func: the function to evaluate. + :param inputs: the argument sequence to pass to `func`. + :param params: a sequence of parameters `func` depends on but does not + explicitly take as arguments. + :param flag: if False, disable gradient checkpointing. + """ + if flag: + args = tuple(inputs) + tuple(params) + return CheckpointFunction.apply(func, len(inputs), *args) + else: + return func(*inputs) + + +class CheckpointFunction(th.autograd.Function): + @staticmethod + @th.cuda.amp.custom_fwd + def forward(ctx, run_function, length, *args): + ctx.run_function = run_function + ctx.input_length = length + ctx.save_for_backward(*args) + with th.no_grad(): + output_tensors = ctx.run_function(*args[:length]) + return output_tensors + + @staticmethod + @th.cuda.amp.custom_bwd + def backward(ctx, *output_grads): + args = list(ctx.saved_tensors) + + # Filter for inputs that require grad. If none, exit early. + input_indices = [i for (i, x) in enumerate(args) if x.requires_grad] + if not input_indices: + return (None, None) + tuple(None for _ in args) + + with th.enable_grad(): + for i in input_indices: + if i < ctx.input_length: + # Not sure why the OAI code does this little + # dance. It might not be necessary. + args[i] = args[i].detach().requires_grad_() + args[i] = args[i].view_as(args[i]) + output_tensors = ctx.run_function(*args[:ctx.input_length]) + + if isinstance(output_tensors, th.Tensor): + output_tensors = [output_tensors] + + # Filter for outputs that require grad. If none, exit early. + out_and_grads = [(o, g) for (o, g) in zip(output_tensors, output_grads) if o.requires_grad] + if not out_and_grads: + return (None, None) + tuple(None for _ in args) + + # Compute gradients on the filtered tensors. + computed_grads = th.autograd.grad( + [o for (o, g) in out_and_grads], + [args[i] for i in input_indices], + [g for (o, g) in out_and_grads] + ) + + # Reassemble the complete gradient tuple. + input_grads = [None for _ in args] + for (i, g) in zip(input_indices, computed_grads): + input_grads[i] = g + return (None, None) + tuple(input_grads) diff --git a/src/mdm/diffusion/resample.py b/src/mdm/diffusion/resample.py new file mode 100644 index 0000000000000000000000000000000000000000..c82eccdcd47c468d41e7cbe02de6a731f2c9bf81 --- /dev/null +++ b/src/mdm/diffusion/resample.py @@ -0,0 +1,154 @@ +from abc import ABC, abstractmethod + +import numpy as np +import torch as th +import torch.distributed as dist + + +def create_named_schedule_sampler(name, diffusion): + """ + Create a ScheduleSampler from a library of pre-defined samplers. + + :param name: the name of the sampler. + :param diffusion: the diffusion object to sample for. + """ + if name == "uniform": + return UniformSampler(diffusion) + elif name == "loss-second-moment": + return LossSecondMomentResampler(diffusion) + else: + raise NotImplementedError(f"unknown schedule sampler: {name}") + + +class ScheduleSampler(ABC): + """ + A distribution over timesteps in the diffusion process, intended to reduce + variance of the objective. + + By default, samplers perform unbiased importance sampling, in which the + objective's mean is unchanged. + However, subclasses may override sample() to change how the resampled + terms are reweighted, allowing for actual changes in the objective. + """ + + @abstractmethod + def weights(self): + """ + Get a numpy array of weights, one per diffusion step. + + The weights needn't be normalized, but must be positive. + """ + + def sample(self, batch_size, device): + """ + Importance-sample timesteps for a batch. + + :param batch_size: the number of timesteps. + :param device: the torch device to save to. + :return: a tuple (timesteps, weights): + - timesteps: a tensor of timestep indices. + - weights: a tensor of weights to scale the resulting losses. + """ + w = self.weights() + p = w / np.sum(w) + indices_np = np.random.choice(len(p), size=(batch_size,), p=p) + indices = th.from_numpy(indices_np).long().to(device) + weights_np = 1 / (len(p) * p[indices_np]) + weights = th.from_numpy(weights_np).float().to(device) + return indices, weights + + +class UniformSampler(ScheduleSampler): + def __init__(self, diffusion): + self.diffusion = diffusion + self._weights = np.ones([diffusion.num_timesteps]) + + def weights(self): + return self._weights + + +class LossAwareSampler(ScheduleSampler): + def update_with_local_losses(self, local_ts, local_losses): + """ + Update the reweighting using losses from a model. + + Call this method from each rank with a batch of timesteps and the + corresponding losses for each of those timesteps. + This method will perform synchronization to make sure all of the ranks + maintain the exact same reweighting. + + :param local_ts: an integer Tensor of timesteps. + :param local_losses: a 1D Tensor of losses. + """ + batch_sizes = [ + th.tensor([0], dtype=th.int32, device=local_ts.device) + for _ in range(dist.get_world_size()) + ] + dist.all_gather( + batch_sizes, + th.tensor([len(local_ts)], dtype=th.int32, device=local_ts.device), + ) + + # Pad all_gather batches to be the maximum batch size. + batch_sizes = [x.item() for x in batch_sizes] + max_bs = max(batch_sizes) + + timestep_batches = [th.zeros(max_bs).to(local_ts) for bs in batch_sizes] + loss_batches = [th.zeros(max_bs).to(local_losses) for bs in batch_sizes] + dist.all_gather(timestep_batches, local_ts) + dist.all_gather(loss_batches, local_losses) + timesteps = [ + x.item() for y, bs in zip(timestep_batches, batch_sizes) for x in y[:bs] + ] + losses = [x.item() for y, bs in zip(loss_batches, batch_sizes) for x in y[:bs]] + self.update_with_all_losses(timesteps, losses) + + @abstractmethod + def update_with_all_losses(self, ts, losses): + """ + Update the reweighting using losses from a model. + + Sub-classes should override this method to update the reweighting + using losses from the model. + + This method directly updates the reweighting without synchronizing + between workers. It is called by update_with_local_losses from all + ranks with identical arguments. Thus, it should have deterministic + behavior to maintain state across workers. + + :param ts: a list of int timesteps. + :param losses: a list of float losses, one per timestep. + """ + + +class LossSecondMomentResampler(LossAwareSampler): + def __init__(self, diffusion, history_per_term=10, uniform_prob=0.001): + self.diffusion = diffusion + self.history_per_term = history_per_term + self.uniform_prob = uniform_prob + self._loss_history = np.zeros( + [diffusion.num_timesteps, history_per_term], dtype=np.float64 + ) + self._loss_counts = np.zeros([diffusion.num_timesteps], dtype=np.int) + + def weights(self): + if not self._warmed_up(): + return np.ones([self.diffusion.num_timesteps], dtype=np.float64) + weights = np.sqrt(np.mean(self._loss_history ** 2, axis=-1)) + weights /= np.sum(weights) + weights *= 1 - self.uniform_prob + weights += self.uniform_prob / len(weights) + return weights + + def update_with_all_losses(self, ts, losses): + for t, loss in zip(ts, losses): + if self._loss_counts[t] == self.history_per_term: + # Shift out the oldest loss term. + self._loss_history[t, :-1] = self._loss_history[t, 1:] + self._loss_history[t, -1] = loss + else: + self._loss_history[t, self._loss_counts[t]] = loss + self._loss_counts[t] += 1 + + def _warmed_up(self): + return (self._loss_counts == self.history_per_term).all() diff --git a/src/mdm/diffusion/respace.py b/src/mdm/diffusion/respace.py new file mode 100644 index 0000000000000000000000000000000000000000..8b1194d79b9c4ee5b88407df414d1524d4d31525 --- /dev/null +++ b/src/mdm/diffusion/respace.py @@ -0,0 +1,134 @@ +# This code is based on https://github.com/openai/guided-diffusion +import numpy as np +import torch as th + +from .gaussian_diffusion import GaussianDiffusion +from utils.misc import wrapped_getattr + + +def space_timesteps(num_timesteps, section_counts): + """ + Create a list of timesteps to use from an original diffusion process, + given the number of timesteps we want to take from equally-sized portions + of the original process. + + For example, if there's 300 timesteps and the section counts are [10,15,20] + then the first 100 timesteps are strided to be 10 timesteps, the second 100 + are strided to be 15 timesteps, and the final 100 are strided to be 20. + + If the stride is a string starting with "ddim", then the fixed striding + from the DDIM paper is used, and only one section is allowed. + + :param num_timesteps: the number of diffusion steps in the original + process to divide up. + :param section_counts: either a list of numbers, or a string containing + comma-separated numbers, indicating the step count + per section. As a special case, use "ddimN" where N + is a number of steps to use the striding from the + DDIM paper. + :return: a set of diffusion steps from the original process to use. + """ + if isinstance(section_counts, str): + if section_counts.startswith("ddim"): + desired_count = int(section_counts[len("ddim") :]) + for i in range(1, num_timesteps): + if len(range(0, num_timesteps, i)) == desired_count: + return set(range(0, num_timesteps, i)) + raise ValueError( + f"cannot create exactly {num_timesteps} steps with an integer stride" + ) + section_counts = [int(x) for x in section_counts.split(",")] + size_per = num_timesteps // len(section_counts) + extra = num_timesteps % len(section_counts) + start_idx = 0 + all_steps = [] + for i, section_count in enumerate(section_counts): + size = size_per + (1 if i < extra else 0) + if size < section_count: + raise ValueError( + f"cannot divide section of {size} steps into {section_count}" + ) + if section_count <= 1: + frac_stride = 1 + else: + frac_stride = (size - 1) / (section_count - 1) + cur_idx = 0.0 + taken_steps = [] + for _ in range(section_count): + taken_steps.append(start_idx + round(cur_idx)) + cur_idx += frac_stride + all_steps += taken_steps + start_idx += size + return set(all_steps) + + +class SpacedDiffusion(GaussianDiffusion): + """ + A diffusion process which can skip steps in a base diffusion process. + + :param use_timesteps: a collection (sequence or set) of timesteps from the + original diffusion process to retain. + :param kwargs: the kwargs to create the base diffusion process. + """ + + def __init__(self, use_timesteps, **kwargs): + self.use_timesteps = set(use_timesteps) + self.timestep_map = [] + self.original_num_steps = len(kwargs["betas"]) + + base_diffusion = GaussianDiffusion(**kwargs) # pylint: disable=missing-kwoa + last_alpha_cumprod = 1.0 + new_betas = [] + for i, alpha_cumprod in enumerate(base_diffusion.alphas_cumprod): + if i in self.use_timesteps: + new_betas.append(1 - alpha_cumprod / last_alpha_cumprod) + last_alpha_cumprod = alpha_cumprod + self.timestep_map.append(i) + kwargs["betas"] = np.array(new_betas) + super().__init__(**kwargs) + + def p_mean_variance( + self, model, *args, **kwargs + ): # pylint: disable=signature-differs + return super().p_mean_variance(self._wrap_model(model), *args, **kwargs) + + def training_losses( + self, model, *args, **kwargs + ): # pylint: disable=signature-differs + return super().training_losses(self._wrap_model(model), *args, **kwargs) + + def condition_mean(self, cond_fn, *args, **kwargs): + return super().condition_mean(self._wrap_model(cond_fn), *args, **kwargs) + + def condition_score(self, cond_fn, *args, **kwargs): + return super().condition_score(self._wrap_model(cond_fn), *args, **kwargs) + + def _wrap_model(self, model): + if isinstance(model, _WrappedModel): + return model + return _WrappedModel( + model, self.timestep_map, self.rescale_timesteps, self.original_num_steps + ) + + def _scale_timesteps(self, t): + # Scaling is done by the wrapped model. + return t + + +class _WrappedModel: + def __init__(self, model, timestep_map, rescale_timesteps, original_num_steps): + self.model = model + self.timestep_map = timestep_map + self.rescale_timesteps = rescale_timesteps + self.original_num_steps = original_num_steps + + def __call__(self, x, ts, **kwargs): + map_tensor = th.tensor(self.timestep_map, device=ts.device, dtype=ts.dtype) + new_ts = map_tensor[ts] + if self.rescale_timesteps: + new_ts = new_ts.float() * (1000.0 / self.original_num_steps) + return self.model(x, new_ts, **kwargs) + + def __getattr__(self, name, default=None): + # this method is reached only if name is not in self.__dict__. + return wrapped_getattr(self, name, default) diff --git a/src/mdm/environment.yml b/src/mdm/environment.yml new file mode 100644 index 0000000000000000000000000000000000000000..5c1d874b4335de68229f27da251314eafef61d3f --- /dev/null +++ b/src/mdm/environment.yml @@ -0,0 +1,137 @@ +name: mdm +channels: + - pytorch + - anaconda + - conda-forge + - defaults +dependencies: + - _libgcc_mutex=0.1=main + - _openmp_mutex=5.1=1_gnu + - beautifulsoup4=4.11.1=pyha770c72_0 + - blas=1.0=mkl + - brotlipy=0.7.0=py37h540881e_1004 + - ca-certificates=2022.07.19=h06a4308_0 + - catalogue=2.0.8=py37h89c1867_0 + - certifi=2022.6.15=py37h06a4308_0 + - cffi=1.15.1=py37h74dc2b5_0 + - charset-normalizer=2.1.1=pyhd8ed1ab_0 + - colorama=0.4.5=pyhd8ed1ab_0 + - cryptography=35.0.0=py37hf1a17b8_2 + - cudatoolkit=11.0.221=h6bb024c_0 + - cycler=0.11.0=pyhd3eb1b0_0 + - cymem=2.0.6=py37hd23a5d3_3 + - dataclasses=0.8=pyhc8e2a94_3 + - dbus=1.13.18=hb2f20db_0 + - expat=2.4.9=h6a678d5_0 + - fftw=3.3.9=h27cfd23_1 + - filelock=3.8.0=pyhd8ed1ab_0 + - fontconfig=2.13.1=h6c09931_0 + - freetype=2.11.0=h70c0345_0 + - gdown=4.5.1=pyhd8ed1ab_0 + - giflib=5.2.1=h7b6447c_0 + - glib=2.69.1=h4ff587b_1 + - gst-plugins-base=1.14.0=h8213a91_2 + - gstreamer=1.14.0=h28cd5cc_2 + - h5py=3.7.0=py37h737f45e_0 + - hdf5=1.10.6=h3ffc7dd_1 + - icu=58.2=he6710b0_3 + - idna=3.4=pyhd8ed1ab_0 + - intel-openmp=2021.4.0=h06a4308_3561 + - jinja2=3.1.2=pyhd8ed1ab_1 + - joblib=1.1.0=pyhd3eb1b0_0 + - jpeg=9b=h024ee3a_2 + - kiwisolver=1.4.2=py37h295c915_0 + - langcodes=3.3.0=pyhd8ed1ab_0 + - lcms2=2.12=h3be6417_0 + - ld_impl_linux-64=2.38=h1181459_1 + - libffi=3.3=he6710b0_2 + - libgcc-ng=11.2.0=h1234567_1 + - libgfortran-ng=11.2.0=h00389a5_1 + - libgfortran5=11.2.0=h1234567_1 + - libgomp=11.2.0=h1234567_1 + - libpng=1.6.37=hbc83047_0 + - libstdcxx-ng=11.2.0=h1234567_1 + - libtiff=4.1.0=h2733197_1 + - libuuid=1.0.3=h7f8727e_2 + - libuv=1.40.0=h7b6447c_0 + - libwebp=1.2.0=h89dd481_0 + - libxcb=1.15=h7f8727e_0 + - libxml2=2.9.14=h74e7548_0 + - lz4-c=1.9.3=h295c915_1 + - markupsafe=2.1.1=py37h540881e_1 + - matplotlib=3.1.3=py37_0 + - matplotlib-base=3.1.3=py37hef1b27d_0 + - mkl=2021.4.0=h06a4308_640 + - mkl-service=2.4.0=py37h7f8727e_0 + - mkl_fft=1.3.1=py37hd3c417c_0 + - mkl_random=1.2.2=py37h51133e4_0 + - ncurses=6.3=h5eee18b_3 + - ninja=1.10.2=h06a4308_5 + - ninja-base=1.10.2=hd09550d_5 + - numpy=1.21.5=py37h6c91a56_3 + - numpy-base=1.21.5=py37ha15fc14_3 + - openssl=1.1.1q=h7f8727e_0 + - packaging=21.3=pyhd8ed1ab_0 + - pathy=0.6.2=pyhd8ed1ab_0 + - pcre=8.45=h295c915_0 + - pillow=9.2.0=py37hace64e9_1 + - pip=22.2.2=py37h06a4308_0 + - pycparser=2.21=pyhd8ed1ab_0 + - pydantic=1.8.2=py37h5e8e339_2 + - pyopenssl=22.0.0=pyhd8ed1ab_1 + - pyparsing=3.0.9=py37h06a4308_0 + - pyqt=5.9.2=py37h05f1152_2 + - pysocks=1.7.1=py37h89c1867_5 + - python=3.7.13=h12debd9_0 + - python-dateutil=2.8.2=pyhd3eb1b0_0 + - python_abi=3.7=2_cp37m + - pytorch=1.7.1=py3.7_cuda11.0.221_cudnn8.0.5_0 + - qt=5.9.7=h5867ecd_1 + - readline=8.1.2=h7f8727e_1 + - requests=2.28.1=pyhd8ed1ab_1 + - scikit-learn=1.0.2=py37h51133e4_1 + - scipy=1.7.3=py37h6c91a56_2 + - setuptools=63.4.1=py37h06a4308_0 + - shellingham=1.5.0=pyhd8ed1ab_0 + - sip=4.19.8=py37hf484d3e_0 + - six=1.16.0=pyhd3eb1b0_1 + - smart_open=5.2.1=pyhd8ed1ab_0 + - soupsieve=2.3.2.post1=pyhd8ed1ab_0 + - spacy=3.3.1=py37h79cecc1_0 + - spacy-legacy=3.0.10=pyhd8ed1ab_0 + - spacy-loggers=1.0.3=pyhd8ed1ab_0 + - sqlite=3.39.3=h5082296_0 + - threadpoolctl=2.2.0=pyh0d69192_0 + - tk=8.6.12=h1ccaba5_0 + - torchaudio=0.7.2=py37 + - torchvision=0.8.2=py37_cu110 + - tornado=6.2=py37h5eee18b_0 + - tqdm=4.64.1=py37h06a4308_0 + - trimesh=3.15.3=pyh1a96a4e_0 + - typer=0.4.2=pyhd8ed1ab_0 + - wandb=0.15.12=pyhd8ed1ab_0 + - wheel=0.37.1=pyhd3eb1b0_0 + - xz=5.2.6=h5eee18b_0 + - zipp=3.8.1=pyhd8ed1ab_0 + - zlib=1.2.12=h5eee18b_3 + - zstd=1.4.9=haebb681_0 + - pip: + - blis==0.7.8 + - chumpy==0.70 + - click==8.1.3 + - confection==0.0.2 + - ftfy==6.1.1 + - importlib-metadata==5.0.0 + - lxml==4.9.1 + - murmurhash==1.0.8 + - preshed==3.0.7 + - pycryptodomex==3.15.0 + - regex==2022.9.13 + - smplx==0.1.28 + - srsly==2.4.4 + - thinc==8.0.17 + - typing-extensions==4.1.1 + - urllib3==1.26.12 + - wasabi==0.10.1 + - wcwidth==0.2.5 +prefix: mdm diff --git a/src/mdm/eval/a2m/__init__.py b/src/mdm/eval/a2m/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/mdm/eval/a2m/action2motion/accuracy.py b/src/mdm/eval/a2m/action2motion/accuracy.py new file mode 100644 index 0000000000000000000000000000000000000000..31ac61bc1a2791587e78febb64f2df73227c2111 --- /dev/null +++ b/src/mdm/eval/a2m/action2motion/accuracy.py @@ -0,0 +1,14 @@ +import torch + + +def calculate_accuracy(model, motion_loader, num_labels, classifier, device): + confusion = torch.zeros(num_labels, num_labels, dtype=torch.long) + with torch.no_grad(): + for batch in motion_loader: + batch_prob = classifier(batch["output_xyz"], lengths=batch["lengths"]) + batch_pred = batch_prob.max(dim=1).indices + for label, pred in zip(batch["y"], batch_pred): + confusion[label][pred] += 1 + + accuracy = torch.trace(confusion)/torch.sum(confusion) + return accuracy.item(), confusion diff --git a/src/mdm/eval/a2m/action2motion/diversity.py b/src/mdm/eval/a2m/action2motion/diversity.py new file mode 100644 index 0000000000000000000000000000000000000000..c20110803756bb60fb299a2f773608ccea4faeca --- /dev/null +++ b/src/mdm/eval/a2m/action2motion/diversity.py @@ -0,0 +1,66 @@ +import torch +import numpy as np + + +#adapted from action2motion +def calculate_diversity(activations): + diversity_times = 200 + num_motions = len(activations) + + diversity = 0 + + first_indices = np.random.randint(0, num_motions, diversity_times) + second_indices = np.random.randint(0, num_motions, diversity_times) + for first_idx, second_idx in zip(first_indices, second_indices): + diversity += torch.dist(activations[first_idx, :], + activations[second_idx, :]) + diversity /= diversity_times + return diversity + +# from action2motion +def calculate_diversity_multimodality(activations, labels, num_labels, unconstrained = False): + diversity_times = 200 + multimodality_times = 20 + if not unconstrained: + labels = labels.long() + num_motions = activations.shape[0] # len(labels) + + diversity = 0 + + first_indices = np.random.randint(0, num_motions, diversity_times) + second_indices = np.random.randint(0, num_motions, diversity_times) + for first_idx, second_idx in zip(first_indices, second_indices): + diversity += torch.dist(activations[first_idx, :], + activations[second_idx, :]) + diversity /= diversity_times + + if not unconstrained: + multimodality = 0 + label_quotas = np.zeros(num_labels) + label_quotas[labels.unique()] = multimodality_times # if a label does not appear in batch, its quota remains zero + while np.any(label_quotas > 0): + # print(label_quotas) + first_idx = np.random.randint(0, num_motions) + first_label = labels[first_idx] + if not label_quotas[first_label]: + continue + + second_idx = np.random.randint(0, num_motions) + second_label = labels[second_idx] + while first_label != second_label: + second_idx = np.random.randint(0, num_motions) + second_label = labels[second_idx] + + label_quotas[first_label] -= 1 + + first_activation = activations[first_idx, :] + second_activation = activations[second_idx, :] + multimodality += torch.dist(first_activation, + second_activation) + + multimodality /= (multimodality_times * num_labels) + else: + multimodality = torch.tensor(np.nan) + + return diversity.item(), multimodality.item() + diff --git a/src/mdm/eval/a2m/action2motion/evaluate.py b/src/mdm/eval/a2m/action2motion/evaluate.py new file mode 100644 index 0000000000000000000000000000000000000000..75f1325ea4fd3d2acecc868905bf93a7c40e27cd --- /dev/null +++ b/src/mdm/eval/a2m/action2motion/evaluate.py @@ -0,0 +1,84 @@ +import torch +import numpy as np +from .models import load_classifier, load_classifier_for_fid +from .accuracy import calculate_accuracy +from .fid import calculate_fid +from .diversity import calculate_diversity_multimodality + + +class A2MEvaluation: + def __init__(self, device): + dataset_opt = {"input_size_raw": 72, "joints_num": 24, "num_classes": 12} + + self.input_size_raw = dataset_opt["input_size_raw"] + self.num_classes = dataset_opt["num_classes"] + self.device = device + + self.gru_classifier_for_fid = load_classifier_for_fid(self.input_size_raw, self.num_classes, device).eval() + self.gru_classifier = load_classifier(self.input_size_raw, self.num_classes, device).eval() + + def compute_features(self, model, motionloader): + # calculate_activations_labels function from action2motion + activations = [] + labels = [] + with torch.no_grad(): + for idx, batch in enumerate(motionloader): + activations.append(self.gru_classifier_for_fid(batch["output_xyz"], lengths=batch["lengths"])) + if model.cond_mode != 'no_cond': + labels.append(batch["y"]) + activations = torch.cat(activations, dim=0) + if model.cond_mode != 'no_cond': + labels = torch.cat(labels, dim=0) + return activations, labels + + @staticmethod + def calculate_activation_statistics(activations): + activations = activations.cpu().numpy() + mu = np.mean(activations, axis=0) + sigma = np.cov(activations, rowvar=False) + return mu, sigma + + def evaluate(self, model, loaders): + + def print_logs(metric, key): + print(f"Computing action2motion {metric} on the {key} loader ...") + + metrics = {} + + computedfeats = {} + for key, loader in loaders.items(): + metric = "accuracy" + print_logs(metric, key) + mkey = f"{metric}_{key}" + if model.cond_mode != 'no_cond': + metrics[mkey], _ = calculate_accuracy(model, loader, + self.num_classes, + self.gru_classifier, self.device) + else: + metrics[mkey] = np.nan + + # features for diversity + print_logs("features", key) + feats, labels = self.compute_features(model, loader) + print_logs("stats", key) + stats = self.calculate_activation_statistics(feats) + + computedfeats[key] = {"feats": feats, + "labels": labels, + "stats": stats} + + print_logs("diversity", key) + ret = calculate_diversity_multimodality(feats, labels, self.num_classes, unconstrained=(model.cond_mode=='no_cond')) + metrics[f"diversity_{key}"], metrics[f"multimodality_{key}"] = ret + + # taking the stats of the ground truth and remove it from the computed feats + gtstats = computedfeats["gt"]["stats"] + # computing fid + for key, loader in computedfeats.items(): + metric = "fid" + mkey = f"{metric}_{key}" + + stats = computedfeats[key]["stats"] + metrics[mkey] = float(calculate_fid(gtstats, stats)) + + return metrics diff --git a/src/mdm/eval/a2m/action2motion/fid.py b/src/mdm/eval/a2m/action2motion/fid.py new file mode 100644 index 0000000000000000000000000000000000000000..4302e6b2808e87e3d9d4d8080db89d1b03e45f85 --- /dev/null +++ b/src/mdm/eval/a2m/action2motion/fid.py @@ -0,0 +1,61 @@ +import numpy as np +from scipy import linalg + + +# from action2motion +def calculate_fid(statistics_1, statistics_2): + return calculate_frechet_distance(statistics_1[0], statistics_1[1], + statistics_2[0], statistics_2[1]) + + +def calculate_frechet_distance(mu1, sigma1, mu2, sigma2, eps=1e-6): + """Numpy implementation of the Frechet Distance. + The Frechet distance between two multivariate Gaussians X_1 ~ N(mu_1, C_1) + and X_2 ~ N(mu_2, C_2) is + d^2 = ||mu_1 - mu_2||^2 + Tr(C_1 + C_2 - 2*sqrt(C_1*C_2)). + Stable version by Dougal J. Sutherland. + Params: + -- mu1 : Numpy array containing the activations of a layer of the + inception net (like returned by the function 'get_predictions') + for generated samples. + -- mu2 : The sample mean over activations, precalculated on an + representative data set. + -- sigma1: The covariance matrix over activations for generated samples. + -- sigma2: The covariance matrix over activations, precalculated on an + representative data set. + Returns: + -- : The Frechet Distance. + """ + + mu1 = np.atleast_1d(mu1) + mu2 = np.atleast_1d(mu2) + + sigma1 = np.atleast_2d(sigma1) + sigma2 = np.atleast_2d(sigma2) + + assert mu1.shape == mu2.shape, \ + 'Training and test mean vectors have different lengths' + assert sigma1.shape == sigma2.shape, \ + 'Training and test covariances have different dimensions' + + diff = mu1 - mu2 + + # Product might be almost singular + covmean, _ = linalg.sqrtm(sigma1.dot(sigma2), disp=False) + if not np.isfinite(covmean).all(): + msg = ('fid calculation produces singular product; ' + 'adding %s to diagonal of cov estimates') % eps + print(msg) + offset = np.eye(sigma1.shape[0]) * eps + covmean = linalg.sqrtm((sigma1 + offset).dot(sigma2 + offset)) + + # Numerical error might give slight imaginary component + if np.iscomplexobj(covmean): + if not np.allclose(np.diagonal(covmean).imag, 0, atol=1e-3): + m = np.max(np.abs(covmean.imag)) + raise ValueError('Imaginary component {}'.format(m)) + covmean = covmean.real + + tr_covmean = np.trace(covmean) + + return (diff.dot(diff) + np.trace(sigma1) + np.trace(sigma2) - 2 * tr_covmean) diff --git a/src/mdm/eval/a2m/action2motion/models.py b/src/mdm/eval/a2m/action2motion/models.py new file mode 100644 index 0000000000000000000000000000000000000000..4299ce0d4b6e006e2d169acf1b26d03f2c0ca258 --- /dev/null +++ b/src/mdm/eval/a2m/action2motion/models.py @@ -0,0 +1,130 @@ +import torch +import torch.nn as nn + + +# adapted from action2motion to take inputs of different lengths +class MotionDiscriminator(nn.Module): + def __init__(self, input_size, hidden_size, hidden_layer, device, output_size=12, use_noise=None): + super(MotionDiscriminator, self).__init__() + self.device = device + + self.input_size = input_size + self.hidden_size = hidden_size + self.hidden_layer = hidden_layer + self.use_noise = use_noise + + self.recurrent = nn.GRU(input_size, hidden_size, hidden_layer) + self.linear1 = nn.Linear(hidden_size, 30) + self.linear2 = nn.Linear(30, output_size) + + def forward(self, motion_sequence, lengths=None, hidden_unit=None): + # dim (motion_length, num_samples, hidden_size) + bs, njoints, nfeats, num_frames = motion_sequence.shape + motion_sequence = motion_sequence.reshape(bs, njoints*nfeats, num_frames) + motion_sequence = motion_sequence.permute(2, 0, 1) + if hidden_unit is None: + # motion_sequence = motion_sequence.permute(1, 0, 2) + hidden_unit = self.initHidden(motion_sequence.size(1), self.hidden_layer) + gru_o, _ = self.recurrent(motion_sequence.float(), hidden_unit) + + # select the last valid, instead of: gru_o[-1, :, :] + out = gru_o[tuple(torch.stack((lengths-1, torch.arange(bs, device=self.device))))] + + # dim (num_samples, 30) + lin1 = self.linear1(out) + lin1 = torch.tanh(lin1) + # dim (num_samples, output_size) + lin2 = self.linear2(lin1) + return lin2 + + def initHidden(self, num_samples, layer): + return torch.randn(layer, num_samples, self.hidden_size, device=self.device, requires_grad=False) + + +class MotionDiscriminatorForFID(MotionDiscriminator): + def forward(self, motion_sequence, lengths=None, hidden_unit=None): + # dim (motion_length, num_samples, hidden_size) + bs, njoints, nfeats, num_frames = motion_sequence.shape + motion_sequence = motion_sequence.reshape(bs, njoints*nfeats, num_frames) + motion_sequence = motion_sequence.permute(2, 0, 1) + if hidden_unit is None: + # motion_sequence = motion_sequence.permute(1, 0, 2) + hidden_unit = self.initHidden(motion_sequence.size(1), self.hidden_layer) + gru_o, _ = self.recurrent(motion_sequence.float(), hidden_unit) + + # select the last valid, instead of: gru_o[-1, :, :] + out = gru_o[tuple(torch.stack((lengths-1, torch.arange(bs, device=self.device))))] + + # dim (num_samples, 30) + lin1 = self.linear1(out) + lin1 = torch.tanh(lin1) + return lin1 + + +model_path = "./assets/actionrecognition/humanact12_gru.tar" + + +def load_classifier(input_size_raw, num_classes, device): + model = torch.load(model_path, map_location=device) + classifier = MotionDiscriminator(input_size_raw, 128, 2, device=device, output_size=num_classes).to(device) + classifier.load_state_dict(model["model"]) + classifier.eval() + return classifier + + +def load_classifier_for_fid(input_size_raw, num_classes, device): + model = torch.load(model_path, map_location=device) + classifier = MotionDiscriminatorForFID(input_size_raw, 128, 2, device=device, output_size=num_classes).to(device) + classifier.load_state_dict(model["model"]) + classifier.eval() + return classifier + + +def test(): + from src.datasets.ntu13 import NTU13 + import src.utils.fixseed # noqa + + classifier = load_classifier("ntu13", input_size_raw=54, num_classes=13, device="cuda").eval() + params = {"pose_rep": "rot6d", + "translation": True, + "glob": True, + "jointstype": "a2m", + "vertstrans": True, + "num_frames": 60, + "sampling": "conseq", + "sampling_step": 1} + dataset = NTU13(**params) + + from src.models.rotation2xyz import Rotation2xyz + rot2xyz = Rotation2xyz(device="cuda") + confusion_xyz = torch.zeros(13, 13, dtype=torch.long) + confusion = torch.zeros(13, 13, dtype=torch.long) + + for i in range(1000): + dataset.pose_rep = "xyz" + data = dataset[i][0].to("cuda") + data = data[None] + + dataset.pose_rep = params["pose_rep"] + x = dataset[i][0].to("cuda")[None] + mask = torch.ones(1, x.shape[-1], dtype=bool, device="cuda") + lengths = mask.sum(1) + + xyz_t = rot2xyz(x, mask, **params) + + predicted_cls_xyz = classifier(data, lengths=lengths).argmax().item() + predicted_cls = classifier(xyz_t, lengths=lengths).argmax().item() + + gt_cls = dataset[i][1] + + confusion_xyz[gt_cls][predicted_cls_xyz] += 1 + confusion[gt_cls][predicted_cls] += 1 + + accuracy_xyz = torch.trace(confusion_xyz)/torch.sum(confusion_xyz).item() + accuracy = torch.trace(confusion)/torch.sum(confusion).item() + + print(f"accuracy: {accuracy:.1%}, accuracy_xyz: {accuracy_xyz:.1%}") + + +if __name__ == "__main__": + test() diff --git a/src/mdm/eval/a2m/gru_eval.py b/src/mdm/eval/a2m/gru_eval.py new file mode 100644 index 0000000000000000000000000000000000000000..4c5d35b1fe384f49664659216ade7922261425af --- /dev/null +++ b/src/mdm/eval/a2m/gru_eval.py @@ -0,0 +1,131 @@ +import copy +import os + +import numpy as np +from tqdm import tqdm +import torch +import functools +from torch.utils.data import DataLoader + +from utils.fixseed import fixseed +from data_loaders.tensors import collate +from eval.a2m.action2motion.evaluate import A2MEvaluation +from eval.unconstrained.evaluate import evaluate_unconstrained_metrics +from .tools import save_metrics, format_metrics +from utils import dist_util + +num_samples_unconstrained = 1000 + +class NewDataloader: + def __init__(self, mode, model, diffusion, dataiterator, device, unconstrained, num_samples: int=-1): + assert mode in ["gen", "gt"] + self.batches = [] + sample_fn = diffusion.p_sample_loop + with torch.no_grad(): + for motions, model_kwargs in tqdm(dataiterator, desc=f"Construct dataloader: {mode}.."): + motions = motions.to(device) + if num_samples != -1 and len(self.batches) * dataiterator.batch_size > num_samples: + continue # do not break because it confuses the multiple loaders + batch = dict() + if mode == "gen": + sample = sample_fn(model, motions.shape, clip_denoised=False, model_kwargs=model_kwargs) + batch['output'] = sample + elif mode == "gt": + batch["output"] = motions + + # mask = torch.ones([batch["output"].shape[0], batch["output"].shape[-1]], dtype=bool).to(device) # batch_size x num_frames + max_n_frames = model_kwargs['y']['lengths'].max() + mask = model_kwargs['y']['mask'].reshape(dataiterator.batch_size, max_n_frames).bool() + batch["output_xyz"] = model.rot2xyz(x=batch["output"], mask=mask, pose_rep='rot6d', glob=True, + translation=True, jointstype='smpl', vertstrans=True, betas=None, + beta=0, glob_rot=None, get_rotations_back=False) + batch["lengths"] = model_kwargs['y']['lengths'].to(device) + if not unconstrained: # proceed only if not running unconstrained + batch["y"] = model_kwargs['y']['action'].squeeze().long().cpu() # using torch.long so lengths/action will be used as indices + self.batches.append(batch) + + num_samples_last_batch = num_samples % dataiterator.batch_size + if num_samples_last_batch > 0: + for k, v in self.batches[-1].items(): + self.batches[-1][k] = v[:num_samples_last_batch] + + def __iter__(self): + return iter(self.batches) + +def evaluate(args, model, diffusion, data): + num_frames = 60 + + # fix parameters for action2motion evaluation + args.num_frames = num_frames + args.jointstype = "smpl" + args.vertstrans = True + + device = dist_util.dev() + + model.eval() + + a2mevaluation = A2MEvaluation(device=device) + a2mmetrics = {} + + datasetGT1 = copy.deepcopy(data) + datasetGT2 = copy.deepcopy(data) + + allseeds = list(range(args.num_seeds)) + + try: + for index, seed in enumerate(allseeds): + print(f"Evaluation number: {index+1}/{args.num_seeds}") + fixseed(seed) + + datasetGT1.reset_shuffle() + datasetGT1.shuffle() + + datasetGT2.reset_shuffle() + datasetGT2.shuffle() + + dataiterator = DataLoader(datasetGT1, batch_size=args.batch_size, + shuffle=False, num_workers=8, collate_fn=collate) + dataiterator2 = DataLoader(datasetGT2, batch_size=args.batch_size, + shuffle=False, num_workers=8, collate_fn=collate) + + new_data_loader = functools.partial(NewDataloader, model=model, diffusion=diffusion, device=device, + unconstrained=args.unconstrained, num_samples=args.num_samples) + motionloader = new_data_loader(mode="gen", dataiterator=dataiterator) + gt_motionloader = new_data_loader("gt", dataiterator=dataiterator) + gt_motionloader2 = new_data_loader("gt", dataiterator=dataiterator2) + + # Action2motionEvaluation + loaders = {"gen": motionloader, + "gt": gt_motionloader, + "gt2": gt_motionloader2} + + a2mmetrics[seed] = a2mevaluation.evaluate(model, loaders) + + del loaders + + if args.unconstrained: # unconstrained + dataset_unconstrained = copy.deepcopy(data) + dataset_unconstrained.reset_shuffle() + dataset_unconstrained.shuffle() + dataiterator_unconstrained = DataLoader(dataset_unconstrained, batch_size=args.batch_size, + shuffle=False, num_workers=8, collate_fn=collate) + motionloader_unconstrained = new_data_loader(mode="gen", dataiterator=dataiterator_unconstrained, num_samples=num_samples_unconstrained) + + generated_motions = [] + for motion in motionloader_unconstrained: + idx = [15, 12, 16, 18, 20, 17, 19, 21, 0, 1, 4, 7, 2, 5, 8] + motion = motion['output_xyz'][:, idx, :, :] + generated_motions.append(motion.cpu().numpy()) + generated_motions = np.concatenate(generated_motions) + unconstrained_metrics = evaluate_unconstrained_metrics(generated_motions, device, fast=True) + unconstrained_metrics = {k+'_unconstrained': v for k, v in unconstrained_metrics.items()} + + except KeyboardInterrupt: + string = "Saving the evaluation before exiting.." + print(string) + + metrics = {"feats": {key: [format_metrics(a2mmetrics[seed])[key] for seed in a2mmetrics.keys()] for key in a2mmetrics[allseeds[0]]}} + if args.unconstrained: + metrics["feats"] = {**metrics["feats"], **unconstrained_metrics} + + return metrics diff --git a/src/mdm/eval/a2m/recognition/models/stgcn.py b/src/mdm/eval/a2m/recognition/models/stgcn.py new file mode 100644 index 0000000000000000000000000000000000000000..1784ea247bf18484a11eb8663575b8d3153a58a7 --- /dev/null +++ b/src/mdm/eval/a2m/recognition/models/stgcn.py @@ -0,0 +1,219 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .stgcnutils.tgcn import ConvTemporalGraphical +from .stgcnutils.graph import Graph + +__all__ = ["STGCN"] + + +class STGCN(nn.Module): + r"""Spatial temporal graph convolutional networks. + Args: + in_channels (int): Number of channels in the input data + num_class (int): Number of classes for the classification task + graph_args (dict): The arguments for building the graph + edge_importance_weighting (bool): If ``True``, adds a learnable + importance weighting to the edges of the graph + **kwargs (optional): Other parameters for graph convolution units + Shape: + - Input: :math:`(N, in_channels, T_{in}, V_{in}, M_{in})` + - Output: :math:`(N, num_class)` where + :math:`N` is a batch size, + :math:`T_{in}` is a length of input sequence, + :math:`V_{in}` is the number of graph nodes, + :math:`M_{in}` is the number of instance in a frame. + """ + + def __init__(self, in_channels, num_class, graph_args, + edge_importance_weighting, device, **kwargs): + super().__init__() + + self.device = device + self.num_class = num_class + + self.losses = ["accuracy", "cross_entropy", "mixed"] + self.criterion = torch.nn.CrossEntropyLoss(reduction='mean') + + # load graph + self.graph = Graph(**graph_args) + A = torch.tensor(self.graph.A, dtype=torch.float32, requires_grad=False) + self.register_buffer('A', A) + + # build networks + spatial_kernel_size = A.size(0) + temporal_kernel_size = 9 + kernel_size = (temporal_kernel_size, spatial_kernel_size) + self.data_bn = nn.BatchNorm1d(in_channels * A.size(1)) + kwargs0 = {k: v for k, v in kwargs.items() if k != 'dropout'} + self.st_gcn_networks = nn.ModuleList(( + st_gcn(in_channels, 64, kernel_size, 1, residual=False, **kwargs0), + st_gcn(64, 64, kernel_size, 1, **kwargs), + st_gcn(64, 64, kernel_size, 1, **kwargs), + st_gcn(64, 64, kernel_size, 1, **kwargs), + st_gcn(64, 128, kernel_size, 2, **kwargs), + st_gcn(128, 128, kernel_size, 1, **kwargs), + st_gcn(128, 128, kernel_size, 1, **kwargs), + st_gcn(128, 256, kernel_size, 2, **kwargs), + st_gcn(256, 256, kernel_size, 1, **kwargs), + st_gcn(256, 256, kernel_size, 1, **kwargs), + )) + + # initialize parameters for edge importance weighting + if edge_importance_weighting: + self.edge_importance = nn.ParameterList([ + nn.Parameter(torch.ones(self.A.size())) + for i in self.st_gcn_networks + ]) + else: + self.edge_importance = [1] * len(self.st_gcn_networks) + + # fcn for prediction + self.fcn = nn.Conv2d(256, num_class, kernel_size=1) + + def forward(self, batch): + # TODO: use mask + # Received batch["x"] as + # Batch(48), Joints(23), Quat(4), Time(157 + # Expecting: + # Batch, Quat:4, Time, Joints, 1 + x = batch["output"].permute(0, 2, 3, 1).unsqueeze(4).contiguous() + + # data normalization + N, C, T, V, M = x.size() + x = x.permute(0, 4, 3, 1, 2).contiguous() + x = x.view(N * M, V * C, T) + x = self.data_bn(x) + x = x.view(N, M, V, C, T) + x = x.permute(0, 1, 3, 4, 2).contiguous() + x = x.view(N * M, C, T, V) + + # forward + for gcn, importance in zip(self.st_gcn_networks, self.edge_importance): + x, _ = gcn(x, self.A * importance) + + # compute feature + # _, c, t, v = x.size() + # features = x.view(N, M, c, t, v).permute(0, 2, 3, 4, 1) + # batch["features"] = features + + # global pooling + x = F.avg_pool2d(x, x.size()[2:]) + x = x.view(N, M, -1, 1, 1).mean(dim=1) + + # features + batch["features"] = x.squeeze() + + # prediction + x = self.fcn(x) + x = x.view(x.size(0), -1) + batch["yhat"] = x + return batch + + def compute_accuracy(self, batch): + confusion = torch.zeros(self.num_class, self.num_class, dtype=int) + yhat = batch["yhat"].max(dim=1).indices + ygt = batch["y"] + for label, pred in zip(ygt, yhat): + confusion[label][pred] += 1 + accuracy = torch.trace(confusion)/torch.sum(confusion) + return accuracy + + def compute_loss(self, batch): + cross_entropy = self.criterion(batch["yhat"], batch["y"]) + mixed_loss = cross_entropy + + acc = self.compute_accuracy(batch) + losses = {"cross_entropy": cross_entropy.item(), + "mixed": mixed_loss.item(), + "accuracy": acc.item()} + return mixed_loss, losses + + +class st_gcn(nn.Module): + r"""Applies a spatial temporal graph convolution over an input graph sequence. + Args: + in_channels (int): Number of channels in the input sequence data + out_channels (int): Number of channels produced by the convolution + kernel_size (tuple): Size of the temporal convolving kernel and graph convolving kernel + stride (int, optional): Stride of the temporal convolution. Default: 1 + dropout (int, optional): Dropout rate of the final output. Default: 0 + residual (bool, optional): If ``True``, applies a residual mechanism. Default: ``True`` + Shape: + - Input[0]: Input graph sequence in :math:`(N, in_channels, T_{in}, V)` format + - Input[1]: Input graph adjacency matrix in :math:`(K, V, V)` format + - Output[0]: Outpu graph sequence in :math:`(N, out_channels, T_{out}, V)` format + - Output[1]: Graph adjacency matrix for output data in :math:`(K, V, V)` format + where + :math:`N` is a batch size, + :math:`K` is the spatial kernel size, as :math:`K == kernel_size[1]`, + :math:`T_{in}/T_{out}` is a length of input/output sequence, + :math:`V` is the number of graph nodes. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride=1, + dropout=0, + residual=True): + super().__init__() + + assert len(kernel_size) == 2 + assert kernel_size[0] % 2 == 1 + padding = ((kernel_size[0] - 1) // 2, 0) + + self.gcn = ConvTemporalGraphical(in_channels, out_channels, + kernel_size[1]) + + self.tcn = nn.Sequential( + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True), + nn.Conv2d( + out_channels, + out_channels, + (kernel_size[0], 1), + (stride, 1), + padding, + ), + nn.BatchNorm2d(out_channels), + nn.Dropout(dropout, inplace=True), + ) + + if not residual: + self.residual = lambda x: 0 + + elif (in_channels == out_channels) and (stride == 1): + self.residual = lambda x: x + + else: + self.residual = nn.Sequential( + nn.Conv2d( + in_channels, + out_channels, + kernel_size=1, + stride=(stride, 1)), + nn.BatchNorm2d(out_channels), + ) + + self.relu = nn.ReLU(inplace=True) + + def forward(self, x, A): + + res = self.residual(x) + x, A = self.gcn(x, A) + x = self.tcn(x) + res + + return self.relu(x), A + + +if __name__ == "__main__": + model = STGCN(in_channels=3, num_class=60, edge_importance_weighting=True, graph_args={"layout": "smpl_noglobal", "strategy": "spatial"}) + # Batch, in_channels, time, vertices, M + inp = torch.rand(10, 3, 16, 23, 1) + out = model(inp) + print(out.shape) + import pdb + pdb.set_trace() diff --git a/src/mdm/eval/a2m/recognition/models/stgcnutils/graph.py b/src/mdm/eval/a2m/recognition/models/stgcnutils/graph.py new file mode 100644 index 0000000000000000000000000000000000000000..35ea9461f5cf2730cfaa9f07d35eea6e31a49c11 --- /dev/null +++ b/src/mdm/eval/a2m/recognition/models/stgcnutils/graph.py @@ -0,0 +1,178 @@ +import numpy as np +import pickle as pkl + +from utils.config import SMPL_KINTREE_PATH + + +class Graph: + """ The Graph to model the skeletons extracted by the openpose + Args: + strategy (string): must be one of the follow candidates + - uniform: Uniform Labeling + - distance: Distance Partitioning + - spatial: Spatial Configuration + For more information, please refer to the section 'Partition Strategies' + in our paper (https://arxiv.org/abs/1801.07455). + layout (string): must be one of the follow candidates + - openpose: Is consists of 18 joints. For more information, please + refer to https://github.com/CMU-Perceptual-Computing-Lab/openpose#output + - ntu-rgb+d: Is consists of 25 joints. For more information, please + refer to https://github.com/shahroudy/NTURGB-D + - smpl: Consists of 24/23 joints with without global rotation. + max_hop (int): the maximal distance between two connected nodes + dilation (int): controls the spacing between the kernel points + """ + + def __init__(self, + layout='openpose', + strategy='uniform', + kintree_path=SMPL_KINTREE_PATH, + max_hop=1, + dilation=1): + self.max_hop = max_hop + self.dilation = dilation + + self.kintree_path = kintree_path + + self.get_edge(layout) + self.hop_dis = get_hop_distance( + self.num_node, self.edge, max_hop=max_hop) + self.get_adjacency(strategy) + + def __str__(self): + return self.A + + def get_edge(self, layout): + if layout == 'openpose': + self.num_node = 18 + self_link = [(i, i) for i in range(self.num_node)] + neighbor_link = [(4, 3), (3, 2), (7, 6), (6, 5), (13, 12), (12, + 11), + (10, 9), (9, 8), (11, 5), (8, 2), (5, 1), (2, 1), + (0, 1), (15, 0), (14, 0), (17, 15), (16, 14)] + self.edge = self_link + neighbor_link + self.center = 1 + elif layout == 'smpl': + self.num_node = 24 + self_link = [(i, i) for i in range(self.num_node)] + kt = pkl.load(open(self.kintree_path, "rb")) + neighbor_link = [(k, kt[1][i + 1]) for i, k in enumerate(kt[0][1:])] + self.edge = self_link + neighbor_link + self.center = 0 + elif layout == 'smpl_noglobal': + self.num_node = 23 + self_link = [(i, i) for i in range(self.num_node)] + kt = pkl.load(open(self.kintree_path, "rb")) + neighbor_link = [(k, kt[1][i + 1]) for i, k in enumerate(kt[0][1:])] + # remove the root joint + neighbor_1base = [n for n in neighbor_link if n[0] != 0 and n[1] != 0] + neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] + self.edge = self_link + neighbor_link + self.center = 0 + elif layout == 'ntu-rgb+d': + self.num_node = 25 + self_link = [(i, i) for i in range(self.num_node)] + neighbor_1base = [(1, 2), (2, 21), (3, 21), (4, 3), (5, 21), + (6, 5), (7, 6), (8, 7), (9, 21), (10, 9), + (11, 10), (12, 11), (13, 1), (14, 13), (15, 14), + (16, 15), (17, 1), (18, 17), (19, 18), (20, 19), + (22, 23), (23, 8), (24, 25), (25, 12)] + neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] + self.edge = self_link + neighbor_link + self.center = 21 - 1 + elif layout == 'ntu_edge': + self.num_node = 24 + self_link = [(i, i) for i in range(self.num_node)] + neighbor_1base = [(1, 2), (3, 2), (4, 3), (5, 2), (6, 5), (7, 6), + (8, 7), (9, 2), (10, 9), (11, 10), (12, 11), + (13, 1), (14, 13), (15, 14), (16, 15), (17, 1), + (18, 17), (19, 18), (20, 19), (21, 22), (22, 8), + (23, 24), (24, 12)] + neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] + self.edge = self_link + neighbor_link + self.center = 2 + # elif layout=='customer settings' + # pass + else: + raise NotImplementedError("This Layout is not supported") + + def get_adjacency(self, strategy): + valid_hop = range(0, self.max_hop + 1, self.dilation) + adjacency = np.zeros((self.num_node, self.num_node)) + for hop in valid_hop: + adjacency[self.hop_dis == hop] = 1 + normalize_adjacency = normalize_digraph(adjacency) + + if strategy == 'uniform': + A = np.zeros((1, self.num_node, self.num_node)) + A[0] = normalize_adjacency + self.A = A + elif strategy == 'distance': + A = np.zeros((len(valid_hop), self.num_node, self.num_node)) + for i, hop in enumerate(valid_hop): + A[i][self.hop_dis == hop] = normalize_adjacency[self.hop_dis == hop] + self.A = A + elif strategy == 'spatial': + A = [] + for hop in valid_hop: + a_root = np.zeros((self.num_node, self.num_node)) + a_close = np.zeros((self.num_node, self.num_node)) + a_further = np.zeros((self.num_node, self.num_node)) + for i in range(self.num_node): + for j in range(self.num_node): + if self.hop_dis[j, i] == hop: + if self.hop_dis[j, self.center] == self.hop_dis[ + i, self.center]: + a_root[j, i] = normalize_adjacency[j, i] + elif self.hop_dis[j, self. + center] > self.hop_dis[i, self. + center]: + a_close[j, i] = normalize_adjacency[j, i] + else: + a_further[j, i] = normalize_adjacency[j, i] + if hop == 0: + A.append(a_root) + else: + A.append(a_root + a_close) + A.append(a_further) + A = np.stack(A) + self.A = A + else: + raise NotImplementedError("This Strategy is not supported") + + +def get_hop_distance(num_node, edge, max_hop=1): + A = np.zeros((num_node, num_node)) + for i, j in edge: + A[j, i] = 1 + A[i, j] = 1 + + # compute hop steps + hop_dis = np.zeros((num_node, num_node)) + np.inf + transfer_mat = [np.linalg.matrix_power(A, d) for d in range(max_hop + 1)] + arrive_mat = (np.stack(transfer_mat) > 0) + for d in range(max_hop, -1, -1): + hop_dis[arrive_mat[d]] = d + return hop_dis + + +def normalize_digraph(A): + Dl = np.sum(A, 0) + num_node = A.shape[0] + Dn = np.zeros((num_node, num_node)) + for i in range(num_node): + if Dl[i] > 0: + Dn[i, i] = Dl[i]**(-1) + AD = np.dot(A, Dn) + return AD + + +def normalize_undigraph(A): + Dl = np.sum(A, 0) + num_node = A.shape[0] + Dn = np.zeros((num_node, num_node)) + for i in range(num_node): + if Dl[i] > 0: + Dn[i, i] = Dl[i]**(-0.5) + DAD = np.dot(np.dot(Dn, A), Dn) + return DAD diff --git a/src/mdm/eval/a2m/recognition/models/stgcnutils/tgcn.py b/src/mdm/eval/a2m/recognition/models/stgcnutils/tgcn.py new file mode 100644 index 0000000000000000000000000000000000000000..ebc5db2b97cf711eb0ce5c47905efa52a86d5eb4 --- /dev/null +++ b/src/mdm/eval/a2m/recognition/models/stgcnutils/tgcn.py @@ -0,0 +1,64 @@ +# The based unit of graph convolutional networks. + +import torch +import torch.nn as nn + + +class ConvTemporalGraphical(nn.Module): + + r"""The basic module for applying a graph convolution. + Args: + in_channels (int): Number of channels in the input sequence data + out_channels (int): Number of channels produced by the convolution + kernel_size (int): Size of the graph convolving kernel + t_kernel_size (int): Size of the temporal convolving kernel + t_stride (int, optional): Stride of the temporal convolution. Default: 1 + t_padding (int, optional): Temporal zero-padding added to both sides of + the input. Default: 0 + t_dilation (int, optional): Spacing between temporal kernel elements. + Default: 1 + bias (bool, optional): If ``True``, adds a learnable bias to the output. + Default: ``True`` + Shape: + - Input[0]: Input graph sequence in :math:`(N, in_channels, T_{in}, V)` format + - Input[1]: Input graph adjacency matrix in :math:`(K, V, V)` format + - Output[0]: Outpu graph sequence in :math:`(N, out_channels, T_{out}, V)` format + - Output[1]: Graph adjacency matrix for output data in :math:`(K, V, V)` format + where + :math:`N` is a batch size, + :math:`K` is the spatial kernel size, as :math:`K == kernel_size[1]`, + :math:`T_{in}/T_{out}` is a length of input/output sequence, + :math:`V` is the number of graph nodes. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size, + t_kernel_size=1, + t_stride=1, + t_padding=0, + t_dilation=1, + bias=True): + super().__init__() + + self.kernel_size = kernel_size + self.conv = nn.Conv2d( + in_channels, + out_channels * kernel_size, + kernel_size=(t_kernel_size, 1), + padding=(t_padding, 0), + stride=(t_stride, 1), + dilation=(t_dilation, 1), + bias=bias) + + def forward(self, x, A): + assert A.size(0) == self.kernel_size + + x = self.conv(x) + + n, kc, t, v = x.size() + x = x.view(n, self.kernel_size, kc//self.kernel_size, t, v) + x = torch.einsum('nkctv,kvw->nctw', (x, A)) + + return x.contiguous(), A diff --git a/src/mdm/eval/a2m/stgcn/accuracy.py b/src/mdm/eval/a2m/stgcn/accuracy.py new file mode 100644 index 0000000000000000000000000000000000000000..e707ef9a48bd8d9cf940fc475ba2aa93776855f5 --- /dev/null +++ b/src/mdm/eval/a2m/stgcn/accuracy.py @@ -0,0 +1,14 @@ +import torch + + +def calculate_accuracy(model, motion_loader, num_labels, classifier, device): + confusion = torch.zeros(num_labels, num_labels, dtype=torch.long) + with torch.no_grad(): + for batch in motion_loader: + batch_prob = classifier(batch)["yhat"] + batch_pred = batch_prob.max(dim=1).indices + for label, pred in zip(batch["y"], batch_pred): + confusion[label][pred] += 1 + + accuracy = torch.trace(confusion)/torch.sum(confusion) + return accuracy.item(), confusion diff --git a/src/mdm/eval/a2m/stgcn/diversity.py b/src/mdm/eval/a2m/stgcn/diversity.py new file mode 100644 index 0000000000000000000000000000000000000000..5136a41d28ee22620f3496f51e9104ed4d9872bc --- /dev/null +++ b/src/mdm/eval/a2m/stgcn/diversity.py @@ -0,0 +1,54 @@ +import torch +import numpy as np + + +# from action2motion +def calculate_diversity_multimodality(activations, labels, num_labels, seed=None, unconstrained = False): + diversity_times = 200 + multimodality_times = 20 + if not unconstrained: + labels = labels.long() + num_motions = activations.shape[0] # len(labels) + + diversity = 0 + + if seed is not None: + np.random.seed(seed) + + first_indices = np.random.randint(0, num_motions, diversity_times) + second_indices = np.random.randint(0, num_motions, diversity_times) + for first_idx, second_idx in zip(first_indices, second_indices): + diversity += torch.dist(activations[first_idx, :], + activations[second_idx, :]) + diversity /= diversity_times + + if not unconstrained: + multimodality = 0 + label_quotas = np.zeros(num_labels) + label_quotas[labels.unique()] = multimodality_times # if a label does not appear in batch, its quota remains zero + while np.any(label_quotas > 0): + # print(label_quotas) + first_idx = np.random.randint(0, num_motions) + first_label = labels[first_idx] + if not label_quotas[first_label]: + continue + + second_idx = np.random.randint(0, num_motions) + second_label = labels[second_idx] + while first_label != second_label: + second_idx = np.random.randint(0, num_motions) + second_label = labels[second_idx] + + label_quotas[first_label] -= 1 + + first_activation = activations[first_idx, :] + second_activation = activations[second_idx, :] + multimodality += torch.dist(first_activation, + second_activation) + + multimodality /= (multimodality_times * num_labels) + else: + multimodality = torch.tensor(np.nan) + + return diversity.item(), multimodality.item() + diff --git a/src/mdm/eval/a2m/stgcn/evaluate.py b/src/mdm/eval/a2m/stgcn/evaluate.py new file mode 100644 index 0000000000000000000000000000000000000000..ed8170128d88836eccae48597116bc850e42f306 --- /dev/null +++ b/src/mdm/eval/a2m/stgcn/evaluate.py @@ -0,0 +1,108 @@ +import torch +import numpy as np +from .accuracy import calculate_accuracy +from .fid import calculate_fid +from .diversity import calculate_diversity_multimodality + +from eval.a2m.recognition.models.stgcn import STGCN + + +class Evaluation: + def __init__(self, dataname, parameters, device, seed=None): + layout = "smpl" # if parameters["glob"] else "smpl_noglobal" + model = STGCN(in_channels=parameters["nfeats"], + num_class=parameters["num_classes"], + graph_args={"layout": layout, "strategy": "spatial"}, + edge_importance_weighting=True, + device=device) + + model = model.to(device) + + model_path = "./assets/actionrecognition/uestc_rot6d_stgcn.tar" + + state_dict = torch.load(model_path, map_location=device) + model.load_state_dict(state_dict) + model.eval() + + self.num_classes = parameters["num_classes"] + self.model = model + + self.dataname = dataname + self.device = device + + self.seed = seed + + def compute_features(self, model, motionloader): + # calculate_activations_labels function from action2motion + activations = [] + labels = [] + with torch.no_grad(): + for idx, batch in enumerate(motionloader): + activations.append(self.model(batch)["features"]) + if model.cond_mode != 'no_cond': + labels.append(batch["y"]) + activations = torch.cat(activations, dim=0) + if model.cond_mode != 'no_cond': + labels = torch.cat(labels, dim=0) + return activations, labels + + @staticmethod + def calculate_activation_statistics(activations): + activations = activations.cpu().numpy() + mu = np.mean(activations, axis=0) + sigma = np.cov(activations, rowvar=False) + return mu, sigma + + def evaluate(self, model, loaders): + def print_logs(metric, key): + print(f"Computing stgcn {metric} on the {key} loader ...") + + metrics_all = {} + for sets in ["train", "test"]: + computedfeats = {} + metrics = {} + for key, loaderSets in loaders.items(): + loader = loaderSets[sets] + + metric = "accuracy" + mkey = f"{metric}_{key}" + if model.cond_mode != 'no_cond': + print_logs(metric, key) + metrics[mkey], _ = calculate_accuracy(model, loader, + self.num_classes, + self.model, self.device) + else: + metrics[mkey] = np.nan + + # features for diversity + print_logs("features", key) + feats, labels = self.compute_features(model, loader) + print_logs("stats", key) + stats = self.calculate_activation_statistics(feats) + + computedfeats[key] = {"feats": feats, + "labels": labels, + "stats": stats} + + print_logs("diversity", key) + ret = calculate_diversity_multimodality(feats, labels, self.num_classes, + seed=self.seed, unconstrained=(model.cond_mode=='no_cond')) + metrics[f"diversity_{key}"], metrics[f"multimodality_{key}"] = ret + + # taking the stats of the ground truth and remove it from the computed feats + gtstats = computedfeats["gt"]["stats"] + # computing fid + for key, loader in computedfeats.items(): + metric = "fid" + mkey = f"{metric}_{key}" + + stats = computedfeats[key]["stats"] + metrics[mkey] = float(calculate_fid(gtstats, stats)) + + metrics_all[sets] = metrics + + metrics = {} + for sets in ["train", "test"]: + for key in metrics_all[sets]: + metrics[f"{key}_{sets}"] = metrics_all[sets][key] + return metrics diff --git a/src/mdm/eval/a2m/stgcn/fid.py b/src/mdm/eval/a2m/stgcn/fid.py new file mode 100644 index 0000000000000000000000000000000000000000..4302e6b2808e87e3d9d4d8080db89d1b03e45f85 --- /dev/null +++ b/src/mdm/eval/a2m/stgcn/fid.py @@ -0,0 +1,61 @@ +import numpy as np +from scipy import linalg + + +# from action2motion +def calculate_fid(statistics_1, statistics_2): + return calculate_frechet_distance(statistics_1[0], statistics_1[1], + statistics_2[0], statistics_2[1]) + + +def calculate_frechet_distance(mu1, sigma1, mu2, sigma2, eps=1e-6): + """Numpy implementation of the Frechet Distance. + The Frechet distance between two multivariate Gaussians X_1 ~ N(mu_1, C_1) + and X_2 ~ N(mu_2, C_2) is + d^2 = ||mu_1 - mu_2||^2 + Tr(C_1 + C_2 - 2*sqrt(C_1*C_2)). + Stable version by Dougal J. Sutherland. + Params: + -- mu1 : Numpy array containing the activations of a layer of the + inception net (like returned by the function 'get_predictions') + for generated samples. + -- mu2 : The sample mean over activations, precalculated on an + representative data set. + -- sigma1: The covariance matrix over activations for generated samples. + -- sigma2: The covariance matrix over activations, precalculated on an + representative data set. + Returns: + -- : The Frechet Distance. + """ + + mu1 = np.atleast_1d(mu1) + mu2 = np.atleast_1d(mu2) + + sigma1 = np.atleast_2d(sigma1) + sigma2 = np.atleast_2d(sigma2) + + assert mu1.shape == mu2.shape, \ + 'Training and test mean vectors have different lengths' + assert sigma1.shape == sigma2.shape, \ + 'Training and test covariances have different dimensions' + + diff = mu1 - mu2 + + # Product might be almost singular + covmean, _ = linalg.sqrtm(sigma1.dot(sigma2), disp=False) + if not np.isfinite(covmean).all(): + msg = ('fid calculation produces singular product; ' + 'adding %s to diagonal of cov estimates') % eps + print(msg) + offset = np.eye(sigma1.shape[0]) * eps + covmean = linalg.sqrtm((sigma1 + offset).dot(sigma2 + offset)) + + # Numerical error might give slight imaginary component + if np.iscomplexobj(covmean): + if not np.allclose(np.diagonal(covmean).imag, 0, atol=1e-3): + m = np.max(np.abs(covmean.imag)) + raise ValueError('Imaginary component {}'.format(m)) + covmean = covmean.real + + tr_covmean = np.trace(covmean) + + return (diff.dot(diff) + np.trace(sigma1) + np.trace(sigma2) - 2 * tr_covmean) diff --git a/src/mdm/eval/a2m/stgcn_eval.py b/src/mdm/eval/a2m/stgcn_eval.py new file mode 100644 index 0000000000000000000000000000000000000000..ba8426a2c1136093fcf81b204fa0b86cfbd5b182 --- /dev/null +++ b/src/mdm/eval/a2m/stgcn_eval.py @@ -0,0 +1,147 @@ +import copy +import torch +from tqdm import tqdm +import functools + +from utils.fixseed import fixseed + +from eval.a2m.stgcn.evaluate import Evaluation as STGCNEvaluation +from torch.utils.data import DataLoader +from data_loaders.tensors import collate + + +from .tools import format_metrics +import utils.rotation_conversions as geometry +from utils import dist_util + + +def convert_x_to_rot6d(x, pose_rep): + # convert rotation to rot6d + if pose_rep == "rotvec": + x = geometry.matrix_to_rotation_6d(geometry.axis_angle_to_matrix(x)) + elif pose_rep == "rotmat": + x = x.reshape(*x.shape[:-1], 3, 3) + x = geometry.matrix_to_rotation_6d(x) + elif pose_rep == "rotquat": + x = geometry.matrix_to_rotation_6d(geometry.quaternion_to_matrix(x)) + elif pose_rep == "rot6d": + x = x + else: + raise NotImplementedError("No geometry for this one.") + return x + + +class NewDataloader: + def __init__(self, mode, model, diffusion, dataiterator, device, cond_mode, dataset, num_samples): + assert mode in ["gen", "gt"] + + self.batches = [] + sample_fn = diffusion.p_sample_loop + + with torch.no_grad(): + for motions, model_kwargs in tqdm(dataiterator, desc=f"Construct dataloader: {mode}.."): + motions = motions.to(device) + if num_samples != -1 and len(self.batches) * dataiterator.batch_size > num_samples: + continue # do not break because it confuses the multiple loaders + batch = dict() + if mode == "gen": + sample = sample_fn(model, motions.shape, clip_denoised=False, model_kwargs=model_kwargs) + batch['output'] = sample + elif mode == "gt": + batch['output'] = motions + + max_n_frames = model_kwargs['y']['lengths'].max() + mask = model_kwargs['y']['mask'].reshape(dataiterator.batch_size, max_n_frames).bool() + batch["output_xyz"] = model.rot2xyz(x=batch["output"], mask=mask, pose_rep='rot6d', glob=True, + translation=True, jointstype='smpl', vertstrans=True, betas=None, + beta=0, glob_rot=None, get_rotations_back=False) + if model.translation: + # the stgcn model expects rotations only + batch["output"] = batch["output"][:, :-1] + + batch["lengths"] = model_kwargs['y']['lengths'].to(device) + # using torch.long so lengths/action will be used as indices + if cond_mode != 'no_cond': # proceed only if not running unconstrained + batch["y"] = model_kwargs['y']['action'].squeeze().long().cpu() # using torch.long so lengths/action will be used as indices + self.batches.append(batch) + + num_samples_last_batch = num_samples % dataiterator.batch_size + if num_samples_last_batch > 0: + for k, v in self.batches[-1].items(): + self.batches[-1][k] = v[:num_samples_last_batch] + + + def __iter__(self): + return iter(self.batches) + + +def evaluate(args, model, diffusion, data): + torch.multiprocessing.set_sharing_strategy('file_system') + + bs = args.batch_size + args.num_classes = 40 + args.nfeats = 6 + args.njoint = 25 + device = dist_util.dev() + + + recogparameters = args.__dict__.copy() + recogparameters["pose_rep"] = "rot6d" + recogparameters["nfeats"] = 6 + + # Action2motionEvaluation + stgcnevaluation = STGCNEvaluation(args.dataset, recogparameters, device) + + stgcn_metrics = {} + + data_types = ['train', 'test'] + datasetGT = {'train': [data], 'test': [copy.deepcopy(data)]} + + for key in data_types: + datasetGT[key][0].split = key + + compute_gt_gt = False + if compute_gt_gt: + for key in data_types: + datasetGT[key].append(copy.deepcopy(datasetGT[key][0])) + + model.eval() + + allseeds = list(range(args.num_seeds)) + + for index, seed in enumerate(allseeds): + print(f"Evaluation number: {index + 1}/{args.num_seeds}") + fixseed(seed) + for key in data_types: + for data in datasetGT[key]: + data.reset_shuffle() + data.shuffle() + + dataiterator = {key: [DataLoader(data, batch_size=bs, shuffle=False, num_workers=8, collate_fn=collate) + for data in datasetGT[key]] + for key in data_types} + + new_data_loader = functools.partial(NewDataloader, model=model, diffusion=diffusion, device=device, + cond_mode=args.cond_mode, dataset=args.dataset, num_samples=args.num_samples) + gtLoaders = {key: new_data_loader(mode="gt", dataiterator=dataiterator[key][0]) + for key in ["train", "test"]} + + if compute_gt_gt: + gtLoaders2 = {key: new_data_loader(mode="gt", dataiterator=dataiterator[key][0]) + for key in ["train", "test"]} + + genLoaders = {key: new_data_loader(mode="gen", dataiterator=dataiterator[key][0]) + for key in ["train", "test"]} + + loaders = {"gen": genLoaders, + "gt": gtLoaders} + + if compute_gt_gt: + loaders["gt2"] = gtLoaders2 + + stgcn_metrics[seed] = stgcnevaluation.evaluate(model, loaders) + del loaders + + metrics = {"feats": {key: [format_metrics(stgcn_metrics[seed])[key] for seed in allseeds] for key in stgcn_metrics[allseeds[0]]}} + + return metrics diff --git a/src/mdm/eval/a2m/tools.py b/src/mdm/eval/a2m/tools.py new file mode 100644 index 0000000000000000000000000000000000000000..f362244e374f74465c605148cb1c150115ab71dd --- /dev/null +++ b/src/mdm/eval/a2m/tools.py @@ -0,0 +1,19 @@ +import yaml + + +def format_metrics(metrics, formatter="{:.6}"): + newmetrics = {} + for key, val in metrics.items(): + newmetrics[key] = formatter.format(val) + return newmetrics + + +def save_metrics(path, metrics): + with open(path, "w") as yfile: + yaml.dump(metrics, yfile) + + +def load_metrics(path): + with open(path, "r") as yfile: + string = yfile.read() + return yaml.load(string, yaml.loader.BaseLoader) diff --git a/src/mdm/eval/eval_humanact12_uestc.py b/src/mdm/eval/eval_humanact12_uestc.py new file mode 100644 index 0000000000000000000000000000000000000000..54ad4d7060ad63d3678d38eecc7665be5f137044 --- /dev/null +++ b/src/mdm/eval/eval_humanact12_uestc.py @@ -0,0 +1,80 @@ +""" +Generate a large batch of image samples from a model and save them as a large +numpy array. This can be used to produce samples for FID evaluation. +""" +import os +import torch +import re + +from utils import dist_util +from utils.sampler_util import ClassifierFreeSampleModel +from data_loaders.get_data import get_dataset_loader +from eval.a2m.tools import save_metrics +from utils.parser_util import evaluation_parser +from utils.fixseed import fixseed +from utils.model_util import create_model_and_diffusion, load_model_wo_clip + + +def evaluate(args, model, diffusion, data): + scale = None + if args.guidance_param != 1: + model = ClassifierFreeSampleModel(model) # wrapping model with the classifier-free sampler + scale = { + 'action': torch.ones(args.batch_size) * args.guidance_param, + } + model.to(dist_util.dev()) + model.eval() # disable random masking + + + folder, ckpt_name = os.path.split(args.model_path) + if args.dataset == "humanact12": + from eval.a2m.gru_eval import evaluate + eval_results = evaluate(args, model, diffusion, data) + elif args.dataset == "uestc": + from eval.a2m.stgcn_eval import evaluate + eval_results = evaluate(args, model, diffusion, data) + else: + raise NotImplementedError("This dataset is not supported.") + + # save results + iter = int(re.findall('\d+', ckpt_name)[0]) + scale = 1 if scale is None else scale['action'][0].item() + scale = str(scale).replace('.', 'p') + metricname = "evaluation_results_iter{}_samp{}_scale{}_a2m.yaml".format(iter, args.num_samples, scale) + evalpath = os.path.join(folder, metricname) + print(f"Saving evaluation: {evalpath}") + save_metrics(evalpath, eval_results) + + return eval_results + + +def main(): + args = evaluation_parser() + fixseed(args.seed) + dist_util.setup_dist(args.device) + + print(f'Eval mode [{args.eval_mode}]') + assert args.eval_mode in ['debug', 'full'], f'eval_mode {args.eval_mode} is not supported for dataset {args.dataset}' + if args.eval_mode == 'debug': + args.num_samples = 10 + args.num_seeds = 2 + else: + args.num_samples = 1000 + args.num_seeds = 20 + + data_loader = get_dataset_loader(name=args.dataset, num_frames=60, batch_size=args.batch_size,) + + print("creating model and diffusion...") + model, diffusion = create_model_and_diffusion(args, data_loader) + + print(f"Loading checkpoints from [{args.model_path}]...") + state_dict = torch.load(args.model_path, map_location='cpu') + load_model_wo_clip(model, state_dict) + + eval_results = evaluate(args, model, diffusion, data_loader.dataset) + + fid_to_print = {k : sum([float(vv) for vv in v])/len(v) for k, v in eval_results['feats'].items() if 'fid' in k and 'gen' in k} + print(fid_to_print) + +if __name__ == '__main__': + main() diff --git a/src/mdm/eval/eval_humanml.py b/src/mdm/eval/eval_humanml.py new file mode 100644 index 0000000000000000000000000000000000000000..5ce7656fd8a30c9d8b0bf14ebf6fe2f505d69b02 --- /dev/null +++ b/src/mdm/eval/eval_humanml.py @@ -0,0 +1,330 @@ +from utils.parser_util import evaluation_parser +from utils.fixseed import fixseed +from datetime import datetime +from data_loaders.humanml.motion_loaders.model_motion_loaders import get_mdm_loader # get_motion_loader +from data_loaders.humanml.utils.metrics import * +from data_loaders.humanml.networks.evaluator_wrapper import EvaluatorMDMWrapper +from collections import OrderedDict +from data_loaders.humanml.scripts.motion_process import * +from data_loaders.humanml.utils.utils import * +from utils.model_util import create_model_and_diffusion, load_saved_model + +from diffusion import logger +from utils import dist_util +from data_loaders.get_data import get_dataset_loader +from utils.sampler_util import ClassifierFreeSampleModel +from train.train_platforms import ClearmlPlatform, TensorboardPlatform, NoPlatform, WandBPlatform # required for the eval operation + +torch.multiprocessing.set_sharing_strategy('file_system') + +def evaluate_matching_score(eval_wrapper, motion_loaders, file): + match_score_dict = OrderedDict({}) + R_precision_dict = OrderedDict({}) + activation_dict = OrderedDict({}) + print('========== Evaluating Matching Score ==========') + for motion_loader_name, motion_loader in motion_loaders.items(): + all_motion_embeddings = [] + score_list = [] + all_size = 0 + matching_score_sum = 0 + top_k_count = 0 + # print(motion_loader_name) + with torch.no_grad(): + for idx, batch in enumerate(motion_loader): + word_embeddings, pos_one_hots, _, sent_lens, motions, m_lens, _ = batch + text_embeddings, motion_embeddings = eval_wrapper.get_co_embeddings( + word_embs=word_embeddings, + pos_ohot=pos_one_hots, + cap_lens=sent_lens, + motions=motions, + m_lens=m_lens + ) + dist_mat = euclidean_distance_matrix(text_embeddings.cpu().numpy(), + motion_embeddings.cpu().numpy()) + matching_score_sum += dist_mat.trace() + + argsmax = np.argsort(dist_mat, axis=1) + top_k_mat = calculate_top_k(argsmax, top_k=3) + top_k_count += top_k_mat.sum(axis=0) + + all_size += text_embeddings.shape[0] + + all_motion_embeddings.append(motion_embeddings.cpu().numpy()) + + all_motion_embeddings = np.concatenate(all_motion_embeddings, axis=0) + matching_score = matching_score_sum / all_size + R_precision = top_k_count / all_size + match_score_dict[motion_loader_name] = matching_score + R_precision_dict[motion_loader_name] = R_precision + activation_dict[motion_loader_name] = all_motion_embeddings + + print(f'---> [{motion_loader_name}] Matching Score: {matching_score:.4f}') + print(f'---> [{motion_loader_name}] Matching Score: {matching_score:.4f}', file=file, flush=True) + + line = f'---> [{motion_loader_name}] R_precision: ' + for i in range(len(R_precision)): + line += '(top %d): %.4f ' % (i+1, R_precision[i]) + print(line) + print(line, file=file, flush=True) + + return match_score_dict, R_precision_dict, activation_dict + + +def evaluate_fid(eval_wrapper, groundtruth_loader, activation_dict, file): + eval_dict = OrderedDict({}) + gt_motion_embeddings = [] + print('========== Evaluating FID ==========') + with torch.no_grad(): + for idx, batch in enumerate(groundtruth_loader): + _, _, _, sent_lens, motions, m_lens, _ = batch + motion_embeddings = eval_wrapper.get_motion_embeddings( + motions=motions, + m_lens=m_lens + ) + gt_motion_embeddings.append(motion_embeddings.cpu().numpy()) + gt_motion_embeddings = np.concatenate(gt_motion_embeddings, axis=0) + gt_mu, gt_cov = calculate_activation_statistics(gt_motion_embeddings) + + # print(gt_mu) + for model_name, motion_embeddings in activation_dict.items(): + mu, cov = calculate_activation_statistics(motion_embeddings) + # print(mu) + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + print(f'---> [{model_name}] FID: {fid:.4f}') + print(f'---> [{model_name}] FID: {fid:.4f}', file=file, flush=True) + eval_dict[model_name] = fid + return eval_dict + + +def evaluate_diversity(activation_dict, file, diversity_times): + eval_dict = OrderedDict({}) + print('========== Evaluating Diversity ==========') + for model_name, motion_embeddings in activation_dict.items(): + diversity = calculate_diversity(motion_embeddings, diversity_times) + eval_dict[model_name] = diversity + print(f'---> [{model_name}] Diversity: {diversity:.4f}') + print(f'---> [{model_name}] Diversity: {diversity:.4f}', file=file, flush=True) + return eval_dict + + +def evaluate_multimodality(eval_wrapper, mm_motion_loaders, file, mm_num_times): + eval_dict = OrderedDict({}) + print('========== Evaluating MultiModality ==========') + for model_name, mm_motion_loader in mm_motion_loaders.items(): + mm_motion_embeddings = [] + with torch.no_grad(): + for idx, batch in enumerate(mm_motion_loader): + # (1, mm_replications, dim_pos) + motions, m_lens = batch + motion_embedings = eval_wrapper.get_motion_embeddings(motions[0], m_lens[0]) + mm_motion_embeddings.append(motion_embedings.unsqueeze(0)) + if len(mm_motion_embeddings) == 0: + multimodality = 0 + else: + mm_motion_embeddings = torch.cat(mm_motion_embeddings, dim=0).cpu().numpy() + multimodality = calculate_multimodality(mm_motion_embeddings, mm_num_times) + print(f'---> [{model_name}] Multimodality: {multimodality:.4f}') + print(f'---> [{model_name}] Multimodality: {multimodality:.4f}', file=file, flush=True) + eval_dict[model_name] = multimodality + return eval_dict + + +def get_metric_statistics(values, replication_times): + mean = np.mean(values, axis=0) + std = np.std(values, axis=0) + conf_interval = 1.96 * std / np.sqrt(replication_times) + return mean, conf_interval + + +def evaluation(eval_wrapper, gt_loader, eval_motion_loaders, log_file, replication_times, + diversity_times, mm_num_times, run_mm=False, eval_platform=None): + with open(log_file, 'w') as f: + all_metrics = OrderedDict({'Matching Score': OrderedDict({}), + 'R_precision': OrderedDict({}), + 'FID': OrderedDict({}), + 'Diversity': OrderedDict({}), + 'MultiModality': OrderedDict({})}) + for replication in range(replication_times): + motion_loaders = {} + mm_motion_loaders = {} + motion_loaders['ground truth'] = gt_loader + for motion_loader_name, motion_loader_getter in eval_motion_loaders.items(): + motion_loader, mm_motion_loader = motion_loader_getter() + motion_loaders[motion_loader_name] = motion_loader + mm_motion_loaders[motion_loader_name] = mm_motion_loader + + print(f'==================== Replication {replication} ====================') + print(f'==================== Replication {replication} ====================', file=f, flush=True) + print(f'Time: {datetime.now()}') + print(f'Time: {datetime.now()}', file=f, flush=True) + mat_score_dict, R_precision_dict, acti_dict = evaluate_matching_score(eval_wrapper, motion_loaders, f) + + print(f'Time: {datetime.now()}') + print(f'Time: {datetime.now()}', file=f, flush=True) + fid_score_dict = evaluate_fid(eval_wrapper, gt_loader, acti_dict, f) + + print(f'Time: {datetime.now()}') + print(f'Time: {datetime.now()}', file=f, flush=True) + div_score_dict = evaluate_diversity(acti_dict, f, diversity_times) + + if run_mm: + print(f'Time: {datetime.now()}') + print(f'Time: {datetime.now()}', file=f, flush=True) + mm_score_dict = evaluate_multimodality(eval_wrapper, mm_motion_loaders, f, mm_num_times) + + print(f'!!! DONE !!!') + print(f'!!! DONE !!!', file=f, flush=True) + + for key, item in mat_score_dict.items(): + if key not in all_metrics['Matching Score']: + all_metrics['Matching Score'][key] = [item] + else: + all_metrics['Matching Score'][key] += [item] + + for key, item in R_precision_dict.items(): + if key not in all_metrics['R_precision']: + all_metrics['R_precision'][key] = [item] + else: + all_metrics['R_precision'][key] += [item] + + for key, item in fid_score_dict.items(): + if key not in all_metrics['FID']: + all_metrics['FID'][key] = [item] + else: + all_metrics['FID'][key] += [item] + + for key, item in div_score_dict.items(): + if key not in all_metrics['Diversity']: + all_metrics['Diversity'][key] = [item] + else: + all_metrics['Diversity'][key] += [item] + if run_mm: + for key, item in mm_score_dict.items(): + if key not in all_metrics['MultiModality']: + all_metrics['MultiModality'][key] = [item] + else: + all_metrics['MultiModality'][key] += [item] + + + # print(all_metrics['Diversity']) + mean_dict = {} + for metric_name, metric_dict in all_metrics.items(): + print('========== %s Summary ==========' % metric_name) + print('========== %s Summary ==========' % metric_name, file=f, flush=True) + for model_name, values in metric_dict.items(): + # print(metric_name, model_name) + mean, conf_interval = get_metric_statistics(np.array(values), replication_times) + mean_dict[metric_name + '_' + model_name] = mean + # print(mean, mean.dtype) + if isinstance(mean, np.float64) or isinstance(mean, np.float32): + print(f'---> [{model_name}] Mean: {mean:.4f} CInterval: {conf_interval:.4f}') + print(f'---> [{model_name}] Mean: {mean:.4f} CInterval: {conf_interval:.4f}', file=f, flush=True) + elif isinstance(mean, np.ndarray): + line = f'---> [{model_name}]' + for i in range(len(mean)): + line += '(top %d) Mean: %.4f CInt: %.4f;' % (i+1, mean[i], conf_interval[i]) + print(line) + print(line, file=f, flush=True) + + # log results + if eval_platform is not None: + for k, v in mean_dict.items(): + if k.startswith('R_precision'): + for i in range(len(v)): + eval_platform.report_scalar(name=f'top{i + 1}_' + k, value=v[i], + iteration=1, group_name='Eval') + else: + eval_platform.report_scalar(name=k, value=v, iteration=1, group_name='Eval') + + return mean_dict + + +if __name__ == '__main__': + args = evaluation_parser() + fixseed(args.seed) + args.batch_size = 32 # This must be 32! Don't change it! otherwise it will cause a bug in R precision calc! + name = os.path.basename(os.path.dirname(args.model_path)) + niter = os.path.basename(args.model_path).replace('model', '').replace('.pt', '') + log_name = 'eval_humanml_{}_{}'.format(name, niter) + if args.guidance_param != 1.: + log_name += f'_gscale{args.guidance_param}' + log_name += f'_{args.eval_mode}' + log_file = os.path.join(os.path.dirname(args.model_path), log_name + '.log') + save_dir = os.path.dirname(log_file) # has not been tested with WandB + + print(f'Will save to log file [{log_file}]') + + eval_platform_type = eval(args.train_platform_type) + eval_platform = eval_platform_type(save_dir, name=log_name) + eval_platform.report_args(args, name='Args') + + print(f'Eval mode [{args.eval_mode}]') + if args.eval_mode == 'debug': + num_samples_limit = 1000 # None means no limit (eval over all dataset) + run_mm = False + mm_num_samples = 0 + mm_num_repeats = 0 + mm_num_times = 0 + diversity_times = 300 + replication_times = 5 # about 3 Hrs + elif args.eval_mode == 'wo_mm': + num_samples_limit = 1000 + run_mm = False + mm_num_samples = 0 + mm_num_repeats = 0 + mm_num_times = 0 + diversity_times = 300 + replication_times = 20 # about 12 Hrs + elif args.eval_mode == 'mm_short': + num_samples_limit = 1000 + run_mm = True + mm_num_samples = 100 + mm_num_repeats = 30 + mm_num_times = 10 + diversity_times = 300 + replication_times = 5 # about 15 Hrs + else: + raise ValueError() + + + dist_util.setup_dist(args.device) + logger.configure() + + logger.log("creating data loader...") + split = 'test' + gt_loader = get_dataset_loader(name=args.dataset, batch_size=args.batch_size, num_frames=None, split=split, hml_mode='gt') + # gen_loader = get_dataset_loader(name=args.dataset, batch_size=args.batch_size, num_frames=None, split=split, hml_mode='eval') + # added new features + support for prefix completion: + gen_loader = get_dataset_loader(name=args.dataset, batch_size=args.batch_size, num_frames=None, split=split, hml_mode='eval', + fixed_len=args.context_len+args.pred_len, pred_len=args.pred_len, device=dist_util.dev(), + autoregressive=args.autoregressive) + + num_actions = gen_loader.dataset.num_actions + + logger.log("Creating model and diffusion...") + model, diffusion = create_model_and_diffusion(args, gen_loader) + + logger.log(f"Loading checkpoints from [{args.model_path}]...") + load_saved_model(model, args.model_path, use_avg=args.use_ema) + + if args.guidance_param != 1: + model = ClassifierFreeSampleModel(model) # wrapping model with the classifier-free sampler + model.to(dist_util.dev()) + model.eval() # disable random masking + + eval_motion_loaders = { + ################ + ## HumanML3D Dataset## + ################ + 'vald': lambda: get_mdm_loader(args, + model=model, diffusion=diffusion, batch_size=args.batch_size, + ground_truth_loader=gen_loader, mm_num_samples=mm_num_samples, mm_num_repeats=mm_num_repeats, + max_motion_length=gt_loader.dataset.opt.max_motion_length, num_samples_limit=num_samples_limit, + scale=args.guidance_param + ) + } + + eval_wrapper = EvaluatorMDMWrapper(args.dataset, dist_util.dev()) + evaluation(eval_wrapper, gt_loader, eval_motion_loaders, log_file, replication_times, + diversity_times, mm_num_times, run_mm=run_mm, eval_platform=eval_platform) + eval_platform.close() diff --git a/src/mdm/eval/eval_humanml_preproc.py b/src/mdm/eval/eval_humanml_preproc.py new file mode 100644 index 0000000000000000000000000000000000000000..9818eef134579e7d42d940c21392ee32c2b11bee --- /dev/null +++ b/src/mdm/eval/eval_humanml_preproc.py @@ -0,0 +1,494 @@ +""" +Generate predicted latent z for offline evaluation. + +This script uses an MDM model trained on preprocessed_posterior data to generate +predicted z values and saves them as .pt files for later decoding and evaluation +in the SAME project. + +It loads text and length information from preprocessed posterior files, using only +the 'text' and 'm_len' fields. + +Workflow: +1. Load the MDM model +2. Iterate over all test samples and generate predicted z from text (512-dim latent) +3. Save each sample's z_pred, text information, and length + +Output format: + { + 'z_pred': torch.Tensor, # shape (m_len, 512), predicted feature z + 'text': { + 'caption': str, # text description + 'tokens': list, # token list + 'start_time': float, + 'end_time': float + }, + 'm_len': int # motion length + } + +Output directory structure: + output_dir/ + repeat_1/ + posterior_000000.pt + posterior_000001.pt + ... + repeat_2/ + ... + config.json # saved generation config + +Usage example: + python -m eval.eval_humanml_preproc \ + --model_path ./save/first_exp_train/model000100000.pt \ + --posterior_dir /path/to/val_posteriors \ + --output_dir ./output/eval_first_exp \ + --num_repetitions 20 \ + --guidance_param 2.5 +""" + +import os +import sys +import json +import torch +import numpy as np +from datetime import datetime +from argparse import ArgumentParser +from tqdm import tqdm +from pathlib import Path +from torch.utils.data import Dataset, DataLoader + +# MDM imports +from utils.fixseed import fixseed +from utils.model_util import create_model_and_diffusion, load_saved_model +from utils import dist_util +from diffusion import logger +from utils.sampler_util import ClassifierFreeSampleModel + +torch.multiprocessing.set_sharing_strategy('file_system') + + +def evaluation_preproc_args(): + """Parse evaluation arguments.""" + parser = ArgumentParser(description='Generate predicted z for offline evaluation') + + # MDM model arguments + parser.add_argument("--model_path", required=True, type=str, + help="MDM model checkpoint path") + parser.add_argument("--guidance_param", default=2.5, type=float, + help="Classifier-free guidance scale") + parser.add_argument("--use_ema", action='store_true', + help="Use the EMA model") + + # Data source arguments + parser.add_argument("--posterior_dir", required=True, type=str, + help="Directory containing preprocessed posterior files") + + # Output arguments + parser.add_argument("--output_dir", required=True, type=str, + help="Output directory") + + # Evaluation arguments + parser.add_argument("--num_repetitions", default=20, type=int, + help="Number of repetitions") + parser.add_argument("--seed", default=10, type=int, help="Random seed") + parser.add_argument("--device", default=0, type=int, help="GPU device ID") + parser.add_argument("--batch_size", default=32, type=int, + help="Batch size") + + args = parser.parse_args() + return args + + +def load_mdm_args(model_path): + """Load training arguments from the checkpoint directory.""" + args_path = os.path.join(os.path.dirname(model_path), 'args.json') + with open(args_path, 'r') as f: + args_dict = json.load(f) + + # Create a simple object to store arguments. + class Args: + pass + + args = Args() + for k, v in args_dict.items(): + setattr(args, k, v) + + return args + + +class PosteriorTextDataset(Dataset): + """ + Dataset that loads text and length information from preprocessed posterior files. + Uses only the 'text' and 'm_len' fields and ignores 'mean', 'logvar', and 'sample'. + """ + def __init__(self, posterior_dir): + """ + Args: + posterior_dir: directory containing preprocessed posterior files + """ + self.posterior_dir = posterior_dir + + # Scan the directory and collect all posterior file paths. + all_files = os.listdir(posterior_dir) + posterior_files = sorted([ + f for f in all_files + if f.endswith('.pt') and f not in ['meta_info.pt', 'preprocess_config.pt'] + ]) + + self.file_paths = [os.path.join(posterior_dir, f) for f in posterior_files] + + print(f"[PosteriorTextDataset] Loaded {len(self.file_paths)} samples from {posterior_dir}") + + def __len__(self): + return len(self.file_paths) + + def __getitem__(self, idx): + """ + Load text and length information for sample idx. + + Returns: + dict: contains fields such as inp, text, and lengths + """ + posterior_data = torch.load(self.file_paths[idx]) + + # Get text information. + text_info = posterior_data['text'] + m_len = posterior_data['m_len'] + + # Handle text information across multiple formats. + if isinstance(text_info, dict): + caption = text_info.get('caption', '') + tokens = text_info.get('tokens', []) + else: + caption = str(text_info) + tokens = [] + + # Convert the token list to a string joined with '_'. + tokens_str = '_'.join(tokens) if tokens else '' + + # Create a dummy inp; only shape information is needed. + # Shape: (C, 1, T), where C=512 and T=m_len. + inp = torch.zeros(512, 1, m_len) + + # Extract the filename without path. + filename = os.path.basename(self.file_paths[idx]) + + return { + 'inp': inp, + 'text': caption, + 'tokens': tokens_str, + 'lengths': m_len, + 'text_info': text_info, # Save full text_info for output. + 'filename': filename, # Add filename. + } + + +def collate_posterior_text(batch): + """ + Collate function for PosteriorTextDataset + Output format is compatible with MDM collate. + """ + # Find the maximum length. + max_len = max(item['lengths'] for item in batch) + + batch_size = len(batch) + + # Create padded tensors. + # inp: (B, C, 1, T_max) + inp_padded = torch.zeros(batch_size, 512, 1, max_len) + + # mask: (B, 1, 1, T_max) + mask = torch.zeros(batch_size, 1, 1, max_len).bool() + + lengths = [] + texts = [] + tokens_list = [] + text_infos = [] + filenames = [] + + for i, item in enumerate(batch): + m_len = item['lengths'] + lengths.append(m_len) + texts.append(item['text']) + tokens_list.append(item['tokens']) + text_infos.append(item['text_info']) + filenames.append(item['filename']) + + # Set mask; valid positions are True. + mask[i, :, :, :m_len] = True + + lengths = torch.tensor(lengths) + + # Build model_kwargs. + cond = { + 'y': { + 'mask': mask, + 'lengths': lengths, + 'text': texts, + 'tokens': tokens_list, + 'text_infos': text_infos, # Also save full text_info. + 'filenames': filenames, # Add filename list. + } + } + + return inp_padded, cond + + +def get_posterior_text_loader(posterior_dir, batch_size=32, shuffle=False, + num_workers=4): + """ + Create a DataLoader that loads text information from posterior files. + """ + dataset = PosteriorTextDataset(posterior_dir) + + dataloader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=shuffle, + num_workers=num_workers, + collate_fn=collate_posterior_text, + pin_memory=True, + drop_last=False, + ) + + return dataloader + + +class MDMLatentGenerator: + """ + Latent generator for the MDM model. + Wraps the MDM model and provides an interface for generating z. + """ + def __init__(self, model, diffusion, args, scale=2.5): + self.model = model + self.diffusion = diffusion + self.args = args + self.scale = scale + self.sample_fn = diffusion.p_sample_loop + + def generate(self, model_kwargs, motion_shape): + """ + Generate latent z. + + Args: + model_kwargs: dictionary containing conditioning information + motion_shape: output shape (B, njoints, nfeats, T) + + Returns: + sample: generated latent z with shape (B, T, C) + """ + # Add CFG scale. + if self.scale != 1.: + model_kwargs['y']['scale'] = torch.ones(motion_shape[0], + device=dist_util.dev()) * self.scale + + # Encode text once. + if 'text' in model_kwargs['y'].keys() and 'text_embed' not in model_kwargs['y'].keys(): + model_kwargs['y']['text_embed'] = self.model.encode_text(model_kwargs['y']['text']) + + # Generate. + sample = self.sample_fn( + self.model, + motion_shape, + clip_denoised=False, + model_kwargs=model_kwargs, + skip_timesteps=0, + init_image=None, + progress=False, + dump_steps=None, + noise=None, + const_noise=False, + ) + + # Convert shape: (B, C, 1, T) -> (B, T, C). + sample = sample.squeeze(2).permute(0, 2, 1) # (B, T, C) + + return sample + + +def generate_and_save_latents(mdm_generator, dataloader, output_dir, repeat_idx, + progress=True): + """ + Generate latent z with MDM and save it. + + Args: + mdm_generator: MDM model generator + dataloader: data loader that provides text conditions + output_dir: output directory + repeat_idx: current repetition index, starting from 1 + progress: whether to show a progress bar + + Returns: + num_generated: number of generated samples + """ + # Create the repetition directory. + repeat_dir = os.path.join(output_dir, f'repeat_{repeat_idx}') + os.makedirs(repeat_dir, exist_ok=True) + + real_num_batches = len(dataloader) + + desc = f'Generating repeat_{repeat_idx}' + iterator = tqdm(enumerate(dataloader), total=real_num_batches, desc=desc) if progress else enumerate(dataloader) + + sample_idx = 0 + + with torch.no_grad(): + for i, (motion, model_kwargs) in iterator: + # Move to device. + model_kwargs['y'] = { + key: val.to(dist_util.dev()) if torch.is_tensor(val) else val + for key, val in model_kwargs['y'].items() + } + + # Get tokens. + tokens = [t.split('_') for t in model_kwargs['y']['tokens']] + + # Determine generation shape. + batch_size = motion.shape[0] + n_frames = motion.shape[-1] + motion_shape = (batch_size, mdm_generator.model.njoints, mdm_generator.model.nfeats, n_frames) + + # Generate latent z. + latent_z = mdm_generator.generate(model_kwargs, motion_shape) # (B, T, C) + + # Get valid frame counts. + lengths = model_kwargs['y']['lengths'].cpu().numpy() + + # Save each sample. + for bs_i in range(batch_size): + m_len = int(lengths[bs_i]) + + # Slice the valid part of z_pred. + z_pred = latent_z[bs_i, :m_len, :].cpu() # (m_len, 512) + + # Use the full text_info from the posterior file. + text_info = model_kwargs['y']['text_infos'][bs_i] + + # Get the original filename. + original_filename = model_kwargs['y']['filenames'][bs_i] + + # Build the save dictionary. + save_dict = { + 'z_pred': z_pred, + 'text': text_info, + 'm_len': m_len + } + + # Save the file using the original filename. + save_path = os.path.join(repeat_dir, original_filename) + torch.save(save_dict, save_path) + + sample_idx += 1 + + return sample_idx + + +def main(): + args = evaluation_preproc_args() + fixseed(args.seed) + + replication_times = args.num_repetitions + print(f'Number of repetitions: {replication_times}') + + # Create the output directory. + os.makedirs(args.output_dir, exist_ok=True) + + # Set up distributed environment. + dist_util.setup_dist(args.device) + logger.configure() + + # ========================================= + # 1. Load the MDM model + # ========================================= + logger.log("Loading MDM model arguments...") + mdm_args = load_mdm_args(args.model_path) + + # Ensure required arguments exist. + if not hasattr(mdm_args, 'pred_len'): + mdm_args.pred_len = 0 + mdm_args.context_len = 0 + if not hasattr(mdm_args, 'autoregressive'): + mdm_args.autoregressive = False + + logger.log("Creating data loader...") + + # Use preprocessed posterior files, using only text and m_len. + logger.log(f"Using posterior files from: {args.posterior_dir}") + gen_loader = get_posterior_text_loader( + posterior_dir=args.posterior_dir, + batch_size=args.batch_size, + shuffle=False, + num_workers=4 + ) + + logger.log("Creating MDM model and diffusion...") + # Create the model directly; no dummy loader is needed. + model, diffusion = create_model_and_diffusion(mdm_args, None) + + logger.log(f"Loading MDM checkpoints from [{args.model_path}]...") + load_saved_model(model, args.model_path, use_avg=args.use_ema) + + if args.guidance_param != 1: + model = ClassifierFreeSampleModel(model) + model.to(dist_util.dev()) + model.eval() + + # ========================================= + # 2. Create generator + # ========================================= + mdm_generator = MDMLatentGenerator(model, diffusion, mdm_args, scale=args.guidance_param) + + # ========================================= + # 3. Save configuration information + # ========================================= + num_samples = len(gen_loader.dataset) + config = { + 'model_path': args.model_path, + 'guidance_param': args.guidance_param, + 'use_ema': args.use_ema, + 'num_samples': num_samples, + 'num_repetitions': replication_times, + 'seed': args.seed, + 'batch_size': args.batch_size, + 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + 'njoints': mdm_args.njoints, + 'latent_dim': mdm_args.latent_dim, + 'posterior_dir': args.posterior_dir, + } + + config_path = os.path.join(args.output_dir, 'config.json') + with open(config_path, 'w') as f: + json.dump(config, f, indent=4) + print(f'Config saved to {config_path}') + + # ========================================= + # 4. Generate and save latent z + # ========================================= + logger.log("Starting generation...") + + for repeat_idx in range(1, replication_times + 1): + print(f'\n{"="*60}') + print(f'Repetition {repeat_idx}/{replication_times}') + print(f'{"="*60}') + + # Set a different random seed for each repetition. + fixseed(args.seed + repeat_idx - 1) + + num_generated = generate_and_save_latents( + mdm_generator=mdm_generator, + dataloader=gen_loader, + output_dir=args.output_dir, + repeat_idx=repeat_idx, + progress=True + ) + + print(f'Generated {num_generated} samples for repeat_{repeat_idx}') + + print(f'\n{"="*60}') + print(f'Generation completed!') + print(f'Output directory: {args.output_dir}') + print(f'Total repetitions: {replication_times}') + print(f'Samples per repetition: {num_generated}') + print(f'{"="*60}') + + +if __name__ == '__main__': + main() diff --git a/src/mdm/eval/unconstrained/evaluate.py b/src/mdm/eval/unconstrained/evaluate.py new file mode 100644 index 0000000000000000000000000000000000000000..bc3c111a837502210dcb34c6b84a0ea6adc31304 --- /dev/null +++ b/src/mdm/eval/unconstrained/evaluate.py @@ -0,0 +1,111 @@ +from eval.unconstrained.models.stgcn import STGCN +import pandas as pd +import os.path as osp +import os +import datetime + +import torch + +from torch.utils.data import DataLoader +import numpy as np +import sys as _sys +from eval.a2m.action2motion.fid import calculate_fid +from eval.a2m.action2motion.diversity import calculate_diversity +from eval.unconstrained.metrics.kid import calculate_kid +from eval.unconstrained.metrics.precision_recall import precision_and_recall +from matplotlib import pyplot as plt + +TEST = False + + +def initialize_model(device, modelpath): + num_classes = 12 + model = STGCN(in_channels=3, + num_class=num_classes, + graph_args={"layout": 'openpose', "strategy": "spatial"}, + edge_importance_weighting=True, + device=device) + model = model.to(device) + state_dict = torch.load(modelpath, map_location=device) + model.load_state_dict(state_dict) + model.eval() + return model + +def calculate_activation_statistics(activations): + activations = activations.cpu().detach().numpy() + mu = np.mean(activations, axis=0) + sigma = np.cov(activations, rowvar=False) + return mu, sigma + + +def compute_features(model, iterator, device): + activations = [] + predictions = [] + with torch.no_grad(): + for i, batch in enumerate(iterator): + batch_for_model = {} + batch_for_model['x'] = batch.to(device).float() + model(batch_for_model) + activations.append(batch_for_model['features']) + predictions.append(batch_for_model['yhat']) + # labels.append(batch_for_model['y']) + activations = torch.cat(activations, dim=0) + predictions = torch.cat(predictions, dim=0) + return activations, predictions + + +def evaluate_unconstrained_metrics(generated_motions, device, fast): + + act_rec_model_path = './assets/actionrecognition/humanact12_gru_modi_struct.pth.tar' + dataset_path = './dataset/HumanAct12Poses/humanact12_unconstrained_modi_struct.npy' + + # initialize model + act_rec_model = initialize_model(device, act_rec_model_path) + + generated_motions -= generated_motions[:, 8:9, :, :] # locate root joint of all frames at origin + + iterator_generated = DataLoader(generated_motions, batch_size=64, shuffle=False, num_workers=8) + + # compute features of generated motions + generated_features, generated_predictions = compute_features(act_rec_model, iterator_generated, device=device) + generated_stats = calculate_activation_statistics(generated_features) + + + # dataset motions + motion_data_raw = np.load(dataset_path, allow_pickle=True) + motion_data = motion_data_raw[:, :15] # data has 16 joints for back compitability with older formats + motion_data -= motion_data[:, 8:9, :, :] # locate root joint of all frames at origin + iterator_dataset = DataLoader(motion_data, batch_size=64, shuffle=False, num_workers=8) + + # compute features of dataset motions + dataset_features, dataset_predictions = compute_features(act_rec_model, iterator_dataset, device=device) + real_stats = calculate_activation_statistics(dataset_features) + + print("evaluation resutls:\n") + + fid = calculate_fid(generated_stats, real_stats) + print(f"FID score: {fid}\n") + + print("calculating KID...") + kid = calculate_kid(dataset_features.cpu(), generated_features.cpu()) + (m, s) = kid + print('KID : %.3f (%.3f)\n' % (m, s)) + + dataset_diversity = calculate_diversity(dataset_features) + generated_diversity = calculate_diversity(generated_features) + print(f"Diversity of generated motions: {generated_diversity}") + print(f"Diversity of dataset motions: {dataset_diversity}\n") + + if fast: + print("Skipping precision-recall calculation\n") + precision = recall = None + else: + print("calculating precision recall...") + precision, recall = precision_and_recall(generated_features, dataset_features) + print(f"precision: {precision}") + print(f"recall: {recall}\n") + + metrics = {'fid': fid, 'kid': kid[0], 'diversity_gen': generated_diversity.cpu().item(), 'diversity_gt': dataset_diversity.cpu().item(), + 'precision': precision, 'recall':recall} + return metrics + diff --git a/src/mdm/eval/unconstrained/metrics/kid.py b/src/mdm/eval/unconstrained/metrics/kid.py new file mode 100644 index 0000000000000000000000000000000000000000..f56c63f34953cdd8304711d8b88c8009a1bc19fc --- /dev/null +++ b/src/mdm/eval/unconstrained/metrics/kid.py @@ -0,0 +1,136 @@ +import torch +import numpy as np +from tqdm import tqdm +from sklearn.metrics.pairwise import polynomial_kernel +import sys + +# from: https://github.com/abdulfatir/gan-metrics-pytorch/blob/master/kid_score.py +def polynomial_mmd_averages(codes_g, codes_r, n_subsets=50, subset_size=1000, + ret_var=True, output=sys.stdout, **kernel_args): + m = min(codes_g.shape[0], codes_r.shape[0]) + mmds = np.zeros(n_subsets) + if ret_var: + vars = np.zeros(n_subsets) + choice = np.random.choice + + replace = subset_size < len(codes_g) + with tqdm(range(n_subsets), desc='MMD', file=output, disable=True) as bar: + for i in bar: + g = codes_g[choice(len(codes_g), subset_size, replace=replace)] + r = codes_r[choice(len(codes_r), subset_size, replace=replace)] + o = polynomial_mmd(g, r, **kernel_args, var_at_m=m, ret_var=ret_var) + if ret_var: + mmds[i], vars[i] = o + else: + mmds[i] = o + bar.set_postfix({'mean': mmds[:i+1].mean()}) + return (mmds, vars) if ret_var else mmds + +def polynomial_mmd(codes_g, codes_r, degree=3, gamma=None, coef0=1, + var_at_m=None, ret_var=True): + # use k(x, y) = (gamma + coef0)^degree + # default gamma is 1 / dim + X = codes_g + Y = codes_r + + K_XX = polynomial_kernel(X, degree=degree, gamma=gamma, coef0=coef0) + K_YY = polynomial_kernel(Y, degree=degree, gamma=gamma, coef0=coef0) + K_XY = polynomial_kernel(X, Y, degree=degree, gamma=gamma, coef0=coef0) + + return _mmd2_and_variance(K_XX, K_XY, K_YY, + var_at_m=var_at_m, ret_var=ret_var) + +def _mmd2_and_variance(K_XX, K_XY, K_YY, unit_diagonal=False, + mmd_est='unbiased', block_size=1024, + var_at_m=None, ret_var=True): + # based on + # https://github.com/dougalsutherland/opt-mmd/blob/master/two_sample/mmd.py + # but changed to not compute the full kernel matrix at once + m = K_XX.shape[0] + assert K_XX.shape == (m, m) + assert K_XY.shape == (m, m) + assert K_YY.shape == (m, m) + if var_at_m is None: + var_at_m = m + + # Get the various sums of kernels that we'll use + # Kts drop the diagonal, but we don't need to compute them explicitly + if unit_diagonal: + diag_X = diag_Y = 1 + sum_diag_X = sum_diag_Y = m + sum_diag2_X = sum_diag2_Y = m + else: + diag_X = np.diagonal(K_XX) + diag_Y = np.diagonal(K_YY) + + sum_diag_X = diag_X.sum() + sum_diag_Y = diag_Y.sum() + + sum_diag2_X = _sqn(diag_X) + sum_diag2_Y = _sqn(diag_Y) + + Kt_XX_sums = K_XX.sum(axis=1) - diag_X + Kt_YY_sums = K_YY.sum(axis=1) - diag_Y + K_XY_sums_0 = K_XY.sum(axis=0) + K_XY_sums_1 = K_XY.sum(axis=1) + + Kt_XX_sum = Kt_XX_sums.sum() + Kt_YY_sum = Kt_YY_sums.sum() + K_XY_sum = K_XY_sums_0.sum() + + if mmd_est == 'biased': + mmd2 = ((Kt_XX_sum + sum_diag_X) / (m * m) + + (Kt_YY_sum + sum_diag_Y) / (m * m) + - 2 * K_XY_sum / (m * m)) + else: + assert mmd_est in {'unbiased', 'u-statistic'} + mmd2 = (Kt_XX_sum + Kt_YY_sum) / (m * (m-1)) + if mmd_est == 'unbiased': + mmd2 -= 2 * K_XY_sum / (m * m) + else: + mmd2 -= 2 * (K_XY_sum - np.trace(K_XY)) / (m * (m-1)) + + if not ret_var: + return mmd2 + + Kt_XX_2_sum = _sqn(K_XX) - sum_diag2_X + Kt_YY_2_sum = _sqn(K_YY) - sum_diag2_Y + K_XY_2_sum = _sqn(K_XY) + + dot_XX_XY = Kt_XX_sums.dot(K_XY_sums_1) + dot_YY_YX = Kt_YY_sums.dot(K_XY_sums_0) + + m1 = m - 1 + m2 = m - 2 + zeta1_est = ( + 1 / (m * m1 * m2) * ( + _sqn(Kt_XX_sums) - Kt_XX_2_sum + _sqn(Kt_YY_sums) - Kt_YY_2_sum) + - 1 / (m * m1)**2 * (Kt_XX_sum**2 + Kt_YY_sum**2) + + 1 / (m * m * m1) * ( + _sqn(K_XY_sums_1) + _sqn(K_XY_sums_0) - 2 * K_XY_2_sum) + - 2 / m**4 * K_XY_sum**2 + - 2 / (m * m * m1) * (dot_XX_XY + dot_YY_YX) + + 2 / (m**3 * m1) * (Kt_XX_sum + Kt_YY_sum) * K_XY_sum + ) + zeta2_est = ( + 1 / (m * m1) * (Kt_XX_2_sum + Kt_YY_2_sum) + - 1 / (m * m1)**2 * (Kt_XX_sum**2 + Kt_YY_sum**2) + + 2 / (m * m) * K_XY_2_sum + - 2 / m**4 * K_XY_sum**2 + - 4 / (m * m * m1) * (dot_XX_XY + dot_YY_YX) + + 4 / (m**3 * m1) * (Kt_XX_sum + Kt_YY_sum) * K_XY_sum + ) + var_est = (4 * (var_at_m - 2) / (var_at_m * (var_at_m - 1)) * zeta1_est + + 2 / (var_at_m * (var_at_m - 1)) * zeta2_est) + + return mmd2, var_est + + +def _sqn(arr): + flat = np.ravel(arr) + return flat.dot(flat) + +def calculate_kid(real_activations, generated_activations): + kid_values = polynomial_mmd_averages(real_activations, generated_activations, n_subsets=100) + results = (kid_values[0].mean(), kid_values[0].std()) + return results diff --git a/src/mdm/eval/unconstrained/metrics/precision_recall.py b/src/mdm/eval/unconstrained/metrics/precision_recall.py new file mode 100644 index 0000000000000000000000000000000000000000..2edd4a9167ece8019fdf6bf5ac4729eb2b5124b0 --- /dev/null +++ b/src/mdm/eval/unconstrained/metrics/precision_recall.py @@ -0,0 +1,55 @@ +# based on https://github.com/blandocs/improved-precision-and-recall-metric-pytorch/blob/master/functions.py +import os, torch +import numpy as np +import torch.nn as nn +import torch.optim as optim +from tqdm import tqdm + +# self.batch_size = args.batch_size +# self.cpu = args.cpu +# self.data_size = args.data_size + +def precision_and_recall(generated_features, real_features): + k = 3 + + data_num = min(len(generated_features), len(real_features)) + print(f'data num: {data_num}') + + if data_num <= 0: + print("there is no data") + return + generated_features = generated_features[:data_num] + real_features = real_features[:data_num] + + # get precision and recall + precision = manifold_estimate(real_features, generated_features, k) + recall = manifold_estimate(generated_features, real_features, k) + + return precision, recall + +def manifold_estimate( A_features, B_features, k): + A_features = list(A_features) + B_features = list(B_features) + KNN_list_in_A = {} + for A in tqdm(A_features, ncols=80): + pairwise_distances = np.zeros(shape=(len(A_features))) + + for i, A_prime in enumerate(A_features): + d = torch.norm((A - A_prime), 2) + pairwise_distances[i] = d + + v = np.partition(pairwise_distances, k)[k] + KNN_list_in_A[A] = v + + n = 0 + + for B in tqdm(B_features, ncols=80): + for A_prime in A_features: + d = torch.norm((B - A_prime), 2) + if d <= KNN_list_in_A[A_prime]: + n += 1 + break + + return n / len(B_features) + + diff --git a/src/mdm/eval/unconstrained/models/stgcn.py b/src/mdm/eval/unconstrained/models/stgcn.py new file mode 100644 index 0000000000000000000000000000000000000000..641d8148e06a4618c5ced7ded32dc8cf9f9ba619 --- /dev/null +++ b/src/mdm/eval/unconstrained/models/stgcn.py @@ -0,0 +1,221 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +from eval.a2m.recognition.models.stgcnutils.tgcn import ConvTemporalGraphical +from eval.unconstrained.models.stgcnutils.graph import Graph + +__all__ = ["STGCN"] + + +class STGCN(nn.Module): + r"""Spatial temporal graph convolutional networks. + Args: + in_channels (int): Number of channels in the input data + num_class (int): Number of classes for the classification task + graph_args (dict): The arguments for building the graph + edge_importance_weighting (bool): If ``True``, adds a learnable + importance weighting to the edges of the graph + **kwargs (optional): Other parameters for graph convolution units + Shape: + - Input: :math:`(N, in_channels, T_{in}, V_{in}, M_{in})` + - Output: :math:`(N, num_class)` where + :math:`N` is a batch size, + :math:`T_{in}` is a length of input sequence, + :math:`V_{in}` is the number of graph nodes, + :math:`M_{in}` is the number of instance in a frame. + """ + + def __init__(self, in_channels, num_class, graph_args, + edge_importance_weighting, device, **kwargs): + super().__init__() + + self.device = device + self.num_class = num_class + + self.losses = ["accuracy", "cross_entropy", "mixed"] + self.criterion = torch.nn.CrossEntropyLoss(reduction='mean') + + # load graph + self.graph = Graph(**graph_args) + A = torch.tensor(self.graph.A, dtype=torch.float32, requires_grad=False) + self.register_buffer('A', A) + + # build networks + spatial_kernel_size = A.size(0) + temporal_kernel_size = 9 + kernel_size = (temporal_kernel_size, spatial_kernel_size) + self.data_bn = nn.BatchNorm1d(in_channels * A.size(1)) + # self.data_bn = nn.BatchNorm1d(in_channels * A.size(1), track_running_stats=False) + # self.data_bn = nn.InstanceNorm1d(in_channels * A.size(1)) + kwargs0 = {k: v for k, v in kwargs.items() if k != 'dropout'} + self.st_gcn_networks = nn.ModuleList(( + st_gcn(in_channels, 64, kernel_size, 1, residual=False, **kwargs0), + st_gcn(64, 64, kernel_size, 1, **kwargs), + st_gcn(64, 64, kernel_size, 1, **kwargs), + # st_gcn(64, 64, kernel_size, 1, **kwargs), + st_gcn(64, 128, kernel_size, 2, **kwargs), + st_gcn(128, 128, kernel_size, 1, **kwargs), + # st_gcn(128, 128, kernel_size, 1, **kwargs), + st_gcn(128, 256, kernel_size, 2, **kwargs), + # st_gcn(256, 256, kernel_size, 1, **kwargs), + # st_gcn(256, 256, kernel_size, 1, **kwargs), + )) + + # initialize parameters for edge importance weighting + if edge_importance_weighting: + self.edge_importance = nn.ParameterList([ + nn.Parameter(torch.ones(self.A.size())) + for i in self.st_gcn_networks + ]) + else: + self.edge_importance = [1] * len(self.st_gcn_networks) + + # fcn for prediction + self.fcn = nn.Conv2d(256, num_class, kernel_size=1) + + def forward(self, batch): + # TODO: use mask + # Received batch["x"] as + # Batch(48), Joints(23), Quat(4), Time(157 + # Expecting: + # Batch, Quat:4, Time, Joints, 1 + x = batch["x"].permute(0, 2, 3, 1).unsqueeze(4).contiguous() + + # data normalization + N, C, T, V, M = x.size() + x = x.permute(0, 4, 3, 1, 2).contiguous() + x = x.view(N * M, V * C, T) + x = self.data_bn(x) + x = x.view(N, M, V, C, T) + x = x.permute(0, 1, 3, 4, 2).contiguous() + x = x.view(N * M, C, T, V) + + # forward + for gcn, importance in zip(self.st_gcn_networks, self.edge_importance): + x, _ = gcn(x, self.A * importance) + + # compute feature + # _, c, t, v = x.size() + # features = x.view(N, M, c, t, v).permute(0, 2, 3, 4, 1) + # batch["features"] = features + + # global pooling + x = F.avg_pool2d(x, x.size()[2:]) + x = x.view(N, M, -1, 1, 1).mean(dim=1) + + # features + batch["features"] = x.squeeze() + + # prediction + x = self.fcn(x) + x = x.view(x.size(0), -1) + batch["yhat"] = x + return batch + + def compute_accuracy(self, batch): + confusion = torch.zeros(self.num_class, self.num_class, dtype=int) + yhat = batch["yhat"].max(dim=1).indices + ygt = batch["y"] + for label, pred in zip(ygt, yhat): + confusion[label][pred] += 1 + accuracy = torch.trace(confusion)/torch.sum(confusion) + return accuracy + + def compute_loss(self, batch): + cross_entropy = self.criterion(batch["yhat"], batch["y"]) + mixed_loss = cross_entropy + + acc = self.compute_accuracy(batch) + losses = {"cross_entropy": cross_entropy.item(), + "mixed": mixed_loss.item(), + "accuracy": acc.item()} + return mixed_loss, losses + + +class st_gcn(nn.Module): + r"""Applies a spatial temporal graph convolution over an input graph sequence. + Args: + in_channels (int): Number of channels in the input sequence data + out_channels (int): Number of channels produced by the convolution + kernel_size (tuple): Size of the temporal convolving kernel and graph convolving kernel + stride (int, optional): Stride of the temporal convolution. Default: 1 + dropout (int, optional): Dropout rate of the final output. Default: 0 + residual (bool, optional): If ``True``, applies a residual mechanism. Default: ``True`` + Shape: + - Input[0]: Input graph sequence in :math:`(N, in_channels, T_{in}, V)` format + - Input[1]: Input graph adjacency matrix in :math:`(K, V, V)` format + - Output[0]: Outpu graph sequence in :math:`(N, out_channels, T_{out}, V)` format + - Output[1]: Graph adjacency matrix for output data in :math:`(K, V, V)` format + where + :math:`N` is a batch size, + :math:`K` is the spatial kernel size, as :math:`K == kernel_size[1]`, + :math:`T_{in}/T_{out}` is a length of input/output sequence, + :math:`V` is the number of graph nodes. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride=1, + dropout=0, + residual=True): + super().__init__() + + assert len(kernel_size) == 2 + assert kernel_size[0] % 2 == 1 + padding = ((kernel_size[0] - 1) // 2, 0) + + self.gcn = ConvTemporalGraphical(in_channels, out_channels, + kernel_size[1]) + + self.tcn = nn.Sequential( + nn.BatchNorm2d(out_channels), + nn.ReLU(inplace=True), + nn.Conv2d( + out_channels, + out_channels, + (kernel_size[0], 1), + (stride, 1), + padding, + ), + nn.BatchNorm2d(out_channels), + nn.Dropout(dropout, inplace=True), + ) + + if not residual: + self.residual = lambda x: 0 + + elif (in_channels == out_channels) and (stride == 1): + self.residual = lambda x: x + + else: + self.residual = nn.Sequential( + nn.Conv2d( + in_channels, + out_channels, + kernel_size=1, + stride=(stride, 1)), + nn.BatchNorm2d(out_channels), + ) + + self.relu = nn.ReLU(inplace=True) + + def forward(self, x, A): + + res = self.residual(x) + x, A = self.gcn(x, A) + x = self.tcn(x) + res + + return self.relu(x), A + + +if __name__ == "__main__": + model = STGCN(in_channels=3, num_class=60, edge_importance_weighting=True, graph_args={"layout": "smpl_noglobal", "strategy": "spatial"}) + # Batch, in_channels, time, vertices, M + inp = torch.rand(10, 3, 16, 23, 1) + out = model(inp) + print(out.shape) + import pdb + pdb.set_trace() diff --git a/src/mdm/eval/unconstrained/models/stgcnutils/graph.py b/src/mdm/eval/unconstrained/models/stgcnutils/graph.py new file mode 100644 index 0000000000000000000000000000000000000000..8ad28036a7960339ef7c62bcc843b1a0700fd013 --- /dev/null +++ b/src/mdm/eval/unconstrained/models/stgcnutils/graph.py @@ -0,0 +1,185 @@ +import numpy as np +import pickle as pkl + +from utils.config import SMPL_KINTREE_PATH + + +class Graph: + """ The Graph to model the skeletons extracted by the openpose + Args: + strategy (string): must be one of the follow candidates + - uniform: Uniform Labeling + - distance: Distance Partitioning + - spatial: Spatial Configuration + For more information, please refer to the section 'Partition Strategies' + in our paper (https://arxiv.org/abs/1801.07455). + layout (string): must be one of the follow candidates + - openpose: Is consists of 18 joints. For more information, please + refer to https://github.com/CMU-Perceptual-Computing-Lab/openpose#output + - ntu-rgb+d: Is consists of 25 joints. For more information, please + refer to https://github.com/shahroudy/NTURGB-D + - smpl: Consists of 24/23 joints with without global rotation. + max_hop (int): the maximal distance between two connected nodes + dilation (int): controls the spacing between the kernel points + """ + + def __init__(self, + layout='openpose', + strategy='uniform', + kintree_path=SMPL_KINTREE_PATH, + max_hop=1, + dilation=1): + self.max_hop = max_hop + self.dilation = dilation + + self.kintree_path = kintree_path + + self.get_edge(layout) + self.hop_dis = get_hop_distance( + self.num_node, self.edge, max_hop=max_hop) + self.get_adjacency(strategy) + + def __str__(self): + return self.A + + def get_edge(self, layout): + if layout == 'openpose': + # self.num_node = 18 + self.num_node = 15 + self_link = [(i, i) for i in range(self.num_node)] + # neighbor_link = [(4, 3), (3, 2), (7, 6), (6, 5), (13, 12), (12, + # 11), + # (10, 9), (9, 8), (11, 5), (8, 2), (5, 1), (2, 1), + # (0, 1), (15, 0), (14, 0), (17, 15), (16, 14)] + neighbor_link = [(4, 3), (3, 2), (2, 1), + (7, 6), (6, 5), (5, 1), + (1, 0), + (14, 13), (13, 12), (12, 8), + (11, 10), (10, 9), (9, 8), + (8, 1),] + self.edge = self_link + neighbor_link + self.center = 1 + elif layout == 'smpl': + self.num_node = 24 + self_link = [(i, i) for i in range(self.num_node)] + kt = pkl.load(open(self.kintree_path, "rb")) + neighbor_link = [(k, kt[1][i + 1]) for i, k in enumerate(kt[0][1:])] + self.edge = self_link + neighbor_link + self.center = 0 + elif layout == 'smpl_noglobal': + self.num_node = 23 + self_link = [(i, i) for i in range(self.num_node)] + kt = pkl.load(open(self.kintree_path, "rb")) + neighbor_link = [(k, kt[1][i + 1]) for i, k in enumerate(kt[0][1:])] + # remove the root joint + neighbor_1base = [n for n in neighbor_link if n[0] != 0 and n[1] != 0] + neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] + self.edge = self_link + neighbor_link + self.center = 0 + elif layout == 'ntu-rgb+d': + self.num_node = 25 + self_link = [(i, i) for i in range(self.num_node)] + neighbor_1base = [(1, 2), (2, 21), (3, 21), (4, 3), (5, 21), + (6, 5), (7, 6), (8, 7), (9, 21), (10, 9), + (11, 10), (12, 11), (13, 1), (14, 13), (15, 14), + (16, 15), (17, 1), (18, 17), (19, 18), (20, 19), + (22, 23), (23, 8), (24, 25), (25, 12)] + neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] + self.edge = self_link + neighbor_link + self.center = 21 - 1 + elif layout == 'ntu_edge': + self.num_node = 24 + self_link = [(i, i) for i in range(self.num_node)] + neighbor_1base = [(1, 2), (3, 2), (4, 3), (5, 2), (6, 5), (7, 6), + (8, 7), (9, 2), (10, 9), (11, 10), (12, 11), + (13, 1), (14, 13), (15, 14), (16, 15), (17, 1), + (18, 17), (19, 18), (20, 19), (21, 22), (22, 8), + (23, 24), (24, 12)] + neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] + self.edge = self_link + neighbor_link + self.center = 2 + # elif layout=='customer settings' + # pass + else: + raise NotImplementedError("This Layout is not supported") + + def get_adjacency(self, strategy): + valid_hop = range(0, self.max_hop + 1, self.dilation) + adjacency = np.zeros((self.num_node, self.num_node)) + for hop in valid_hop: + adjacency[self.hop_dis == hop] = 1 + normalize_adjacency = normalize_digraph(adjacency) + + if strategy == 'uniform': + A = np.zeros((1, self.num_node, self.num_node)) + A[0] = normalize_adjacency + self.A = A + elif strategy == 'distance': + A = np.zeros((len(valid_hop), self.num_node, self.num_node)) + for i, hop in enumerate(valid_hop): + A[i][self.hop_dis == hop] = normalize_adjacency[self.hop_dis == hop] + self.A = A + elif strategy == 'spatial': + A = [] + for hop in valid_hop: + a_root = np.zeros((self.num_node, self.num_node)) + a_close = np.zeros((self.num_node, self.num_node)) + a_further = np.zeros((self.num_node, self.num_node)) + for i in range(self.num_node): + for j in range(self.num_node): + if self.hop_dis[j, i] == hop: + if self.hop_dis[j, self.center] == self.hop_dis[ + i, self.center]: + a_root[j, i] = normalize_adjacency[j, i] + elif self.hop_dis[j, self. + center] > self.hop_dis[i, self. + center]: + a_close[j, i] = normalize_adjacency[j, i] + else: + a_further[j, i] = normalize_adjacency[j, i] + if hop == 0: + A.append(a_root) + else: + A.append(a_root + a_close) + A.append(a_further) + A = np.stack(A) + self.A = A + else: + raise NotImplementedError("This Strategy is not supported") + + +def get_hop_distance(num_node, edge, max_hop=1): + A = np.zeros((num_node, num_node)) + for i, j in edge: + A[j, i] = 1 + A[i, j] = 1 + + # compute hop steps + hop_dis = np.zeros((num_node, num_node)) + np.inf + transfer_mat = [np.linalg.matrix_power(A, d) for d in range(max_hop + 1)] + arrive_mat = (np.stack(transfer_mat) > 0) + for d in range(max_hop, -1, -1): + hop_dis[arrive_mat[d]] = d + return hop_dis + + +def normalize_digraph(A): + Dl = np.sum(A, 0) + num_node = A.shape[0] + Dn = np.zeros((num_node, num_node)) + for i in range(num_node): + if Dl[i] > 0: + Dn[i, i] = Dl[i]**(-1) + AD = np.dot(A, Dn) + return AD + + +def normalize_undigraph(A): + Dl = np.sum(A, 0) + num_node = A.shape[0] + Dn = np.zeros((num_node, num_node)) + for i in range(num_node): + if Dl[i] > 0: + Dn[i, i] = Dl[i]**(-0.5) + DAD = np.dot(np.dot(Dn, A), Dn) + return DAD diff --git a/src/mdm/model/BERT/BERT_encoder.py b/src/mdm/model/BERT/BERT_encoder.py new file mode 100644 index 0000000000000000000000000000000000000000..369608756c3c9b567a9e588ed2d2422c3b8dc478 --- /dev/null +++ b/src/mdm/model/BERT/BERT_encoder.py @@ -0,0 +1,32 @@ +import torch.nn as nn +import os + +def load_bert(model_path): + bert = BERT(model_path) + bert.eval() + bert.text_model.training = False + for p in bert.parameters(): + p.requires_grad = False + return bert + +class BERT(nn.Module): + def __init__(self, modelpath: str): + super().__init__() + + from transformers import AutoTokenizer, AutoModel + from transformers import logging + logging.set_verbosity_error() + # Tokenizer + os.environ["TOKENIZERS_PARALLELISM"] = "false" + # Tokenizer + self.tokenizer = AutoTokenizer.from_pretrained(modelpath) + # Text model + self.text_model = AutoModel.from_pretrained(modelpath) + + + def forward(self, texts): + encoded_inputs = self.tokenizer(texts, return_tensors="pt", padding=True) + output = self.text_model(**encoded_inputs.to(self.text_model.device)).last_hidden_state + mask = encoded_inputs.attention_mask.to(dtype=bool) + # output = output * mask.unsqueeze(-1) + return output, mask diff --git a/src/mdm/model/cfg_sampler.py b/src/mdm/model/cfg_sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..a9d041f7039820e3ddb1a1de1cda8ef6a31a4a00 --- /dev/null +++ b/src/mdm/model/cfg_sampler.py @@ -0,0 +1,33 @@ +import numpy as np +import torch +import torch.nn as nn +from copy import deepcopy + +# A wrapper model for Classifier-free guidance **SAMPLING** only +# https://arxiv.org/abs/2207.12598 +class ClassifierFreeSampleModel(nn.Module): + + def __init__(self, model): + super().__init__() + self.model = model # model is the actual model to run + + assert self.model.cond_mask_prob > 0, 'Cannot run a guided diffusion on a model that has not been trained with no conditions' + + # pointers to inner model + self.rot2xyz = getattr(self.model, 'rot2xyz', None) + self.translation = self.model.translation + self.njoints = self.model.njoints + self.nfeats = self.model.nfeats + self.data_rep = self.model.data_rep + self.cond_mode = self.model.cond_mode + self.encode_text = self.model.encode_text + + def forward(self, x, timesteps, y=None): + cond_mode = self.model.cond_mode + assert cond_mode in ['text', 'action'] + y_uncond = deepcopy(y) + y_uncond['uncond'] = True + out = self.model(x, timesteps, y) + out_uncond = self.model(x, timesteps, y_uncond) + return out_uncond + (y['scale'].view(-1, 1, 1, 1) * (out - out_uncond)) + diff --git a/src/mdm/model/mdm.py b/src/mdm/model/mdm.py new file mode 100644 index 0000000000000000000000000000000000000000..112f3692f876529149dfb085cd30c1e0114b272c --- /dev/null +++ b/src/mdm/model/mdm.py @@ -0,0 +1,485 @@ +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import clip +from model.BERT.BERT_encoder import load_bert +from utils.misc import WeightedSum + + +class MDM(nn.Module): + def __init__(self, modeltype, njoints, nfeats, num_actions, translation, pose_rep, glob, glob_rot, + latent_dim=256, ff_size=1024, num_layers=8, num_heads=4, dropout=0.1, + ablation=None, activation="gelu", legacy=False, data_rep='rot6d', dataset='amass', clip_dim=512, + arch='trans_enc', emb_trans_dec=False, clip_version=None, **kargs): + super().__init__() + + self.legacy = legacy + self.modeltype = modeltype + self.njoints = njoints + self.nfeats = nfeats + self.num_actions = num_actions + self.data_rep = data_rep + self.dataset = dataset + + self.pose_rep = pose_rep + self.glob = glob + self.glob_rot = glob_rot + self.translation = translation + + self.latent_dim = latent_dim + + self.ff_size = ff_size + self.num_layers = num_layers + self.num_heads = num_heads + self.dropout = dropout + + self.ablation = ablation + self.activation = activation + self.clip_dim = clip_dim + self.action_emb = kargs.get('action_emb', None) + self.input_feats = self.njoints * self.nfeats + + self.normalize_output = kargs.get('normalize_encoder_output', False) + + self.cond_mode = kargs.get('cond_mode', 'no_cond') + self.cond_mask_prob = kargs.get('cond_mask_prob', 0.) + self.mask_frames = kargs.get('mask_frames', False) + self.arch = arch + self.gru_emb_dim = self.latent_dim if self.arch == 'gru' else 0 + self.input_process = InputProcess(self.data_rep, self.input_feats+self.gru_emb_dim, self.latent_dim) + + self.emb_policy = kargs.get('emb_policy', 'add') + + self.sequence_pos_encoder = PositionalEncoding(self.latent_dim, self.dropout, max_len=kargs.get('pos_embed_max_len', 5000)) + self.emb_trans_dec = emb_trans_dec + + self.pred_len = kargs.get('pred_len', 0) + self.context_len = kargs.get('context_len', 0) + self.total_len = self.pred_len + self.context_len + self.is_prefix_comp = self.total_len > 0 + self.all_goal_joint_names = kargs.get('all_goal_joint_names', []) + + self.multi_target_cond = kargs.get('multi_target_cond', False) + self.multi_encoder_type = kargs.get('multi_encoder_type', 'multi') + self.target_enc_layers = kargs.get('target_enc_layers', 1) + if self.multi_target_cond: + if self.multi_encoder_type == 'multi': + self.embed_target_cond = EmbedTargetLocMulti(self.all_goal_joint_names, self.latent_dim) + elif self.multi_encoder_type == 'single': + self.embed_target_cond = EmbedTargetLocSingle(self.all_goal_joint_names, self.latent_dim, self.target_enc_layers) + elif self.multi_encoder_type == 'split': + self.embed_target_cond = EmbedTargetLocSplit(self.all_goal_joint_names, self.latent_dim, self.target_enc_layers) + + if self.arch == 'trans_enc': + print("TRANS_ENC init") + seqTransEncoderLayer = nn.TransformerEncoderLayer(d_model=self.latent_dim, + nhead=self.num_heads, + dim_feedforward=self.ff_size, + dropout=self.dropout, + activation=self.activation) + + self.seqTransEncoder = nn.TransformerEncoder(seqTransEncoderLayer, + num_layers=self.num_layers) + elif self.arch == 'trans_dec': + print("TRANS_DEC init") + seqTransDecoderLayer = nn.TransformerDecoderLayer(d_model=self.latent_dim, + nhead=self.num_heads, + dim_feedforward=self.ff_size, + dropout=self.dropout, + activation=activation) + self.seqTransDecoder = nn.TransformerDecoder(seqTransDecoderLayer, + num_layers=self.num_layers) + elif self.arch == 'gru': + print("GRU init") + self.gru = nn.GRU(self.latent_dim, self.latent_dim, num_layers=self.num_layers, batch_first=True) + else: + raise ValueError('Please choose correct architecture [trans_enc, trans_dec, gru]') + + self.embed_timestep = TimestepEmbedder(self.latent_dim, self.sequence_pos_encoder) + + if self.cond_mode != 'no_cond': + if 'text' in self.cond_mode: + # We support CLIP encoder and DistilBERT + print('EMBED TEXT') + + self.text_encoder_type = kargs.get('text_encoder_type', 'clip') + + if self.text_encoder_type == "clip": + print('Loading CLIP...') + self.clip_version = clip_version + self.clip_model = self.load_and_freeze_clip(clip_version) + self.encode_text = self.clip_encode_text + elif self.text_encoder_type == 'bert': + assert self.arch == 'trans_dec' + # assert self.emb_trans_dec == False # passing just the time embed so it's fine + print("Loading BERT...") + # bert_model_path = 'model/BERT/distilbert-base-uncased' + bert_model_path = 'distilbert/distilbert-base-uncased' + self.clip_model = load_bert(bert_model_path) # Sorry for that, the naming is for backward compatibility + self.encode_text = self.bert_encode_text + self.clip_dim = 768 + else: + raise ValueError('We only support [CLIP, BERT] text encoders') + + self.embed_text = nn.Linear(self.clip_dim, self.latent_dim) + + if 'action' in self.cond_mode: + self.embed_action = EmbedAction(self.num_actions, self.latent_dim) + print('EMBED ACTION') + + self.output_process = OutputProcess(self.data_rep, self.input_feats, self.latent_dim, self.njoints, + self.nfeats) + + self.use_rot2xyz = kargs.get('use_rot2xyz', True) + self.rot2xyz = None + if self.use_rot2xyz: + from model.rotation2xyz import Rotation2xyz + self.rot2xyz = Rotation2xyz(device='cpu', dataset=self.dataset) + + def parameters_wo_clip(self): + return [p for name, p in self.named_parameters() if not name.startswith('clip_model.')] + + def load_and_freeze_clip(self, clip_version): + clip_model, clip_preprocess = clip.load(clip_version, device='cpu', + jit=False) # Must set jit=False for training + clip.model.convert_weights( + clip_model) # Actually this line is unnecessary since clip by default already on float16 + + # Freeze CLIP weights + clip_model.eval() + for p in clip_model.parameters(): + p.requires_grad = False + + return clip_model + + def mask_cond(self, cond, force_mask=False): + bs = cond.shape[-2] + if force_mask: + return torch.zeros_like(cond) + elif self.training and self.cond_mask_prob > 0.: + mask = torch.bernoulli(torch.ones(bs, device=cond.device) * self.cond_mask_prob).view(1, bs, 1) # 1-> use null_cond, 0-> use real cond + return cond * (1. - mask) + else: + return cond + + def clip_encode_text(self, raw_text): + # raw_text - list (batch_size length) of strings with input text prompts + device = next(self.parameters()).device + max_text_len = 20 if self.dataset in ['humanml', 'kit'] else None # Specific hardcoding for humanml dataset + if max_text_len is not None: + default_context_length = 77 + context_length = max_text_len + 2 # start_token + 20 + end_token + assert context_length < default_context_length + texts = clip.tokenize(raw_text, context_length=context_length, truncate=True).to(device) # [bs, context_length] # if n_tokens > context_length -> will truncate + # print('texts', texts.shape) + zero_pad = torch.zeros([texts.shape[0], default_context_length-context_length], dtype=texts.dtype, device=texts.device) + texts = torch.cat([texts, zero_pad], dim=1) + # print('texts after pad', texts.shape, texts) + else: + texts = clip.tokenize(raw_text, truncate=True).to(device) # [bs, context_length] # if n_tokens > 77 -> will truncate + return self.clip_model.encode_text(texts).float().unsqueeze(0) + + def bert_encode_text(self, raw_text): + # enc_text = self.clip_model(raw_text) + # enc_text = enc_text.permute(1, 0, 2) + # return enc_text + enc_text, mask = self.clip_model(raw_text) # self.clip_model.get_last_hidden_state(raw_text, return_mask=True) # mask: False means no token there + enc_text = enc_text.permute(1, 0, 2) + mask = ~mask # mask: True means no token there, we invert since the meaning of mask for transformer is inverted https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html + return enc_text, mask + + def forward(self, x, timesteps, y=None): + """ + x: [batch_size, njoints, nfeats, max_frames], denoted x_t in the paper + timesteps: [batch_size] (int) + """ + bs, njoints, nfeats, nframes = x.shape + time_emb = self.embed_timestep(timesteps) # [1, bs, d] + + if 'target_cond' in y.keys(): + # NOTE: We don't use CFG for joints - but we do wat to support uncond sampling for generation and eval! + time_emb += self.mask_cond(self.embed_target_cond(y['target_cond'], y['target_joint_names'], y['is_heading'])[None], force_mask=y.get('target_uncond', False)) # For uncond support and CFG + # time_emb += self.embed_target_cond(y['target_cond'], y['target_joint_names'], y['is_heading'])[None] + + # Build input for prefix completion + if self.is_prefix_comp: + x = torch.cat([y['prefix'], x], dim=-1) + y['mask'] = torch.cat([torch.ones([bs, 1, 1, self.context_len], dtype=y['mask'].dtype, device=y['mask'].device), + y['mask']], dim=-1) + + force_mask = y.get('uncond', False) + if 'text' in self.cond_mode: + if 'text_embed' in y.keys(): # caching option + enc_text = y['text_embed'] + else: + enc_text = self.encode_text(y['text']) + if type(enc_text) == tuple: + enc_text, text_mask = enc_text + if text_mask.shape[0] == 1 and bs > 1: # casting mask for the single-prompt-for-all case + text_mask = torch.repeat_interleave(text_mask, bs, dim=0) + text_emb = self.embed_text(self.mask_cond(enc_text, force_mask=force_mask)) # casting mask for the single-prompt-for-all case + if self.emb_policy == 'add': + emb = text_emb + time_emb + else: + emb = torch.cat([time_emb, text_emb], dim=0) + text_mask = torch.cat([torch.zeros_like(text_mask[:, 0:1]), text_mask], dim=1) + if 'action' in self.cond_mode: + action_emb = self.embed_action(y['action']) + emb = time_emb + self.mask_cond(action_emb, force_mask=force_mask) + if self.cond_mode == 'no_cond': + # unconstrained + emb = time_emb + + if self.arch == 'gru': + x_reshaped = x.reshape(bs, njoints*nfeats, 1, nframes) + emb_gru = emb.repeat(nframes, 1, 1) #[#frames, bs, d] + emb_gru = emb_gru.permute(1, 2, 0) #[bs, d, #frames] + emb_gru = emb_gru.reshape(bs, self.latent_dim, 1, nframes) #[bs, d, 1, #frames] + x = torch.cat((x_reshaped, emb_gru), axis=1) #[bs, d+joints*feat, 1, #frames] + + x = self.input_process(x) + + # TODO - move to collate + frames_mask = None + is_valid_mask = y['mask'].shape[-1] > 1 # Don't use mask with the generate script + if self.mask_frames and is_valid_mask: + frames_mask = torch.logical_not(y['mask'][..., :x.shape[0]].squeeze(1).squeeze(1)).to(device=x.device) + if self.emb_trans_dec or self.arch == 'trans_enc': + step_mask = torch.zeros((bs, 1), dtype=torch.bool, device=x.device) + frames_mask = torch.cat([step_mask, frames_mask], dim=1) + + if self.arch == 'trans_enc': + # adding the timestep embed + xseq = torch.cat((emb, x), axis=0) # [seqlen+1, bs, d] + xseq = self.sequence_pos_encoder(xseq) # [seqlen+1, bs, d] + output = self.seqTransEncoder(xseq, src_key_padding_mask=frames_mask)[1:] # , src_key_padding_mask=~maskseq) # [seqlen, bs, d] + + elif self.arch == 'trans_dec': + if self.emb_trans_dec: + xseq = torch.cat((time_emb, x), axis=0) + else: + xseq = x + xseq = self.sequence_pos_encoder(xseq) # [seqlen+1, bs, d] + + if self.text_encoder_type == 'clip': + output = self.seqTransDecoder(tgt=xseq, memory=emb, tgt_key_padding_mask=frames_mask) + elif self.text_encoder_type == 'bert': + output = self.seqTransDecoder(tgt=xseq, memory=emb, memory_key_padding_mask=text_mask, tgt_key_padding_mask=frames_mask) # Rotem's bug fix + else: + raise ValueError() + + if self.emb_trans_dec: + output = output[1:] # [seqlen, bs, d] + + elif self.arch == 'gru': + xseq = x + xseq = self.sequence_pos_encoder(xseq) # [seqlen, bs, d] + output, _ = self.gru(xseq) + + # Extract completed suffix + if self.is_prefix_comp: + output = output[self.context_len:] + y['mask'] = y['mask'][..., self.context_len:] + + output = self.output_process(output) # [bs, njoints, nfeats, nframes] + return output + + + def _apply(self, fn): + super()._apply(fn) + if self.rot2xyz is not None: + self.rot2xyz.smpl_model._apply(fn) + + + def train(self, *args, **kwargs): + super().train(*args, **kwargs) + if self.rot2xyz is not None: + self.rot2xyz.smpl_model.train(*args, **kwargs) + + +class PositionalEncoding(nn.Module): + def __init__(self, d_model, dropout=0.1, max_len=5000): + super(PositionalEncoding, self).__init__() + self.dropout = nn.Dropout(p=dropout) + + pe = torch.zeros(max_len, d_model) + position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) + div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-np.log(10000.0) / d_model)) + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + pe = pe.unsqueeze(0).transpose(0, 1) + + self.register_buffer('pe', pe) + + def forward(self, x): + # not used in the final model + x = x + self.pe[:x.shape[0], :] + return self.dropout(x) + + +class TimestepEmbedder(nn.Module): + def __init__(self, latent_dim, sequence_pos_encoder): + super().__init__() + self.latent_dim = latent_dim + self.sequence_pos_encoder = sequence_pos_encoder + + time_embed_dim = self.latent_dim + self.time_embed = nn.Sequential( + nn.Linear(self.latent_dim, time_embed_dim), + nn.SiLU(), + nn.Linear(time_embed_dim, time_embed_dim), + ) + + def forward(self, timesteps): + return self.time_embed(self.sequence_pos_encoder.pe[timesteps]).permute(1, 0, 2) + + +class InputProcess(nn.Module): + def __init__(self, data_rep, input_feats, latent_dim): + super().__init__() + self.data_rep = data_rep + self.input_feats = input_feats + self.latent_dim = latent_dim + self.poseEmbedding = nn.Linear(self.input_feats, self.latent_dim) + if self.data_rep == 'rot_vel': + self.velEmbedding = nn.Linear(self.input_feats, self.latent_dim) + + def forward(self, x): + bs, njoints, nfeats, nframes = x.shape + x = x.permute((3, 0, 1, 2)).reshape(nframes, bs, njoints*nfeats) + + if self.data_rep in ['rot6d', 'xyz', 'hml_vec']: + x = self.poseEmbedding(x) # [seqlen, bs, d] + return x + elif self.data_rep == 'rot_vel': + first_pose = x[[0]] # [1, bs, 150] + first_pose = self.poseEmbedding(first_pose) # [1, bs, d] + vel = x[1:] # [seqlen-1, bs, 150] + vel = self.velEmbedding(vel) # [seqlen-1, bs, d] + return torch.cat((first_pose, vel), axis=0) # [seqlen, bs, d] + else: + raise ValueError + + +class OutputProcess(nn.Module): + def __init__(self, data_rep, input_feats, latent_dim, njoints, nfeats): + super().__init__() + self.data_rep = data_rep + self.input_feats = input_feats + self.latent_dim = latent_dim + self.njoints = njoints + self.nfeats = nfeats + self.poseFinal = nn.Linear(self.latent_dim, self.input_feats) + if self.data_rep == 'rot_vel': + self.velFinal = nn.Linear(self.latent_dim, self.input_feats) + + def forward(self, output): + nframes, bs, d = output.shape + if self.data_rep in ['rot6d', 'xyz', 'hml_vec']: + output = self.poseFinal(output) # [seqlen, bs, 150] + elif self.data_rep == 'rot_vel': + first_pose = output[[0]] # [1, bs, d] + first_pose = self.poseFinal(first_pose) # [1, bs, 150] + vel = output[1:] # [seqlen-1, bs, d] + vel = self.velFinal(vel) # [seqlen-1, bs, 150] + output = torch.cat((first_pose, vel), axis=0) # [seqlen, bs, 150] + else: + raise ValueError + output = output.reshape(nframes, bs, self.njoints, self.nfeats) + output = output.permute(1, 2, 3, 0) # [bs, njoints, nfeats, nframes] + return output + + +class EmbedAction(nn.Module): + def __init__(self, num_actions, latent_dim): + super().__init__() + self.action_embedding = nn.Parameter(torch.randn(num_actions, latent_dim)) + + def forward(self, input): + idx = input[:, 0].to(torch.long) # an index array must be long + output = self.action_embedding[idx] + return output + +class EmbedTargetLocSingle(nn.Module): + def __init__(self, all_goal_joint_names, latent_dim, num_layers=1): + super().__init__() + self.extended_goal_joint_names = all_goal_joint_names + ['traj', 'heading'] + self.target_cond_dim = len(self.extended_goal_joint_names) * 4 # 4 => (x,y,z,is_valid) + self.latent_dim = latent_dim + _layers = [nn.Linear(self.target_cond_dim, self.latent_dim)] + for _ in range(num_layers): + _layers += [nn.SiLU(), nn.Linear(self.latent_dim, self.latent_dim)] + self.mlp = nn.Sequential(*_layers) + + def forward(self, input, target_joint_names, target_heading): + # TODO - generate validity from outside the model + validity = torch.zeros_like(input)[..., :1] + for sample_idx, sample_joint_names in enumerate(target_joint_names): + sample_joint_names_w_heading = np.append(sample_joint_names, 'heading') if target_heading[sample_idx] else sample_joint_names + for j in sample_joint_names_w_heading: + validity[sample_idx, self.extended_goal_joint_names.index(j)] = 1. + + mlp_input = torch.cat([input, validity], dim=-1).view(input.shape[0], -1) + return self.mlp(mlp_input) + + +class EmbedTargetLocSplit(nn.Module): + def __init__(self, all_goal_joint_names, latent_dim, num_layers=1): + super().__init__() + self.extended_goal_joint_names = all_goal_joint_names + ['traj', 'heading'] + self.target_cond_dim = 4 + self.latent_dim = latent_dim + self.splited_dim = self.latent_dim // len(self.extended_goal_joint_names) + assert self.latent_dim % len(self.extended_goal_joint_names) == 0 + self.mini_mlps = nn.ModuleList() + for _ in self.extended_goal_joint_names: + _layers = [nn.Linear(self.target_cond_dim, self.splited_dim)] + for _ in range(num_layers): + _layers += [nn.SiLU(), nn.Linear(self.splited_dim, self.splited_dim)] + self.mini_mlps.append(nn.Sequential(*_layers)) + + def forward(self, input, target_joint_names, target_heading): + # TODO - generate validity from outside the model + validity = torch.zeros_like(input)[..., :1] + for sample_idx, sample_joint_names in enumerate(target_joint_names): + sample_joint_names_w_heading = np.append(sample_joint_names, 'heading') if target_heading[sample_idx] else sample_joint_names + for j in sample_joint_names_w_heading: + validity[sample_idx, self.extended_goal_joint_names.index(j)] = 1. + + mlp_input = torch.cat([input, validity], dim=-1) + mlp_splits = [self.mini_mlps[i](mlp_input[:, i]) for i in range(mlp_input.shape[1])] + return torch.cat(mlp_splits, dim=-1) + +class EmbedTargetLocMulti(nn.Module): + def __init__(self, all_goal_joint_names, latent_dim): + super().__init__() + + # todo: use a tensor of weight per joint, and another one for biases, then apply a selection in one go like we to for actions + self.extended_goal_joint_names = all_goal_joint_names + ['traj', 'heading'] + self.extended_goal_joint_idx = {joint_name: idx for idx, joint_name in enumerate(self.extended_goal_joint_names)} + self.n_extended_goal_joints = len(self.extended_goal_joint_names) + self.target_loc_emb = nn.ParameterDict({joint_name: + nn.Sequential( + nn.Linear(3, latent_dim), + nn.SiLU(), + nn.Linear(latent_dim, latent_dim)) + for joint_name in self.extended_goal_joint_names}) # todo: check if 3 works for heading and traj + # nn.Linear(3, latent_dim) for joint_name in self.extended_goal_joint_names}) # todo: check if 3 works for heading and traj + self.target_all_loc_emb = WeightedSum(self.n_extended_goal_joints) # nn.Linear(self.n_extended_goal_joints, latent_dim) + self.latent_dim = latent_dim + + def forward(self, input, target_joint_names, target_heading): + output = torch.zeros((input.shape[0], self.latent_dim), dtype=input.dtype, device=input.device) + + # Iterate over the batch and apply the appropriate filter for each joint + for sample_idx, sample_joint_names in enumerate(target_joint_names): + sample_joint_names_w_heading = np.append(sample_joint_names, 'heading') if target_heading[sample_idx] else sample_joint_names + output_one_sample = torch.zeros((self.n_extended_goal_joints, self.latent_dim), dtype=input.dtype, device=input.device) + for joint_name in sample_joint_names_w_heading: + layer = self.target_loc_emb[joint_name] + output_one_sample[self.extended_goal_joint_idx[joint_name]] = layer(input[sample_idx, self.extended_goal_joint_idx[joint_name]]) + output[sample_idx] = self.target_all_loc_emb(output_one_sample) + # print(torch.where(output_one_sample.sum(axis=1)!=0)[0].cpu().numpy()) + + return output diff --git a/src/mdm/model/rotation2xyz.py b/src/mdm/model/rotation2xyz.py new file mode 100644 index 0000000000000000000000000000000000000000..9746c7d73f2e30bfb2495cb901f8422f04ecbf5b --- /dev/null +++ b/src/mdm/model/rotation2xyz.py @@ -0,0 +1,92 @@ +# This code is based on https://github.com/Mathux/ACTOR.git +import torch +import utils.rotation_conversions as geometry + + +from model.smpl import SMPL, JOINTSTYPE_ROOT +# from .get_model import JOINTSTYPES +JOINTSTYPES = ["a2m", "a2mpl", "smpl", "vibe", "vertices"] + + +class Rotation2xyz: + def __init__(self, device, dataset='amass'): + self.device = device + self.dataset = dataset + self.smpl_model = SMPL().eval().to(device) + + def __call__(self, x, mask, pose_rep, translation, glob, + jointstype, vertstrans, betas=None, beta=0, + glob_rot=None, get_rotations_back=False, **kwargs): + if pose_rep == "xyz": + return x + + if mask is None: + mask = torch.ones((x.shape[0], x.shape[-1]), dtype=bool, device=x.device) + + if not glob and glob_rot is None: + raise TypeError("You must specify global rotation if glob is False") + + if jointstype not in JOINTSTYPES: + raise NotImplementedError("This jointstype is not implemented.") + + if translation: + x_translations = x[:, -1, :3] + x_rotations = x[:, :-1] + else: + x_rotations = x + + x_rotations = x_rotations.permute(0, 3, 1, 2) + nsamples, time, njoints, feats = x_rotations.shape + + # Compute rotations (convert only masked sequences output) + if pose_rep == "rotvec": + rotations = geometry.axis_angle_to_matrix(x_rotations[mask]) + elif pose_rep == "rotmat": + rotations = x_rotations[mask].view(-1, njoints, 3, 3) + elif pose_rep == "rotquat": + rotations = geometry.quaternion_to_matrix(x_rotations[mask]) + elif pose_rep == "rot6d": + rotations = geometry.rotation_6d_to_matrix(x_rotations[mask]) + else: + raise NotImplementedError("No geometry for this one.") + + if not glob: + global_orient = torch.tensor(glob_rot, device=x.device) + global_orient = geometry.axis_angle_to_matrix(global_orient).view(1, 1, 3, 3) + global_orient = global_orient.repeat(len(rotations), 1, 1, 1) + else: + global_orient = rotations[:, 0] + rotations = rotations[:, 1:] + + if betas is None: + betas = torch.zeros([rotations.shape[0], self.smpl_model.num_betas], + dtype=rotations.dtype, device=rotations.device) + betas[:, 1] = beta + # import ipdb; ipdb.set_trace() + out = self.smpl_model(body_pose=rotations, global_orient=global_orient, betas=betas) + + # get the desirable joints + joints = out[jointstype] + + x_xyz = torch.empty(nsamples, time, joints.shape[1], 3, device=x.device, dtype=x.dtype) + x_xyz[~mask] = 0 + x_xyz[mask] = joints + + x_xyz = x_xyz.permute(0, 2, 3, 1).contiguous() + + # the first translation root at the origin on the prediction + if jointstype != "vertices": + rootindex = JOINTSTYPE_ROOT[jointstype] + x_xyz = x_xyz - x_xyz[:, [rootindex], :, :] + + if translation and vertstrans: + # the first translation root at the origin + x_translations = x_translations - x_translations[:, :, [0]] + + # add the translation to all the joints + x_xyz = x_xyz + x_translations[:, None, :, :] + + if get_rotations_back: + return x_xyz, rotations, global_orient + else: + return x_xyz diff --git a/src/mdm/model/smpl.py b/src/mdm/model/smpl.py new file mode 100644 index 0000000000000000000000000000000000000000..587f5419601a74df92c1e37263b28d4aa6a7c0a9 --- /dev/null +++ b/src/mdm/model/smpl.py @@ -0,0 +1,97 @@ +# This code is based on https://github.com/Mathux/ACTOR.git +import numpy as np +import torch + +import contextlib + +from smplx import SMPLLayer as _SMPLLayer +from smplx.lbs import vertices2joints + + +# action2motion_joints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 24, 38] +# change 0 and 8 +action2motion_joints = [8, 1, 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 14, 21, 24, 38] + +from utils.config import SMPL_MODEL_PATH, JOINT_REGRESSOR_TRAIN_EXTRA + +JOINTSTYPE_ROOT = {"a2m": 0, # action2motion + "smpl": 0, + "a2mpl": 0, # set(smpl, a2m) + "vibe": 8} # 0 is the 8 position: OP MidHip below + +JOINT_MAP = { + 'OP Nose': 24, 'OP Neck': 12, 'OP RShoulder': 17, + 'OP RElbow': 19, 'OP RWrist': 21, 'OP LShoulder': 16, + 'OP LElbow': 18, 'OP LWrist': 20, 'OP MidHip': 0, + 'OP RHip': 2, 'OP RKnee': 5, 'OP RAnkle': 8, + 'OP LHip': 1, 'OP LKnee': 4, 'OP LAnkle': 7, + 'OP REye': 25, 'OP LEye': 26, 'OP REar': 27, + 'OP LEar': 28, 'OP LBigToe': 29, 'OP LSmallToe': 30, + 'OP LHeel': 31, 'OP RBigToe': 32, 'OP RSmallToe': 33, 'OP RHeel': 34, + 'Right Ankle': 8, 'Right Knee': 5, 'Right Hip': 45, + 'Left Hip': 46, 'Left Knee': 4, 'Left Ankle': 7, + 'Right Wrist': 21, 'Right Elbow': 19, 'Right Shoulder': 17, + 'Left Shoulder': 16, 'Left Elbow': 18, 'Left Wrist': 20, + 'Neck (LSP)': 47, 'Top of Head (LSP)': 48, + 'Pelvis (MPII)': 49, 'Thorax (MPII)': 50, + 'Spine (H36M)': 51, 'Jaw (H36M)': 52, + 'Head (H36M)': 53, 'Nose': 24, 'Left Eye': 26, + 'Right Eye': 25, 'Left Ear': 28, 'Right Ear': 27 +} + +JOINT_NAMES = [ + 'OP Nose', 'OP Neck', 'OP RShoulder', + 'OP RElbow', 'OP RWrist', 'OP LShoulder', + 'OP LElbow', 'OP LWrist', 'OP MidHip', + 'OP RHip', 'OP RKnee', 'OP RAnkle', + 'OP LHip', 'OP LKnee', 'OP LAnkle', + 'OP REye', 'OP LEye', 'OP REar', + 'OP LEar', 'OP LBigToe', 'OP LSmallToe', + 'OP LHeel', 'OP RBigToe', 'OP RSmallToe', 'OP RHeel', + 'Right Ankle', 'Right Knee', 'Right Hip', + 'Left Hip', 'Left Knee', 'Left Ankle', + 'Right Wrist', 'Right Elbow', 'Right Shoulder', + 'Left Shoulder', 'Left Elbow', 'Left Wrist', + 'Neck (LSP)', 'Top of Head (LSP)', + 'Pelvis (MPII)', 'Thorax (MPII)', + 'Spine (H36M)', 'Jaw (H36M)', + 'Head (H36M)', 'Nose', 'Left Eye', + 'Right Eye', 'Left Ear', 'Right Ear' +] + + +# adapted from VIBE/SPIN to output smpl_joints, vibe joints and action2motion joints +class SMPL(_SMPLLayer): + """ Extension of the official SMPL implementation to support more joints """ + + def __init__(self, model_path=SMPL_MODEL_PATH, **kwargs): + kwargs["model_path"] = model_path + + # remove the verbosity for the 10-shapes beta parameters + with contextlib.redirect_stdout(None): + super(SMPL, self).__init__(**kwargs) + + J_regressor_extra = np.load(JOINT_REGRESSOR_TRAIN_EXTRA) + self.register_buffer('J_regressor_extra', torch.tensor(J_regressor_extra, dtype=torch.float32)) + vibe_indexes = np.array([JOINT_MAP[i] for i in JOINT_NAMES]) + a2m_indexes = vibe_indexes[action2motion_joints] + smpl_indexes = np.arange(24) + a2mpl_indexes = np.unique(np.r_[smpl_indexes, a2m_indexes]) + + self.maps = {"vibe": vibe_indexes, + "a2m": a2m_indexes, + "smpl": smpl_indexes, + "a2mpl": a2mpl_indexes} + + def forward(self, *args, **kwargs): + smpl_output = super(SMPL, self).forward(*args, **kwargs) + + extra_joints = vertices2joints(self.J_regressor_extra, smpl_output.vertices) + all_joints = torch.cat([smpl_output.joints, extra_joints], dim=1) + + output = {"vertices": smpl_output.vertices} + + for joinstype, indexes in self.maps.items(): + output[joinstype] = all_joints[:, indexes] + + return output \ No newline at end of file diff --git a/src/mdm/prepare/download_a2m_datasets.sh b/src/mdm/prepare/download_a2m_datasets.sh new file mode 100644 index 0000000000000000000000000000000000000000..fdfc7a8e42dba84714d9d320013c6e22505d9bfa --- /dev/null +++ b/src/mdm/prepare/download_a2m_datasets.sh @@ -0,0 +1,22 @@ +mkdir -p dataset/ +cd dataset/ + +echo "The datasets will be stored in the 'dataset' folder\n" + +# HumanAct12 poses +echo "Downloading the HumanAct12 poses dataset" +gdown "https://drive.google.com/uc?id=1130gHSvNyJmii7f6pv5aY5IyQIWc3t7R" +echo "Extracting the HumanAct12 poses dataset" +tar xfzv HumanAct12Poses.tar.gz +echo "Cleaning\n" +rm HumanAct12Poses.tar.gz + +# Donwload UESTC poses estimated with VIBE +echo "Downloading the UESTC poses estimated with VIBE" +gdown "https://drive.google.com/uc?id=1LE-EmYNzECU8o7A2DmqDKtqDMucnSJsy" +echo "Extracting the UESTC poses estimated with VIBE" +tar xjvf uestc.tar.bz2 +echo "Cleaning\n" +rm uestc.tar.bz2 + +echo "Downloading done!" diff --git a/src/mdm/prepare/download_glove.sh b/src/mdm/prepare/download_glove.sh new file mode 100644 index 0000000000000000000000000000000000000000..ccf270b59ae637313fcde9a856e25ab5044df753 --- /dev/null +++ b/src/mdm/prepare/download_glove.sh @@ -0,0 +1,9 @@ +echo -e "Downloading glove (in use by the evaluators, not by MDM itself)" +gdown --fuzzy https://drive.google.com/file/d/1cmXKUT31pqd7_XpJAiWEo1K81TMYHA5n/view?usp=sharing +rm -rf glove + +unzip glove.zip +echo -e "Cleaning\n" +rm glove.zip + +echo -e "Downloading done!" \ No newline at end of file diff --git a/src/mdm/prepare/download_recognition_models.sh b/src/mdm/prepare/download_recognition_models.sh new file mode 100644 index 0000000000000000000000000000000000000000..4c7a663b02c4df420be45d4aed88835b0a7517a9 --- /dev/null +++ b/src/mdm/prepare/download_recognition_models.sh @@ -0,0 +1,12 @@ +mkdir -p assets/actionrecognition/ +cd assets/actionrecognition/ + +echo -e "Downloading the HumanAct12 action recognition model" +wget https://raw.githubusercontent.com/EricGuo5513/action-to-motion/master/model_file/action_recognition_model_humanact12.tar -O humanact12_gru.tar +echo -e + +echo -e "Downloading the UESTC action recognition model" +gdown "https://drive.google.com/uc?id=1bSSD69s1dHY7Uk0RGbGc6p7uhUxSDSBK" +echo -e + +echo -e "Downloading done!" diff --git a/src/mdm/prepare/download_recognition_unconstrained_models.sh b/src/mdm/prepare/download_recognition_unconstrained_models.sh new file mode 100644 index 0000000000000000000000000000000000000000..487471d43ff4cd4e31ecdf2335537d4c9b540a8b --- /dev/null +++ b/src/mdm/prepare/download_recognition_unconstrained_models.sh @@ -0,0 +1,8 @@ +mkdir -p assets/actionrecognition/ +cd assets/actionrecognition/ + +echo -e "Downloading the HumanAct12 action recognition model, adjusted for the unconstrained setting." +gdown "1xfigimkPxKt3a8zvn_ME_NAR6CyTqneK" +echo -e + +echo -e "Downloading done!" diff --git a/src/mdm/prepare/download_smpl_files.sh b/src/mdm/prepare/download_smpl_files.sh new file mode 100644 index 0000000000000000000000000000000000000000..595175e0fb2016f52f56cdcf448e38765cbb86e5 --- /dev/null +++ b/src/mdm/prepare/download_smpl_files.sh @@ -0,0 +1,12 @@ +mkdir -p body_models +cd body_models/ + +echo -e "The smpl files will be stored in the 'body_models/smpl/' folder\n" +gdown "https://drive.google.com/uc?id=1INYlGA76ak_cKGzvpOV2Pe6RkYTlXTW2" +rm -rf smpl + +unzip smpl.zip +echo -e "Cleaning\n" +rm smpl.zip + +echo -e "Downloading done!" \ No newline at end of file diff --git a/src/mdm/prepare/download_t2m_evaluators.sh b/src/mdm/prepare/download_t2m_evaluators.sh new file mode 100644 index 0000000000000000000000000000000000000000..87f46a76fffc97e078456e25e52586a069536edf --- /dev/null +++ b/src/mdm/prepare/download_t2m_evaluators.sh @@ -0,0 +1,15 @@ +echo -e "Downloading T2M evaluators" +# gdown --fuzzy https://drive.google.com/file/d/1DSaKqWX2HlwBtVH5l7DdW96jeYUIXsOP/view +# gdown --fuzzy https://drive.google.com/file/d/1tX79xk0fflp07EZ660Xz1RAFE33iEyJR/view +gdown --fuzzy https://drive.google.com/file/d/1O_GUHgjDbl2tgbyfSwZOUYXDACnk25Kb/view +gdown --fuzzy https://drive.google.com/file/d/12liZW5iyvoybXD8eOw4VanTgsMtynCuU/view +rm -rf t2m +rm -rf kit + +unzip t2m.zip +unzip kit.zip +echo -e "Cleaning\n" +rm t2m.zip +rm kit.zip + +echo -e "Downloading done!" diff --git a/src/mdm/prepare/download_unconstrained_datasets.sh b/src/mdm/prepare/download_unconstrained_datasets.sh new file mode 100644 index 0000000000000000000000000000000000000000..4f96be1ae247eb793dcd29c733701236ebaea9fd --- /dev/null +++ b/src/mdm/prepare/download_unconstrained_datasets.sh @@ -0,0 +1,19 @@ +mkdir -p dataset/ +cd dataset/ + +echo "The datasets will be stored in the 'dataset' folder\n" + +# HumanAct12 poses +echo "Downloading the HumanAct12 poses dataset" +gdown "https://drive.google.com/uc?id=1130gHSvNyJmii7f6pv5aY5IyQIWc3t7R" +echo "Extracting the HumanAct12 poses dataset" +tar xfzv HumanAct12Poses.tar.gz +echo "Cleaning\n" +rm HumanAct12Poses.tar.gz + +# HumanAct12 poses unconstrained +echo "Downloading the HumanAct12 unconstrained poses dataset" +cd HumanAct12Poses +gdown "1KqOBTtLFgkvWSZb8ao-wdBMG7sTP3Q7d" + +echo "Downloading done!" diff --git a/src/mdm/sample/edit.py b/src/mdm/sample/edit.py new file mode 100644 index 0000000000000000000000000000000000000000..1b1b127ddd91ab8d86bc02e7340b3e3273047be8 --- /dev/null +++ b/src/mdm/sample/edit.py @@ -0,0 +1,212 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Generate a large batch of image samples from a model and save them as a large +numpy array. This can be used to produce samples for FID evaluation. +""" +from utils.fixseed import fixseed +import os +import numpy as np +import torch +from utils.parser_util import edit_args +from sample.generate import save_multiple_samples, construct_template_variables +from utils.model_util import create_model_and_diffusion, load_saved_model +from utils import dist_util +from utils.sampler_util import ClassifierFreeSampleModel +from data_loaders.get_data import get_dataset_loader +from data_loaders.humanml.scripts.motion_process import recover_from_ric +from data_loaders import humanml_utils +import data_loaders.humanml.utils.paramUtil as paramUtil +from data_loaders.humanml.utils.plot_script import plot_3d_motion +import shutil + + +def main(): + args = edit_args() + fixseed(args.seed) + out_path = args.output_dir + name = os.path.basename(os.path.dirname(args.model_path)) + niter = os.path.basename(args.model_path).replace('model', '').replace('.pt', '') + max_frames = 196 if args.dataset in ['kit', 'humanml'] else 60 + fps = 12.5 if args.dataset == 'kit' else 20 + n_frames = 120 # min(max_frames, int(args.motion_length*fps)) + + dist_util.setup_dist(args.device) + if out_path == '': + out_path = os.path.join(os.path.dirname(args.model_path), + 'edit_{}_{}_{}_seed{}'.format(name, niter, args.edit_mode, args.seed)) + if args.text_condition != '': + out_path += '_' + args.text_condition.replace(' ', '_').replace('.', '') + + print('Loading dataset...') + assert args.num_samples <= args.batch_size, \ + f'Please either increase batch_size({args.batch_size}) or reduce num_samples({args.num_samples})' + # So why do we need this check? In order to protect GPU from a memory overload in the following line. + # If your GPU can handle batch size larger then default, you can specify it through --batch_size flag. + # If it doesn't, and you still want to sample more prompts, run this script with different seeds + # (specify through the --seed flag) + args.batch_size = args.num_samples # Sampling a single batch from the testset, with exactly args.num_samples + data = get_dataset_loader(name=args.dataset, + batch_size=args.batch_size, + num_frames=max_frames, + split='test', + hml_mode='train') # in train mode, you get both text and motion. + # data.fixed_length = n_frames + total_num_samples = args.num_samples * args.num_repetitions + + print("Creating model and diffusion...") + model, diffusion = create_model_and_diffusion(args, data) + + print(f"Loading checkpoints from [{args.model_path}]...") + load_saved_model(model, args.model_path, use_avg=args.use_ema) + + model = ClassifierFreeSampleModel(model) # wrapping model with the classifier-free sampler + model.to(dist_util.dev()) + model.eval() # disable random masking + + iterator = iter(data) + input_motions, model_kwargs = next(iterator) + input_motions = input_motions.to(dist_util.dev()) + texts = [args.text_condition] * args.num_samples + model_kwargs['y']['text'] = texts + if args.text_condition == '': + args.guidance_param = 0. # Force unconditioned generation + + # add inpainting mask according to args + assert max_frames == input_motions.shape[-1] + gt_frames_per_sample = {} + model_kwargs['y']['inpainted_motion'] = input_motions + if args.edit_mode == 'in_between': + model_kwargs['y']['inpainting_mask'] = torch.ones_like(input_motions, dtype=torch.bool, + device=input_motions.device) # True means use gt motion + for i, length in enumerate(model_kwargs['y']['lengths'].cpu().numpy()): + start_idx, end_idx = int(args.prefix_end * length), int(args.suffix_start * length) + gt_frames_per_sample[i] = list(range(0, start_idx)) + list(range(end_idx, max_frames)) + model_kwargs['y']['inpainting_mask'][i, :, :, + start_idx: end_idx] = False # do inpainting in those frames + elif args.edit_mode == 'upper_body': + model_kwargs['y']['inpainting_mask'] = torch.tensor(humanml_utils.HML_LOWER_BODY_MASK, dtype=torch.bool, + device=input_motions.device) # True is lower body data + model_kwargs['y']['inpainting_mask'] = model_kwargs['y']['inpainting_mask'].unsqueeze(0).unsqueeze( + -1).unsqueeze(-1).repeat(input_motions.shape[0], 1, input_motions.shape[2], input_motions.shape[3]) + + all_motions = [] + all_lengths = [] + all_text = [] + + for rep_i in range(args.num_repetitions): + print(f'### Start sampling [repetitions #{rep_i}]') + + # add CFG scale to batch + model_kwargs['y']['scale'] = torch.ones(args.batch_size, device=dist_util.dev()) * args.guidance_param + + sample_fn = diffusion.p_sample_loop + + sample = sample_fn( + model, + (args.batch_size, model.njoints, model.nfeats, max_frames), + clip_denoised=False, + model_kwargs=model_kwargs, + skip_timesteps=0, # 0 is the default value - i.e. don't skip any step + init_image=None, + progress=True, + dump_steps=None, + noise=None, + const_noise=False, + ) + + + # Recover XYZ *positions* from HumanML3D vector representation + if model.data_rep == 'hml_vec': + n_joints = 22 if sample.shape[1] == 263 else 21 + sample = data.dataset.t2m_dataset.inv_transform(sample.cpu().permute(0, 2, 3, 1)).float() + sample = recover_from_ric(sample, n_joints) + sample = sample.view(-1, *sample.shape[2:]).permute(0, 2, 3, 1) + + all_text += model_kwargs['y']['text'] + all_motions.append(sample.cpu().numpy()) + all_lengths.append(model_kwargs['y']['lengths'].cpu().numpy()) + + print(f"created {len(all_motions) * args.batch_size} samples") + + + all_motions = np.concatenate(all_motions, axis=0) + all_motions = all_motions[:total_num_samples] # [bs, njoints, 6, seqlen] + all_text = all_text[:total_num_samples] + all_lengths = np.concatenate(all_lengths, axis=0)[:total_num_samples] + + if os.path.exists(out_path): + shutil.rmtree(out_path) + os.makedirs(out_path) + + npy_path = os.path.join(out_path, 'results.npy') + print(f"saving results file to [{npy_path}]") + np.save(npy_path, + {'motion': all_motions, 'text': all_text, 'lengths': all_lengths, + 'num_samples': args.num_samples, 'num_repetitions': args.num_repetitions}) + with open(npy_path.replace('.npy', '.txt'), 'w') as fw: + fw.write('\n'.join(all_text)) + with open(npy_path.replace('.npy', '_len.txt'), 'w') as fw: + fw.write('\n'.join([str(l) for l in all_lengths])) + + print(f"saving visualizations to [{out_path}]...") + skeleton = paramUtil.kit_kinematic_chain if args.dataset == 'kit' else paramUtil.t2m_kinematic_chain + + # Recover XYZ *positions* from HumanML3D vector representation + if model.data_rep == 'hml_vec': + input_motions = data.dataset.t2m_dataset.inv_transform(input_motions.cpu().permute(0, 2, 3, 1)).float() + input_motions = recover_from_ric(input_motions, n_joints) + input_motions = input_motions.view(-1, *input_motions.shape[2:]).permute(0, 2, 3, 1).cpu().numpy() + + + sample_print_template, row_print_template, all_print_template, \ + sample_file_template, row_file_template, all_file_template = construct_template_variables(args.unconstrained) + max_vis_samples = 6 + num_vis_samples = min(args.num_samples, max_vis_samples) + animations = np.empty(shape=(args.num_samples, args.num_repetitions), dtype=object) + max_length = max(all_lengths) + + for sample_i in range(args.num_samples): + caption = 'Input Motion' + length = model_kwargs['y']['lengths'][sample_i] + motion = input_motions[sample_i].transpose(2, 0, 1)[:length] + save_file = 'input_motion{:02d}.mp4'.format(sample_i) + animation_save_path = os.path.join(out_path, save_file) + rep_files = [animation_save_path] + # FIXME - fix and bring back the following: + # print(f'[({sample_i}) "{caption}" | -> {save_file}]') + # plot_3d_motion(animation_save_path, skeleton, motion, title=caption, + # dataset=args.dataset, fps=fps, vis_mode='gt', + # gt_frames=gt_frames_per_sample.get(sample_i, [])) + for rep_i in range(args.num_repetitions): + caption = all_text[rep_i*args.batch_size + sample_i] + if caption == '': + caption = 'Edit [{}] unconditioned'.format(args.edit_mode) + else: + caption = 'Edit [{}]: {}'.format(args.edit_mode, caption) + length = all_lengths[rep_i*args.batch_size + sample_i] + motion = all_motions[rep_i*args.batch_size + sample_i].transpose(2, 0, 1)[:length] + save_file = 'sample{:02d}_rep{:02d}.mp4'.format(sample_i, rep_i) + animation_save_path = os.path.join(out_path, save_file) + rep_files.append(animation_save_path) + gt_frames = gt_frames_per_sample.get(sample_i, []) + print(f'[({sample_i}) "{caption}" | Rep #{rep_i} | -> {save_file}]') + animations[sample_i, rep_i] = plot_3d_motion(animation_save_path, + skeleton, motion, dataset=args.dataset, title=caption, + fps=fps, gt_frames=gt_frames) + # Credit for visualization: https://github.com/EricGuo5513/text-to-motion + + all_rep_save_file = os.path.join(out_path, 'sample{:02d}.mp4'.format(sample_i)) + ffmpeg_rep_files = [f' -i {f} ' for f in rep_files] + hstack_args = f' -filter_complex hstack=inputs={args.num_repetitions+1}' + ffmpeg_rep_cmd = f'ffmpeg -y -loglevel warning ' + ''.join(ffmpeg_rep_files) + f'{hstack_args} {all_rep_save_file}' + os.system(ffmpeg_rep_cmd) + print(f'[({sample_i}) "{caption}" | all repetitions | -> {all_rep_save_file}]') + + save_multiple_samples(out_path, {'all': all_file_template}, animations, fps, max(list(all_lengths) + [n_frames])) + + abs_path = os.path.abspath(out_path) + print(f'[Done] Results are at [{abs_path}]') + + +if __name__ == "__main__": + main() diff --git a/src/mdm/sample/generate.py b/src/mdm/sample/generate.py new file mode 100644 index 0000000000000000000000000000000000000000..3507becf91ba6193d8e4653e65952dcbccb6952f --- /dev/null +++ b/src/mdm/sample/generate.py @@ -0,0 +1,318 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Generate a large batch of image samples from a model and save them as a large +numpy array. This can be used to produce samples for FID evaluation. +""" +from utils.fixseed import fixseed +import os +import numpy as np +import torch +from utils.parser_util import generate_args +from utils.model_util import create_model_and_diffusion, load_saved_model +from utils import dist_util +from utils.sampler_util import ClassifierFreeSampleModel, AutoRegressiveSampler +from data_loaders.get_data import get_dataset_loader +from data_loaders.humanml.scripts.motion_process import recover_from_ric, get_target_location, sample_goal +import data_loaders.humanml.utils.paramUtil as paramUtil +from data_loaders.humanml.utils.plot_script import plot_3d_motion +import shutil +from data_loaders.tensors import collate +from moviepy.editor import clips_array + + +def main(args=None): + if args is None: + # args is None unless this method is called from another function (e.g. during training) + args = generate_args() + fixseed(args.seed) + out_path = args.output_dir + n_joints = 22 if args.dataset == 'humanml' else 21 + name = os.path.basename(os.path.dirname(args.model_path)) + niter = os.path.basename(args.model_path).replace('model', '').replace('.pt', '') + max_frames = 196 if args.dataset in ['kit', 'humanml'] else 60 + fps = 12.5 if args.dataset == 'kit' else 20 + n_frames = min(max_frames, int(args.motion_length*fps)) + is_using_data = not any([args.input_text, args.text_prompt, args.action_file, args.action_name]) + if args.context_len > 0: + is_using_data = True # For prefix completion, we need to sample a prefix + dist_util.setup_dist(args.device) + if out_path == '': + out_path = os.path.join(os.path.dirname(args.model_path), + 'samples_{}_{}_seed{}'.format(name, niter, args.seed)) + if args.text_prompt != '': + out_path += '_' + args.text_prompt.replace(' ', '_').replace('.', '') + elif args.input_text != '': + out_path += '_' + os.path.basename(args.input_text).replace('.txt', '').replace(' ', '_').replace('.', '') + elif args.dynamic_text_path != '': + out_path += '_' + os.path.basename(args.dynamic_text_path).replace('.txt', '').replace(' ', '_').replace('.', '') + + # this block must be called BEFORE the dataset is loaded + texts = None + if args.text_prompt != '': + texts = [args.text_prompt] * args.num_samples + elif args.input_text != '': + assert os.path.exists(args.input_text) + with open(args.input_text, 'r') as fr: + texts = fr.readlines() + texts = [s.replace('\n', '') for s in texts] + args.num_samples = len(texts) + elif args.dynamic_text_path != '': + assert os.path.exists(args.dynamic_text_path) + assert args.autoregressive, "Dynamic text sampling is only supported with autoregressive sampling." + with open(args.dynamic_text_path, 'r') as fr: + texts = fr.readlines() + texts = [s.replace('\n', '') for s in texts] + n_frames = len(texts) * args.pred_len # each text prompt is for a single prediction + elif args.action_name: + action_text = [args.action_name] + args.num_samples = 1 + elif args.action_file != '': + assert os.path.exists(args.action_file) + with open(args.action_file, 'r') as fr: + action_text = fr.readlines() + action_text = [s.replace('\n', '') for s in action_text] + args.num_samples = len(action_text) + + args.batch_size = args.num_samples # Sampling a single batch from the testset, with exactly args.num_samples + + print('Loading dataset...') + data = load_dataset(args, max_frames, n_frames) + total_num_samples = args.num_samples * args.num_repetitions + + print("Creating model and diffusion...") + model, diffusion = create_model_and_diffusion(args, data) + + sample_fn = diffusion.p_sample_loop + if args.autoregressive: + sample_cls = AutoRegressiveSampler(args, sample_fn, n_frames) + sample_fn = sample_cls.sample + + print(f"Loading checkpoints from [{args.model_path}]...") + load_saved_model(model, args.model_path, use_avg=args.use_ema) + + if args.guidance_param != 1: + model = ClassifierFreeSampleModel(model) # wrapping model with the classifier-free sampler + model.to(dist_util.dev()) + model.eval() # disable random masking + + motion_shape = (args.batch_size, model.njoints, model.nfeats, n_frames) + + if is_using_data: + iterator = iter(data) + input_motion, model_kwargs = next(iterator) + input_motion = input_motion.to(dist_util.dev()) + if texts is not None: + model_kwargs['y']['text'] = texts + else: + collate_args = [{'inp': torch.zeros(n_frames), 'tokens': None, 'lengths': n_frames}] * args.num_samples + is_t2m = any([args.input_text, args.text_prompt]) + if is_t2m: + # t2m + collate_args = [dict(arg, text=txt) for arg, txt in zip(collate_args, texts)] + else: + # a2m + action = data.dataset.action_name_to_action(action_text) + collate_args = [dict(arg, action=one_action, action_text=one_action_text) for + arg, one_action, one_action_text in zip(collate_args, action, action_text)] + _, model_kwargs = collate(collate_args) + + model_kwargs['y'] = {key: val.to(dist_util.dev()) if torch.is_tensor(val) else val for key, val in model_kwargs['y'].items()} + init_image = None + + all_motions = [] + all_lengths = [] + all_text = [] + + # add CFG scale to batch + if args.guidance_param != 1: + model_kwargs['y']['scale'] = torch.ones(args.batch_size, device=dist_util.dev()) * args.guidance_param + + if 'text' in model_kwargs['y'].keys(): + # encoding once instead of each iteration saves lots of time + model_kwargs['y']['text_embed'] = model.encode_text(model_kwargs['y']['text']) + + if args.dynamic_text_path != '': + # Rearange the text to match the autoregressive sampling - each prompt fits to a single prediction + # Which is 2 seconds of motion by default + model_kwargs['y']['text'] = [model_kwargs['y']['text']] * args.num_samples + if args.text_encoder_type == 'bert': + model_kwargs['y']['text_embed'] = (model_kwargs['y']['text_embed'][0].unsqueeze(0).repeat(args.num_samples, 1, 1, 1), + model_kwargs['y']['text_embed'][1].unsqueeze(0).repeat(args.num_samples, 1, 1)) + else: + raise NotImplementedError('DiP model only supports BERT text encoder at the moment. If you implement this, please send a PR!') + + for rep_i in range(args.num_repetitions): + print(f'### Sampling [repetitions #{rep_i}]') + + sample = sample_fn( + model, + motion_shape, + clip_denoised=False, + model_kwargs=model_kwargs, + skip_timesteps=0, # 0 is the default value - i.e. don't skip any step + init_image=init_image, + progress=True, + dump_steps=None, + noise=None, + const_noise=False, + ) + + # Recover XYZ *positions* from HumanML3D vector representation + if model.data_rep == 'hml_vec': + n_joints = 22 if sample.shape[1] == 263 else 21 + sample = data.dataset.t2m_dataset.inv_transform(sample.cpu().permute(0, 2, 3, 1)).float() + sample = recover_from_ric(sample, n_joints) + sample = sample.view(-1, *sample.shape[2:]).permute(0, 2, 3, 1) + + rot2xyz_pose_rep = 'xyz' if model.data_rep in ['xyz', 'hml_vec'] else model.data_rep + rot2xyz_mask = None if rot2xyz_pose_rep == 'xyz' else model_kwargs['y']['mask'].reshape(args.batch_size, n_frames).bool() + sample = model.rot2xyz(x=sample, mask=rot2xyz_mask, pose_rep=rot2xyz_pose_rep, glob=True, translation=True, + jointstype='smpl', vertstrans=True, betas=None, beta=0, glob_rot=None, + get_rotations_back=False) + + if args.unconstrained: + all_text += ['unconstrained'] * args.num_samples + else: + text_key = 'text' if 'text' in model_kwargs['y'] else 'action_text' + all_text += model_kwargs['y'][text_key] + + all_motions.append(sample.cpu().numpy()) + _len = model_kwargs['y']['lengths'].cpu().numpy() + if 'prefix' in model_kwargs['y'].keys(): + _len[:] = sample.shape[-1] + all_lengths.append(_len) + + print(f"created {len(all_motions) * args.batch_size} samples") + + + all_motions = np.concatenate(all_motions, axis=0) + all_motions = all_motions[:total_num_samples] # [bs, njoints, 6, seqlen] + all_text = all_text[:total_num_samples] + all_lengths = np.concatenate(all_lengths, axis=0)[:total_num_samples] + + if os.path.exists(out_path): + shutil.rmtree(out_path) + os.makedirs(out_path) + + npy_path = os.path.join(out_path, 'results.npy') + print(f"saving results file to [{npy_path}]") + np.save(npy_path, + {'motion': all_motions, 'text': all_text, 'lengths': all_lengths, + 'num_samples': args.num_samples, 'num_repetitions': args.num_repetitions}) + if args.dynamic_text_path != '': + text_file_content = '\n'.join(['#'.join(s) for s in all_text]) + else: + text_file_content = '\n'.join(all_text) + with open(npy_path.replace('.npy', '.txt'), 'w') as fw: + fw.write(text_file_content) + with open(npy_path.replace('.npy', '_len.txt'), 'w') as fw: + fw.write('\n'.join([str(l) for l in all_lengths])) + + print(f"saving visualizations to [{out_path}]...") + skeleton = paramUtil.kit_kinematic_chain if args.dataset == 'kit' else paramUtil.t2m_kinematic_chain + + sample_print_template, row_print_template, all_print_template, \ + sample_file_template, row_file_template, all_file_template = construct_template_variables(args.unconstrained) + max_vis_samples = 6 + num_vis_samples = min(args.num_samples, max_vis_samples) + animations = np.empty(shape=(args.num_samples, args.num_repetitions), dtype=object) + max_length = max(all_lengths) + + for sample_i in range(args.num_samples): + rep_files = [] + for rep_i in range(args.num_repetitions): + caption = all_text[rep_i*args.batch_size + sample_i] + if args.dynamic_text_path != '': # caption per frame + assert type(caption) == list + caption_per_frame = [] + for c in caption: + caption_per_frame += [c] * args.pred_len + caption = caption_per_frame + + + # Trim / freeze motion if needed + length = all_lengths[rep_i*args.batch_size + sample_i] + motion = all_motions[rep_i*args.batch_size + sample_i].transpose(2, 0, 1)[:max_length] + if motion.shape[0] > length: + motion[length:-1] = motion[length-1] # duplicate the last frame to end of motion, so all motions will be in equal length + + save_file = sample_file_template.format(sample_i, rep_i) + animation_save_path = os.path.join(out_path, save_file) + gt_frames = np.arange(args.context_len) if args.context_len > 0 and not args.autoregressive else [] + animations[sample_i, rep_i] = plot_3d_motion(animation_save_path, + skeleton, motion, dataset=args.dataset, title=caption, + fps=fps, gt_frames=gt_frames) + rep_files.append(animation_save_path) + + save_multiple_samples(out_path, {'all': all_file_template}, animations, fps, max(list(all_lengths) + [n_frames])) + + abs_path = os.path.abspath(out_path) + print(f'[Done] Results are at [{abs_path}]') + + return out_path + + +def save_multiple_samples(out_path, file_templates, animations, fps, max_frames, no_dir=False): + + num_samples_in_out_file = 3 + n_samples = animations.shape[0] + + for sample_i in range(0,n_samples,num_samples_in_out_file): + last_sample_i = min(sample_i+num_samples_in_out_file, n_samples) + all_sample_save_file = file_templates['all'].format(sample_i, last_sample_i-1) + if no_dir and n_samples <= num_samples_in_out_file: + all_sample_save_path = out_path + else: + all_sample_save_path = os.path.join(out_path, all_sample_save_file) + print(f'saving {os.path.split(out_path)[1]}/{all_sample_save_file}') + + clips = clips_array(animations[sample_i:last_sample_i]) + clips.duration = max_frames/fps + + # import time + # start = time.time() + clips.write_videofile(all_sample_save_path, fps=fps, threads=4, logger=None) + # print(f'duration = {time.time()-start}') + + for clip in clips.clips: + # close internal clips. Does nothing but better use in case one day it will do something + clip.close() + clips.close() # important + + +def construct_template_variables(unconstrained): + row_file_template = 'sample{:02d}.mp4' + all_file_template = 'samples_{:02d}_to_{:02d}.mp4' + if unconstrained: + sample_file_template = 'row{:02d}_col{:02d}.mp4' + sample_print_template = '[{} row #{:02d} column #{:02d} | -> {}]' + row_file_template = row_file_template.replace('sample', 'row') + row_print_template = '[{} row #{:02d} | all columns | -> {}]' + all_file_template = all_file_template.replace('samples', 'rows') + all_print_template = '[rows {:02d} to {:02d} | -> {}]' + else: + sample_file_template = 'sample{:02d}_rep{:02d}.mp4' + sample_print_template = '["{}" ({:02d}) | Rep #{:02d} | -> {}]' + row_print_template = '[ "{}" ({:02d}) | all repetitions | -> {}]' + all_print_template = '[samples {:02d} to {:02d} | all repetitions | -> {}]' + + return sample_print_template, row_print_template, all_print_template, \ + sample_file_template, row_file_template, all_file_template + + +def load_dataset(args, max_frames, n_frames): + data = get_dataset_loader(name=args.dataset, + batch_size=args.batch_size, + num_frames=max_frames, + split='test', + hml_mode='train' if args.pred_len > 0 else 'text_only', # We need to sample a prefix from the dataset + fixed_len=args.pred_len + args.context_len, pred_len=args.pred_len, device=dist_util.dev()) + data.fixed_length = n_frames + return data + + +def is_substr_in_list(substr, list_of_strs): + return np.char.find(list_of_strs, substr) != -1 # [substr in string for string in list_of_strs] + +if __name__ == "__main__": + main() diff --git a/src/mdm/sample/predict.py b/src/mdm/sample/predict.py new file mode 100644 index 0000000000000000000000000000000000000000..84455d9e67c74a63ea952825fa4266e6caba1253 --- /dev/null +++ b/src/mdm/sample/predict.py @@ -0,0 +1,167 @@ +import os +import subprocess +from typing import Any, List, Optional +from argparse import Namespace + +import torch +from cog import BasePredictor, Input, Path, BaseModel + +import data_loaders.humanml.utils.paramUtil as paramUtil +from data_loaders.get_data import get_dataset_loader +from data_loaders.humanml.scripts.motion_process import recover_from_ric +from data_loaders.humanml.utils.plot_script import plot_3d_motion +from data_loaders.tensors import collate +from utils.sampler_util import ClassifierFreeSampleModel +from utils import dist_util +from utils.model_util import create_model_and_diffusion, load_model_wo_clip +from visualize.motions2hik import motions2hik +from sample.generate import construct_template_variables + +""" +In case of matplot lib issues it may be needed to delete model/data_loaders/humanml/utils/plot_script.py" in lines 89~92 as +suggested in https://github.com/GuyTevet/motion-diffusion-model/issues/6 +""" + + +class ModelOutput(BaseModel): + json_file: Optional[Any] + animation: Optional[List[Path]] + + +def get_args(): + args = Namespace() + args.fps = 20 + args.model_path = './save/humanml_trans_enc_512/model000200000.pt' + args.guidance_param = 2.5 + args.unconstrained = False + args.dataset = 'humanml' + + args.cond_mask_prob = 1 + args.emb_trans_dec = False + args.latent_dim = 512 + args.layers = 8 + args.arch = 'trans_enc' + + args.noise_schedule = 'cosine' + args.sigma_small = True + args.lambda_vel = 0.0 + args.lambda_rcxyz = 0.0 + args.lambda_fc = 0.0 + return args + + +class Predictor(BasePredictor): + def setup(self): + subprocess.run(["mkdir", "/root/.cache/clip"]) + subprocess.run(["cp", "-r", "ViT-B-32.pt", "/root/.cache/clip"]) + + self.args = get_args() + self.num_frames = self.args.fps * 6 + print('Loading dataset...') + + # temporary data + self.data = get_dataset_loader(name=self.args.dataset, + batch_size=1, + num_frames=196, + split='test', + hml_mode='text_only') + + self.data.fixed_length = float(self.num_frames) + + print("Creating model and diffusion...") + self.model, self.diffusion = create_model_and_diffusion(self.args, self.data) + + print(f"Loading checkpoints from...") + state_dict = torch.load(self.args.model_path, map_location='cpu') + load_model_wo_clip(self.model, state_dict) + + if self.args.guidance_param != 1: + self.model = ClassifierFreeSampleModel(self.model) # wrapping model with the classifier-free sampler + self.model.to(dist_util.dev()) + self.model.eval() # disable random masking + + def predict( + self, + prompt: str = Input(default="the person walked forward and is picking up his toolbox."), + num_repetitions: int = Input(default=3, description="How many"), + output_format: str = Input( + description='Choose the format of the output, either an animation or a json file of the animation data.\ + The json format is: {"thetas": [...], "root_translation": [...], "joint_map": [...]}, where "thetas" \ + is an [nframes x njoints x 3] array of joint rotations in degrees, "root_translation" is an [nframes x 3] \ + array of (X, Y, Z) positions of the root, and "joint_map" is a list mapping the SMPL joint index to the\ + corresponding HumanIK joint name', + default="animation", + choices=["animation", "json_file"], + ), + ) -> ModelOutput: + args = self.args + args.num_repetitions = int(num_repetitions) + + self.data = get_dataset_loader(name=self.args.dataset, + batch_size=args.num_repetitions, + num_frames=self.num_frames, + split='test', + hml_mode='text_only') + + collate_args = [{'inp': torch.zeros(self.num_frames), 'tokens': None, 'lengths': self.num_frames, 'text': str(prompt)}] + _, model_kwargs = collate(collate_args) + + # add CFG scale to batch + if args.guidance_param != 1: + model_kwargs['y']['scale'] = torch.ones(args.num_repetitions, device=dist_util.dev()) * args.guidance_param + + sample_fn = self.diffusion.p_sample_loop + sample = sample_fn( + self.model, + (args.num_repetitions, self.model.njoints, self.model.nfeats, self.num_frames), + clip_denoised=False, + model_kwargs=model_kwargs, + skip_timesteps=0, # 0 is the default value - i.e. don't skip any step + init_image=None, + progress=True, + dump_steps=None, + noise=None, + const_noise=False, + ) + + # Recover XYZ *positions* from HumanML3D vector representation + if self.model.data_rep == 'hml_vec': + n_joints = 22 if sample.shape[1] == 263 else 21 + sample = self.data.dataset.t2m_dataset.inv_transform(sample.cpu().permute(0, 2, 3, 1)).float() + sample = recover_from_ric(sample, n_joints) + sample = sample.view(-1, *sample.shape[2:]).permute(0, 2, 3, 1) + + rot2xyz_pose_rep = 'xyz' if self.model.data_rep in ['xyz', 'hml_vec'] else self.model.data_rep + rot2xyz_mask = None if rot2xyz_pose_rep == 'xyz' else model_kwargs['y']['mask'].reshape(args.num_repetitions, + self.num_frames).bool() + sample = self.model.rot2xyz(x=sample, mask=rot2xyz_mask, pose_rep=rot2xyz_pose_rep, glob=True, translation=True, + jointstype='smpl', vertstrans=True, betas=None, beta=0, glob_rot=None, + get_rotations_back=False) + + all_motions = sample.cpu().numpy() + + if output_format == 'json_file': + data_dict = motions2hik(all_motions) + return ModelOutput(json_file=data_dict) + + caption = str(prompt) + + skeleton = paramUtil.t2m_kinematic_chain + + sample_print_template, row_print_template, all_print_template, \ + sample_file_template, row_file_template, all_file_template = construct_template_variables( + args.unconstrained) + + rep_files = [] + replicate_fnames = [] + for rep_i in range(args.num_repetitions): + motion = all_motions[rep_i].transpose(2, 0, 1)[:self.num_frames] + save_file = sample_file_template.format(1, rep_i) + print(sample_print_template.format(caption, 1, rep_i, save_file)) + plot_3d_motion(save_file, skeleton, motion, dataset=args.dataset, title=caption, fps=args.fps) + # Credit for visualization: https://github.com/EricGuo5513/text-to-motion + rep_files.append(save_file) + + replicate_fnames.append(Path(save_file)) + + return ModelOutput(animation=replicate_fnames) diff --git a/src/mdm/sample/sample_z.py b/src/mdm/sample/sample_z.py new file mode 100644 index 0000000000000000000000000000000000000000..e695d99e97b7e1083b829bb879d9f8970f3b0710 --- /dev/null +++ b/src/mdm/sample/sample_z.py @@ -0,0 +1,322 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Generate preprocessed posterior features (z) from text for an external decoder. + +Unlike generate.py, this script does not post-process the generated features. +It saves the raw z features in a format that external decoders can read. +""" +import os +import numpy as np +import torch +from argparse import ArgumentParser +from utils.fixseed import fixseed +from utils import dist_util +from utils.model_util import create_gaussian_diffusion +from utils.sampler_util import ClassifierFreeSampleModel +from data_loaders.tensors import collate +from model.mdm import MDM + +import json + + +def sample_z_args(): + """Parse command-line arguments for z sampling.""" + parser = ArgumentParser(description='Sample z from text using trained MDM model') + + # Model options + parser.add_argument("--model_path", required=True, type=str, + help="Path to trained model checkpoint") + parser.add_argument("--use_ema", action='store_true', + help="Use EMA model if available") + + # Input options + parser.add_argument("--text_prompt", default='', type=str, + help="A single text prompt to generate") + parser.add_argument("--input_text", default='', type=str, + help="Path to a text file with prompts (one per line)") + + # Sampling options + parser.add_argument("--num_samples", default=1, type=int, + help="Number of samples per prompt") + parser.add_argument("--num_repetitions", default=1, type=int, + help="Number of repetitions for each prompt") + parser.add_argument("--motion_length", default=6.0, type=float, + help="Motion length in seconds") + parser.add_argument("--guidance_param", default=2.5, type=float, + help="Classifier-free guidance scale") + + # Output options + parser.add_argument("--output_dir", default='', type=str, + help="Output directory for results") + parser.add_argument("--save_individual", action='store_true', + help="Save each sample as individual file") + + # Misc options + parser.add_argument("--seed", default=10, type=int) + parser.add_argument("--device", default=0, type=int) + + args = parser.parse_args() + return args + + +def load_model_from_checkpoint(model_path, device, use_ema=False): + """Load a model from a checkpoint.""" + # Load args. + args_path = os.path.join(os.path.dirname(model_path), 'args.json') + with open(args_path, 'r') as f: + model_args = json.load(f) + + # Create a simple args object. + class Args: + pass + args = Args() + for k, v in model_args.items(): + setattr(args, k, v) + + # Determine conditioning mode. + if hasattr(args, 'unconstrained') and args.unconstrained: + cond_mode = 'no_cond' + elif args.dataset in ['kit', 'humanml', 'preprocessed_posterior']: + cond_mode = 'text' + else: + cond_mode = 'action' + + # Get model parameters. + njoints = getattr(args, 'njoints', 512) + nfeats = getattr(args, 'nfeats', 1) + + model_kwargs = { + 'modeltype': '', + 'njoints': njoints, + 'nfeats': nfeats, + 'num_actions': 1, + 'translation': True, + 'pose_rep': 'rot6d', + 'glob': True, + 'glob_rot': True, + 'latent_dim': args.latent_dim, + 'ff_size': 1024, + 'num_layers': args.layers, + 'num_heads': 4, + 'dropout': 0.1, + 'activation': 'gelu', + 'data_rep': 'hml_vec', + 'cond_mode': cond_mode, + 'cond_mask_prob': getattr(args, 'cond_mask_prob', 0.1), + 'action_emb': 'tensor', + 'arch': args.arch, + 'emb_trans_dec': getattr(args, 'emb_trans_dec', False), + 'clip_version': 'ViT-B/32', + 'dataset': args.dataset, + 'text_encoder_type': getattr(args, 'text_encoder_type', 'clip'), + 'pos_embed_max_len': getattr(args, 'pos_embed_max_len', 5000), + 'mask_frames': getattr(args, 'mask_frames', False), + 'pred_len': getattr(args, 'pred_len', 0), + 'context_len': getattr(args, 'context_len', 0), + 'emb_policy': 'add', + 'all_goal_joint_names': [], + 'multi_target_cond': getattr(args, 'multi_target_cond', False), + 'multi_encoder_type': getattr(args, 'multi_encoder_type', 'single'), + 'target_enc_layers': getattr(args, 'target_enc_layers', 1), + 'use_rot2xyz': False, + } + + # Create the model without SMPL-backed xyz conversion; this script saves raw z only. + model = MDM(**model_kwargs) + + # Load weights. + state_dict = torch.load(model_path, map_location=device) + + if use_ema and 'model_avg' in state_dict: + print("Loading EMA model weights...") + state_dict = state_dict['model_avg'] + elif 'model' in state_dict: + state_dict = state_dict['model'] + + # Remove unused keys. + keys_to_delete = ['sequence_pos_encoder.pe', 'embed_timestep.sequence_pos_encoder.pe'] + for key in keys_to_delete: + if key in state_dict: + del state_dict[key] + + missing_keys, unexpected_keys = model.load_state_dict(state_dict, strict=False) + print(f"Loaded model. Missing keys: {len(missing_keys)}, Unexpected keys: {len(unexpected_keys)}") + + # Create diffusion. + diffusion = create_gaussian_diffusion(args) + + return model, diffusion, args + + +def main(): + args = sample_z_args() + fixseed(args.seed) + + dist_util.setup_dist(args.device) + device = dist_util.dev() + + # Load text prompts. + if args.text_prompt != '': + texts = [args.text_prompt] * args.num_samples + elif args.input_text != '': + assert os.path.exists(args.input_text), f"Input text file not found: {args.input_text}" + with open(args.input_text, 'r') as f: + texts = [line.strip() for line in f.readlines() if line.strip()] + args.num_samples = len(texts) + else: + raise ValueError("Must provide either --text_prompt or --input_text") + + print(f"Loaded {len(texts)} text prompts") + + # Load model. + print(f"Loading model from {args.model_path}...") + model, diffusion, model_args = load_model_from_checkpoint( + args.model_path, device, use_ema=args.use_ema + ) + model.to(device) + model.eval() + + # Set classifier-free guidance. + if args.guidance_param != 1: + model = ClassifierFreeSampleModel(model) + + # Compute frame count. + fps = 20 # Default FPS + n_frames = int(args.motion_length * fps) + + # Prepare inputs. + batch_size = len(texts) + motion_shape = (batch_size, model.njoints if hasattr(model, 'njoints') else model.model.njoints, + model.nfeats if hasattr(model, 'nfeats') else model.model.nfeats, n_frames) + + print(f"Motion shape: {motion_shape}") + + # Build model_kwargs. + collate_args = [{'inp': torch.zeros(n_frames), 'tokens': None, 'lengths': n_frames, 'text': txt} + for txt in texts] + _, model_kwargs = collate(collate_args) + model_kwargs['y'] = {key: val.to(device) if torch.is_tensor(val) else val + for key, val in model_kwargs['y'].items()} + + # Add guidance scale. + if args.guidance_param != 1: + model_kwargs['y']['scale'] = torch.ones(batch_size, device=device) * args.guidance_param + + # Pre-encode text when the model supports it. + actual_model = model.model if hasattr(model, 'model') else model + if hasattr(actual_model, 'encode_text') and 'text' in model_kwargs['y']: + print("Pre-encoding text...") + model_kwargs['y']['text_embed'] = actual_model.encode_text(model_kwargs['y']['text']) + + # Sample. + all_samples = [] + all_texts = [] + all_lengths = [] + + sample_fn = diffusion.p_sample_loop + + for rep_i in range(args.num_repetitions): + print(f"\n### Sampling [repetition #{rep_i + 1}/{args.num_repetitions}]") + + sample = sample_fn( + model, + motion_shape, + clip_denoised=False, + model_kwargs=model_kwargs, + skip_timesteps=0, + init_image=None, + progress=True, + dump_steps=None, + noise=None, + const_noise=False, + ) + + # Do not post-process here; save raw z features directly. + # sample shape: (batch_size, njoints, nfeats, n_frames) + + all_samples.append(sample.cpu().numpy()) + all_texts.extend(texts) + all_lengths.extend([n_frames] * batch_size) + + print(f"Generated {len(texts)} samples") + + # Merge all results. + all_samples = np.concatenate(all_samples, axis=0) # (N, D, 1, T) + all_lengths = np.array(all_lengths) + + # Convert shape: (N, D, 1, T) -> (N, T, D). + all_samples = all_samples.squeeze(2) # (N, D, T) + all_samples = all_samples.transpose(0, 2, 1) # (N, T, D) + + print(f"\nTotal samples: {all_samples.shape[0]}") + print(f"Sample shape: {all_samples.shape} # (N, T, D)") + + # Save results. + if args.output_dir == '': + model_name = os.path.basename(os.path.dirname(args.model_path)) + niter = os.path.basename(args.model_path).replace('model', '').replace('.pt', '') + args.output_dir = os.path.join(os.path.dirname(args.model_path), + f'sampled_z_{model_name}_{niter}_seed{args.seed}') + + os.makedirs(args.output_dir, exist_ok=True) + + # Save the main result file in npz format. + results_path = os.path.join(args.output_dir, 'results.npz') + print(f"\nSaving results to {results_path}") + np.savez(results_path, + z=all_samples, # (N, T, D) + texts=np.array(all_texts, dtype=str), # (N,) string array + lengths=all_lengths, # (N,) + motion_length=np.array(args.motion_length), + guidance_param=np.array(args.guidance_param), + model_path=np.array(args.model_path), + ) + + # Optionally save individual files. + if args.save_individual: + individual_dir = os.path.join(args.output_dir, 'individual') + os.makedirs(individual_dir, exist_ok=True) + + for i in range(all_samples.shape[0]): + # Save npz with all metadata. + sample_path = os.path.join(individual_dir, f'sample_{i:04d}.npz') + np.savez(sample_path, + z=all_samples[i], # (T, D) + text=np.array(all_texts[i]), + length=np.array(all_lengths[i]), + ) + # Save npy with z only. + z_path = os.path.join(individual_dir, f'z_{i:04d}.npy') + np.save(z_path, all_samples[i]) # (T, D) + + print(f"Saved {all_samples.shape[0]} individual files to {individual_dir}") + + # Save sampling config. + config_path = os.path.join(args.output_dir, 'sample_config.json') + with open(config_path, 'w') as f: + json.dump({ + 'model_path': args.model_path, + 'num_samples': args.num_samples, + 'num_repetitions': args.num_repetitions, + 'motion_length': args.motion_length, + 'guidance_param': args.guidance_param, + 'seed': args.seed, + 'use_ema': args.use_ema, + 'sample_shape': list(all_samples.shape), + }, f, indent=4) + + print(f"\nDone! Results saved to {args.output_dir}") + print("\nTo load the results in your decoder:") + print(" import numpy as np") + print(f" data = np.load('{results_path}')") + print(" z = data['z'] # shape: (N, T, D), dtype: float32") + print(" texts = data['texts'] # shape: (N,), dtype: str") + print(" lengths = data['lengths'] # shape: (N,), dtype: int") + print("\n # For individual samples:") + print(" single_z = z[0] # shape: (T, D)") + + return args.output_dir + + +if __name__ == "__main__": + main() diff --git a/src/mdm/save/paper_vae_human_0125/args.json b/src/mdm/save/paper_vae_human_0125/args.json new file mode 100644 index 0000000000000000000000000000000000000000..190c46efecb934c2bb3a30a895ce4a64927f1076 --- /dev/null +++ b/src/mdm/save/paper_vae_human_0125/args.json @@ -0,0 +1,58 @@ +{ + "adam_beta2": 0.999, + "arch": "trans_enc", + "autoregressive": false, + "avg_model_beta": 0.9999, + "batch_size": 64, + "cond_mask_prob": 0.1, + "context_len": 0, + "cuda": true, + "dataset": "preprocessed_posterior", + "device": 0, + "diffusion_steps": 1000, + "emb_trans_dec": false, + "eval_batch_size": 32, + "eval_during_training": false, + "eval_num_samples": 1000, + "eval_rep_times": 3, + "eval_split": "test", + "gen_during_training": false, + "gen_guidance_param": 2.5, + "gen_num_repetitions": 2, + "gen_num_samples": 3, + "lambda_fc": 0.0, + "lambda_rcxyz": 0.0, + "lambda_target_loc": 0.0, + "lambda_vel": 0.0, + "latent_dim": 512, + "layers": 8, + "log_interval": 1000, + "lr": 0.0001, + "lr_anneal_steps": 0, + "mask_frames": false, + "max_samples": null, + "multi_encoder_type": "single", + "multi_target_cond": false, + "nfeats": 1, + "njoints": 128, + "noise_schedule": "cosine", + "num_steps": 200000, + "num_workers": 8, + "overwrite": false, + "pos_embed_max_len": 5000, + "posterior_dir": "./dataset/enc_z_vae/zzy_train_recon_faceZ_mirror_wtextV3_0125", + "pred_len": 0, + "resample": false, + "resume_checkpoint": "", + "save_dir": "./save/paper_vae_human_0125", + "save_interval": 50000, + "seed": 10, + "sigma_small": true, + "target_enc_layers": 1, + "target_joint_names": "", + "text_encoder_type": "clip", + "train_platform_type": "NoPlatform", + "unconstrained": false, + "use_ema": false, + "weight_decay": 0.0 +} \ No newline at end of file diff --git a/src/mdm/save/paper_vae_human_0125/model000100000.pt b/src/mdm/save/paper_vae_human_0125/model000100000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c6fdb36160934061192b9ed173c3a705790f89fb --- /dev/null +++ b/src/mdm/save/paper_vae_human_0125/model000100000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03d0c66d87d86d35423a657256bea6484ab134ebaaae5aea138e27780f3f8328 +size 81268658 diff --git a/src/mdm/train/train_mdm.py b/src/mdm/train/train_mdm.py new file mode 100644 index 0000000000000000000000000000000000000000..5251837b8757452aa2a2b50a598a4909f28808d8 --- /dev/null +++ b/src/mdm/train/train_mdm.py @@ -0,0 +1,59 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Train a diffusion model on images. +""" + +import os +import json +from utils.fixseed import fixseed +from utils.parser_util import train_args +from utils import dist_util +from train.training_loop import TrainLoop +from data_loaders.get_data import get_dataset_loader +from utils.model_util import create_model_and_diffusion +from train.train_platforms import WandBPlatform, ClearmlPlatform, TensorboardPlatform, NoPlatform # required for the eval operation + +import torch +if torch.cuda.is_available(): + torch.backends.cudnn.benchmark = True + +def main(): + args = train_args() + fixseed(args.seed) + train_platform_type = eval(args.train_platform_type) + train_platform = train_platform_type(args.save_dir) + train_platform.report_args(args, name='Args') + + if args.save_dir is None: + raise FileNotFoundError('save_dir was not specified.') + elif os.path.exists(args.save_dir) and not args.overwrite: + raise FileExistsError('save_dir [{}] already exists.'.format(args.save_dir)) + elif not os.path.exists(args.save_dir): + os.makedirs(args.save_dir) + args_path = os.path.join(args.save_dir, 'args.json') + with open(args_path, 'w') as fw: + json.dump(vars(args), fw, indent=4, sort_keys=True) + + dist_util.setup_dist(args.device) + + print("creating data loader...") + + data = get_dataset_loader(name=args.dataset, + batch_size=args.batch_size, + num_frames=args.num_frames, + fixed_len=args.pred_len + args.context_len, + pred_len=args.pred_len, + device=dist_util.dev(),) + + print("creating model and diffusion...") + model, diffusion = create_model_and_diffusion(args, data) + model.to(dist_util.dev()) + model.rot2xyz.smpl_model.eval() + + print('Total params: %.2fM' % (sum(p.numel() for p in model.parameters_wo_clip()) / 1000000.0)) + print("Training...") + TrainLoop(args, train_platform, model, diffusion, data).run_loop() + train_platform.close() + +if __name__ == "__main__": + main() diff --git a/src/mdm/train/train_mdm_preproc.py b/src/mdm/train/train_mdm_preproc.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6c2d4445942ed6606580333b3e33125a40e4b4 --- /dev/null +++ b/src/mdm/train/train_mdm_preproc.py @@ -0,0 +1,257 @@ +# This code is based on https://github.com/openai/guided-diffusion +""" +Train a diffusion model on preprocessed posterior data. +""" + +import os +import json +from argparse import ArgumentParser +from utils.fixseed import fixseed +from utils import dist_util +from train.training_loop import TrainLoop +from data_loaders.preprocessed_posterior_loader import get_preprocessed_posterior_loader +from utils.model_util import create_gaussian_diffusion +from train.train_platforms import WandBPlatform, ClearmlPlatform, TensorboardPlatform, NoPlatform + +import torch +from model.mdm import MDM + +if torch.cuda.is_available(): + torch.backends.cudnn.benchmark = True + + +def train_preproc_args(): + """Parse command-line arguments for preprocessed posterior training.""" + parser = ArgumentParser(description='Train MDM on preprocessed posterior data') + + # Data-related arguments + parser.add_argument("--posterior_dir", required=True, type=str, + help="Directory containing preprocessed posterior files") + parser.add_argument("--max_samples", default=None, type=int, + help="Maximum number of samples for testing or limiting data size") + parser.add_argument("--resample", action='store_true', + help="Resample from the posterior on each load") + + # Basic arguments + parser.add_argument("--cuda", default=True, type=bool, help="Use cuda device") + parser.add_argument("--device", default=0, type=int, help="Device id to use") + parser.add_argument("--seed", default=10, type=int, help="Random seed") + parser.add_argument("--batch_size", default=64, type=int, help="Batch size") + parser.add_argument("--num_workers", default=8, type=int, help="DataLoader workers") + parser.add_argument("--train_platform_type", default='NoPlatform', + choices=['NoPlatform', 'ClearmlPlatform', 'TensorboardPlatform', 'WandBPlatform'], + type=str, help="Logging platform") + + # Model arguments + parser.add_argument("--arch", default='trans_enc', + choices=['trans_enc', 'trans_dec', 'gru'], type=str) + parser.add_argument("--text_encoder_type", default='clip', + choices=['clip', 'bert'], type=str) + parser.add_argument("--emb_trans_dec", action='store_true') + parser.add_argument("--layers", default=8, type=int, help="Number of layers") + parser.add_argument("--latent_dim", default=512, type=int, help="Transformer width") + parser.add_argument("--cond_mask_prob", default=0.1, type=float, + help="Probability of masking condition for classifier-free guidance") + parser.add_argument("--mask_frames", action='store_true') + parser.add_argument("--pos_embed_max_len", default=5000, type=int) + parser.add_argument("--use_ema", action='store_true', help="Use EMA model averaging") + + # Input feature dimensions (posterior dimensions) + parser.add_argument("--njoints", default=512, type=int, + help="Number of joints/feature dimension of posterior") + parser.add_argument("--nfeats", default=1, type=int, + help="Number of features per joint") + + # Diffusion arguments + parser.add_argument("--noise_schedule", default='cosine', + choices=['linear', 'cosine'], type=str) + parser.add_argument("--diffusion_steps", default=1000, type=int) + parser.add_argument("--sigma_small", default=True, type=bool) + + # Loss arguments + parser.add_argument("--lambda_rcxyz", default=0.0, type=float) + parser.add_argument("--lambda_vel", default=0.0, type=float) + parser.add_argument("--lambda_fc", default=0.0, type=float) + parser.add_argument("--lambda_target_loc", default=0.0, type=float) + + # Training arguments + parser.add_argument("--save_dir", required=True, type=str, + help="Path to save checkpoints") + parser.add_argument("--overwrite", action='store_true', + help="Overwrite existing save_dir") + parser.add_argument("--lr", default=1e-4, type=float, help="Learning rate") + parser.add_argument("--weight_decay", default=0.0, type=float) + parser.add_argument("--lr_anneal_steps", default=0, type=int) + parser.add_argument("--log_interval", default=1000, type=int) + parser.add_argument("--save_interval", default=50000, type=int) + parser.add_argument("--num_steps", default=600000, type=int) + parser.add_argument("--resume_checkpoint", default="", type=str) + parser.add_argument("--avg_model_beta", default=0.9999, type=float) + parser.add_argument("--adam_beta2", default=0.999, type=float) + + # Evaluation/generation arguments (optional) + parser.add_argument("--eval_during_training", action='store_true') + parser.add_argument("--eval_batch_size", default=32, type=int) + parser.add_argument("--eval_split", default='test', type=str) + parser.add_argument("--eval_rep_times", default=3, type=int) + parser.add_argument("--eval_num_samples", default=1000, type=int) + parser.add_argument("--gen_during_training", action='store_true') + parser.add_argument("--gen_num_samples", default=3, type=int) + parser.add_argument("--gen_num_repetitions", default=2, type=int) + parser.add_argument("--gen_guidance_param", default=2.5, type=float) + + # Prefix completion for compatibility + parser.add_argument("--context_len", default=0, type=int) + parser.add_argument("--pred_len", default=0, type=int) + + # Multi-target conditioning for compatibility + parser.add_argument("--multi_target_cond", action='store_true') + parser.add_argument("--multi_encoder_type", default='single', + choices=['single', 'multi', 'split'], type=str) + parser.add_argument("--target_enc_layers", default=1, type=int) + parser.add_argument("--target_joint_names", default='', type=str) + parser.add_argument("--autoregressive", action='store_true') + + # Add the unconstrained argument. + parser.add_argument("--unconstrained", action='store_true') + + args = parser.parse_args() + + # Set dataset to preprocessed_posterior. + args.dataset = 'preprocessed_posterior' + + # Apply argument rules. + if args.pred_len == 0: + args.pred_len = args.context_len + if args.lambda_target_loc > 0.: + args.multi_target_cond = True + + return args + + +def create_model_for_preproc(args, data): + """Create a model for preprocessed posterior data.""" + + # Determine conditioning mode. + if args.unconstrained: + cond_mode = 'no_cond' + elif args.dataset in ['kit', 'humanml', 'preprocessed_posterior']: + cond_mode = 'text' + else: + cond_mode = 'action' + + model_kwargs = { + 'modeltype': '', + 'njoints': args.njoints, + 'nfeats': args.nfeats, + 'num_actions': 1, + 'translation': True, + 'pose_rep': 'rot6d', + 'glob': True, + 'glob_rot': True, + 'latent_dim': args.latent_dim, + 'ff_size': 1024, + 'num_layers': args.layers, + 'num_heads': 4, + 'dropout': 0.1, + 'activation': 'gelu', + 'data_rep': 'hml_vec', # Use hml_vec format. + 'cond_mode': cond_mode, + 'cond_mask_prob': args.cond_mask_prob, + 'action_emb': 'tensor', + 'arch': args.arch, + 'emb_trans_dec': args.emb_trans_dec, + 'clip_version': 'ViT-B/32', + 'dataset': args.dataset, + 'text_encoder_type': args.text_encoder_type, + 'pos_embed_max_len': args.pos_embed_max_len, + 'mask_frames': args.mask_frames, + 'pred_len': args.pred_len, + 'context_len': args.context_len, + 'emb_policy': 'add', + 'all_goal_joint_names': [], + 'multi_target_cond': args.multi_target_cond, + 'multi_encoder_type': args.multi_encoder_type, + 'target_enc_layers': args.target_enc_layers, + } + + model = MDM(**model_kwargs) + diffusion = create_gaussian_diffusion(args) + + return model, diffusion + + +def main(): + args = train_preproc_args() + fixseed(args.seed) + + # Set up the training platform. + train_platform_type = eval(args.train_platform_type) + train_platform = train_platform_type(args.save_dir) + train_platform.report_args(args, name='Args') + + # Check the save directory. + if args.save_dir is None: + raise FileNotFoundError('save_dir was not specified.') + elif os.path.exists(args.save_dir) and not args.overwrite: + raise FileExistsError('save_dir [{}] already exists.'.format(args.save_dir)) + elif not os.path.exists(args.save_dir): + os.makedirs(args.save_dir) + + # Save arguments. + args_path = os.path.join(args.save_dir, 'args.json') + with open(args_path, 'w') as fw: + json.dump(vars(args), fw, indent=4, sort_keys=True) + + # Set up distributed environment. + dist_util.setup_dist(args.device) + + print("=" * 50) + print("Creating data loader for preprocessed posterior...") + print("=" * 50) + + # Create the preprocessed posterior data loader. + data = get_preprocessed_posterior_loader( + posterior_dir=args.posterior_dir, + batch_size=args.batch_size, + shuffle=True, + num_workers=args.num_workers, + max_samples=args.max_samples, + resample=args.resample, + drop_last=True + ) + + print(f"DataLoader created: {len(data)} batches") + print(f"Posterior directory: {args.posterior_dir}") + print(f"Batch size: {args.batch_size}") + print(f"Resample mode: {args.resample}") + + print("\n" + "=" * 50) + print("Creating model and diffusion...") + print("=" * 50) + + model, diffusion = create_model_for_preproc(args, data) + model.to(dist_util.dev()) + + # Set the SMPL model to eval mode if it exists. + if hasattr(model, 'rot2xyz') and hasattr(model.rot2xyz, 'smpl_model'): + model.rot2xyz.smpl_model.eval() + + print('Total params: %.2fM' % (sum(p.numel() for p in model.parameters_wo_clip()) / 1000000.0)) + print(f"Model architecture: {args.arch}") + print(f"Latent dim: {args.latent_dim}") + print(f"Layers: {args.layers}") + print(f"Input joints: {args.njoints}") + + print("\n" + "=" * 50) + print("Starting training...") + print("=" * 50) + + TrainLoop(args, train_platform, model, diffusion, data).run_loop() + train_platform.close() + + print("Training completed!") + + +if __name__ == "__main__": + main() diff --git a/src/mdm/train/train_platforms.py b/src/mdm/train/train_platforms.py new file mode 100644 index 0000000000000000000000000000000000000000..07486ece0ecf259e6adbf4a3cda5296f8542f423 --- /dev/null +++ b/src/mdm/train/train_platforms.py @@ -0,0 +1,90 @@ +import os +import glob + +class TrainPlatform: + def __init__(self, save_dir, *args, **kwargs): + self.path, file = os.path.split(save_dir) + self.name = kwargs.get('name', file) + + def report_scalar(self, name, value, iteration, group_name=None): + pass + + def report_media(self, title, series, iteration, local_path): + pass + + def report_args(self, args, name): + pass + + def close(self): + pass + +# Deprecated +class ClearmlPlatform(TrainPlatform): + def __init__(self, save_dir): + from clearml import Task + path, name = os.path.split(save_dir) + self.task = Task.init(project_name='motion_diffusion', + task_name=name, + output_uri=path) + self.logger = self.task.get_logger() + + def report_scalar(self, name, value, iteration, group_name): + self.logger.report_scalar(title=group_name, series=name, iteration=iteration, value=value) + + def report_media(self, title, series, iteration, local_path): + self.logger.report_media(title=title, series=series, iteration=iteration, local_path=local_path) + + def report_args(self, args, name): + self.task.connect(args, name=name) + + def close(self): + self.task.close() + + +class TensorboardPlatform(TrainPlatform): + def __init__(self, save_dir): + from torch.utils.tensorboard import SummaryWriter + self.writer = SummaryWriter(log_dir=save_dir) + + def report_scalar(self, name, value, iteration, group_name=None): + self.writer.add_scalar(f'{group_name}/{name}', value, iteration) + + def close(self): + self.writer.close() + + +class NoPlatform(TrainPlatform): + def __init__(self, save_dir, *args, **kwargs): + pass + +class WandBPlatform(TrainPlatform): + import wandb + def __init__(self, save_dir, config=None, *args, **kwargs): + super().__init__(save_dir, *args, **kwargs) + self.wandb.login(host=os.getenv("WANDB_BASE_URL"), key=os.getenv("WANDB_API_KEY")) + self.wandb.init( + project='motion_diffusion', + name=self.name, + id=self.name, # in order to send continued runs to the same record + resume='allow', # in order to send continued runs to the same record + entity='tau-motion', # will use your default entity if not set + save_code=True, + config=config) # config can also be sent via report_args() + + def report_scalar(self, name, value, iteration, group_name=None): + self.wandb.log({name: value}, step=iteration) + + def report_media(self, title, series, iteration, local_path): + files = glob.glob(f'{local_path}/*.mp4') + self.wandb.log({series: [self.wandb.Video(file, format='mp4', fps=20) for file in files]}, step=iteration) + + def report_args(self, args, name): + self.wandb.config.update(args) #, allow_val_change=True) # use allow_val_change ONLY if you want to change existing args (e.g., overwrite) + + def watch_model(self, *args, **kwargs): + self.wandb.watch(args, kwargs) + + def close(self): + self.wandb.finish() + + diff --git a/src/mdm/train/training_loop.py b/src/mdm/train/training_loop.py new file mode 100644 index 0000000000000000000000000000000000000000..edd4e4aaceeaf03c3de154208b112de628ef8689 --- /dev/null +++ b/src/mdm/train/training_loop.py @@ -0,0 +1,475 @@ +import copy +import functools +import os +import time +from types import SimpleNamespace +import numpy as np + +import re +from os.path import join as pjoin +from typing import Optional + +import blobfile as bf +import torch +from torch.optim import AdamW + +from diffusion import logger +from utils import dist_util +from diffusion.fp16_util import MixedPrecisionTrainer +from diffusion.resample import LossAwareSampler, UniformSampler +from tqdm import tqdm +from diffusion.resample import create_named_schedule_sampler +from data_loaders.humanml.networks.evaluator_wrapper import EvaluatorMDMWrapper +from eval import eval_humanml, eval_humanact12_uestc +from sample.generate import main as generate +from data_loaders.get_data import get_dataset_loader +from utils.model_util import load_model_wo_clip +from data_loaders.humanml.scripts.motion_process import get_target_location, sample_goal, get_allowed_joint_options +from utils.sampler_util import ClassifierFreeSampleModel + + +# For ImageNet experiments, this was a good default value. +# We found that the lg_loss_scale quickly climbed to +# 20-21 within the first ~1K steps of training. +INITIAL_LOG_LOSS_SCALE = 20.0 + + +class TrainLoop: + def __init__(self, args, train_platform, model, diffusion, data): + self.args = args + self.dataset = args.dataset + self.train_platform = train_platform + self.model = model + self.model_avg = None + if self.args.use_ema: + self.model_avg = copy.deepcopy(self.model) + self.model_for_eval = self.model_avg if self.args.use_ema else self.model + if args.gen_guidance_param != 1: + self.model_for_eval = ClassifierFreeSampleModel(self.model_for_eval) # wrapping model with the classifier-free sampler + self.diffusion = diffusion + self.cond_mode = model.cond_mode + self.data = data + self.batch_size = args.batch_size + self.microbatch = args.batch_size # deprecating this option + self.lr = args.lr + self.log_interval = args.log_interval + self.save_interval = args.save_interval + self.resume_checkpoint = args.resume_checkpoint + self.use_fp16 = False # deprecating this option + self.fp16_scale_growth = 1e-3 # deprecating this option + self.weight_decay = args.weight_decay + self.lr_anneal_steps = args.lr_anneal_steps + + self.step = 0 + self.resume_step = 0 + self.global_batch = self.batch_size # * dist.get_world_size() + self.num_steps = args.num_steps + self.num_epochs = self.num_steps // len(self.data) + 1 + + self.sync_cuda = torch.cuda.is_available() + + self._load_and_sync_parameters() + self.mp_trainer = MixedPrecisionTrainer( + model=self.model, + use_fp16=self.use_fp16, + fp16_scale_growth=self.fp16_scale_growth, + ) + + self.save_dir = args.save_dir + self.overwrite = args.overwrite + + if self.args.use_ema: + self.opt = AdamW( + # with amp, we don't need to use the mp_trainer's master_params + (self.model.parameters() + if self.use_fp16 else self.mp_trainer.master_params), + lr=self.lr, + weight_decay=self.weight_decay, + betas=(0.9, self.args.adam_beta2), + ) + else: + self.opt = AdamW( + self.mp_trainer.master_params, lr=self.lr, weight_decay=self.weight_decay + ) + + if self.resume_step: + self._load_optimizer_state() + # Model was resumed, either due to a restart or a checkpoint + # being specified at the command line. + + self.device = torch.device("cpu") + if torch.cuda.is_available() and dist_util.dev() != 'cpu': + self.device = torch.device(dist_util.dev()) + + self.schedule_sampler_type = 'uniform' + self.schedule_sampler = create_named_schedule_sampler(self.schedule_sampler_type, diffusion) + self.eval_wrapper, self.eval_data, self.eval_gt_data = None, None, None + if args.dataset in ['kit', 'humanml'] and args.eval_during_training: + mm_num_samples = 0 # mm is super slow hence we won't run it during training + mm_num_repeats = 0 # mm is super slow hence we won't run it during training + gen_loader = get_dataset_loader(name=args.dataset, batch_size=args.eval_batch_size, num_frames=None, + split=args.eval_split, + hml_mode='eval', + autoregressive=args.autoregressive, + fixed_len=args.context_len+args.pred_len, pred_len=args.pred_len, device=dist_util.dev()) + + self.eval_gt_data = get_dataset_loader(name=args.dataset, batch_size=args.eval_batch_size, num_frames=None, + split=args.eval_split, + hml_mode='gt', device=dist_util.dev()) + self.eval_wrapper = EvaluatorMDMWrapper(args.dataset, dist_util.dev()) + self.eval_data = { + 'test': lambda: eval_humanml.get_mdm_loader(self.args, + self.model_for_eval, diffusion, args.eval_batch_size, + gen_loader, mm_num_samples, mm_num_repeats, gen_loader.dataset.opt.max_motion_length, + args.eval_num_samples, scale=args.gen_guidance_param, + ) + } + self.use_ddp = False + self.ddp_model = self.model + + def _load_and_sync_parameters(self): + resume_checkpoint = self.find_resume_checkpoint() or self.resume_checkpoint + + if resume_checkpoint: + # we add 1 because self.resume_step has already been done and we don't want to run it again + # in particular we don't want to run the evaluation and generation again + self.step += 1 + + self.resume_step = parse_resume_step_from_filename(resume_checkpoint) + logger.log(f"loading model from checkpoint: {resume_checkpoint}...") + state_dict = dist_util.load_state_dict( + resume_checkpoint, map_location=dist_util.dev()) + + if 'model_avg' in state_dict: + print('loading both model and model_avg') + state_dict, state_dict_avg = state_dict['model'], state_dict[ + 'model_avg'] + load_model_wo_clip(self.model, state_dict) + load_model_wo_clip(self.model_avg, state_dict_avg) + else: + load_model_wo_clip(self.model, state_dict) + if self.args.use_ema: + # in case we load from a legacy checkpoint, just copy the model + print('loading model_avg from model') + self.model_avg.load_state_dict(self.model.state_dict(), strict=False) + + # self.model.load_state_dict( + # dist_util.load_state_dict( + # resume_checkpoint, map_location=dist_util.dev() + # ), strict=False + # ) + + def _load_optimizer_state(self): + main_checkpoint = self.find_resume_checkpoint() or self.resume_checkpoint + opt_checkpoint = bf.join( + bf.dirname(main_checkpoint), f"opt{self.resume_step:09}.pt" + ) + if bf.exists(opt_checkpoint): + logger.log(f"loading optimizer state from checkpoint: {opt_checkpoint}") + state_dict = dist_util.load_state_dict( + opt_checkpoint, map_location=dist_util.dev() + ) + + if self.use_fp16: + if 'scaler' not in state_dict: + print("scaler state not found ... not loading it.") + else: + # load grad scaler state + self.scaler.load_state_dict(state_dict['scaler']) + # for the rest + state_dict = state_dict['opt'] + + tgt_wd = self.opt.param_groups[0]['weight_decay'] + print('target weight decay:', tgt_wd) + self.opt.load_state_dict(state_dict) + print('loaded weight decay (will be replaced):', + self.opt.param_groups[0]['weight_decay']) + # preserve the weight decay parameter + for group in self.opt.param_groups: + group['weight_decay'] = tgt_wd + self.opt.param_groups[0]['capturable'] = True + + def cond_modifiers(self, cond, motion): + # All modifiers must be in-place + self.target_cond_modifier(cond, motion) + + def target_cond_modifier(self, cond, motion): + if self.args.multi_target_cond: + batch_size = motion.shape[0] + cond['target_joint_names'], cond['is_heading'] = sample_goal(batch_size, motion.device, self.args.target_joint_names) + + cond['target_cond'] = get_target_location(motion, + self.data.dataset.mean[None, :, None, None], + self.data.dataset.std[None, :, None, None], + cond['lengths'], + self.data.dataset.t2m_dataset.opt.joints_num, self.model.all_goal_joint_names, cond['target_joint_names'], cond['is_heading']).detach() + + def run_loop(self): + print('train steps:', self.num_steps) + for epoch in range(self.num_epochs): + print(f'Starting epoch {epoch}') + for motion, cond in tqdm(self.data): + if not (not self.lr_anneal_steps or self.total_step() < self.lr_anneal_steps): + break + + self.cond_modifiers(cond['y'], motion) # Modify in-place for efficiency + motion = motion.to(self.device) + cond['y'] = {key: val.to(self.device) if torch.is_tensor(val) else val for key, val in cond['y'].items()} + + self.run_step(motion, cond) + if self.total_step() % self.log_interval == 0: + for k,v in logger.get_current().dumpkvs().items(): + if k == 'loss': + print('step[{}]: loss[{:0.5f}]'.format(self.total_step(), v)) + + if k in ['step', 'samples'] or '_q' in k: + continue + else: + self.train_platform.report_scalar(name=k, value=v, iteration=self.total_step(), group_name='Loss') + + if self.total_step() % self.save_interval == 0: + self.save() + self.model.eval() + if self.args.use_ema: + self.model_avg.eval() + self.evaluate() + self.generate_during_training() + self.model.train() + if self.args.use_ema: + self.model_avg.train() + + # Run for a finite amount of time in integration tests. + if os.environ.get("DIFFUSION_TRAINING_TEST", "") and self.total_step() > 0: + return + self.step += 1 + if not (not self.lr_anneal_steps or self.total_step() < self.lr_anneal_steps): + break + # Save the last checkpoint if it wasn't already saved. + if (self.total_step() - 1) % self.save_interval != 0: + self.save() + self.evaluate() + + def evaluate(self): + if not self.args.eval_during_training: + return + start_eval = time.time() + if self.eval_wrapper is not None: + print('Running evaluation loop: [Should take about 90 min]') + log_file = os.path.join(self.save_dir, f'eval_humanml_{(self.total_step()):09d}.log') + diversity_times = 300 + mm_num_times = 0 # mm is super slow hence we won't run it during training + eval_dict = eval_humanml.evaluation( + self.eval_wrapper, self.eval_gt_data, self.eval_data, log_file, + replication_times=self.args.eval_rep_times, diversity_times=diversity_times, mm_num_times=mm_num_times, run_mm=False) + print(eval_dict) + for k, v in eval_dict.items(): + if k.startswith('R_precision'): + for i in range(len(v)): + self.train_platform.report_scalar(name=f'top{i + 1}_' + k, value=v[i], + iteration=self.total_step(), + group_name='Eval') + else: + self.train_platform.report_scalar(name=k, value=v, iteration=self.total_step(), + group_name='Eval') + + elif self.dataset in ['humanact12', 'uestc']: + eval_args = SimpleNamespace(num_seeds=self.args.eval_rep_times, num_samples=self.args.eval_num_samples, + batch_size=self.args.eval_batch_size, device=self.device, guidance_param = 1, + dataset=self.dataset, unconstrained=self.args.unconstrained, + model_path=os.path.join(self.save_dir, self.ckpt_file_name())) + eval_dict = eval_humanact12_uestc.evaluate(eval_args, model=self.model, diffusion=self.diffusion, data=self.data.dataset) + print(f'Evaluation results on {self.dataset}: {sorted(eval_dict["feats"].items())}') + for k, v in eval_dict["feats"].items(): + if 'unconstrained' not in k: + self.train_platform.report_scalar(name=k, value=np.array(v).astype(float).mean(), iteration=self.step, group_name='Eval') + else: + self.train_platform.report_scalar(name=k, value=np.array(v).astype(float).mean(), iteration=self.step, group_name='Eval Unconstrained') + + end_eval = time.time() + print(f'Evaluation time: {round(end_eval-start_eval)/60}min') + + + def run_step(self, batch, cond): + self.forward_backward(batch, cond) + self.mp_trainer.optimize(self.opt) + self.update_average_model() + self._anneal_lr() + self.log_step() + + def update_average_model(self): + # update the average model using exponential moving average + if self.args.use_ema: + # master params are FP32 + params = self.model.parameters( + ) if self.use_fp16 else self.mp_trainer.master_params + for param, avg_param in zip(params, self.model_avg.parameters()): + # avg = avg + (param - avg) * (1 - alpha) + # avg = avg + param * (1 - alpha) - (avg - alpha * avg) + # avg = alpha * avg + param * (1 - alpha) + avg_param.data.mul_(self.args.avg_model_beta).add_( + param.data, alpha=1 - self.args.avg_model_beta) + + def forward_backward(self, batch, cond): + self.mp_trainer.zero_grad() + for i in range(0, batch.shape[0], self.microbatch): + # Eliminates the microbatch feature + assert i == 0 + assert self.microbatch == self.batch_size + micro = batch + micro_cond = cond + last_batch = (i + self.microbatch) >= batch.shape[0] + t, weights = self.schedule_sampler.sample(micro.shape[0], dist_util.dev()) + + compute_losses = functools.partial( + self.diffusion.training_losses, + self.ddp_model, + micro, # [bs, ch, image_size, image_size] + t, # [bs](int) sampled timesteps + model_kwargs=micro_cond, + dataset=self.data.dataset + ) + + if last_batch or not self.use_ddp: + losses = compute_losses() + else: + with self.ddp_model.no_sync(): + losses = compute_losses() + + if isinstance(self.schedule_sampler, LossAwareSampler): + self.schedule_sampler.update_with_local_losses( + t, losses["loss"].detach() + ) + + loss = (losses["loss"] * weights).mean() + log_loss_dict( + self.diffusion, t, {k: v * weights for k, v in losses.items()} + ) + self.mp_trainer.backward(loss) + + def _anneal_lr(self): + if not self.lr_anneal_steps: + return + frac_done = self.total_step() / self.lr_anneal_steps + lr = self.lr * (1 - frac_done) + for param_group in self.opt.param_groups: + param_group["lr"] = lr + + def log_step(self): + logger.logkv("step", self.total_step()) + logger.logkv("samples", (self.total_step() + 1) * self.global_batch) + + + def ckpt_file_name(self): + return f"model{(self.total_step()):09d}.pt" + + + def generate_during_training(self): + if not self.args.gen_during_training: + return + gen_args = copy.deepcopy(self.args) + gen_args.model_path = os.path.join(self.save_dir, self.ckpt_file_name()) + gen_args.output_dir = os.path.join(self.save_dir, f'{self.ckpt_file_name()}.samples') + gen_args.num_samples = self.args.gen_num_samples + gen_args.num_repetitions = self.args.gen_num_repetitions + gen_args.guidance_param = self.args.gen_guidance_param + gen_args.motion_length = 6 # fixed length + gen_args.input_text = gen_args.text_prompt = gen_args.action_file = gen_args.action_name = gen_args.dynamic_text_path = '' + if gen_args.multi_target_cond: + gen_args.sampling_mode = 'goal' + gen_args.target_joint_source = 'data' + all_sample_save_path = generate(gen_args) + self.train_platform.report_media(title='Motion', series='Predicted Motion', iteration=self.total_step(), + local_path=all_sample_save_path) + + + def find_resume_checkpoint(self) -> Optional[str]: + '''look for all file in save directory in the pattent of model{number}.pt + and return the one with the highest step number. + + TODO: Implement this function (alredy existing in MDM), so that find model will call it in case a ckpt exist. + TODO: Change call for find_resume_checkpoint and send save_dir as arg. + TODO: This means ignoring the flag of resume_checkpoint in case some other ckpts exists in that dir! + ''' + + matches = {file: re.match(r'model(\d+).pt$', file) for file in os.listdir(self.args.save_dir)} + models = {int(match.group(1)): file for file, match in matches.items() if match} + + return pjoin(self.args.save_dir, models[max(models)]) if models else None + + def total_step(self): + return self.step + self.resume_step + + def save(self): + def save_checkpoint(): + def del_clip(state_dict): + # Do not save CLIP weights + clip_weights = [ + e for e in state_dict.keys() if e.startswith('clip_model.') + ] + for e in clip_weights: + del state_dict[e] + + if self.use_fp16: + state_dict = self.model.state_dict() + else: + state_dict = self.mp_trainer.master_params_to_state_dict( + self.mp_trainer.master_params) + del_clip(state_dict) + + if self.args.use_ema: + # save both the model and the average model + state_dict_avg = self.model_avg.state_dict() + del_clip(state_dict_avg) + state_dict = {'model': state_dict, 'model_avg': state_dict_avg} + + logger.log(f"saving model...") + filename = self.ckpt_file_name() + with bf.BlobFile(bf.join(self.save_dir, filename), "wb") as f: + torch.save(state_dict, f) + + save_checkpoint() + + with bf.BlobFile( + bf.join(self.save_dir, f"opt{(self.total_step()):09d}.pt"), + "wb", + ) as f: + opt_state = self.opt.state_dict() + if self.use_fp16: + # with fp16 we also save the state dict + opt_state = { + 'opt': opt_state, + 'scaler': self.scaler.state_dict(), + } + + torch.save(opt_state, f) + + +def parse_resume_step_from_filename(filename): + """ + Parse filenames of the form path/to/modelNNNNNN.pt, where NNNNNN is the + checkpoint's number of steps. + """ + split = filename.split("model") + if len(split) < 2: + return 0 + split1 = split[-1].split(".")[0] + try: + return int(split1) + except ValueError: + return 0 + + +def get_blob_logdir(): + # You can change this to be a separate path to save checkpoints to + # a blobstore or some external drive. + return logger.get_dir() + + + +def log_loss_dict(diffusion, ts, losses): + for key, values in losses.items(): + logger.logkv_mean(key, values.mean().item()) + # Log the quantiles (four quartiles, in particular). + for sub_t, sub_loss in zip(ts.cpu().numpy(), values.detach().cpu().numpy()): + quartile = int(4 * sub_t / diffusion.num_timesteps) + logger.logkv_mean(f"{key}_q{quartile}", sub_loss) diff --git a/src/mdm/utils/PYTORCH3D_LICENSE b/src/mdm/utils/PYTORCH3D_LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bed0cebe976e160c9087d1b1054473bdacf75b3b --- /dev/null +++ b/src/mdm/utils/PYTORCH3D_LICENSE @@ -0,0 +1,30 @@ +BSD License + +For PyTorch3D software + +Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/src/mdm/utils/config.py b/src/mdm/utils/config.py new file mode 100644 index 0000000000000000000000000000000000000000..091d790e963959c326917688ee267e6a4ec136d1 --- /dev/null +++ b/src/mdm/utils/config.py @@ -0,0 +1,17 @@ +import os + +SMPL_DATA_PATH = "./body_models/smpl" + +SMPL_KINTREE_PATH = os.path.join(SMPL_DATA_PATH, "kintree_table.pkl") +SMPL_MODEL_PATH = os.path.join(SMPL_DATA_PATH, "SMPL_NEUTRAL.pkl") +JOINT_REGRESSOR_TRAIN_EXTRA = os.path.join(SMPL_DATA_PATH, 'J_regressor_extra.npy') + +ROT_CONVENTION_TO_ROT_NUMBER = { + 'legacy': 23, + 'no_hands': 21, + 'full_hands': 51, + 'mitten_hands': 33, +} + +GENDERS = ['neutral', 'male', 'female'] +NUM_BETAS = 10 \ No newline at end of file diff --git a/src/mdm/utils/dist_util.py b/src/mdm/utils/dist_util.py new file mode 100644 index 0000000000000000000000000000000000000000..9f5580a7890010ed4acdfcee8cb4eb7f8618769c --- /dev/null +++ b/src/mdm/utils/dist_util.py @@ -0,0 +1,77 @@ +""" +Helpers for distributed training. +""" + +import socket + +import torch as th +import torch.distributed as dist + +# Change this to reflect your cluster layout. +# The GPU for a given rank is (rank % GPUS_PER_NODE). +GPUS_PER_NODE = 8 + +SETUP_RETRY_COUNT = 3 + +used_device = 0 + +def setup_dist(device=0): + """ + Setup a distributed process group. + """ + global used_device + used_device = device + if dist.is_initialized(): + return + # os.environ["CUDA_VISIBLE_DEVICES"] = str(device) # f"{MPI.COMM_WORLD.Get_rank() % GPUS_PER_NODE}" + + # comm = MPI.COMM_WORLD + # backend = "gloo" if not th.cuda.is_available() else "nccl" + + # if backend == "gloo": + # hostname = "localhost" + # else: + # hostname = socket.gethostbyname(socket.getfqdn()) + # os.environ["MASTER_ADDR"] = comm.bcast(hostname, root=0) + # os.environ["RANK"] = str(comm.rank) + # os.environ["WORLD_SIZE"] = str(comm.size) + + # port = comm.bcast(_find_free_port(), root=used_device) + # os.environ["MASTER_PORT"] = str(port) + # dist.init_process_group(backend=backend, init_method="env://") + + +def dev(): + """ + Get the device to use for torch.distributed. + """ + global used_device + if th.cuda.is_available() and used_device>=0: + return th.device(f"cuda:{used_device}") + return th.device("cpu") + + +def load_state_dict(path, **kwargs): + """ + Load a PyTorch file without redundant fetches across MPI ranks. + """ + return th.load(path, **kwargs) + + +def sync_params(params): + """ + Synchronize a sequence of Tensors across ranks from rank 0. + """ + for p in params: + with th.no_grad(): + dist.broadcast(p, 0) + + +def _find_free_port(): + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(("", 0)) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + return s.getsockname()[1] + finally: + s.close() diff --git a/src/mdm/utils/fixseed.py b/src/mdm/utils/fixseed.py new file mode 100644 index 0000000000000000000000000000000000000000..6f44f6ca263dcc410102a50970ce1b78405ba1f1 --- /dev/null +++ b/src/mdm/utils/fixseed.py @@ -0,0 +1,18 @@ +import numpy as np +import torch +import random + + +def fixseed(seed): + torch.backends.cudnn.benchmark = False + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + +# SEED = 10 +# EVALSEED = 0 +# # Provoc warning: not fully functionnal yet +# # torch.set_deterministic(True) +# torch.backends.cudnn.benchmark = False +# fixseed(SEED) diff --git a/src/mdm/utils/loss_util.py b/src/mdm/utils/loss_util.py new file mode 100644 index 0000000000000000000000000000000000000000..2720716725e41e609ac90ca7d37cfde6bb495603 --- /dev/null +++ b/src/mdm/utils/loss_util.py @@ -0,0 +1,46 @@ +from diffusion.nn import mean_flat, sum_flat +import torch +import numpy as np + +def angle_l2(angle1, angle2): + a = angle1 - angle2 + a = (a + (torch.pi/2)) % torch.pi - (torch.pi/2) + return a ** 2 + +def diff_l2(a, b): + return (a - b) ** 2 + +def masked_l2(a, b, mask, loss_fn=diff_l2, epsilon=1e-8, entries_norm=True): + # assuming a.shape == b.shape == bs, J, Jdim, seqlen + # assuming mask.shape == bs, 1, 1, seqlen + loss = loss_fn(a, b) + loss = sum_flat(loss * mask.float()) # gives \sigma_euclidean over unmasked elements + n_entries = a.shape[1] + if len(a.shape) > 3: + n_entries *= a.shape[2] + non_zero_elements = sum_flat(mask) + if entries_norm: + # In cases the mask is per frame, and not specifying the number of entries per frame, this normalization is needed, + # Otherwise set it to False + non_zero_elements *= n_entries + # print('mask', mask.shape) + # print('non_zero_elements', non_zero_elements) + # print('loss', loss) + mse_loss_val = loss / (non_zero_elements + epsilon) # Add epsilon to avoid division by zero + # print('mse_loss_val', mse_loss_val) + return mse_loss_val + + +def masked_goal_l2(pred_goal, ref_goal, cond, all_goal_joint_names): + all_goal_joint_names_w_traj = np.append(all_goal_joint_names, 'traj') + target_joint_idx = [[np.where(all_goal_joint_names_w_traj == j)[0][0] for j in sample_joints] for sample_joints in cond['target_joint_names']] + loc_mask = torch.zeros_like(pred_goal[:,:-1], dtype=torch.bool) + for sample_idx in range(loc_mask.shape[0]): + loc_mask[sample_idx, target_joint_idx[sample_idx]] = True + loc_mask[:, -1, 1] = False # vertical joint of 'traj' is always masked out + loc_loss = masked_l2(pred_goal[:,:-1], ref_goal[:,:-1], loc_mask, entries_norm=False) + + heading_loss = masked_l2(pred_goal[:,-1:, :1], ref_goal[:,-1:, :1], cond['is_heading'].unsqueeze(1).unsqueeze(1), loss_fn=angle_l2, entries_norm=False) + + loss = loc_loss + heading_loss + return loss diff --git a/src/mdm/utils/misc.py b/src/mdm/utils/misc.py new file mode 100644 index 0000000000000000000000000000000000000000..afcb13fe892da0aab0bd2ab61803e81aa4d10754 --- /dev/null +++ b/src/mdm/utils/misc.py @@ -0,0 +1,74 @@ +import torch +import torch.nn as nn + + +class WeightedSum(nn.Module): + def __init__(self, num_rows): + super(WeightedSum, self).__init__() + # Initialize learnable weights + self.weights = nn.Parameter(torch.randn(num_rows)) + + def forward(self, x): + # Ensure weights are normalized (optional) + normalized_weights = self.weights / self.weights.sum() # torch.softmax(self.weights, dim=0) + # Compute the weighted sum of the rows + weighted_sum = torch.matmul(normalized_weights, x) + return weighted_sum + + +def wrapped_getattr(self, name, default=None, wrapped_member_name='model'): + ''' should be called from wrappers of model classes such as ClassifierFreeSampleModel''' + + if isinstance(self, torch.nn.Module): + # for descendants of nn.Module, name may be in self.__dict__[_parameters/_buffers/_modules] + # so we activate nn.Module.__getattr__ first. + # Otherwise, we might encounter an infinite loop + try: + attr = torch.nn.Module.__getattr__(self, name) + except AttributeError: + wrapped_member = torch.nn.Module.__getattr__(self, wrapped_member_name) + attr = getattr(wrapped_member, name, default) + else: + # the easy case, where self is not derived from nn.Module + wrapped_member = getattr(self, wrapped_member_name) + attr = getattr(wrapped_member, name, default) + return attr + + +def to_numpy(tensor): + if torch.is_tensor(tensor): + return tensor.cpu().numpy() + elif type(tensor).__module__ != 'numpy': + raise ValueError("Cannot convert {} to numpy array".format( + type(tensor))) + return tensor + + +def to_torch(ndarray): + if type(ndarray).__module__ == 'numpy': + return torch.from_numpy(ndarray) + elif not torch.is_tensor(ndarray): + raise ValueError("Cannot convert {} to torch tensor".format( + type(ndarray))) + return ndarray + + +def cleanexit(): + import sys + import os + try: + sys.exit(0) + except SystemExit: + os._exit(0) + +def load_model_wo_clip(model, state_dict): + missing_keys, unexpected_keys = model.load_state_dict(state_dict, strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + +def freeze_joints(x, joints_to_freeze): + # Freezes selected joint *rotations* as they appear in the first frame + # x [bs, [root+n_joints], joint_dim(6), seqlen] + frozen = x.detach().clone() + frozen[:, joints_to_freeze, :, :] = frozen[:, joints_to_freeze, :, :1] + return frozen diff --git a/src/mdm/utils/model_util.py b/src/mdm/utils/model_util.py new file mode 100644 index 0000000000000000000000000000000000000000..9a0540b4da08c42af1aa9af440178bf0f6b71892 --- /dev/null +++ b/src/mdm/utils/model_util.py @@ -0,0 +1,135 @@ +import torch +from model.mdm import MDM +from diffusion import gaussian_diffusion as gd +from diffusion.respace import SpacedDiffusion, space_timesteps +from utils.parser_util import get_cond_mode +from data_loaders.humanml_utils import HML_EE_JOINT_NAMES + +def load_model_wo_clip(model, state_dict): + # assert (state_dict['sequence_pos_encoder.pe'][:model.sequence_pos_encoder.pe.shape[0]] == model.sequence_pos_encoder.pe).all() # TEST + # assert (state_dict['embed_timestep.sequence_pos_encoder.pe'][:model.embed_timestep.sequence_pos_encoder.pe.shape[0]] == model.embed_timestep.sequence_pos_encoder.pe).all() # TEST + del state_dict['sequence_pos_encoder.pe'] # no need to load it (fixed), and causes size mismatch for older models + del state_dict['embed_timestep.sequence_pos_encoder.pe'] # no need to load it (fixed), and causes size mismatch for older models + missing_keys, unexpected_keys = model.load_state_dict(state_dict, strict=False) + # print("[Info] missing keys:", missing_keys) # Debug only + # print("[Info] unexpected keys:", unexpected_keys) # Debug only + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') or 'sequence_pos_encoder' in k for k in missing_keys]) + + +def create_model_and_diffusion(args, data): + model = MDM(**get_model_args(args, data)) + diffusion = create_gaussian_diffusion(args) + return model, diffusion + + +def get_model_args(args, data): + + # default args + clip_version = 'ViT-B/32' + action_emb = 'tensor' + cond_mode = get_cond_mode(args) + num_actions = 1 + + # SMPL defaults + data_rep = 'rot6d' + njoints = 25 + nfeats = 6 + all_goal_joint_names = [] + + if args.dataset == 'humanml': + data_rep = 'hml_vec' + njoints = 263 + nfeats = 1 + all_goal_joint_names = ['pelvis'] + HML_EE_JOINT_NAMES + elif args.dataset == 'kit': + data_rep = 'hml_vec' + njoints = 251 + nfeats = 1 + elif args.dataset == 'preprocessed_posterior': + data_rep = 'hml_vec' + njoints = args.njoints + nfeats = 1 + + # Compatibility with old models + if not hasattr(args, 'pred_len'): + args.pred_len = 0 + args.context_len = 0 + + emb_policy = args.__dict__.get('emb_policy', 'add') + multi_target_cond = args.__dict__.get('multi_target_cond', False) + multi_encoder_type = args.__dict__.get('multi_encoder_type', 'multi') + target_enc_layers = args.__dict__.get('target_enc_layers', 1) + + return {'modeltype': '', 'njoints': njoints, 'nfeats': nfeats, 'num_actions': num_actions, + 'translation': True, 'pose_rep': 'rot6d', 'glob': True, 'glob_rot': True, + 'latent_dim': args.latent_dim, 'ff_size': 1024, 'num_layers': args.layers, 'num_heads': 4, + 'dropout': 0.1, 'activation': "gelu", 'data_rep': data_rep, 'cond_mode': cond_mode, + 'cond_mask_prob': args.cond_mask_prob, 'action_emb': action_emb, 'arch': args.arch, + 'emb_trans_dec': args.emb_trans_dec, 'clip_version': clip_version, 'dataset': args.dataset, + 'text_encoder_type': args.text_encoder_type, + 'pos_embed_max_len': args.pos_embed_max_len, 'mask_frames': args.mask_frames, + 'pred_len': args.pred_len, 'context_len': args.context_len, 'emb_policy': emb_policy, + 'all_goal_joint_names': all_goal_joint_names, 'multi_target_cond': multi_target_cond, 'multi_encoder_type': multi_encoder_type, 'target_enc_layers': target_enc_layers, + } + + + +def create_gaussian_diffusion(args): + # default params + predict_xstart = True # we always predict x_start (a.k.a. x0), that's our deal! + steps = args.diffusion_steps + scale_beta = 1. # no scaling + timestep_respacing = '' # can be used for ddim sampling, we don't use it. + learn_sigma = False + rescale_timesteps = False + + betas = gd.get_named_beta_schedule(args.noise_schedule, steps, scale_beta) + loss_type = gd.LossType.MSE + + if not timestep_respacing: + timestep_respacing = [steps] + + if hasattr(args, 'lambda_target_loc'): + lambda_target_loc = args.lambda_target_loc + else: + lambda_target_loc = 0. + + return SpacedDiffusion( + use_timesteps=space_timesteps(steps, timestep_respacing), + betas=betas, + model_mean_type=( + gd.ModelMeanType.EPSILON if not predict_xstart else gd.ModelMeanType.START_X + ), + model_var_type=( + ( + gd.ModelVarType.FIXED_LARGE + if not args.sigma_small + else gd.ModelVarType.FIXED_SMALL + ) + if not learn_sigma + else gd.ModelVarType.LEARNED_RANGE + ), + loss_type=loss_type, + rescale_timesteps=rescale_timesteps, + lambda_vel=args.lambda_vel, + lambda_rcxyz=args.lambda_rcxyz, + lambda_fc=args.lambda_fc, + lambda_target_loc=lambda_target_loc, + ) + +def load_saved_model(model, model_path, use_avg: bool=False): # use_avg_model + state_dict = torch.load(model_path, map_location='cpu') + # Use average model when possible + if use_avg and 'model_avg' in state_dict.keys(): + # if use_avg_model: + print('loading avg model') + state_dict = state_dict['model_avg'] + else: + if 'model' in state_dict: + print('loading model without avg') + state_dict = state_dict['model'] + else: + print('checkpoint has no avg model, loading as usual.') + load_model_wo_clip(model, state_dict) + return model \ No newline at end of file diff --git a/src/mdm/utils/parser_util.py b/src/mdm/utils/parser_util.py new file mode 100644 index 0000000000000000000000000000000000000000..408e81b2e1d88635203bc08c5c45f3b18e570f2f --- /dev/null +++ b/src/mdm/utils/parser_util.py @@ -0,0 +1,320 @@ +from argparse import ArgumentParser +import argparse +import os +import json + + +def parse_and_load_from_model(parser): + # args according to the loaded model + # do not try to specify them from cmd line since they will be overwritten + add_data_options(parser) + add_model_options(parser) + add_diffusion_options(parser) + args = parser.parse_args() + args_to_overwrite = [] + for group_name in ['dataset', 'model', 'diffusion']: + args_to_overwrite += get_args_per_group_name(parser, args, group_name) + + # load args from model + if args.model_path != '': # if not using external results file + args = load_args_from_model(args, args_to_overwrite) + + if args.cond_mask_prob == 0: + args.guidance_param = 1 + + return apply_rules(args) + +def load_args_from_model(args, args_to_overwrite): + model_path = get_model_path_from_args() + args_path = os.path.join(os.path.dirname(model_path), 'args.json') + assert os.path.exists(args_path), 'Arguments json file was not found!' + with open(args_path, 'r') as fr: + model_args = json.load(fr) + + for a in args_to_overwrite: + if a in model_args.keys(): + setattr(args, a, model_args[a]) + + elif 'cond_mode' in model_args: # backward compitability + unconstrained = (model_args['cond_mode'] == 'no_cond') + setattr(args, 'unconstrained', unconstrained) + + else: + print('Warning: was not able to load [{}], using default value [{}] instead.'.format(a, args.__dict__[a])) + return args + +def apply_rules(args): + # For prefix completion + if args.pred_len == 0: + args.pred_len = args.context_len + + # For target conditioning + if args.lambda_target_loc > 0.: + args.multi_target_cond = True + return args + + +def get_args_per_group_name(parser, args, group_name): + for group in parser._action_groups: + if group.title == group_name: + group_dict = {a.dest: getattr(args, a.dest, None) for a in group._group_actions} + return list(argparse.Namespace(**group_dict).__dict__.keys()) + return ValueError('group_name was not found.') + +def get_model_path_from_args(): + try: + dummy_parser = ArgumentParser() + dummy_parser.add_argument('--model_path') + dummy_args, _ = dummy_parser.parse_known_args() + return dummy_args.model_path + except: + raise ValueError('model_path argument must be specified.') + + +def add_base_options(parser): + group = parser.add_argument_group('base') + group.add_argument("--cuda", default=True, type=bool, help="Use cuda device, otherwise use CPU.") + group.add_argument("--device", default=0, type=int, help="Device id to use.") + group.add_argument("--seed", default=10, type=int, help="For fixing random seed.") + group.add_argument("--batch_size", default=64, type=int, help="Batch size during training.") + group.add_argument("--train_platform_type", default='NoPlatform', choices=['NoPlatform', 'ClearmlPlatform', 'TensorboardPlatform', 'WandBPlatform'], type=str, + help="Choose platform to log results. NoPlatform means no logging.") + group.add_argument("--external_mode", default=False, type=bool, help="For backward cometability, do not change or delete.") + + +def add_diffusion_options(parser): + group = parser.add_argument_group('diffusion') + group.add_argument("--noise_schedule", default='cosine', choices=['linear', 'cosine'], type=str, + help="Noise schedule type") + group.add_argument("--diffusion_steps", default=1000, type=int, + help="Number of diffusion steps (denoted T in the paper)") + group.add_argument("--sigma_small", default=True, type=bool, help="Use smaller sigma values.") + + +def add_model_options(parser): + group = parser.add_argument_group('model') + group.add_argument("--arch", default='trans_enc', + choices=['trans_enc', 'trans_dec', 'gru'], type=str, + help="Architecture types as reported in the paper.") + group.add_argument("--text_encoder_type", default='clip', + choices=['clip', 'bert'], type=str, help="Text encoder type.") + group.add_argument("--emb_trans_dec", action='store_true', + help="For trans_dec architecture only, if true, will inject condition as a class token" + " (in addition to cross-attention).") + group.add_argument("--layers", default=8, type=int, + help="Number of layers.") + group.add_argument("--latent_dim", default=512, type=int, + help="Transformer/GRU width.") + group.add_argument("--cond_mask_prob", default=.1, type=float, + help="The probability of masking the condition during training." + " For classifier-free guidance learning.") + group.add_argument("--mask_frames", action='store_true', help="If true, will fix Rotem's bug and mask invalid frames.") + group.add_argument("--lambda_rcxyz", default=0.0, type=float, help="Joint positions loss.") + group.add_argument("--lambda_vel", default=0.0, type=float, help="Joint velocity loss.") + group.add_argument("--lambda_fc", default=0.0, type=float, help="Foot contact loss.") + group.add_argument("--lambda_target_loc", default=0.0, type=float, help="For HumanML only, when . L2 with target location.") + group.add_argument("--unconstrained", action='store_true', + help="Model is trained unconditionally. That is, it is constrained by neither text nor action. " + "Currently tested on HumanAct12 only.") + group.add_argument("--pos_embed_max_len", default=5000, type=int, + help="Pose embedding max length.") + group.add_argument("--use_ema", action='store_true', + help="If True, will use EMA model averaging.") + + + group.add_argument("--multi_target_cond", action='store_true', help="If true, enable multi-target conditioning (aka Sigal's model).") + group.add_argument("--multi_encoder_type", default='single', choices=['single', 'multi', 'split'], type=str, help="Specifies the encoder type to be used for the multi joint condition.") + group.add_argument("--target_enc_layers", default=1, type=int, help="Num target encoder layers") + + + # Prefix completion model + group.add_argument("--context_len", default=0, type=int, help="If larger than 0, will do prefix completion.") + group.add_argument("--pred_len", default=0, type=int, help="If context_len larger than 0, will do prefix completion. If pred_len will not be specified - will use the same length as context_len") + + + + +def add_data_options(parser): + group = parser.add_argument_group('dataset') + group.add_argument("--dataset", default='humanml', choices=['humanml', 'kit', 'humanact12', 'uestc'], type=str, + help="Dataset name (choose from list).") + group.add_argument("--data_dir", default="", type=str, + help="If empty, will use defaults according to the specified dataset.") + + +def add_training_options(parser): + group = parser.add_argument_group('training') + group.add_argument("--save_dir", required=True, type=str, + help="Path to save checkpoints and results.") + group.add_argument("--overwrite", action='store_true', + help="If True, will enable to use an already existing save_dir.") + group.add_argument("--lr", default=1e-4, type=float, help="Learning rate.") + group.add_argument("--weight_decay", default=0.0, type=float, help="Optimizer weight decay.") + group.add_argument("--lr_anneal_steps", default=0, type=int, help="Number of learning rate anneal steps.") + group.add_argument("--eval_batch_size", default=32, type=int, + help="Batch size during evaluation loop. Do not change this unless you know what you are doing. " + "T2m precision calculation is based on fixed batch size 32.") + group.add_argument("--eval_split", default='test', choices=['val', 'test'], type=str, + help="Which split to evaluate on during training.") + group.add_argument("--eval_during_training", action='store_true', + help="If True, will run evaluation during training.") + group.add_argument("--eval_rep_times", default=3, type=int, + help="Number of repetitions for evaluation loop during training.") + group.add_argument("--eval_num_samples", default=1_000, type=int, + help="If -1, will use all samples in the specified split.") + group.add_argument("--log_interval", default=1_000, type=int, + help="Log losses each N steps") + group.add_argument("--save_interval", default=50_000, type=int, + help="Save checkpoints and run evaluation each N steps") + group.add_argument("--num_steps", default=600_000, type=int, + help="Training will stop after the specified number of steps.") + group.add_argument("--num_frames", default=60, type=int, + help="Limit for the maximal number of frames. In HumanML3D and KIT this field is ignored.") + group.add_argument("--resume_checkpoint", default="", type=str, + help="If not empty, will start from the specified checkpoint (path to model###.pt file).") + + group.add_argument("--gen_during_training", action='store_true', + help="If True, will generate motions during training, on each save interval.") + group.add_argument("--gen_num_samples", default=3, type=int, + help="Number of samples to sample while generating") + group.add_argument("--gen_num_repetitions", default=2, type=int, + help="Number of repetitions, per sample (text prompt/action)") + group.add_argument("--gen_guidance_param", default=2.5, type=float, + help="For classifier-free sampling - specifies the s parameter, as defined in the paper.") + + group.add_argument("--avg_model_beta", default=0.9999, type=float, help="Average model beta (for EMA).") + group.add_argument("--adam_beta2", default=0.999, type=float, help="Adam beta2.") + + group.add_argument("--target_joint_names", default='DIMP_FINAL', type=str, help="Force single joint configuration by specifing the joints (coma separated). If None - will use the random mode for all end effectors.") + group.add_argument("--autoregressive", action='store_true', help="If true, and we use a prefix model will generate motions in an autoregressive loop.") + group.add_argument("--autoregressive_include_prefix", action='store_true', help="If true, include the init prefix in the output, otherwise, will drop it.") + group.add_argument("--autoregressive_init", default='data', type=str, choices=['data', 'isaac'], + help="Sets the source of the init frames, either from the dataset or isaac init poses.") + + +def add_sampling_options(parser): + group = parser.add_argument_group('sampling') + group.add_argument("--model_path", required=True, type=str, + help="Path to model####.pt file to be sampled.") + group.add_argument("--output_dir", default='', type=str, + help="Path to results dir (auto created by the script). " + "If empty, will create dir in parallel to checkpoint.") + group.add_argument("--num_samples", default=6, type=int, + help="Maximal number of prompts to sample, " + "if loading dataset from file, this field will be ignored.") + group.add_argument("--num_repetitions", default=3, type=int, + help="Number of repetitions, per sample (text prompt/action)") + group.add_argument("--guidance_param", default=2.5, type=float, + help="For classifier-free sampling - specifies the s parameter, as defined in the paper.") + + group.add_argument("--autoregressive", action='store_true', help="If true, and we use a prefix model will generate motions in an autoregressive loop.") + group.add_argument("--autoregressive_include_prefix", action='store_true', help="If true, include the init prefix in the output, otherwise, will drop it.") + group.add_argument("--autoregressive_init", default='data', type=str, choices=['data', 'isaac'], + help="Sets the source of the init frames, either from the dataset or isaac init poses.") + +def add_generate_options(parser): + group = parser.add_argument_group('generate') + group.add_argument("--motion_length", default=6.0, type=float, + help="The length of the sampled motion [in seconds]. " + "Maximum is 9.8 for HumanML3D (text-to-motion), and 2.0 for HumanAct12 (action-to-motion)") + group.add_argument("--input_text", default='', type=str, + help="Path to a text file lists text prompts to be synthesized. If empty, will take text prompts from dataset.") + group.add_argument("--dynamic_text_path", default='', type=str, + help="For the autoregressive mode only! Path to a text file lists text prompts to be synthesized. If empty, will take text prompts from dataset.") + group.add_argument("--action_file", default='', type=str, + help="Path to a text file that lists names of actions to be synthesized. Names must be a subset of dataset/uestc/info/action_classes.txt if sampling from uestc, " + "or a subset of [warm_up,walk,run,jump,drink,lift_dumbbell,sit,eat,turn steering wheel,phone,boxing,throw] if sampling from humanact12. " + "If no file is specified, will take action names from dataset.") + group.add_argument("--text_prompt", default='', type=str, + help="A text prompt to be generated. If empty, will take text prompts from dataset.") + group.add_argument("--action_name", default='', type=str, + help="An action name to be generated. If empty, will take text prompts from dataset.") + group.add_argument("--target_joint_names", default='DIMP_FINAL', type=str, help="Force single joint configuration by specifing the joints (coma separated). If None - will use the random mode for all end effectors.") + + +def add_edit_options(parser): + group = parser.add_argument_group('edit') + group.add_argument("--edit_mode", default='in_between', choices=['in_between', 'upper_body'], type=str, + help="Defines which parts of the input motion will be edited.\n" + "(1) in_between - suffix and prefix motion taken from input motion, " + "middle motion is generated.\n" + "(2) upper_body - lower body joints taken from input motion, " + "upper body is generated.") + group.add_argument("--text_condition", default='', type=str, + help="Editing will be conditioned on this text prompt. " + "If empty, will perform unconditioned editing.") + group.add_argument("--prefix_end", default=0.25, type=float, + help="For in_between editing - Defines the end of input prefix (ratio from all frames).") + group.add_argument("--suffix_start", default=0.75, type=float, + help="For in_between editing - Defines the start of input suffix (ratio from all frames).") + + +def add_evaluation_options(parser): + group = parser.add_argument_group('eval') + group.add_argument("--model_path", required=True, type=str, + help="Path to model####.pt file to be sampled.") + group.add_argument("--eval_mode", default='wo_mm', choices=['wo_mm', 'mm_short', 'debug', 'full'], type=str, + help="wo_mm (t2m only) - 20 repetitions without multi-modality metric; " + "mm_short (t2m only) - 5 repetitions with multi-modality metric; " + "debug - short run, less accurate results." + "full (a2m only) - 20 repetitions.") + group.add_argument("--autoregressive", action='store_true', help="If true, and we use a prefix model will generate motions in an autoregressive loop.") + group.add_argument("--autoregressive_include_prefix", action='store_true', help="If true, include the init prefix in the output, otherwise, will drop it.") + group.add_argument("--autoregressive_init", default='data', type=str, choices=['data', 'isaac'], + help="Sets the source of the init frames, either from the dataset or isaac init poses.") + group.add_argument("--guidance_param", default=2.5, type=float, + help="For classifier-free sampling - specifies the s parameter, as defined in the paper.") + + +def get_cond_mode(args): + if args.unconstrained: + cond_mode = 'no_cond' + elif args.dataset in ['kit', 'humanml', 'preprocessed_posterior']: + cond_mode = 'text' + else: + cond_mode = 'action' + return cond_mode + + +def train_args(): + parser = ArgumentParser() + add_base_options(parser) + add_data_options(parser) + add_model_options(parser) + add_diffusion_options(parser) + add_training_options(parser) + return apply_rules(parser.parse_args()) + + +def generate_args(): + parser = ArgumentParser() + # args specified by the user: (all other will be loaded from the model) + add_base_options(parser) + add_sampling_options(parser) + add_generate_options(parser) + args = parse_and_load_from_model(parser) + cond_mode = get_cond_mode(args) + + if (args.input_text or args.text_prompt) and cond_mode != 'text': + raise Exception('Arguments input_text and text_prompt should not be used for an action condition. Please use action_file or action_name.') + elif (args.action_file or args.action_name) and cond_mode != 'action': + raise Exception('Arguments action_file and action_name should not be used for a text condition. Please use input_text or text_prompt.') + + return args + + +def edit_args(): + parser = ArgumentParser() + # args specified by the user: (all other will be loaded from the model) + add_base_options(parser) + add_sampling_options(parser) + add_edit_options(parser) + return parse_and_load_from_model(parser) + + +def evaluation_parser(): + parser = ArgumentParser() + # args specified by the user: (all other will be loaded from the model) + add_base_options(parser) + add_evaluation_options(parser) + return parse_and_load_from_model(parser) \ No newline at end of file diff --git a/src/mdm/utils/rotation_conversions.py b/src/mdm/utils/rotation_conversions.py new file mode 100644 index 0000000000000000000000000000000000000000..210ae1f0878b3ab223ec3d51d4053751dceb47ff --- /dev/null +++ b/src/mdm/utils/rotation_conversions.py @@ -0,0 +1,552 @@ +# This code is based on https://github.com/Mathux/ACTOR.git +# Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. +# Check PYTORCH3D_LICENCE before use + +import functools +from typing import Optional + +import torch +import torch.nn.functional as F + + +""" +The transformation matrices returned from the functions in this file assume +the points on which the transformation will be applied are column vectors. +i.e. the R matrix is structured as + + R = [ + [Rxx, Rxy, Rxz], + [Ryx, Ryy, Ryz], + [Rzx, Rzy, Rzz], + ] # (3, 3) + +This matrix can be applied to column vectors by post multiplication +by the points e.g. + + points = [[0], [1], [2]] # (3 x 1) xyz coordinates of a point + transformed_points = R * points + +To apply the same matrix to points which are row vectors, the R matrix +can be transposed and pre multiplied by the points: + +e.g. + points = [[0, 1, 2]] # (1 x 3) xyz coordinates of a point + transformed_points = points * R.transpose(1, 0) +""" + + +def quaternion_to_matrix(quaternions): + """ + Convert rotations given as quaternions to rotation matrices. + + Args: + quaternions: quaternions with real part first, + as tensor of shape (..., 4). + + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + r, i, j, k = torch.unbind(quaternions, -1) + two_s = 2.0 / (quaternions * quaternions).sum(-1) + + o = torch.stack( + ( + 1 - two_s * (j * j + k * k), + two_s * (i * j - k * r), + two_s * (i * k + j * r), + two_s * (i * j + k * r), + 1 - two_s * (i * i + k * k), + two_s * (j * k - i * r), + two_s * (i * k - j * r), + two_s * (j * k + i * r), + 1 - two_s * (i * i + j * j), + ), + -1, + ) + return o.reshape(quaternions.shape[:-1] + (3, 3)) + + +def _copysign(a, b): + """ + Return a tensor where each element has the absolute value taken from the, + corresponding element of a, with sign taken from the corresponding + element of b. This is like the standard copysign floating-point operation, + but is not careful about negative 0 and NaN. + + Args: + a: source tensor. + b: tensor whose signs will be used, of the same shape as a. + + Returns: + Tensor of the same shape as a with the signs of b. + """ + signs_differ = (a < 0) != (b < 0) + return torch.where(signs_differ, -a, a) + + +def _sqrt_positive_part(x): + """ + Returns torch.sqrt(torch.max(0, x)) + but with a zero subgradient where x is 0. + """ + ret = torch.zeros_like(x) + positive_mask = x > 0 + ret[positive_mask] = torch.sqrt(x[positive_mask]) + return ret + + +def matrix_to_quaternion(matrix): + """ + Convert rotations given as rotation matrices to quaternions. + + Args: + matrix: Rotation matrices as tensor of shape (..., 3, 3). + + Returns: + quaternions with real part first, as tensor of shape (..., 4). + """ + if matrix.size(-1) != 3 or matrix.size(-2) != 3: + raise ValueError(f"Invalid rotation matrix shape f{matrix.shape}.") + m00 = matrix[..., 0, 0] + m11 = matrix[..., 1, 1] + m22 = matrix[..., 2, 2] + o0 = 0.5 * _sqrt_positive_part(1 + m00 + m11 + m22) + x = 0.5 * _sqrt_positive_part(1 + m00 - m11 - m22) + y = 0.5 * _sqrt_positive_part(1 - m00 + m11 - m22) + z = 0.5 * _sqrt_positive_part(1 - m00 - m11 + m22) + o1 = _copysign(x, matrix[..., 2, 1] - matrix[..., 1, 2]) + o2 = _copysign(y, matrix[..., 0, 2] - matrix[..., 2, 0]) + o3 = _copysign(z, matrix[..., 1, 0] - matrix[..., 0, 1]) + return torch.stack((o0, o1, o2, o3), -1) + + +def _axis_angle_rotation(axis: str, angle): + """ + Return the rotation matrices for one of the rotations about an axis + of which Euler angles describe, for each value of the angle given. + + Args: + axis: Axis label "X" or "Y or "Z". + angle: any shape tensor of Euler angles in radians + + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + + cos = torch.cos(angle) + sin = torch.sin(angle) + one = torch.ones_like(angle) + zero = torch.zeros_like(angle) + + if axis == "X": + R_flat = (one, zero, zero, zero, cos, -sin, zero, sin, cos) + if axis == "Y": + R_flat = (cos, zero, sin, zero, one, zero, -sin, zero, cos) + if axis == "Z": + R_flat = (cos, -sin, zero, sin, cos, zero, zero, zero, one) + + return torch.stack(R_flat, -1).reshape(angle.shape + (3, 3)) + + +def euler_angles_to_matrix(euler_angles, convention: str): + """ + Convert rotations given as Euler angles in radians to rotation matrices. + + Args: + euler_angles: Euler angles in radians as tensor of shape (..., 3). + convention: Convention string of three uppercase letters from + {"X", "Y", and "Z"}. + + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + if euler_angles.dim() == 0 or euler_angles.shape[-1] != 3: + raise ValueError("Invalid input euler angles.") + if len(convention) != 3: + raise ValueError("Convention must have 3 letters.") + if convention[1] in (convention[0], convention[2]): + raise ValueError(f"Invalid convention {convention}.") + for letter in convention: + if letter not in ("X", "Y", "Z"): + raise ValueError(f"Invalid letter {letter} in convention string.") + matrices = map(_axis_angle_rotation, convention, torch.unbind(euler_angles, -1)) + return functools.reduce(torch.matmul, matrices) + + +def _angle_from_tan( + axis: str, other_axis: str, data, horizontal: bool, tait_bryan: bool +): + """ + Extract the first or third Euler angle from the two members of + the matrix which are positive constant times its sine and cosine. + + Args: + axis: Axis label "X" or "Y or "Z" for the angle we are finding. + other_axis: Axis label "X" or "Y or "Z" for the middle axis in the + convention. + data: Rotation matrices as tensor of shape (..., 3, 3). + horizontal: Whether we are looking for the angle for the third axis, + which means the relevant entries are in the same row of the + rotation matrix. If not, they are in the same column. + tait_bryan: Whether the first and third axes in the convention differ. + + Returns: + Euler Angles in radians for each matrix in dataset as a tensor + of shape (...). + """ + + i1, i2 = {"X": (2, 1), "Y": (0, 2), "Z": (1, 0)}[axis] + if horizontal: + i2, i1 = i1, i2 + even = (axis + other_axis) in ["XY", "YZ", "ZX"] + if horizontal == even: + return torch.atan2(data[..., i1], data[..., i2]) + if tait_bryan: + return torch.atan2(-data[..., i2], data[..., i1]) + return torch.atan2(data[..., i2], -data[..., i1]) + + +def _index_from_letter(letter: str): + if letter == "X": + return 0 + if letter == "Y": + return 1 + if letter == "Z": + return 2 + + +def matrix_to_euler_angles(matrix, convention: str): + """ + Convert rotations given as rotation matrices to Euler angles in radians. + + Args: + matrix: Rotation matrices as tensor of shape (..., 3, 3). + convention: Convention string of three uppercase letters. + + Returns: + Euler angles in radians as tensor of shape (..., 3). + """ + if len(convention) != 3: + raise ValueError("Convention must have 3 letters.") + if convention[1] in (convention[0], convention[2]): + raise ValueError(f"Invalid convention {convention}.") + for letter in convention: + if letter not in ("X", "Y", "Z"): + raise ValueError(f"Invalid letter {letter} in convention string.") + if matrix.size(-1) != 3 or matrix.size(-2) != 3: + raise ValueError(f"Invalid rotation matrix shape f{matrix.shape}.") + i0 = _index_from_letter(convention[0]) + i2 = _index_from_letter(convention[2]) + tait_bryan = i0 != i2 + if tait_bryan: + central_angle = torch.asin( + matrix[..., i0, i2] * (-1.0 if i0 - i2 in [-1, 2] else 1.0) + ) + else: + central_angle = torch.acos(matrix[..., i0, i0]) + + o = ( + _angle_from_tan( + convention[0], convention[1], matrix[..., i2], False, tait_bryan + ), + central_angle, + _angle_from_tan( + convention[2], convention[1], matrix[..., i0, :], True, tait_bryan + ), + ) + return torch.stack(o, -1) + + +def random_quaternions( + n: int, dtype: Optional[torch.dtype] = None, device=None, requires_grad=False +): + """ + Generate random quaternions representing rotations, + i.e. versors with nonnegative real part. + + Args: + n: Number of quaternions in a batch to return. + dtype: Type to return. + device: Desired device of returned tensor. Default: + uses the current device for the default tensor type. + requires_grad: Whether the resulting tensor should have the gradient + flag set. + + Returns: + Quaternions as tensor of shape (N, 4). + """ + o = torch.randn((n, 4), dtype=dtype, device=device, requires_grad=requires_grad) + s = (o * o).sum(1) + o = o / _copysign(torch.sqrt(s), o[:, 0])[:, None] + return o + + +def random_rotations( + n: int, dtype: Optional[torch.dtype] = None, device=None, requires_grad=False +): + """ + Generate random rotations as 3x3 rotation matrices. + + Args: + n: Number of rotation matrices in a batch to return. + dtype: Type to return. + device: Device of returned tensor. Default: if None, + uses the current device for the default tensor type. + requires_grad: Whether the resulting tensor should have the gradient + flag set. + + Returns: + Rotation matrices as tensor of shape (n, 3, 3). + """ + quaternions = random_quaternions( + n, dtype=dtype, device=device, requires_grad=requires_grad + ) + return quaternion_to_matrix(quaternions) + + +def random_rotation( + dtype: Optional[torch.dtype] = None, device=None, requires_grad=False +): + """ + Generate a single random 3x3 rotation matrix. + + Args: + dtype: Type to return + device: Device of returned tensor. Default: if None, + uses the current device for the default tensor type + requires_grad: Whether the resulting tensor should have the gradient + flag set + + Returns: + Rotation matrix as tensor of shape (3, 3). + """ + return random_rotations(1, dtype, device, requires_grad)[0] + + +def standardize_quaternion(quaternions): + """ + Convert a unit quaternion to a standard form: one in which the real + part is non negative. + + Args: + quaternions: Quaternions with real part first, + as tensor of shape (..., 4). + + Returns: + Standardized quaternions as tensor of shape (..., 4). + """ + return torch.where(quaternions[..., 0:1] < 0, -quaternions, quaternions) + + +def quaternion_raw_multiply(a, b): + """ + Multiply two quaternions. + Usual torch rules for broadcasting apply. + + Args: + a: Quaternions as tensor of shape (..., 4), real part first. + b: Quaternions as tensor of shape (..., 4), real part first. + + Returns: + The product of a and b, a tensor of quaternions shape (..., 4). + """ + aw, ax, ay, az = torch.unbind(a, -1) + bw, bx, by, bz = torch.unbind(b, -1) + ow = aw * bw - ax * bx - ay * by - az * bz + ox = aw * bx + ax * bw + ay * bz - az * by + oy = aw * by - ax * bz + ay * bw + az * bx + oz = aw * bz + ax * by - ay * bx + az * bw + return torch.stack((ow, ox, oy, oz), -1) + + +def quaternion_multiply(a, b): + """ + Multiply two quaternions representing rotations, returning the quaternion + representing their composition, i.e. the versor with nonnegative real part. + Usual torch rules for broadcasting apply. + + Args: + a: Quaternions as tensor of shape (..., 4), real part first. + b: Quaternions as tensor of shape (..., 4), real part first. + + Returns: + The product of a and b, a tensor of quaternions of shape (..., 4). + """ + ab = quaternion_raw_multiply(a, b) + return standardize_quaternion(ab) + + +def quaternion_invert(quaternion): + """ + Given a quaternion representing rotation, get the quaternion representing + its inverse. + + Args: + quaternion: Quaternions as tensor of shape (..., 4), with real part + first, which must be versors (unit quaternions). + + Returns: + The inverse, a tensor of quaternions of shape (..., 4). + """ + + return quaternion * quaternion.new_tensor([1, -1, -1, -1]) + + +def quaternion_apply(quaternion, point): + """ + Apply the rotation given by a quaternion to a 3D point. + Usual torch rules for broadcasting apply. + + Args: + quaternion: Tensor of quaternions, real part first, of shape (..., 4). + point: Tensor of 3D points of shape (..., 3). + + Returns: + Tensor of rotated points of shape (..., 3). + """ + if point.size(-1) != 3: + raise ValueError(f"Points are not in 3D, f{point.shape}.") + real_parts = point.new_zeros(point.shape[:-1] + (1,)) + point_as_quaternion = torch.cat((real_parts, point), -1) + out = quaternion_raw_multiply( + quaternion_raw_multiply(quaternion, point_as_quaternion), + quaternion_invert(quaternion), + ) + return out[..., 1:] + + +def axis_angle_to_matrix(axis_angle): + """ + Convert rotations given as axis/angle to rotation matrices. + + Args: + axis_angle: Rotations given as a vector in axis angle form, + as a tensor of shape (..., 3), where the magnitude is + the angle turned anticlockwise in radians around the + vector's direction. + + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + return quaternion_to_matrix(axis_angle_to_quaternion(axis_angle)) + + +def matrix_to_axis_angle(matrix): + """ + Convert rotations given as rotation matrices to axis/angle. + + Args: + matrix: Rotation matrices as tensor of shape (..., 3, 3). + + Returns: + Rotations given as a vector in axis angle form, as a tensor + of shape (..., 3), where the magnitude is the angle + turned anticlockwise in radians around the vector's + direction. + """ + return quaternion_to_axis_angle(matrix_to_quaternion(matrix)) + + +def axis_angle_to_quaternion(axis_angle): + """ + Convert rotations given as axis/angle to quaternions. + + Args: + axis_angle: Rotations given as a vector in axis angle form, + as a tensor of shape (..., 3), where the magnitude is + the angle turned anticlockwise in radians around the + vector's direction. + + Returns: + quaternions with real part first, as tensor of shape (..., 4). + """ + angles = torch.norm(axis_angle, p=2, dim=-1, keepdim=True) + half_angles = 0.5 * angles + eps = 1e-6 + small_angles = angles.abs() < eps + sin_half_angles_over_angles = torch.empty_like(angles) + sin_half_angles_over_angles[~small_angles] = ( + torch.sin(half_angles[~small_angles]) / angles[~small_angles] + ) + # for x small, sin(x/2) is about x/2 - (x/2)^3/6 + # so sin(x/2)/x is about 1/2 - (x*x)/48 + sin_half_angles_over_angles[small_angles] = ( + 0.5 - (angles[small_angles] * angles[small_angles]) / 48 + ) + quaternions = torch.cat( + [torch.cos(half_angles), axis_angle * sin_half_angles_over_angles], dim=-1 + ) + return quaternions + + +def quaternion_to_axis_angle(quaternions): + """ + Convert rotations given as quaternions to axis/angle. + + Args: + quaternions: quaternions with real part first, + as tensor of shape (..., 4). + + Returns: + Rotations given as a vector in axis angle form, as a tensor + of shape (..., 3), where the magnitude is the angle + turned anticlockwise in radians around the vector's + direction. + """ + norms = torch.norm(quaternions[..., 1:], p=2, dim=-1, keepdim=True) + half_angles = torch.atan2(norms, quaternions[..., :1]) + angles = 2 * half_angles + eps = 1e-6 + small_angles = angles.abs() < eps + sin_half_angles_over_angles = torch.empty_like(angles) + sin_half_angles_over_angles[~small_angles] = ( + torch.sin(half_angles[~small_angles]) / angles[~small_angles] + ) + # for x small, sin(x/2) is about x/2 - (x/2)^3/6 + # so sin(x/2)/x is about 1/2 - (x*x)/48 + sin_half_angles_over_angles[small_angles] = ( + 0.5 - (angles[small_angles] * angles[small_angles]) / 48 + ) + return quaternions[..., 1:] / sin_half_angles_over_angles + + +def rotation_6d_to_matrix(d6: torch.Tensor) -> torch.Tensor: + """ + Converts 6D rotation representation by Zhou et al. [1] to rotation matrix + using Gram--Schmidt orthogonalisation per Section B of [1]. + Args: + d6: 6D rotation representation, of size (*, 6) + + Returns: + batch of rotation matrices of size (*, 3, 3) + + [1] Zhou, Y., Barnes, C., Lu, J., Yang, J., & Li, H. + On the Continuity of Rotation Representations in Neural Networks. + IEEE Conference on Computer Vision and Pattern Recognition, 2019. + Retrieved from http://arxiv.org/abs/1812.07035 + """ + + a1, a2 = d6[..., :3], d6[..., 3:] + b1 = F.normalize(a1, dim=-1) + b2 = a2 - (b1 * a2).sum(-1, keepdim=True) * b1 + b2 = F.normalize(b2, dim=-1) + b3 = torch.cross(b1, b2, dim=-1) + return torch.stack((b1, b2, b3), dim=-2) + + +def matrix_to_rotation_6d(matrix: torch.Tensor) -> torch.Tensor: + """ + Converts rotation matrices to 6D rotation representation by Zhou et al. [1] + by dropping the last row. Note that 6D representation is not unique. + Args: + matrix: batch of rotation matrices of size (*, 3, 3) + + Returns: + 6D rotation representation, of size (*, 6) + + [1] Zhou, Y., Barnes, C., Lu, J., Yang, J., & Li, H. + On the Continuity of Rotation Representations in Neural Networks. + IEEE Conference on Computer Vision and Pattern Recognition, 2019. + Retrieved from http://arxiv.org/abs/1812.07035 + """ + return matrix[..., :2, :].clone().reshape(*matrix.size()[:-2], 6) diff --git a/src/mdm/utils/sampler_util.py b/src/mdm/utils/sampler_util.py new file mode 100644 index 0000000000000000000000000000000000000000..cf757e1ea9abc2aa55841482c89a216b5c2dab3f --- /dev/null +++ b/src/mdm/utils/sampler_util.py @@ -0,0 +1,81 @@ +import numpy as np +import torch +import torch.nn as nn +from copy import deepcopy +from utils.misc import wrapped_getattr +import joblib + +# A wrapper model for Classifier-free guidance **SAMPLING** only +# https://arxiv.org/abs/2207.12598 +class ClassifierFreeSampleModel(nn.Module): + + def __init__(self, model): + super().__init__() + self.model = model # model is the actual model to run + + assert self.model.cond_mask_prob > 0, 'Cannot run a guided diffusion on a model that has not been trained with no conditions' + + # pointers to inner model + self.rot2xyz = getattr(self.model, 'rot2xyz', None) + self.translation = self.model.translation + self.njoints = self.model.njoints + self.nfeats = self.model.nfeats + self.data_rep = self.model.data_rep + self.cond_mode = self.model.cond_mode + self.encode_text = self.model.encode_text + + def forward(self, x, timesteps, y=None): + cond_mode = self.model.cond_mode + assert cond_mode in ['text', 'action'] + y_uncond = deepcopy(y) + y_uncond['uncond'] = True + out = self.model(x, timesteps, y) + out_uncond = self.model(x, timesteps, y_uncond) + return out_uncond + (y['scale'].view(-1, 1, 1, 1) * (out - out_uncond)) + + def __getattr__(self, name, default=None): + # this method is reached only if name is not in self.__dict__. + return wrapped_getattr(self, name, default=None) + + +class AutoRegressiveSampler(): + def __init__(self, args, sample_fn, required_frames=196): + self.sample_fn = sample_fn + self.args = args + self.required_frames = required_frames + + def sample(self, model, shape, **kargs): + bs = shape[0] + n_iterations = (self.required_frames // self.args.pred_len) + int(self.required_frames % self.args.pred_len > 0) + samples_buf = [] + cur_prefix = deepcopy(kargs['model_kwargs']['y']['prefix']) # init with data + dynamic_text_mode = type(kargs['model_kwargs']['y']['text'][0]) == list # Text changes on the fly - prompt per prediction is provided as a list (instead of a single prompt) + if self.args.autoregressive_include_prefix: + samples_buf.append(cur_prefix) + autoregressive_shape = list(deepcopy(shape)) + autoregressive_shape[-1] = self.args.pred_len + + # Autoregressive sampling + for i in range(n_iterations): + + # Build the current kargs + cur_kargs = deepcopy(kargs) + cur_kargs['model_kwargs']['y']['prefix'] = cur_prefix + if dynamic_text_mode: + cur_kargs['model_kwargs']['y']['text'] = [s[i] for s in kargs['model_kwargs']['y']['text']] + if model.text_encoder_type == 'bert': + cur_kargs['model_kwargs']['y']['text_embed'] = (cur_kargs['model_kwargs']['y']['text_embed'][0][:, :, i], cur_kargs['model_kwargs']['y']['text_embed'][1][:, i]) + else: + raise NotImplementedError('DiP model only supports BERT text encoder at the moment. If you implement this, please send a PR!') + + # Sample the next prediction + sample = self.sample_fn(model, autoregressive_shape, **cur_kargs) + + # Buffer the sample + samples_buf.append(sample.clone()[..., -self.args.pred_len:]) + + # Update the prefix + cur_prefix = sample.clone()[..., -self.args.context_len:] + + full_batch = torch.cat(samples_buf, dim=-1)[..., :self.required_frames] # 200 -> 196 + return full_batch \ No newline at end of file diff --git a/src/mdm/visualize/joints2smpl/README.md b/src/mdm/visualize/joints2smpl/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c20c257a6eb8bc799abbd14d82ad9f435331af3a --- /dev/null +++ b/src/mdm/visualize/joints2smpl/README.md @@ -0,0 +1,52 @@ +# joints2smpl +fit SMPL model using 3D joints + +## Prerequisites +We have tested the code on Ubuntu 18.04/20.04 with CUDA 10.2/11.3 + +## Installation +First you have to make sure that you have all dependencies in place. +The simplest way to do is to use the [anaconda](https://www.anaconda.com/). + +You can create an anaconda environment called `fit3d` using +``` +conda env create -f environment.yaml +conda activate fit3d +``` + +## Download SMPL models +Download [SMPL Female and Male](https://smpl.is.tue.mpg.de/) and [SMPL Netural](https://smplify.is.tue.mpg.de/), and rename the files and extract them to `/smpl_models/smpl/`, eventually, the `/smpl_models` folder should have the following structure: + ``` + smpl_models + └-- smpl + └-- SMPL_FEMALE.pkl + └-- SMPL_MALE.pkl + └-- SMPL_NEUTRAL.pkl + ``` + +## Demo +### Demo for sequences +python fit_seq.py --files test_motion2.npy + +The results will locate in ./demo/demo_results/ + +## Citation +If you find this project useful for your research, please consider citing: +``` +@article{zuo2021sparsefusion, + title={Sparsefusion: Dynamic human avatar modeling from sparse rgbd images}, + author={Zuo, Xinxin and Wang, Sen and Zheng, Jiangbin and Yu, Weiwei and Gong, Minglun and Yang, Ruigang and Cheng, Li}, + journal={IEEE Transactions on Multimedia}, + volume={23}, + pages={1617--1629}, + year={2021} +} +``` + +## References +We indicate if a function or script is borrowed externally inside each file. Here are some great resources we +benefit: + +- Shape/Pose prior and some functions are borrowed from [VIBE](https://github.com/mkocabas/VIBE). +- SMPL models and layer is from [SMPL-X model](https://github.com/vchoutas/smplx). +- Some functions are borrowed from [HMR-pytorch](https://github.com/MandyMo/pytorch_HMR). diff --git a/src/mdm/visualize/joints2smpl/environment.yaml b/src/mdm/visualize/joints2smpl/environment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..28d0498a9d944cd60bffa6e38c8063d6b6cee7f3 --- /dev/null +++ b/src/mdm/visualize/joints2smpl/environment.yaml @@ -0,0 +1,30 @@ +name: fit3d +channels: + - conda-forge + - pytorch + - defaults + - pytorch3d + - open3d-admin + - anaconda +dependencies: + - pip=21.1.3 + - numpy=1.20.3 + - numpy-base=1.20.3 + - matplotlib=3.4.2 + - matplotlib-base=3.4.2 + - pandas=1.3.1 + - python=3.7.6 + - pytorch=1.7.1 + - tensorboardx=2.2 + - cudatoolkit=10.2.89 + - torchvision=0.8.2 + - einops=0.3.0 + - pytorch3d=0.4.0 + - tqdm=4.61.2 + - trimesh=3.9.24 + - joblib=1.0.1 + - open3d=0.13.0 + - pip: + - h5py==2.9.0 + - chumpy==0.70 + - smplx==0.1.28 diff --git a/src/mdm/visualize/joints2smpl/fit_seq.py b/src/mdm/visualize/joints2smpl/fit_seq.py new file mode 100644 index 0000000000000000000000000000000000000000..5191ff4de688bc49770c3d8234ebeb6e25b55817 --- /dev/null +++ b/src/mdm/visualize/joints2smpl/fit_seq.py @@ -0,0 +1,132 @@ +from __future__ import print_function, division +import argparse +import torch +import os,sys +from os import walk, listdir +from os.path import isfile, join +import numpy as np +import joblib +import smplx +import trimesh +import h5py +from tqdm import tqdm + +sys.path.append(os.path.join(os.path.dirname(__file__), "src")) +from smplify import SMPLify3D +import config + +# parsing argmument +parser = argparse.ArgumentParser() +parser.add_argument('--batchSize', type=int, default=1, + help='input batch size') +parser.add_argument('--num_smplify_iters', type=int, default=100, + help='num of smplify iters') +parser.add_argument('--cuda', type=bool, default=False, + help='enables cuda') +parser.add_argument('--gpu_ids', type=int, default=0, + help='choose gpu ids') +parser.add_argument('--num_joints', type=int, default=22, + help='joint number') +parser.add_argument('--joint_category', type=str, default="AMASS", + help='use correspondence') +parser.add_argument('--fix_foot', type=str, default="False", + help='fix foot or not') +parser.add_argument('--data_folder', type=str, default="./demo/demo_data/", + help='data in the folder') +parser.add_argument('--save_folder', type=str, default="./demo/demo_results/", + help='results save folder') +parser.add_argument('--files', type=str, default="test_motion.npy", + help='files use') +opt = parser.parse_args() +print(opt) + +# ---load predefined something +device = torch.device("cuda:" + str(opt.gpu_ids) if opt.cuda else "cpu") +print(config.SMPL_MODEL_DIR) +smplmodel = smplx.create(config.SMPL_MODEL_DIR, + model_type="smpl", gender="neutral", ext="pkl", + batch_size=opt.batchSize).to(device) + +# ## --- load the mean pose as original ---- +smpl_mean_file = config.SMPL_MEAN_FILE + +file = h5py.File(smpl_mean_file, 'r') +init_mean_pose = torch.from_numpy(file['pose'][:]).unsqueeze(0).float() +init_mean_shape = torch.from_numpy(file['shape'][:]).unsqueeze(0).float() +cam_trans_zero = torch.Tensor([0.0, 0.0, 0.0]).to(device) +# +pred_pose = torch.zeros(opt.batchSize, 72).to(device) +pred_betas = torch.zeros(opt.batchSize, 10).to(device) +pred_cam_t = torch.zeros(opt.batchSize, 3).to(device) +keypoints_3d = torch.zeros(opt.batchSize, opt.num_joints, 3).to(device) + +# # #-------------initialize SMPLify +smplify = SMPLify3D(smplxmodel=smplmodel, + batch_size=opt.batchSize, + joints_category=opt.joint_category, + num_iters=opt.num_smplify_iters, + device=device) +#print("initialize SMPLify3D done!") + + +purename = os.path.splitext(opt.files)[0] +# --- load data --- +data = np.load(opt.data_folder + "/" + purename + ".npy") # [nframes, njoints, 3] + +dir_save = os.path.join(opt.save_folder, purename) +if not os.path.isdir(dir_save): + os.makedirs(dir_save, exist_ok=True) + +# run the whole seqs +num_seqs = data.shape[0] + +for idx in tqdm(range(num_seqs)): + #print(idx) + + joints3d = data[idx] #*1.2 #scale problem [check first] + keypoints_3d[0, :, :] = torch.Tensor(joints3d).to(device).float() + + if idx == 0: + pred_betas[0, :] = init_mean_shape + pred_pose[0, :] = init_mean_pose + pred_cam_t[0, :] = cam_trans_zero + else: + data_param = joblib.load(dir_save + "/" + "%04d"%(idx-1) + ".pkl") + pred_betas[0, :] = torch.from_numpy(data_param['beta']).unsqueeze(0).float() + pred_pose[0, :] = torch.from_numpy(data_param['pose']).unsqueeze(0).float() + pred_cam_t[0, :] = torch.from_numpy(data_param['cam']).unsqueeze(0).float() + + if opt.joint_category =="AMASS": + confidence_input = torch.ones(opt.num_joints) + # make sure the foot and ankle + if opt.fix_foot == True: + confidence_input[7] = 1.5 + confidence_input[8] = 1.5 + confidence_input[10] = 1.5 + confidence_input[11] = 1.5 + else: + print("Such category not settle down!") + + # ----- from initial to fitting ------- + new_opt_vertices, new_opt_joints, new_opt_pose, new_opt_betas, \ + new_opt_cam_t, new_opt_joint_loss = smplify( + pred_pose.detach(), + pred_betas.detach(), + pred_cam_t.detach(), + keypoints_3d, + conf_3d=confidence_input.to(device), + seq_ind=idx + ) + + # # -- save the results to ply--- + outputp = smplmodel(betas=new_opt_betas, global_orient=new_opt_pose[:, :3], body_pose=new_opt_pose[:, 3:], + transl=new_opt_cam_t, return_verts=True) + mesh_p = trimesh.Trimesh(vertices=outputp.vertices.detach().cpu().numpy().squeeze(), faces=smplmodel.faces, process=False) + mesh_p.export(dir_save + "/" + "%04d"%idx + ".ply") + + # save the pkl + param = {} + param['beta'] = new_opt_betas.detach().cpu().numpy() + param['pose'] = new_opt_pose.detach().cpu().numpy() + param['cam'] = new_opt_cam_t.detach().cpu().numpy() + joblib.dump(param, dir_save + "/" + "%04d"%idx + ".pkl", compress=3) diff --git a/src/mdm/visualize/joints2smpl/smpl_models/SMPL_downsample_index.pkl b/src/mdm/visualize/joints2smpl/smpl_models/SMPL_downsample_index.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7bb54c4f1e03340ad58b60485abaed1641d68d47 --- /dev/null +++ b/src/mdm/visualize/joints2smpl/smpl_models/SMPL_downsample_index.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5b783c1677079397ee4bc26df5c72d73b8bb393bea41fa295b951187443daec +size 3556 diff --git a/src/mdm/visualize/joints2smpl/smpl_models/gmm_08.pkl b/src/mdm/visualize/joints2smpl/smpl_models/gmm_08.pkl new file mode 100644 index 0000000000000000000000000000000000000000..c97a1d7ef396581e56ce74a12cc39175680ce028 --- /dev/null +++ b/src/mdm/visualize/joints2smpl/smpl_models/gmm_08.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1374908aae055a2afa01a2cd9a169bc6cfec1ceb7aa590e201a47b383060491 +size 839127 diff --git a/src/mdm/visualize/joints2smpl/smpl_models/neutral_smpl_mean_params.h5 b/src/mdm/visualize/joints2smpl/smpl_models/neutral_smpl_mean_params.h5 new file mode 100644 index 0000000000000000000000000000000000000000..b6ecce2a748128cfde09b219ccc74307de50bbae --- /dev/null +++ b/src/mdm/visualize/joints2smpl/smpl_models/neutral_smpl_mean_params.h5 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac9b474c74daec0253ed084720f662059336e976850f08a4a9a3f76d06613776 +size 4848 diff --git a/src/mdm/visualize/joints2smpl/smpl_models/smplx_parts_segm.pkl b/src/mdm/visualize/joints2smpl/smpl_models/smplx_parts_segm.pkl new file mode 100644 index 0000000000000000000000000000000000000000..77ce98631741ba3887d689077baf35422d39299d --- /dev/null +++ b/src/mdm/visualize/joints2smpl/smpl_models/smplx_parts_segm.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb69c10801205c9cfb5353fdeb1b9cc5ade53d14c265c3339421cdde8b9c91e7 +size 1323168 diff --git a/src/mdm/visualize/joints2smpl/src/config.py b/src/mdm/visualize/joints2smpl/src/config.py new file mode 100644 index 0000000000000000000000000000000000000000..1021115a53f19974fbea3d3768c25874a4ae5d38 --- /dev/null +++ b/src/mdm/visualize/joints2smpl/src/config.py @@ -0,0 +1,40 @@ +import numpy as np + +# Map joints Name to SMPL joints idx +JOINT_MAP = { +'MidHip': 0, +'LHip': 1, 'LKnee': 4, 'LAnkle': 7, 'LFoot': 10, +'RHip': 2, 'RKnee': 5, 'RAnkle': 8, 'RFoot': 11, +'LShoulder': 16, 'LElbow': 18, 'LWrist': 20, 'LHand': 22, +'RShoulder': 17, 'RElbow': 19, 'RWrist': 21, 'RHand': 23, +'spine1': 3, 'spine2': 6, 'spine3': 9, 'Neck': 12, 'Head': 15, +'LCollar':13, 'Rcollar' :14, +'Nose':24, 'REye':26, 'LEye':26, 'REar':27, 'LEar':28, +'LHeel': 31, 'RHeel': 34, +'OP RShoulder': 17, 'OP LShoulder': 16, +'OP RHip': 2, 'OP LHip': 1, +'OP Neck': 12, +} + +full_smpl_idx = range(24) +key_smpl_idx = [0, 1, 4, 7, 2, 5, 8, 17, 19, 21, 16, 18, 20] + + +AMASS_JOINT_MAP = { +'MidHip': 0, +'LHip': 1, 'LKnee': 4, 'LAnkle': 7, 'LFoot': 10, +'RHip': 2, 'RKnee': 5, 'RAnkle': 8, 'RFoot': 11, +'LShoulder': 16, 'LElbow': 18, 'LWrist': 20, +'RShoulder': 17, 'RElbow': 19, 'RWrist': 21, +'spine1': 3, 'spine2': 6, 'spine3': 9, 'Neck': 12, 'Head': 15, +'LCollar':13, 'Rcollar' :14, +} +amass_idx = range(22) +amass_smpl_idx = range(22) + + +SMPL_MODEL_DIR = "./body_models/" +GMM_MODEL_DIR = "./visualize/joints2smpl/smpl_models/" +SMPL_MEAN_FILE = "./visualize/joints2smpl/smpl_models/neutral_smpl_mean_params.h5" +# for collsion +Part_Seg_DIR = "./visualize/joints2smpl/smpl_models/smplx_parts_segm.pkl" \ No newline at end of file diff --git a/src/mdm/visualize/joints2smpl/src/customloss.py b/src/mdm/visualize/joints2smpl/src/customloss.py new file mode 100644 index 0000000000000000000000000000000000000000..880ab4861c58cec9faeb086e430fde7387c5cc9e --- /dev/null +++ b/src/mdm/visualize/joints2smpl/src/customloss.py @@ -0,0 +1,222 @@ +import torch +import torch.nn.functional as F +from visualize.joints2smpl.src import config + +# Guassian +def gmof(x, sigma): + """ + Geman-McClure error function + """ + x_squared = x ** 2 + sigma_squared = sigma ** 2 + return (sigma_squared * x_squared) / (sigma_squared + x_squared) + +# angle prior +def angle_prior(pose): + """ + Angle prior that penalizes unnatural bending of the knees and elbows + """ + # We subtract 3 because pose does not include the global rotation of the model + return torch.exp( + pose[:, [55 - 3, 58 - 3, 12 - 3, 15 - 3]] * torch.tensor([1., -1., -1, -1.], device=pose.device)) ** 2 + + +def perspective_projection(points, rotation, translation, + focal_length, camera_center): + """ + This function computes the perspective projection of a set of points. + Input: + points (bs, N, 3): 3D points + rotation (bs, 3, 3): Camera rotation + translation (bs, 3): Camera translation + focal_length (bs,) or scalar: Focal length + camera_center (bs, 2): Camera center + """ + batch_size = points.shape[0] + K = torch.zeros([batch_size, 3, 3], device=points.device) + K[:, 0, 0] = focal_length + K[:, 1, 1] = focal_length + K[:, 2, 2] = 1. + K[:, :-1, -1] = camera_center + + # Transform points + points = torch.einsum('bij,bkj->bki', rotation, points) + points = points + translation.unsqueeze(1) + + # Apply perspective distortion + projected_points = points / points[:, :, -1].unsqueeze(-1) + + # Apply camera intrinsics + projected_points = torch.einsum('bij,bkj->bki', K, projected_points) + + return projected_points[:, :, :-1] + + +def body_fitting_loss(body_pose, betas, model_joints, camera_t, camera_center, + joints_2d, joints_conf, pose_prior, + focal_length=5000, sigma=100, pose_prior_weight=4.78, + shape_prior_weight=5, angle_prior_weight=15.2, + output='sum'): + """ + Loss function for body fitting + """ + batch_size = body_pose.shape[0] + rotation = torch.eye(3, device=body_pose.device).unsqueeze(0).expand(batch_size, -1, -1) + + projected_joints = perspective_projection(model_joints, rotation, camera_t, + focal_length, camera_center) + + # Weighted robust reprojection error + reprojection_error = gmof(projected_joints - joints_2d, sigma) + reprojection_loss = (joints_conf ** 2) * reprojection_error.sum(dim=-1) + + # Pose prior loss + pose_prior_loss = (pose_prior_weight ** 2) * pose_prior(body_pose, betas) + + # Angle prior for knees and elbows + angle_prior_loss = (angle_prior_weight ** 2) * angle_prior(body_pose).sum(dim=-1) + + # Regularizer to prevent betas from taking large values + shape_prior_loss = (shape_prior_weight ** 2) * (betas ** 2).sum(dim=-1) + + total_loss = reprojection_loss.sum(dim=-1) + pose_prior_loss + angle_prior_loss + shape_prior_loss + + if output == 'sum': + return total_loss.sum() + elif output == 'reprojection': + return reprojection_loss + + +# --- get camera fitting loss ----- +def camera_fitting_loss(model_joints, camera_t, camera_t_est, camera_center, + joints_2d, joints_conf, + focal_length=5000, depth_loss_weight=100): + """ + Loss function for camera optimization. + """ + # Project model joints + batch_size = model_joints.shape[0] + rotation = torch.eye(3, device=model_joints.device).unsqueeze(0).expand(batch_size, -1, -1) + projected_joints = perspective_projection(model_joints, rotation, camera_t, + focal_length, camera_center) + + # get the indexed four + op_joints = ['OP RHip', 'OP LHip', 'OP RShoulder', 'OP LShoulder'] + op_joints_ind = [config.JOINT_MAP[joint] for joint in op_joints] + gt_joints = ['RHip', 'LHip', 'RShoulder', 'LShoulder'] + gt_joints_ind = [config.JOINT_MAP[joint] for joint in gt_joints] + + reprojection_error_op = (joints_2d[:, op_joints_ind] - + projected_joints[:, op_joints_ind]) ** 2 + reprojection_error_gt = (joints_2d[:, gt_joints_ind] - + projected_joints[:, gt_joints_ind]) ** 2 + + # Check if for each example in the batch all 4 OpenPose detections are valid, otherwise use the GT detections + # OpenPose joints are more reliable for this task, so we prefer to use them if possible + is_valid = (joints_conf[:, op_joints_ind].min(dim=-1)[0][:, None, None] > 0).float() + reprojection_loss = (is_valid * reprojection_error_op + (1 - is_valid) * reprojection_error_gt).sum(dim=(1, 2)) + + # Loss that penalizes deviation from depth estimate + depth_loss = (depth_loss_weight ** 2) * (camera_t[:, 2] - camera_t_est[:, 2]) ** 2 + + total_loss = reprojection_loss + depth_loss + return total_loss.sum() + + + + # #####--- body fitiing loss ----- +def body_fitting_loss_3d(body_pose, preserve_pose, + betas, model_joints, camera_translation, + j3d, pose_prior, + joints3d_conf, + sigma=100, pose_prior_weight=4.78*1.5, + shape_prior_weight=5.0, angle_prior_weight=15.2, + joint_loss_weight=500.0, + pose_preserve_weight=0.0, + use_collision=False, + model_vertices=None, model_faces=None, + search_tree=None, pen_distance=None, filter_faces=None, + collision_loss_weight=1000 + ): + """ + Loss function for body fitting + """ + batch_size = body_pose.shape[0] + + #joint3d_loss = (joint_loss_weight ** 2) * gmof((model_joints + camera_translation) - j3d, sigma).sum(dim=-1) + + joint3d_error = gmof((model_joints + camera_translation) - j3d, sigma) + + joint3d_loss_part = (joints3d_conf ** 2) * joint3d_error.sum(dim=-1) + joint3d_loss = ((joint_loss_weight ** 2) * joint3d_loss_part).sum(dim=-1) + + # Pose prior loss + pose_prior_loss = (pose_prior_weight ** 2) * pose_prior(body_pose, betas) + # Angle prior for knees and elbows + angle_prior_loss = (angle_prior_weight ** 2) * angle_prior(body_pose).sum(dim=-1) + # Regularizer to prevent betas from taking large values + shape_prior_loss = (shape_prior_weight ** 2) * (betas ** 2).sum(dim=-1) + + collision_loss = 0.0 + # Calculate the loss due to interpenetration + if use_collision: + triangles = torch.index_select( + model_vertices, 1, + model_faces).view(batch_size, -1, 3, 3) + + with torch.no_grad(): + collision_idxs = search_tree(triangles) + + # Remove unwanted collisions + if filter_faces is not None: + collision_idxs = filter_faces(collision_idxs) + + if collision_idxs.ge(0).sum().item() > 0: + collision_loss = torch.sum(collision_loss_weight * pen_distance(triangles, collision_idxs)) + + pose_preserve_loss = (pose_preserve_weight ** 2) * ((body_pose - preserve_pose) ** 2).sum(dim=-1) + + # print('joint3d_loss', joint3d_loss.shape) + # print('pose_prior_loss', pose_prior_loss.shape) + # print('angle_prior_loss', angle_prior_loss.shape) + # print('shape_prior_loss', shape_prior_loss.shape) + # print('collision_loss', collision_loss) + # print('pose_preserve_loss', pose_preserve_loss.shape) + + total_loss = joint3d_loss + pose_prior_loss + angle_prior_loss + shape_prior_loss + collision_loss + pose_preserve_loss + + return total_loss.sum() + + +# #####--- get camera fitting loss ----- +def camera_fitting_loss_3d(model_joints, camera_t, camera_t_est, + j3d, joints_category="orig", depth_loss_weight=100.0): + """ + Loss function for camera optimization. + """ + model_joints = model_joints + camera_t + # # get the indexed four + # op_joints = ['OP RHip', 'OP LHip', 'OP RShoulder', 'OP LShoulder'] + # op_joints_ind = [config.JOINT_MAP[joint] for joint in op_joints] + # + # j3d_error_loss = (j3d[:, op_joints_ind] - + # model_joints[:, op_joints_ind]) ** 2 + + gt_joints = ['RHip', 'LHip', 'RShoulder', 'LShoulder'] + gt_joints_ind = [config.JOINT_MAP[joint] for joint in gt_joints] + + if joints_category=="orig": + select_joints_ind = [config.JOINT_MAP[joint] for joint in gt_joints] + elif joints_category=="AMASS": + select_joints_ind = [config.AMASS_JOINT_MAP[joint] for joint in gt_joints] + else: + print("NO SUCH JOINTS CATEGORY!") + + j3d_error_loss = (j3d[:, select_joints_ind] - + model_joints[:, gt_joints_ind]) ** 2 + + # Loss that penalizes deviation from depth estimate + depth_loss = (depth_loss_weight**2) * (camera_t - camera_t_est)**2 + + total_loss = j3d_error_loss + depth_loss + return total_loss.sum() diff --git a/src/mdm/visualize/joints2smpl/src/prior.py b/src/mdm/visualize/joints2smpl/src/prior.py new file mode 100644 index 0000000000000000000000000000000000000000..7f13806dd1f6607507b0c7e5ad463b3fb0026be8 --- /dev/null +++ b/src/mdm/visualize/joints2smpl/src/prior.py @@ -0,0 +1,230 @@ +# -*- coding: utf-8 -*- + +# Max-Planck-Gesellschaft zur Förderung der Wissenschaften e.V. (MPG) is +# holder of all proprietary rights on this computer program. +# You can only use this computer program if you have closed +# a license agreement with MPG or you get the right to use the computer +# program from someone who is authorized to grant you that right. +# Any use of the computer program without a valid license is prohibited and +# liable to prosecution. +# +# Copyright©2019 Max-Planck-Gesellschaft zur Förderung +# der Wissenschaften e.V. (MPG). acting on behalf of its Max Planck Institute +# for Intelligent Systems. All rights reserved. +# +# Contact: ps-license@tuebingen.mpg.de + +from __future__ import absolute_import +from __future__ import print_function +from __future__ import division + +import sys +import os + +import time +import pickle + +import numpy as np + +import torch +import torch.nn as nn + +DEFAULT_DTYPE = torch.float32 + + +def create_prior(prior_type, **kwargs): + if prior_type == 'gmm': + prior = MaxMixturePrior(**kwargs) + elif prior_type == 'l2': + return L2Prior(**kwargs) + elif prior_type == 'angle': + return SMPLifyAnglePrior(**kwargs) + elif prior_type == 'none' or prior_type is None: + # Don't use any pose prior + def no_prior(*args, **kwargs): + return 0.0 + prior = no_prior + else: + raise ValueError('Prior {}'.format(prior_type) + ' is not implemented') + return prior + + +class SMPLifyAnglePrior(nn.Module): + def __init__(self, dtype=torch.float32, **kwargs): + super(SMPLifyAnglePrior, self).__init__() + + # Indices for the roration angle of + # 55: left elbow, 90deg bend at -np.pi/2 + # 58: right elbow, 90deg bend at np.pi/2 + # 12: left knee, 90deg bend at np.pi/2 + # 15: right knee, 90deg bend at np.pi/2 + angle_prior_idxs = np.array([55, 58, 12, 15], dtype=np.int64) + angle_prior_idxs = torch.tensor(angle_prior_idxs, dtype=torch.long) + self.register_buffer('angle_prior_idxs', angle_prior_idxs) + + angle_prior_signs = np.array([1, -1, -1, -1], + dtype=np.float32 if dtype == torch.float32 + else np.float64) + angle_prior_signs = torch.tensor(angle_prior_signs, + dtype=dtype) + self.register_buffer('angle_prior_signs', angle_prior_signs) + + def forward(self, pose, with_global_pose=False): + ''' Returns the angle prior loss for the given pose + + Args: + pose: (Bx[23 + 1] * 3) torch tensor with the axis-angle + representation of the rotations of the joints of the SMPL model. + Kwargs: + with_global_pose: Whether the pose vector also contains the global + orientation of the SMPL model. If not then the indices must be + corrected. + Returns: + A sze (B) tensor containing the angle prior loss for each element + in the batch. + ''' + angle_prior_idxs = self.angle_prior_idxs - (not with_global_pose) * 3 + return torch.exp(pose[:, angle_prior_idxs] * + self.angle_prior_signs).pow(2) + + +class L2Prior(nn.Module): + def __init__(self, dtype=DEFAULT_DTYPE, reduction='sum', **kwargs): + super(L2Prior, self).__init__() + + def forward(self, module_input, *args): + return torch.sum(module_input.pow(2)) + + +class MaxMixturePrior(nn.Module): + + def __init__(self, prior_folder='prior', + num_gaussians=6, dtype=DEFAULT_DTYPE, epsilon=1e-16, + use_merged=True, + **kwargs): + super(MaxMixturePrior, self).__init__() + + if dtype == DEFAULT_DTYPE: + np_dtype = np.float32 + elif dtype == torch.float64: + np_dtype = np.float64 + else: + print('Unknown float type {}, exiting!'.format(dtype)) + sys.exit(-1) + + self.num_gaussians = num_gaussians + self.epsilon = epsilon + self.use_merged = use_merged + gmm_fn = 'gmm_{:02d}.pkl'.format(num_gaussians) + + full_gmm_fn = os.path.join(prior_folder, gmm_fn) + if not os.path.exists(full_gmm_fn): + print('The path to the mixture prior "{}"'.format(full_gmm_fn) + + ' does not exist, exiting!') + sys.exit(-1) + + with open(full_gmm_fn, 'rb') as f: + gmm = pickle.load(f, encoding='latin1') + + if type(gmm) == dict: + means = gmm['means'].astype(np_dtype) + covs = gmm['covars'].astype(np_dtype) + weights = gmm['weights'].astype(np_dtype) + elif 'sklearn.mixture.gmm.GMM' in str(type(gmm)): + means = gmm.means_.astype(np_dtype) + covs = gmm.covars_.astype(np_dtype) + weights = gmm.weights_.astype(np_dtype) + else: + print('Unknown type for the prior: {}, exiting!'.format(type(gmm))) + sys.exit(-1) + + self.register_buffer('means', torch.tensor(means, dtype=dtype)) + + self.register_buffer('covs', torch.tensor(covs, dtype=dtype)) + + precisions = [np.linalg.inv(cov) for cov in covs] + precisions = np.stack(precisions).astype(np_dtype) + + self.register_buffer('precisions', + torch.tensor(precisions, dtype=dtype)) + + # The constant term: + sqrdets = np.array([(np.sqrt(np.linalg.det(c))) + for c in gmm['covars']]) + const = (2 * np.pi)**(69 / 2.) + + nll_weights = np.asarray(gmm['weights'] / (const * + (sqrdets / sqrdets.min()))) + nll_weights = torch.tensor(nll_weights, dtype=dtype).unsqueeze(dim=0) + self.register_buffer('nll_weights', nll_weights) + + weights = torch.tensor(gmm['weights'], dtype=dtype).unsqueeze(dim=0) + self.register_buffer('weights', weights) + + self.register_buffer('pi_term', + torch.log(torch.tensor(2 * np.pi, dtype=dtype))) + + cov_dets = [np.log(np.linalg.det(cov.astype(np_dtype)) + epsilon) + for cov in covs] + self.register_buffer('cov_dets', + torch.tensor(cov_dets, dtype=dtype)) + + # The dimensionality of the random variable + self.random_var_dim = self.means.shape[1] + + def get_mean(self): + ''' Returns the mean of the mixture ''' + mean_pose = torch.matmul(self.weights, self.means) + return mean_pose + + def merged_log_likelihood(self, pose, betas): + diff_from_mean = pose.unsqueeze(dim=1) - self.means + + prec_diff_prod = torch.einsum('mij,bmj->bmi', + [self.precisions, diff_from_mean]) + diff_prec_quadratic = (prec_diff_prod * diff_from_mean).sum(dim=-1) + + curr_loglikelihood = 0.5 * diff_prec_quadratic - \ + torch.log(self.nll_weights) + # curr_loglikelihood = 0.5 * (self.cov_dets.unsqueeze(dim=0) + + # self.random_var_dim * self.pi_term + + # diff_prec_quadratic + # ) - torch.log(self.weights) + + min_likelihood, _ = torch.min(curr_loglikelihood, dim=1) + return min_likelihood + + def log_likelihood(self, pose, betas, *args, **kwargs): + ''' Create graph operation for negative log-likelihood calculation + ''' + likelihoods = [] + + for idx in range(self.num_gaussians): + mean = self.means[idx] + prec = self.precisions[idx] + cov = self.covs[idx] + diff_from_mean = pose - mean + + curr_loglikelihood = torch.einsum('bj,ji->bi', + [diff_from_mean, prec]) + curr_loglikelihood = torch.einsum('bi,bi->b', + [curr_loglikelihood, + diff_from_mean]) + cov_term = torch.log(torch.det(cov) + self.epsilon) + curr_loglikelihood += 0.5 * (cov_term + + self.random_var_dim * + self.pi_term) + likelihoods.append(curr_loglikelihood) + + log_likelihoods = torch.stack(likelihoods, dim=1) + min_idx = torch.argmin(log_likelihoods, dim=1) + weight_component = self.nll_weights[:, min_idx] + weight_component = -torch.log(weight_component) + + return weight_component + log_likelihoods[:, min_idx] + + def forward(self, pose, betas): + if self.use_merged: + return self.merged_log_likelihood(pose, betas) + else: + return self.log_likelihood(pose, betas) \ No newline at end of file diff --git a/src/mdm/visualize/joints2smpl/src/smplify.py b/src/mdm/visualize/joints2smpl/src/smplify.py new file mode 100644 index 0000000000000000000000000000000000000000..580efef98dfdcf6e7486b7f5c5436820edfb6c4b --- /dev/null +++ b/src/mdm/visualize/joints2smpl/src/smplify.py @@ -0,0 +1,279 @@ +import torch +import os, sys +import pickle +import smplx +import numpy as np + +sys.path.append(os.path.dirname(__file__)) +from customloss import (camera_fitting_loss, + body_fitting_loss, + camera_fitting_loss_3d, + body_fitting_loss_3d, + ) +from prior import MaxMixturePrior +from visualize.joints2smpl.src import config + + + +@torch.no_grad() +def guess_init_3d(model_joints, + j3d, + joints_category="orig"): + """Initialize the camera translation via triangle similarity, by using the torso joints . + :param model_joints: SMPL model with pre joints + :param j3d: 25x3 array of Kinect Joints + :returns: 3D vector corresponding to the estimated camera translation + """ + # get the indexed four + gt_joints = ['RHip', 'LHip', 'RShoulder', 'LShoulder'] + gt_joints_ind = [config.JOINT_MAP[joint] for joint in gt_joints] + + if joints_category=="orig": + joints_ind_category = [config.JOINT_MAP[joint] for joint in gt_joints] + elif joints_category=="AMASS": + joints_ind_category = [config.AMASS_JOINT_MAP[joint] for joint in gt_joints] + else: + print("NO SUCH JOINTS CATEGORY!") + + sum_init_t = (j3d[:, joints_ind_category] - model_joints[:, gt_joints_ind]).sum(dim=1) + init_t = sum_init_t / 4.0 + return init_t + + +# SMPLIfy 3D +class SMPLify3D(): + """Implementation of SMPLify, use 3D joints.""" + + def __init__(self, + smplxmodel, + step_size=1e-2, + batch_size=1, + num_iters=100, + use_collision=False, + use_lbfgs=True, + joints_category="orig", + device=torch.device('cuda:0'), + ): + + # Store options + self.batch_size = batch_size + self.device = device + self.step_size = step_size + + self.num_iters = num_iters + # --- choose optimizer + self.use_lbfgs = use_lbfgs + # GMM pose prior + self.pose_prior = MaxMixturePrior(prior_folder=config.GMM_MODEL_DIR, + num_gaussians=8, + dtype=torch.float32).to(device) + # collision part + self.use_collision = use_collision + if self.use_collision: + self.part_segm_fn = config.Part_Seg_DIR + + # reLoad SMPL-X model + self.smpl = smplxmodel + + self.model_faces = smplxmodel.faces_tensor.view(-1) + + # select joint joint_category + self.joints_category = joints_category + + if joints_category=="orig": + self.smpl_index = config.full_smpl_idx + self.corr_index = config.full_smpl_idx + elif joints_category=="AMASS": + self.smpl_index = config.amass_smpl_idx + self.corr_index = config.amass_idx + else: + self.smpl_index = None + self.corr_index = None + print("NO SUCH JOINTS CATEGORY!") + + # ---- get the man function here ------ + def __call__(self, init_pose, init_betas, init_cam_t, j3d, conf_3d=1.0, seq_ind=0): + """Perform body fitting. + Input: + init_pose: SMPL pose estimate + init_betas: SMPL betas estimate + init_cam_t: Camera translation estimate + j3d: joints 3d aka keypoints + conf_3d: confidence for 3d joints + seq_ind: index of the sequence + Returns: + vertices: Vertices of optimized shape + joints: 3D joints of optimized shape + pose: SMPL pose parameters of optimized shape + betas: SMPL beta parameters of optimized shape + camera_translation: Camera translation + """ + + # # # add the mesh inter-section to avoid + search_tree = None + pen_distance = None + filter_faces = None + + if self.use_collision: + from mesh_intersection.bvh_search_tree import BVH + import mesh_intersection.loss as collisions_loss + from mesh_intersection.filter_faces import FilterFaces + + search_tree = BVH(max_collisions=8) + + pen_distance = collisions_loss.DistanceFieldPenetrationLoss( + sigma=0.5, point2plane=False, vectorized=True, penalize_outside=True) + + if self.part_segm_fn: + # Read the part segmentation + part_segm_fn = os.path.expandvars(self.part_segm_fn) + with open(part_segm_fn, 'rb') as faces_parents_file: + face_segm_data = pickle.load(faces_parents_file, encoding='latin1') + faces_segm = face_segm_data['segm'] + faces_parents = face_segm_data['parents'] + # Create the module used to filter invalid collision pairs + filter_faces = FilterFaces( + faces_segm=faces_segm, faces_parents=faces_parents, + ign_part_pairs=None).to(device=self.device) + + + # Split SMPL pose to body pose and global orientation + body_pose = init_pose[:, 3:].detach().clone() + global_orient = init_pose[:, :3].detach().clone() + betas = init_betas.detach().clone() + + # use guess 3d to get the initial + smpl_output = self.smpl(global_orient=global_orient, + body_pose=body_pose, + betas=betas) + model_joints = smpl_output.joints + + init_cam_t = guess_init_3d(model_joints, j3d, self.joints_category).unsqueeze(1).detach() + camera_translation = init_cam_t.clone() + + preserve_pose = init_pose[:, 3:].detach().clone() + # -------------Step 1: Optimize camera translation and body orientation-------- + # Optimize only camera translation and body orientation + body_pose.requires_grad = False + betas.requires_grad = False + global_orient.requires_grad = True + camera_translation.requires_grad = True + + camera_opt_params = [global_orient, camera_translation] + + if self.use_lbfgs: + camera_optimizer = torch.optim.LBFGS(camera_opt_params, max_iter=self.num_iters, + lr=self.step_size, line_search_fn='strong_wolfe') + for i in range(10): + def closure(): + camera_optimizer.zero_grad() + smpl_output = self.smpl(global_orient=global_orient, + body_pose=body_pose, + betas=betas) + model_joints = smpl_output.joints + # print('model_joints', model_joints.shape) + # print('camera_translation', camera_translation.shape) + # print('init_cam_t', init_cam_t.shape) + # print('j3d', j3d.shape) + loss = camera_fitting_loss_3d(model_joints, camera_translation, + init_cam_t, j3d, self.joints_category) + loss.backward() + return loss + + camera_optimizer.step(closure) + else: + camera_optimizer = torch.optim.Adam(camera_opt_params, lr=self.step_size, betas=(0.9, 0.999)) + + for i in range(20): + smpl_output = self.smpl(global_orient=global_orient, + body_pose=body_pose, + betas=betas) + model_joints = smpl_output.joints + + loss = camera_fitting_loss_3d(model_joints[:, self.smpl_index], camera_translation, + init_cam_t, j3d[:, self.corr_index], self.joints_category) + camera_optimizer.zero_grad() + loss.backward() + camera_optimizer.step() + + # Fix camera translation after optimizing camera + # --------Step 2: Optimize body joints -------------------------- + # Optimize only the body pose and global orientation of the body + body_pose.requires_grad = True + global_orient.requires_grad = True + camera_translation.requires_grad = True + + # --- if we use the sequence, fix the shape + if seq_ind == 0: + betas.requires_grad = True + body_opt_params = [body_pose, betas, global_orient, camera_translation] + else: + betas.requires_grad = False + body_opt_params = [body_pose, global_orient, camera_translation] + + if self.use_lbfgs: + body_optimizer = torch.optim.LBFGS(body_opt_params, max_iter=self.num_iters, + lr=self.step_size, line_search_fn='strong_wolfe') + for i in range(self.num_iters): + def closure(): + body_optimizer.zero_grad() + smpl_output = self.smpl(global_orient=global_orient, + body_pose=body_pose, + betas=betas) + model_joints = smpl_output.joints + model_vertices = smpl_output.vertices + + loss = body_fitting_loss_3d(body_pose, preserve_pose, betas, model_joints[:, self.smpl_index], camera_translation, + j3d[:, self.corr_index], self.pose_prior, + joints3d_conf=conf_3d, + joint_loss_weight=600.0, + pose_preserve_weight=5.0, + use_collision=self.use_collision, + model_vertices=model_vertices, model_faces=self.model_faces, + search_tree=search_tree, pen_distance=pen_distance, filter_faces=filter_faces) + loss.backward() + return loss + + body_optimizer.step(closure) + else: + body_optimizer = torch.optim.Adam(body_opt_params, lr=self.step_size, betas=(0.9, 0.999)) + + for i in range(self.num_iters): + smpl_output = self.smpl(global_orient=global_orient, + body_pose=body_pose, + betas=betas) + model_joints = smpl_output.joints + model_vertices = smpl_output.vertices + + loss = body_fitting_loss_3d(body_pose, preserve_pose, betas, model_joints[:, self.smpl_index], camera_translation, + j3d[:, self.corr_index], self.pose_prior, + joints3d_conf=conf_3d, + joint_loss_weight=600.0, + use_collision=self.use_collision, + model_vertices=model_vertices, model_faces=self.model_faces, + search_tree=search_tree, pen_distance=pen_distance, filter_faces=filter_faces) + body_optimizer.zero_grad() + loss.backward() + body_optimizer.step() + + # Get final loss value + with torch.no_grad(): + smpl_output = self.smpl(global_orient=global_orient, + body_pose=body_pose, + betas=betas, return_full_pose=True) + model_joints = smpl_output.joints + model_vertices = smpl_output.vertices + + final_loss = body_fitting_loss_3d(body_pose, preserve_pose, betas, model_joints[:, self.smpl_index], camera_translation, + j3d[:, self.corr_index], self.pose_prior, + joints3d_conf=conf_3d, + joint_loss_weight=600.0, + use_collision=self.use_collision, model_vertices=model_vertices, model_faces=self.model_faces, + search_tree=search_tree, pen_distance=pen_distance, filter_faces=filter_faces) + + vertices = smpl_output.vertices.detach() + joints = smpl_output.joints.detach() + pose = torch.cat([global_orient, body_pose], dim=-1).detach() + betas = betas.detach() + + return vertices, joints, pose, betas, camera_translation, final_loss diff --git a/src/mdm/visualize/motions2hik.py b/src/mdm/visualize/motions2hik.py new file mode 100644 index 0000000000000000000000000000000000000000..05339743ac3c11ed12892c32e6720fada301b7f7 --- /dev/null +++ b/src/mdm/visualize/motions2hik.py @@ -0,0 +1,103 @@ +import numpy as np +import torch + +from utils.rotation_conversions import rotation_6d_to_matrix, matrix_to_euler_angles +from visualize.simplify_loc2rot import joints2smpl + +""" +Utility function to convert model output to a representation used by HumanIK skeletons in Maya and Motion Builder +by converting joint positions to joint rotations in degrees. Based on visualize.vis_utils.npy2obj +""" + +# Mapping of SMPL joint index to HIK joint Name +JOINT_MAP = [ + 'Hips', + 'LeftUpLeg', + 'RightUpLeg', + 'Spine', + 'LeftLeg', + 'RightLeg', + 'Spine1', + 'LeftFoot', + 'RightFoot', + 'Spine2', + 'LeftToeBase', + 'RightToeBase', + 'Neck', + 'LeftShoulder', + 'RightShoulder', + 'Head', + 'LeftArm', + 'RightArm', + 'LeftForeArm', + 'RightForeArm', + 'LeftHand', + 'RightHand' +] + + +def motions2hik(motions, device=0, cuda=True): + """ + Utility function to convert model output to a representation used by HumanIK skeletons in Maya and Motion Builder + by converting joint positions to joint rotations in degrees. Based on visualize.vis_utils.npy2obj + + :param motions: numpy array containing MDM model output [num_reps, num_joints, num_params (xyz), num_frames + :param device: + :param cuda: + + :returns: JSON serializable dict to be used with the Replicate API implementation + """ + + nreps, njoints, nfeats, nframes = motions.shape + j2s = joints2smpl(num_frames=nframes, device_id=device, cuda=cuda) + + thetas = [] + root_translation = [] + for rep_idx in range(nreps): + rep_motions = motions[rep_idx].transpose(2, 0, 1) # [nframes, njoints, 3] + + if nfeats == 3: + print(f'Running SMPLify for repetition [{rep_idx + 1}] of {nreps}, it may take a few minutes.') + motion_tensor, opt_dict = j2s.joint2smpl(rep_motions) # [nframes, njoints, 3] + motion = motion_tensor.cpu().numpy() + + elif nfeats == 6: + motion = rep_motions + thetas.append(rep_motions) + + # Convert 6D rotation representation to Euler angles + thetas_6d = motion[0, :-1, :, :nframes].transpose(2, 0, 1) # [nframes, njoints, 6] + thetas_deg = [] + for frame, d6 in enumerate(thetas_6d): + thetas_deg.append([_rotation_6d_to_euler(d6)]) + + thetas.append([np.concatenate(thetas_deg, axis=0)]) + root_translation.append([motion[0, -1, :3, :nframes].transpose(1, 0)]) # [nframes, 3] + + thetas = np.concatenate(thetas, axis=0)[:nframes] + root_translation = np.concatenate(root_translation, axis=0)[:nframes] + + data_dict = { + 'joint_map': JOINT_MAP, + 'thetas': thetas.tolist(), # [nreps, nframes, njoints, 3 (deg)] + 'root_translation': root_translation.tolist(), # [nreps, nframes, 3 (xyz)] + } + + return data_dict + + +def _rotation_6d_to_euler(d6): + """ + Converts 6D rotation representation by Zhou et al. [1] to euler angles + using Gram--Schmidt orthogonalisation per Section B of [1]. + + :param d6: numpy Array 6D rotation representation, of size (*, 6) + :returns: JSON serializable dict to be used with the Replicate API implementation + :returns: euler angles in degrees as a numpy array with shape (*, 3) + """ + rot_mat = rotation_6d_to_matrix(torch.tensor(d6)) + rot_eul_rad = matrix_to_euler_angles(rot_mat, 'XYZ') + eul_deg = torch.rad2deg(rot_eul_rad).numpy() + + return eul_deg + diff --git a/src/mdm/visualize/render_mesh.py b/src/mdm/visualize/render_mesh.py new file mode 100644 index 0000000000000000000000000000000000000000..d44d04f551ccb4f1ffc9efb4cb1a44c407ede836 --- /dev/null +++ b/src/mdm/visualize/render_mesh.py @@ -0,0 +1,33 @@ +import argparse +import os +from visualize import vis_utils +import shutil +from tqdm import tqdm + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--input_path", type=str, required=True, help='stick figure mp4 file to be rendered.') + parser.add_argument("--cuda", type=bool, default=True, help='') + parser.add_argument("--device", type=int, default=0, help='') + params = parser.parse_args() + + assert params.input_path.endswith('.mp4') + parsed_name = os.path.basename(params.input_path).replace('.mp4', '').replace('sample', '').replace('rep', '') + sample_i, rep_i = [int(e) for e in parsed_name.split('_')] + npy_path = os.path.join(os.path.dirname(params.input_path), 'results.npy') + out_npy_path = params.input_path.replace('.mp4', '_smpl_params.npy') + assert os.path.exists(npy_path) + results_dir = params.input_path.replace('.mp4', '_obj') + if os.path.exists(results_dir): + shutil.rmtree(results_dir) + os.makedirs(results_dir) + + npy2obj = vis_utils.npy2obj(npy_path, sample_i, rep_i, + device=params.device, cuda=params.cuda) + + print('Saving obj files to [{}]'.format(os.path.abspath(results_dir))) + for frame_i in tqdm(range(npy2obj.real_num_frames)): + npy2obj.save_obj(os.path.join(results_dir, 'frame{:03d}.obj'.format(frame_i)), frame_i) + + print('Saving SMPL params to [{}]'.format(os.path.abspath(out_npy_path))) + npy2obj.save_npy(out_npy_path) diff --git a/src/mdm/visualize/simplify_loc2rot.py b/src/mdm/visualize/simplify_loc2rot.py new file mode 100644 index 0000000000000000000000000000000000000000..5d3d4411310876033cb50d998ad64557a9c4b0c1 --- /dev/null +++ b/src/mdm/visualize/simplify_loc2rot.py @@ -0,0 +1,131 @@ +import numpy as np +import os +import torch +from visualize.joints2smpl.src import config +import smplx +import h5py +from visualize.joints2smpl.src.smplify import SMPLify3D +from tqdm import tqdm +import utils.rotation_conversions as geometry +import argparse + + +class joints2smpl: + + def __init__(self, num_frames, device_id, cuda=True): + self.device = torch.device("cuda:" + str(device_id) if cuda else "cpu") + # self.device = torch.device("cpu") + self.batch_size = num_frames + self.num_joints = 22 # for HumanML3D + self.joint_category = "AMASS" + self.num_smplify_iters = 150 + self.fix_foot = False + print(config.SMPL_MODEL_DIR) + smplmodel = smplx.create(config.SMPL_MODEL_DIR, + model_type="smpl", gender="neutral", ext="pkl", + batch_size=self.batch_size).to(self.device) + + # ## --- load the mean pose as original ---- + smpl_mean_file = config.SMPL_MEAN_FILE + + file = h5py.File(smpl_mean_file, 'r') + self.init_mean_pose = torch.from_numpy(file['pose'][:]).unsqueeze(0).repeat(self.batch_size, 1).float().to(self.device) + self.init_mean_shape = torch.from_numpy(file['shape'][:]).unsqueeze(0).repeat(self.batch_size, 1).float().to(self.device) + self.cam_trans_zero = torch.Tensor([0.0, 0.0, 0.0]).unsqueeze(0).to(self.device) + # + + # # #-------------initialize SMPLify + self.smplify = SMPLify3D(smplxmodel=smplmodel, + batch_size=self.batch_size, + joints_category=self.joint_category, + num_iters=self.num_smplify_iters, + device=self.device) + + + def npy2smpl(self, npy_path): + out_path = npy_path.replace('.npy', '_rot.npy') + motions = np.load(npy_path, allow_pickle=True)[None][0] + # print_batch('', motions) + n_samples = motions['motion'].shape[0] + all_thetas = [] + for sample_i in tqdm(range(n_samples)): + thetas, _ = self.joint2smpl(motions['motion'][sample_i].transpose(2, 0, 1)) # [nframes, njoints, 3] + all_thetas.append(thetas.cpu().numpy()) + motions['motion'] = np.concatenate(all_thetas, axis=0) + print('motions', motions['motion'].shape) + + print(f'Saving [{out_path}]') + np.save(out_path, motions) + exit() + + + + def joint2smpl(self, input_joints, init_params=None): + _smplify = self.smplify # if init_params is None else self.smplify_fast + pred_pose = torch.zeros(self.batch_size, 72).to(self.device) + pred_betas = torch.zeros(self.batch_size, 10).to(self.device) + pred_cam_t = torch.zeros(self.batch_size, 3).to(self.device) + keypoints_3d = torch.zeros(self.batch_size, self.num_joints, 3).to(self.device) + + # run the whole seqs + num_seqs = input_joints.shape[0] + + + # joints3d = input_joints[idx] # *1.2 #scale problem [check first] + keypoints_3d = torch.Tensor(input_joints).to(self.device).float() + + # if idx == 0: + if init_params is None: + pred_betas = self.init_mean_shape + pred_pose = self.init_mean_pose + pred_cam_t = self.cam_trans_zero + else: + pred_betas = init_params['betas'] + pred_pose = init_params['pose'] + pred_cam_t = init_params['cam'] + + if self.joint_category == "AMASS": + confidence_input = torch.ones(self.num_joints) + # make sure the foot and ankle + if self.fix_foot == True: + confidence_input[7] = 1.5 + confidence_input[8] = 1.5 + confidence_input[10] = 1.5 + confidence_input[11] = 1.5 + else: + print("Such category not settle down!") + + new_opt_vertices, new_opt_joints, new_opt_pose, new_opt_betas, \ + new_opt_cam_t, new_opt_joint_loss = _smplify( + pred_pose.detach(), + pred_betas.detach(), + pred_cam_t.detach(), + keypoints_3d, + conf_3d=confidence_input.to(self.device), + # seq_ind=idx + ) + + thetas = new_opt_pose.reshape(self.batch_size, 24, 3) + thetas = geometry.matrix_to_rotation_6d(geometry.axis_angle_to_matrix(thetas)) # [bs, 24, 6] + root_loc = torch.tensor(keypoints_3d[:, 0]) # [bs, 3] + root_loc = torch.cat([root_loc, torch.zeros_like(root_loc)], dim=-1).unsqueeze(1) # [bs, 1, 6] + thetas = torch.cat([thetas, root_loc], dim=1).unsqueeze(0).permute(0, 2, 3, 1) # [1, 25, 6, 196] + + return thetas.clone().detach(), {'pose': new_opt_joints[0, :24].flatten().clone().detach(), 'betas': new_opt_betas.clone().detach(), 'cam': new_opt_cam_t.clone().detach()} + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--input_path", type=str, required=True, help='Blender file or dir with blender files') + parser.add_argument("--cuda", type=bool, default=True, help='') + parser.add_argument("--device", type=int, default=0, help='') + params = parser.parse_args() + + simplify = joints2smpl(device_id=params.device, cuda=params.cuda) + + if os.path.isfile(params.input_path) and params.input_path.endswith('.npy'): + simplify.npy2smpl(params.input_path) + elif os.path.isdir(params.input_path): + files = [os.path.join(params.input_path, f) for f in os.listdir(params.input_path) if f.endswith('.npy')] + for f in files: + simplify.npy2smpl(f) \ No newline at end of file diff --git a/src/mdm/visualize/vis_utils.py b/src/mdm/visualize/vis_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..ab73bc11600f99d765b52d1bce7e1f4d655f32af --- /dev/null +++ b/src/mdm/visualize/vis_utils.py @@ -0,0 +1,66 @@ +from model.rotation2xyz import Rotation2xyz +import numpy as np +from trimesh import Trimesh +import os +import torch +from visualize.simplify_loc2rot import joints2smpl + +class npy2obj: + def __init__(self, npy_path, sample_idx, rep_idx, device=0, cuda=True): + self.npy_path = npy_path + self.motions = np.load(self.npy_path, allow_pickle=True) + if self.npy_path.endswith('.npz'): + self.motions = self.motions['arr_0'] + self.motions = self.motions[None][0] + self.rot2xyz = Rotation2xyz(device='cpu') + self.faces = self.rot2xyz.smpl_model.faces + self.bs, self.njoints, self.nfeats, self.nframes = self.motions['motion'].shape + self.opt_cache = {} + self.sample_idx = sample_idx + self.total_num_samples = self.motions['num_samples'] + self.rep_idx = rep_idx + self.absl_idx = self.rep_idx*self.total_num_samples + self.sample_idx + self.num_frames = self.motions['motion'][self.absl_idx].shape[-1] + self.j2s = joints2smpl(num_frames=self.num_frames, device_id=device, cuda=cuda) + + if self.nfeats == 3: + print(f'Running SMPLify For sample [{sample_idx}], repetition [{rep_idx}], it may take a few minutes.') + motion_tensor, opt_dict = self.j2s.joint2smpl(self.motions['motion'][self.absl_idx].transpose(2, 0, 1)) # [nframes, njoints, 3] + self.motions['motion'] = motion_tensor.cpu().numpy() + elif self.nfeats == 6: + self.motions['motion'] = self.motions['motion'][[self.absl_idx]] + self.bs, self.njoints, self.nfeats, self.nframes = self.motions['motion'].shape + self.real_num_frames = self.motions['lengths'][self.absl_idx] + + self.vertices = self.rot2xyz(torch.tensor(self.motions['motion']), mask=None, + pose_rep='rot6d', translation=True, glob=True, + jointstype='vertices', + # jointstype='smpl', # for joint locations + vertstrans=True) + self.root_loc = self.motions['motion'][:, -1, :3, :].reshape(1, 1, 3, -1) + # self.vertices += self.root_loc + + def get_vertices(self, sample_i, frame_i): + return self.vertices[sample_i, :, :, frame_i].squeeze().tolist() + + def get_trimesh(self, sample_i, frame_i): + return Trimesh(vertices=self.get_vertices(sample_i, frame_i), + faces=self.faces) + + def save_obj(self, save_path, frame_i): + mesh = self.get_trimesh(0, frame_i) + with open(save_path, 'w') as fw: + mesh.export(fw, 'obj') + return save_path + + def save_npy(self, save_path): + data_dict = { + 'motion': self.motions['motion'][0, :, :, :self.real_num_frames], + 'thetas': self.motions['motion'][0, :-1, :, :self.real_num_frames], + 'root_translation': self.motions['motion'][0, -1, :3, :self.real_num_frames], + 'faces': self.faces, + 'vertices': self.vertices[0, :, :, :self.real_num_frames], + 'text': self.motions['text'][0], + 'length': self.real_num_frames, + } + np.save(save_path, data_dict) diff --git a/src/mobu_script/mobu_retarget.py b/src/mobu_script/mobu_retarget.py new file mode 100644 index 0000000000000000000000000000000000000000..e71eef63f5de422b851fa1a8ff0bfddbfd42a970 --- /dev/null +++ b/src/mobu_script/mobu_retarget.py @@ -0,0 +1,810 @@ +import os + +from pyfbsdk import * +import random +import math +import itertools +import numpy as np + +# to install numpy for motionbuilder, please refer to: https://help.autodesk.com/view/MOBPRO/2022/ENU/?guid=GUID-46E090C5-34AD-4E26-872F-F7D21DC57C74 + +# Tutorials/code I referred to: +# https://help.autodesk.com/view/MOBPRO/2019/ENU/?guid=__files_GUID_A1189AA0_3816_4350_B8F3_5383DEC25A33_htm +# https://github.com/eksod/Retargeter + + +""" ====================================================== Native Python Functions ====================================================== """ +""" parsing character pool, tweaking skeleton properties, converting bvh format, etc """ + + +def parse_all_char(data_path): + filelist = list(filter(lambda x: x.endswith(".txt"), os.listdir(data_path))) + char_list = [] + for filename in filelist: + filepath = os.path.join(data_path, filename) + character = {} + with open(filepath, "r") as file: + for line in file: + tokens = line.strip().split(",") + joint_name = tokens[0].replace("_END", "_End") + character[joint_name] = np.array( + [float(tokens[1]), float(tokens[2]), float(tokens[3])] + ) + char_list.append([filename, character]) + print("PARSE_ALL_CHAR :: DONE :: ", len(char_list)) + return char_list + + +def rand_scale(rand_range): + # random between [1-rand_range, 1+rand_range] + return (1 - rand_range) + 2 * rand_range * random.random() + + +def tweakSkelProperty(char_skel_list, rnd_hierarchy=True, charFile=None): + char_i = random.randint(0, len(char_skel_list) - 1) + char_file_i, char_stat_i = char_skel_list[char_i] + char_stat_i_names = list(char_stat_i.keys()) + + head_joint_list = [ + ["Hips", "LowerBack"], + ["Spine", "Spine1", "Spine2", "Spine3", "Spine4"], + ["Neck", "Neck1"], + ["Head", "Head_End"], + ] + lleg_joint_list = [ + ["LeftHipJoint"], + ["LeftUpLeg", "LeftLeg", "LeftFoot", "LeftToeBase", "LeftToeBase_End"], + ] + larm_joint_list = [ + ["LeftShoulder", "LeftDummyShoulder"], + ["LeftArm", "LeftForeArm", "LeftHand", "LeftHand_End"], + ] + """ + @return / rnd_offset: Dict[str, [x,y,z(floats)]] + @return / parent_map: Dict[str, str] + @return / all_joint_list: List[str] # order matters! parents should come first (for addJoint in MB) + """ + spineCnt = len( + [spine for spine in head_joint_list[1] if spine in char_stat_i_names] + ) + neckCnt = len([spine for spine in head_joint_list[2] if spine in char_stat_i_names]) + useHipJoint = "LeftHipJoint" in char_stat_i_names + useLowerBack = "LowerBack" in char_stat_i_names + useDummyShoulder = "DummyShoulder" in char_stat_i_names + + ## Heuristics to augment the skeleton + if rnd_hierarchy: + if random.random() < 0.1: + useHipJoint = True + char_stat_i["LeftHipJoint"] = np.array([0, 0, 0]) + + if random.random() < 0.1: + useLowerBack = True + char_stat_i["LowerBack"] = np.array([0, 0, 0]) # print(char_stat_i_names) + + if random.random() < 0.05: + useDummyShoulder = True + char_stat_i["LeftDummyShoulder"] = [5, 0, 0] + elif random.random() < 0.05: + useDummyShoulder = True + char_stat_i["LeftDummyShoulder"] = [0, 0, 0] + + # randomize spine cnt + default_spineCnt = spineCnt + spineCnt += max(min(int(random.gauss(0, 1.0)), 2), -2) + spineCnt = max(min(spineCnt, 5), 1) + # modify default spine length + if spineCnt != default_spineCnt: + all_spine_list = head_joint_list[1] + sum_spine = np.sum( + [char_stat_i[all_spine_list[si]] for si in range(default_spineCnt)], + axis=0, + ) + + if default_spineCnt < spineCnt: + for si in range(default_spineCnt, spineCnt): + char_stat_i[all_spine_list[si]] = sum_spine * 1 / spineCnt + for si in range(default_spineCnt): + char_stat_i[all_spine_list[si]] = ( + char_stat_i[all_spine_list[si]] * default_spineCnt / spineCnt + ) + + elif default_spineCnt > spineCnt: + sum_spine_remain = np.sum( + [char_stat_i[all_spine_list[si]] for si in range(spineCnt)], axis=0 + ) + ratio = np.where( + np.abs(sum_spine_remain) < 1e-4, + np.ones_like(sum_spine), + sum_spine / sum_spine_remain, + ) + for si in range(spineCnt): + char_stat_i[all_spine_list[si]] *= ratio + for si in range(spineCnt, default_spineCnt): + del char_stat_i[all_spine_list[si]] + + # randomize neck cnt + default_neckCnt = neckCnt + neckCnt += max(min(int(random.gauss(0, 1.0)), 1), -1) + neckCnt = max(min(neckCnt, 2), 1) + if neckCnt != default_neckCnt: + all_neck_list = head_joint_list[2] + sum_neck = np.sum( + [char_stat_i[all_neck_list[si]] for si in range(default_neckCnt)], + axis=0, + ) + + if default_neckCnt < neckCnt: + for si in range(default_neckCnt, neckCnt): + char_stat_i[all_neck_list[si]] = sum_neck * 1 / neckCnt + for si in range(default_neckCnt): + char_stat_i[all_neck_list[si]] = ( + char_stat_i[all_neck_list[si]] * default_neckCnt / neckCnt + ) + + elif default_neckCnt > neckCnt: + sum_neck_remain = np.sum( + [char_stat_i[all_neck_list[si]] for si in range(neckCnt)], axis=0 + ) + ratio = np.where( + np.abs(sum_neck_remain) < 1e-4, + np.ones_like(sum_neck), + sum_neck / sum_neck_remain, + ) + for si in range(neckCnt): + char_stat_i[all_neck_list[si]] *= ratio + for si in range(neckCnt, default_neckCnt): + del char_stat_i[all_neck_list[si]] + + max_spineCnt = len(head_joint_list[1]) + for i in range(max_spineCnt - spineCnt): + head_joint_list[1].pop() + + max_neckCnt = len(head_joint_list[2]) + for i in range(max_neckCnt - neckCnt): + head_joint_list[2].pop() + + if not useLowerBack: + head_joint_list[0].pop() + if not useHipJoint: + lleg_joint_list[0].pop() + if not useDummyShoulder: + larm_joint_list[0].pop() + + root_joint = head_joint_list[0][0] + last_spine_joint = head_joint_list[1][-1] + + def flatten(folded_list): + return list(itertools.chain(*folded_list)) + + # def add_prefix(namelist, prefix): return [prefix+v for v in namelist] + def change_prefix(namelist, old_prefix, new_prefix): + newlist = [] + for v in namelist: + if v.startswith(old_prefix): + newlist.append(new_prefix + v[len(old_prefix) :]) + else: + newlist.append(v) + return newlist + + head_joint_list = flatten(head_joint_list) + lleg_joint_list = flatten(lleg_joint_list) + larm_joint_list = flatten(larm_joint_list) + rleg_joint_list = change_prefix(lleg_joint_list, "Left", "Right") + rarm_joint_list = change_prefix(larm_joint_list, "Left", "Right") + ee_joint_list = [ + head_joint_list[-1], + lleg_joint_list[-1], + rleg_joint_list[-1], + larm_joint_list[-1], + rarm_joint_list[-1], + ] + + # parent_map + parent_map = {} + for joint_list in [ + head_joint_list, + lleg_joint_list, + rleg_joint_list, + larm_joint_list, + rarm_joint_list, + ]: + for i in range(1, len(joint_list)): + parent_map[joint_list[i]] = joint_list[i - 1] + parent_map[head_joint_list[0]] = None + parent_map[lleg_joint_list[0]] = root_joint + parent_map[rleg_joint_list[0]] = root_joint + parent_map[larm_joint_list[0]] = last_spine_joint + parent_map[rarm_joint_list[0]] = last_spine_joint + + # all_joint_list + all_joint_list = flatten( + [ + head_joint_list, + lleg_joint_list, + rleg_joint_list, + larm_joint_list, + rarm_joint_list, + ] + ) + + # if there are duplicate, remove except for the first one(ex.lowerback in lleg_ and rleg_) + names_used = [] + for jn in all_joint_list: + if jn in names_used: + all_joint_list.remove(jn) + names_used.append(jn) + + # rnd_offset :: caution: Left / Right symmetry + rnd_offset = {} + for jn, offset_j in char_stat_i.items(): + if jn.startswith("Hip"): + continue + if jn.startswith("Right"): + continue + + local_scale = np.array([rand_scale(0.2), rand_scale(0.2), rand_scale(0.2)]) + rnd_offset[jn] = offset_j * local_scale + if jn.startswith("Left"): + rnd_offset[jn.replace("Left", "Right")] = np.array( + [-rnd_offset[jn][0], rnd_offset[jn][1], rnd_offset[jn][2]] + ) + + if jn in ee_joint_list: + if random.random() < 0.05: + rnd_offset[jn] = np.zeros(3) + + default_height = -sum([rnd_offset[lljoint][1] for lljoint in lleg_joint_list]) + min_ratio = 30 / default_height + max_ratio = 120 / default_height + global_scale = random.uniform(min_ratio, max_ratio) + if charFile is not None: + charFile.write( + f", {char_file_i}, {default_height}, {default_height*global_scale}\n" + ) + for jn in rnd_offset: + rnd_offset[jn] *= global_scale + + height = -sum([rnd_offset[lljoint][1] for lljoint in lleg_joint_list]) + height += random.random() * 3 # [0, 3]cm random offset (+y) + rnd_offset[root_joint] = np.array([0, height, 0]) + + return rnd_offset, parent_map, all_joint_list + + +def convert(inputPath, outputPath): + """ + currently, Motionbuilder scripting only supports exporting with rotation & translation for all joints + while translation remains unchanged for joints except root. + This function reads bvh, removes translation from joints except root, and re-save it to bvh. + """ + outputFile = open(outputPath, "w") + outputFile.write("HIERARCHY\n") + + indent = 0 + jointDOF = list() + writeMode = 0 # 0: hierarchy, 1: metadata, 2: data + prevJoint = "" + offset = 0 + with open(inputPath, "r") as file: + for line in file: + # reading each word + words = line.split() + + if writeMode == 0: + if (words[0] == "JOINT") or (words[0] == "ROOT"): + prevJoint = words[1] + if prevJoint.endswith("_"): + prevJoint = prevJoint[:-1] + if prevJoint == "Hips" or prevJoint == "Hips_": + outputFile.write(" " * indent + "ROOT " + prevJoint + "\n") + jointDOF.append((prevJoint, 6)) + if words[0] == "JOINT": + offset = 6 + else: + outputFile.write(" " * indent + "JOINT " + prevJoint + "\n") + jointDOF.append((prevJoint, 3)) + elif words[0] == "End": + outputFile.write(" " * indent + "End Site\n") + elif words[0] == "CHANNELS": + if prevJoint == "": + continue + if prevJoint == "Hips" or prevJoint == "Hips_": + outputFile.write( + " " * indent + + "CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation\n" + ) + else: + outputFile.write( + " " * indent + "CHANNELS 3 Zrotation Xrotation Yrotation\n" + ) + elif words[0] == "{": + if prevJoint == "": + continue + outputFile.write(" " * indent + "{" + "\n") + indent += 1 + elif words[0] == "OFFSET": + if prevJoint == "": + continue + outputFile.write( + " " * indent + + "OFFSET " + + words[1] + + " " + + words[2] + + " " + + words[3] + + "\n" + ) + elif words[0] == "}": + indent -= 1 + if indent >= 0: + outputFile.write(" " * indent + "}" + "\n") + elif words[0] == "MOTION": + writeMode = 1 + outputFile.write(line) + + elif writeMode == 1: + outputFile.write(line) + if line.startswith("Frame Time:"): + writeMode = 2 + + elif writeMode == 2: + words = line.split() + offset_local = offset + newLine = str() + # print(len(words)) + for jointName, dof in jointDOF: + # print(jointName, dof, offset_local) + if dof == 3: + offset_local += 3 + for i in range(dof): + newLine += words[offset_local + i] + " " + offset_local += dof + newLine += "\n" + outputFile.write(newLine) + + outputFile.close() + + +""" ====================================================== Mobupy Functions ====================================================== """ +""" create skeleton, characterize, plot animation, switch take, etc """ + + +def generateSkel(pNamespace, rnd_offset, parent_map, all_joint_list): + # Populate the skeleton + skeleton = {} + for jointName in all_joint_list: + # add underbar to avoid conflict with reserved names + jointName_ = jointName + "_" + + if jointName == "Reference" or jointName == "Hips": + # If it is the reference node, create an FBModelRoot. + joint = FBModelRoot(jointName_) + + else: + # Otherwise, create an FBModelSkeleton. + joint = FBModelSkeleton(jointName_) + + joint.LongName = ( + pNamespace + ":" + joint.Name + ) # Apply the specified namespace to each joint. + joint.Color = FBColor(0.3, 0.8, 1) # Cyan + joint.Size = 150 # Arbitrary size: big enough to see in viewport + joint.Show = True # Make the joint visible in the scene. + + # Add the joint to our skeleton. + skeleton[jointName] = joint + + def connectPlaceJoint(jointName): + translation = rnd_offset[jointName] + parentName = parent_map[jointName] + # Only assign a parent if it exists. + if parentName != None and parentName in parent_map.keys(): + skeleton[jointName].Parent = skeleton[parentName] + + if jointName not in skeleton: + print(jointName, "not in skeleton") + return + # The translation should be set after the parent has been assigned. + skeleton[jointName].Translation = FBVector3d(translation) + + for jointName in reversed(all_joint_list): + connectPlaceJoint(jointName) + return skeleton + + +def createSkeleton_fromdata( + pNamespace, char_skel_list, rnd_hierarchy=True, charFile=None +): + rnd_offset, parent_map, all_joint_list = tweakSkelProperty( + char_skel_list, rnd_hierarchy, charFile + ) + return generateSkel(pNamespace, rnd_offset, parent_map, all_joint_list) + + +def characterizeSkeleton(pCharacterName, pSkeleton): + # Create a new character. + character = FBCharacter(pCharacterName) + app.CurrentCharacter = character + + # Add each joint in our skeleton to the character. + for jointName, joint in pSkeleton.items(): + slot = character.PropertyList.Find(jointName + "Link") + if slot is not None: + slot.append(joint) + + # Flag that the character has been characterized. + character.SetCharacterizeOn(True) + + return character + + +def deselect_all(): + modelList = FBModelList() + FBGetSelectedModels(modelList, None, True) + for model in modelList: + model.Selected = False + + +# List of all Mobu Joints +jointList = [ + "Reference", + "Hips", + "LeftUpLeg", + "LeftLeg", + "LeftFoot", + "LeftToeBase", + "RightUpLeg", + "RightLeg", + "RightFoot", + "RightToeBase", + "Spine", + "Spine1", + "Spine2", + "Spine3", + "Spine4", + "Spine5", + "Spine6", + "Spine7", + "Spine8", + "Spine9", + "Neck", + "Neck1", + "Neck2", + "Neck3", + "Neck4", + "Neck5", + "Neck6", + "Neck7", + "Neck8", + "Neck9", + "Head", + "LeftShoulder", + "LeftArm", + "LeftForeArm", + "LeftHand", + "RightShoulder", + "RightArm", + "RightForeArm", + "RightHand", +] + +""" [TODO] +If bvh skeleton contains joints that are not in the MotionBuilder's biped character map, +append the bvh joint name to `joint_candidates[mobu joint name]` list. + +# joint_candidates: A dictionary mapping mobu joints to bvh joints (all candidates) +# - key: mobu Joint Names +# - value: [bvhJointName...] candidate List +""" +joint_candidates = {"LeftToeBase": ["LeftToe"], "RightToeBase": ["RightToe"]} + + +def CharacterizeBiped(namespace): + myBiped = FBCharacter(f"{namespace}: mycharacter") + app.CurrentCharacter = myBiped + + myBiped.LongName = f"{namespace}: mycharacter" + + # assign Biped to Character Mapping. + for mobuJoint in jointList: + modelLongName = f"{namespace}:{mobuJoint}" if namespace else mobuJoint + myJoint = FBFindModelByLabelName(modelLongName) + if (not myJoint) and (mobuJoint in joint_candidates): + for bvh_joint_candidate in joint_candidates[mobuJoint]: + modelLongName = ( + f"{namespace}:{bvh_joint_candidate}" + if namespace + else bvh_joint_candidate + ) + myJoint = FBFindModelByLabelName(modelLongName) + if myJoint: + break + # print(modelLongName, myJoint) + if myJoint: + proplist = myBiped.PropertyList.Find(mobuJoint + "Link") + proplist.append(myJoint) + + switchOn = myBiped.SetCharacterizeOn(True) + # print "Character mapping created for " + (myBiped.LongName) + + return myBiped + + +def plotAnim(char, animChar): + """ + Receives two characters, sets the input of the first character to the second + and plot. Return ploted character. + """ + # if char.GetCharacterize: + # switchOn = char.SetCharacterizeOn(True) + + plotoBla = FBPlotOptions() + plotoBla.ConstantKeyReducerKeepOneKey = True + plotoBla.PlotAllTakes = False + plotoBla.PlotOnFrame = True + plotoBla.PlotPeriod = FBTime(0, 0, 0, 1) + plotoBla.PlotTranslationOnRootOnly = True + plotoBla.PreciseTimeDiscontinuities = True + # plotoBla.RotationFilterToApply = FBRotationFilter.kFBRotationFilterGimbleKiller + plotoBla.UseConstantKeyReducer = False + plotoBla.ConstantKeyReducerKeepOneKey = True + char.InputCharacter = animChar + char.InputType = FBCharacterInputType.kFBCharacterInputCharacter + char.ActiveInput = True + if not char.PlotAnimation( + FBCharacterPlotWhere.kFBCharacterPlotOnSkeleton, plotoBla + ): + FBMessageBox( + "Something went wrong", + "Plot animation returned false, cannot continue", + "OK", + None, + None, + ) + return False + + return char + + +def SwitchTake(pTakeName): + iDestName = pTakeName + for iTake in system.Scene.Takes: + if iTake.Name == iDestName: + system.CurrentTake = iTake + + +def skelExists(root, name): + if root == None: + return False + if root.Name == name: + return True + for child in root.Children: + if skelExists(child, name): + return True + return False + + +""" ====================================================== MAIN ====================================================== """ +# [TODO] change below variables +DATA_DIR = "/home/sunminlee/workspace/SAME/data/" +DATA_NAME = "sample" +MOTION_DIR = os.path.join( + DATA_DIR, DATA_NAME, "motion", "bvh" +) # place all bvh files here +CHAR_DIR = os.path.join( + DATA_DIR, DATA_NAME, "character", "joint_pos" +) # place all character files here +batch_size = 3 # number of motions to retarget per one skeletal variation +iter_num = 2 # number of skeletal variations per one batch +merge_skel = False # whether all motions have the same skeleton (if True: no need to import multiple times) +fresh_start = True # whether to start fresh, or to continue from the last point + + +scale_stat = parse_all_char(CHAR_DIR) +OUT_DIR = os.path.join(MOTION_DIR, "result") +if not os.path.exists(OUT_DIR): + os.makedirs(OUT_DIR) +res_rel_dir = os.path.relpath(OUT_DIR, DATA_DIR) + +system = FBSystem() +app = FBApplication() + +import time + +start_time = time.time() +total_i = 0 + +sOptions = FBFbxOptions(False) # false = save options +sOptions.SaveCharacter = True +sOptions.SaveControlSet = False +sOptions.SaveCharacterExtension = False +sOptions.ShowFileDialog = False +sOptions.ShowOptionsDialog = False + +app.FileNew() + +logFilePath = os.path.join(MOTION_DIR, "pair.txt") +charFilePath = os.path.join(MOTION_DIR, "character.txt") + +if fresh_start: + fileList = [] + for dp, dn, filenames in os.walk(MOTION_DIR): + if dp == OUT_DIR: + continue + for f in filenames: + if f.endswith(".bvh"): + fileList.append(os.path.join(dp, f)) + + random.shuffle(fileList) + batch_num = math.ceil(len(fileList) / batch_size) + with open(os.path.join(MOTION_DIR, "fileList.txt"), "w") as fileListFile: + for bi in range(batch_num): + for m_i, filePath in enumerate( + fileList[bi * batch_size : (bi + 1) * batch_size] + ): + fileListFile.write( + f"{bi}, {m_i}, {os.path.relpath(filePath, DATA_DIR)}\n" + ) + logFile = open(logFilePath, "w") + charFile = open(charFilePath, "w") +else: + fileList = [] + with open(os.path.join(MOTION_DIR, "fileList.txt"), "r") as fileListFile: + for line in fileListFile: + line_list = line.strip().split(",") + fileList.append(os.path.join(DATA_DIR, line_list[-1].strip())) + batch_num = math.ceil(len(fileList) / batch_size) + + # find continue_bi + done = np.zeros((batch_num, iter_num), dtype=int) + with open(logFilePath, "r") as logfile: + for line in logfile: + line_tokens = line.split(",") + if line.strip() == "": + continue + bi = int(line_tokens[0].strip()) + si = int(line_tokens[1].strip()) + done[bi, si] += 1 + for bi in range(batch_num): + if not (done[bi] == batch_size).all(): + break + continue_bi = bi + 1 + + # remove log after continue_bi (partial done, so remove and redo) + with open(logFilePath, "r") as logfile: + lines = logfile.readlines() + with open(logFilePath, "w") as logfile: + for line in lines: + line_tokens = line.split(",") + if line.strip() == "": + continue + bi = int(line_tokens[0].strip()) + if bi < continue_bi: + logfile.write(line) + else: + break + + # remove character log after continue_bi (partial done, so remove and redo) + with open(charFilePath, "r") as charFile: + lines = charFile.readlines() + with open(charFilePath, "w") as charFile: + for line in lines: + line_tokens = line.split(",") + if line.strip() == "": + continue + fi = int(line_tokens[0].strip()) + if fi < continue_bi * iter_num * batch_size: + charFile.write(line) + else: + break + + logFile = open(logFilePath, "a") + charFile = open(charFilePath, "a") + + +for bi in range(batch_num): + app.FileNew() + animCharList = [] + fileNameList = [] + valid_m_num = 0 + + if not fresh_start and bi < continue_bi: + total_i = (bi + 1) * batch_size * iter_num + continue + + if bi != 0: + logFile = open(logFilePath, "a") + charFile = open(charFilePath, "a") + + for m_i, filePath in enumerate(fileList[bi * batch_size : (bi + 1) * batch_size]): + fileName = os.path.relpath(filePath, DATA_DIR) + + newTake = FBTake(fileName) #'Take_'+str(m_i)) + system.Scene.Takes.append(newTake) + SwitchTake(fileName) + newTake.ClearAllProperties(False) + success = app.FileImport(filePath, merge_skel) + + valid_m_num += 1 + + FBPlayerControl().SetTransportFps(FBTimeMode.kFBTimeMode30Frames) + if merge_skel: + prefix = None + else: + prefix = "BVH" if m_i == 0 else "BVH " + str(m_i) + reference_long_name = prefix + ":reference" + if FBFindModelByLabelName(reference_long_name): + FBFindModelByLabelName(reference_long_name).FBDelete() + + if (not merge_skel) or (m_i == 0): + animChar = CharacterizeBiped(prefix) + animChar.SelectModels(True, True, True, False) + lPlayer = FBPlayerControl() + lPlayer.Goto(FBTime(0, 0, 0, 0)) + animCharList.append(animChar) + + fileNameList.append(fileName) + deselect_all() + + for skel_i in range(iter_num): + characterName = "newSkel" + charFile.write(str(total_i)) + skeleton = createSkeleton_fromdata( + characterName, scale_stat, rnd_hierarchy=True, charFile=charFile + ) + character = characterizeSkeleton(characterName, skeleton) + + poseOptions = FBCharacterPoseOptions() + poseOptions.mCharacterPoseKeyingMode = ( + FBCharacterPoseKeyingMode.kFBCharacterPoseKeyingModeFullBody + ) + + for m_i in range(valid_m_num): + SwitchTake(fileNameList[m_i]) + + # key all frames for bvh to prevent unwanted interpolation between frames + lEndTime = system.CurrentTake.LocalTimeSpan.GetStop() + lEndFrame = system.CurrentTake.LocalTimeSpan.GetStop().GetFrame() + lStartFrameTime = system.CurrentTake.LocalTimeSpan.GetStart() + lStartFrame = system.CurrentTake.LocalTimeSpan.GetStart().GetFrame() + + lRange = min(int(lEndFrame) + 1, 50) + lPlayer = FBPlayerControl() + + for i in range(lRange): + lPlayer.Goto(FBTime(0, 0, 0, i)) + system.Scene.Evaluate() + lPlayer.Key() + system.Scene.Evaluate() + + lPlayer.Goto(FBTime(0, 0, 0, 0)) + animChar = animCharList[0] if merge_skel else animCharList[m_i] + plotAnim(character, animChar) + + logFile.write( + f"{bi}, {skel_i}, {fileNameList[m_i]}, {res_rel_dir}/{total_i}.bvh\n" + ) + dummyPath = os.path.join(OUT_DIR, str(total_i) + "_dummy.bvh") + convPath = os.path.join(OUT_DIR, str(total_i) + ".bvh") + character.SelectModels(True, True, True, True) + app.FileExport(dummyPath) + convert(dummyPath, convPath) + os.remove(dummyPath) + deselect_all() + total_i += 1 + + ## runnable check + # break + # break + + character.FBDelete() + for k, v in skeleton.items(): + v.FBDelete() + + logFile.close() + charFile.close() + for animChar in animCharList: + animChar.FBDelete() + del animCharList diff --git a/src/momask-preenc/.gitignore b/src/momask-preenc/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..8a2a19e6a60598cf5f2c42d3f838b0949411d5cb --- /dev/null +++ b/src/momask-preenc/.gitignore @@ -0,0 +1,13 @@ +*.pyc +checkpoints +editing +generation +log + +# Hugging Face Gradio release allowlist. +!checkpoints/ +!checkpoints/t2m/ +!checkpoints/t2m/t2m_base/ +!checkpoints/t2m/t2m_base/** +!checkpoints/t2m/t2m_rvq/ +!checkpoints/t2m/t2m_rvq/** diff --git a/src/momask-preenc/LICENSE b/src/momask-preenc/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..0842577c0dc8c1ba35ce06d68a2cabcfd04e8fea --- /dev/null +++ b/src/momask-preenc/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Chuan Guo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/momask-preenc/README.md b/src/momask-preenc/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4526635b2dbdf99b8b2b76ff63f883b0a12ecfdc --- /dev/null +++ b/src/momask-preenc/README.md @@ -0,0 +1,336 @@ +# MoMask: Generative Masked Modeling of 3D Human Motions (CVPR 2024) +### [[Project Page]](https://ericguo5513.github.io/momask) [[Paper]](https://arxiv.org/abs/2312.00063) [[Huggingface Demo]](https://huggingface.co/spaces/MeYourHint/MoMask) [[Colab Demo]](https://github.com/camenduru/MoMask-colab) +![teaser_image](https://ericguo5513.github.io/momask/static/images/teaser.png) + +## Pre-encoded Version + +This repository is a pre-encoded variant of MoMask. It is modified for workflows where motion tokens have already been produced by an external encoder, so the encoder and the generation models can be handled separately. + +The main added workflow trains the base RVQ layer generator with `train_t2m_transformer.py`, trains the residual RVQ layer generator with `train_res_transformer.py`, and writes generated token predictions with `predict_preenc.py`. This avoids repeatedly loading and running the encoder during generator training, which speeds up training for the masked and residual generation models. + +For the detailed pre-encoded data format and commands, see [docs/preenc_training.md](docs/preenc_training.md) and the [Pre-encoded Training and Prediction](#pre-encoded-training-and-prediction) section below. + +If you find our code or paper helpful, please consider starring our repository and citing: +``` +@inproceedings{guo2024momask, + title={Momask: Generative masked modeling of 3d human motions}, + author={Guo, Chuan and Mu, Yuxuan and Javed, Muhammad Gohar and Wang, Sen and Cheng, Li}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={1900--1910}, + year={2024} +} +``` + +## :postbox: News +📢 **2024-08-02** --- The [WebUI demo 🤗](https://huggingface.co/spaces/MeYourHint/MoMask) is now running smoothly on a CPU. No GPU is required to use MoMask. + +📢 **2024-02-26** --- 🔥🔥🔥 Congrats! MoMask is accepted to CVPR 2024. + +📢 **2024-01-12** --- Now you can use MoMask in Blender as an add-on. Thanks to [@makeinufilm](https://twitter.com/makeinufilm) for sharing the [tutorial](https://medium.com/@makeinufilm/notes-on-how-to-set-up-the-momask-environment-and-how-to-use-blenderaddon-6563f1abdbfa). + +📢 **2023-12-30** --- For easy WebUI BVH visulization, you could try this website [bvh2vrma](https://vrm-c.github.io/bvh2vrma/) from this [github](https://github.com/vrm-c/bvh2vrma?tab=readme-ov-file). + +📢 **2023-12-29** --- Thanks to Camenduru for supporting the [🤗Colab](https://github.com/camenduru/MoMask-colab) demo. + +📢 **2023-12-27** --- Release WebUI demo. Try now on [🤗HuggingFace](https://huggingface.co/spaces/MeYourHint/MoMask)! + +📢 **2023-12-19** --- Release scripts for temporal inpainting. + +📢 **2023-12-15** --- Release codes and models for momask. Including training/eval/generation scripts. + +📢 **2023-11-29** --- Initialized the webpage and git project. + + +## :round_pushpin: Get You Ready + +
+ +### 1. Conda Environment +``` +conda env create -f environment.yml +conda activate momask +pip install git+https://github.com/openai/CLIP.git +``` +We test our code on Python 3.7.13 and PyTorch 1.7.1 + +#### Alternative: Pip Installation +
+We provide an alternative pip installation in case you encounter difficulties setting up the conda environment. + +``` +pip install -r requirements.txt +``` +We test this installation on Python 3.10 + +
+ +### 2. Models and Dependencies + +#### Download Pre-trained Models +``` +bash prepare/download_models.sh +``` + +#### Download Evaluation Models and Gloves +For evaluation only. +``` +bash prepare/download_evaluator.sh +bash prepare/download_glove.sh +``` + +#### Troubleshooting +To address the download error related to gdown: "Cannot retrieve the public link of the file. You may need to change the permission to 'Anyone with the link', or have had many accesses". A potential solution is to run `pip install --upgrade --no-cache-dir gdown`, as suggested on https://github.com/wkentaro/gdown/issues/43. This should help resolve the issue. + +#### (Optional) Download Manually +Visit [[Google Drive]](https://drive.google.com/drive/folders/1sHajltuE2xgHh91H9pFpMAYAkHaX9o57?usp=drive_link) to download the models and evaluators mannually. + +### 3. Get Data + +You have two options here: +* **Skip getting data**, if you just want to generate motions using *own* descriptions. +* **Get full data**, if you want to *re-train* and *evaluate* the model. + +**(a). Full data (text + motion)** + +**HumanML3D** - Follow the instruction in [HumanML3D](https://github.com/EricGuo5513/HumanML3D.git), then copy the result dataset to our repository: +``` +cp -r ../HumanML3D/HumanML3D ./dataset/HumanML3D +``` +**KIT**-Download from [HumanML3D](https://github.com/EricGuo5513/HumanML3D.git), then place result in `./dataset/KIT-ML` + +#### + +
+ +## :rocket: Demo +
+ +### (a) Generate from a single prompt +``` +python gen_t2m.py --gpu_id 1 --ext exp1 --text_prompt "A person is running on a treadmill." +``` +### (b) Generate from a prompt file +An example of prompt file is given in `./assets/text_prompt.txt`. Please follow the format of `#` at each line. Motion length indicates the number of poses, which must be integeter and will be rounded by 4. In our work, motion is in 20 fps. + +If you write `#NA`, our model will determine a length. Note once there is **one** NA, all the others will be **NA** automatically. + +``` +python gen_t2m.py --gpu_id 1 --ext exp2 --text_path ./assets/text_prompt.txt +``` + + +A few more parameters you may be interested: +* `--repeat_times`: number of replications for generation, default `1`. +* `--motion_length`: specify the number of poses for generation, only applicable in (a). + +The output files are stored under folder `./generation//`. They are +* `numpy files`: generated motions with shape of (nframe, 22, 3), under subfolder `./joints`. +* `video files`: stick figure animation in mp4 format, under subfolder `./animation`. +* `bvh files`: bvh files of the generated motion, under subfolder `./animation`. + +We also apply naive foot ik to the generated motions, see files with suffix `_ik`. It sometimes works well, but sometimes will fail. + +
+ +## :dancers: Visualization +
+ +All the animations are manually rendered in blender. We use the characters from [mixamo](https://www.mixamo.com/#/). You need to download the characters in T-Pose with skeleton. + +### Retargeting +For retargeting, we found rokoko usually leads to large error on foot. On the other hand, [keemap.rig.transfer](https://github.com/nkeeline/Keemap-Blender-Rig-ReTargeting-Addon/releases) shows more precise retargetting. You could watch the [tutorial](https://www.youtube.com/watch?v=EG-VCMkVpxg) here. + +Following these steps: +* Download keemap.rig.transfer from the github, and install it in blender. +* Import both the motion files (.bvh) and character files (.fbx) in blender. +* `Shift + Select` the both source and target skeleton. (Do not need to be Rest Position) +* Switch to `Pose Mode`, then unfold the `KeeMapRig` tool at the top-right corner of the view window. +* For `bone mapping file`, direct to `./assets/mapping.json`(or `mapping6.json` if it doesn't work), and click `Read In Bone Mapping File`. This file is manually made by us. It works for most characters in mixamo. +* (Optional) You could manually fill in the bone mapping and adjust the rotations by your own, for your own character. `Save Bone Mapping File` can save the mapping configuration in local file, as specified by the mapping file path. +* Adjust the `Number of Samples`, `Source Rig`, `Destination Rig Name`. +* Clik `Transfer Animation from Source Destination`, wait a few seconds. + +We didn't tried other retargetting tools. Welcome to comment if you find others are more useful. + +### Scene + +We use this [scene](https://drive.google.com/file/d/16SbrnG9JsJ2w7UwCFmh10PcBdl6HxlrA/view?usp=drive_link) for animation. + + +
+ +## :clapper: Temporal Inpainting +
+We conduct mask-based editing in the m-transformer stage, followed by the regeneration of residual tokens for the entire sequence. To load your own motion, provide the path through `--source_motion`. Utilize `-msec` to specify the mask section, supporting either ratio or frame index. For instance, `-msec 0.3,0.6` with `max_motion_length=196` is equivalent to `-msec 59,118`, indicating the editing of the frame section [59, 118]. + +``` +python edit_t2m.py --gpu_id 1 --ext exp3 --use_res_model -msec 0.4,0.7 --text_prompt "A man picks something from the ground using his right hand." +``` + +Note: Presently, the source motion must adhere to the format of a HumanML3D dim-263 feature vector. An example motion vector data from the HumanML3D test set is available in `example_data/000612.npy`. To process your own motion data, you can utilize the `process_file` function from `utils/motion_process.py`. + +
+ +## :space_invader: Train Your Own Models +
+ + +**Note**: You have to train RVQ **BEFORE** training masked/residual transformers. The latter two can be trained simultaneously. + +### Train RVQ +You may also need to download evaluation models to run the scripts. +``` +python train_vq.py --name rvq_name --gpu_id 1 --dataset_name t2m --batch_size 256 --num_quantizers 6 --max_epoch 50 --quantize_dropout_prob 0.2 --gamma 0.05 +``` + +### Train Masked Transformer +``` +python train_t2m_transformer.py --name mtrans_name --gpu_id 2 --dataset_name t2m --batch_size 64 --vq_name rvq_name +``` + +### Train Residual Transformer +``` +python train_res_transformer.py --name rtrans_name --gpu_id 2 --dataset_name t2m --batch_size 64 --vq_name rvq_name --cond_drop_prob 0.2 --share_weight +``` + +### Pre-encoded Training and Prediction +This repository also supports a pre-encoded training workflow. It is designed for cases where the motion encoder has already produced discrete RVQ tokens, so the encoder and the generation models can be trained or run separately. Decoupling the encoder from the masked and residual generation models avoids repeatedly loading and running the encoder during generator training, which speeds up the training process for the generation models. + +The pre-encoded data is expected under `--preenc_dir`, with split folders selected by `--preenc_prefix` and `--preenc_suffix`. In this setup, `train_t2m_transformer.py` trains the base RVQ layer generator, and `train_res_transformer.py` trains the residual RVQ layer generator. + +Train the HML3D base RVQ layer: +``` +python train_t2m_transformer.py \ + --name my_preenc_t2m_exp_cos-anneal \ + --dataset_name t2m \ + --gpu_id 0 \ + --use_preenc \ + --preenc_dir ./dataset/enc_z_rvq \ + --preenc_prefix exp \ + --preenc_suffix recon_faceZ_mirror_wtextV3 \ + --code_dim 256 \ + --num_tokens 1024 \ + --batch_size 64 \ + --unit_length 1 +``` + +Train the HML3D residual RVQ layers: +``` +python train_res_transformer.py \ + --name my_preenc_exp_fix-hardcoded-mlen \ + --dataset_name t2m \ + --gpu_id 0 \ + --use_preenc \ + --preenc_dir ./dataset/enc_z_rvq \ + --preenc_prefix exp \ + --preenc_suffix recon_faceZ_mirror_wtextV3 \ + --code_dim 256 \ + --num_quantizers 6 \ + --num_tokens 1024 \ + --batch_size 64 \ + --unit_length 1 +``` + +Generate ZooV2 predictions from the trained pre-encoded models: +``` +python predict_preenc.py \ + --name my_preenc_animo_exp_260120 \ + --res_name my_preenc_animo-rvq_exp_260120 \ + --dataset_name t2m \ + --gpu_id 0 \ + --use_preenc \ + --preenc_dir ./dataset/enc_z_rvq \ + --preenc_prefix zooV2 \ + --preenc_suffix wtextV2_2026_01_20 \ + --output_dir ./output_predictions/output_predictions_2026_01_20 \ + --cond_scale 4 \ + --time_steps 18 \ + --temperature 1 \ + --topkr 0.9 \ + --unit_length 1 +``` + +Generate HML3D predictions from the trained pre-encoded models: +``` +python predict_preenc.py \ + --name my_preenc_t2m_exp_cos-anneal \ + --res_name my_preenc_exp_fix-hardcoded-mlen \ + --dataset_name t2m \ + --gpu_id 0 \ + --use_preenc \ + --preenc_dir ./dataset/enc_z_rvq \ + --preenc_prefix exp \ + --preenc_suffix recon_faceZ_mirror_wtextV3 \ + --output_dir ./output_predictions \ + --cond_scale 4 \ + --time_steps 18 \ + --temperature 1 \ + --topkr 0.9 \ + --unit_length 1 +``` + +* `--dataset_name`: motion dataset, `t2m` for HumanML3D and `kit` for KIT-ML. +* `--name`: name your model. This will create to model space as `./checkpoints//` +* `--gpu_id`: GPU id. +* `--batch_size`: we use `512` for rvq training. For masked/residual transformer, we use `64` on HumanML3D and `16` for KIT-ML. +* `--num_quantizers`: number of quantization layers, `6` is used in our case. +* `--quantize_drop_prob`: quantization dropout ratio, `0.2` is used. +* `--vq_name`: when training masked/residual transformer, you need to specify the name of rvq model for tokenization. +* `--cond_drop_prob`: condition drop ratio, for classifier-free guidance. `0.2` is used. +* `--share_weight`: whether to share the projection/embedding weights in residual transformer. + +All the pre-trained models and intermediate results will be saved in space `./checkpoints//`. +
+ +## :book: Evaluation +
+ +### Evaluate RVQ Reconstruction: +HumanML3D: +``` +python eval_t2m_vq.py --gpu_id 0 --name rvq_nq6_dc512_nc512_noshare_qdp0.2 --dataset_name t2m --ext rvq_nq6 + +``` +KIT-ML: +``` +python eval_t2m_vq.py --gpu_id 0 --name rvq_nq6_dc512_nc512_noshare_qdp0.2_k --dataset_name kit --ext rvq_nq6 +``` + +### Evaluate Text2motion Generation: +HumanML3D: +``` +python eval_t2m_trans_res.py --res_name tres_nlayer8_ld384_ff1024_rvq6ns_cdp0.2_sw --dataset_name t2m --name t2m_nlayer8_nhead6_ld384_ff1024_cdp0.1_rvq6ns --gpu_id 1 --cond_scale 4 --time_steps 10 --ext evaluation +``` +KIT-ML: +``` +python eval_t2m_trans_res.py --res_name tres_nlayer8_ld384_ff1024_rvq6ns_cdp0.2_sw_k --dataset_name kit --name t2m_nlayer8_nhead6_ld384_ff1024_cdp0.1_rvq6ns_k --gpu_id 0 --cond_scale 2 --time_steps 10 --ext evaluation +``` + +* `--res_name`: model name of `residual transformer`. +* `--name`: model name of `masked transformer`. +* `--cond_scale`: scale of classifer-free guidance. +* `--time_steps`: number of iterations for inference. +* `--ext`: filename for saving evaluation results. +* `--which_epoch`: checkpoint name of `masked transformer`. + +The final evaluation results will be saved in `./checkpoints///eval/.log` + +
+ +## Acknowlegements + +We sincerely thank the open-sourcing of these works where our code is based on: + +[deep-motion-editing](https://github.com/DeepMotionEditing/deep-motion-editing), [Muse](https://github.com/lucidrains/muse-maskgit-pytorch), [vector-quantize-pytorch](https://github.com/lucidrains/vector-quantize-pytorch), [T2M-GPT](https://github.com/Mael-zys/T2M-GPT), [MDM](https://github.com/GuyTevet/motion-diffusion-model/tree/main) and [MLD](https://github.com/ChenFengYe/motion-latent-diffusion/tree/main) + +## License +This code is distributed under an [MIT LICENSE](https://github.com/EricGuo5513/momask-codes/tree/main?tab=MIT-1-ov-file#readme). + +Note that our code depends on other libraries, including SMPL, SMPL-X, PyTorch3D, and uses datasets which each have their own respective licenses that must also be followed. + +### Misc +Contact cguo2@ualberta.ca for further questions. + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=EricGuo5513/momask-codes&type=Date)](https://star-history.com/#EricGuo5513/momask-codes&Date) diff --git a/src/momask-preenc/assets/mapping.json b/src/momask-preenc/assets/mapping.json new file mode 100644 index 0000000000000000000000000000000000000000..5e1bfe242ff6cee712c10b6efaa4e8ea2c3576ab --- /dev/null +++ b/src/momask-preenc/assets/mapping.json @@ -0,0 +1 @@ +{"bones": [{"name": "Hips", "label": "", "description": "", "SourceBoneName": "Hips", "DestinationBoneName": "mixamorig:Hips", "keyframe_this_bone": true, "CorrectionFactorX": 2.6179938316345215, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": true, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 0.2588190734386444, "QuatCorrectionFactorx": 0.965925931930542, "QuatCorrectionFactory": 2.7939677238464355e-09, "QuatCorrectionFactorz": -2.7939677238464355e-09, "scale_secondary_bone_name": ""}, {"name": "RightUpLeg", "label": "", "description": "", "SourceBoneName": "RightUpLeg", "DestinationBoneName": "mixamorig:RightUpLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftUpLeg", "label": "", "description": "", "SourceBoneName": "LeftUpLeg", "DestinationBoneName": "mixamorig:LeftUpLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightLeg", "label": "", "description": "", "SourceBoneName": "RightLeg", "DestinationBoneName": "mixamorig:RightLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 2.094395160675049, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftLeg", "label": "", "description": "", "SourceBoneName": "LeftLeg", "DestinationBoneName": "mixamorig:LeftLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 3.665191411972046, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightShoulder", "label": "", "description": "", "SourceBoneName": "RightShoulder", "DestinationBoneName": "mixamorig:RightShoulder", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftShoulder", "label": "", "description": "", "SourceBoneName": "LeftShoulder", "DestinationBoneName": "mixamorig:LeftShoulder", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightArm", "label": "", "description": "", "SourceBoneName": "RightArm", "DestinationBoneName": "mixamorig:RightArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": -1.0471975803375244, "CorrectionFactorZ": -0.1745329201221466, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftArm", "label": "", "description": "", "SourceBoneName": "LeftArm", "DestinationBoneName": "mixamorig:LeftArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 1.0471975803375244, "CorrectionFactorZ": 0.1745329201221466, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightForeArm", "label": "", "description": "", "SourceBoneName": "RightForeArm", "DestinationBoneName": "mixamorig:RightForeArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": -2.094395160675049, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftForeArm", "label": "", "description": "", "SourceBoneName": "LeftForeArm", "DestinationBoneName": "mixamorig:LeftForeArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 1.5707963705062866, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Spine", "label": "", "description": "", "SourceBoneName": "Spine", "DestinationBoneName": "mixamorig:Spine", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Spine1", "label": "", "description": "", "SourceBoneName": "Spine1", "DestinationBoneName": "mixamorig:Spine1", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Spine2", "label": "", "description": "", "SourceBoneName": "Spine2", "DestinationBoneName": "mixamorig:Spine2", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Neck", "label": "", "description": "", "SourceBoneName": "Neck", "DestinationBoneName": "mixamorig:Neck", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Head", "label": "", "description": "", "SourceBoneName": "Head", "DestinationBoneName": "mixamorig:Head", "keyframe_this_bone": true, "CorrectionFactorX": 0.3490658402442932, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightFoot", "label": "", "description": "", "SourceBoneName": "RightFoot", "DestinationBoneName": "mixamorig:RightFoot", "keyframe_this_bone": true, "CorrectionFactorX": -0.19192171096801758, "CorrectionFactorY": 2.979980945587158, "CorrectionFactorZ": -0.05134282633662224, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": -0.082771435379982, "QuatCorrectionFactorx": -0.0177358016371727, "QuatCorrectionFactory": -0.9920229315757751, "QuatCorrectionFactorz": -0.09340716898441315, "scale_secondary_bone_name": ""}, {"name": "LeftFoot", "label": "", "description": "", "SourceBoneName": "LeftFoot", "DestinationBoneName": "mixamorig:LeftFoot", "keyframe_this_bone": true, "CorrectionFactorX": -0.25592508912086487, "CorrectionFactorY": -2.936899423599243, "CorrectionFactorZ": 0.2450830191373825, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 0.11609010398387909, "QuatCorrectionFactorx": 0.10766097158193588, "QuatCorrectionFactory": -0.9808290004730225, "QuatCorrectionFactorz": -0.11360746622085571, "scale_secondary_bone_name": ""}], "start_frame_to_apply": 0, "number_of_frames_to_apply": 196, "keyframe_every_n_frames": 1, "source_rig_name": "bvh_batch1_sample30_repeat1_len48", "destination_rig_name": "Armature", "bone_rotation_mode": "EULER", "bone_mapping_file": "C:\\Users\\cguo2\\Documents\\CVPR2024_MoMask\\mapping.json"} \ No newline at end of file diff --git a/src/momask-preenc/assets/mapping6.json b/src/momask-preenc/assets/mapping6.json new file mode 100644 index 0000000000000000000000000000000000000000..2b80b1e7906190b79e67cc7870c4d57e27c9f00d --- /dev/null +++ b/src/momask-preenc/assets/mapping6.json @@ -0,0 +1 @@ +{"bones": [{"name": "Hips", "label": "", "description": "", "SourceBoneName": "Hips", "DestinationBoneName": "mixamorig6:Hips", "keyframe_this_bone": true, "CorrectionFactorX": 2.6179938316345215, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": true, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 0.2588190734386444, "QuatCorrectionFactorx": 0.965925931930542, "QuatCorrectionFactory": 2.7939677238464355e-09, "QuatCorrectionFactorz": -2.7939677238464355e-09, "scale_secondary_bone_name": ""}, {"name": "RightUpLeg", "label": "", "description": "", "SourceBoneName": "RightUpLeg", "DestinationBoneName": "mixamorig6:RightUpLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftUpLeg", "label": "", "description": "", "SourceBoneName": "LeftUpLeg", "DestinationBoneName": "mixamorig6:LeftUpLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightLeg", "label": "", "description": "", "SourceBoneName": "RightLeg", "DestinationBoneName": "mixamorig6:RightLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 2.094395160675049, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftLeg", "label": "", "description": "", "SourceBoneName": "LeftLeg", "DestinationBoneName": "mixamorig6:LeftLeg", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 3.665191411972046, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightShoulder", "label": "", "description": "", "SourceBoneName": "RightShoulder", "DestinationBoneName": "mixamorig6:RightShoulder", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftShoulder", "label": "", "description": "", "SourceBoneName": "LeftShoulder", "DestinationBoneName": "mixamorig6:LeftShoulder", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightArm", "label": "", "description": "", "SourceBoneName": "RightArm", "DestinationBoneName": "mixamorig6:RightArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": -1.0471975803375244, "CorrectionFactorZ": -0.1745329201221466, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftArm", "label": "", "description": "", "SourceBoneName": "LeftArm", "DestinationBoneName": "mixamorig6:LeftArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 1.0471975803375244, "CorrectionFactorZ": 0.1745329201221466, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "RightForeArm", "label": "", "description": "", "SourceBoneName": "RightForeArm", "DestinationBoneName": "mixamorig6:RightForeArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": -2.094395160675049, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "LeftForeArm", "label": "", "description": "", "SourceBoneName": "LeftForeArm", "DestinationBoneName": "mixamorig6:LeftForeArm", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 1.5707963705062866, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Spine", "label": "", "description": "", "SourceBoneName": "Spine", "DestinationBoneName": "mixamorig6:Spine", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Spine1", "label": "", "description": "", "SourceBoneName": "Spine1", "DestinationBoneName": "mixamorig6:Spine1", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Spine2", "label": "", "description": "", "SourceBoneName": "Spine2", "DestinationBoneName": "mixamorig6:Spine2", "keyframe_this_bone": true, "CorrectionFactorX": 0.0, "CorrectionFactorY": 0.0, "CorrectionFactorZ": 0.0, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 1.0, "QuatCorrectionFactorx": 0.0, "QuatCorrectionFactory": 0.0, "QuatCorrectionFactorz": 0.0, "scale_secondary_bone_name": ""}, {"name": "Neck", "label": "", "description": "", "SourceBoneName": "Neck", "DestinationBoneName": "mixamorig6:Neck", "keyframe_this_bone": true, "CorrectionFactorX": -0.994345486164093, "CorrectionFactorY": -0.006703000050038099, "CorrectionFactorZ": 0.04061730206012726, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 0.8787809014320374, "QuatCorrectionFactorx": -0.4767816960811615, "QuatCorrectionFactory": -0.01263047568500042, "QuatCorrectionFactorz": 0.016250507906079292, "scale_secondary_bone_name": ""}, {"name": "Head", "label": "", "description": "", "SourceBoneName": "Head", "DestinationBoneName": "mixamorig6:Head", "keyframe_this_bone": true, "CorrectionFactorX": -0.07639937847852707, "CorrectionFactorY": 0.011205507442355156, "CorrectionFactorZ": 0.011367863975465298, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": 0.9992374181747437, "QuatCorrectionFactorx": -0.038221005350351334, "QuatCorrectionFactory": 0.0053814793936908245, "QuatCorrectionFactorz": 0.005893632769584656, "scale_secondary_bone_name": ""}, {"name": "RightFoot", "label": "", "description": "", "SourceBoneName": "RightFoot", "DestinationBoneName": "mixamorig6:RightFoot", "keyframe_this_bone": true, "CorrectionFactorX": -0.17194896936416626, "CorrectionFactorY": 2.7372374534606934, "CorrectionFactorZ": -0.029542576521635056, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": -0.20128199458122253, "QuatCorrectionFactorx": 0.002824343740940094, "QuatCorrectionFactory": -0.9761614799499512, "QuatCorrectionFactorz": -0.08115538209676743, "scale_secondary_bone_name": ""}, {"name": "LeftFoot", "label": "", "description": "", "SourceBoneName": "LeftFoot", "DestinationBoneName": "mixamorig6:LeftFoot", "keyframe_this_bone": true, "CorrectionFactorX": -0.09363158047199249, "CorrectionFactorY": -2.9336421489715576, "CorrectionFactorZ": -0.17343592643737793, "has_twist_bone": false, "TwistBoneName": "", "set_bone_position": false, "set_bone_rotation": true, "bone_rotation_application_axis": "XYZ", "position_correction_factorX": 0.0, "position_correction_factorY": 0.0, "position_correction_factorZ": 0.0, "position_gain": 1.0, "position_pole_distance": 0.30000001192092896, "postion_type": "SINGLE_BONE_OFFSET", "set_bone_scale": false, "scale_gain": 1.0, "scale_max": 1.0, "scale_min": 0.5, "bone_scale_application_axis": "Y", "QuatCorrectionFactorw": -0.09925344586372375, "QuatCorrectionFactorx": 0.09088610112667084, "QuatCorrectionFactory": 0.9893556833267212, "QuatCorrectionFactorz": 0.05535021424293518, "scale_secondary_bone_name": ""}], "start_frame_to_apply": 0, "number_of_frames_to_apply": 196, "keyframe_every_n_frames": 1, "source_rig_name": "MoMask__02_ik", "destination_rig_name": "Armature", "bone_rotation_mode": "EULER", "bone_mapping_file": "C:\\Users\\cguo2\\Documents\\CVPR2024_MoMask\\mapping6.json"} \ No newline at end of file diff --git a/src/momask-preenc/assets/text_prompt.txt b/src/momask-preenc/assets/text_prompt.txt new file mode 100644 index 0000000000000000000000000000000000000000..eb310cda0fe9f293f97c4266f3bc39646351a6f7 --- /dev/null +++ b/src/momask-preenc/assets/text_prompt.txt @@ -0,0 +1,12 @@ +the person holds his left foot with his left hand, puts his right foot up and left hand up too.#132 +a man bends down and picks something up with his left hand.#84 +A man stands for few seconds and picks up his arms and shakes them.#176 +A person walks with a limp, their left leg get injured.#192 +a person jumps up and then lands.#52 +a person performs a standing back kick.#52 +A person pokes their right hand along the ground, like they might be planting seeds.#60 +the person steps forward and uses the left leg to kick something forward.#92 +the man walked forward, spun right on one foot and walked back to his original position.#92 +the person was pushed but did not fall.#124 +this person stumbles left and right while moving forward.#132 +a person reaching down and picking something up.#148 \ No newline at end of file diff --git a/src/momask-preenc/checkpoints/t2m/t2m_base/model/latest.tar b/src/momask-preenc/checkpoints/t2m/t2m_base/model/latest.tar new file mode 100644 index 0000000000000000000000000000000000000000..6fe6fc757c0bf6f6a3b307e211790988c6807a98 --- /dev/null +++ b/src/momask-preenc/checkpoints/t2m/t2m_base/model/latest.tar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b224118fc4c1e2c076b78f0add006e343a04adf3e2ecaabd3a2c9543e696d811 +size 153586023 diff --git a/src/momask-preenc/checkpoints/t2m/t2m_base/opt.txt b/src/momask-preenc/checkpoints/t2m/t2m_base/opt.txt new file mode 100644 index 0000000000000000000000000000000000000000..0919a357fcf0f3a44dd8a3035b614aa0ef787d77 --- /dev/null +++ b/src/momask-preenc/checkpoints/t2m/t2m_base/opt.txt @@ -0,0 +1,40 @@ +------------ Options ------------- +batch_size: 64 +checkpoints_dir: ./checkpoints +code_dim: 256 +cond_drop_prob: 0.1 +dataset_name: t2m +dropout: 0.2 +eval_every_e: 10 +ff_size: 1024 +force_mask: False +gamma: 0.1 +gpu_id: 0 +gumbel_sample: False +is_continue: False +is_train: True +latent_dim: 384 +log_every: 50 +lr: 0.0002 +lr_scheduler: cosine_annealing +max_epoch: 500 +max_motion_length: 196 +milestones: [50000] +n_heads: 6 +n_layers: 8 +name: my_preenc_t2m_exp_cos-anneal +num_quantizers: 6 +num_tokens: 1024 +preenc_dir: ./dataset/enc_z_rvq +preenc_prefix: exp +preenc_suffix: recon_faceZ_mirror_wtextV3 +preload_data: False +save_latest: 500 +seed: 3407 +share_weight: False +shared_codebook: False +unit_length: 1 +use_preenc: True +vq_name: rvq_nq1_dc512_nc512 +warm_up_iter: 2000 +-------------- End ---------------- diff --git a/src/momask-preenc/checkpoints/t2m/t2m_rvq/model/latest.tar b/src/momask-preenc/checkpoints/t2m/t2m_rvq/model/latest.tar new file mode 100644 index 0000000000000000000000000000000000000000..4812e279acb772fd24548d8459e0fe490f746869 --- /dev/null +++ b/src/momask-preenc/checkpoints/t2m/t2m_rvq/model/latest.tar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:046cfcb0905adb818ac360e81d9d22814eead80b631527a1c7c6fd005da004e9 +size 178484791 diff --git a/src/momask-preenc/checkpoints/t2m/t2m_rvq/opt.txt b/src/momask-preenc/checkpoints/t2m/t2m_rvq/opt.txt new file mode 100644 index 0000000000000000000000000000000000000000..665fb69f231c000b05616abc954911daaede908c --- /dev/null +++ b/src/momask-preenc/checkpoints/t2m/t2m_rvq/opt.txt @@ -0,0 +1,39 @@ +------------ Options ------------- +batch_size: 64 +checkpoints_dir: ./checkpoints +code_dim: 256 +cond_drop_prob: 0.1 +dataset_name: t2m +dropout: 0.2 +eval_every_e: 10 +ff_size: 1024 +force_mask: False +gamma: 0.1 +gpu_id: 0 +gumbel_sample: False +is_continue: False +is_train: True +latent_dim: 384 +log_every: 50 +lr: 0.0002 +max_epoch: 500 +max_motion_length: 196 +milestones: [50000] +n_heads: 6 +n_layers: 8 +name: my_preenc_exp_fix-hardcoded-mlen +num_quantizers: 6 +num_tokens: 1024 +preenc_dir: ./dataset/enc_z_rvq +preenc_prefix: exp +preenc_suffix: recon_faceZ_mirror_wtextV3 +preload_data: False +save_latest: 500 +seed: 3407 +share_weight: False +shared_codebook: False +unit_length: 1 +use_preenc: True +vq_name: rvq_nq1_dc512_nc512 +warm_up_iter: 2000 +-------------- End ---------------- diff --git a/src/momask-preenc/common/__init__.py b/src/momask-preenc/common/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/common/quaternion.py b/src/momask-preenc/common/quaternion.py new file mode 100644 index 0000000000000000000000000000000000000000..5051507c044d1bcd9e51b21af02f18113f3c4dad --- /dev/null +++ b/src/momask-preenc/common/quaternion.py @@ -0,0 +1,423 @@ +# Copyright (c) 2018-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# + +import torch +import numpy as np + +_EPS4 = np.finfo(float).eps * 4.0 + +_FLOAT_EPS = np.finfo(float).eps + +# PyTorch-backed implementations +def qinv(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + mask = torch.ones_like(q) + mask[..., 1:] = -mask[..., 1:] + return q * mask + + +def qinv_np(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + return qinv(torch.from_numpy(q).float()).numpy() + + +def qnormalize(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + return q / torch.norm(q, dim=-1, keepdim=True) + + +def qmul(q, r): + """ + Multiply quaternion(s) q with quaternion(s) r. + Expects two equally-sized tensors of shape (*, 4), where * denotes any number of dimensions. + Returns q*r as a tensor of shape (*, 4). + """ + assert q.shape[-1] == 4 + assert r.shape[-1] == 4 + + original_shape = q.shape + + # Compute outer product + terms = torch.bmm(r.view(-1, 4, 1), q.view(-1, 1, 4)) + + w = terms[:, 0, 0] - terms[:, 1, 1] - terms[:, 2, 2] - terms[:, 3, 3] + x = terms[:, 0, 1] + terms[:, 1, 0] - terms[:, 2, 3] + terms[:, 3, 2] + y = terms[:, 0, 2] + terms[:, 1, 3] + terms[:, 2, 0] - terms[:, 3, 1] + z = terms[:, 0, 3] - terms[:, 1, 2] + terms[:, 2, 1] + terms[:, 3, 0] + return torch.stack((w, x, y, z), dim=1).view(original_shape) + + +def qrot(q, v): + """ + Rotate vector(s) v about the rotation described by quaternion(s) q. + Expects a tensor of shape (*, 4) for q and a tensor of shape (*, 3) for v, + where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + assert q.shape[-1] == 4 + assert v.shape[-1] == 3 + assert q.shape[:-1] == v.shape[:-1] + + original_shape = list(v.shape) + # print(q.shape) + q = q.contiguous().view(-1, 4) + v = v.contiguous().view(-1, 3) + + qvec = q[:, 1:] + uv = torch.cross(qvec, v, dim=1) + uuv = torch.cross(qvec, uv, dim=1) + return (v + 2 * (q[:, :1] * uv + uuv)).view(original_shape) + + +def qeuler(q, order, epsilon=0, deg=True): + """ + Convert quaternion(s) q to Euler angles. + Expects a tensor of shape (*, 4), where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + assert q.shape[-1] == 4 + + original_shape = list(q.shape) + original_shape[-1] = 3 + q = q.view(-1, 4) + + q0 = q[:, 0] + q1 = q[:, 1] + q2 = q[:, 2] + q3 = q[:, 3] + + if order == 'xyz': + x = torch.atan2(2 * (q0 * q1 - q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + y = torch.asin(torch.clamp(2 * (q1 * q3 + q0 * q2), -1 + epsilon, 1 - epsilon)) + z = torch.atan2(2 * (q0 * q3 - q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + elif order == 'yzx': + x = torch.atan2(2 * (q0 * q1 - q2 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + y = torch.atan2(2 * (q0 * q2 - q1 * q3), 1 - 2 * (q2 * q2 + q3 * q3)) + z = torch.asin(torch.clamp(2 * (q1 * q2 + q0 * q3), -1 + epsilon, 1 - epsilon)) + elif order == 'zxy': + x = torch.asin(torch.clamp(2 * (q0 * q1 + q2 * q3), -1 + epsilon, 1 - epsilon)) + y = torch.atan2(2 * (q0 * q2 - q1 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + z = torch.atan2(2 * (q0 * q3 - q1 * q2), 1 - 2 * (q1 * q1 + q3 * q3)) + elif order == 'xzy': + x = torch.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + y = torch.atan2(2 * (q0 * q2 + q1 * q3), 1 - 2 * (q2 * q2 + q3 * q3)) + z = torch.asin(torch.clamp(2 * (q0 * q3 - q1 * q2), -1 + epsilon, 1 - epsilon)) + elif order == 'yxz': + x = torch.asin(torch.clamp(2 * (q0 * q1 - q2 * q3), -1 + epsilon, 1 - epsilon)) + y = torch.atan2(2 * (q1 * q3 + q0 * q2), 1 - 2 * (q1 * q1 + q2 * q2)) + z = torch.atan2(2 * (q1 * q2 + q0 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + elif order == 'zyx': + x = torch.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + y = torch.asin(torch.clamp(2 * (q0 * q2 - q1 * q3), -1 + epsilon, 1 - epsilon)) + z = torch.atan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + else: + raise + + if deg: + return torch.stack((x, y, z), dim=1).view(original_shape) * 180 / np.pi + else: + return torch.stack((x, y, z), dim=1).view(original_shape) + + +# Numpy-backed implementations + +def qmul_np(q, r): + q = torch.from_numpy(q).contiguous().float() + r = torch.from_numpy(r).contiguous().float() + return qmul(q, r).numpy() + + +def qrot_np(q, v): + q = torch.from_numpy(q).contiguous().float() + v = torch.from_numpy(v).contiguous().float() + return qrot(q, v).numpy() + + +def qeuler_np(q, order, epsilon=0, use_gpu=False): + if use_gpu: + q = torch.from_numpy(q).cuda().float() + return qeuler(q, order, epsilon).cpu().numpy() + else: + q = torch.from_numpy(q).contiguous().float() + return qeuler(q, order, epsilon).numpy() + + +def qfix(q): + """ + Enforce quaternion continuity across the time dimension by selecting + the representation (q or -q) with minimal distance (or, equivalently, maximal dot product) + between two consecutive frames. + + Expects a tensor of shape (L, J, 4), where L is the sequence length and J is the number of joints. + Returns a tensor of the same shape. + """ + assert len(q.shape) == 3 + assert q.shape[-1] == 4 + + result = q.copy() + dot_products = np.sum(q[1:] * q[:-1], axis=2) + mask = dot_products < 0 + mask = (np.cumsum(mask, axis=0) % 2).astype(bool) + result[1:][mask] *= -1 + return result + + +def euler2quat(e, order, deg=True): + """ + Convert Euler angles to quaternions. + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + + e = e.view(-1, 3) + + ## if euler angles in degrees + if deg: + e = e * np.pi / 180. + + x = e[:, 0] + y = e[:, 1] + z = e[:, 2] + + rx = torch.stack((torch.cos(x / 2), torch.sin(x / 2), torch.zeros_like(x), torch.zeros_like(x)), dim=1) + ry = torch.stack((torch.cos(y / 2), torch.zeros_like(y), torch.sin(y / 2), torch.zeros_like(y)), dim=1) + rz = torch.stack((torch.cos(z / 2), torch.zeros_like(z), torch.zeros_like(z), torch.sin(z / 2)), dim=1) + + result = None + for coord in order: + if coord == 'x': + r = rx + elif coord == 'y': + r = ry + elif coord == 'z': + r = rz + else: + raise + if result is None: + result = r + else: + result = qmul(result, r) + + # Reverse antipodal representation to have a non-negative "w" + if order in ['xyz', 'yzx', 'zxy']: + result *= -1 + + return result.view(original_shape) + + +def expmap_to_quaternion(e): + """ + Convert axis-angle rotations (aka exponential maps) to quaternions. + Stable formula from "Practical Parameterization of Rotations Using the Exponential Map". + Expects a tensor of shape (*, 3), where * denotes any number of dimensions. + Returns a tensor of shape (*, 4). + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + e = e.reshape(-1, 3) + + theta = np.linalg.norm(e, axis=1).reshape(-1, 1) + w = np.cos(0.5 * theta).reshape(-1, 1) + xyz = 0.5 * np.sinc(0.5 * theta / np.pi) * e + return np.concatenate((w, xyz), axis=1).reshape(original_shape) + + +def euler_to_quaternion(e, order): + """ + Convert Euler angles to quaternions. + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + + e = e.reshape(-1, 3) + + x = e[:, 0] + y = e[:, 1] + z = e[:, 2] + + rx = np.stack((np.cos(x / 2), np.sin(x / 2), np.zeros_like(x), np.zeros_like(x)), axis=1) + ry = np.stack((np.cos(y / 2), np.zeros_like(y), np.sin(y / 2), np.zeros_like(y)), axis=1) + rz = np.stack((np.cos(z / 2), np.zeros_like(z), np.zeros_like(z), np.sin(z / 2)), axis=1) + + result = None + for coord in order: + if coord == 'x': + r = rx + elif coord == 'y': + r = ry + elif coord == 'z': + r = rz + else: + raise + if result is None: + result = r + else: + result = qmul_np(result, r) + + # Reverse antipodal representation to have a non-negative "w" + if order in ['xyz', 'yzx', 'zxy']: + result *= -1 + + return result.reshape(original_shape) + + +def quaternion_to_matrix(quaternions): + """ + Convert rotations given as quaternions to rotation matrices. + Args: + quaternions: quaternions with real part first, + as tensor of shape (..., 4). + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + r, i, j, k = torch.unbind(quaternions, -1) + two_s = 2.0 / (quaternions * quaternions).sum(-1) + + o = torch.stack( + ( + 1 - two_s * (j * j + k * k), + two_s * (i * j - k * r), + two_s * (i * k + j * r), + two_s * (i * j + k * r), + 1 - two_s * (i * i + k * k), + two_s * (j * k - i * r), + two_s * (i * k - j * r), + two_s * (j * k + i * r), + 1 - two_s * (i * i + j * j), + ), + -1, + ) + return o.reshape(quaternions.shape[:-1] + (3, 3)) + + +def quaternion_to_matrix_np(quaternions): + q = torch.from_numpy(quaternions).contiguous().float() + return quaternion_to_matrix(q).numpy() + + +def quaternion_to_cont6d_np(quaternions): + rotation_mat = quaternion_to_matrix_np(quaternions) + cont_6d = np.concatenate([rotation_mat[..., 0], rotation_mat[..., 1]], axis=-1) + return cont_6d + + +def quaternion_to_cont6d(quaternions): + rotation_mat = quaternion_to_matrix(quaternions) + cont_6d = torch.cat([rotation_mat[..., 0], rotation_mat[..., 1]], dim=-1) + return cont_6d + + +def cont6d_to_matrix(cont6d): + assert cont6d.shape[-1] == 6, "The last dimension must be 6" + x_raw = cont6d[..., 0:3] + y_raw = cont6d[..., 3:6] + + x = x_raw / torch.norm(x_raw, dim=-1, keepdim=True) + z = torch.cross(x, y_raw, dim=-1) + z = z / torch.norm(z, dim=-1, keepdim=True) + + y = torch.cross(z, x, dim=-1) + + x = x[..., None] + y = y[..., None] + z = z[..., None] + + mat = torch.cat([x, y, z], dim=-1) + return mat + + +def cont6d_to_matrix_np(cont6d): + q = torch.from_numpy(cont6d).contiguous().float() + return cont6d_to_matrix(q).numpy() + + +def qpow(q0, t, dtype=torch.float): + ''' q0 : tensor of quaternions + t: tensor of powers + ''' + q0 = qnormalize(q0) + theta0 = torch.acos(q0[..., 0]) + + ## if theta0 is close to zero, add epsilon to avoid NaNs + mask = (theta0 <= 10e-10) * (theta0 >= -10e-10) + theta0 = (1 - mask) * theta0 + mask * 10e-10 + v0 = q0[..., 1:] / torch.sin(theta0).view(-1, 1) + + if isinstance(t, torch.Tensor): + q = torch.zeros(t.shape + q0.shape) + theta = t.view(-1, 1) * theta0.view(1, -1) + else: ## if t is a number + q = torch.zeros(q0.shape) + theta = t * theta0 + + q[..., 0] = torch.cos(theta) + q[..., 1:] = v0 * torch.sin(theta).unsqueeze(-1) + + return q.to(dtype) + + +def qslerp(q0, q1, t): + ''' + q0: starting quaternion + q1: ending quaternion + t: array of points along the way + + Returns: + Tensor of Slerps: t.shape + q0.shape + ''' + + q0 = qnormalize(q0) + q1 = qnormalize(q1) + q_ = qpow(qmul(q1, qinv(q0)), t) + + return qmul(q_, + q0.contiguous().view(torch.Size([1] * len(t.shape)) + q0.shape).expand(t.shape + q0.shape).contiguous()) + + +def qbetween(v0, v1): + ''' + find the quaternion used to rotate v0 to v1 + ''' + assert v0.shape[-1] == 3, 'v0 must be of the shape (*, 3)' + assert v1.shape[-1] == 3, 'v1 must be of the shape (*, 3)' + + v = torch.cross(v0, v1) + w = torch.sqrt((v0 ** 2).sum(dim=-1, keepdim=True) * (v1 ** 2).sum(dim=-1, keepdim=True)) + (v0 * v1).sum(dim=-1, + keepdim=True) + return qnormalize(torch.cat([w, v], dim=-1)) + + +def qbetween_np(v0, v1): + ''' + find the quaternion used to rotate v0 to v1 + ''' + assert v0.shape[-1] == 3, 'v0 must be of the shape (*, 3)' + assert v1.shape[-1] == 3, 'v1 must be of the shape (*, 3)' + + v0 = torch.from_numpy(v0).float() + v1 = torch.from_numpy(v1).float() + return qbetween(v0, v1).numpy() + + +def lerp(p0, p1, t): + if not isinstance(t, torch.Tensor): + t = torch.Tensor([t]) + + new_shape = t.shape + p0.shape + new_view_t = t.shape + torch.Size([1] * len(p0.shape)) + new_view_p = torch.Size([1] * len(t.shape)) + p0.shape + p0 = p0.view(new_view_p).expand(new_shape) + p1 = p1.view(new_view_p).expand(new_shape) + t = t.view(new_view_t).expand(new_shape) + + return p0 + t * (p1 - p0) diff --git a/src/momask-preenc/common/skeleton.py b/src/momask-preenc/common/skeleton.py new file mode 100644 index 0000000000000000000000000000000000000000..62f0c86d8a2a1aff5b163394c794160b0c9cf190 --- /dev/null +++ b/src/momask-preenc/common/skeleton.py @@ -0,0 +1,199 @@ +from common.quaternion import * +import scipy.ndimage.filters as filters + +class Skeleton(object): + def __init__(self, offset, kinematic_tree, device): + self.device = device + self._raw_offset_np = offset.numpy() + self._raw_offset = offset.clone().detach().to(device).float() + self._kinematic_tree = kinematic_tree + self._offset = None + self._parents = [0] * len(self._raw_offset) + self._parents[0] = -1 + for chain in self._kinematic_tree: + for j in range(1, len(chain)): + self._parents[chain[j]] = chain[j-1] + + def njoints(self): + return len(self._raw_offset) + + def offset(self): + return self._offset + + def set_offset(self, offsets): + self._offset = offsets.clone().detach().to(self.device).float() + + def kinematic_tree(self): + return self._kinematic_tree + + def parents(self): + return self._parents + + # joints (batch_size, joints_num, 3) + def get_offsets_joints_batch(self, joints): + assert len(joints.shape) == 3 + _offsets = self._raw_offset.expand(joints.shape[0], -1, -1).clone() + for i in range(1, self._raw_offset.shape[0]): + _offsets[:, i] = torch.norm(joints[:, i] - joints[:, self._parents[i]], p=2, dim=1)[:, None] * _offsets[:, i] + + self._offset = _offsets.detach() + return _offsets + + # joints (joints_num, 3) + def get_offsets_joints(self, joints): + assert len(joints.shape) == 2 + _offsets = self._raw_offset.clone() + for i in range(1, self._raw_offset.shape[0]): + # print(joints.shape) + _offsets[i] = torch.norm(joints[i] - joints[self._parents[i]], p=2, dim=0) * _offsets[i] + + self._offset = _offsets.detach() + return _offsets + + # face_joint_idx should follow the order of right hip, left hip, right shoulder, left shoulder + # joints (batch_size, joints_num, 3) + def inverse_kinematics_np(self, joints, face_joint_idx, smooth_forward=False): + assert len(face_joint_idx) == 4 + '''Get Forward Direction''' + l_hip, r_hip, sdr_r, sdr_l = face_joint_idx + across1 = joints[:, r_hip] - joints[:, l_hip] + across2 = joints[:, sdr_r] - joints[:, sdr_l] + across = across1 + across2 + across = across / np.sqrt((across**2).sum(axis=-1))[:, np.newaxis] + # print(across1.shape, across2.shape) + + # forward (batch_size, 3) + forward = np.cross(np.array([[0, 1, 0]]), across, axis=-1) + if smooth_forward: + forward = filters.gaussian_filter1d(forward, 20, axis=0, mode='nearest') + # forward (batch_size, 3) + forward = forward / np.sqrt((forward**2).sum(axis=-1))[..., np.newaxis] + + '''Get Root Rotation''' + target = np.array([[0,0,1]]).repeat(len(forward), axis=0) + root_quat = qbetween_np(forward, target) + + '''Inverse Kinematics''' + # quat_params (batch_size, joints_num, 4) + # print(joints.shape[:-1]) + quat_params = np.zeros(joints.shape[:-1] + (4,)) + # print(quat_params.shape) + root_quat[0] = np.array([[1.0, 0.0, 0.0, 0.0]]) + quat_params[:, 0] = root_quat + # quat_params[0, 0] = np.array([[1.0, 0.0, 0.0, 0.0]]) + for chain in self._kinematic_tree: + R = root_quat + for j in range(len(chain) - 1): + # (batch, 3) + u = self._raw_offset_np[chain[j+1]][np.newaxis,...].repeat(len(joints), axis=0) + # print(u.shape) + # (batch, 3) + v = joints[:, chain[j+1]] - joints[:, chain[j]] + v = v / np.sqrt((v**2).sum(axis=-1))[:, np.newaxis] + # print(u.shape, v.shape) + rot_u_v = qbetween_np(u, v) + + R_loc = qmul_np(qinv_np(R), rot_u_v) + + quat_params[:,chain[j + 1], :] = R_loc + R = qmul_np(R, R_loc) + + return quat_params + + # Be sure root joint is at the beginning of kinematic chains + def forward_kinematics(self, quat_params, root_pos, skel_joints=None, do_root_R=True): + # quat_params (batch_size, joints_num, 4) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(quat_params.shape[0], -1, -1) + joints = torch.zeros(quat_params.shape[:-1] + (3,)).to(self.device) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + R = quat_params[:, 0] + else: + R = torch.tensor([[1.0, 0.0, 0.0, 0.0]]).expand(len(quat_params), -1).detach().to(self.device) + for i in range(1, len(chain)): + R = qmul(R, quat_params[:, chain[i]]) + offset_vec = offsets[:, chain[i]] + joints[:, chain[i]] = qrot(R, offset_vec) + joints[:, chain[i-1]] + return joints + + # Be sure root joint is at the beginning of kinematic chains + def forward_kinematics_np(self, quat_params, root_pos, skel_joints=None, do_root_R=True): + # quat_params (batch_size, joints_num, 4) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(quat_params.shape[0], -1, -1) + offsets = offsets.numpy() + joints = np.zeros(quat_params.shape[:-1] + (3,)) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + R = quat_params[:, 0] + else: + R = np.array([[1.0, 0.0, 0.0, 0.0]]).repeat(len(quat_params), axis=0) + for i in range(1, len(chain)): + R = qmul_np(R, quat_params[:, chain[i]]) + offset_vec = offsets[:, chain[i]] + joints[:, chain[i]] = qrot_np(R, offset_vec) + joints[:, chain[i - 1]] + return joints + + def forward_kinematics_cont6d_np(self, cont6d_params, root_pos, skel_joints=None, do_root_R=True): + # cont6d_params (batch_size, joints_num, 6) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(cont6d_params.shape[0], -1, -1) + offsets = offsets.numpy() + joints = np.zeros(cont6d_params.shape[:-1] + (3,)) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + matR = cont6d_to_matrix_np(cont6d_params[:, 0]) + else: + matR = np.eye(3)[np.newaxis, :].repeat(len(cont6d_params), axis=0) + for i in range(1, len(chain)): + matR = np.matmul(matR, cont6d_to_matrix_np(cont6d_params[:, chain[i]])) + offset_vec = offsets[:, chain[i]][..., np.newaxis] + # print(matR.shape, offset_vec.shape) + joints[:, chain[i]] = np.matmul(matR, offset_vec).squeeze(-1) + joints[:, chain[i-1]] + return joints + + def forward_kinematics_cont6d(self, cont6d_params, root_pos, skel_joints=None, do_root_R=True): + # cont6d_params (batch_size, joints_num, 6) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + # skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(cont6d_params.shape[0], -1, -1) + joints = torch.zeros(cont6d_params.shape[:-1] + (3,)).to(cont6d_params.device) + joints[..., 0, :] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + matR = cont6d_to_matrix(cont6d_params[:, 0]) + else: + matR = torch.eye(3).expand((len(cont6d_params), -1, -1)).detach().to(cont6d_params.device) + for i in range(1, len(chain)): + matR = torch.matmul(matR, cont6d_to_matrix(cont6d_params[:, chain[i]])) + offset_vec = offsets[:, chain[i]].unsqueeze(-1) + # print(matR.shape, offset_vec.shape) + joints[:, chain[i]] = torch.matmul(matR, offset_vec).squeeze(-1) + joints[:, chain[i-1]] + return joints + + + + + diff --git a/src/momask-preenc/data/__init__.py b/src/momask-preenc/data/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/data/preenc_dataset.py b/src/momask-preenc/data/preenc_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..3af7d3b75ef3e97890b8ec4d098a846d5de790bb --- /dev/null +++ b/src/momask-preenc/data/preenc_dataset.py @@ -0,0 +1,154 @@ +""" +Pre-encoded Dataset for training without VQ model +Loads pre-computed code_idx and all_codes from .pt files +""" +import os +from os.path import join as pjoin +import torch +from torch.utils import data +from tqdm import tqdm +import random + + +class PreEncodedDataset(data.Dataset): + """ + Dataset that loads pre-encoded motion tokens from .pt files + Each .pt file contains: + - code_idx: (seq_len, num_quantizers) - discrete tokens + - all_codes: (seq_len, num_quantizers, code_dim) - continuous codes + - text: dict with 'caption', 'tokens', etc. + - m_len: motion length + """ + def __init__(self, opt, split='train'): + self.opt = opt + self.max_motion_length = opt.max_motion_length + self.unit_length = opt.unit_length + + # Build the path to pre-encoded data + self.data_dir = pjoin(opt.preenc_dir, f'{opt.preenc_prefix}_{split}_{opt.preenc_suffix}') + + if not os.path.exists(self.data_dir): + raise ValueError(f"Pre-encoded data directory not found: {self.data_dir}") + + # Get all .pt files except preprocess_config.pt and meta_info.pt + self.file_list = [] + for f in os.listdir(self.data_dir): + if f.endswith('.pt') and f not in ['preprocess_config.pt', 'meta_info.pt']: + self.file_list.append(f) + + self.file_list.sort() + + # Optionally filter by split file + if hasattr(opt, 'split_file') and opt.split_file: + id_list = [] + with open(opt.split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + # Filter files that match the split + self.file_list = [f for f in self.file_list if f.replace('.pt', '') in id_list] + + print(f"[PreEncodedDataset] Loaded {len(self.file_list)} samples from {self.data_dir}") + + # Optionally preload all data into memory + self.preload = getattr(opt, 'preload_data', False) + if self.preload: + print("Preloading all data into memory...") + self.data_cache = {} + for fname in tqdm(self.file_list): + fpath = pjoin(self.data_dir, fname) + self.data_cache[fname] = torch.load(fpath, map_location='cpu') + + def __len__(self): + return len(self.file_list) + + def __getitem__(self, item): + fname = self.file_list[item] + + if self.preload: + data = self.data_cache[fname] + else: + fpath = pjoin(self.data_dir, fname) + data = torch.load(fpath, map_location='cpu') + + try: + code_idx = data['code_idx'] # (seq_len, num_quantizers) + all_codes = data['all_codes'] # (seq_len, num_quantizers, code_dim) + text_data = data['text'] + m_len = data['m_len'] + except Exception as e: + print("Error loading data from file:", fname, e) + # Get caption + caption = text_data['caption'] if isinstance(text_data, dict) else text_data + + # Calculate token length (already downsampled by VQ encoder) + # code_idx shape is already the token sequence length + token_len = code_idx.shape[0] + + # Ensure token_len aligns with unit_length (though it should already be) + # max_token_length = self.max_motion_length // self.unit_length + max_token_length = self.max_motion_length // self.unit_length + # Pad or truncate if necessary + if token_len > max_token_length: + # Truncate + code_idx = code_idx[:max_token_length] + all_codes = all_codes[:max_token_length] + token_len = max_token_length + elif token_len < max_token_length: + # Pad with zeros + pad_len = max_token_length - token_len + code_idx = torch.cat([ + code_idx, + torch.zeros(pad_len, code_idx.shape[1], dtype=code_idx.dtype) + ], dim=0) + all_codes = torch.cat([ + all_codes, + torch.zeros(pad_len, all_codes.shape[1], all_codes.shape[2], dtype=all_codes.dtype) + ], dim=0) + + return caption, code_idx, all_codes, token_len + + +class PreEncodedDatasetForInference(data.Dataset): + """ + Dataset for inference that returns full text information and filename. + Does NOT pad/truncate - returns original data for each sample. + + Returns: + - fname: filename (str) + - code_idx: (seq_len, num_quantizers) - discrete tokens + - all_codes: (seq_len, num_quantizers, code_dim) - continuous codes + - m_len: original motion length (int) + - text: full text dict with 'caption', 'tokens', etc. + """ + def __init__(self, opt, split='test'): + self.opt = opt + + # Build the path to pre-encoded data + self.data_dir = pjoin(opt.preenc_dir, f'{opt.preenc_prefix}_{split}_{opt.preenc_suffix}') + + if not os.path.exists(self.data_dir): + raise ValueError(f"Pre-encoded data directory not found: {self.data_dir}") + + # Get all .pt files except preprocess_config.pt and meta_info.pt + self.file_list = [] + for f in os.listdir(self.data_dir): + if f.endswith('.pt') and f not in ['preprocess_config.pt', 'meta_info.pt']: + self.file_list.append(f) + + self.file_list.sort() + print(f"[PreEncodedDatasetForInference] Loaded {len(self.file_list)} samples from {self.data_dir}") + + def __len__(self): + return len(self.file_list) + + def __getitem__(self, item): + fname = self.file_list[item] + fpath = pjoin(self.data_dir, fname) + data = torch.load(fpath, map_location='cpu') + + code_idx = data['code_idx'] # (seq_len, num_quantizers) + all_codes = data['all_codes'] # (seq_len, num_quantizers, code_dim) + text_data = data['text'] # Full text dict + m_len = data['m_len'] + + return fname, code_idx, all_codes, m_len, text_data \ No newline at end of file diff --git a/src/momask-preenc/data/t2m_dataset.py b/src/momask-preenc/data/t2m_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..38f952a5970a9a5f16074d1c621c1b9e2f4f6574 --- /dev/null +++ b/src/momask-preenc/data/t2m_dataset.py @@ -0,0 +1,348 @@ +from os.path import join as pjoin +import torch +from torch.utils import data +import numpy as np +from tqdm import tqdm +from torch.utils.data._utils.collate import default_collate +import random +import codecs as cs + + +def collate_fn(batch): + batch.sort(key=lambda x: x[3], reverse=True) + return default_collate(batch) + +class MotionDataset(data.Dataset): + def __init__(self, opt, mean, std, split_file): + self.opt = opt + joints_num = opt.joints_num + + self.data = [] + self.lengths = [] + id_list = [] + with open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if motion.shape[0] < opt.window_size: + continue + self.lengths.append(motion.shape[0] - opt.window_size) + self.data.append(motion) + except Exception as e: + # Some motion may not exist in KIT dataset + print(e) + pass + + self.cumsum = np.cumsum([0] + self.lengths) + + if opt.is_train: + # root_rot_velocity (B, seq_len, 1) + std[0:1] = std[0:1] / opt.feat_bias + # root_linear_velocity (B, seq_len, 2) + std[1:3] = std[1:3] / opt.feat_bias + # root_y (B, seq_len, 1) + std[3:4] = std[3:4] / opt.feat_bias + # ric_data (B, seq_len, (joint_num - 1)*3) + std[4: 4 + (joints_num - 1) * 3] = std[4: 4 + (joints_num - 1) * 3] / 1.0 + # rot_data (B, seq_len, (joint_num - 1)*6) + std[4 + (joints_num - 1) * 3: 4 + (joints_num - 1) * 9] = std[4 + (joints_num - 1) * 3: 4 + ( + joints_num - 1) * 9] / 1.0 + # local_velocity (B, seq_len, joint_num*3) + std[4 + (joints_num - 1) * 9: 4 + (joints_num - 1) * 9 + joints_num * 3] = std[ + 4 + (joints_num - 1) * 9: 4 + ( + joints_num - 1) * 9 + joints_num * 3] / 1.0 + # foot contact (B, seq_len, 4) + std[4 + (joints_num - 1) * 9 + joints_num * 3:] = std[ + 4 + ( + joints_num - 1) * 9 + joints_num * 3:] / opt.feat_bias + + assert 4 + (joints_num - 1) * 9 + joints_num * 3 + 4 == mean.shape[-1] + np.save(pjoin(opt.meta_dir, 'mean.npy'), mean) + np.save(pjoin(opt.meta_dir, 'std.npy'), std) + + self.mean = mean + self.std = std + print("Total number of motions {}, snippets {}".format(len(self.data), self.cumsum[-1])) + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return self.cumsum[-1] + + def __getitem__(self, item): + if item != 0: + motion_id = np.searchsorted(self.cumsum, item) - 1 + idx = item - self.cumsum[motion_id] - 1 + else: + motion_id = 0 + idx = 0 + motion = self.data[motion_id][idx:idx + self.opt.window_size] + "Z Normalization" + motion = (motion - self.mean) / self.std + + return motion + + +class Text2MotionDatasetEval(data.Dataset): + def __init__(self, opt, mean, std, split_file, w_vectorizer): + self.opt = opt + self.w_vectorizer = w_vectorizer + self.max_length = 20 + self.pointer = 0 + self.max_motion_length = opt.max_motion_length + min_motion_len = 40 if self.opt.dataset_name =='t2m' else 24 + + data_dict = {} + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + # id_list = id_list[:250] + + new_name_list = [] + length_list = [] + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if (len(motion)) < min_motion_len or (len(motion) >= 200): + continue + text_data = [] + flag = False + with cs.open(pjoin(opt.text_dir, name + '.txt')) as f: + for line in f.readlines(): + text_dict = {} + line_split = line.strip().split('#') + caption = line_split[0] + tokens = line_split[1].split(' ') + f_tag = float(line_split[2]) + to_tag = float(line_split[3]) + f_tag = 0.0 if np.isnan(f_tag) else f_tag + to_tag = 0.0 if np.isnan(to_tag) else to_tag + + text_dict['caption'] = caption + text_dict['tokens'] = tokens + if f_tag == 0.0 and to_tag == 0.0: + flag = True + text_data.append(text_dict) + else: + try: + n_motion = motion[int(f_tag*20) : int(to_tag*20)] + if (len(n_motion)) < min_motion_len or (len(n_motion) >= 200): + continue + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + while new_name in data_dict: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + data_dict[new_name] = {'motion': n_motion, + 'length': len(n_motion), + 'text':[text_dict]} + new_name_list.append(new_name) + length_list.append(len(n_motion)) + except: + print(line_split) + print(line_split[2], line_split[3], f_tag, to_tag, name) + # break + + if flag: + data_dict[name] = {'motion': motion, + 'length': len(motion), + 'text': text_data} + new_name_list.append(name) + length_list.append(len(motion)) + except: + pass + + name_list, length_list = zip(*sorted(zip(new_name_list, length_list), key=lambda x: x[1])) + + self.mean = mean + self.std = std + self.length_arr = np.array(length_list) + self.data_dict = data_dict + self.name_list = name_list + self.reset_max_len(self.max_length) + + def reset_max_len(self, length): + assert length <= self.max_motion_length + self.pointer = np.searchsorted(self.length_arr, length) + print("Pointer Pointing at %d"%self.pointer) + self.max_length = length + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) - self.pointer + + def __getitem__(self, item): + idx = self.pointer + item + data = self.data_dict[self.name_list[idx]] + motion, m_length, text_list = data['motion'], data['length'], data['text'] + # Randomly select a caption + text_data = random.choice(text_list) + caption, tokens = text_data['caption'], text_data['tokens'] + + if len(tokens) < self.opt.max_text_len: + # pad with "unk" + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + tokens = tokens + ['unk/OTHER'] * (self.opt.max_text_len + 2 - sent_len) + else: + # crop + tokens = tokens[:self.opt.max_text_len] + tokens = ['sos/OTHER'] + tokens + ['eos/OTHER'] + sent_len = len(tokens) + pos_one_hots = [] + word_embeddings = [] + for token in tokens: + word_emb, pos_oh = self.w_vectorizer[token] + pos_one_hots.append(pos_oh[None, :]) + word_embeddings.append(word_emb[None, :]) + pos_one_hots = np.concatenate(pos_one_hots, axis=0) + word_embeddings = np.concatenate(word_embeddings, axis=0) + + if self.opt.unit_length < 10: + coin2 = np.random.choice(['single', 'single', 'double']) + else: + coin2 = 'single' + + if coin2 == 'double': + m_length = (m_length // self.opt.unit_length - 1) * self.opt.unit_length + elif coin2 == 'single': + m_length = (m_length // self.opt.unit_length) * self.opt.unit_length + idx = random.randint(0, len(motion) - m_length) + motion = motion[idx:idx+m_length] + + "Z Normalization" + motion = (motion - self.mean) / self.std + + if m_length < self.max_motion_length: + motion = np.concatenate([motion, + np.zeros((self.max_motion_length - m_length, motion.shape[1])) + ], axis=0) + # print(word_embeddings.shape, motion.shape) + # print(tokens) + return word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, '_'.join(tokens) + + +class Text2MotionDataset(data.Dataset): + def __init__(self, opt, mean, std, split_file): + self.opt = opt + self.max_length = 20 + self.pointer = 0 + self.max_motion_length = opt.max_motion_length + min_motion_len = 40 if self.opt.dataset_name =='t2m' else 24 + + data_dict = {} + id_list = [] + with cs.open(split_file, 'r') as f: + for line in f.readlines(): + id_list.append(line.strip()) + # id_list = id_list[:250] + + new_name_list = [] + length_list = [] + for name in tqdm(id_list): + try: + motion = np.load(pjoin(opt.motion_dir, name + '.npy')) + if (len(motion)) < min_motion_len or (len(motion) >= 200): + continue + text_data = [] + flag = False + with cs.open(pjoin(opt.text_dir, name + '.txt')) as f: + for line in f.readlines(): + text_dict = {} + line_split = line.strip().split('#') + # print(line) + caption = line_split[0] + tokens = line_split[1].split(' ') + f_tag = float(line_split[2]) + to_tag = float(line_split[3]) + f_tag = 0.0 if np.isnan(f_tag) else f_tag + to_tag = 0.0 if np.isnan(to_tag) else to_tag + + text_dict['caption'] = caption + text_dict['tokens'] = tokens + if f_tag == 0.0 and to_tag == 0.0: + flag = True + text_data.append(text_dict) + else: + try: + n_motion = motion[int(f_tag*20) : int(to_tag*20)] + if (len(n_motion)) < min_motion_len or (len(n_motion) >= 200): + continue + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + while new_name in data_dict: + new_name = random.choice('ABCDEFGHIJKLMNOPQRSTUVW') + '_' + name + data_dict[new_name] = {'motion': n_motion, + 'length': len(n_motion), + 'text':[text_dict]} + new_name_list.append(new_name) + length_list.append(len(n_motion)) + except: + print(line_split) + print(line_split[2], line_split[3], f_tag, to_tag, name) + # break + + if flag: + data_dict[name] = {'motion': motion, + 'length': len(motion), + 'text': text_data} + new_name_list.append(name) + length_list.append(len(motion)) + except Exception as e: + # print(e) + pass + + # name_list, length_list = zip(*sorted(zip(new_name_list, length_list), key=lambda x: x[1])) + name_list, length_list = new_name_list, length_list + + self.mean = mean + self.std = std + self.length_arr = np.array(length_list) + self.data_dict = data_dict + self.name_list = name_list + + def inv_transform(self, data): + return data * self.std + self.mean + + def __len__(self): + return len(self.data_dict) - self.pointer + + def __getitem__(self, item): + idx = self.pointer + item + data = self.data_dict[self.name_list[idx]] + motion, m_length, text_list = data['motion'], data['length'], data['text'] + # Randomly select a caption + text_data = random.choice(text_list) + caption, tokens = text_data['caption'], text_data['tokens'] + + if self.opt.unit_length < 10: + coin2 = np.random.choice(['single', 'single', 'double']) + else: + coin2 = 'single' + + if coin2 == 'double': + m_length = (m_length // self.opt.unit_length - 1) * self.opt.unit_length + elif coin2 == 'single': + m_length = (m_length // self.opt.unit_length) * self.opt.unit_length + idx = random.randint(0, len(motion) - m_length) + motion = motion[idx:idx+m_length] + + "Z Normalization" + motion = (motion - self.mean) / self.std + + if m_length < self.max_motion_length: + motion = np.concatenate([motion, + np.zeros((self.max_motion_length - m_length, motion.shape[1])) + ], axis=0) + # print(word_embeddings.shape, motion.shape) + # print(tokens) + return caption, motion, m_length + + def reset_min_len(self, length): + assert length <= self.max_motion_length + self.pointer = np.searchsorted(self.length_arr, length) + print("Pointer Pointing at %d" % self.pointer) \ No newline at end of file diff --git a/src/momask-preenc/dataset/__init__.py b/src/momask-preenc/dataset/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/docs/preenc_training.md b/src/momask-preenc/docs/preenc_training.md new file mode 100644 index 0000000000000000000000000000000000000000..60a9d3979641fe5d886cb62345332a69cf59320f --- /dev/null +++ b/src/momask-preenc/docs/preenc_training.md @@ -0,0 +1,139 @@ +# Pre-encoded Training for MoMask + +This document describes how to use pre-encoded tokens for training the ResidualTransformer model without loading the VQ model. + +## Pre-encoded Data Format + +Each `.pt` file should contain: +```python +{ + 'code_idx': torch.Tensor, # Shape: (seq_len, num_quantizers) - discrete token indices + 'all_codes': torch.Tensor, # Shape: (seq_len, num_quantizers, code_dim) - continuous codes + 'text': { + 'caption': str, # Text description + 'tokens': List[str], # Tokenized words (optional) + 'start_time': float, # (optional) + 'end_time': float, # (optional) + }, + 'm_len': int, # Motion length + 'src_filepath': str, # Source file path (optional) + 'is_segment': bool, # Whether this is a segment (optional) +} +``` + +## Directory Structure + +Pre-encoded data should be organized as: +``` +dataset/enc_z_rvq/ +├── {prefix}_train_{suffix}/ +│ ├── 000001.pt +│ ├── 000002.pt +│ └── ... +├── {prefix}_val_{suffix}/ +│ ├── 000001.pt +│ └── ... +└── {prefix}_test_{suffix}/ + ├── 000001.pt + └── ... +``` + +## Training Command + +### Pre-encoded Training for ResidualTransformer (No VQ Model Required) + +```bash +python train_res_transformer.py \ + --name my_experiment \ + --dataset_name t2m \ + --gpu_id 0 \ + --use_preenc \ + --preenc_dir ./dataset/enc_z_rvq \ + --preenc_prefix exp \ + --preenc_suffix recon_faceZ_mirror_wtextV3 \ + --code_dim 256 \ + --num_quantizers 6 \ + --num_tokens 512 \ + --batch_size 64 \ + --max_epoch 500 \ + --lr 2e-4 +``` + +### Pre-encoded Training for MaskTransformer (No VQ Model Required) + +```bash +python train_t2m_transformer.py \ + --name my_experiment \ + --dataset_name t2m \ + --gpu_id 0 \ + --use_preenc \ + --preenc_dir ./dataset/enc_z_rvq \ + --preenc_prefix exp \ + --preenc_suffix recon_faceZ_mirror_wtextV3 \ + --code_dim 256 \ + --num_quantizers 6 \ + --num_tokens 512 \ + --batch_size 64 \ + --max_epoch 500 \ + --lr 2e-4 +``` + +### Key Arguments for Pre-encoded Mode + +| Argument | Default | Description | +|----------|---------|-------------| +| `--use_preenc` | False | Enable pre-encoded training mode | +| `--preenc_dir` | `./dataset/enc_z_rvq` | Directory containing pre-encoded data | +| `--preenc_prefix` | `exp` | Prefix for data folder names | +| `--preenc_suffix` | `recon_faceZ_mirror_wtextV3` | Suffix for data folder names | +| `--code_dim` | 256 | Code embedding dimension | +| `--num_quantizers` | 6 | Number of quantization layers | +| `--num_tokens` | 512 | Number of tokens in codebook | +| `--shared_codebook` | False | Whether codebook is shared across quantizers | +| `--preload_data` | False | Preload all data into memory for faster training | + +### Learning Rate Schedule + +Transformer training uses warmup followed by `MultiStepLR`. The schedule is controlled by `--milestones` and `--gamma`. + +### Original Training (With VQ Model) + +For ResidualTransformer: +```bash +python train_res_transformer.py \ + --name my_experiment \ + --dataset_name t2m \ + --gpu_id 0 \ + --vq_name rvq_nq6_dc512_nc512 \ + --batch_size 64 \ + --max_epoch 500 \ + --lr 2e-4 +``` + +For MaskTransformer: +```bash +python train_t2m_transformer.py \ + --name my_experiment \ + --dataset_name t2m \ + --gpu_id 0 \ + --vq_name rvq_nq6_dc512_nc512 \ + --batch_size 64 \ + --max_epoch 500 \ + --lr 2e-4 +``` + +## Notes + +1. **Model Selection**: + - `train_t2m_transformer.py`: Uses MaskTransformer (only uses first quantizer layer) + - `train_res_transformer.py`: Uses ResidualTransformer (uses all quantizer layers progressively) + +2. In pre-encoded mode, the VQ model is not loaded, which saves GPU memory and speeds up training startup. + +3. Evaluation metrics (FID, diversity, etc.) are not computed in pre-encoded mode since they require the VQ model for decoding. + +4. Make sure your pre-encoded data matches the expected `code_dim` and `num_quantizers` settings. + +5. The `max_motion_length` should be consistent with how the pre-encoded data was generated (default: 196 frames, which becomes ~49 tokens after 4x downsampling). + +6. Both training scripts now support the same command line interface for pre-encoded training mode. diff --git a/src/momask-preenc/edit_t2m.py b/src/momask-preenc/edit_t2m.py new file mode 100644 index 0000000000000000000000000000000000000000..66ea3462e0c907116af66400b0f607c7c8feca7e --- /dev/null +++ b/src/momask-preenc/edit_t2m.py @@ -0,0 +1,195 @@ +import os +from os.path import join as pjoin + +import torch +import torch.nn.functional as F + +from models.mask_transformer.transformer import MaskTransformer, ResidualTransformer +from models.vq.model import RVQVAE, LengthEstimator + +from options.eval_option import EvalT2MOptions +from utils.get_opt import get_opt + +from utils.fixseed import fixseed +from visualization.joints2bvh import Joint2BVHConvertor + +from utils.motion_process import recover_from_ric +from utils.plot_script import plot_3d_motion + +from utils.paramUtil import t2m_kinematic_chain + +import numpy as np + +from gen_t2m import load_vq_model, load_res_model, load_trans_model + +if __name__ == '__main__': + parser = EvalT2MOptions() + opt = parser.parse() + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + torch.autograd.set_detect_anomaly(True) + + dim_pose = 251 if opt.dataset_name == 'kit' else 263 + + root_dir = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + model_dir = pjoin(root_dir, 'model') + result_dir = pjoin('./editing', opt.ext) + joints_dir = pjoin(result_dir, 'joints') + animation_dir = pjoin(result_dir, 'animations') + os.makedirs(joints_dir, exist_ok=True) + os.makedirs(animation_dir,exist_ok=True) + + model_opt_path = pjoin(root_dir, 'opt.txt') + model_opt = get_opt(model_opt_path, device=opt.device) + + ####################### + ######Loading RVQ###### + ####################### + vq_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'opt.txt') + vq_opt = get_opt(vq_opt_path, device=opt.device) + vq_opt.dim_pose = dim_pose + vq_model, vq_opt = load_vq_model(vq_opt) + + model_opt.num_tokens = vq_opt.nb_code + model_opt.num_quantizers = vq_opt.num_quantizers + model_opt.code_dim = vq_opt.code_dim + + ################################# + ######Loading R-Transformer###### + ################################# + res_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.res_name, 'opt.txt') + res_opt = get_opt(res_opt_path, device=opt.device) + res_model = load_res_model(res_opt, vq_opt, opt) + + assert res_opt.vq_name == model_opt.vq_name + + ################################# + ######Loading M-Transformer###### + ################################# + t2m_transformer = load_trans_model(model_opt, opt, 'latest.tar') + + t2m_transformer.eval() + vq_model.eval() + res_model.eval() + + res_model.to(opt.device) + t2m_transformer.to(opt.device) + vq_model.to(opt.device) + + ##### ---- Data ---- ##### + max_motion_length = 196 + mean = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'meta', 'mean.npy')) + std = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'meta', 'std.npy')) + def inv_transform(data): + return data * std + mean + ### We provided an example source motion (from 'new_joint_vecs') for editing. See './example_data/000612.mp4'### + motion = np.load(opt.source_motion) + m_length = len(motion) + motion = (motion - mean) / std + if max_motion_length > m_length: + motion = np.concatenate([motion, np.zeros((max_motion_length - m_length, motion.shape[1])) ], axis=0) + motion = torch.from_numpy(motion)[None].to(opt.device) + + prompt_list = [] + length_list = [] + if opt.motion_length == 0: + opt.motion_length = m_length + print("Using default motion length.") + + prompt_list.append(opt.text_prompt) + length_list.append(opt.motion_length) + if opt.text_prompt == "": + raise "Using an empty text prompt." + + token_lens = torch.LongTensor(length_list) // model_opt.unit_length + token_lens = token_lens.to(opt.device).long() + + m_length = token_lens * model_opt.unit_length + captions = prompt_list + print_captions = captions[0] + + _edit_slice = opt.mask_edit_section + edit_slice = [] + for eds in _edit_slice: + _start, _end = eds.split(',') + _start = eval(_start) + _end = eval(_end) + edit_slice.append([_start, _end]) + + sample = 0 + kinematic_chain = t2m_kinematic_chain + converter = Joint2BVHConvertor() + + with torch.no_grad(): + tokens, features = vq_model.encode(motion) + ### build editing mask, TOEDIT marked as 1 ### + edit_mask = torch.zeros_like(tokens[..., 0]) + seq_len = tokens.shape[1] + for _start, _end in edit_slice: + if isinstance(_start, float): + _start = int(_start*seq_len) + _end = int(_end*seq_len) + else: + _start //= model_opt.unit_length + _end //= model_opt.unit_length + edit_mask[:, _start: _end] = 1 + print_captions = f'{print_captions} [{_start*model_opt.unit_length/20.}s - {_end*model_opt.unit_length/20.}s]' + edit_mask = edit_mask.bool() + for r in range(opt.repeat_times): + print("-->Repeat %d"%r) + with torch.no_grad(): + mids = t2m_transformer.edit( + captions, tokens[..., 0].clone(), m_length//model_opt.unit_length, + timesteps=opt.time_steps, + cond_scale=opt.cond_scale, + temperature=opt.temperature, + topk_filter_thres=opt.topkr, + gsample=opt.gumbel_sample, + force_mask=opt.force_mask, + edit_mask=edit_mask.clone(), + ) + if opt.use_res_model: + mids = res_model.generate(mids, captions, m_length//model_opt.unit_length, temperature=1, cond_scale=2) + else: + mids.unsqueeze_(-1) + + pred_motions = vq_model.forward_decoder(mids) + + pred_motions = pred_motions.detach().cpu().numpy() + + source_motions = motion.detach().cpu().numpy() + + data = inv_transform(pred_motions) + source_data = inv_transform(source_motions) + + for k, (caption, joint_data, source_data) in enumerate(zip(captions, data, source_data)): + print("---->Sample %d: %s %d"%(k, caption, m_length[k])) + animation_path = pjoin(animation_dir, str(k)) + joint_path = pjoin(joints_dir, str(k)) + + os.makedirs(animation_path, exist_ok=True) + os.makedirs(joint_path, exist_ok=True) + + joint_data = joint_data[:m_length[k]] + joint = recover_from_ric(torch.from_numpy(joint_data).float(), 22).numpy() + + source_data = source_data[:m_length[k]] + soucre_joint = recover_from_ric(torch.from_numpy(source_data).float(), 22).numpy() + + bvh_path = pjoin(animation_path, "sample%d_repeat%d_len%d_ik.bvh"%(k, r, m_length[k])) + _, ik_joint = converter.convert(joint, filename=bvh_path, iterations=100) + + bvh_path = pjoin(animation_path, "sample%d_repeat%d_len%d.bvh" % (k, r, m_length[k])) + _, joint = converter.convert(joint, filename=bvh_path, iterations=100, foot_ik=False) + + + save_path = pjoin(animation_path, "sample%d_repeat%d_len%d.mp4"%(k, r, m_length[k])) + ik_save_path = pjoin(animation_path, "sample%d_repeat%d_len%d_ik.mp4"%(k, r, m_length[k])) + source_save_path = pjoin(animation_path, "sample%d_source_len%d.mp4"%(k, m_length[k])) + + plot_3d_motion(ik_save_path, kinematic_chain, ik_joint, title=print_captions, fps=20) + plot_3d_motion(save_path, kinematic_chain, joint, title=print_captions, fps=20) + plot_3d_motion(source_save_path, kinematic_chain, soucre_joint, title='None', fps=20) + np.save(pjoin(joint_path, "sample%d_repeat%d_len%d.npy"%(k, r, m_length[k])), joint) + np.save(pjoin(joint_path, "sample%d_repeat%d_len%d_ik.npy"%(k, r, m_length[k])), ik_joint) \ No newline at end of file diff --git a/src/momask-preenc/environment.yml b/src/momask-preenc/environment.yml new file mode 100644 index 0000000000000000000000000000000000000000..8dcbe8622a900f10c88ab5762ff8371bfc2d156f --- /dev/null +++ b/src/momask-preenc/environment.yml @@ -0,0 +1,204 @@ +name: momask +channels: + - pytorch + - anaconda + - conda-forge + - defaults +dependencies: + - _libgcc_mutex=0.1=main + - _openmp_mutex=5.1=1_gnu + - absl-py=1.4.0=pyhd8ed1ab_0 + - aiohttp=3.8.3=py37h5eee18b_0 + - aiosignal=1.2.0=pyhd3eb1b0_0 + - argon2-cffi=21.3.0=pyhd3eb1b0_0 + - argon2-cffi-bindings=21.2.0=py37h7f8727e_0 + - async-timeout=4.0.2=py37h06a4308_0 + - asynctest=0.13.0=py_0 + - attrs=22.1.0=py37h06a4308_0 + - backcall=0.2.0=pyhd3eb1b0_0 + - beautifulsoup4=4.11.1=pyha770c72_0 + - blas=1.0=mkl + - bleach=4.1.0=pyhd3eb1b0_0 + - blinker=1.4=py37h06a4308_0 + - brotlipy=0.7.0=py37h540881e_1004 + - c-ares=1.19.0=h5eee18b_0 + - ca-certificates=2023.05.30=h06a4308_0 + - catalogue=2.0.8=py37h89c1867_0 + - certifi=2022.12.7=py37h06a4308_0 + - cffi=1.15.1=py37h74dc2b5_0 + - charset-normalizer=2.1.1=pyhd8ed1ab_0 + - click=8.0.4=py37h89c1867_0 + - colorama=0.4.5=pyhd8ed1ab_0 + - cryptography=35.0.0=py37hf1a17b8_2 + - cudatoolkit=11.0.221=h6bb024c_0 + - cycler=0.11.0=pyhd3eb1b0_0 + - cymem=2.0.6=py37hd23a5d3_3 + - cython-blis=0.7.7=py37hda87dfa_1 + - dataclasses=0.8=pyhc8e2a94_3 + - dbus=1.13.18=hb2f20db_0 + - debugpy=1.5.1=py37h295c915_0 + - decorator=5.1.1=pyhd3eb1b0_0 + - defusedxml=0.7.1=pyhd3eb1b0_0 + - entrypoints=0.4=py37h06a4308_0 + - expat=2.4.9=h6a678d5_0 + - fftw=3.3.9=h27cfd23_1 + - filelock=3.8.0=pyhd8ed1ab_0 + - fontconfig=2.13.1=h6c09931_0 + - freetype=2.11.0=h70c0345_0 + - frozenlist=1.3.3=py37h5eee18b_0 + - giflib=5.2.1=h7b6447c_0 + - glib=2.69.1=h4ff587b_1 + - gst-plugins-base=1.14.0=h8213a91_2 + - gstreamer=1.14.0=h28cd5cc_2 + - h5py=3.7.0=py37h737f45e_0 + - hdf5=1.10.6=h3ffc7dd_1 + - icu=58.2=he6710b0_3 + - idna=3.4=pyhd8ed1ab_0 + - importlib-metadata=4.11.4=py37h89c1867_0 + - intel-openmp=2021.4.0=h06a4308_3561 + - ipykernel=6.15.2=py37h06a4308_0 + - ipython=7.31.1=py37h06a4308_1 + - ipython_genutils=0.2.0=pyhd3eb1b0_1 + - jedi=0.18.1=py37h06a4308_1 + - jinja2=3.1.2=pyhd8ed1ab_1 + - joblib=1.1.0=pyhd3eb1b0_0 + - jpeg=9b=h024ee3a_2 + - jsonschema=3.0.2=py37_0 + - jupyter_client=7.4.9=py37h06a4308_0 + - jupyter_core=4.11.2=py37h06a4308_0 + - jupyterlab_pygments=0.1.2=py_0 + - kiwisolver=1.4.2=py37h295c915_0 + - langcodes=3.3.0=pyhd8ed1ab_0 + - lcms2=2.12=h3be6417_0 + - ld_impl_linux-64=2.38=h1181459_1 + - libffi=3.3=he6710b0_2 + - libgcc-ng=11.2.0=h1234567_1 + - libgfortran-ng=11.2.0=h00389a5_1 + - libgfortran5=11.2.0=h1234567_1 + - libgomp=11.2.0=h1234567_1 + - libpng=1.6.37=hbc83047_0 + - libprotobuf=3.15.8=h780b84a_1 + - libsodium=1.0.18=h7b6447c_0 + - libstdcxx-ng=11.2.0=h1234567_1 + - libtiff=4.1.0=h2733197_1 + - libuuid=1.0.3=h7f8727e_2 + - libuv=1.40.0=h7b6447c_0 + - libwebp=1.2.0=h89dd481_0 + - libxcb=1.15=h7f8727e_0 + - libxml2=2.9.14=h74e7548_0 + - lz4-c=1.9.3=h295c915_1 + - markdown=3.4.3=pyhd8ed1ab_0 + - markupsafe=2.1.1=py37h540881e_1 + - matplotlib=3.1.3=py37_0 + - matplotlib-base=3.1.3=py37hef1b27d_0 + - matplotlib-inline=0.1.6=py37h06a4308_0 + - mistune=0.8.4=py37h14c3975_1001 + - mkl=2021.4.0=h06a4308_640 + - mkl-service=2.4.0=py37h7f8727e_0 + - mkl_fft=1.3.1=py37hd3c417c_0 + - mkl_random=1.2.2=py37h51133e4_0 + - multidict=6.0.2=py37h5eee18b_0 + - murmurhash=1.0.7=py37hd23a5d3_0 + - nb_conda_kernels=2.3.1=py37h06a4308_0 + - nbclient=0.5.13=py37h06a4308_0 + - nbconvert=6.4.4=py37h06a4308_0 + - nbformat=5.5.0=py37h06a4308_0 + - ncurses=6.3=h5eee18b_3 + - nest-asyncio=1.5.6=py37h06a4308_0 + - ninja=1.10.2=h06a4308_5 + - ninja-base=1.10.2=hd09550d_5 + - notebook=6.4.12=py37h06a4308_0 + - numpy=1.21.5=py37h6c91a56_3 + - numpy-base=1.21.5=py37ha15fc14_3 + - openssl=1.1.1v=h7f8727e_0 + - packaging=21.3=pyhd8ed1ab_0 + - pandocfilters=1.5.0=pyhd3eb1b0_0 + - parso=0.8.3=pyhd3eb1b0_0 + - pathy=0.6.2=pyhd8ed1ab_0 + - pcre=8.45=h295c915_0 + - pexpect=4.8.0=pyhd3eb1b0_3 + - pickleshare=0.7.5=pyhd3eb1b0_1003 + - pillow=9.2.0=py37hace64e9_1 + - pip=22.2.2=py37h06a4308_0 + - preshed=3.0.6=py37hd23a5d3_2 + - prometheus_client=0.14.1=py37h06a4308_0 + - prompt-toolkit=3.0.36=py37h06a4308_0 + - psutil=5.9.0=py37h5eee18b_0 + - ptyprocess=0.7.0=pyhd3eb1b0_2 + - pycparser=2.21=pyhd8ed1ab_0 + - pydantic=1.8.2=py37h5e8e339_2 + - pygments=2.11.2=pyhd3eb1b0_0 + - pyjwt=2.4.0=py37h06a4308_0 + - pyopenssl=22.0.0=pyhd8ed1ab_1 + - pyparsing=3.0.9=py37h06a4308_0 + - pyqt=5.9.2=py37h05f1152_2 + - pyrsistent=0.18.0=py37heee7806_0 + - pysocks=1.7.1=py37h89c1867_5 + - python=3.7.13=h12debd9_0 + - python-dateutil=2.8.2=pyhd3eb1b0_0 + - python-fastjsonschema=2.16.2=py37h06a4308_0 + - python_abi=3.7=2_cp37m + - pytorch=1.7.1=py3.7_cuda11.0.221_cudnn8.0.5_0 + - pyzmq=23.2.0=py37h6a678d5_0 + - qt=5.9.7=h5867ecd_1 + - readline=8.1.2=h7f8727e_1 + - requests=2.28.1=pyhd8ed1ab_1 + - scikit-learn=1.0.2=py37h51133e4_1 + - scipy=1.7.3=py37h6c91a56_2 + - send2trash=1.8.0=pyhd3eb1b0_1 + - setuptools=63.4.1=py37h06a4308_0 + - shellingham=1.5.0=pyhd8ed1ab_0 + - sip=4.19.8=py37hf484d3e_0 + - six=1.16.0=pyhd3eb1b0_1 + - smart_open=5.2.1=pyhd8ed1ab_0 + - soupsieve=2.3.2.post1=pyhd8ed1ab_0 + - spacy=3.3.1=py37h79cecc1_0 + - spacy-legacy=3.0.10=pyhd8ed1ab_0 + - spacy-loggers=1.0.3=pyhd8ed1ab_0 + - sqlite=3.39.3=h5082296_0 + - srsly=2.4.3=py37hd23a5d3_1 + - tensorboard-plugin-wit=1.8.1=py37h06a4308_0 + - terminado=0.17.1=py37h06a4308_0 + - testpath=0.6.0=py37h06a4308_0 + - thinc=8.0.15=py37h48bf904_0 + - threadpoolctl=2.2.0=pyh0d69192_0 + - tk=8.6.12=h1ccaba5_0 + - torchaudio=0.7.2=py37 + - torchvision=0.8.2=py37_cu110 + - tornado=6.2=py37h5eee18b_0 + - tqdm=4.64.1=py37h06a4308_0 + - traitlets=5.7.1=py37h06a4308_0 + - trimesh=3.15.3=pyh1a96a4e_0 + - typer=0.4.2=pyhd8ed1ab_0 + - typing-extensions=3.10.0.2=hd8ed1ab_0 + - typing_extensions=3.10.0.2=pyha770c72_0 + - urllib3=1.26.15=pyhd8ed1ab_0 + - wasabi=0.10.1=pyhd8ed1ab_1 + - webencodings=0.5.1=py37_1 + - werkzeug=2.2.3=pyhd8ed1ab_0 + - wheel=0.37.1=pyhd3eb1b0_0 + - xz=5.2.6=h5eee18b_0 + - yarl=1.8.1=py37h5eee18b_0 + - zeromq=4.3.4=h2531618_0 + - zipp=3.8.1=pyhd8ed1ab_0 + - zlib=1.2.12=h5eee18b_3 + - zstd=1.4.9=haebb681_0 + - pip: + - cachetools==5.3.1 + - einops==0.6.1 + - ftfy==6.1.1 + - gdown==4.7.1 + - google-auth==2.22.0 + - google-auth-oauthlib==0.4.6 + - grpcio==1.57.0 + - oauthlib==3.2.2 + - protobuf==3.20.3 + - pyasn1==0.5.0 + - pyasn1-modules==0.3.0 + - regex==2023.8.8 + - requests-oauthlib==1.3.1 + - rsa==4.9 + - tensorboard==2.11.2 + - tensorboard-data-server==0.6.1 + - wcwidth==0.2.6 +prefix: /home/chuan/anaconda3/envs/momask \ No newline at end of file diff --git a/src/momask-preenc/eval_t2m_trans_res.py b/src/momask-preenc/eval_t2m_trans_res.py new file mode 100644 index 0000000000000000000000000000000000000000..005642dcb8bd76d3efc6fb6f850002e3c5c68bcc --- /dev/null +++ b/src/momask-preenc/eval_t2m_trans_res.py @@ -0,0 +1,199 @@ +import os +from os.path import join as pjoin + +import torch + +from models.mask_transformer.transformer import MaskTransformer, ResidualTransformer +from models.vq.model import RVQVAE + +from options.eval_option import EvalT2MOptions +from utils.get_opt import get_opt +from motion_loaders.dataset_motion_loader import get_dataset_motion_loader +from models.t2m_eval_wrapper import EvaluatorModelWrapper + +import utils.eval_t2m as eval_t2m +from utils.fixseed import fixseed + +import numpy as np + +def load_vq_model(vq_opt): + # opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'opt.txt') + vq_model = RVQVAE(vq_opt, + dim_pose, + vq_opt.nb_code, + vq_opt.code_dim, + vq_opt.output_emb_width, + vq_opt.down_t, + vq_opt.stride_t, + vq_opt.width, + vq_opt.depth, + vq_opt.dilation_growth_rate, + vq_opt.vq_act, + vq_opt.vq_norm) + ckpt = torch.load(pjoin(vq_opt.checkpoints_dir, vq_opt.dataset_name, vq_opt.name, 'model', 'net_best_fid.tar'), + map_location=opt.device) + model_key = 'vq_model' if 'vq_model' in ckpt else 'net' + vq_model.load_state_dict(ckpt[model_key]) + print(f'Loading VQ Model {vq_opt.name} Completed!') + return vq_model, vq_opt + +def load_trans_model(model_opt, which_model): + t2m_transformer = MaskTransformer(code_dim=model_opt.code_dim, + cond_mode='text', + latent_dim=model_opt.latent_dim, + ff_size=model_opt.ff_size, + num_layers=model_opt.n_layers, + num_heads=model_opt.n_heads, + dropout=model_opt.dropout, + clip_dim=512, + cond_drop_prob=model_opt.cond_drop_prob, + clip_version=clip_version, + opt=model_opt) + ckpt = torch.load(pjoin(model_opt.checkpoints_dir, model_opt.dataset_name, model_opt.name, 'model', which_model), + map_location=opt.device) + model_key = 't2m_transformer' if 't2m_transformer' in ckpt else 'trans' + # print(ckpt.keys()) + missing_keys, unexpected_keys = t2m_transformer.load_state_dict(ckpt[model_key], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + print(f'Loading Mask Transformer {opt.name} from epoch {ckpt["ep"]}!') + return t2m_transformer + +def load_res_model(res_opt): + res_opt.num_quantizers = vq_opt.num_quantizers + res_opt.num_tokens = vq_opt.nb_code + res_transformer = ResidualTransformer(code_dim=vq_opt.code_dim, + cond_mode='text', + latent_dim=res_opt.latent_dim, + ff_size=res_opt.ff_size, + num_layers=res_opt.n_layers, + num_heads=res_opt.n_heads, + dropout=res_opt.dropout, + clip_dim=512, + shared_codebook=vq_opt.shared_codebook, + cond_drop_prob=res_opt.cond_drop_prob, + # codebook=vq_model.quantizer.codebooks[0] if opt.fix_token_emb else None, + share_weight=res_opt.share_weight, + clip_version=clip_version, + opt=res_opt) + + ckpt = torch.load(pjoin(res_opt.checkpoints_dir, res_opt.dataset_name, res_opt.name, 'model', 'net_best_fid.tar'), + map_location=opt.device) + missing_keys, unexpected_keys = res_transformer.load_state_dict(ckpt['res_transformer'], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + print(f'Loading Residual Transformer {res_opt.name} from epoch {ckpt["ep"]}!') + return res_transformer + +if __name__ == '__main__': + parser = EvalT2MOptions() + opt = parser.parse() + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + torch.autograd.set_detect_anomaly(True) + + dim_pose = 251 if opt.dataset_name == 'kit' else 263 + + # out_dir = pjoin(opt.check) + root_dir = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + model_dir = pjoin(root_dir, 'model') + out_dir = pjoin(root_dir, 'eval') + os.makedirs(out_dir, exist_ok=True) + + out_path = pjoin(out_dir, "%s.log"%opt.ext) + + f = open(pjoin(out_path), 'w') + + model_opt_path = pjoin(root_dir, 'opt.txt') + model_opt = get_opt(model_opt_path, device=opt.device) + clip_version = 'ViT-B/32' + + vq_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'opt.txt') + vq_opt = get_opt(vq_opt_path, device=opt.device) + vq_model, vq_opt = load_vq_model(vq_opt) + + model_opt.num_tokens = vq_opt.nb_code + model_opt.num_quantizers = vq_opt.num_quantizers + model_opt.code_dim = vq_opt.code_dim + + res_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.res_name, 'opt.txt') + res_opt = get_opt(res_opt_path, device=opt.device) + res_model = load_res_model(res_opt) + + assert res_opt.vq_name == model_opt.vq_name + + dataset_opt_path = 'checkpoints/kit/Comp_v6_KLD005/opt.txt' if opt.dataset_name == 'kit' \ + else 'checkpoints/t2m/Comp_v6_KLD005/opt.txt' + + wrapper_opt = get_opt(dataset_opt_path, torch.device('cuda')) + eval_wrapper = EvaluatorModelWrapper(wrapper_opt) + + ##### ---- Dataloader ---- ##### + opt.nb_joints = 21 if opt.dataset_name == 'kit' else 22 + + eval_val_loader, _ = get_dataset_motion_loader(dataset_opt_path, 32, 'test', device=opt.device) + + # model_dir = pjoin(opt.) + for file in os.listdir(model_dir): + if opt.which_epoch != "all" and opt.which_epoch not in file: + continue + print('loading checkpoint {}'.format(file)) + t2m_transformer = load_trans_model(model_opt, file) + t2m_transformer.eval() + vq_model.eval() + res_model.eval() + + t2m_transformer.to(opt.device) + vq_model.to(opt.device) + res_model.to(opt.device) + + fid = [] + div = [] + top1 = [] + top2 = [] + top3 = [] + matching = [] + mm = [] + + repeat_time = 20 + for i in range(repeat_time): + with torch.no_grad(): + best_fid, best_div, Rprecision, best_matching, best_mm = \ + eval_t2m.evaluation_mask_transformer_test_plus_res(eval_val_loader, vq_model, res_model, t2m_transformer, + i, eval_wrapper=eval_wrapper, + time_steps=opt.time_steps, cond_scale=opt.cond_scale, + temperature=opt.temperature, topkr=opt.topkr, + force_mask=opt.force_mask, cal_mm=True) + fid.append(best_fid) + div.append(best_div) + top1.append(Rprecision[0]) + top2.append(Rprecision[1]) + top3.append(Rprecision[2]) + matching.append(best_matching) + mm.append(best_mm) + + fid = np.array(fid) + div = np.array(div) + top1 = np.array(top1) + top2 = np.array(top2) + top3 = np.array(top3) + matching = np.array(matching) + mm = np.array(mm) + + print(f'{file} final result:') + print(f'{file} final result:', file=f, flush=True) + + msg_final = f"\tFID: {np.mean(fid):.3f}, conf. {np.std(fid) * 1.96 / np.sqrt(repeat_time):.3f}\n" \ + f"\tDiversity: {np.mean(div):.3f}, conf. {np.std(div) * 1.96 / np.sqrt(repeat_time):.3f}\n" \ + f"\tTOP1: {np.mean(top1):.3f}, conf. {np.std(top1) * 1.96 / np.sqrt(repeat_time):.3f}, TOP2. {np.mean(top2):.3f}, conf. {np.std(top2) * 1.96 / np.sqrt(repeat_time):.3f}, TOP3. {np.mean(top3):.3f}, conf. {np.std(top3) * 1.96 / np.sqrt(repeat_time):.3f}\n" \ + f"\tMatching: {np.mean(matching):.3f}, conf. {np.std(matching) * 1.96 / np.sqrt(repeat_time):.3f}\n" \ + f"\tMultimodality:{np.mean(mm):.3f}, conf.{np.std(mm) * 1.96 / np.sqrt(repeat_time):.3f}\n\n" + # logger.info(msg_final) + print(msg_final) + print(msg_final, file=f, flush=True) + + f.close() + + +# python eval_t2m_trans.py --name t2m_nlayer8_nhead6_ld384_ff1024_cdp0.1_vq --dataset_name t2m --gpu_id 3 --cond_scale 4 --time_steps 18 --temperature 1 --topkr 0.9 --gumbel_sample --ext cs4_ts18_tau1_topkr0.9_gs \ No newline at end of file diff --git a/src/momask-preenc/eval_t2m_vq.py b/src/momask-preenc/eval_t2m_vq.py new file mode 100644 index 0000000000000000000000000000000000000000..cb5d7438ffa498a46902194760b718b5744d89d8 --- /dev/null +++ b/src/momask-preenc/eval_t2m_vq.py @@ -0,0 +1,123 @@ +import sys +import os +from os.path import join as pjoin + +import torch +from models.vq.model import RVQVAE +from options.vq_option import arg_parse +from motion_loaders.dataset_motion_loader import get_dataset_motion_loader +import utils.eval_t2m as eval_t2m +from utils.get_opt import get_opt +from models.t2m_eval_wrapper import EvaluatorModelWrapper +import warnings +warnings.filterwarnings('ignore') +import numpy as np +from utils.word_vectorizer import WordVectorizer + +def load_vq_model(vq_opt, which_epoch): + # opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'opt.txt') + + vq_model = RVQVAE(vq_opt, + dim_pose, + vq_opt.nb_code, + vq_opt.code_dim, + vq_opt.code_dim, + vq_opt.down_t, + vq_opt.stride_t, + vq_opt.width, + vq_opt.depth, + vq_opt.dilation_growth_rate, + vq_opt.vq_act, + vq_opt.vq_norm) + ckpt = torch.load(pjoin(vq_opt.checkpoints_dir, vq_opt.dataset_name, vq_opt.name, 'model', which_epoch), + map_location='cpu') + model_key = 'vq_model' if 'vq_model' in ckpt else 'net' + vq_model.load_state_dict(ckpt[model_key]) + vq_epoch = ckpt['ep'] if 'ep' in ckpt else -1 + print(f'Loading VQ Model {vq_opt.name} Completed!, Epoch {vq_epoch}') + return vq_model, vq_epoch + +if __name__ == "__main__": + ##### ---- Exp dirs ---- ##### + args = arg_parse(False) + args.device = torch.device("cpu" if args.gpu_id == -1 else "cuda:" + str(args.gpu_id)) + + args.out_dir = pjoin(args.checkpoints_dir, args.dataset_name, args.name, 'eval') + os.makedirs(args.out_dir, exist_ok=True) + + f = open(pjoin(args.out_dir, '%s.log'%args.ext), 'w') + + dataset_opt_path = 'checkpoints/kit/Comp_v6_KLD005/opt.txt' if args.dataset_name == 'kit' \ + else 'checkpoints/t2m/Comp_v6_KLD005/opt.txt' + + wrapper_opt = get_opt(dataset_opt_path, torch.device('cuda')) + eval_wrapper = EvaluatorModelWrapper(wrapper_opt) + + ##### ---- Dataloader ---- ##### + args.nb_joints = 21 if args.dataset_name == 'kit' else 22 + dim_pose = 251 if args.dataset_name == 'kit' else 263 + + eval_val_loader, _ = get_dataset_motion_loader(dataset_opt_path, 32, 'test', device=args.device) + + print(len(eval_val_loader)) + + ##### ---- Network ---- ##### + vq_opt_path = pjoin(args.checkpoints_dir, args.dataset_name, args.name, 'opt.txt') + vq_opt = get_opt(vq_opt_path, device=args.device) + # net = load_vq_model() + + model_dir = pjoin(args.checkpoints_dir, args.dataset_name, args.name, 'model') + for file in os.listdir(model_dir): + # if not file.endswith('tar'): + # continue + # if not file.startswith('net_best_fid'): + # continue + if args.which_epoch != "all" and args.which_epoch not in file: + continue + print(file) + net, ep = load_vq_model(vq_opt, file) + + net.eval() + net.cuda() + + fid = [] + div = [] + top1 = [] + top2 = [] + top3 = [] + matching = [] + mae = [] + repeat_time = 20 + for i in range(repeat_time): + best_fid, best_div, Rprecision, best_matching, l1_dist = \ + eval_t2m.evaluation_vqvae_plus_mpjpe(eval_val_loader, net, i, eval_wrapper=eval_wrapper, num_joint=args.nb_joints) + fid.append(best_fid) + div.append(best_div) + top1.append(Rprecision[0]) + top2.append(Rprecision[1]) + top3.append(Rprecision[2]) + matching.append(best_matching) + mae.append(l1_dist) + + fid = np.array(fid) + div = np.array(div) + top1 = np.array(top1) + top2 = np.array(top2) + top3 = np.array(top3) + matching = np.array(matching) + mae = np.array(mae) + + print(f'{file} final result, epoch {ep}') + print(f'{file} final result, epoch {ep}', file=f, flush=True) + + msg_final = f"\tFID: {np.mean(fid):.3f}, conf. {np.std(fid)*1.96/np.sqrt(repeat_time):.3f}\n" \ + f"\tDiversity: {np.mean(div):.3f}, conf. {np.std(div)*1.96/np.sqrt(repeat_time):.3f}\n" \ + f"\tTOP1: {np.mean(top1):.3f}, conf. {np.std(top1)*1.96/np.sqrt(repeat_time):.3f}, TOP2. {np.mean(top2):.3f}, conf. {np.std(top2)*1.96/np.sqrt(repeat_time):.3f}, TOP3. {np.mean(top3):.3f}, conf. {np.std(top3)*1.96/np.sqrt(repeat_time):.3f}\n" \ + f"\tMatching: {np.mean(matching):.3f}, conf. {np.std(matching)*1.96/np.sqrt(repeat_time):.3f}\n" \ + f"\tMAE:{np.mean(mae):.3f}, conf.{np.std(mae)*1.96/np.sqrt(repeat_time):.3f}\n\n" + # logger.info(msg_final) + print(msg_final) + print(msg_final, file=f, flush=True) + + f.close() + diff --git a/src/momask-preenc/example_data/000612.mp4 b/src/momask-preenc/example_data/000612.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ce5f2df45c9ffea3c9842c468387034e15035a2e --- /dev/null +++ b/src/momask-preenc/example_data/000612.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1fee9c3e2d15b9716d9f4f5af78fdb483575da13fe8563d008c452f3eb18bb4 +size 153583 diff --git a/src/momask-preenc/example_data/000612.npy b/src/momask-preenc/example_data/000612.npy new file mode 100644 index 0000000000000000000000000000000000000000..403f5eca3ea59eeadebfc6236f274d283644b126 --- /dev/null +++ b/src/momask-preenc/example_data/000612.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85e5a8081278a0e31488eaa29386940b9e4b739fb401042f7ad883afb475ab10 +size 418824 diff --git a/src/momask-preenc/gen_t2m.py b/src/momask-preenc/gen_t2m.py new file mode 100644 index 0000000000000000000000000000000000000000..26d1aeb409d4d4bb49a8572e96c81bd42cf77846 --- /dev/null +++ b/src/momask-preenc/gen_t2m.py @@ -0,0 +1,261 @@ +import os +from os.path import join as pjoin + +import torch +import torch.nn.functional as F + +from models.mask_transformer.transformer import MaskTransformer, ResidualTransformer +from models.vq.model import RVQVAE, LengthEstimator + +from options.eval_option import EvalT2MOptions +from utils.get_opt import get_opt + +from utils.fixseed import fixseed +from visualization.joints2bvh import Joint2BVHConvertor +from torch.distributions.categorical import Categorical + + +from utils.motion_process import recover_from_ric +from utils.plot_script import plot_3d_motion + +from utils.paramUtil import t2m_kinematic_chain + +import numpy as np +clip_version = 'ViT-B/32' + +def load_vq_model(vq_opt): + # opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'opt.txt') + vq_model = RVQVAE(vq_opt, + vq_opt.dim_pose, + vq_opt.nb_code, + vq_opt.code_dim, + vq_opt.output_emb_width, + vq_opt.down_t, + vq_opt.stride_t, + vq_opt.width, + vq_opt.depth, + vq_opt.dilation_growth_rate, + vq_opt.vq_act, + vq_opt.vq_norm) + ckpt = torch.load(pjoin(vq_opt.checkpoints_dir, vq_opt.dataset_name, vq_opt.name, 'model', 'net_best_fid.tar'), + map_location='cpu') + model_key = 'vq_model' if 'vq_model' in ckpt else 'net' + vq_model.load_state_dict(ckpt[model_key]) + print(f'Loading VQ Model {vq_opt.name} Completed!') + return vq_model, vq_opt + +def load_trans_model(model_opt, opt, which_model): + t2m_transformer = MaskTransformer(code_dim=model_opt.code_dim, + cond_mode='text', + latent_dim=model_opt.latent_dim, + ff_size=model_opt.ff_size, + num_layers=model_opt.n_layers, + num_heads=model_opt.n_heads, + dropout=model_opt.dropout, + clip_dim=512, + cond_drop_prob=model_opt.cond_drop_prob, + clip_version=clip_version, + opt=model_opt) + ckpt = torch.load(pjoin(model_opt.checkpoints_dir, model_opt.dataset_name, model_opt.name, 'model', which_model), + map_location='cpu') + model_key = 't2m_transformer' if 't2m_transformer' in ckpt else 'trans' + # print(ckpt.keys()) + missing_keys, unexpected_keys = t2m_transformer.load_state_dict(ckpt[model_key], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + print(f'Loading Transformer {opt.name} from epoch {ckpt["ep"]}!') + return t2m_transformer + +def load_res_model(res_opt, vq_opt, opt): + res_opt.num_quantizers = vq_opt.num_quantizers + res_opt.num_tokens = vq_opt.nb_code + res_transformer = ResidualTransformer(code_dim=vq_opt.code_dim, + cond_mode='text', + latent_dim=res_opt.latent_dim, + ff_size=res_opt.ff_size, + num_layers=res_opt.n_layers, + num_heads=res_opt.n_heads, + dropout=res_opt.dropout, + clip_dim=512, + shared_codebook=vq_opt.shared_codebook, + cond_drop_prob=res_opt.cond_drop_prob, + # codebook=vq_model.quantizer.codebooks[0] if opt.fix_token_emb else None, + share_weight=res_opt.share_weight, + clip_version=clip_version, + opt=res_opt) + + ckpt = torch.load(pjoin(res_opt.checkpoints_dir, res_opt.dataset_name, res_opt.name, 'model', 'net_best_fid.tar'), + map_location=opt.device) + missing_keys, unexpected_keys = res_transformer.load_state_dict(ckpt['res_transformer'], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + print(f'Loading Residual Transformer {res_opt.name} from epoch {ckpt["ep"]}!') + return res_transformer + +def load_len_estimator(opt): + model = LengthEstimator(512, 50) + ckpt = torch.load(pjoin(opt.checkpoints_dir, opt.dataset_name, 'length_estimator', 'model', 'finest.tar'), + map_location=opt.device) + model.load_state_dict(ckpt['estimator']) + print(f'Loading Length Estimator from epoch {ckpt["epoch"]}!') + return model + + +if __name__ == '__main__': + parser = EvalT2MOptions() + opt = parser.parse() + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + torch.autograd.set_detect_anomaly(True) + + dim_pose = 251 if opt.dataset_name == 'kit' else 263 + + # out_dir = pjoin(opt.check) + root_dir = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + model_dir = pjoin(root_dir, 'model') + result_dir = pjoin('./generation', opt.ext) + joints_dir = pjoin(result_dir, 'joints') + animation_dir = pjoin(result_dir, 'animations') + os.makedirs(joints_dir, exist_ok=True) + os.makedirs(animation_dir,exist_ok=True) + + model_opt_path = pjoin(root_dir, 'opt.txt') + model_opt = get_opt(model_opt_path, device=opt.device) + + + ####################### + ######Loading RVQ###### + ####################### + vq_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'opt.txt') + vq_opt = get_opt(vq_opt_path, device=opt.device) + vq_opt.dim_pose = dim_pose + vq_model, vq_opt = load_vq_model(vq_opt) + + model_opt.num_tokens = vq_opt.nb_code + model_opt.num_quantizers = vq_opt.num_quantizers + model_opt.code_dim = vq_opt.code_dim + + ################################# + ######Loading R-Transformer###### + ################################# + res_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.res_name, 'opt.txt') + res_opt = get_opt(res_opt_path, device=opt.device) + res_model = load_res_model(res_opt, vq_opt, opt) + + assert res_opt.vq_name == model_opt.vq_name + + ################################# + ######Loading M-Transformer###### + ################################# + t2m_transformer = load_trans_model(model_opt, opt, 'latest.tar') + + ################################## + #####Loading Length Predictor##### + ################################## + length_estimator = load_len_estimator(model_opt) + + t2m_transformer.eval() + vq_model.eval() + res_model.eval() + length_estimator.eval() + + res_model.to(opt.device) + t2m_transformer.to(opt.device) + vq_model.to(opt.device) + length_estimator.to(opt.device) + + ##### ---- Dataloader ---- ##### + opt.nb_joints = 21 if opt.dataset_name == 'kit' else 22 + + mean = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'meta', 'mean.npy')) + std = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, model_opt.vq_name, 'meta', 'std.npy')) + def inv_transform(data): + return data * std + mean + + prompt_list = [] + length_list = [] + + est_length = False + if opt.text_prompt != "": + prompt_list.append(opt.text_prompt) + if opt.motion_length == 0: + est_length = True + else: + length_list.append(opt.motion_length) + elif opt.text_path != "": + with open(opt.text_path, 'r') as f: + lines = f.readlines() + for line in lines: + infos = line.split('#') + prompt_list.append(infos[0]) + if len(infos) == 1 or (not infos[1].isdigit()): + est_length = True + length_list = [] + else: + length_list.append(int(infos[-1])) + else: + raise "A text prompt, or a file a text prompts are required!!!" + # print('loading checkpoint {}'.format(file)) + + if est_length: + print("Since no motion length are specified, we will use estimated motion lengthes!!") + text_embedding = t2m_transformer.encode_text(prompt_list) + pred_dis = length_estimator(text_embedding) + probs = F.softmax(pred_dis, dim=-1) # (b, ntoken) + token_lens = Categorical(probs).sample() # (b, seqlen) + # lengths = torch.multinomial() + else: + token_lens = torch.LongTensor(length_list) // model_opt.unit_length + token_lens = token_lens.to(opt.device).long() + + m_length = token_lens * model_opt.unit_length + captions = prompt_list + + sample = 0 + kinematic_chain = t2m_kinematic_chain + converter = Joint2BVHConvertor() + + for r in range(opt.repeat_times): + print("-->Repeat %d"%r) + with torch.no_grad(): + mids = t2m_transformer.generate(captions, token_lens, + timesteps=opt.time_steps, + cond_scale=opt.cond_scale, + temperature=opt.temperature, + topk_filter_thres=opt.topkr, + gsample=opt.gumbel_sample) + # print(mids) + # print(mids.shape) + mids = res_model.generate(mids, captions, token_lens, temperature=1, cond_scale=5) + pred_motions = vq_model.forward_decoder(mids) + + pred_motions = pred_motions.detach().cpu().numpy() + + data = inv_transform(pred_motions) + + for k, (caption, joint_data) in enumerate(zip(captions, data)): + print("---->Sample %d: %s %d"%(k, caption, m_length[k])) + animation_path = pjoin(animation_dir, str(k)) + joint_path = pjoin(joints_dir, str(k)) + + os.makedirs(animation_path, exist_ok=True) + os.makedirs(joint_path, exist_ok=True) + + joint_data = joint_data[:m_length[k]] + joint = recover_from_ric(torch.from_numpy(joint_data).float(), 22).numpy() + + bvh_path = pjoin(animation_path, "sample%d_repeat%d_len%d_ik.bvh"%(k, r, m_length[k])) + _, ik_joint = converter.convert(joint, filename=bvh_path, iterations=100) + + bvh_path = pjoin(animation_path, "sample%d_repeat%d_len%d.bvh" % (k, r, m_length[k])) + _, joint = converter.convert(joint, filename=bvh_path, iterations=100, foot_ik=False) + + + save_path = pjoin(animation_path, "sample%d_repeat%d_len%d.mp4"%(k, r, m_length[k])) + ik_save_path = pjoin(animation_path, "sample%d_repeat%d_len%d_ik.mp4"%(k, r, m_length[k])) + + plot_3d_motion(ik_save_path, kinematic_chain, ik_joint, title=caption, fps=20) + plot_3d_motion(save_path, kinematic_chain, joint, title=caption, fps=20) + np.save(pjoin(joint_path, "sample%d_repeat%d_len%d.npy"%(k, r, m_length[k])), joint) + np.save(pjoin(joint_path, "sample%d_repeat%d_len%d_ik.npy"%(k, r, m_length[k])), ik_joint) \ No newline at end of file diff --git a/src/momask-preenc/models/__init__.py b/src/momask-preenc/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/models/mask_transformer/__init__.py b/src/momask-preenc/models/mask_transformer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/models/mask_transformer/tools.py b/src/momask-preenc/models/mask_transformer/tools.py new file mode 100644 index 0000000000000000000000000000000000000000..1911aafd44ef8133b6278450301a0f85362d29e6 --- /dev/null +++ b/src/momask-preenc/models/mask_transformer/tools.py @@ -0,0 +1,165 @@ +import torch +import torch.nn.functional as F +import math +from einops import rearrange + +# return mask where padding is FALSE +def lengths_to_mask(lengths, max_len): + # max_len = max(lengths) + mask = torch.arange(max_len, device=lengths.device).expand(len(lengths), max_len) < lengths.unsqueeze(1) + return mask #(b, len) + +# return mask where padding is ALL FALSE +def get_pad_mask_idx(seq, pad_idx): + return (seq != pad_idx).unsqueeze(1) + +# Given seq: (b, s) +# Return mat: (1, s, s) +# Example Output: +# [[[ True, False, False], +# [ True, True, False], +# [ True, True, True]]] +# For causal attention +def get_subsequent_mask(seq): + sz_b, seq_len = seq.shape + subsequent_mask = (1 - torch.triu( + torch.ones((1, seq_len, seq_len)), diagonal=1)).bool() + return subsequent_mask.to(seq.device) + + +def exists(val): + return val is not None + +def default(val, d): + return val if exists(val) else d + +def eval_decorator(fn): + def inner(model, *args, **kwargs): + was_training = model.training + model.eval() + out = fn(model, *args, **kwargs) + model.train(was_training) + return out + return inner + +def l2norm(t): + return F.normalize(t, dim = -1) + +# tensor helpers + +# Get a random subset of TRUE mask, with prob +def get_mask_subset_prob(mask, prob): + subset_mask = torch.bernoulli(mask, p=prob) & mask + return subset_mask + + +# Get mask of special_tokens in ids +def get_mask_special_tokens(ids, special_ids): + mask = torch.zeros_like(ids).bool() + for special_id in special_ids: + mask |= (ids==special_id) + return mask + +# network builder helpers +def _get_activation_fn(activation): + if activation == "relu": + return F.relu + elif activation == "gelu": + return F.gelu + + raise RuntimeError("activation should be relu/gelu, not {}".format(activation)) + +# classifier free guidance functions + +def uniform(shape, device=None): + return torch.zeros(shape, device=device).float().uniform_(0, 1) + +def prob_mask_like(shape, prob, device=None): + if prob == 1: + return torch.ones(shape, device=device, dtype=torch.bool) + elif prob == 0: + return torch.zeros(shape, device=device, dtype=torch.bool) + else: + return uniform(shape, device=device) < prob + +# sampling helpers + +def log(t, eps = 1e-20): + return torch.log(t.clamp(min = eps)) + +def gumbel_noise(t): + noise = torch.zeros_like(t).uniform_(0, 1) + return -log(-log(noise)) + +def gumbel_sample(t, temperature = 1., dim = 1): + return ((t / max(temperature, 1e-10)) + gumbel_noise(t)).argmax(dim=dim) + + +# Example input: +# [[ 0.3596, 0.0862, 0.9771, -1.0000, -1.0000, -1.0000], +# [ 0.4141, 0.1781, 0.6628, 0.5721, -1.0000, -1.0000], +# [ 0.9428, 0.3586, 0.1659, 0.8172, 0.9273, -1.0000]] +# Example output: +# [[ -inf, -inf, 0.9771, -inf, -inf, -inf], +# [ -inf, -inf, 0.6628, -inf, -inf, -inf], +# [0.9428, -inf, -inf, -inf, -inf, -inf]] +def top_k(logits, thres = 0.9, dim = 1): + k = math.ceil((1 - thres) * logits.shape[dim]) + val, ind = logits.topk(k, dim = dim) + probs = torch.full_like(logits, float('-inf')) + probs.scatter_(dim, ind, val) + # func verified + # print(probs) + # print(logits) + # raise + return probs + +# noise schedules + +# More on large value, less on small +def cosine_schedule(t): + return torch.cos(t * math.pi * 0.5) + +def scale_cosine_schedule(t, scale): + return torch.clip(scale*torch.cos(t * math.pi * 0.5) + 1 - scale, min=0., max=1.) + +# More on small value, less on large +def q_schedule(bs, low, high, device): + noise = uniform((bs,), device=device) + schedule = 1 - cosine_schedule(noise) + return torch.round(schedule * (high - low - 1)).long() + low + +def cal_performance(pred, labels, ignore_index=None, smoothing=0., tk=1): + loss = cal_loss(pred, labels, ignore_index, smoothing=smoothing) + # pred_id = torch.argmax(pred, dim=1) + # mask = labels.ne(ignore_index) + # n_correct = pred_id.eq(labels).masked_select(mask) + # acc = torch.mean(n_correct.float()).item() + pred_id_k = torch.topk(pred, k=tk, dim=1).indices + pred_id = pred_id_k[:, 0] + mask = labels.ne(ignore_index) + n_correct = (pred_id_k == labels.unsqueeze(1)).any(dim=1).masked_select(mask) + acc = torch.mean(n_correct.float()).item() + + return loss, pred_id, acc + + +def cal_loss(pred, labels, ignore_index=None, smoothing=0.): + '''Calculate cross entropy loss, apply label smoothing if needed.''' + # print(pred.shape, labels.shape) #torch.Size([64, 1028, 55]) torch.Size([64, 55]) + # print(pred.shape, labels.shape) #torch.Size([64, 1027, 55]) torch.Size([64, 55]) + if smoothing: + space = 2 + n_class = pred.size(1) + mask = labels.ne(ignore_index) + one_hot = rearrange(F.one_hot(labels, n_class + space), 'a ... b -> a b ...')[:, :n_class] + # one_hot = torch.zeros_like(pred).scatter(1, labels.unsqueeze(1), 1) + sm_one_hot = one_hot * (1 - smoothing) + (1 - one_hot) * smoothing / (n_class - 1) + neg_log_prb = -F.log_softmax(pred, dim=1) + loss = (sm_one_hot * neg_log_prb).sum(dim=1) + # loss = F.cross_entropy(pred, sm_one_hot, reduction='none') + loss = torch.mean(loss.masked_select(mask)) + else: + loss = F.cross_entropy(pred, labels, ignore_index=ignore_index) + + return loss \ No newline at end of file diff --git a/src/momask-preenc/models/mask_transformer/transformer.py b/src/momask-preenc/models/mask_transformer/transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..d63ba419c4be83c7b1075be028769771942319c3 --- /dev/null +++ b/src/momask-preenc/models/mask_transformer/transformer.py @@ -0,0 +1,1041 @@ +import torch +import torch.nn as nn +import numpy as np +# from networks.layers import * +import torch.nn.functional as F +import clip +from einops import rearrange, repeat +import math +from random import random +from tqdm.auto import tqdm +from typing import Callable, Optional, List, Dict +from copy import deepcopy +from functools import partial +from models.mask_transformer.tools import * +from torch.distributions.categorical import Categorical + +class InputProcess(nn.Module): + def __init__(self, input_feats, latent_dim): + super().__init__() + self.input_feats = input_feats + self.latent_dim = latent_dim + self.poseEmbedding = nn.Linear(self.input_feats, self.latent_dim) + + def forward(self, x): + # [bs, ntokens, input_feats] + x = x.permute((1, 0, 2)) # [seqen, bs, input_feats] + # print(x.shape) + x = self.poseEmbedding(x) # [seqlen, bs, d] + return x + +class PositionalEncoding(nn.Module): + #Borrow from MDM, the same as above, but add dropout, exponential may improve precision + def __init__(self, d_model, dropout=0.1, max_len=5000): + super(PositionalEncoding, self).__init__() + self.dropout = nn.Dropout(p=dropout) + + pe = torch.zeros(max_len, d_model) + position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) + div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-np.log(10000.0) / d_model)) + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + pe = pe.unsqueeze(0).transpose(0, 1) #[max_len, 1, d_model] + + self.register_buffer('pe', pe) + + def forward(self, x): + # not used in the final model + x = x + self.pe[:x.shape[0], :] + return self.dropout(x) + +class OutputProcess_Bert(nn.Module): + def __init__(self, out_feats, latent_dim): + super().__init__() + self.dense = nn.Linear(latent_dim, latent_dim) + self.transform_act_fn = F.gelu + self.LayerNorm = nn.LayerNorm(latent_dim, eps=1e-12) + self.poseFinal = nn.Linear(latent_dim, out_feats) #Bias! + + def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: + hidden_states = self.dense(hidden_states) + hidden_states = self.transform_act_fn(hidden_states) + hidden_states = self.LayerNorm(hidden_states) + output = self.poseFinal(hidden_states) # [seqlen, bs, out_feats] + output = output.permute(1, 2, 0) # [bs, c, seqlen] + return output + +class OutputProcess(nn.Module): + def __init__(self, out_feats, latent_dim): + super().__init__() + self.dense = nn.Linear(latent_dim, latent_dim) + self.transform_act_fn = F.gelu + self.LayerNorm = nn.LayerNorm(latent_dim, eps=1e-12) + self.poseFinal = nn.Linear(latent_dim, out_feats) #Bias! + + def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: + hidden_states = self.dense(hidden_states) + hidden_states = self.transform_act_fn(hidden_states) + hidden_states = self.LayerNorm(hidden_states) + output = self.poseFinal(hidden_states) # [seqlen, bs, out_feats] + output = output.permute(1, 2, 0) # [bs, e, seqlen] + return output + + +class MaskTransformer(nn.Module): + def __init__(self, code_dim, cond_mode, latent_dim=256, ff_size=1024, num_layers=8, + num_heads=4, dropout=0.1, clip_dim=512, cond_drop_prob=0.1, + clip_version=None, opt=None, **kargs): + super(MaskTransformer, self).__init__() + print(f'latent_dim: {latent_dim}, ff_size: {ff_size}, nlayers: {num_layers}, nheads: {num_heads}, dropout: {dropout}') + + self.code_dim = code_dim + self.latent_dim = latent_dim + self.clip_dim = clip_dim + self.dropout = dropout + self.opt = opt + + self.cond_mode = cond_mode + self.cond_drop_prob = cond_drop_prob + + if self.cond_mode == 'action': + assert 'num_actions' in kargs + self.num_actions = kargs.get('num_actions', 1) + + ''' + Preparing Networks + ''' + self.input_process = InputProcess(self.code_dim, self.latent_dim) + self.position_enc = PositionalEncoding(self.latent_dim, self.dropout) + + seqTransEncoderLayer = nn.TransformerEncoderLayer(d_model=self.latent_dim, + nhead=num_heads, + dim_feedforward=ff_size, + dropout=dropout, + activation='gelu') + + self.seqTransEncoder = nn.TransformerEncoder(seqTransEncoderLayer, + num_layers=num_layers) + + self.encode_action = partial(F.one_hot, num_classes=self.num_actions) + + # if self.cond_mode != 'no_cond': + if self.cond_mode == 'text': + self.cond_emb = nn.Linear(self.clip_dim, self.latent_dim) + elif self.cond_mode == 'action': + self.cond_emb = nn.Linear(self.num_actions, self.latent_dim) + elif self.cond_mode == 'uncond': + self.cond_emb = nn.Identity() + else: + raise KeyError("Unsupported condition mode!!!") + + + _num_tokens = opt.num_tokens + 2 # two dummy tokens, one for masking, one for padding + self.mask_id = opt.num_tokens + self.pad_id = opt.num_tokens + 1 + + self.output_process = OutputProcess_Bert(out_feats=opt.num_tokens, latent_dim=latent_dim) + + self.token_emb = nn.Embedding(_num_tokens, self.code_dim) + + self.apply(self.__init_weights) + + ''' + Preparing frozen weights + ''' + + if self.cond_mode == 'text': + print('Loading CLIP...') + self.clip_version = clip_version + self.clip_model = self.load_and_freeze_clip(clip_version) + + self.noise_schedule = cosine_schedule + + def load_and_freeze_token_emb(self, codebook): + ''' + :param codebook: (c, d) + :return: + ''' + assert self.training, 'Only necessary in training mode' + c, d = codebook.shape + self.token_emb.weight = nn.Parameter(torch.cat([codebook, torch.zeros(size=(2, d), device=codebook.device)], dim=0)) #add two dummy tokens, 0 vectors + self.token_emb.requires_grad_(False) + # self.token_emb.weight.requires_grad = False + # self.token_emb_ready = True + print("Token embedding initialized!") + + def __init_weights(self, module): + if isinstance(module, (nn.Linear, nn.Embedding)): + module.weight.data.normal_(mean=0.0, std=0.02) + if isinstance(module, nn.Linear) and module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def parameters_wo_clip(self): + return [p for name, p in self.named_parameters() if not name.startswith('clip_model.')] + + def load_and_freeze_clip(self, clip_version): + clip_model, clip_preprocess = clip.load(clip_version, device='cpu', + jit=False) # Must set jit=False for training + # Added support for cpu + if str(self.opt.device) != "cpu": + clip.model.convert_weights( + clip_model) # Actually this line is unnecessary since clip by default already on float16 + # Date 0707: It's necessary, only unecessary when load directly to gpu. Disable if need to run on cpu + + # Freeze CLIP weights + clip_model.eval() + for p in clip_model.parameters(): + p.requires_grad = False + + return clip_model + + def encode_text(self, raw_text): + device = next(self.parameters()).device + text = clip.tokenize(raw_text, truncate=True).to(device) + feat_clip_text = self.clip_model.encode_text(text).float() + return feat_clip_text + + def mask_cond(self, cond, force_mask=False): + bs, d = cond.shape + if force_mask: + return torch.zeros_like(cond) + elif self.training and self.cond_drop_prob > 0.: + mask = torch.bernoulli(torch.ones(bs, device=cond.device) * self.cond_drop_prob).view(bs, 1) + return cond * (1. - mask) + else: + return cond + + def trans_forward(self, motion_ids, cond, padding_mask, force_mask=False): + ''' + :param motion_ids: (b, seqlen) + :padding_mask: (b, seqlen), all pad positions are TRUE else FALSE + :param cond: (b, embed_dim) for text, (b, num_actions) for action + :param force_mask: boolean + :return: + -logits: (b, num_token, seqlen) + ''' + + cond = self.mask_cond(cond, force_mask=force_mask) + + # print(motion_ids.shape) + x = self.token_emb(motion_ids) + # print(x.shape) + # (b, seqlen, d) -> (seqlen, b, latent_dim) + x = self.input_process(x) + + cond = self.cond_emb(cond).unsqueeze(0) #(1, b, latent_dim) + + x = self.position_enc(x) + xseq = torch.cat([cond, x], dim=0) #(seqlen+1, b, latent_dim) + + padding_mask = torch.cat([torch.zeros_like(padding_mask[:, 0:1]), padding_mask], dim=1) #(b, seqlen+1) + # print(xseq.shape, padding_mask.shape) + + # print(padding_mask.shape, xseq.shape) + + output = self.seqTransEncoder(xseq, src_key_padding_mask=padding_mask)[1:] #(seqlen, b, e) + logits = self.output_process(output) #(seqlen, b, e) -> (b, ntoken, seqlen) + return logits + + def forward(self, ids, y, m_lens): + ''' + :param ids: (b, n) + :param y: raw text for cond_mode=text, (b, ) for cond_mode=action + :m_lens: (b,) + :return: + ''' + + bs, ntokens = ids.shape + device = ids.device + + # Positions that are PADDED are ALL FALSE + non_pad_mask = lengths_to_mask(m_lens, ntokens) #(b, n) + ids = torch.where(non_pad_mask, ids, self.pad_id) + + force_mask = False + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(y) + elif self.cond_mode == 'action': + cond_vector = self.enc_action(y).to(device).float() + elif self.cond_mode == 'uncond': + cond_vector = torch.zeros(bs, self.latent_dim).float().to(device) + force_mask = True + else: + raise NotImplementedError("Unsupported condition mode!!!") + + + ''' + Prepare mask + ''' + rand_time = uniform((bs,), device=device) + rand_mask_probs = self.noise_schedule(rand_time) + num_token_masked = (ntokens * rand_mask_probs).round().clamp(min=1) + + batch_randperm = torch.rand((bs, ntokens), device=device).argsort(dim=-1) + # Positions to be MASKED are ALL TRUE + mask = batch_randperm < num_token_masked.unsqueeze(-1) + + # Positions to be MASKED must also be NON-PADDED + mask &= non_pad_mask + + # Note this is our training target, not input + labels = torch.where(mask, ids, self.mask_id) + + x_ids = ids.clone() + + # Further Apply Bert Masking Scheme + # Step 1: 10% replace with an incorrect token + mask_rid = get_mask_subset_prob(mask, 0.1) + rand_id = torch.randint_like(x_ids, high=self.opt.num_tokens) + x_ids = torch.where(mask_rid, rand_id, x_ids) + # Step 2: 90% x 10% replace with correct token, and 90% x 88% replace with mask token + mask_mid = get_mask_subset_prob(mask & ~mask_rid, 0.88) + + # mask_mid = mask + + x_ids = torch.where(mask_mid, self.mask_id, x_ids) + + logits = self.trans_forward(x_ids, cond_vector, ~non_pad_mask, force_mask) + ce_loss, pred_id, acc = cal_performance(logits, labels, ignore_index=self.mask_id) + + return ce_loss, pred_id, acc + + def forward_with_cond_scale(self, + motion_ids, + cond_vector, + padding_mask, + cond_scale=3, + force_mask=False): + # bs = motion_ids.shape[0] + # if cond_scale == 1: + if force_mask: + return self.trans_forward(motion_ids, cond_vector, padding_mask, force_mask=True) + + logits = self.trans_forward(motion_ids, cond_vector, padding_mask) + if cond_scale == 1: + return logits + + aux_logits = self.trans_forward(motion_ids, cond_vector, padding_mask, force_mask=True) + + scaled_logits = aux_logits + (logits - aux_logits) * cond_scale + return scaled_logits + + @torch.no_grad() + @eval_decorator + def generate(self, + conds, + m_lens, + timesteps: int, + cond_scale: int, + temperature=1, + topk_filter_thres=0.9, + gsample=False, + force_mask=False + ): + # print(self.opt.num_quantizers) + # assert len(timesteps) >= len(cond_scales) == self.opt.num_quantizers + + device = next(self.parameters()).device + seq_len = max(m_lens) + batch_size = len(m_lens) + + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(conds) + elif self.cond_mode == 'action': + cond_vector = self.enc_action(conds).to(device) + elif self.cond_mode == 'uncond': + cond_vector = torch.zeros(batch_size, self.latent_dim).float().to(device) + else: + raise NotImplementedError("Unsupported condition mode!!!") + + padding_mask = ~lengths_to_mask(m_lens, seq_len) + # print(padding_mask.shape, ) + + # Start from all tokens being masked + ids = torch.where(padding_mask, self.pad_id, self.mask_id) + scores = torch.where(padding_mask, 1e5, 0.) + starting_temperature = temperature + + for timestep, steps_until_x0 in zip(torch.linspace(0, 1, timesteps, device=device), reversed(range(timesteps))): + # 0 < timestep < 1 + rand_mask_prob = self.noise_schedule(timestep) # Tensor + + ''' + Maskout, and cope with variable length + ''' + # fix: the ratio regarding lengths, instead of seq_len + num_token_masked = torch.round(rand_mask_prob * m_lens).clamp(min=1) # (b, ) + + # select num_token_masked tokens with lowest scores to be masked + sorted_indices = scores.argsort( + dim=1) # (b, k), sorted_indices[i, j] = the index of j-th lowest element in scores on dim=1 + ranks = sorted_indices.argsort(dim=1) # (b, k), rank[i, j] = the rank (0: lowest) of scores[i, j] on dim=1 + is_mask = (ranks < num_token_masked.unsqueeze(-1)) + ids = torch.where(is_mask, self.mask_id, ids) + + ''' + Preparing input + ''' + # (b, num_token, seqlen) + logits = self.forward_with_cond_scale(ids, cond_vector=cond_vector, + padding_mask=padding_mask, + cond_scale=cond_scale, + force_mask=force_mask) + + logits = logits.permute(0, 2, 1) # (b, seqlen, ntoken) + # print(logits.shape, self.opt.num_tokens) + # clean low prob token + filtered_logits = top_k(logits, topk_filter_thres, dim=-1) + + ''' + Update ids + ''' + # if force_mask: + temperature = starting_temperature + # else: + # temperature = starting_temperature * (steps_until_x0 / timesteps) + # temperature = max(temperature, 1e-4) + # print(filtered_logits.shape) + # temperature is annealed, gradually reducing temperature as well as randomness + if gsample: # use gumbel_softmax sampling + # print("1111") + pred_ids = gumbel_sample(filtered_logits, temperature=temperature, dim=-1) # (b, seqlen) + else: # use multinomial sampling + # print("2222") + probs = F.softmax(filtered_logits / temperature, dim=-1) # (b, seqlen, ntoken) + # print(temperature, starting_temperature, steps_until_x0, timesteps) + # print(probs / temperature) + pred_ids = Categorical(probs).sample() # (b, seqlen) + + # print(pred_ids.max(), pred_ids.min()) + # if pred_ids. + ids = torch.where(is_mask, pred_ids, ids) + + ''' + Updating scores + ''' + probs_without_temperature = logits.softmax(dim=-1) # (b, seqlen, ntoken) + scores = probs_without_temperature.gather(2, pred_ids.unsqueeze(dim=-1)) # (b, seqlen, 1) + scores = scores.squeeze(-1) # (b, seqlen) + + # We do not want to re-mask the previously kept tokens, or pad tokens + scores = scores.masked_fill(~is_mask, 1e5) + + ids = torch.where(padding_mask, -1, ids) + # print("Final", ids.max(), ids.min()) + return ids + + + @torch.no_grad() + @eval_decorator + def edit(self, + conds, + tokens, + m_lens, + timesteps: int, + cond_scale: int, + temperature=1, + topk_filter_thres=0.9, + gsample=False, + force_mask=False, + edit_mask=None, + padding_mask=None, + ): + + assert edit_mask.shape == tokens.shape if edit_mask is not None else True + device = next(self.parameters()).device + seq_len = tokens.shape[1] + + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(conds) + elif self.cond_mode == 'action': + cond_vector = self.enc_action(conds).to(device) + elif self.cond_mode == 'uncond': + cond_vector = torch.zeros(1, self.latent_dim).float().to(device) + else: + raise NotImplementedError("Unsupported condition mode!!!") + + if padding_mask == None: + padding_mask = ~lengths_to_mask(m_lens, seq_len) + + # Start from all tokens being masked + if edit_mask == None: + mask_free = True + ids = torch.where(padding_mask, self.pad_id, tokens) + edit_mask = torch.ones_like(padding_mask) + edit_mask = edit_mask & ~padding_mask + edit_len = edit_mask.sum(dim=-1) + scores = torch.where(edit_mask, 0., 1e5) + else: + mask_free = False + edit_mask = edit_mask & ~padding_mask + edit_len = edit_mask.sum(dim=-1) + ids = torch.where(edit_mask, self.mask_id, tokens) + scores = torch.where(edit_mask, 0., 1e5) + starting_temperature = temperature + + for timestep, steps_until_x0 in zip(torch.linspace(0, 1, timesteps, device=device), reversed(range(timesteps))): + # 0 < timestep < 1 + rand_mask_prob = 0.16 if mask_free else self.noise_schedule(timestep) # Tensor + + ''' + Maskout, and cope with variable length + ''' + # fix: the ratio regarding lengths, instead of seq_len + num_token_masked = torch.round(rand_mask_prob * edit_len).clamp(min=1) # (b, ) + + # select num_token_masked tokens with lowest scores to be masked + sorted_indices = scores.argsort( + dim=1) # (b, k), sorted_indices[i, j] = the index of j-th lowest element in scores on dim=1 + ranks = sorted_indices.argsort(dim=1) # (b, k), rank[i, j] = the rank (0: lowest) of scores[i, j] on dim=1 + is_mask = (ranks < num_token_masked.unsqueeze(-1)) + # is_mask = (torch.rand_like(scores) < 0.8) * ~padding_mask if mask_free else is_mask + ids = torch.where(is_mask, self.mask_id, ids) + + ''' + Preparing input + ''' + # (b, num_token, seqlen) + logits = self.forward_with_cond_scale(ids, cond_vector=cond_vector, + padding_mask=padding_mask, + cond_scale=cond_scale, + force_mask=force_mask) + + logits = logits.permute(0, 2, 1) # (b, seqlen, ntoken) + # print(logits.shape, self.opt.num_tokens) + # clean low prob token + filtered_logits = top_k(logits, topk_filter_thres, dim=-1) + + ''' + Update ids + ''' + # if force_mask: + temperature = starting_temperature + # else: + # temperature = starting_temperature * (steps_until_x0 / timesteps) + # temperature = max(temperature, 1e-4) + # print(filtered_logits.shape) + # temperature is annealed, gradually reducing temperature as well as randomness + if gsample: # use gumbel_softmax sampling + # print("1111") + pred_ids = gumbel_sample(filtered_logits, temperature=temperature, dim=-1) # (b, seqlen) + else: # use multinomial sampling + # print("2222") + probs = F.softmax(filtered_logits / temperature, dim=-1) # (b, seqlen, ntoken) + # print(temperature, starting_temperature, steps_until_x0, timesteps) + # print(probs / temperature) + pred_ids = Categorical(probs).sample() # (b, seqlen) + + # print(pred_ids.max(), pred_ids.min()) + # if pred_ids. + ids = torch.where(is_mask, pred_ids, ids) + + ''' + Updating scores + ''' + probs_without_temperature = logits.softmax(dim=-1) # (b, seqlen, ntoken) + scores = probs_without_temperature.gather(2, pred_ids.unsqueeze(dim=-1)) # (b, seqlen, 1) + scores = scores.squeeze(-1) # (b, seqlen) + + # We do not want to re-mask the previously kept tokens, or pad tokens + scores = scores.masked_fill(~edit_mask, 1e5) if mask_free else scores.masked_fill(~is_mask, 1e5) + + ids = torch.where(padding_mask, -1, ids) + # print("Final", ids.max(), ids.min()) + return ids + + @torch.no_grad() + @eval_decorator + def edit_beta(self, + conds, + conds_og, + tokens, + m_lens, + cond_scale: int, + force_mask=False, + ): + + device = next(self.parameters()).device + seq_len = tokens.shape[1] + + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(conds) + if conds_og is not None: + cond_vector_og = self.encode_text(conds_og) + else: + cond_vector_og = None + elif self.cond_mode == 'action': + cond_vector = self.enc_action(conds).to(device) + if conds_og is not None: + cond_vector_og = self.enc_action(conds_og).to(device) + else: + cond_vector_og = None + else: + raise NotImplementedError("Unsupported condition mode!!!") + + padding_mask = ~lengths_to_mask(m_lens, seq_len) + + # Start from all tokens being masked + ids = torch.where(padding_mask, self.pad_id, tokens) # Do not mask anything + + ''' + Preparing input + ''' + # (b, num_token, seqlen) + logits = self.forward_with_cond_scale(ids, + cond_vector=cond_vector, + cond_vector_neg=cond_vector_og, + padding_mask=padding_mask, + cond_scale=cond_scale, + force_mask=force_mask) + + logits = logits.permute(0, 2, 1) # (b, seqlen, ntoken) + + ''' + Updating scores + ''' + probs_without_temperature = logits.softmax(dim=-1) # (b, seqlen, ntoken) + tokens[tokens == -1] = 0 # just to get through an error when index = -1 using gather + og_tokens_scores = probs_without_temperature.gather(2, tokens.unsqueeze(dim=-1)) # (b, seqlen, 1) + og_tokens_scores = og_tokens_scores.squeeze(-1) # (b, seqlen) + + return og_tokens_scores + + +class ResidualTransformer(nn.Module): + def __init__(self, code_dim, cond_mode, latent_dim=256, ff_size=1024, num_layers=8, cond_drop_prob=0.1, + num_heads=4, dropout=0.1, clip_dim=512, shared_codebook=False, share_weight=False, + clip_version=None, opt=None, **kargs): + super(ResidualTransformer, self).__init__() + print(f'latent_dim: {latent_dim}, ff_size: {ff_size}, nlayers: {num_layers}, nheads: {num_heads}, dropout: {dropout}') + + # assert shared_codebook == True, "Only support shared codebook right now!" + + self.code_dim = code_dim + self.latent_dim = latent_dim + self.clip_dim = clip_dim + self.dropout = dropout + self.opt = opt + + self.cond_mode = cond_mode + # self.cond_drop_prob = cond_drop_prob + + if self.cond_mode == 'action': + assert 'num_actions' in kargs + self.num_actions = kargs.get('num_actions', 1) + self.cond_drop_prob = cond_drop_prob + + ''' + Preparing Networks + ''' + self.input_process = InputProcess(self.code_dim, self.latent_dim) + self.position_enc = PositionalEncoding(self.latent_dim, self.dropout) + + seqTransEncoderLayer = nn.TransformerEncoderLayer(d_model=self.latent_dim, + nhead=num_heads, + dim_feedforward=ff_size, + dropout=dropout, + activation='gelu') + + self.seqTransEncoder = nn.TransformerEncoder(seqTransEncoderLayer, + num_layers=num_layers) + + self.encode_quant = partial(F.one_hot, num_classes=self.opt.num_quantizers) + self.encode_action = partial(F.one_hot, num_classes=self.num_actions) + + self.quant_emb = nn.Linear(self.opt.num_quantizers, self.latent_dim) + # if self.cond_mode != 'no_cond': + if self.cond_mode == 'text': + self.cond_emb = nn.Linear(self.clip_dim, self.latent_dim) + elif self.cond_mode == 'action': + self.cond_emb = nn.Linear(self.num_actions, self.latent_dim) + else: + raise KeyError("Unsupported condition mode!!!") + + + _num_tokens = opt.num_tokens + 1 # one dummy tokens for padding + self.pad_id = opt.num_tokens + + # self.output_process = OutputProcess_Bert(out_feats=opt.num_tokens, latent_dim=latent_dim) + self.output_process = OutputProcess(out_feats=code_dim, latent_dim=latent_dim) + + if shared_codebook: + token_embed = nn.Parameter(torch.normal(mean=0, std=0.02, size=(_num_tokens, code_dim))) + self.token_embed_weight = token_embed.expand(opt.num_quantizers-1, _num_tokens, code_dim) + if share_weight: + self.output_proj_weight = self.token_embed_weight + self.output_proj_bias = None + else: + output_proj = nn.Parameter(torch.normal(mean=0, std=0.02, size=(_num_tokens, code_dim))) + output_bias = nn.Parameter(torch.zeros(size=(_num_tokens,))) + # self.output_proj_bias = 0 + self.output_proj_weight = output_proj.expand(opt.num_quantizers-1, _num_tokens, code_dim) + self.output_proj_bias = output_bias.expand(opt.num_quantizers-1, _num_tokens) + + else: + if share_weight: + self.embed_proj_shared_weight = nn.Parameter(torch.normal(mean=0, std=0.02, size=(opt.num_quantizers - 2, _num_tokens, code_dim))) + self.token_embed_weight_ = nn.Parameter(torch.normal(mean=0, std=0.02, size=(1, _num_tokens, code_dim))) + self.output_proj_weight_ = nn.Parameter(torch.normal(mean=0, std=0.02, size=(1, _num_tokens, code_dim))) + self.output_proj_bias = None + self.registered = False + else: + output_proj_weight = torch.normal(mean=0, std=0.02, + size=(opt.num_quantizers - 1, _num_tokens, code_dim)) + + self.output_proj_weight = nn.Parameter(output_proj_weight) + self.output_proj_bias = nn.Parameter(torch.zeros(size=(opt.num_quantizers, _num_tokens))) + token_embed_weight = torch.normal(mean=0, std=0.02, + size=(opt.num_quantizers - 1, _num_tokens, code_dim)) + self.token_embed_weight = nn.Parameter(token_embed_weight) + + self.apply(self.__init_weights) + self.shared_codebook = shared_codebook + self.share_weight = share_weight + + if self.cond_mode == 'text': + print('Loading CLIP...') + self.clip_version = clip_version + self.clip_model = self.load_and_freeze_clip(clip_version) + + # def + + def mask_cond(self, cond, force_mask=False): + bs, d = cond.shape + if force_mask: + return torch.zeros_like(cond) + elif self.training and self.cond_drop_prob > 0.: + mask = torch.bernoulli(torch.ones(bs, device=cond.device) * self.cond_drop_prob).view(bs, 1) + return cond * (1. - mask) + else: + return cond + + def __init_weights(self, module): + if isinstance(module, (nn.Linear, nn.Embedding)): + module.weight.data.normal_(mean=0.0, std=0.02) + if isinstance(module, nn.Linear) and module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def parameters_wo_clip(self): + return [p for name, p in self.named_parameters() if not name.startswith('clip_model.')] + + def load_and_freeze_clip(self, clip_version): + clip_model, clip_preprocess = clip.load(clip_version, device='cpu', + jit=False) # Must set jit=False for training + # Added support for cpu + if str(self.opt.device) != "cpu": + clip.model.convert_weights( + clip_model) # Actually this line is unnecessary since clip by default already on float16 + # Date 0707: It's necessary, only unecessary when load directly to gpu. Disable if need to run on cpu + + # Freeze CLIP weights + clip_model.eval() + for p in clip_model.parameters(): + p.requires_grad = False + + return clip_model + + def encode_text(self, raw_text): + device = next(self.parameters()).device + text = clip.tokenize(raw_text, truncate=True).to(device) + feat_clip_text = self.clip_model.encode_text(text).float() + return feat_clip_text + + + def q_schedule(self, bs, low, high): + noise = uniform((bs,), device=self.opt.device) + schedule = 1 - cosine_schedule(noise) + return torch.round(schedule * (high - low)) + low + + def process_embed_proj_weight(self): + if self.share_weight and (not self.shared_codebook): + # if not self.registered: + self.output_proj_weight = torch.cat([self.embed_proj_shared_weight, self.output_proj_weight_], dim=0) + self.token_embed_weight = torch.cat([self.token_embed_weight_, self.embed_proj_shared_weight], dim=0) + # self.registered = True + + def output_project(self, logits, qids): + ''' + :logits: (bs, code_dim, seqlen) + :qids: (bs) + + :return: + -logits (bs, ntoken, seqlen) + ''' + # (num_qlayers-1, num_token, code_dim) -> (bs, ntoken, code_dim) + output_proj_weight = self.output_proj_weight[qids] + # (num_qlayers, ntoken) -> (bs, ntoken) + output_proj_bias = None if self.output_proj_bias is None else self.output_proj_bias[qids] + + output = torch.einsum('bnc, bcs->bns', output_proj_weight, logits) + if output_proj_bias is not None: + output += output + output_proj_bias.unsqueeze(-1) + return output + + + + def trans_forward(self, motion_codes, qids, cond, padding_mask, force_mask=False): + ''' + :param motion_codes: (b, seqlen, d) + :padding_mask: (b, seqlen), all pad positions are TRUE else FALSE + :param qids: (b), quantizer layer ids + :param cond: (b, embed_dim) for text, (b, num_actions) for action + :return: + -logits: (b, num_token, seqlen) + ''' + cond = self.mask_cond(cond, force_mask=force_mask) + + # (b, seqlen, d) -> (seqlen, b, latent_dim) + x = self.input_process(motion_codes) + + # (b, num_quantizer) + q_onehot = self.encode_quant(qids).float().to(x.device) + + q_emb = self.quant_emb(q_onehot).unsqueeze(0) # (1, b, latent_dim) + cond = self.cond_emb(cond).unsqueeze(0) # (1, b, latent_dim) + + x = self.position_enc(x) + xseq = torch.cat([cond, q_emb, x], dim=0) # (seqlen+2, b, latent_dim) + + padding_mask = torch.cat([torch.zeros_like(padding_mask[:, 0:2]), padding_mask], dim=1) # (b, seqlen+2) + output = self.seqTransEncoder(xseq, src_key_padding_mask=padding_mask)[2:] # (seqlen, b, e) + logits = self.output_process(output) + return logits + + def forward_with_cond_scale(self, + motion_codes, + q_id, + cond_vector, + padding_mask, + cond_scale=3, + force_mask=False): + bs = motion_codes.shape[0] + # if cond_scale == 1: + qids = torch.full((bs,), q_id, dtype=torch.long, device=motion_codes.device) + if force_mask: + logits = self.trans_forward(motion_codes, qids, cond_vector, padding_mask, force_mask=True) + logits = self.output_project(logits, qids-1) + return logits + + logits = self.trans_forward(motion_codes, qids, cond_vector, padding_mask) + logits = self.output_project(logits, qids-1) + if cond_scale == 1: + return logits + + aux_logits = self.trans_forward(motion_codes, qids, cond_vector, padding_mask, force_mask=True) + aux_logits = self.output_project(aux_logits, qids-1) + + scaled_logits = aux_logits + (logits - aux_logits) * cond_scale + return scaled_logits + + def forward(self, all_indices, y, m_lens): + ''' + :param all_indices: (b, n, q) + :param y: raw text for cond_mode=text, (b, ) for cond_mode=action + :m_lens: (b,) + :return: + ''' + + self.process_embed_proj_weight() + + bs, ntokens, num_quant_layers = all_indices.shape + device = all_indices.device + + # Positions that are PADDED are ALL FALSE + non_pad_mask = lengths_to_mask(m_lens, ntokens) # (b, n) + + q_non_pad_mask = repeat(non_pad_mask, 'b n -> b n q', q=num_quant_layers) + all_indices = torch.where(q_non_pad_mask, all_indices, self.pad_id) #(b, n, q) + + # randomly sample quantization layers to work on, [1, num_q) + active_q_layers = q_schedule(bs, low=1, high=num_quant_layers, device=device) + + # print(self.token_embed_weight.shape, all_indices.shape) + token_embed = repeat(self.token_embed_weight, 'q c d-> b c d q', b=bs) + gather_indices = repeat(all_indices[..., :-1], 'b n q -> b n d q', d=token_embed.shape[2]) + # print(token_embed.shape, gather_indices.shape) + all_codes = token_embed.gather(1, gather_indices) # (b, n, d, q-1) + + cumsum_codes = torch.cumsum(all_codes, dim=-1) #(b, n, d, q-1) + + active_indices = all_indices[torch.arange(bs), :, active_q_layers] # (b, n) + history_sum = cumsum_codes[torch.arange(bs), :, :, active_q_layers - 1] + + force_mask = False + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(y) + elif self.cond_mode == 'action': + cond_vector = self.enc_action(y).to(device).float() + elif self.cond_mode == 'uncond': + cond_vector = torch.zeros(bs, self.latent_dim).float().to(device) + force_mask = True + else: + raise NotImplementedError("Unsupported condition mode!!!") + + logits = self.trans_forward(history_sum, active_q_layers, cond_vector, ~non_pad_mask, force_mask) + logits = self.output_project(logits, active_q_layers-1) + ce_loss, pred_id, acc = cal_performance(logits, active_indices, ignore_index=self.pad_id) + + return ce_loss, pred_id, acc + + @torch.no_grad() + @eval_decorator + def generate(self, + motion_ids, + conds, + m_lens, + temperature=1, + topk_filter_thres=0.9, + cond_scale=2, + num_res_layers=-1, # If it's -1, use all. + ): + + # print(self.opt.num_quantizers) + # assert len(timesteps) >= len(cond_scales) == self.opt.num_quantizers + self.process_embed_proj_weight() + + device = next(self.parameters()).device + seq_len = motion_ids.shape[1] + batch_size = len(conds) + + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(conds) + elif self.cond_mode == 'action': + cond_vector = self.enc_action(conds).to(device) + elif self.cond_mode == 'uncond': + cond_vector = torch.zeros(batch_size, self.latent_dim).float().to(device) + else: + raise NotImplementedError("Unsupported condition mode!!!") + + # token_embed = repeat(self.token_embed_weight, 'c d -> b c d', b=batch_size) + # gathered_ids = repeat(motion_ids, 'b n -> b n d', d=token_embed.shape[-1]) + # history_sum = token_embed.gather(1, gathered_ids) + + # print(pa, seq_len) + padding_mask = ~lengths_to_mask(m_lens, seq_len) + # print(padding_mask.shape, motion_ids.shape) + motion_ids = torch.where(padding_mask, self.pad_id, motion_ids) + all_indices = [motion_ids] + history_sum = 0 + num_quant_layers = self.opt.num_quantizers if num_res_layers==-1 else num_res_layers+1 + + for i in range(1, num_quant_layers): + # print(f"--> Working on {i}-th quantizer") + # Start from all tokens being masked + # qids = torch.full((batch_size,), i, dtype=torch.long, device=motion_ids.device) + token_embed = self.token_embed_weight[i-1] + token_embed = repeat(token_embed, 'c d -> b c d', b=batch_size) + gathered_ids = repeat(motion_ids, 'b n -> b n d', d=token_embed.shape[-1]) + history_sum += token_embed.gather(1, gathered_ids) + + logits = self.forward_with_cond_scale(history_sum, i, cond_vector, padding_mask, cond_scale=cond_scale) + # logits = self.trans_forward(history_sum, qids, cond_vector, padding_mask) + + logits = logits.permute(0, 2, 1) # (b, seqlen, ntoken) + # clean low prob token + filtered_logits = top_k(logits, topk_filter_thres, dim=-1) + + pred_ids = gumbel_sample(filtered_logits, temperature=temperature, dim=-1) # (b, seqlen) + + # probs = F.softmax(filtered_logits, dim=-1) # (b, seqlen, ntoken) + # # print(temperature, starting_temperature, steps_until_x0, timesteps) + # # print(probs / temperature) + # pred_ids = Categorical(probs / temperature).sample() # (b, seqlen) + + ids = torch.where(padding_mask, self.pad_id, pred_ids) + + motion_ids = ids + all_indices.append(ids) + + all_indices = torch.stack(all_indices, dim=-1) + # padding_mask = repeat(padding_mask, 'b n -> b n q', q=all_indices.shape[-1]) + # all_indices = torch.where(padding_mask, -1, all_indices) + all_indices = torch.where(all_indices==self.pad_id, -1, all_indices) + # all_indices = all_indices.masked_fill() + return all_indices + + @torch.no_grad() + @eval_decorator + def edit(self, + motion_ids, + conds, + m_lens, + temperature=1, + topk_filter_thres=0.9, + cond_scale=2 + ): + + # print(self.opt.num_quantizers) + # assert len(timesteps) >= len(cond_scales) == self.opt.num_quantizers + self.process_embed_proj_weight() + + device = next(self.parameters()).device + seq_len = motion_ids.shape[1] + batch_size = len(conds) + + if self.cond_mode == 'text': + with torch.no_grad(): + cond_vector = self.encode_text(conds) + elif self.cond_mode == 'action': + cond_vector = self.enc_action(conds).to(device) + elif self.cond_mode == 'uncond': + cond_vector = torch.zeros(batch_size, self.latent_dim).float().to(device) + else: + raise NotImplementedError("Unsupported condition mode!!!") + + # token_embed = repeat(self.token_embed_weight, 'c d -> b c d', b=batch_size) + # gathered_ids = repeat(motion_ids, 'b n -> b n d', d=token_embed.shape[-1]) + # history_sum = token_embed.gather(1, gathered_ids) + + # print(pa, seq_len) + padding_mask = ~lengths_to_mask(m_lens, seq_len) + # print(padding_mask.shape, motion_ids.shape) + motion_ids = torch.where(padding_mask, self.pad_id, motion_ids) + all_indices = [motion_ids] + history_sum = 0 + + for i in range(1, self.opt.num_quantizers): + # print(f"--> Working on {i}-th quantizer") + # Start from all tokens being masked + # qids = torch.full((batch_size,), i, dtype=torch.long, device=motion_ids.device) + token_embed = self.token_embed_weight[i-1] + token_embed = repeat(token_embed, 'c d -> b c d', b=batch_size) + gathered_ids = repeat(motion_ids, 'b n -> b n d', d=token_embed.shape[-1]) + history_sum += token_embed.gather(1, gathered_ids) + + logits = self.forward_with_cond_scale(history_sum, i, cond_vector, padding_mask, cond_scale=cond_scale) + # logits = self.trans_forward(history_sum, qids, cond_vector, padding_mask) + + logits = logits.permute(0, 2, 1) # (b, seqlen, ntoken) + # clean low prob token + filtered_logits = top_k(logits, topk_filter_thres, dim=-1) + + pred_ids = gumbel_sample(filtered_logits, temperature=temperature, dim=-1) # (b, seqlen) + + # probs = F.softmax(filtered_logits, dim=-1) # (b, seqlen, ntoken) + # # print(temperature, starting_temperature, steps_until_x0, timesteps) + # # print(probs / temperature) + # pred_ids = Categorical(probs / temperature).sample() # (b, seqlen) + + ids = torch.where(padding_mask, self.pad_id, pred_ids) + + motion_ids = ids + all_indices.append(ids) + + all_indices = torch.stack(all_indices, dim=-1) + # padding_mask = repeat(padding_mask, 'b n -> b n q', q=all_indices.shape[-1]) + # all_indices = torch.where(padding_mask, -1, all_indices) + all_indices = torch.where(all_indices==self.pad_id, -1, all_indices) + # all_indices = all_indices.masked_fill() + return all_indices \ No newline at end of file diff --git a/src/momask-preenc/models/mask_transformer/transformer_trainer.py b/src/momask-preenc/models/mask_transformer/transformer_trainer.py new file mode 100644 index 0000000000000000000000000000000000000000..92e4f1c18668dcc15dfa8effca76e36a0345b4d7 --- /dev/null +++ b/src/momask-preenc/models/mask_transformer/transformer_trainer.py @@ -0,0 +1,734 @@ +import torch +from collections import defaultdict +import torch.optim as optim +# import tensorflow as tf +from torch.utils.tensorboard import SummaryWriter +from collections import OrderedDict +from utils.utils import * +from os.path import join as pjoin +from utils.eval_t2m import evaluation_mask_transformer, evaluation_res_transformer +from models.mask_transformer.tools import * + +from einops import rearrange, repeat + +def def_value(): + return 0.0 + +class MaskTransformerTrainer: + def __init__(self, args, t2m_transformer, vq_model): + self.opt = args + self.t2m_transformer = t2m_transformer + self.vq_model = vq_model + self.device = args.device + self.vq_model.eval() + + if args.is_train: + self.logger = SummaryWriter(args.log_dir) + + + def update_lr_warm_up(self, nb_iter, warm_up_iter, lr): + + current_lr = lr * (nb_iter + 1) / (warm_up_iter + 1) + for param_group in self.opt_t2m_transformer.param_groups: + param_group["lr"] = current_lr + + return current_lr + + + def forward(self, batch_data): + + conds, motion, m_lens = batch_data + motion = motion.detach().float().to(self.device) + m_lens = m_lens.detach().long().to(self.device) + + # (b, n, q) + code_idx, _ = self.vq_model.encode(motion) + + conds = conds.to(self.device).float() if torch.is_tensor(conds) else conds + + # loss_dict = {} + # self.pred_ids = [] + # self.acc = [] + + _loss, _pred_ids, _acc = self.t2m_transformer(code_idx[..., 0], conds, m_lens) + + return _loss, _acc + + def update(self, batch_data): + loss, acc = self.forward(batch_data) + + self.opt_t2m_transformer.zero_grad() + loss.backward() + self.opt_t2m_transformer.step() + self.scheduler.step() + + return loss.item(), acc + + def save(self, file_name, ep, total_it): + t2m_trans_state_dict = self.t2m_transformer.state_dict() + clip_weights = [e for e in t2m_trans_state_dict.keys() if e.startswith('clip_model.')] + for e in clip_weights: + del t2m_trans_state_dict[e] + state = { + 't2m_transformer': t2m_trans_state_dict, + 'opt_t2m_transformer': self.opt_t2m_transformer.state_dict(), + 'scheduler':self.scheduler.state_dict(), + 'ep': ep, + 'total_it': total_it, + } + torch.save(state, file_name) + + def resume(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + missing_keys, unexpected_keys = self.t2m_transformer.load_state_dict(checkpoint['t2m_transformer'], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + + try: + self.opt_t2m_transformer.load_state_dict(checkpoint['opt_t2m_transformer']) # Optimizer + + self.scheduler.load_state_dict(checkpoint['scheduler']) # Scheduler + except: + print('Resume wo optimizer') + return checkpoint['ep'], checkpoint['total_it'] + + def train(self, train_loader, val_loader, eval_val_loader, eval_wrapper, plot_eval): + self.t2m_transformer.to(self.device) + self.vq_model.to(self.device) + + self.opt_t2m_transformer = optim.AdamW(self.t2m_transformer.parameters(), betas=(0.9, 0.99), lr=self.opt.lr, weight_decay=1e-5) + + self.scheduler = optim.lr_scheduler.MultiStepLR( + self.opt_t2m_transformer, + milestones=self.opt.milestones, + gamma=self.opt.gamma + ) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') # TODO + epoch, it = self.resume(model_dir) + print("Load model epoch:%d iterations:%d"%(epoch, it)) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_loader) + print(f'Total Epochs: {self.opt.max_epoch}, Total Iters: {total_iters}') + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_loader), len(val_loader))) + logs = defaultdict(def_value, OrderedDict()) + + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_mask_transformer( + self.opt.save_root, eval_val_loader, self.t2m_transformer, self.vq_model, self.logger, epoch, + best_fid=100, best_div=100, + best_top1=0, best_top2=0, best_top3=0, + best_matching=100, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=False, save_anim=False + ) + best_acc = 0. + + while epoch < self.opt.max_epoch: + self.t2m_transformer.train() + self.vq_model.eval() + + for i, batch in enumerate(train_loader): + it += 1 + if it < self.opt.warm_up_iter: + self.update_lr_warm_up(it, self.opt.warm_up_iter, self.opt.lr) + loss, acc = self.update(batch_data=batch) + logs['loss'] += loss + logs['acc'] += acc + logs['lr'] += self.opt_t2m_transformer.param_groups[0]['lr'] + + if it % self.opt.log_every == 0: + mean_loss = OrderedDict() + # self.logger.add_scalar('val_loss', val_loss, it) + # self.l + for tag, value in logs.items(): + self.logger.add_scalar('Train/%s'%tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = defaultdict(def_value, OrderedDict()) + print_current_loss(start_time, it, total_iters, mean_loss, epoch=epoch, inner_iter=i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + epoch += 1 + + print('Validation time:') + self.vq_model.eval() + self.t2m_transformer.eval() + + val_loss = [] + val_acc = [] + with torch.no_grad(): + for i, batch_data in enumerate(val_loader): + loss, acc = self.forward(batch_data) + val_loss.append(loss.item()) + val_acc.append(acc) + + print(f"Validation loss:{np.mean(val_loss):.3f}, accuracy:{np.mean(val_acc):.3f}") + + self.logger.add_scalar('Val/loss', np.mean(val_loss), epoch) + self.logger.add_scalar('Val/acc', np.mean(val_acc), epoch) + + if np.mean(val_acc) > best_acc: + print(f"Improved accuracy from {best_acc:.02f} to {np.mean(val_acc)}!!!") + self.save(pjoin(self.opt.model_dir, 'net_best_acc.tar'), epoch, it) + best_acc = np.mean(val_acc) + + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_mask_transformer( + self.opt.save_root, eval_val_loader, self.t2m_transformer, self.vq_model, self.logger, epoch, best_fid=best_fid, + best_div=best_div, best_top1=best_top1, best_top2=best_top2, best_top3=best_top3, + best_matching=best_matching, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=True, save_anim=(epoch%self.opt.eval_every_e==0) + ) + + +class ResidualTransformerTrainer: + def __init__(self, args, res_transformer, vq_model): + self.opt = args + self.res_transformer = res_transformer + self.vq_model = vq_model + self.device = args.device + self.vq_model.eval() + + if args.is_train: + self.logger = SummaryWriter(args.log_dir) + # self.l1_criterion = torch.nn.SmoothL1Loss() + + + def update_lr_warm_up(self, nb_iter, warm_up_iter, lr): + + current_lr = lr * (nb_iter + 1) / (warm_up_iter + 1) + for param_group in self.opt_res_transformer.param_groups: + param_group["lr"] = current_lr + + return current_lr + + + def forward(self, batch_data): + + conds, motion, m_lens = batch_data + motion = motion.detach().float().to(self.device) + m_lens = m_lens.detach().long().to(self.device) + + # (b, n, q), (q, b, n ,d) + code_idx, all_codes = self.vq_model.encode(motion) + + conds = conds.to(self.device).float() if torch.is_tensor(conds) else conds + + ce_loss, pred_ids, acc = self.res_transformer(code_idx, conds, m_lens) + + return ce_loss, acc + + def update(self, batch_data): + loss, acc = self.forward(batch_data) + + self.opt_res_transformer.zero_grad() + loss.backward() + self.opt_res_transformer.step() + self.scheduler.step() + + return loss.item(), acc + + def save(self, file_name, ep, total_it): + res_trans_state_dict = self.res_transformer.state_dict() + clip_weights = [e for e in res_trans_state_dict.keys() if e.startswith('clip_model.')] + for e in clip_weights: + del res_trans_state_dict[e] + state = { + 'res_transformer': res_trans_state_dict, + 'opt_res_transformer': self.opt_res_transformer.state_dict(), + 'scheduler':self.scheduler.state_dict(), + 'ep': ep, + 'total_it': total_it, + } + torch.save(state, file_name) + + def resume(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + missing_keys, unexpected_keys = self.res_transformer.load_state_dict(checkpoint['res_transformer'], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + + try: + self.opt_res_transformer.load_state_dict(checkpoint['opt_res_transformer']) # Optimizer + + self.scheduler.load_state_dict(checkpoint['scheduler']) # Scheduler + except: + print('Resume wo optimizer') + return checkpoint['ep'], checkpoint['total_it'] + + def train(self, train_loader, val_loader, eval_val_loader, eval_wrapper, plot_eval): + self.res_transformer.to(self.device) + self.vq_model.to(self.device) + + self.opt_res_transformer = optim.AdamW(self.res_transformer.parameters(), betas=(0.9, 0.99), lr=self.opt.lr, weight_decay=1e-5) + + self.scheduler = optim.lr_scheduler.MultiStepLR( + self.opt_res_transformer, + milestones=self.opt.milestones, + gamma=self.opt.gamma + ) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') # TODO + epoch, it = self.resume(model_dir) + print("Load model epoch:%d iterations:%d"%(epoch, it)) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_loader) + print(f'Total Epochs: {self.opt.max_epoch}, Total Iters: {total_iters}') + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_loader), len(val_loader))) + logs = defaultdict(def_value, OrderedDict()) + + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_res_transformer( + self.opt.save_root, eval_val_loader, self.res_transformer, self.vq_model, self.logger, epoch, + best_fid=100, best_div=100, + best_top1=0, best_top2=0, best_top3=0, + best_matching=100, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=False, save_anim=False + ) + best_loss = 100 + best_acc = 0 + + while epoch < self.opt.max_epoch: + self.res_transformer.train() + self.vq_model.eval() + + for i, batch in enumerate(train_loader): + it += 1 + if it < self.opt.warm_up_iter: + self.update_lr_warm_up(it, self.opt.warm_up_iter, self.opt.lr) + loss, acc = self.update(batch_data=batch) + logs['loss'] += loss + logs["acc"] += acc + logs['lr'] += self.opt_res_transformer.param_groups[0]['lr'] + + if it % self.opt.log_every == 0: + mean_loss = OrderedDict() + # self.logger.add_scalar('val_loss', val_loss, it) + # self.l + for tag, value in logs.items(): + self.logger.add_scalar('Train/%s'%tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = defaultdict(def_value, OrderedDict()) + print_current_loss(start_time, it, total_iters, mean_loss, epoch=epoch, inner_iter=i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + print('Validation time:') + self.vq_model.eval() + self.res_transformer.eval() + + val_loss = [] + val_acc = [] + with torch.no_grad(): + for i, batch_data in enumerate(val_loader): + loss, acc = self.forward(batch_data) + val_loss.append(loss.item()) + val_acc.append(acc) + + print(f"Validation loss:{np.mean(val_loss):.3f}, Accuracy:{np.mean(val_acc):.3f}") + + self.logger.add_scalar('Val/loss', np.mean(val_loss), epoch) + self.logger.add_scalar('Val/acc', np.mean(val_acc), epoch) + + if np.mean(val_loss) < best_loss: + print(f"Improved loss from {best_loss:.02f} to {np.mean(val_loss)}!!!") + self.save(pjoin(self.opt.model_dir, 'net_best_loss.tar'), epoch, it) + best_loss = np.mean(val_loss) + + if np.mean(val_acc) > best_acc: + print(f"Improved acc from {best_acc:.02f} to {np.mean(val_acc)}!!!") + # self.save(pjoin(self.opt.model_dir, 'net_best_loss.tar'), epoch, it) + best_acc = np.mean(val_acc) + + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_res_transformer( + self.opt.save_root, eval_val_loader, self.res_transformer, self.vq_model, self.logger, epoch, best_fid=best_fid, + best_div=best_div, best_top1=best_top1, best_top2=best_top2, best_top3=best_top3, + best_matching=best_matching, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=True, save_anim=(epoch%self.opt.eval_every_e==0) + ) + + +class PreEncodedResidualTransformerTrainer: + """ + Trainer for ResidualTransformer using pre-encoded tokens. + No VQ model is needed - tokens are loaded directly from .pt files. + """ + def __init__(self, args, res_transformer, vq_model=None): + self.opt = args + self.res_transformer = res_transformer + self.vq_model = vq_model # Can be None for pre-encoded training + self.device = args.device + + if vq_model is not None: + self.vq_model.eval() + + if args.is_train: + self.logger = SummaryWriter(args.log_dir) + + def update_lr_warm_up(self, nb_iter, warm_up_iter, lr): + current_lr = lr * (nb_iter + 1) / (warm_up_iter + 1) + for param_group in self.opt_res_transformer.param_groups: + param_group["lr"] = current_lr + return current_lr + + def forward(self, batch_data): + """ + Forward pass using pre-encoded tokens. + batch_data: (caption, code_idx, all_codes, token_len) + """ + conds, code_idx, all_codes, m_lens = batch_data + + # from IPython import embed; embed(); + + # code_idx: (b, n, q) - discrete token indices + # all_codes: (b, n, q, d) - continuous codes (not used in training, kept for compatibility) + # m_lens: (b,) - token sequence lengths + + code_idx = code_idx.detach().long().to(self.device) + m_lens = m_lens.detach().long().to(self.device) + + # conds can be text strings or tensor + conds = conds.to(self.device).float() if torch.is_tensor(conds) else conds + + ce_loss, pred_ids, acc = self.res_transformer(code_idx, conds, m_lens) + + return ce_loss, acc + + def update(self, batch_data): + loss, acc = self.forward(batch_data) + + self.opt_res_transformer.zero_grad() + loss.backward() + self.opt_res_transformer.step() + self.scheduler.step() + + return loss.item(), acc + + def save(self, file_name, ep, total_it): + res_trans_state_dict = self.res_transformer.state_dict() + clip_weights = [e for e in res_trans_state_dict.keys() if e.startswith('clip_model.')] + for e in clip_weights: + del res_trans_state_dict[e] + state = { + 'res_transformer': res_trans_state_dict, + 'opt_res_transformer': self.opt_res_transformer.state_dict(), + 'scheduler': self.scheduler.state_dict(), + 'ep': ep, + 'total_it': total_it, + } + torch.save(state, file_name) + + def resume(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + missing_keys, unexpected_keys = self.res_transformer.load_state_dict(checkpoint['res_transformer'], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + + try: + self.opt_res_transformer.load_state_dict(checkpoint['opt_res_transformer']) + self.scheduler.load_state_dict(checkpoint['scheduler']) + except: + print('Resume wo optimizer') + return checkpoint['ep'], checkpoint['total_it'] + + def train(self, train_loader, val_loader, eval_val_loader=None, eval_wrapper=None, plot_eval=None): + self.res_transformer.to(self.device) + if self.vq_model is not None: + self.vq_model.to(self.device) + + self.opt_res_transformer = optim.AdamW(self.res_transformer.parameters(), betas=(0.9, 0.99), lr=self.opt.lr, weight_decay=1e-5) + + self.scheduler = optim.lr_scheduler.MultiStepLR( + self.opt_res_transformer, + milestones=self.opt.milestones, + gamma=self.opt.gamma + ) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + print("Load model epoch:%d iterations:%d" % (epoch, it)) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_loader) + print(f'Total Epochs: {self.opt.max_epoch}, Total Iters: {total_iters}') + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_loader), len(val_loader))) + logs = defaultdict(def_value, OrderedDict()) + + # Skip evaluation at start if no eval loader (pre-encoded mode without VQ) + best_fid, best_div, best_top1, best_top2, best_top3, best_matching = 100, 100, 0, 0, 0, 100 + if eval_val_loader is not None and self.vq_model is not None: + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_res_transformer( + self.opt.save_root, eval_val_loader, self.res_transformer, self.vq_model, self.logger, epoch, + best_fid=100, best_div=100, + best_top1=0, best_top2=0, best_top3=0, + best_matching=100, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=False, save_anim=False + ) + + best_loss = 100 + best_acc = 0 + + while epoch < self.opt.max_epoch: + self.res_transformer.train() + if self.vq_model is not None: + self.vq_model.eval() + + for i, batch in enumerate(train_loader): + it += 1 + if it < self.opt.warm_up_iter: + self.update_lr_warm_up(it, self.opt.warm_up_iter, self.opt.lr) + loss, acc = self.update(batch_data=batch) + logs['loss'] += loss + logs["acc"] += acc + logs['lr'] += self.opt_res_transformer.param_groups[0]['lr'] + + if it % self.opt.log_every == 0: + mean_loss = OrderedDict() + for tag, value in logs.items(): + self.logger.add_scalar('Train/%s' % tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = defaultdict(def_value, OrderedDict()) + print_current_loss(start_time, it, total_iters, mean_loss, epoch=epoch, inner_iter=i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + if epoch % 100 == 0: + + print('Validation time:') + if self.vq_model is not None: + self.vq_model.eval() + self.res_transformer.eval() + + val_loss = [] + val_acc = [] + with torch.no_grad(): + for i, batch_data in enumerate(val_loader): + loss, acc = self.forward(batch_data) + val_loss.append(loss.item()) + val_acc.append(acc) + + print(f"Validation loss:{np.mean(val_loss):.3f}, Accuracy:{np.mean(val_acc):.3f}") + + self.logger.add_scalar('Val/loss', np.mean(val_loss), epoch) + self.logger.add_scalar('Val/acc', np.mean(val_acc), epoch) + + if np.mean(val_loss) < best_loss: + print(f"Improved loss from {best_loss:.02f} to {np.mean(val_loss)}!!!") + self.save(pjoin(self.opt.model_dir, 'net_best_loss.tar'), epoch, it) + best_loss = np.mean(val_loss) + + if np.mean(val_acc) > best_acc: + print(f"Improved acc from {best_acc:.02f} to {np.mean(val_acc)}!!!") + best_acc = np.mean(val_acc) + + # Only run evaluation if eval loader and VQ model are available + if eval_val_loader is not None and self.vq_model is not None: + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_res_transformer( + self.opt.save_root, eval_val_loader, self.res_transformer, self.vq_model, self.logger, epoch, + best_fid=best_fid, + best_div=best_div, best_top1=best_top1, best_top2=best_top2, best_top3=best_top3, + best_matching=best_matching, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=True, save_anim=(epoch % self.opt.eval_every_e == 0) + ) + + +class PreEncodedMaskTransformerTrainer: + """ + Trainer for MaskTransformer using pre-encoded tokens. + No VQ model is needed - tokens are loaded directly from .pt files. + """ + def __init__(self, args, t2m_transformer, vq_model=None): + self.opt = args + self.t2m_transformer = t2m_transformer + self.vq_model = vq_model # Can be None for pre-encoded training + self.device = args.device + + if vq_model is not None: + self.vq_model.eval() + + if args.is_train: + self.logger = SummaryWriter(args.log_dir) + + def update_lr_warm_up(self, nb_iter, warm_up_iter, lr): + current_lr = lr * (nb_iter + 1) / (warm_up_iter + 1) + for param_group in self.opt_t2m_transformer.param_groups: + param_group["lr"] = current_lr + return current_lr + + def forward(self, batch_data): + """ + Forward pass using pre-encoded tokens. + batch_data: (caption, code_idx, all_codes, token_len) + """ + conds, code_idx, all_codes, m_lens = batch_data + + # code_idx: (b, n, q) - discrete token indices + # For MaskTransformer, we only use the first quantizer: code_idx[..., 0] + # m_lens: (b,) - token sequence lengths + + code_idx = code_idx.detach().long().to(self.device) + m_lens = m_lens.detach().long().to(self.device) + + # conds can be text strings or tensor + conds = conds.to(self.device).float() if torch.is_tensor(conds) else conds + + # MaskTransformer uses only the first quantizer layer + _loss, _pred_ids, _acc = self.t2m_transformer(code_idx[..., 0], conds, m_lens) + + return _loss, _acc + + def update(self, batch_data): + loss, acc = self.forward(batch_data) + + self.opt_t2m_transformer.zero_grad() + loss.backward() + self.opt_t2m_transformer.step() + self.scheduler.step() + + return loss.item(), acc + + def save(self, file_name, ep, total_it): + t2m_trans_state_dict = self.t2m_transformer.state_dict() + clip_weights = [e for e in t2m_trans_state_dict.keys() if e.startswith('clip_model.')] + for e in clip_weights: + del t2m_trans_state_dict[e] + state = { + 't2m_transformer': t2m_trans_state_dict, + 'opt_t2m_transformer': self.opt_t2m_transformer.state_dict(), + 'scheduler': self.scheduler.state_dict(), + 'ep': ep, + 'total_it': total_it, + } + torch.save(state, file_name) + + def resume(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + missing_keys, unexpected_keys = self.t2m_transformer.load_state_dict(checkpoint['t2m_transformer'], strict=False) + assert len(unexpected_keys) == 0 + assert all([k.startswith('clip_model.') for k in missing_keys]) + + try: + self.opt_t2m_transformer.load_state_dict(checkpoint['opt_t2m_transformer']) + self.scheduler.load_state_dict(checkpoint['scheduler']) + except: + print('Resume wo optimizer') + return checkpoint['ep'], checkpoint['total_it'] + + def train(self, train_loader, val_loader, eval_val_loader=None, eval_wrapper=None, plot_eval=None): + self.t2m_transformer.to(self.device) + if self.vq_model is not None: + self.vq_model.to(self.device) + + self.opt_t2m_transformer = optim.AdamW(self.t2m_transformer.parameters(), betas=(0.9, 0.99), lr=self.opt.lr, weight_decay=1e-5) + self.scheduler = optim.lr_scheduler.MultiStepLR(self.opt_t2m_transformer, + milestones=self.opt.milestones, + gamma=self.opt.gamma) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + print("Load model epoch:%d iterations:%d" % (epoch, it)) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_loader) + print(f'Total Epochs: {self.opt.max_epoch}, Total Iters: {total_iters}') + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_loader), len(val_loader))) + logs = defaultdict(def_value, OrderedDict()) + + # Skip evaluation at start if no eval loader (pre-encoded mode without VQ) + best_fid, best_div, best_top1, best_top2, best_top3, best_matching = 100, 100, 0, 0, 0, 100 + if eval_val_loader is not None and self.vq_model is not None: + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_mask_transformer( + self.opt.save_root, eval_val_loader, self.t2m_transformer, self.vq_model, self.logger, epoch, + best_fid=100, best_div=100, + best_top1=0, best_top2=0, best_top3=0, + best_matching=100, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=False, save_anim=False + ) + + best_acc = 0. + + while epoch < self.opt.max_epoch: + self.t2m_transformer.train() + if self.vq_model is not None: + self.vq_model.eval() + + for i, batch in enumerate(train_loader): + it += 1 + if it < self.opt.warm_up_iter: + self.update_lr_warm_up(it, self.opt.warm_up_iter, self.opt.lr) + + loss, acc = self.update(batch_data=batch) + logs['loss'] += loss + logs['acc'] += acc + logs['lr'] += self.opt_t2m_transformer.param_groups[0]['lr'] + + if it % self.opt.log_every == 0: + mean_loss = OrderedDict() + for tag, value in logs.items(): + self.logger.add_scalar('Train/%s' % tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = defaultdict(def_value, OrderedDict()) + print_current_loss(start_time, it, total_iters, mean_loss, epoch=epoch, inner_iter=i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + epoch += 1 + if epoch % 100 == 0: + print('Validation time:') + if self.vq_model is not None: + self.vq_model.eval() + self.t2m_transformer.eval() + + val_loss = [] + val_acc = [] + with torch.no_grad(): + for i, batch_data in enumerate(val_loader): + loss, acc = self.forward(batch_data) + val_loss.append(loss.item()) + val_acc.append(acc) + + print(f"Validation loss:{np.mean(val_loss):.3f}, accuracy:{np.mean(val_acc):.3f}") + + self.logger.add_scalar('Val/loss', np.mean(val_loss), epoch) + self.logger.add_scalar('Val/acc', np.mean(val_acc), epoch) + + if np.mean(val_acc) > best_acc: + print(f"Improved accuracy from {best_acc:.02f} to {np.mean(val_acc)}!!!") + self.save(pjoin(self.opt.model_dir, 'net_best_acc.tar'), epoch, it) + best_acc = np.mean(val_acc) + + # Only run evaluation if eval loader and VQ model are available + if eval_val_loader is not None and self.vq_model is not None: + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_mask_transformer( + self.opt.save_root, eval_val_loader, self.t2m_transformer, self.vq_model, self.logger, epoch, + best_fid=best_fid, + best_div=best_div, best_top1=best_top1, best_top2=best_top2, best_top3=best_top3, + best_matching=best_matching, eval_wrapper=eval_wrapper, + plot_func=plot_eval, save_ckpt=True, save_anim=(epoch % self.opt.eval_every_e == 0) + ) diff --git a/src/momask-preenc/models/t2m_eval_modules.py b/src/momask-preenc/models/t2m_eval_modules.py new file mode 100644 index 0000000000000000000000000000000000000000..87cbb730da08b9cc0ab4b0d52970ad08435d02dc --- /dev/null +++ b/src/momask-preenc/models/t2m_eval_modules.py @@ -0,0 +1,182 @@ +import torch +import torch.nn as nn +import numpy as np +import time +import math +import random +from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence +# from networks.layers import * + + +def init_weight(m): + if isinstance(m, nn.Conv1d) or isinstance(m, nn.Linear) or isinstance(m, nn.ConvTranspose1d): + nn.init.xavier_normal_(m.weight) + # m.bias.data.fill_(0.01) + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + +# batch_size, dimension and position +# output: (batch_size, dim) +def positional_encoding(batch_size, dim, pos): + assert batch_size == pos.shape[0] + positions_enc = np.array([ + [pos[j] / np.power(10000, (i-i%2)/dim) for i in range(dim)] + for j in range(batch_size) + ], dtype=np.float32) + positions_enc[:, 0::2] = np.sin(positions_enc[:, 0::2]) + positions_enc[:, 1::2] = np.cos(positions_enc[:, 1::2]) + return torch.from_numpy(positions_enc).float() + + +def get_padding_mask(batch_size, seq_len, cap_lens): + cap_lens = cap_lens.data.tolist() + mask_2d = torch.ones((batch_size, seq_len, seq_len), dtype=torch.float32) + for i, cap_len in enumerate(cap_lens): + mask_2d[i, :, :cap_len] = 0 + return mask_2d.bool(), 1 - mask_2d[:, :, 0].clone() + + +def top_k_logits(logits, k): + v, ix = torch.topk(logits, k) + out = logits.clone() + out[out < v[:, [-1]]] = -float('Inf') + return out + + +class PositionalEncoding(nn.Module): + + def __init__(self, d_model, max_len=300): + super(PositionalEncoding, self).__init__() + + pe = torch.zeros(max_len, d_model) + position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) + div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + # pe = pe.unsqueeze(0).transpose(0, 1) + self.register_buffer('pe', pe) + + def forward(self, pos): + return self.pe[pos] + + +class MovementConvEncoder(nn.Module): + def __init__(self, input_size, hidden_size, output_size): + super(MovementConvEncoder, self).__init__() + self.main = nn.Sequential( + nn.Conv1d(input_size, hidden_size, 4, 2, 1), + nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + nn.Conv1d(hidden_size, output_size, 4, 2, 1), + nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + ) + self.out_net = nn.Linear(output_size, output_size) + self.main.apply(init_weight) + self.out_net.apply(init_weight) + + def forward(self, inputs): + inputs = inputs.permute(0, 2, 1) + outputs = self.main(inputs).permute(0, 2, 1) + # print(outputs.shape) + return self.out_net(outputs) + + +class MovementConvDecoder(nn.Module): + def __init__(self, input_size, hidden_size, output_size): + super(MovementConvDecoder, self).__init__() + self.main = nn.Sequential( + nn.ConvTranspose1d(input_size, hidden_size, 4, 2, 1), + # nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + nn.ConvTranspose1d(hidden_size, output_size, 4, 2, 1), + # nn.Dropout(0.2, inplace=True), + nn.LeakyReLU(0.2, inplace=True), + ) + self.out_net = nn.Linear(output_size, output_size) + + self.main.apply(init_weight) + self.out_net.apply(init_weight) + + def forward(self, inputs): + inputs = inputs.permute(0, 2, 1) + outputs = self.main(inputs).permute(0, 2, 1) + return self.out_net(outputs) + +class TextEncoderBiGRUCo(nn.Module): + def __init__(self, word_size, pos_size, hidden_size, output_size, device): + super(TextEncoderBiGRUCo, self).__init__() + self.device = device + + self.pos_emb = nn.Linear(pos_size, word_size) + self.input_emb = nn.Linear(word_size, hidden_size) + self.gru = nn.GRU(hidden_size, hidden_size, batch_first=True, bidirectional=True) + self.output_net = nn.Sequential( + nn.Linear(hidden_size * 2, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(hidden_size, output_size) + ) + + self.input_emb.apply(init_weight) + self.pos_emb.apply(init_weight) + self.output_net.apply(init_weight) + # self.linear2.apply(init_weight) + # self.batch_size = batch_size + self.hidden_size = hidden_size + self.hidden = nn.Parameter(torch.randn((2, 1, self.hidden_size), requires_grad=True)) + + # input(batch_size, seq_len, dim) + def forward(self, word_embs, pos_onehot, cap_lens): + num_samples = word_embs.shape[0] + + pos_embs = self.pos_emb(pos_onehot) + inputs = word_embs + pos_embs + input_embs = self.input_emb(inputs) + hidden = self.hidden.repeat(1, num_samples, 1) + + cap_lens = cap_lens.data.tolist() + emb = pack_padded_sequence(input_embs, cap_lens, batch_first=True) + + gru_seq, gru_last = self.gru(emb, hidden) + + gru_last = torch.cat([gru_last[0], gru_last[1]], dim=-1) + + return self.output_net(gru_last) + + +class MotionEncoderBiGRUCo(nn.Module): + def __init__(self, input_size, hidden_size, output_size, device): + super(MotionEncoderBiGRUCo, self).__init__() + self.device = device + + self.input_emb = nn.Linear(input_size, hidden_size) + self.gru = nn.GRU(hidden_size, hidden_size, batch_first=True, bidirectional=True) + self.output_net = nn.Sequential( + nn.Linear(hidden_size*2, hidden_size), + nn.LayerNorm(hidden_size), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(hidden_size, output_size) + ) + + self.input_emb.apply(init_weight) + self.output_net.apply(init_weight) + self.hidden_size = hidden_size + self.hidden = nn.Parameter(torch.randn((2, 1, self.hidden_size), requires_grad=True)) + + # input(batch_size, seq_len, dim) + def forward(self, inputs, m_lens): + num_samples = inputs.shape[0] + + input_embs = self.input_emb(inputs) + hidden = self.hidden.repeat(1, num_samples, 1) + + cap_lens = m_lens.data.tolist() + emb = pack_padded_sequence(input_embs, cap_lens, batch_first=True) + + gru_seq, gru_last = self.gru(emb, hidden) + + gru_last = torch.cat([gru_last[0], gru_last[1]], dim=-1) + + return self.output_net(gru_last) \ No newline at end of file diff --git a/src/momask-preenc/models/t2m_eval_wrapper.py b/src/momask-preenc/models/t2m_eval_wrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..39b208995216e1389ee2a7b42143ae485bbdb8f0 --- /dev/null +++ b/src/momask-preenc/models/t2m_eval_wrapper.py @@ -0,0 +1,191 @@ +from models.t2m_eval_modules import * +from utils.word_vectorizer import POS_enumerator +from os.path import join as pjoin + +def build_models(opt): + movement_enc = MovementConvEncoder(opt.dim_pose-4, opt.dim_movement_enc_hidden, opt.dim_movement_latent) + text_enc = TextEncoderBiGRUCo(word_size=opt.dim_word, + pos_size=opt.dim_pos_ohot, + hidden_size=opt.dim_text_hidden, + output_size=opt.dim_coemb_hidden, + device=opt.device) + + motion_enc = MotionEncoderBiGRUCo(input_size=opt.dim_movement_latent, + hidden_size=opt.dim_motion_hidden, + output_size=opt.dim_coemb_hidden, + device=opt.device) + + checkpoint = torch.load(pjoin(opt.checkpoints_dir, opt.dataset_name, 'text_mot_match', 'model', 'finest.tar'), + map_location=opt.device) + movement_enc.load_state_dict(checkpoint['movement_encoder']) + text_enc.load_state_dict(checkpoint['text_encoder']) + motion_enc.load_state_dict(checkpoint['motion_encoder']) + print('Loading Evaluation Model Wrapper (Epoch %d) Completed!!' % (checkpoint['epoch'])) + return text_enc, motion_enc, movement_enc + + +class EvaluatorModelWrapper(object): + + def __init__(self, opt): + + if opt.dataset_name == 't2m': + opt.dim_pose = 263 + elif opt.dataset_name == 'kit': + opt.dim_pose = 251 + else: + raise KeyError('Dataset not Recognized!!!') + + opt.dim_word = 300 + opt.max_motion_length = 196 + opt.dim_pos_ohot = len(POS_enumerator) + opt.dim_motion_hidden = 1024 + opt.max_text_len = 20 + opt.dim_text_hidden = 512 + opt.dim_coemb_hidden = 512 + + # print(opt) + + self.text_encoder, self.motion_encoder, self.movement_encoder = build_models(opt) + self.opt = opt + self.device = opt.device + + self.text_encoder.to(opt.device) + self.motion_encoder.to(opt.device) + self.movement_encoder.to(opt.device) + + self.text_encoder.eval() + self.motion_encoder.eval() + self.movement_encoder.eval() + + # Please note that the results does not follow the order of inputs + def get_co_embeddings(self, word_embs, pos_ohot, cap_lens, motions, m_lens): + with torch.no_grad(): + word_embs = word_embs.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt.unit_length + motion_embedding = self.motion_encoder(movements, m_lens) + + '''Text Encoding''' + text_embedding = self.text_encoder(word_embs, pos_ohot, cap_lens) + text_embedding = text_embedding[align_idx] + return text_embedding, motion_embedding + + # Please note that the results does not follow the order of inputs + def get_motion_embeddings(self, motions, m_lens): + with torch.no_grad(): + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt.unit_length + motion_embedding = self.motion_encoder(movements, m_lens) + return motion_embedding + +## Borrowed form MDM +# our version +def build_evaluators(opt): + movement_enc = MovementConvEncoder(opt['dim_pose']-4, opt['dim_movement_enc_hidden'], opt['dim_movement_latent']) + text_enc = TextEncoderBiGRUCo(word_size=opt['dim_word'], + pos_size=opt['dim_pos_ohot'], + hidden_size=opt['dim_text_hidden'], + output_size=opt['dim_coemb_hidden'], + device=opt['device']) + + motion_enc = MotionEncoderBiGRUCo(input_size=opt['dim_movement_latent'], + hidden_size=opt['dim_motion_hidden'], + output_size=opt['dim_coemb_hidden'], + device=opt['device']) + + ckpt_dir = opt['dataset_name'] + if opt['dataset_name'] == 'humanml': + ckpt_dir = 't2m' + + checkpoint = torch.load(pjoin(opt['checkpoints_dir'], ckpt_dir, 'text_mot_match', 'model', 'finest.tar'), + map_location=opt['device']) + movement_enc.load_state_dict(checkpoint['movement_encoder']) + text_enc.load_state_dict(checkpoint['text_encoder']) + motion_enc.load_state_dict(checkpoint['motion_encoder']) + print('Loading Evaluation Model Wrapper (Epoch %d) Completed!!' % (checkpoint['epoch'])) + return text_enc, motion_enc, movement_enc + +# our wrapper +class EvaluatorWrapper(object): + + def __init__(self, dataset_name, device): + opt = { + 'dataset_name': dataset_name, + 'device': device, + 'dim_word': 300, + 'max_motion_length': 196, + 'dim_pos_ohot': len(POS_enumerator), + 'dim_motion_hidden': 1024, + 'max_text_len': 20, + 'dim_text_hidden': 512, + 'dim_coemb_hidden': 512, + 'dim_pose': 263 if dataset_name == 'humanml' else 251, + 'dim_movement_enc_hidden': 512, + 'dim_movement_latent': 512, + 'checkpoints_dir': './checkpoints', + 'unit_length': 4, + } + + self.text_encoder, self.motion_encoder, self.movement_encoder = build_evaluators(opt) + self.opt = opt + self.device = opt['device'] + + self.text_encoder.to(opt['device']) + self.motion_encoder.to(opt['device']) + self.movement_encoder.to(opt['device']) + + self.text_encoder.eval() + self.motion_encoder.eval() + self.movement_encoder.eval() + + # Please note that the results does not following the order of inputs + def get_co_embeddings(self, word_embs, pos_ohot, cap_lens, motions, m_lens): + with torch.no_grad(): + word_embs = word_embs.detach().to(self.device).float() + pos_ohot = pos_ohot.detach().to(self.device).float() + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt['unit_length'] + motion_embedding = self.motion_encoder(movements, m_lens) + # print(motions.shape, movements.shape, motion_embedding.shape, m_lens) + + '''Text Encoding''' + text_embedding = self.text_encoder(word_embs, pos_ohot, cap_lens) + text_embedding = text_embedding[align_idx] + return text_embedding, motion_embedding + + # Please note that the results does not following the order of inputs + def get_motion_embeddings(self, motions, m_lens): + with torch.no_grad(): + motions = motions.detach().to(self.device).float() + + align_idx = np.argsort(m_lens.data.tolist())[::-1].copy() + motions = motions[align_idx] + m_lens = m_lens[align_idx] + + '''Movement Encoding''' + movements = self.movement_encoder(motions[..., :-4]).detach() + m_lens = m_lens // self.opt['unit_length'] + motion_embedding = self.motion_encoder(movements, m_lens) + return motion_embedding \ No newline at end of file diff --git a/src/momask-preenc/models/vq/__init__.py b/src/momask-preenc/models/vq/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/models/vq/encdec.py b/src/momask-preenc/models/vq/encdec.py new file mode 100644 index 0000000000000000000000000000000000000000..0ee18696f1051439ebb6d73a746ea811a5e17973 --- /dev/null +++ b/src/momask-preenc/models/vq/encdec.py @@ -0,0 +1,68 @@ +import torch.nn as nn +from models.vq.resnet import Resnet1D + + +class Encoder(nn.Module): + def __init__(self, + input_emb_width=3, + output_emb_width=512, + down_t=2, + stride_t=2, + width=512, + depth=3, + dilation_growth_rate=3, + activation='relu', + norm=None): + super().__init__() + + blocks = [] + filter_t, pad_t = stride_t * 2, stride_t // 2 + blocks.append(nn.Conv1d(input_emb_width, width, 3, 1, 1)) + blocks.append(nn.ReLU()) + + for i in range(down_t): + input_dim = width + block = nn.Sequential( + nn.Conv1d(input_dim, width, filter_t, stride_t, pad_t), + Resnet1D(width, depth, dilation_growth_rate, activation=activation, norm=norm), + ) + blocks.append(block) + blocks.append(nn.Conv1d(width, output_emb_width, 3, 1, 1)) + self.model = nn.Sequential(*blocks) + + def forward(self, x): + return self.model(x) + + +class Decoder(nn.Module): + def __init__(self, + input_emb_width=3, + output_emb_width=512, + down_t=2, + stride_t=2, + width=512, + depth=3, + dilation_growth_rate=3, + activation='relu', + norm=None): + super().__init__() + blocks = [] + + blocks.append(nn.Conv1d(output_emb_width, width, 3, 1, 1)) + blocks.append(nn.ReLU()) + for i in range(down_t): + out_dim = width + block = nn.Sequential( + Resnet1D(width, depth, dilation_growth_rate, reverse_dilation=True, activation=activation, norm=norm), + nn.Upsample(scale_factor=2, mode='nearest'), + nn.Conv1d(width, out_dim, 3, 1, 1) + ) + blocks.append(block) + blocks.append(nn.Conv1d(width, width, 3, 1, 1)) + blocks.append(nn.ReLU()) + blocks.append(nn.Conv1d(width, input_emb_width, 3, 1, 1)) + self.model = nn.Sequential(*blocks) + + def forward(self, x): + x = self.model(x) + return x.permute(0, 2, 1) \ No newline at end of file diff --git a/src/momask-preenc/models/vq/model.py b/src/momask-preenc/models/vq/model.py new file mode 100644 index 0000000000000000000000000000000000000000..d6fbe9423380e729b569f8f02a09840d320d3cdd --- /dev/null +++ b/src/momask-preenc/models/vq/model.py @@ -0,0 +1,124 @@ +import random + +import torch.nn as nn +from models.vq.encdec import Encoder, Decoder +from models.vq.residual_vq import ResidualVQ + +class RVQVAE(nn.Module): + def __init__(self, + args, + input_width=263, + nb_code=1024, + code_dim=512, + output_emb_width=512, + down_t=3, + stride_t=2, + width=512, + depth=3, + dilation_growth_rate=3, + activation='relu', + norm=None): + + super().__init__() + assert output_emb_width == code_dim + self.code_dim = code_dim + self.num_code = nb_code + # self.quant = args.quantizer + self.encoder = Encoder(input_width, output_emb_width, down_t, stride_t, width, depth, + dilation_growth_rate, activation=activation, norm=norm) + self.decoder = Decoder(input_width, output_emb_width, down_t, stride_t, width, depth, + dilation_growth_rate, activation=activation, norm=norm) + rvqvae_config = { + 'num_quantizers': args.num_quantizers, + 'shared_codebook': args.shared_codebook, + 'quantize_dropout_prob': args.quantize_dropout_prob, + 'quantize_dropout_cutoff_index': 0, + 'nb_code': nb_code, + 'code_dim':code_dim, + 'args': args, + } + self.quantizer = ResidualVQ(**rvqvae_config) + + def preprocess(self, x): + # (bs, T, Jx3) -> (bs, Jx3, T) + x = x.permute(0, 2, 1).float() + return x + + def postprocess(self, x): + # (bs, Jx3, T) -> (bs, T, Jx3) + x = x.permute(0, 2, 1) + return x + + def encode(self, x): + N, T, _ = x.shape + x_in = self.preprocess(x) + x_encoder = self.encoder(x_in) + # print(x_encoder.shape) + code_idx, all_codes = self.quantizer.quantize(x_encoder, return_latent=True) + # print(code_idx.shape) + # code_idx = code_idx.view(N, -1) + # (N, T, Q) + # print() + return code_idx, all_codes + + def forward(self, x): + x_in = self.preprocess(x) + # Encode + x_encoder = self.encoder(x_in) + + ## quantization + # x_quantized, code_idx, commit_loss, perplexity = self.quantizer(x_encoder, sample_codebook_temp=0.5, + # force_dropout_index=0) #TODO hardcode + x_quantized, code_idx, commit_loss, perplexity = self.quantizer(x_encoder, sample_codebook_temp=0.5) + + # print(code_idx[0, :, 1]) + ## decoder + x_out = self.decoder(x_quantized) + # x_out = self.postprocess(x_decoder) + return x_out, commit_loss, perplexity + + def forward_decoder(self, x): + x_d = self.quantizer.get_codes_from_indices(x) + # x_d = x_d.view(1, -1, self.code_dim).permute(0, 2, 1).contiguous() + x = x_d.sum(dim=0).permute(0, 2, 1) + + # decoder + x_out = self.decoder(x) + # x_out = self.postprocess(x_decoder) + return x_out + +class LengthEstimator(nn.Module): + def __init__(self, input_size, output_size): + super(LengthEstimator, self).__init__() + nd = 512 + self.output = nn.Sequential( + nn.Linear(input_size, nd), + nn.LayerNorm(nd), + nn.LeakyReLU(0.2, inplace=True), + + nn.Dropout(0.2), + nn.Linear(nd, nd // 2), + nn.LayerNorm(nd // 2), + nn.LeakyReLU(0.2, inplace=True), + + nn.Dropout(0.2), + nn.Linear(nd // 2, nd // 4), + nn.LayerNorm(nd // 4), + nn.LeakyReLU(0.2, inplace=True), + + nn.Linear(nd // 4, output_size) + ) + + self.output.apply(self.__init_weights) + + def __init_weights(self, module): + if isinstance(module, (nn.Linear, nn.Embedding)): + module.weight.data.normal_(mean=0.0, std=0.02) + if isinstance(module, nn.Linear) and module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def forward(self, text_emb): + return self.output(text_emb) \ No newline at end of file diff --git a/src/momask-preenc/models/vq/quantizer.py b/src/momask-preenc/models/vq/quantizer.py new file mode 100644 index 0000000000000000000000000000000000000000..42cd1d0092401d723f1c4a2133369089149c6766 --- /dev/null +++ b/src/momask-preenc/models/vq/quantizer.py @@ -0,0 +1,180 @@ +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from einops import rearrange, repeat, reduce, pack, unpack + +# from vector_quantize_pytorch import ResidualVQ + +#Borrow from vector_quantize_pytorch + +def log(t, eps = 1e-20): + return torch.log(t.clamp(min = eps)) + +def gumbel_noise(t): + noise = torch.zeros_like(t).uniform_(0, 1) + return -log(-log(noise)) + +def gumbel_sample( + logits, + temperature = 1., + stochastic = False, + dim = -1, + training = True +): + + if training and stochastic and temperature > 0: + sampling_logits = (logits / temperature) + gumbel_noise(logits) + else: + sampling_logits = logits + + ind = sampling_logits.argmax(dim = dim) + + return ind + +class QuantizeEMAReset(nn.Module): + def __init__(self, nb_code, code_dim, args): + super(QuantizeEMAReset, self).__init__() + self.nb_code = nb_code + self.code_dim = code_dim + self.mu = args.mu ##TO_DO + self.reset_codebook() + + def reset_codebook(self): + self.init = False + self.code_sum = None + self.code_count = None + self.register_buffer('codebook', torch.zeros(self.nb_code, self.code_dim, requires_grad=False)) + + def _tile(self, x): + nb_code_x, code_dim = x.shape + if nb_code_x < self.nb_code: + n_repeats = (self.nb_code + nb_code_x - 1) // nb_code_x + std = 0.01 / np.sqrt(code_dim) + out = x.repeat(n_repeats, 1) + out = out + torch.randn_like(out) * std + else: + out = x + return out + + def init_codebook(self, x): + out = self._tile(x) + self.codebook = out[:self.nb_code] + self.code_sum = self.codebook.clone() + self.code_count = torch.ones(self.nb_code, device=self.codebook.device) + self.init = True + + def quantize(self, x, sample_codebook_temp=0.): + # N X C -> C X N + k_w = self.codebook.t() + # x: NT X C + # NT X N + distance = torch.sum(x ** 2, dim=-1, keepdim=True) - \ + 2 * torch.matmul(x, k_w) + \ + torch.sum(k_w ** 2, dim=0, keepdim=True) # (N * L, b) + + # code_idx = torch.argmin(distance, dim=-1) + + code_idx = gumbel_sample(-distance, dim = -1, temperature = sample_codebook_temp, stochastic=True, training = self.training) + + return code_idx + + def dequantize(self, code_idx): + x = F.embedding(code_idx, self.codebook) + return x + + def get_codebook_entry(self, indices): + return self.dequantize(indices).permute(0, 2, 1) + + @torch.no_grad() + def compute_perplexity(self, code_idx): + # Calculate new centres + code_onehot = torch.zeros(self.nb_code, code_idx.shape[0], device=code_idx.device) # nb_code, N * L + code_onehot.scatter_(0, code_idx.view(1, code_idx.shape[0]), 1) + + code_count = code_onehot.sum(dim=-1) # nb_code + prob = code_count / torch.sum(code_count) + perplexity = torch.exp(-torch.sum(prob * torch.log(prob + 1e-7))) + return perplexity + + @torch.no_grad() + def update_codebook(self, x, code_idx): + code_onehot = torch.zeros(self.nb_code, x.shape[0], device=x.device) # nb_code, N * L + code_onehot.scatter_(0, code_idx.view(1, x.shape[0]), 1) + + code_sum = torch.matmul(code_onehot, x) # nb_code, c + code_count = code_onehot.sum(dim=-1) # nb_code + + out = self._tile(x) + code_rand = out[:self.nb_code] + + # Update centres + self.code_sum = self.mu * self.code_sum + (1. - self.mu) * code_sum + self.code_count = self.mu * self.code_count + (1. - self.mu) * code_count + + usage = (self.code_count.view(self.nb_code, 1) >= 1.0).float() + code_update = self.code_sum.view(self.nb_code, self.code_dim) / self.code_count.view(self.nb_code, 1) + self.codebook = usage * code_update + (1-usage) * code_rand + + + prob = code_count / torch.sum(code_count) + perplexity = torch.exp(-torch.sum(prob * torch.log(prob + 1e-7))) + + return perplexity + + def preprocess(self, x): + # NCT -> NTC -> [NT, C] + # x = x.permute(0, 2, 1).contiguous() + # x = x.view(-1, x.shape[-1]) + x = rearrange(x, 'n c t -> (n t) c') + return x + + def forward(self, x, return_idx=False, temperature=0.): + N, width, T = x.shape + + x = self.preprocess(x) + if self.training and not self.init: + self.init_codebook(x) + + code_idx = self.quantize(x, temperature) + x_d = self.dequantize(code_idx) + + if self.training: + perplexity = self.update_codebook(x, code_idx) + else: + perplexity = self.compute_perplexity(code_idx) + + commit_loss = F.mse_loss(x, x_d.detach()) # It's right. the t2m-gpt paper is wrong on embed loss and commitment loss. + + # Passthrough + x_d = x + (x_d - x).detach() + + # Postprocess + x_d = x_d.view(N, T, -1).permute(0, 2, 1).contiguous() + code_idx = code_idx.view(N, T).contiguous() + # print(code_idx[0]) + if return_idx: + return x_d, code_idx, commit_loss, perplexity + return x_d, commit_loss, perplexity + +class QuantizeEMA(QuantizeEMAReset): + @torch.no_grad() + def update_codebook(self, x, code_idx): + code_onehot = torch.zeros(self.nb_code, x.shape[0], device=x.device) # nb_code, N * L + code_onehot.scatter_(0, code_idx.view(1, x.shape[0]), 1) + + code_sum = torch.matmul(code_onehot, x) # nb_code, c + code_count = code_onehot.sum(dim=-1) # nb_code + + # Update centres + self.code_sum = self.mu * self.code_sum + (1. - self.mu) * code_sum + self.code_count = self.mu * self.code_count + (1. - self.mu) * code_count + + usage = (self.code_count.view(self.nb_code, 1) >= 1.0).float() + code_update = self.code_sum.view(self.nb_code, self.code_dim) / self.code_count.view(self.nb_code, 1) + self.codebook = usage * code_update + (1-usage) * self.codebook + + prob = code_count / torch.sum(code_count) + perplexity = torch.exp(-torch.sum(prob * torch.log(prob + 1e-7))) + + return perplexity diff --git a/src/momask-preenc/models/vq/residual_vq.py b/src/momask-preenc/models/vq/residual_vq.py new file mode 100644 index 0000000000000000000000000000000000000000..6478260124d174ad35f539a612859ce749983fb8 --- /dev/null +++ b/src/momask-preenc/models/vq/residual_vq.py @@ -0,0 +1,194 @@ +import random +from math import ceil +from functools import partial +from itertools import zip_longest +from random import randrange + +import torch +from torch import nn +import torch.nn.functional as F +# from vector_quantize_pytorch.vector_quantize_pytorch import VectorQuantize +from models.vq.quantizer import QuantizeEMAReset, QuantizeEMA + +from einops import rearrange, repeat, pack, unpack + +# helper functions + +def exists(val): + return val is not None + +def default(val, d): + return val if exists(val) else d + +def round_up_multiple(num, mult): + return ceil(num / mult) * mult + +# main class + +class ResidualVQ(nn.Module): + """ Follows Algorithm 1. in https://arxiv.org/pdf/2107.03312.pdf """ + def __init__( + self, + num_quantizers, + shared_codebook=False, + quantize_dropout_prob=0.5, + quantize_dropout_cutoff_index=0, + **kwargs + ): + super().__init__() + + self.num_quantizers = num_quantizers + + # self.layers = nn.ModuleList([VectorQuantize(accept_image_fmap = accept_image_fmap, **kwargs) for _ in range(num_quantizers)]) + if shared_codebook: + layer = QuantizeEMAReset(**kwargs) + self.layers = nn.ModuleList([layer for _ in range(num_quantizers)]) + else: + self.layers = nn.ModuleList([QuantizeEMAReset(**kwargs) for _ in range(num_quantizers)]) + # self.layers = nn.ModuleList([QuantizeEMA(**kwargs) for _ in range(num_quantizers)]) + + # self.quantize_dropout = quantize_dropout and num_quantizers > 1 + + assert quantize_dropout_cutoff_index >= 0 and quantize_dropout_prob >= 0 + + self.quantize_dropout_cutoff_index = quantize_dropout_cutoff_index + self.quantize_dropout_prob = quantize_dropout_prob + + + @property + def codebooks(self): + codebooks = [layer.codebook for layer in self.layers] + codebooks = torch.stack(codebooks, dim = 0) + return codebooks # 'q c d' + + def get_codes_from_indices(self, indices): #indices shape 'b n q' # dequantize + + batch, quantize_dim = indices.shape[0], indices.shape[-1] + + # because of quantize dropout, one can pass in indices that are coarse + # and the network should be able to reconstruct + + if quantize_dim < self.num_quantizers: + indices = F.pad(indices, (0, self.num_quantizers - quantize_dim), value = -1) + + # get ready for gathering + + codebooks = repeat(self.codebooks, 'q c d -> q b c d', b = batch) + gather_indices = repeat(indices, 'b n q -> q b n d', d = codebooks.shape[-1]) + + # take care of quantizer dropout + + mask = gather_indices == -1. + gather_indices = gather_indices.masked_fill(mask, 0) # have it fetch a dummy code to be masked out later + + # print(gather_indices.max(), gather_indices.min()) + all_codes = codebooks.gather(2, gather_indices) # gather all codes + + # mask out any codes that were dropout-ed + + all_codes = all_codes.masked_fill(mask, 0.) + + return all_codes # 'q b n d' + + def get_codebook_entry(self, indices): #indices shape 'b n q' + all_codes = self.get_codes_from_indices(indices) #'q b n d' + latent = torch.sum(all_codes, dim=0) #'b n d' + latent = latent.permute(0, 2, 1) + return latent + + def forward(self, x, return_all_codes = False, sample_codebook_temp = None, force_dropout_index=-1): + # debug check + # print(self.codebooks[:,0,0].detach().cpu().numpy()) + num_quant, quant_dropout_prob, device = self.num_quantizers, self.quantize_dropout_prob, x.device + + quantized_out = 0. + residual = x + + all_losses = [] + all_indices = [] + all_perplexity = [] + + + should_quantize_dropout = self.training and random.random() < self.quantize_dropout_prob + + start_drop_quantize_index = num_quant + # To ensure the first-k layers learn things as much as possible, we randomly dropout the last q - k layers + if should_quantize_dropout: + start_drop_quantize_index = randrange(self.quantize_dropout_cutoff_index, num_quant) # keep quant layers <= quantize_dropout_cutoff_index, TODO vary in batch + null_indices_shape = [x.shape[0], x.shape[-1]] # 'b*n' + null_indices = torch.full(null_indices_shape, -1., device = device, dtype = torch.long) + # null_loss = 0. + + if force_dropout_index >= 0: + should_quantize_dropout = True + start_drop_quantize_index = force_dropout_index + null_indices_shape = [x.shape[0], x.shape[-1]] # 'b*n' + null_indices = torch.full(null_indices_shape, -1., device=device, dtype=torch.long) + + # print(force_dropout_index) + # go through the layers + + for quantizer_index, layer in enumerate(self.layers): + + if should_quantize_dropout and quantizer_index > start_drop_quantize_index: + all_indices.append(null_indices) + # all_losses.append(null_loss) + continue + + # layer_indices = None + # if return_loss: + # layer_indices = indices[..., quantizer_index] #gt indices + + # quantized, *rest = layer(residual, indices = layer_indices, sample_codebook_temp = sample_codebook_temp) #single quantizer TODO + quantized, *rest = layer(residual, return_idx=True, temperature=sample_codebook_temp) #single quantizer + + # print(quantized.shape, residual.shape) + residual -= quantized.detach() + quantized_out += quantized + + embed_indices, loss, perplexity = rest + all_indices.append(embed_indices) + all_losses.append(loss) + all_perplexity.append(perplexity) + + + # stack all losses and indices + all_indices = torch.stack(all_indices, dim=-1) + all_losses = sum(all_losses)/len(all_losses) + all_perplexity = sum(all_perplexity)/len(all_perplexity) + + ret = (quantized_out, all_indices, all_losses, all_perplexity) + + if return_all_codes: + # whether to return all codes from all codebooks across layers + all_codes = self.get_codes_from_indices(all_indices) + + # will return all codes in shape (quantizer, batch, sequence length, codebook dimension) + ret = (*ret, all_codes) + + return ret + + def quantize(self, x, return_latent=False): + all_indices = [] + quantized_out = 0. + residual = x + all_codes = [] + for quantizer_index, layer in enumerate(self.layers): + + quantized, *rest = layer(residual, return_idx=True) #single quantizer + + residual = residual - quantized.detach() + quantized_out = quantized_out + quantized + + embed_indices, loss, perplexity = rest + all_indices.append(embed_indices) + # print(quantizer_index, embed_indices[0]) + # print(quantizer_index, quantized[0]) + # break + all_codes.append(quantized) + + code_idx = torch.stack(all_indices, dim=-1) + all_codes = torch.stack(all_codes, dim=0) + if return_latent: + return code_idx, all_codes + return code_idx \ No newline at end of file diff --git a/src/momask-preenc/models/vq/resnet.py b/src/momask-preenc/models/vq/resnet.py new file mode 100644 index 0000000000000000000000000000000000000000..88d230d31055a6e66b0c9b75b29fff8935b8a1fd --- /dev/null +++ b/src/momask-preenc/models/vq/resnet.py @@ -0,0 +1,84 @@ +import torch.nn as nn +import torch + +class nonlinearity(nn.Module): + def __init(self): + super().__init__() + + def forward(self, x): + return x * torch.sigmoid(x) + + +class ResConv1DBlock(nn.Module): + def __init__(self, n_in, n_state, dilation=1, activation='silu', norm=None, dropout=0.2): + super(ResConv1DBlock, self).__init__() + + padding = dilation + self.norm = norm + + if norm == "LN": + self.norm1 = nn.LayerNorm(n_in) + self.norm2 = nn.LayerNorm(n_in) + elif norm == "GN": + self.norm1 = nn.GroupNorm(num_groups=32, num_channels=n_in, eps=1e-6, affine=True) + self.norm2 = nn.GroupNorm(num_groups=32, num_channels=n_in, eps=1e-6, affine=True) + elif norm == "BN": + self.norm1 = nn.BatchNorm1d(num_features=n_in, eps=1e-6, affine=True) + self.norm2 = nn.BatchNorm1d(num_features=n_in, eps=1e-6, affine=True) + else: + self.norm1 = nn.Identity() + self.norm2 = nn.Identity() + + if activation == "relu": + self.activation1 = nn.ReLU() + self.activation2 = nn.ReLU() + + elif activation == "silu": + self.activation1 = nonlinearity() + self.activation2 = nonlinearity() + + elif activation == "gelu": + self.activation1 = nn.GELU() + self.activation2 = nn.GELU() + + self.conv1 = nn.Conv1d(n_in, n_state, 3, 1, padding, dilation) + self.conv2 = nn.Conv1d(n_state, n_in, 1, 1, 0, ) + self.dropout = nn.Dropout(dropout) + + def forward(self, x): + x_orig = x + if self.norm == "LN": + x = self.norm1(x.transpose(-2, -1)) + x = self.activation1(x.transpose(-2, -1)) + else: + x = self.norm1(x) + x = self.activation1(x) + + x = self.conv1(x) + + if self.norm == "LN": + x = self.norm2(x.transpose(-2, -1)) + x = self.activation2(x.transpose(-2, -1)) + else: + x = self.norm2(x) + x = self.activation2(x) + + x = self.conv2(x) + x = self.dropout(x) + x = x + x_orig + return x + + +class Resnet1D(nn.Module): + def __init__(self, n_in, n_depth, dilation_growth_rate=1, reverse_dilation=True, activation='relu', norm=None): + super().__init__() + + blocks = [ResConv1DBlock(n_in, n_in, dilation=dilation_growth_rate ** depth, activation=activation, norm=norm) + for depth in range(n_depth)] + if reverse_dilation: + blocks = blocks[::-1] + + self.model = nn.Sequential(*blocks) + + def forward(self, x): + return self.model(x) \ No newline at end of file diff --git a/src/momask-preenc/models/vq/vq_trainer.py b/src/momask-preenc/models/vq/vq_trainer.py new file mode 100644 index 0000000000000000000000000000000000000000..e8fe2863ede4945ac3e5f38d5ece6fa0a26e2080 --- /dev/null +++ b/src/momask-preenc/models/vq/vq_trainer.py @@ -0,0 +1,359 @@ +import torch +from torch.utils.data import DataLoader +from torch.nn.utils import clip_grad_norm_ +from torch.utils.tensorboard import SummaryWriter +from os.path import join as pjoin +import torch.nn.functional as F + +import torch.optim as optim + +import time +import numpy as np +from collections import OrderedDict, defaultdict +from utils.eval_t2m import evaluation_vqvae +from utils.utils import print_current_loss + +import os +import sys + +def def_value(): + return 0.0 + + +class RVQTokenizerTrainer: + def __init__(self, args, vq_model): + self.opt = args + self.vq_model = vq_model + self.device = args.device + + if args.is_train: + self.logger = SummaryWriter(args.log_dir) + if args.recons_loss == 'l1': + self.l1_criterion = torch.nn.L1Loss() + elif args.recons_loss == 'l1_smooth': + self.l1_criterion = torch.nn.SmoothL1Loss() + + # self.critic = CriticWrapper(self.opt.dataset_name, self.opt.device) + + def forward(self, batch_data): + motions = batch_data.detach().to(self.device).float() + pred_motion, loss_commit, perplexity = self.vq_model(motions) + + self.motions = motions + self.pred_motion = pred_motion + + loss_rec = self.l1_criterion(pred_motion, motions) + pred_local_pos = pred_motion[..., 4 : (self.opt.joints_num - 1) * 3 + 4] + local_pos = motions[..., 4 : (self.opt.joints_num - 1) * 3 + 4] + loss_explicit = self.l1_criterion(pred_local_pos, local_pos) + + loss = loss_rec + self.opt.loss_vel * loss_explicit + self.opt.commit * loss_commit + + # return loss, loss_rec, loss_vel, loss_commit, perplexity + # return loss, loss_rec, loss_percept, loss_commit, perplexity + return loss, loss_rec, loss_explicit, loss_commit, perplexity + + + # @staticmethod + def update_lr_warm_up(self, nb_iter, warm_up_iter, lr): + + current_lr = lr * (nb_iter + 1) / (warm_up_iter + 1) + for param_group in self.opt_vq_model.param_groups: + param_group["lr"] = current_lr + + return current_lr + + def save(self, file_name, ep, total_it): + state = { + "vq_model": self.vq_model.state_dict(), + "opt_vq_model": self.opt_vq_model.state_dict(), + "scheduler": self.scheduler.state_dict(), + 'ep': ep, + 'total_it': total_it, + } + torch.save(state, file_name) + + def resume(self, model_dir): + checkpoint = torch.load(model_dir, map_location=self.device) + self.vq_model.load_state_dict(checkpoint['vq_model']) + self.opt_vq_model.load_state_dict(checkpoint['opt_vq_model']) + self.scheduler.load_state_dict(checkpoint['scheduler']) + return checkpoint['ep'], checkpoint['total_it'] + + def train(self, train_loader, val_loader, eval_val_loader, eval_wrapper, plot_eval=None): + self.vq_model.to(self.device) + + self.opt_vq_model = optim.AdamW(self.vq_model.parameters(), lr=self.opt.lr, betas=(0.9, 0.99), weight_decay=self.opt.weight_decay) + self.scheduler = torch.optim.lr_scheduler.MultiStepLR(self.opt_vq_model, milestones=self.opt.milestones, gamma=self.opt.gamma) + + epoch = 0 + it = 0 + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + print("Load model epoch:%d iterations:%d"%(epoch, it)) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_loader) + print(f'Total Epochs: {self.opt.max_epoch}, Total Iters: {total_iters}') + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_loader), len(eval_val_loader))) + # val_loss = 0 + # min_val_loss = np.inf + # min_val_epoch = epoch + current_lr = self.opt.lr + logs = defaultdict(def_value, OrderedDict()) + + # sys.exit() + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_vqvae( + self.opt.model_dir, eval_val_loader, self.vq_model, self.logger, epoch, best_fid=1000, + best_div=100, best_top1=0, + best_top2=0, best_top3=0, best_matching=100, + eval_wrapper=eval_wrapper, save=False) + + while epoch < self.opt.max_epoch: + self.vq_model.train() + for i, batch_data in enumerate(train_loader): + it += 1 + if it < self.opt.warm_up_iter: + current_lr = self.update_lr_warm_up(it, self.opt.warm_up_iter, self.opt.lr) + loss, loss_rec, loss_vel, loss_commit, perplexity = self.forward(batch_data) + self.opt_vq_model.zero_grad() + loss.backward() + self.opt_vq_model.step() + + if it >= self.opt.warm_up_iter: + self.scheduler.step() + + logs['loss'] += loss.item() + logs['loss_rec'] += loss_rec.item() + # Note it not necessarily velocity, too lazy to change the name now + logs['loss_vel'] += loss_vel.item() + logs['loss_commit'] += loss_commit.item() + logs['perplexity'] += perplexity.item() + logs['lr'] += self.opt_vq_model.param_groups[0]['lr'] + + if it % self.opt.log_every == 0: + mean_loss = OrderedDict() + # self.logger.add_scalar('val_loss', val_loss, it) + # self.l + for tag, value in logs.items(): + self.logger.add_scalar('Train/%s'%tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = defaultdict(def_value, OrderedDict()) + print_current_loss(start_time, it, total_iters, mean_loss, epoch=epoch, inner_iter=i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + # if epoch % self.opt.save_every_e == 0: + # self.save(pjoin(self.opt.model_dir, 'E%04d.tar' % (epoch)), epoch, total_it=it) + + print('Validation time:') + self.vq_model.eval() + val_loss_rec = [] + val_loss_vel = [] + val_loss_commit = [] + val_loss = [] + val_perpexity = [] + with torch.no_grad(): + for i, batch_data in enumerate(val_loader): + loss, loss_rec, loss_vel, loss_commit, perplexity = self.forward(batch_data) + # val_loss_rec += self.l1_criterion(self.recon_motions, self.motions).item() + # val_loss_emb += self.embedding_loss.item() + val_loss.append(loss.item()) + val_loss_rec.append(loss_rec.item()) + val_loss_vel.append(loss_vel.item()) + val_loss_commit.append(loss_commit.item()) + val_perpexity.append(perplexity.item()) + + # val_loss = val_loss_rec / (len(val_dataloader) + 1) + # val_loss = val_loss / (len(val_dataloader) + 1) + # val_loss_rec = val_loss_rec / (len(val_dataloader) + 1) + # val_loss_emb = val_loss_emb / (len(val_dataloader) + 1) + self.logger.add_scalar('Val/loss', sum(val_loss) / len(val_loss), epoch) + self.logger.add_scalar('Val/loss_rec', sum(val_loss_rec) / len(val_loss_rec), epoch) + self.logger.add_scalar('Val/loss_vel', sum(val_loss_vel) / len(val_loss_vel), epoch) + self.logger.add_scalar('Val/loss_commit', sum(val_loss_commit) / len(val_loss), epoch) + self.logger.add_scalar('Val/loss_perplexity', sum(val_perpexity) / len(val_loss_rec), epoch) + + print('Validation Loss: %.5f Reconstruction: %.5f, Velocity: %.5f, Commit: %.5f' % + (sum(val_loss)/len(val_loss), sum(val_loss_rec)/len(val_loss), + sum(val_loss_vel)/len(val_loss), sum(val_loss_commit)/len(val_loss))) + + # if sum(val_loss) / len(val_loss) < min_val_loss: + # min_val_loss = sum(val_loss) / len(val_loss) + # # if sum(val_loss_vel) / len(val_loss_vel) < min_val_loss: + # # min_val_loss = sum(val_loss_vel) / len(val_loss_vel) + # min_val_epoch = epoch + # self.save(pjoin(self.opt.model_dir, 'finest.tar'), epoch, it) + # print('Best Validation Model So Far!~') + + best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer = evaluation_vqvae( + self.opt.model_dir, eval_val_loader, self.vq_model, self.logger, epoch, best_fid=best_fid, + best_div=best_div, best_top1=best_top1, + best_top2=best_top2, best_top3=best_top3, best_matching=best_matching, eval_wrapper=eval_wrapper) + + + if epoch % self.opt.eval_every_e == 0: + data = torch.cat([self.motions[:4], self.pred_motion[:4]], dim=0).detach().cpu().numpy() + # np.save(pjoin(self.opt.eval_dir, 'E%04d.npy' % (epoch)), data) + save_dir = pjoin(self.opt.eval_dir, 'E%04d' % (epoch)) + os.makedirs(save_dir, exist_ok=True) + plot_eval(data, save_dir) + # if plot_eval is not None: + # save_dir = pjoin(self.opt.eval_dir, 'E%04d' % (epoch)) + # os.makedirs(save_dir, exist_ok=True) + # plot_eval(data, save_dir) + + # if epoch - min_val_epoch >= self.opt.early_stop_e: + # print('Early Stopping!~') + + +class LengthEstTrainer(object): + + def __init__(self, args, estimator, text_encoder, encode_fnc): + self.opt = args + self.estimator = estimator + self.text_encoder = text_encoder + self.encode_fnc = encode_fnc + self.device = args.device + + if args.is_train: + # self.motion_dis + self.logger = SummaryWriter(args.log_dir) + self.mul_cls_criterion = torch.nn.CrossEntropyLoss() + + def resume(self, model_dir): + checkpoints = torch.load(model_dir, map_location=self.device) + self.estimator.load_state_dict(checkpoints['estimator']) + # self.opt_estimator.load_state_dict(checkpoints['opt_estimator']) + return checkpoints['epoch'], checkpoints['iter'] + + def save(self, model_dir, epoch, niter): + state = { + 'estimator': self.estimator.state_dict(), + # 'opt_estimator': self.opt_estimator.state_dict(), + 'epoch': epoch, + 'niter': niter, + } + torch.save(state, model_dir) + + @staticmethod + def zero_grad(opt_list): + for opt in opt_list: + opt.zero_grad() + + @staticmethod + def clip_norm(network_list): + for network in network_list: + clip_grad_norm_(network.parameters(), 0.5) + + @staticmethod + def step(opt_list): + for opt in opt_list: + opt.step() + + def train(self, train_dataloader, val_dataloader): + self.estimator.to(self.device) + self.text_encoder.to(self.device) + + self.opt_estimator = optim.Adam(self.estimator.parameters(), lr=self.opt.lr) + + epoch = 0 + it = 0 + + if self.opt.is_continue: + model_dir = pjoin(self.opt.model_dir, 'latest.tar') + epoch, it = self.resume(model_dir) + + start_time = time.time() + total_iters = self.opt.max_epoch * len(train_dataloader) + print('Iters Per Epoch, Training: %04d, Validation: %03d' % (len(train_dataloader), len(val_dataloader))) + val_loss = 0 + min_val_loss = np.inf + logs = defaultdict(float) + while epoch < self.opt.max_epoch: + # time0 = time.time() + for i, batch_data in enumerate(train_dataloader): + self.estimator.train() + + conds, _, m_lens = batch_data + # word_emb = word_emb.detach().to(self.device).float() + # pos_ohot = pos_ohot.detach().to(self.device).float() + # m_lens = m_lens.to(self.device).long() + text_embs = self.encode_fnc(self.text_encoder, conds, self.opt.device).detach() + # print(text_embs.shape, text_embs.device) + + pred_dis = self.estimator(text_embs) + + self.zero_grad([self.opt_estimator]) + + gt_labels = m_lens // self.opt.unit_length + gt_labels = gt_labels.long().to(self.device) + # print(gt_labels.shape, pred_dis.shape) + # print(gt_labels.max(), gt_labels.min()) + # print(pred_dis) + acc = (gt_labels == pred_dis.argmax(dim=-1)).sum() / len(gt_labels) + loss = self.mul_cls_criterion(pred_dis, gt_labels) + + loss.backward() + + self.clip_norm([self.estimator]) + self.step([self.opt_estimator]) + + logs['loss'] += loss.item() + logs['acc'] += acc.item() + + it += 1 + if it % self.opt.log_every == 0: + mean_loss = OrderedDict({'val_loss': val_loss}) + # self.logger.add_scalar('Val/loss', val_loss, it) + + for tag, value in logs.items(): + self.logger.add_scalar("Train/%s"%tag, value / self.opt.log_every, it) + mean_loss[tag] = value / self.opt.log_every + logs = defaultdict(float) + print_current_loss(start_time, it, total_iters, mean_loss, epoch=epoch, inner_iter=i) + + if it % self.opt.save_latest == 0: + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + self.save(pjoin(self.opt.model_dir, 'latest.tar'), epoch, it) + + epoch += 1 + + print('Validation time:') + + val_loss = 0 + val_acc = 0 + # self.estimator.eval() + with torch.no_grad(): + for i, batch_data in enumerate(val_dataloader): + self.estimator.eval() + + conds, _, m_lens = batch_data + # word_emb = word_emb.detach().to(self.device).float() + # pos_ohot = pos_ohot.detach().to(self.device).float() + # m_lens = m_lens.to(self.device).long() + text_embs = self.encode_fnc(self.text_encoder, conds, self.opt.device) + pred_dis = self.estimator(text_embs) + + gt_labels = m_lens // self.opt.unit_length + gt_labels = gt_labels.long().to(self.device) + loss = self.mul_cls_criterion(pred_dis, gt_labels) + acc = (gt_labels == pred_dis.argmax(dim=-1)).sum() / len(gt_labels) + + val_loss += loss.item() + val_acc += acc.item() + + + val_loss = val_loss / len(val_dataloader) + val_acc = val_acc / len(val_dataloader) + print('Validation Loss: %.5f Validation Acc: %.5f' % (val_loss, val_acc)) + + if val_loss < min_val_loss: + self.save(pjoin(self.opt.model_dir, 'finest.tar'), epoch, it) + min_val_loss = val_loss diff --git a/src/momask-preenc/motion_loaders/__init__.py b/src/momask-preenc/motion_loaders/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/motion_loaders/dataset_motion_loader.py b/src/momask-preenc/motion_loaders/dataset_motion_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..aec8320a39566a2bcc21931d1ada04aad32e9dc2 --- /dev/null +++ b/src/momask-preenc/motion_loaders/dataset_motion_loader.py @@ -0,0 +1,27 @@ +from data.t2m_dataset import Text2MotionDatasetEval, collate_fn # TODO +from utils.word_vectorizer import WordVectorizer +import numpy as np +from os.path import join as pjoin +from torch.utils.data import DataLoader +from utils.get_opt import get_opt + +def get_dataset_motion_loader(opt_path, batch_size, fname, device): + opt = get_opt(opt_path, device) + + # Configurations of T2M dataset and KIT dataset is almost the same + if opt.dataset_name == 't2m' or opt.dataset_name == 'kit': + print('Loading dataset %s ...' % opt.dataset_name) + + mean = np.load(pjoin(opt.meta_dir, 'mean.npy')) + std = np.load(pjoin(opt.meta_dir, 'std.npy')) + + w_vectorizer = WordVectorizer('./glove', 'our_vab') + split_file = pjoin(opt.data_root, '%s.txt'%fname) + dataset = Text2MotionDatasetEval(opt, mean, std, split_file, w_vectorizer) + dataloader = DataLoader(dataset, batch_size=batch_size, num_workers=4, drop_last=True, + collate_fn=collate_fn, shuffle=True) + else: + raise KeyError('Dataset not Recognized !!') + + print('Ground Truth Dataset Loading Completed!!!') + return dataloader, dataset \ No newline at end of file diff --git a/src/momask-preenc/options/__init__.py b/src/momask-preenc/options/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/options/base_option.py b/src/momask-preenc/options/base_option.py new file mode 100644 index 0000000000000000000000000000000000000000..fe1b7c4ead888e944c7c89acbac8a87ec002f158 --- /dev/null +++ b/src/momask-preenc/options/base_option.py @@ -0,0 +1,72 @@ +import argparse +import os +import torch + +class BaseOptions(): + def __init__(self): + self.parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + self.initialized = False + + def initialize(self): + self.parser.add_argument('--name', type=str, default="t2m_nlayer8_nhead6_ld384_ff1024_cdp0.1_rvq6ns", help='Name of this trial') + + self.parser.add_argument('--vq_name', type=str, default="rvq_nq1_dc512_nc512", help='Name of the rvq model.') + + self.parser.add_argument("--gpu_id", type=int, default=-1, help='GPU id') + self.parser.add_argument('--dataset_name', type=str, default='t2m', help='Dataset Name, {t2m} for humanml3d, {kit} for kit-ml') + self.parser.add_argument('--checkpoints_dir', type=str, default='./checkpoints', help='models are saved here.') + + self.parser.add_argument('--latent_dim', type=int, default=384, help='Dimension of transformer latent.') + self.parser.add_argument('--n_heads', type=int, default=6, help='Number of heads.') + self.parser.add_argument('--n_layers', type=int, default=8, help='Number of attention layers.') + self.parser.add_argument('--ff_size', type=int, default=1024, help='FF_Size') + self.parser.add_argument('--dropout', type=float, default=0.2, help='Dropout ratio in transformer') + + self.parser.add_argument("--max_motion_length", type=int, default=196, help="Max length of motion") + self.parser.add_argument("--unit_length", type=int, default=1, help="Downscale ratio of VQ") + + self.parser.add_argument('--force_mask', action="store_true", help='True: mask out conditions') + + # Pre-encoded training arguments + self.parser.add_argument('--use_preenc', action="store_true", help='Use pre-encoded tokens for training (no VQ model needed)') + self.parser.add_argument('--preenc_dir', type=str, default='./dataset/enc_z_rvq', help='Directory containing pre-encoded data') + self.parser.add_argument('--preenc_prefix', type=str, default='exp', help='Prefix for pre-encoded data folder names') + self.parser.add_argument('--preenc_suffix', type=str, default='recon_faceZ_mirror_wtextV3', help='Suffix for pre-encoded data folder names') + self.parser.add_argument('--preload_data', action="store_true", help='Preload all pre-encoded data into memory') + self.parser.add_argument('--code_dim', type=int, default=256, help='Code dimension for pre-encoded mode (when not loading VQ model)') + self.parser.add_argument('--num_quantizers', type=int, default=6, help='Number of quantizers for pre-encoded mode') + self.parser.add_argument('--num_tokens', type=int, default=512, help='Number of tokens for pre-encoded mode') + self.parser.add_argument('--shared_codebook', action="store_true", help='Whether the codebook is shared') + + self.initialized = True + + def parse(self): + if not self.initialized: + self.initialize() + + self.opt = self.parser.parse_args() + + self.opt.is_train = self.is_train + + if self.opt.gpu_id != -1: + # self.opt.gpu_id = int(self.opt.gpu_id) + torch.cuda.set_device(self.opt.gpu_id) + + args = vars(self.opt) + + print('------------ Options -------------') + for k, v in sorted(args.items()): + print('%s: %s' % (str(k), str(v))) + print('-------------- End ----------------') + if self.is_train: + # save to the disk + expr_dir = os.path.join(self.opt.checkpoints_dir, self.opt.dataset_name, self.opt.name) + if not os.path.exists(expr_dir): + os.makedirs(expr_dir) + file_name = os.path.join(expr_dir, 'opt.txt') + with open(file_name, 'wt') as opt_file: + opt_file.write('------------ Options -------------\n') + for k, v in sorted(args.items()): + opt_file.write('%s: %s\n' % (str(k), str(v))) + opt_file.write('-------------- End ----------------\n') + return self.opt diff --git a/src/momask-preenc/options/eval_option.py b/src/momask-preenc/options/eval_option.py new file mode 100644 index 0000000000000000000000000000000000000000..4bb426f449c03ea0c625dd009fd4124f346612f5 --- /dev/null +++ b/src/momask-preenc/options/eval_option.py @@ -0,0 +1,38 @@ +from options.base_option import BaseOptions + +class EvalT2MOptions(BaseOptions): + def initialize(self): + BaseOptions.initialize(self) + self.parser.add_argument('--which_epoch', type=str, default="latest", help='Checkpoint you want to use, {latest, net_best_fid, etc}') + self.parser.add_argument('--batch_size', type=int, default=32, help='Batch size') + + self.parser.add_argument('--ext', type=str, default='text2motion', help='Extension of the result file or folder') + self.parser.add_argument("--num_batch", default=2, type=int, + help="Number of batch for generation") + self.parser.add_argument("--repeat_times", default=1, type=int, + help="Number of repetitions, per sample text prompt") + self.parser.add_argument("--cond_scale", default=4, type=float, + help="For classifier-free sampling - specifies the s parameter, as defined in the paper.") + self.parser.add_argument("--temperature", default=1., type=float, + help="Sampling Temperature.") + self.parser.add_argument("--topkr", default=0.9, type=float, + help="Filter out percentil low prop entries.") + self.parser.add_argument("--time_steps", default=18, type=int, + help="Mask Generate steps.") + self.parser.add_argument("--seed", default=10107, type=int) + + self.parser.add_argument('--gumbel_sample', action="store_true", help='True: gumbel sampling, False: categorical sampling.') + self.parser.add_argument('--use_res_model', action="store_true", help='Whether to use residual transformer.') + # self.parser.add_argument('--est_length', action="store_true", help='Training iterations') + + self.parser.add_argument('--res_name', type=str, default='tres_nlayer8_ld384_ff1024_rvq6ns_cdp0.2_sw', help='Model name of residual transformer') + self.parser.add_argument('--text_path', type=str, default="", help='Text prompt file') + + + self.parser.add_argument('-msec', '--mask_edit_section', nargs='*', type=str, help='Indicate sections for editing, use comma to separate the start and end of a section' + 'type int will specify the token frame, type float will specify the ratio of seq_len') + self.parser.add_argument('--text_prompt', default='', type=str, help="A text prompt to be generated. If empty, will take text prompts from dataset.") + self.parser.add_argument('--source_motion', default='example_data/000612.npy', type=str, help="Source motion path for editing. (new_joint_vecs format .npy file)") + self.parser.add_argument("--motion_length", default=0, type=int, + help="Motion length for generation, only applicable with single text prompt.") + self.is_train = False diff --git a/src/momask-preenc/options/train_option.py b/src/momask-preenc/options/train_option.py new file mode 100644 index 0000000000000000000000000000000000000000..4f61ea6a7299ad6945bf3a20919844e5b4c832af --- /dev/null +++ b/src/momask-preenc/options/train_option.py @@ -0,0 +1,64 @@ +from options.base_option import BaseOptions +import argparse + +class TrainT2MOptions(BaseOptions): + def initialize(self): + BaseOptions.initialize(self) + self.parser.add_argument('--batch_size', type=int, default=64, help='Batch size') + self.parser.add_argument('--max_epoch', type=int, default=500, help='Maximum number of epoch for training') + # self.parser.add_argument('--max_iters', type=int, default=150_000, help='Training iterations') + + '''LR scheduler''' + self.parser.add_argument('--lr', type=float, default=2e-4, help='Learning rate') + self.parser.add_argument('--gamma', type=float, default=0.1, help='Learning rate schedule factor') + self.parser.add_argument('--milestones', default=[50_000], nargs="+", type=int, + help="learning rate schedule (iterations)") + self.parser.add_argument('--warm_up_iter', default=2000, type=int, help='number of total iterations for warmup') + + '''Condition''' + self.parser.add_argument('--cond_drop_prob', type=float, default=0.1, help='Drop ratio of condition, for classifier-free guidance') + self.parser.add_argument("--seed", default=3407, type=int, help="Seed") + + self.parser.add_argument('--is_continue', action="store_true", help='Is this trial continuing previous state?') + self.parser.add_argument('--gumbel_sample', action="store_true", help='Strategy for token sampling, True: Gumbel sampling, False: Categorical sampling') + self.parser.add_argument('--share_weight', action="store_true", help='Whether to share weight for projection/embedding, for residual transformer.') + + self.parser.add_argument('--log_every', type=int, default=50, help='Frequency of printing training progress, (iteration)') + # self.parser.add_argument('--save_every_e', type=int, default=100, help='Frequency of printing training progress') + self.parser.add_argument('--eval_every_e', type=int, default=10, help='Frequency of animating eval results, (epoch)') + self.parser.add_argument('--save_latest', type=int, default=500, help='Frequency of saving checkpoint, (iteration)') + + + self.is_train = True + + +class TrainLenEstOptions(): + def __init__(self): + self.parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + self.parser.add_argument('--name', type=str, default="test", help='Name of this trial') + self.parser.add_argument("--gpu_id", type=int, default=-1, help='GPU id') + + self.parser.add_argument('--dataset_name', type=str, default='t2m', help='Dataset Name') + self.parser.add_argument('--checkpoints_dir', type=str, default='./checkpoints', help='models are saved here') + + self.parser.add_argument('--batch_size', type=int, default=64, help='Batch size') + + self.parser.add_argument("--unit_length", type=int, default=1, help="Length of motion") + self.parser.add_argument("--max_text_len", type=int, default=20, help="Length of motion") + + self.parser.add_argument('--max_epoch', type=int, default=300, help='Training iterations') + + self.parser.add_argument('--lr', type=float, default=1e-4, help='Layers of GRU') + + self.parser.add_argument('--is_continue', action="store_true", help='Training iterations') + + self.parser.add_argument('--log_every', type=int, default=50, help='Frequency of printing training progress') + self.parser.add_argument('--save_every_e', type=int, default=5, help='Frequency of printing training progress') + self.parser.add_argument('--eval_every_e', type=int, default=3, help='Frequency of printing training progress') + self.parser.add_argument('--save_latest', type=int, default=500, help='Frequency of printing training progress') + + def parse(self): + self.opt = self.parser.parse_args() + self.opt.is_train = True + # args = vars(self.opt) + return self.opt diff --git a/src/momask-preenc/options/vq_option.py b/src/momask-preenc/options/vq_option.py new file mode 100644 index 0000000000000000000000000000000000000000..14f98ea6a61c862cf3dc72d874937b717cc4c182 --- /dev/null +++ b/src/momask-preenc/options/vq_option.py @@ -0,0 +1,89 @@ +import argparse +import os +import torch + +def arg_parse(is_train=False): + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + ## dataloader + parser.add_argument('--dataset_name', type=str, default='humanml3d', help='dataset directory') + parser.add_argument('--batch_size', default=256, type=int, help='batch size') + parser.add_argument('--window_size', type=int, default=64, help='training motion length') + parser.add_argument("--gpu_id", type=int, default=0, help='GPU id') + + ## optimization + parser.add_argument('--max_epoch', default=50, type=int, help='number of total epochs to run') + # parser.add_argument('--total_iter', default=None, type=int, help='number of total iterations to run') + parser.add_argument('--warm_up_iter', default=2000, type=int, help='number of total iterations for warmup') + parser.add_argument('--lr', default=2e-4, type=float, help='max learning rate') + parser.add_argument('--milestones', default=[150000, 250000], nargs="+", type=int, help="learning rate schedule (iterations)") + parser.add_argument('--gamma', default=0.1, type=float, help="learning rate decay") + + parser.add_argument('--weight_decay', default=0.0, type=float, help='weight decay') + parser.add_argument("--commit", type=float, default=0.02, help="hyper-parameter for the commitment loss") + parser.add_argument('--loss_vel', type=float, default=0.5, help='hyper-parameter for the velocity loss') + parser.add_argument('--recons_loss', type=str, default='l1_smooth', help='reconstruction loss') + + ## vqvae arch + parser.add_argument("--code_dim", type=int, default=512, help="embedding dimension") + parser.add_argument("--nb_code", type=int, default=512, help="nb of embedding") + parser.add_argument("--mu", type=float, default=0.99, help="exponential moving average to update the codebook") + parser.add_argument("--down_t", type=int, default=2, help="downsampling rate") + parser.add_argument("--stride_t", type=int, default=2, help="stride size") + parser.add_argument("--width", type=int, default=512, help="width of the network") + parser.add_argument("--depth", type=int, default=3, help="num of resblocks for each res") + parser.add_argument("--dilation_growth_rate", type=int, default=3, help="dilation growth rate") + parser.add_argument("--output_emb_width", type=int, default=512, help="output embedding width") + parser.add_argument('--vq_act', type=str, default='relu', choices=['relu', 'silu', 'gelu'], + help='dataset directory') + parser.add_argument('--vq_norm', type=str, default=None, help='dataset directory') + + parser.add_argument('--num_quantizers', type=int, default=3, help='num_quantizers') + parser.add_argument('--shared_codebook', action="store_true") + parser.add_argument('--quantize_dropout_prob', type=float, default=0.2, help='quantize_dropout_prob') + # parser.add_argument('--use_vq_prob', type=float, default=0.8, help='quantize_dropout_prob') + + parser.add_argument('--ext', type=str, default='default', help='reconstruction loss') + + + ## other + parser.add_argument('--name', type=str, default="test", help='Name of this trial') + parser.add_argument('--is_continue', action="store_true", help='Name of this trial') + parser.add_argument('--checkpoints_dir', type=str, default='./checkpoints', help='models are saved here') + parser.add_argument('--log_every', default=10, type=int, help='iter log frequency') + parser.add_argument('--save_latest', default=500, type=int, help='iter save latest model frequency') + parser.add_argument('--save_every_e', default=2, type=int, help='save model every n epoch') + parser.add_argument('--eval_every_e', default=1, type=int, help='save eval results every n epoch') + # parser.add_argument('--early_stop_e', default=5, type=int, help='early stopping epoch') + parser.add_argument('--feat_bias', type=float, default=5, help='Layers of GRU') + + parser.add_argument('--which_epoch', type=str, default="all", help='Name of this trial') + + ## For Res Predictor only + parser.add_argument('--vq_name', type=str, default="rvq_nq6_dc512_nc512_noshare_qdp0.2", help='Name of this trial') + # parser.add_argument('--n_res', type=int, default=2, help='Name of this trial') + # parser.add_argument('--do_vq_res', action="store_true") + parser.add_argument("--seed", default=3407, type=int) + + opt = parser.parse_args() + torch.cuda.set_device(opt.gpu_id) + + args = vars(opt) + + print('------------ Options -------------') + for k, v in sorted(args.items()): + print('%s: %s' % (str(k), str(v))) + print('-------------- End ----------------') + opt.is_train = is_train + if is_train: + # save to the disk + expr_dir = os.path.join(opt.checkpoints_dir, opt.dataset_name, opt.name) + if not os.path.exists(expr_dir): + os.makedirs(expr_dir) + file_name = os.path.join(expr_dir, 'opt.txt') + with open(file_name, 'wt') as opt_file: + opt_file.write('------------ Options -------------\n') + for k, v in sorted(args.items()): + opt_file.write('%s: %s\n' % (str(k), str(v))) + opt_file.write('-------------- End ----------------\n') + return opt \ No newline at end of file diff --git a/src/momask-preenc/predict_preenc.py b/src/momask-preenc/predict_preenc.py new file mode 100644 index 0000000000000000000000000000000000000000..76818e34db30565419c867834050941e02553a46 --- /dev/null +++ b/src/momask-preenc/predict_preenc.py @@ -0,0 +1,242 @@ +""" +Prediction script for pre-encoded mode. +Loads test set, runs prediction using MaskTransformer + ResidualTransformer, and saves results. + +Workflow: +1. Load test set (for text prompts and motion lengths) +2. MaskTransformer generates first layer indices from text +3. ResidualTransformer generates residual layer indices +4. Save combined indices as prediction + +Output format for each sample: +{ + 'idx_pred': torch.Size([T, Q]), # T: time length, Q: number of quantizers + 'text': { + 'caption': 'the person takes four steps forward.', + 'tokens': ['the/DET', 'person/NOUN', ...], + 'start_time': 0.0, + 'end_time': 0.0 + }, + 'm_len': 118 +} +""" +import os +import torch +from torch.utils.data import DataLoader +from os.path import join as pjoin +from tqdm import tqdm + +from models.mask_transformer.transformer import MaskTransformer, ResidualTransformer +from options.eval_option import EvalT2MOptions +from utils.get_opt import get_opt +from utils.fixseed import fixseed +from data.preenc_dataset import PreEncodedDatasetForInference + + +class EvalPreEncOptions(EvalT2MOptions): + """Extended options for pre-encoded evaluation""" + def initialize(self): + EvalT2MOptions.initialize(self) + self.parser.add_argument('--output_dir', type=str, default='./output_predictions', help='Output directory for predictions') + + +def load_mask_trans_model(opt, model_opt): + """Load MaskTransformer model for generating first layer indices""" + clip_version = 'ViT-B/32' + + t2m_transformer = MaskTransformer( + code_dim=model_opt.code_dim, + cond_mode='text', + latent_dim=model_opt.latent_dim, + ff_size=model_opt.ff_size, + num_layers=model_opt.n_layers, + num_heads=model_opt.n_heads, + dropout=model_opt.dropout, + clip_dim=512, + cond_drop_prob=model_opt.cond_drop_prob, + clip_version=clip_version, + opt=model_opt + ) + + # Load checkpoint + ckpt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name, 'model', opt.which_epoch) + if not ckpt_path.endswith('.tar'): + ckpt_path += '.tar' + + ckpt = torch.load(ckpt_path, map_location=opt.device) + model_key = 't2m_transformer' if 't2m_transformer' in ckpt else 'trans' + missing_keys, unexpected_keys = t2m_transformer.load_state_dict(ckpt[model_key], strict=False) + assert len(unexpected_keys) == 0, f"Unexpected keys: {unexpected_keys}" + assert all([k.startswith('clip_model.') for k in missing_keys]), f"Missing keys: {missing_keys}" + + print(f'Loading MaskTransformer {opt.name} from epoch {ckpt["ep"]}!') + return t2m_transformer + + +def load_res_model(opt, model_opt, res_opt): + """Load ResidualTransformer model + + Args: + opt: eval options with device and checkpoints_dir + model_opt: loaded model options from MaskTransformer (for code_dim, num_tokens, num_quantizers) + res_opt: loaded options from ResidualTransformer config + """ + clip_version = 'ViT-B/32' + + # Use code_dim and num_quantizers from model_opt (same as VQ model) + res_opt.num_quantizers = model_opt.num_quantizers + res_opt.num_tokens = model_opt.num_tokens + + res_transformer = ResidualTransformer( + code_dim=model_opt.code_dim, + cond_mode='text', + latent_dim=res_opt.latent_dim, + ff_size=res_opt.ff_size, + num_layers=res_opt.n_layers, + num_heads=res_opt.n_heads, + dropout=res_opt.dropout, + clip_dim=512, + shared_codebook=res_opt.shared_codebook if hasattr(res_opt, 'shared_codebook') else False, + cond_drop_prob=res_opt.cond_drop_prob, + share_weight=res_opt.share_weight if hasattr(res_opt, 'share_weight') else False, + clip_version=clip_version, + opt=res_opt + ) + + # Load checkpoint + ckpt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.res_name, 'model', 'latest.tar') + + ckpt = torch.load(ckpt_path, map_location=opt.device) + missing_keys, unexpected_keys = res_transformer.load_state_dict(ckpt['res_transformer'], strict=False) + assert len(unexpected_keys) == 0, f"Unexpected keys: {unexpected_keys}" + assert all([k.startswith('clip_model.') for k in missing_keys]), f"Missing keys: {missing_keys}" + + print(f'Loading Residual Transformer {opt.res_name} from epoch {ckpt["ep"]}!') + return res_transformer + + +if __name__ == '__main__': + parser = EvalPreEncOptions() + opt = parser.parse() + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + + # Setup output directory + output_dir = pjoin(opt.output_dir, opt.dataset_name, opt.name) + os.makedirs(output_dir, exist_ok=True) + + print("=" * 50) + print("Pre-encoded Prediction Mode") + print(f"Output directory: {output_dir}") + print("=" * 50) + + # Load model options + model_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name, 'opt.txt') + model_opt = get_opt(model_opt_path, device=opt.device) + + # Load ResidualTransformer options + res_opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.res_name, 'opt.txt') + res_opt = get_opt(res_opt_path, device=opt.device) + + # Ensure model_opt has necessary attributes for ResidualTransformer initialization + if not hasattr(model_opt, 'num_quantizers'): + model_opt.num_quantizers = getattr(opt, 'num_quantizers', 6) + if not hasattr(model_opt, 'num_tokens'): + model_opt.num_tokens = getattr(opt, 'num_tokens', 512) + if not hasattr(model_opt, 'code_dim'): + model_opt.code_dim = getattr(opt, 'code_dim', 256) + + # Load MaskTransformer (for generating first layer) + t2m_transformer = load_mask_trans_model(opt, model_opt) + t2m_transformer.eval() + t2m_transformer.to(opt.device) + + # Load ResidualTransformer (for generating residual layers) + res_transformer = load_res_model(opt, model_opt, res_opt) + res_transformer.eval() + res_transformer.to(opt.device) + + # Load test dataset + test_dataset = PreEncodedDatasetForInference(opt, split='test') + test_loader = DataLoader(test_dataset, batch_size=1, num_workers=0, shuffle=False) + + print(f"Test dataset size: {len(test_dataset)}") + + # Run prediction + with torch.no_grad(): + for batch_idx, batch in enumerate(tqdm(test_loader, desc="Predicting")): + fname, code_idx, all_codes, m_len, text_data = batch + + fname = fname[0] # Remove batch dimension + m_len_val = m_len[0].item() # Scalar + + # Handle text_data - it may be a dict or nested structure from DataLoader + if isinstance(text_data, dict): + # DataLoader wraps dict values in lists/tensors + text_dict = {} + for k, v in text_data.items(): + if isinstance(v, list) and len(v) == 1: + text_dict[k] = v[0] + elif isinstance(v, torch.Tensor) and v.dim() == 1 and v.shape[0] == 1: + text_dict[k] = v[0].item() if v.dtype in [torch.float32, torch.float64, torch.int32, torch.int64] else v[0] + else: + text_dict[k] = v + text_data = text_dict + + # Get caption for text conditioning + caption = text_data.get('caption', '') if isinstance(text_data, dict) else str(text_data) + + # Create m_lens tensor (token length, not motion length) + # Motion length -> token length (downsampled by unit_length=4) + unit_length = getattr(opt, 'unit_length', 4) + token_len = m_len_val // unit_length + m_lens = torch.tensor([token_len], device=opt.device) + + # Step 1: Generate first layer indices using MaskTransformer + mids = t2m_transformer.generate( + conds=[caption], + m_lens=m_lens, + timesteps=opt.time_steps, + cond_scale=opt.cond_scale, + temperature=opt.temperature, + topk_filter_thres=opt.topkr, + gsample=opt.gumbel_sample, + force_mask=opt.force_mask + ) + # mids shape: (1, seq_len) - first layer indices + + # Step 2: Generate all layer indices using ResidualTransformer + try: + pred_ids = res_transformer.generate( + motion_ids=mids, + conds=[caption], + m_lens=m_lens, + temperature=1.0, + cond_scale=opt.cond_scale, + ) + except Exception as e: + print(f"Error during residual generation for file {fname}: {e}") + continue + # pred_ids shape: (1, seq_len, num_quantizers) + + # Remove batch dimension: (seq_len, num_quantizers) + idx_pred = pred_ids[0] # (T, Q) + + # Replace -1 (padding) with actual values or keep as is + # The actual valid length is token_len + idx_pred = idx_pred[:token_len] + + # Prepare output dict + output = { + 'idx_pred': idx_pred.cpu(), # (T, Q) + 'text': text_data, + 'm_len': m_len_val + } + + # Save with same filename + output_path = pjoin(output_dir, fname) + torch.save(output, output_path) + + print(f"Prediction completed! Results saved to: {output_dir}") + diff --git a/src/momask-preenc/prepare/download_evaluator.sh b/src/momask-preenc/prepare/download_evaluator.sh new file mode 100644 index 0000000000000000000000000000000000000000..b6a849b7d39f7b9f857ec2d0d834dfc200dc6c59 --- /dev/null +++ b/src/momask-preenc/prepare/download_evaluator.sh @@ -0,0 +1,24 @@ +cd checkpoints + +cd t2m +echo -e "Downloading evaluation models for HumanML3D dataset" +gdown --fuzzy https://drive.google.com/file/d/19C_eiEr0kMGlYVJy_yFL6_Dhk3RvmwhM/view?usp=sharing +echo -e "Unzipping humanml3d_evaluator.zip" +unzip humanml3d_evaluator.zip + +echo -e "Clearning humanml3d_evaluator.zip" +rm humanml3d_evaluator.zip + +cd ../kit/ +echo -e "Downloading pretrained models for KIT-ML dataset" +gdown --fuzzy https://drive.google.com/file/d/1TKIZ3TSSZawpilC-7Kw7Ws4sNNuzb49p/view?usp=drive_link + +echo -e "Unzipping kit_evaluator.zip" +unzip kit_evaluator.zip + +echo -e "Clearning kit_evaluator.zip" +rm kit_evaluator.zip + +cd ../../ + +echo -e "Downloading done!" diff --git a/src/momask-preenc/prepare/download_glove.sh b/src/momask-preenc/prepare/download_glove.sh new file mode 100644 index 0000000000000000000000000000000000000000..227312f56d654a01f8437573e14f76699f6d8c3a --- /dev/null +++ b/src/momask-preenc/prepare/download_glove.sh @@ -0,0 +1,9 @@ +echo -e "Downloading glove (in use by the evaluators, not by MoMask itself)" +gdown --fuzzy https://drive.google.com/file/d/1cmXKUT31pqd7_XpJAiWEo1K81TMYHA5n/view?usp=sharing +rm -rf glove + +unzip glove.zip +echo -e "Cleaning\n" +rm glove.zip + +echo -e "Downloading done!" \ No newline at end of file diff --git a/src/momask-preenc/prepare/download_models.sh b/src/momask-preenc/prepare/download_models.sh new file mode 100644 index 0000000000000000000000000000000000000000..f941b8514c4458090a83b17bf405ac787c330035 --- /dev/null +++ b/src/momask-preenc/prepare/download_models.sh @@ -0,0 +1,31 @@ +rm -rf checkpoints +mkdir checkpoints +cd checkpoints +mkdir t2m + +cd t2m +echo -e "Downloading pretrained models for HumanML3D dataset" +gdown --fuzzy https://drive.google.com/file/d/1vXS7SHJBgWPt59wupQ5UUzhFObrnGkQ0/view?usp=sharing + +echo -e "Unzipping humanml3d_models.zip" +unzip humanml3d_models.zip + +echo -e "Cleaning humanml3d_models.zip" +rm humanml3d_models.zip + +cd ../ +mkdir kit +cd kit + +echo -e "Downloading pretrained models for KIT-ML dataset" +gdown --fuzzy https://drive.google.com/file/d/1FapdHNkxPouasVM8MWgg1f6sd_4Lua2q/view?usp=sharing + +echo -e "Unzipping kit_models.zip" +unzip kit_models.zip + +echo -e "Cleaning kit_models.zip" +rm kit_models.zip + +cd ../../ + +echo -e "Downloading done!" diff --git a/src/momask-preenc/requirements.txt b/src/momask-preenc/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..2e715b39322593ed6851dae5ce2c9512a652114f --- /dev/null +++ b/src/momask-preenc/requirements.txt @@ -0,0 +1,28 @@ +--extra-index-url https://download.pytorch.org/whl/cu113 +clip @ git+https://github.com/openai/CLIP.git +chumpy +einops==0.6.1 +ffmpy==0.3.1 +ftfy==6.1.1 +gdown==4.7.1 +grpcio==1.54.2 +h11==0.14.0 +importlib-metadata==5.0.0 +importlib-resources==5.12.0 +joblib +matplotlib==3.1.3 +numpy==1.21.5 +Pillow==9.2.0 +PyYAML==6.0 +scikit-learn +scipy +smplx==0.1.28 +sniffio==1.3.0 +torch==1.12.0 +torch-tb-profiler +torchaudio +torchvision +tornado +tqdm +trimesh +vector-quantize-pytorch==1.6.30 diff --git a/src/momask-preenc/train_res_transformer.py b/src/momask-preenc/train_res_transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..68e43b86ef78be1e2114fc18fd2a8c6932b7c286 --- /dev/null +++ b/src/momask-preenc/train_res_transformer.py @@ -0,0 +1,200 @@ +import os +import torch +import numpy as np + +from torch.utils.data import DataLoader +from os.path import join as pjoin + +from models.mask_transformer.transformer import ResidualTransformer +from models.mask_transformer.transformer_trainer import ResidualTransformerTrainer, PreEncodedResidualTransformerTrainer +from models.vq.model import RVQVAE + +from options.train_option import TrainT2MOptions + +from utils.plot_script import plot_3d_motion +from utils.motion_process import recover_from_ric +from utils.get_opt import get_opt +from utils.fixseed import fixseed +from utils.paramUtil import t2m_kinematic_chain, kit_kinematic_chain + +from data.t2m_dataset import Text2MotionDataset +from data.preenc_dataset import PreEncodedDataset +from motion_loaders.dataset_motion_loader import get_dataset_motion_loader +from models.t2m_eval_wrapper import EvaluatorModelWrapper + +def load_vq_model(): + opt_path = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'opt.txt') + vq_opt = get_opt(opt_path, opt.device) + vq_model = RVQVAE(vq_opt, + dim_pose, + vq_opt.nb_code, + vq_opt.code_dim, + vq_opt.output_emb_width, + vq_opt.down_t, + vq_opt.stride_t, + vq_opt.width, + vq_opt.depth, + vq_opt.dilation_growth_rate, + vq_opt.vq_act, + vq_opt.vq_norm) + ckpt = torch.load(pjoin(vq_opt.checkpoints_dir, vq_opt.dataset_name, vq_opt.name, 'model', 'net_best_fid.tar'), + map_location=opt.device) + model_key = 'vq_model' if 'vq_model' in ckpt else 'net' + vq_model.load_state_dict(ckpt[model_key]) + print(f'Loading VQ Model {opt.vq_name}') + vq_model.to(opt.device) + return vq_model, vq_opt + +if __name__ == '__main__': + parser = TrainT2MOptions() + opt = parser.parse() + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + torch.autograd.set_detect_anomaly(True) + + opt.save_root = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + opt.model_dir = pjoin(opt.save_root, 'model') + # opt.meta_dir = pjoin(opt.save_root, 'meta') + opt.eval_dir = pjoin(opt.save_root, 'animation') + opt.log_dir = pjoin('./log/res/', opt.dataset_name, opt.name) + + os.makedirs(opt.model_dir, exist_ok=True) + # os.makedirs(opt.meta_dir, exist_ok=True) + os.makedirs(opt.eval_dir, exist_ok=True) + os.makedirs(opt.log_dir, exist_ok=True) + + if opt.dataset_name == 't2m': + opt.max_motion_len = 200 + dim_pose = 263 + fps = 20 + kinematic_chain = t2m_kinematic_chain + dataset_opt_path = './checkpoints/t2m/Comp_v6_KLD005/opt.txt' + + elif opt.dataset_name == 'kit': #TODO + fps = 12.5 + dim_pose = 251 + opt.max_motion_len = 55 + kinematic_chain = kit_kinematic_chain + dataset_opt_path = './checkpoints/kit/Comp_v6_KLD005/opt.txt' + + else: + raise KeyError('Dataset Does Not Exist') + + clip_version = 'ViT-B/32' + + # Pre-encoded mode: no VQ model needed + if opt.use_preenc: + print("=" * 50) + print("Using PRE-ENCODED mode - no VQ model will be loaded") + print("=" * 50) + + vq_model = None + # Use parameters from command line for pre-encoded mode + code_dim = opt.code_dim + shared_codebook = opt.shared_codebook + + # Build transformer model + res_transformer = ResidualTransformer(code_dim=code_dim, + cond_mode='text', + latent_dim=opt.latent_dim, + ff_size=opt.ff_size, + num_layers=opt.n_layers, + num_heads=opt.n_heads, + dropout=opt.dropout, + clip_dim=512, + shared_codebook=shared_codebook, + cond_drop_prob=opt.cond_drop_prob, + share_weight=opt.share_weight, + clip_version=clip_version, + opt=opt) + + # Load pre-encoded datasets + train_dataset = PreEncodedDataset(opt, split='train') + val_dataset = PreEncodedDataset(opt, split='val') + + train_loader = DataLoader(train_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + val_loader = DataLoader(val_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + + # No evaluation loader for pre-encoded mode (would need VQ model) + eval_val_loader = None + eval_wrapper = None + + all_params = 0 + pc_transformer = sum(param.numel() for param in res_transformer.parameters_wo_clip()) + print(res_transformer) + all_params += pc_transformer + print('Total parameters of all models: {:.2f}M'.format(all_params / 1000_000)) + + # Use pre-encoded trainer + trainer = PreEncodedResidualTransformerTrainer(opt, res_transformer, vq_model=None) + trainer.train(train_loader, val_loader, eval_val_loader=None, eval_wrapper=None, plot_eval=None) + + else: + raise NotImplementedError("VQ-based training mode is currently disabled.") + # Original mode: load VQ model + vq_model, vq_opt = load_vq_model() + + opt.num_tokens = vq_opt.nb_code + opt.num_quantizers = vq_opt.num_quantizers + + # if opt.is_v2: + res_transformer = ResidualTransformer(code_dim=vq_opt.code_dim, + cond_mode='text', + latent_dim=opt.latent_dim, + ff_size=opt.ff_size, + num_layers=opt.n_layers, + num_heads=opt.n_heads, + dropout=opt.dropout, + clip_dim=512, + shared_codebook=vq_opt.shared_codebook, + cond_drop_prob=opt.cond_drop_prob, + # codebook=vq_model.quantizer.codebooks[0] if opt.fix_token_emb else None, + share_weight=opt.share_weight, + clip_version=clip_version, + opt=opt) + # else: + # res_transformer = ResidualTransformer(code_dim=vq_opt.code_dim, + # cond_mode='text', + # latent_dim=opt.latent_dim, + # ff_size=opt.ff_size, + # num_layers=opt.n_layers, + # num_heads=opt.n_heads, + # dropout=opt.dropout, + # clip_dim=512, + # shared_codebook=vq_opt.shared_codebook, + # cond_drop_prob=opt.cond_drop_prob, + # # codebook=vq_model.quantizer.codebooks[0] if opt.fix_token_emb else None, + # clip_version=clip_version, + # opt=opt) + + + all_params = 0 + pc_transformer = sum(param.numel() for param in res_transformer.parameters_wo_clip()) + + print(res_transformer) + # print("Total parameters of t2m_transformer net: {:.2f}M".format(pc_transformer / 1000_000)) + all_params += pc_transformer + + print('Total parameters of all models: {:.2f}M'.format(all_params / 1000_000)) + + mean = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'meta', 'mean.npy')) + std = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'meta', 'std.npy')) + + train_split_file = pjoin(opt.data_root, 'train.txt') + val_split_file = pjoin(opt.data_root, 'val.txt') + + train_dataset = Text2MotionDataset(opt, mean, std, train_split_file) + val_dataset = Text2MotionDataset(opt, mean, std, val_split_file) + + train_loader = DataLoader(train_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + val_loader = DataLoader(val_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + + eval_val_loader, _ = get_dataset_motion_loader(dataset_opt_path, 32, 'val', device=opt.device) + + wrapper_opt = get_opt(dataset_opt_path, torch.device('cuda')) + eval_wrapper = EvaluatorModelWrapper(wrapper_opt) + + trainer = ResidualTransformerTrainer(opt, res_transformer, vq_model) + + trainer.train(train_loader, val_loader, eval_val_loader, eval_wrapper=eval_wrapper, plot_eval=plot_t2m) \ No newline at end of file diff --git a/src/momask-preenc/train_t2m_transformer.py b/src/momask-preenc/train_t2m_transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..abee40527700de8b394336a7810831a982ebd98a --- /dev/null +++ b/src/momask-preenc/train_t2m_transformer.py @@ -0,0 +1,142 @@ +import os +import torch +import numpy as np + +from torch.utils.data import DataLoader +from os.path import join as pjoin + +from models.mask_transformer.transformer import MaskTransformer +from models.mask_transformer.transformer_trainer import MaskTransformerTrainer +from models.vq.model import RVQVAE + +from options.train_option import TrainT2MOptions + +from utils.plot_script import plot_3d_motion +from utils.motion_process import recover_from_ric +from utils.get_opt import get_opt +from utils.fixseed import fixseed +from utils.paramUtil import t2m_kinematic_chain, kit_kinematic_chain + +from data.t2m_dataset import Text2MotionDataset +from data.preenc_dataset import PreEncodedDataset +from motion_loaders.dataset_motion_loader import get_dataset_motion_loader +from models.t2m_eval_wrapper import EvaluatorModelWrapper + + +if __name__ == '__main__': + parser = TrainT2MOptions() + opt = parser.parse() + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + torch.autograd.set_detect_anomaly(True) + + opt.save_root = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + opt.model_dir = pjoin(opt.save_root, 'model') + # opt.meta_dir = pjoin(opt.save_root, 'meta') + opt.eval_dir = pjoin(opt.save_root, 'animation') + opt.log_dir = pjoin('./log/t2m/', opt.dataset_name, opt.name) + + os.makedirs(opt.model_dir, exist_ok=True) + # os.makedirs(opt.meta_dir, exist_ok=True) + os.makedirs(opt.eval_dir, exist_ok=True) + os.makedirs(opt.log_dir, exist_ok=True) + + clip_version = 'ViT-B/32' + + # Pre-encoded mode: no VQ model needed + if opt.use_preenc: + print("=" * 50) + print("Using PRE-ENCODED mode - no VQ model will be loaded") + print("=" * 50) + + vq_model = None + # Use parameters from command line for pre-encoded mode + code_dim = opt.code_dim + + # Build transformer model + t2m_transformer = MaskTransformer(code_dim=code_dim, + cond_mode='text', + latent_dim=opt.latent_dim, + ff_size=opt.ff_size, + num_layers=opt.n_layers, + num_heads=opt.n_heads, + dropout=opt.dropout, + clip_dim=512, + cond_drop_prob=opt.cond_drop_prob, + clip_version=clip_version, + opt=opt) + + # Load pre-encoded datasets + train_dataset = PreEncodedDataset(opt, split='train') + val_dataset = PreEncodedDataset(opt, split='val') + + train_loader = DataLoader(train_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + val_loader = DataLoader(val_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + + # No evaluation loader for pre-encoded mode (would need VQ model) + eval_val_loader = None + eval_wrapper = None + + all_params = 0 + pc_transformer = sum(param.numel() for param in t2m_transformer.parameters_wo_clip()) + + all_params += pc_transformer + print('Total parameters of all models: {:.2f}M'.format(all_params / 1000_000)) + + # Import and use pre-encoded trainer + from models.mask_transformer.transformer_trainer import PreEncodedMaskTransformerTrainer + trainer = PreEncodedMaskTransformerTrainer(opt, t2m_transformer, vq_model=None) + trainer.train(train_loader, val_loader, eval_val_loader=None, eval_wrapper=None, plot_eval=None) + + else: + # Original mode: load VQ model + raise NotImplementedError("Original mode is not implemented in this snippet.") + vq_model, vq_opt = load_vq_model() + + opt.num_tokens = vq_opt.nb_code + + t2m_transformer = MaskTransformer(code_dim=vq_opt.code_dim, + cond_mode='text', + latent_dim=opt.latent_dim, + ff_size=opt.ff_size, + num_layers=opt.n_layers, + num_heads=opt.n_heads, + dropout=opt.dropout, + clip_dim=512, + cond_drop_prob=opt.cond_drop_prob, + clip_version=clip_version, + opt=opt) + + # if opt.fix_token_emb: + # t2m_transformer.load_and_freeze_token_emb(vq_model.quantizer.codebooks[0]) + + all_params = 0 + pc_transformer = sum(param.numel() for param in t2m_transformer.parameters_wo_clip()) + + # print(t2m_transformer) + # print("Total parameters of t2m_transformer net: {:.2f}M".format(pc_transformer / 1000_000)) + all_params += pc_transformer + + print('Total parameters of all models: {:.2f}M'.format(all_params / 1000_000)) + + mean = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'meta', 'mean.npy')) + std = np.load(pjoin(opt.checkpoints_dir, opt.dataset_name, opt.vq_name, 'meta', 'std.npy')) + + train_split_file = pjoin(opt.data_root, 'train.txt') + val_split_file = pjoin(opt.data_root, 'val.txt') + + train_dataset = Text2MotionDataset(opt, mean, std, train_split_file) + val_dataset = Text2MotionDataset(opt, mean, std, val_split_file) + + train_loader = DataLoader(train_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + val_loader = DataLoader(val_dataset, batch_size=opt.batch_size, num_workers=4, shuffle=True, drop_last=True) + + eval_val_loader, _ = get_dataset_motion_loader(dataset_opt_path, 32, 'val', device=opt.device) + + wrapper_opt = get_opt(dataset_opt_path, torch.device('cuda')) + eval_wrapper = EvaluatorModelWrapper(wrapper_opt) + + trainer = MaskTransformerTrainer(opt, t2m_transformer, vq_model) + + trainer.train(train_loader, val_loader, eval_val_loader, eval_wrapper=eval_wrapper, plot_eval=plot_t2m) \ No newline at end of file diff --git a/src/momask-preenc/train_vq.py b/src/momask-preenc/train_vq.py new file mode 100644 index 0000000000000000000000000000000000000000..ad5f4eee9edb0f8784362df4363bd8d2cb9d60d4 --- /dev/null +++ b/src/momask-preenc/train_vq.py @@ -0,0 +1,122 @@ +import os +from os.path import join as pjoin + +import torch +from torch.utils.data import DataLoader + +from models.vq.model import RVQVAE +from models.vq.vq_trainer import RVQTokenizerTrainer +from options.vq_option import arg_parse +from data.t2m_dataset import MotionDataset +from utils import paramUtil +import numpy as np + +from models.t2m_eval_wrapper import EvaluatorModelWrapper +from utils.get_opt import get_opt +from motion_loaders.dataset_motion_loader import get_dataset_motion_loader + +from utils.motion_process import recover_from_ric +from utils.plot_script import plot_3d_motion +from utils.fixseed import fixseed + +os.environ["OMP_NUM_THREADS"] = "1" + +def plot_t2m(data, save_dir): + data = train_dataset.inv_transform(data) + for i in range(len(data)): + joint_data = data[i] + joint = recover_from_ric(torch.from_numpy(joint_data).float(), opt.joints_num).numpy() + save_path = pjoin(save_dir, '%02d.mp4' % (i)) + plot_3d_motion(save_path, kinematic_chain, joint, title="None", fps=fps, radius=radius) + + +if __name__ == "__main__": + # torch.autograd.set_detect_anomaly(True) + opt = arg_parse(True) + fixseed(opt.seed) + + opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id)) + print(f"Using Device: {opt.device}") + + opt.save_root = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + opt.model_dir = pjoin(opt.save_root, 'model') + opt.meta_dir = pjoin(opt.save_root, 'meta') + opt.eval_dir = pjoin(opt.save_root, 'animation') + opt.log_dir = pjoin('./log/vq/', opt.dataset_name, opt.name) + + os.makedirs(opt.model_dir, exist_ok=True) + os.makedirs(opt.meta_dir, exist_ok=True) + os.makedirs(opt.eval_dir, exist_ok=True) + os.makedirs(opt.log_dir, exist_ok=True) + + if opt.dataset_name == "t2m": + opt.data_root = './dataset/HumanML3D/' + opt.motion_dir = pjoin(opt.data_root, 'new_joint_vecs') + opt.text_dir = pjoin(opt.data_root, 'texts') + opt.joints_num = 22 + dim_pose = 263 + fps = 20 + radius = 4 + kinematic_chain = paramUtil.t2m_kinematic_chain + dataset_opt_path = './checkpoints/t2m/Comp_v6_KLD005/opt.txt' + + elif opt.dataset_name == "kit": + opt.data_root = './dataset/KIT-ML/' + opt.motion_dir = pjoin(opt.data_root, 'new_joint_vecs') + opt.text_dir = pjoin(opt.data_root, 'texts') + opt.joints_num = 21 + radius = 240 * 8 + fps = 12.5 + dim_pose = 251 + opt.max_motion_length = 196 + kinematic_chain = paramUtil.kit_kinematic_chain + dataset_opt_path = './checkpoints/kit/Comp_v6_KLD005/opt.txt' + else: + raise KeyError('Dataset Does not Exists') + + wrapper_opt = get_opt(dataset_opt_path, torch.device('cuda')) + eval_wrapper = EvaluatorModelWrapper(wrapper_opt) + + mean = np.load(pjoin(opt.data_root, 'Mean.npy')) + std = np.load(pjoin(opt.data_root, 'Std.npy')) + + train_split_file = pjoin(opt.data_root, 'train.txt') + val_split_file = pjoin(opt.data_root, 'val.txt') + + + net = RVQVAE(opt, + dim_pose, + opt.nb_code, + opt.code_dim, + opt.code_dim, + opt.down_t, + opt.stride_t, + opt.width, + opt.depth, + opt.dilation_growth_rate, + opt.vq_act, + opt.vq_norm) + + pc_vq = sum(param.numel() for param in net.parameters()) + print(net) + # print("Total parameters of discriminator net: {}".format(pc_vq)) + # all_params += pc_vq_dis + + print('Total parameters of all models: {}M'.format(pc_vq/1000_000)) + + trainer = RVQTokenizerTrainer(opt, vq_model=net) + + train_dataset = MotionDataset(opt, mean, std, train_split_file) + val_dataset = MotionDataset(opt, mean, std, val_split_file) + + train_loader = DataLoader(train_dataset, batch_size=opt.batch_size, drop_last=True, num_workers=4, + shuffle=True, pin_memory=True) + val_loader = DataLoader(val_dataset, batch_size=opt.batch_size, drop_last=True, num_workers=4, + shuffle=True, pin_memory=True) + eval_val_loader, _ = get_dataset_motion_loader(dataset_opt_path, 32, 'val', device=opt.device) + trainer.train(train_loader, val_loader, eval_val_loader, eval_wrapper, plot_t2m) + +## train_vq.py --dataset_name kit --batch_size 512 --name VQVAE_dp2 --gpu_id 3 +## train_vq.py --dataset_name kit --batch_size 256 --name VQVAE_dp2_b256 --gpu_id 2 +## train_vq.py --dataset_name kit --batch_size 1024 --name VQVAE_dp2_b1024 --gpu_id 1 +## python train_vq.py --dataset_name kit --batch_size 256 --name VQVAE_dp1_b256 --gpu_id 2 \ No newline at end of file diff --git a/src/momask-preenc/utils/eval_t2m.py b/src/momask-preenc/utils/eval_t2m.py new file mode 100644 index 0000000000000000000000000000000000000000..4340114da753436565d87106543bf10473fe0a20 --- /dev/null +++ b/src/momask-preenc/utils/eval_t2m.py @@ -0,0 +1,1100 @@ +import os + +import clip +import numpy as np +import torch +# from scipy import linalg +from utils.metrics import * +import torch.nn.functional as F +# import visualization.plot_3d_global as plot_3d +from utils.motion_process import recover_from_ric +# +# +# def tensorborad_add_video_xyz(writer, xyz, nb_iter, tag, nb_vis=4, title_batch=None, outname=None): +# xyz = xyz[:1] +# bs, seq = xyz.shape[:2] +# xyz = xyz.reshape(bs, seq, -1, 3) +# plot_xyz = plot_3d.draw_to_batch(xyz.cpu().numpy(), title_batch, outname) +# plot_xyz = np.transpose(plot_xyz, (0, 1, 4, 2, 3)) +# writer.add_video(tag, plot_xyz, nb_iter, fps=20) + + +@torch.no_grad() +def evaluation_vqvae(out_dir, val_loader, net, writer, ep, best_fid, best_div, best_top1, + best_top2, best_top3, best_matching, eval_wrapper, save=True, draw=True): + net.eval() + + motion_annotation_list = [] + motion_pred_list = [] + + R_precision_real = 0 + R_precision = 0 + + nb_sample = 0 + matching_score_real = 0 + matching_score_pred = 0 + for batch in val_loader: + # print(len(batch)) + word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, token = batch + + motion = motion.cuda() + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, motion, m_length) + bs, seq = motion.shape[0], motion.shape[1] + + # num_joints = 21 if motion.shape[-1] == 251 else 22 + + # pred_pose_eval = torch.zeros((bs, seq, motion.shape[-1])).cuda() + + pred_pose_eval, loss_commit, perplexity = net(motion) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_pose_eval, + m_length) + + motion_pred_list.append(em_pred) + motion_annotation_list.append(em) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = "--> \t Eva. Ep %d:, FID. %.4f, Diversity Real. %.4f, Diversity. %.4f, R_precision_real. (%.4f, %.4f, %.4f), R_precision. (%.4f, %.4f, %.4f), matching_score_real. %.4f, matching_score_pred. %.4f"%\ + (ep, fid, diversity_real, diversity, R_precision_real[0],R_precision_real[1], R_precision_real[2], + R_precision[0],R_precision[1], R_precision[2], matching_score_real, matching_score_pred ) + # logger.info(msg) + print(msg) + + if draw: + writer.add_scalar('./Test/FID', fid, ep) + writer.add_scalar('./Test/Diversity', diversity, ep) + writer.add_scalar('./Test/top1', R_precision[0], ep) + writer.add_scalar('./Test/top2', R_precision[1], ep) + writer.add_scalar('./Test/top3', R_precision[2], ep) + writer.add_scalar('./Test/matching_score', matching_score_pred, ep) + + if fid < best_fid: + msg = "--> --> \t FID Improved from %.5f to %.5f !!!" % (best_fid, fid) + if draw: print(msg) + best_fid = fid + if save: + torch.save({'vq_model': net.state_dict(), 'ep': ep}, os.path.join(out_dir, 'net_best_fid.tar')) + + if abs(diversity_real - diversity) < abs(diversity_real - best_div): + msg = "--> --> \t Diversity Improved from %.5f to %.5f !!!"%(best_div, diversity) + if draw: print(msg) + best_div = diversity + # if save: + # torch.save({'net': net.state_dict()}, os.path.join(out_dir, 'net_best_div.pth')) + + if R_precision[0] > best_top1: + msg = "--> --> \t Top1 Improved from %.5f to %.5f !!!" % (best_top1, R_precision[0]) + if draw: print(msg) + best_top1 = R_precision[0] + # if save: + # torch.save({'vq_model': net.state_dict(), 'ep':ep}, os.path.join(out_dir, 'net_best_top1.tar')) + + if R_precision[1] > best_top2: + msg = "--> --> \t Top2 Improved from %.5f to %.5f!!!" % (best_top2, R_precision[1]) + if draw: print(msg) + best_top2 = R_precision[1] + + if R_precision[2] > best_top3: + msg = "--> --> \t Top3 Improved from %.5f to %.5f !!!" % (best_top3, R_precision[2]) + if draw: print(msg) + best_top3 = R_precision[2] + + if matching_score_pred < best_matching: + msg = f"--> --> \t matching_score Improved from %.5f to %.5f !!!" % (best_matching, matching_score_pred) + if draw: print(msg) + best_matching = matching_score_pred + if save: + torch.save({'vq_model': net.state_dict(), 'ep': ep}, os.path.join(out_dir, 'net_best_mm.tar')) + + # if save: + # torch.save({'net': net.state_dict()}, os.path.join(out_dir, 'net_last.pth')) + + net.train() + return best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer + +@torch.no_grad() +def evaluation_vqvae_plus_mpjpe(val_loader, net, repeat_id, eval_wrapper, num_joint): + net.eval() + + motion_annotation_list = [] + motion_pred_list = [] + + R_precision_real = 0 + R_precision = 0 + + nb_sample = 0 + matching_score_real = 0 + matching_score_pred = 0 + mpjpe = 0 + num_poses = 0 + for batch in val_loader: + # print(len(batch)) + word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, token = batch + + motion = motion.cuda() + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, motion, m_length) + bs, seq = motion.shape[0], motion.shape[1] + + # num_joints = 21 if motion.shape[-1] == 251 else 22 + + # pred_pose_eval = torch.zeros((bs, seq, motion.shape[-1])).cuda() + + pred_pose_eval, loss_commit, perplexity = net(motion) + # all_indices,_ = net.encode(motion) + # pred_pose_eval = net.forward_decoder(all_indices[..., :1]) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_pose_eval, + m_length) + + bgt = val_loader.dataset.inv_transform(motion.detach().cpu().numpy()) + bpred = val_loader.dataset.inv_transform(pred_pose_eval.detach().cpu().numpy()) + for i in range(bs): + gt = recover_from_ric(torch.from_numpy(bgt[i, :m_length[i]]).float(), num_joint) + pred = recover_from_ric(torch.from_numpy(bpred[i, :m_length[i]]).float(), num_joint) + + mpjpe += torch.sum(calculate_mpjpe(gt, pred)) + # print(calculate_mpjpe(gt, pred).shape, gt.shape, pred.shape) + num_poses += gt.shape[0] + + # print(mpjpe, num_poses) + # exit() + + motion_pred_list.append(em_pred) + motion_annotation_list.append(em) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + mpjpe = mpjpe / num_poses + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = "--> \t Eva. Re %d:, FID. %.4f, Diversity Real. %.4f, Diversity. %.4f, R_precision_real. (%.4f, %.4f, %.4f), R_precision. (%.4f, %.4f, %.4f), matching_real. %.4f, matching_pred. %.4f, MPJPE. %.4f" % \ + (repeat_id, fid, diversity_real, diversity, R_precision_real[0], R_precision_real[1], R_precision_real[2], + R_precision[0], R_precision[1], R_precision[2], matching_score_real, matching_score_pred, mpjpe) + # logger.info(msg) + print(msg) + return fid, diversity, R_precision, matching_score_pred, mpjpe + +@torch.no_grad() +def evaluation_vqvae_plus_l1(val_loader, net, repeat_id, eval_wrapper, num_joint): + net.eval() + + motion_annotation_list = [] + motion_pred_list = [] + + R_precision_real = 0 + R_precision = 0 + + nb_sample = 0 + matching_score_real = 0 + matching_score_pred = 0 + l1_dist = 0 + num_poses = 1 + for batch in val_loader: + # print(len(batch)) + word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, token = batch + + motion = motion.cuda() + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, motion, m_length) + bs, seq = motion.shape[0], motion.shape[1] + + # num_joints = 21 if motion.shape[-1] == 251 else 22 + + # pred_pose_eval = torch.zeros((bs, seq, motion.shape[-1])).cuda() + + pred_pose_eval, loss_commit, perplexity = net(motion) + # all_indices,_ = net.encode(motion) + # pred_pose_eval = net.forward_decoder(all_indices[..., :1]) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_pose_eval, + m_length) + + bgt = val_loader.dataset.inv_transform(motion.detach().cpu().numpy()) + bpred = val_loader.dataset.inv_transform(pred_pose_eval.detach().cpu().numpy()) + for i in range(bs): + gt = recover_from_ric(torch.from_numpy(bgt[i, :m_length[i]]).float(), num_joint) + pred = recover_from_ric(torch.from_numpy(bpred[i, :m_length[i]]).float(), num_joint) + # gt = motion[i, :m_length[i]] + # pred = pred_pose_eval[i, :m_length[i]] + num_pose = gt.shape[0] + l1_dist += F.l1_loss(gt, pred) * num_pose + num_poses += num_pose + + motion_pred_list.append(em_pred) + motion_annotation_list.append(em) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + l1_dist = l1_dist / num_poses + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = "--> \t Eva. Re %d:, FID. %.4f, Diversity Real. %.4f, Diversity. %.4f, R_precision_real. (%.4f, %.4f, %.4f), R_precision. (%.4f, %.4f, %.4f), matching_real. %.4f, matching_pred. %.4f, mae. %.4f"%\ + (repeat_id, fid, diversity_real, diversity, R_precision_real[0],R_precision_real[1], R_precision_real[2], + R_precision[0],R_precision[1], R_precision[2], matching_score_real, matching_score_pred, l1_dist) + # logger.info(msg) + print(msg) + return fid, diversity, R_precision, matching_score_pred, l1_dist + + +@torch.no_grad() +def evaluation_res_plus_l1(val_loader, vq_model, res_model, repeat_id, eval_wrapper, num_joint, do_vq_res=True): + vq_model.eval() + res_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + + R_precision_real = 0 + R_precision = 0 + + nb_sample = 0 + matching_score_real = 0 + matching_score_pred = 0 + l1_dist = 0 + num_poses = 1 + for batch in val_loader: + # print(len(batch)) + word_embeddings, pos_one_hots, caption, sent_len, motion, m_length, token = batch + + motion = motion.cuda() + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, motion, m_length) + bs, seq = motion.shape[0], motion.shape[1] + + # num_joints = 21 if motion.shape[-1] == 251 else 22 + + # pred_pose_eval = torch.zeros((bs, seq, motion.shape[-1])).cuda() + + if do_vq_res: + code_ids, all_codes = vq_model.encode(motion) + if len(code_ids.shape) == 3: + pred_vq_codes = res_model(code_ids[..., 0]) + else: + pred_vq_codes = res_model(code_ids) + # pred_vq_codes = pred_vq_codes - pred_vq_res + all_codes[1:].sum(0) + pred_pose_eval = vq_model.decoder(pred_vq_codes) + else: + rec_motions, _, _ = vq_model(motion) + pred_pose_eval = res_model(rec_motions) # all_indices,_ = net.encode(motion) + # pred_pose_eval = net.forward_decoder(all_indices[..., :1]) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_pose_eval, + m_length) + + bgt = val_loader.dataset.inv_transform(motion.detach().cpu().numpy()) + bpred = val_loader.dataset.inv_transform(pred_pose_eval.detach().cpu().numpy()) + for i in range(bs): + gt = recover_from_ric(torch.from_numpy(bgt[i, :m_length[i]]).float(), num_joint) + pred = recover_from_ric(torch.from_numpy(bpred[i, :m_length[i]]).float(), num_joint) + # gt = motion[i, :m_length[i]] + # pred = pred_pose_eval[i, :m_length[i]] + num_pose = gt.shape[0] + l1_dist += F.l1_loss(gt, pred) * num_pose + num_poses += num_pose + + motion_pred_list.append(em_pred) + motion_annotation_list.append(em) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + l1_dist = l1_dist / num_poses + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = "--> \t Eva. Re %d:, FID. %.4f, Diversity Real. %.4f, Diversity. %.4f, R_precision_real. (%.4f, %.4f, %.4f), R_precision. (%.4f, %.4f, %.4f), matching_real. %.4f, matching_pred. %.4f, mae. %.4f"%\ + (repeat_id, fid, diversity_real, diversity, R_precision_real[0],R_precision_real[1], R_precision_real[2], + R_precision[0],R_precision[1], R_precision[2], matching_score_real, matching_score_pred, l1_dist) + # logger.info(msg) + print(msg) + return fid, diversity, R_precision, matching_score_pred, l1_dist + +@torch.no_grad() +def evaluation_mask_transformer(out_dir, val_loader, trans, vq_model, writer, ep, best_fid, best_div, + best_top1, best_top2, best_top3, best_matching, eval_wrapper, plot_func, + save_ckpt=False, save_anim=False): + + def save(file_name, ep): + t2m_trans_state_dict = trans.state_dict() + clip_weights = [e for e in t2m_trans_state_dict.keys() if e.startswith('clip_model.')] + for e in clip_weights: + del t2m_trans_state_dict[e] + state = { + 't2m_transformer': t2m_trans_state_dict, + # 'opt_t2m_transformer': self.opt_t2m_transformer.state_dict(), + # 'scheduler':self.scheduler.state_dict(), + 'ep': ep, + } + torch.save(state, file_name) + + trans.eval() + vq_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + R_precision_real = 0 + R_precision = 0 + matching_score_real = 0 + matching_score_pred = 0 + time_steps = 18 + if "kit" in out_dir: + cond_scale = 2 + else: + cond_scale = 4 + + # print(num_quantizer) + + # assert num_quantizer >= len(time_steps) and num_quantizer >= len(cond_scales) + + nb_sample = 0 + # for i in range(1): + for batch in val_loader: + word_embeddings, pos_one_hots, clip_text, sent_len, pose, m_length, token = batch + m_length = m_length.cuda() + + bs, seq = pose.shape[:2] + # num_joints = 21 if pose.shape[-1] == 251 else 22 + + # (b, seqlen) + mids = trans.generate(clip_text, m_length, time_steps, cond_scale, temperature=1) + + # motion_codes = motion_codes.permute(0, 2, 1) + mids.unsqueeze_(-1) + pred_motions = vq_model.forward_decoder(mids) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_motions.clone(), + m_length) + + pose = pose.cuda().float() + + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pose, m_length) + motion_annotation_list.append(em) + motion_pred_list.append(em_pred) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = f"--> \t Eva. Ep {ep} :, FID. {fid:.4f}, Diversity Real. {diversity_real:.4f}, Diversity. {diversity:.4f}, R_precision_real. {R_precision_real}, R_precision. {R_precision}, matching_score_real. {matching_score_real}, matching_score_pred. {matching_score_pred}" + print(msg) + + # if draw: + writer.add_scalar('./Test/FID', fid, ep) + writer.add_scalar('./Test/Diversity', diversity, ep) + writer.add_scalar('./Test/top1', R_precision[0], ep) + writer.add_scalar('./Test/top2', R_precision[1], ep) + writer.add_scalar('./Test/top3', R_precision[2], ep) + writer.add_scalar('./Test/matching_score', matching_score_pred, ep) + + + if fid < best_fid: + msg = f"--> --> \t FID Improved from {best_fid:.5f} to {fid:.5f} !!!" + print(msg) + best_fid, best_ep = fid, ep + if save_ckpt: + save(os.path.join(out_dir, 'model', 'net_best_fid.tar'), ep) + + if matching_score_pred < best_matching: + msg = f"--> --> \t matching_score Improved from {best_matching:.5f} to {matching_score_pred:.5f} !!!" + print(msg) + best_matching = matching_score_pred + + if abs(diversity_real - diversity) < abs(diversity_real - best_div): + msg = f"--> --> \t Diversity Improved from {best_div:.5f} to {diversity:.5f} !!!" + print(msg) + best_div = diversity + + if R_precision[0] > best_top1: + msg = f"--> --> \t Top1 Improved from {best_top1:.4f} to {R_precision[0]:.4f} !!!" + print(msg) + best_top1 = R_precision[0] + + if R_precision[1] > best_top2: + msg = f"--> --> \t Top2 Improved from {best_top2:.4f} to {R_precision[1]:.4f} !!!" + print(msg) + best_top2 = R_precision[1] + + if R_precision[2] > best_top3: + msg = f"--> --> \t Top3 Improved from {best_top3:.4f} to {R_precision[2]:.4f} !!!" + print(msg) + best_top3 = R_precision[2] + + if save_anim: + rand_idx = torch.randint(bs, (3,)) + data = pred_motions[rand_idx].detach().cpu().numpy() + captions = [clip_text[k] for k in rand_idx] + lengths = m_length[rand_idx].cpu().numpy() + save_dir = os.path.join(out_dir, 'animation', 'E%04d' % ep) + os.makedirs(save_dir, exist_ok=True) + # print(lengths) + plot_func(data, save_dir, captions, lengths) + + + return best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer + +@torch.no_grad() +def evaluation_res_transformer(out_dir, val_loader, trans, vq_model, writer, ep, best_fid, best_div, + best_top1, best_top2, best_top3, best_matching, eval_wrapper, plot_func, + save_ckpt=False, save_anim=False, cond_scale=2, temperature=1): + + def save(file_name, ep): + res_trans_state_dict = trans.state_dict() + clip_weights = [e for e in res_trans_state_dict.keys() if e.startswith('clip_model.')] + for e in clip_weights: + del res_trans_state_dict[e] + state = { + 'res_transformer': res_trans_state_dict, + # 'opt_t2m_transformer': self.opt_t2m_transformer.state_dict(), + # 'scheduler':self.scheduler.state_dict(), + 'ep': ep, + } + torch.save(state, file_name) + + trans.eval() + vq_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + R_precision_real = 0 + R_precision = 0 + matching_score_real = 0 + matching_score_pred = 0 + + # print(num_quantizer) + + # assert num_quantizer >= len(time_steps) and num_quantizer >= len(cond_scales) + + nb_sample = 0 + # for i in range(1): + for batch in val_loader: + word_embeddings, pos_one_hots, clip_text, sent_len, pose, m_length, token = batch + m_length = m_length.cuda().long() + pose = pose.cuda().float() + + bs, seq = pose.shape[:2] + # num_joints = 21 if pose.shape[-1] == 251 else 22 + + code_indices, all_codes = vq_model.encode(pose) + # (b, seqlen) + if ep == 0: + pred_ids = code_indices[..., 0:1] + else: + pred_ids = trans.generate(code_indices[..., 0], clip_text, m_length, + temperature=temperature, cond_scale=cond_scale) + # pred_codes = trans(code_indices[..., 0], clip_text, m_length//4, force_mask=force_mask) + + pred_motions = vq_model.forward_decoder(pred_ids) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_motions.clone(), + m_length) + + pose = pose.cuda().float() + + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pose, m_length) + motion_annotation_list.append(em) + motion_pred_list.append(em_pred) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = f"--> \t Eva. Ep {ep} :, FID. {fid:.4f}, Diversity Real. {diversity_real:.4f}, Diversity. {diversity:.4f}, R_precision_real. {R_precision_real}, R_precision. {R_precision}, matching_score_real. {matching_score_real}, matching_score_pred. {matching_score_pred}" + print(msg) + + # if draw: + writer.add_scalar('./Test/FID', fid, ep) + writer.add_scalar('./Test/Diversity', diversity, ep) + writer.add_scalar('./Test/top1', R_precision[0], ep) + writer.add_scalar('./Test/top2', R_precision[1], ep) + writer.add_scalar('./Test/top3', R_precision[2], ep) + writer.add_scalar('./Test/matching_score', matching_score_pred, ep) + + + if fid < best_fid: + msg = f"--> --> \t FID Improved from {best_fid:.5f} to {fid:.5f} !!!" + print(msg) + best_fid, best_ep = fid, ep + if save_ckpt: + save(os.path.join(out_dir, 'model', 'net_best_fid.tar'), ep) + + if matching_score_pred < best_matching: + msg = f"--> --> \t matching_score Improved from {best_matching:.5f} to {matching_score_pred:.5f} !!!" + print(msg) + best_matching = matching_score_pred + + if abs(diversity_real - diversity) < abs(diversity_real - best_div): + msg = f"--> --> \t Diversity Improved from {best_div:.5f} to {diversity:.5f} !!!" + print(msg) + best_div = diversity + + if R_precision[0] > best_top1: + msg = f"--> --> \t Top1 Improved from {best_top1:.4f} to {R_precision[0]:.4f} !!!" + print(msg) + best_top1 = R_precision[0] + + if R_precision[1] > best_top2: + msg = f"--> --> \t Top2 Improved from {best_top2:.4f} to {R_precision[1]:.4f} !!!" + print(msg) + best_top2 = R_precision[1] + + if R_precision[2] > best_top3: + msg = f"--> --> \t Top3 Improved from {best_top3:.4f} to {R_precision[2]:.4f} !!!" + print(msg) + best_top3 = R_precision[2] + + if save_anim: + rand_idx = torch.randint(bs, (3,)) + data = pred_motions[rand_idx].detach().cpu().numpy() + captions = [clip_text[k] for k in rand_idx] + lengths = m_length[rand_idx].cpu().numpy() + save_dir = os.path.join(out_dir, 'animation', 'E%04d' % ep) + os.makedirs(save_dir, exist_ok=True) + # print(lengths) + plot_func(data, save_dir, captions, lengths) + + + return best_fid, best_div, best_top1, best_top2, best_top3, best_matching, writer + + +@torch.no_grad() +def evaluation_res_transformer_plus_l1(val_loader, vq_model, trans, repeat_id, eval_wrapper, num_joint, + cond_scale=2, temperature=1, topkr=0.9, cal_l1=True): + + + trans.eval() + vq_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + R_precision_real = 0 + R_precision = 0 + matching_score_real = 0 + matching_score_pred = 0 + + # print(num_quantizer) + + # assert num_quantizer >= len(time_steps) and num_quantizer >= len(cond_scales) + + nb_sample = 0 + l1_dist = 0 + num_poses = 1 + # for i in range(1): + for batch in val_loader: + word_embeddings, pos_one_hots, clip_text, sent_len, pose, m_length, token = batch + m_length = m_length.cuda().long() + pose = pose.cuda().float() + + bs, seq = pose.shape[:2] + # num_joints = 21 if pose.shape[-1] == 251 else 22 + + code_indices, all_codes = vq_model.encode(pose) + # print(code_indices[0:2, :, 1]) + + pred_ids = trans.generate(code_indices[..., 0], clip_text, m_length, topk_filter_thres=topkr, + temperature=temperature, cond_scale=cond_scale) + # pred_codes = trans(code_indices[..., 0], clip_text, m_length//4, force_mask=force_mask) + + pred_motions = vq_model.forward_decoder(pred_ids) + + if cal_l1: + bgt = val_loader.dataset.inv_transform(pose.detach().cpu().numpy()) + bpred = val_loader.dataset.inv_transform(pred_motions.detach().cpu().numpy()) + for i in range(bs): + gt = recover_from_ric(torch.from_numpy(bgt[i, :m_length[i]]).float(), num_joint) + pred = recover_from_ric(torch.from_numpy(bpred[i, :m_length[i]]).float(), num_joint) + # gt = motion[i, :m_length[i]] + # pred = pred_pose_eval[i, :m_length[i]] + num_pose = gt.shape[0] + l1_dist += F.l1_loss(gt, pred) * num_pose + num_poses += num_pose + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_motions.clone(), + m_length) + + pose = pose.cuda().float() + + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pose, m_length) + motion_annotation_list.append(em) + motion_pred_list.append(em_pred) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + l1_dist = l1_dist / num_poses + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = "--> \t Eva. Re %d:, FID. %.4f, Diversity Real. %.4f, Diversity. %.4f, R_precision_real. (%.4f, %.4f, %.4f), R_precision. (%.4f, %.4f, %.4f), matching_real. %.4f, matching_pred. %.4f, mae. %.4f" % \ + (repeat_id, fid, diversity_real, diversity, R_precision_real[0], R_precision_real[1], R_precision_real[2], + R_precision[0], R_precision[1], R_precision[2], matching_score_real, matching_score_pred, l1_dist) + # logger.info(msg) + print(msg) + return fid, diversity, R_precision, matching_score_pred, l1_dist + + +@torch.no_grad() +def evaluation_mask_transformer_test(val_loader, vq_model, trans, repeat_id, eval_wrapper, + time_steps, cond_scale, temperature, topkr, gsample=True, force_mask=False, cal_mm=True): + trans.eval() + vq_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + motion_multimodality = [] + R_precision_real = 0 + R_precision = 0 + matching_score_real = 0 + matching_score_pred = 0 + multimodality = 0 + + nb_sample = 0 + if cal_mm: + num_mm_batch = 3 + else: + num_mm_batch = 0 + + for i, batch in enumerate(val_loader): + # print(i) + word_embeddings, pos_one_hots, clip_text, sent_len, pose, m_length, token = batch + m_length = m_length.cuda() + + bs, seq = pose.shape[:2] + # num_joints = 21 if pose.shape[-1] == 251 else 22 + + # for i in range(mm_batch) + if i < num_mm_batch: + # (b, seqlen, c) + motion_multimodality_batch = [] + for _ in range(30): + mids = trans.generate(clip_text, m_length, time_steps, cond_scale, + temperature=temperature, topk_filter_thres=topkr, + gsample=gsample, force_mask=force_mask) + + # motion_codes = motion_codes.permute(0, 2, 1) + mids.unsqueeze_(-1) + pred_motions = vq_model.forward_decoder(mids) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_motions.clone(), + m_length) + # em_pred = em_pred.unsqueeze(1) #(bs, 1, d) + motion_multimodality_batch.append(em_pred.unsqueeze(1)) + motion_multimodality_batch = torch.cat(motion_multimodality_batch, dim=1) #(bs, 30, d) + motion_multimodality.append(motion_multimodality_batch) + else: + mids = trans.generate(clip_text, m_length, time_steps, cond_scale, + temperature=temperature, topk_filter_thres=topkr, + force_mask=force_mask) + + # motion_codes = motion_codes.permute(0, 2, 1) + mids.unsqueeze_(-1) + pred_motions = vq_model.forward_decoder(mids) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, + pred_motions.clone(), + m_length) + + pose = pose.cuda().float() + + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pose, m_length) + motion_annotation_list.append(em) + motion_pred_list.append(em_pred) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + # print(et_pred.shape, em_pred.shape) + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + if not force_mask and cal_mm: + motion_multimodality = torch.cat(motion_multimodality, dim=0).cpu().numpy() + multimodality = calculate_multimodality(motion_multimodality, 10) + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = f"--> \t Eva. Repeat {repeat_id} :, FID. {fid:.4f}, " \ + f"Diversity Real. {diversity_real:.4f}, Diversity. {diversity:.4f}, " \ + f"R_precision_real. {R_precision_real}, R_precision. {R_precision}, " \ + f"matching_score_real. {matching_score_real:.4f}, matching_score_pred. {matching_score_pred:.4f}," \ + f"multimodality. {multimodality:.4f}" + print(msg) + return fid, diversity, R_precision, matching_score_pred, multimodality + + +@torch.no_grad() +def evaluation_mask_transformer_test_plus_res(val_loader, vq_model, res_model, trans, repeat_id, eval_wrapper, + time_steps, cond_scale, temperature, topkr, gsample=True, force_mask=False, + cal_mm=True, res_cond_scale=5): + trans.eval() + vq_model.eval() + res_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + motion_multimodality = [] + R_precision_real = 0 + R_precision = 0 + matching_score_real = 0 + matching_score_pred = 0 + multimodality = 0 + + nb_sample = 0 + if force_mask or (not cal_mm): + num_mm_batch = 0 + else: + num_mm_batch = 3 + + for i, batch in enumerate(val_loader): + word_embeddings, pos_one_hots, clip_text, sent_len, pose, m_length, token = batch + m_length = m_length.cuda() + + bs, seq = pose.shape[:2] + # num_joints = 21 if pose.shape[-1] == 251 else 22 + + # for i in range(mm_batch) + if i < num_mm_batch: + # (b, seqlen, c) + motion_multimodality_batch = [] + for _ in range(30): + mids = trans.generate(clip_text, m_length, time_steps, cond_scale, + temperature=temperature, topk_filter_thres=topkr, + gsample=gsample, force_mask=force_mask) + + # motion_codes = motion_codes.permute(0, 2, 1) + # mids.unsqueeze_(-1) + pred_ids = res_model.generate(mids, clip_text, m_length, temperature=1, cond_scale=res_cond_scale) + # pred_codes = trans(code_indices[..., 0], clip_text, m_length//4, force_mask=force_mask) + # pred_ids = torch.where(pred_ids==-1, 0, pred_ids) + + pred_motions = vq_model.forward_decoder(pred_ids) + + # pred_motions = vq_model.decoder(codes) + # pred_motions = vq_model.forward_decoder(mids) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pred_motions.clone(), + m_length) + # em_pred = em_pred.unsqueeze(1) #(bs, 1, d) + motion_multimodality_batch.append(em_pred.unsqueeze(1)) + motion_multimodality_batch = torch.cat(motion_multimodality_batch, dim=1) #(bs, 30, d) + motion_multimodality.append(motion_multimodality_batch) + else: + mids = trans.generate(clip_text, m_length, time_steps, cond_scale, + temperature=temperature, topk_filter_thres=topkr, + force_mask=force_mask) + + # motion_codes = motion_codes.permute(0, 2, 1) + # mids.unsqueeze_(-1) + pred_ids = res_model.generate(mids, clip_text, m_length, temperature=1, cond_scale=res_cond_scale) + # pred_codes = trans(code_indices[..., 0], clip_text, m_length//4, force_mask=force_mask) + # pred_ids = torch.where(pred_ids == -1, 0, pred_ids) + + pred_motions = vq_model.forward_decoder(pred_ids) + # pred_motions = vq_model.forward_decoder(mids) + + et_pred, em_pred = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, + pred_motions.clone(), + m_length) + + pose = pose.cuda().float() + + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pose, m_length) + motion_annotation_list.append(em) + motion_pred_list.append(em_pred) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + # print(et_pred.shape, em_pred.shape) + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + if not force_mask and cal_mm: + motion_multimodality = torch.cat(motion_multimodality, dim=0).cpu().numpy() + multimodality = calculate_multimodality(motion_multimodality, 10) + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = f"--> \t Eva. Repeat {repeat_id} :, FID. {fid:.4f}, " \ + f"Diversity Real. {diversity_real:.4f}, Diversity. {diversity:.4f}, " \ + f"R_precision_real. {R_precision_real}, R_precision. {R_precision}, " \ + f"matching_score_real. {matching_score_real:.4f}, matching_score_pred. {matching_score_pred:.4f}," \ + f"multimodality. {multimodality:.4f}" + print(msg) + return fid, diversity, R_precision, matching_score_pred, multimodality + + +@torch.no_grad() +def evaluation_mask_transformer_test_plus_res(val_loader, res_model, trans, repeat_id, eval_wrapper, + time_steps, cond_scale, temperature, topkr, gsample=True, force_mask=False, + cal_mm=True, res_cond_scale=5): + trans.eval() + res_model.eval() + + motion_annotation_list = [] + motion_pred_list = [] + motion_multimodality = [] + R_precision_real = 0 + R_precision = 0 + matching_score_real = 0 + matching_score_pred = 0 + multimodality = 0 + + nb_sample = 0 + if force_mask or (not cal_mm): + num_mm_batch = 0 + else: + num_mm_batch = 3 + + for i, batch in enumerate(val_loader): + word_embeddings, pos_one_hots, clip_text, sent_len, pose, m_length, token = batch + m_length = m_length.cuda() + + bs, seq = pose.shape[:2] + # num_joints = 21 if pose.shape[-1] == 251 else 22 + + mids = trans.generate(clip_text, m_length, time_steps, cond_scale, + temperature=temperature, topk_filter_thres=topkr, + gsample=gsample, force_mask=force_mask) + + pred_ids = res_model.generate(mids, clip_text, m_length, temperature=1, cond_scale=res_cond_scale) + # TODO: save pred_ids here. + + pose = pose.cuda().float() + + et, em = eval_wrapper.get_co_embeddings(word_embeddings, pos_one_hots, sent_len, pose, m_length) + motion_annotation_list.append(em) + motion_pred_list.append(em_pred) + + temp_R = calculate_R_precision(et.cpu().numpy(), em.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et.cpu().numpy(), em.cpu().numpy()).trace() + R_precision_real += temp_R + matching_score_real += temp_match + # print(et_pred.shape, em_pred.shape) + temp_R = calculate_R_precision(et_pred.cpu().numpy(), em_pred.cpu().numpy(), top_k=3, sum_all=True) + temp_match = euclidean_distance_matrix(et_pred.cpu().numpy(), em_pred.cpu().numpy()).trace() + R_precision += temp_R + matching_score_pred += temp_match + + nb_sample += bs + + motion_annotation_np = torch.cat(motion_annotation_list, dim=0).cpu().numpy() + motion_pred_np = torch.cat(motion_pred_list, dim=0).cpu().numpy() + if not force_mask and cal_mm: + motion_multimodality = torch.cat(motion_multimodality, dim=0).cpu().numpy() + multimodality = calculate_multimodality(motion_multimodality, 10) + gt_mu, gt_cov = calculate_activation_statistics(motion_annotation_np) + mu, cov = calculate_activation_statistics(motion_pred_np) + + diversity_real = calculate_diversity(motion_annotation_np, 300 if nb_sample > 300 else 100) + diversity = calculate_diversity(motion_pred_np, 300 if nb_sample > 300 else 100) + + R_precision_real = R_precision_real / nb_sample + R_precision = R_precision / nb_sample + + matching_score_real = matching_score_real / nb_sample + matching_score_pred = matching_score_pred / nb_sample + + fid = calculate_frechet_distance(gt_mu, gt_cov, mu, cov) + + msg = f"--> \t Eva. Repeat {repeat_id} :, FID. {fid:.4f}, " \ + f"Diversity Real. {diversity_real:.4f}, Diversity. {diversity:.4f}, " \ + f"R_precision_real. {R_precision_real}, R_precision. {R_precision}, " \ + f"matching_score_real. {matching_score_real:.4f}, matching_score_pred. {matching_score_pred:.4f}," \ + f"multimodality. {multimodality:.4f}" + print(msg) + return fid, diversity, R_precision, matching_score_pred, multimodality + diff --git a/src/momask-preenc/utils/fixseed.py b/src/momask-preenc/utils/fixseed.py new file mode 100644 index 0000000000000000000000000000000000000000..6f44f6ca263dcc410102a50970ce1b78405ba1f1 --- /dev/null +++ b/src/momask-preenc/utils/fixseed.py @@ -0,0 +1,18 @@ +import numpy as np +import torch +import random + + +def fixseed(seed): + torch.backends.cudnn.benchmark = False + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + +# SEED = 10 +# EVALSEED = 0 +# # Provoc warning: not fully functionnal yet +# # torch.set_deterministic(True) +# torch.backends.cudnn.benchmark = False +# fixseed(SEED) diff --git a/src/momask-preenc/utils/get_opt.py b/src/momask-preenc/utils/get_opt.py new file mode 100644 index 0000000000000000000000000000000000000000..663504d0ba6995e6c205eab137cdb57fa267bcd3 --- /dev/null +++ b/src/momask-preenc/utils/get_opt.py @@ -0,0 +1,89 @@ +import os +from argparse import Namespace +import re +from os.path import join as pjoin +from utils.word_vectorizer import POS_enumerator + + +def is_float(numStr): + flag = False + numStr = str(numStr).strip().lstrip('-').lstrip('+') # Strip explicit positive or negative sign + try: + reg = re.compile(r'^[-+]?[0-9]+\.[0-9]+$') + res = reg.match(str(numStr)) + if res: + flag = True + except Exception as ex: + print("is_float() - error: " + str(ex)) + return flag + + +def is_number(numStr): + flag = False + numStr = str(numStr).strip().lstrip('-').lstrip('+') # Strip explicit positive or negative sign + if str(numStr).isdigit(): + flag = True + return flag + + +def get_opt(opt_path, device, **kwargs): + opt = Namespace() + opt_dict = vars(opt) + + skip = ('-------------- End ----------------', + '------------ Options -------------', + '\n') + print('Reading', opt_path) + with open(opt_path, 'r') as f: + for line in f: + if line.strip() not in skip: + # print(line.strip()) + key, value = line.strip('\n').split(': ') + if value in ('True', 'False'): + opt_dict[key] = (value == 'True') + # print(key, value) + elif is_float(value): + opt_dict[key] = float(value) + elif is_number(value): + opt_dict[key] = int(value) + else: + opt_dict[key] = str(value) + + # print(opt) + opt_dict['which_epoch'] = 'finest' + opt.save_root = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name) + opt.model_dir = pjoin(opt.save_root, 'model') + opt.meta_dir = pjoin(opt.save_root, 'meta') + + if opt.dataset_name == 't2m': + opt.data_root = './dataset/HumanML3D/' + opt.motion_dir = pjoin(opt.data_root, 'new_joint_vecs') + opt.text_dir = pjoin(opt.data_root, 'texts') + opt.joints_num = 22 + opt.dim_pose = 263 + opt.max_motion_length = 196 + opt.max_motion_frame = 196 + opt.max_motion_token = 55 + elif opt.dataset_name == 'kit': + opt.data_root = './dataset/KIT-ML/' + opt.motion_dir = pjoin(opt.data_root, 'new_joint_vecs') + opt.text_dir = pjoin(opt.data_root, 'texts') + opt.joints_num = 21 + opt.dim_pose = 251 + opt.max_motion_length = 196 + opt.max_motion_frame = 196 + opt.max_motion_token = 55 + else: + raise KeyError('Dataset not recognized') + if not hasattr(opt, 'unit_length'): + opt.unit_length = 1 + opt.dim_word = 300 + opt.num_classes = 200 // opt.unit_length + opt.dim_pos_ohot = len(POS_enumerator) + opt.is_train = False + opt.is_continue = False + opt.device = device + + opt_dict.update(kwargs) # Overwrite with kwargs params + + return opt \ No newline at end of file diff --git a/src/momask-preenc/utils/metrics.py b/src/momask-preenc/utils/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..6975b3c5953918e690d1a72d9741bf05a77e29f1 --- /dev/null +++ b/src/momask-preenc/utils/metrics.py @@ -0,0 +1,170 @@ +import numpy as np +from scipy import linalg +import torch + + +def calculate_mpjpe(gt_joints, pred_joints): + """ + gt_joints: num_poses x num_joints(22) x 3 + pred_joints: num_poses x num_joints(22) x 3 + (obtained from recover_from_ric()) + """ + assert gt_joints.shape == pred_joints.shape, f"GT shape: {gt_joints.shape}, pred shape: {pred_joints.shape}" + + # Align by root (pelvis) + pelvis = gt_joints[:, [0]].mean(1) + gt_joints = gt_joints - torch.unsqueeze(pelvis, dim=1) + pelvis = pred_joints[:, [0]].mean(1) + pred_joints = pred_joints - torch.unsqueeze(pelvis, dim=1) + + # Compute MPJPE + mpjpe = torch.linalg.norm(pred_joints - gt_joints, dim=-1) # num_poses x num_joints=22 + mpjpe_seq = mpjpe.mean(-1) # num_poses + + return mpjpe_seq + +# (X - X_train)*(X - X_train) = -2X*X_train + X*X + X_train*X_train +def euclidean_distance_matrix(matrix1, matrix2): + """ + Params: + -- matrix1: N1 x D + -- matrix2: N2 x D + Returns: + -- dist: N1 x N2 + dist[i, j] == distance(matrix1[i], matrix2[j]) + """ + assert matrix1.shape[1] == matrix2.shape[1] + d1 = -2 * np.dot(matrix1, matrix2.T) # shape (num_test, num_train) + d2 = np.sum(np.square(matrix1), axis=1, keepdims=True) # shape (num_test, 1) + d3 = np.sum(np.square(matrix2), axis=1) # shape (num_train, ) + dists = np.sqrt(d1 + d2 + d3) # broadcasting + return dists + +def calculate_top_k(mat, top_k): + size = mat.shape[0] + gt_mat = np.expand_dims(np.arange(size), 1).repeat(size, 1) + bool_mat = (mat == gt_mat) + correct_vec = False + top_k_list = [] + for i in range(top_k): +# print(correct_vec, bool_mat[:, i]) + correct_vec = (correct_vec | bool_mat[:, i]) + # print(correct_vec) + top_k_list.append(correct_vec[:, None]) + top_k_mat = np.concatenate(top_k_list, axis=1) + return top_k_mat + + +def calculate_R_precision(embedding1, embedding2, top_k, sum_all=False): + dist_mat = euclidean_distance_matrix(embedding1, embedding2) + argmax = np.argsort(dist_mat, axis=1) + top_k_mat = calculate_top_k(argmax, top_k) + if sum_all: + return top_k_mat.sum(axis=0) + else: + return top_k_mat + + +def calculate_matching_score(embedding1, embedding2, sum_all=False): + assert len(embedding1.shape) == 2 + assert embedding1.shape[0] == embedding2.shape[0] + assert embedding1.shape[1] == embedding2.shape[1] + + dist = linalg.norm(embedding1 - embedding2, axis=1) + if sum_all: + return dist.sum(axis=0) + else: + return dist + + + +def calculate_activation_statistics(activations): + """ + Params: + -- activation: num_samples x dim_feat + Returns: + -- mu: dim_feat + -- sigma: dim_feat x dim_feat + """ + mu = np.mean(activations, axis=0) + cov = np.cov(activations, rowvar=False) + return mu, cov + + +def calculate_diversity(activation, diversity_times): + assert len(activation.shape) == 2 + assert activation.shape[0] > diversity_times + num_samples = activation.shape[0] + + first_indices = np.random.choice(num_samples, diversity_times, replace=False) + second_indices = np.random.choice(num_samples, diversity_times, replace=False) + dist = linalg.norm(activation[first_indices] - activation[second_indices], axis=1) + return dist.mean() + + +def calculate_multimodality(activation, multimodality_times): + assert len(activation.shape) == 3 + assert activation.shape[1] > multimodality_times + num_per_sent = activation.shape[1] + + first_dices = np.random.choice(num_per_sent, multimodality_times, replace=False) + second_dices = np.random.choice(num_per_sent, multimodality_times, replace=False) + dist = linalg.norm(activation[:, first_dices] - activation[:, second_dices], axis=2) + return dist.mean() + + +def calculate_frechet_distance(mu1, sigma1, mu2, sigma2, eps=1e-6): + """Numpy implementation of the Frechet Distance. + The Frechet distance between two multivariate Gaussians X_1 ~ N(mu_1, C_1) + and X_2 ~ N(mu_2, C_2) is + d^2 = ||mu_1 - mu_2||^2 + Tr(C_1 + C_2 - 2*sqrt(C_1*C_2)). + Stable version by Dougal J. Sutherland. + Params: + -- mu1 : Numpy array containing the activations of a layer of the + inception net (like returned by the function 'get_predictions') + for generated samples. + -- mu2 : The sample mean over activations, precalculated on an + representative data set. + -- sigma1: The covariance matrix over activations for generated samples. + -- sigma2: The covariance matrix over activations, precalculated on an + representative data set. + Returns: + -- : The Frechet Distance. + """ + + mu1 = np.atleast_1d(mu1) + mu2 = np.atleast_1d(mu2) + + sigma1 = np.atleast_2d(sigma1) + sigma2 = np.atleast_2d(sigma2) + + assert mu1.shape == mu2.shape, \ + 'Training and test mean vectors have different lengths' + assert sigma1.shape == sigma2.shape, \ + 'Training and test covariances have different dimensions' + + diff = mu1 - mu2 + + # Product might be almost singular + covmean, _ = linalg.sqrtm(sigma1.dot(sigma2), disp=False) + if not np.isfinite(covmean).all(): + msg = ('fid calculation produces singular product; ' + 'adding %s to diagonal of cov estimates') % eps + print(msg) + offset = np.eye(sigma1.shape[0]) * eps + covmean = linalg.sqrtm((sigma1 + offset).dot(sigma2 + offset)) + + # Numerical error might give slight imaginary component + if np.iscomplexobj(covmean): + if not np.allclose(np.diagonal(covmean).imag, 0, atol=1e-3): + m = np.max(np.abs(covmean.imag)) + raise ValueError('Imaginary component {}'.format(m)) + covmean = covmean.real + + tr_covmean = np.trace(covmean) + + return (diff.dot(diff) + np.trace(sigma1) + + np.trace(sigma2) - 2 * tr_covmean) + + + diff --git a/src/momask-preenc/utils/motion_process.py b/src/momask-preenc/utils/motion_process.py new file mode 100644 index 0000000000000000000000000000000000000000..de330f89ba5da0503e5854909023adca53d80bf9 --- /dev/null +++ b/src/momask-preenc/utils/motion_process.py @@ -0,0 +1,514 @@ +from os.path import join as pjoin + +from common.skeleton import Skeleton +import numpy as np +import os +from common.quaternion import * +from utils.paramUtil import * + +import torch + +# positions (batch, joint_num, 3) +def uniform_skeleton(positions, target_offset): + src_skel = Skeleton(n_raw_offsets, kinematic_chain, 'cpu') + src_offset = src_skel.get_offsets_joints(torch.from_numpy(positions[0])) + src_offset = src_offset.numpy() + tgt_offset = target_offset.numpy() + # print(src_offset) + # print(tgt_offset) + '''Calculate Scale Ratio as the ratio of legs''' + src_leg_len = np.abs(src_offset[l_idx1]).max() + np.abs(src_offset[l_idx2]).max() + tgt_leg_len = np.abs(tgt_offset[l_idx1]).max() + np.abs(tgt_offset[l_idx2]).max() + + scale_rt = tgt_leg_len / src_leg_len + # print(scale_rt) + src_root_pos = positions[:, 0] + tgt_root_pos = src_root_pos * scale_rt + + '''Inverse Kinematics''' + quat_params = src_skel.inverse_kinematics_np(positions, face_joint_indx) + # print(quat_params.shape) + + '''Forward Kinematics''' + src_skel.set_offset(target_offset) + new_joints = src_skel.forward_kinematics_np(quat_params, tgt_root_pos) + return new_joints + + +def extract_features(positions, feet_thre, n_raw_offsets, kinematic_chain, face_joint_indx, fid_r, fid_l): + global_positions = positions.copy() + """ Get Foot Contacts """ + + def foot_detect(positions, thres): + velfactor, heightfactor = np.array([thres, thres]), np.array([3.0, 2.0]) + + feet_l_x = (positions[1:, fid_l, 0] - positions[:-1, fid_l, 0]) ** 2 + feet_l_y = (positions[1:, fid_l, 1] - positions[:-1, fid_l, 1]) ** 2 + feet_l_z = (positions[1:, fid_l, 2] - positions[:-1, fid_l, 2]) ** 2 + # feet_l_h = positions[:-1,fid_l,1] + # feet_l = (((feet_l_x + feet_l_y + feet_l_z) < velfactor) & (feet_l_h < heightfactor)).astype(np.float) + feet_l = ((feet_l_x + feet_l_y + feet_l_z) < velfactor).astype(np.float) + + feet_r_x = (positions[1:, fid_r, 0] - positions[:-1, fid_r, 0]) ** 2 + feet_r_y = (positions[1:, fid_r, 1] - positions[:-1, fid_r, 1]) ** 2 + feet_r_z = (positions[1:, fid_r, 2] - positions[:-1, fid_r, 2]) ** 2 + # feet_r_h = positions[:-1,fid_r,1] + # feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor) & (feet_r_h < heightfactor)).astype(np.float) + feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor)).astype(np.float) + return feet_l, feet_r + + # + feet_l, feet_r = foot_detect(positions, feet_thre) + # feet_l, feet_r = foot_detect(positions, 0.002) + + '''Quaternion and Cartesian representation''' + r_rot = None + + def get_rifke(positions): + '''Local pose''' + positions[..., 0] -= positions[:, 0:1, 0] + positions[..., 2] -= positions[:, 0:1, 2] + '''All pose face Z+''' + positions = qrot_np(np.repeat(r_rot[:, None], positions.shape[1], axis=1), positions) + return positions + + def get_quaternion(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=False) + + '''Fix Quaternion Discontinuity''' + quat_params = qfix(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + quat_params[1:, 0] = r_velocity + # (seq_len, joints_num, 4) + return quat_params, r_velocity, velocity, r_rot + + def get_cont6d_params(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=True) + + '''Quaternion to continuous 6D''' + cont_6d_params = quaternion_to_cont6d_np(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + # (seq_len, joints_num, 4) + return cont_6d_params, r_velocity, velocity, r_rot + + cont_6d_params, r_velocity, velocity, r_rot = get_cont6d_params(positions) + positions = get_rifke(positions) + + # trejec = np.cumsum(np.concatenate([np.array([[0, 0, 0]]), velocity], axis=0), axis=0) + # r_rotations, r_pos = recover_ric_glo_np(r_velocity, velocity[:, [0, 2]]) + + # plt.plot(positions_b[:, 0, 0], positions_b[:, 0, 2], marker='*') + # plt.plot(ground_positions[:, 0, 0], ground_positions[:, 0, 2], marker='o', color='r') + # plt.plot(trejec[:, 0], trejec[:, 2], marker='^', color='g') + # plt.plot(r_pos[:, 0], r_pos[:, 2], marker='s', color='y') + # plt.xlabel('x') + # plt.ylabel('z') + # plt.axis('equal') + # plt.show() + + '''Root height''' + root_y = positions[:, 0, 1:2] + + '''Root rotation and linear velocity''' + # (seq_len-1, 1) rotation velocity along y-axis + # (seq_len-1, 2) linear velovity on xz plane + r_velocity = np.arcsin(r_velocity[:, 2:3]) + l_velocity = velocity[:, [0, 2]] + # print(r_velocity.shape, l_velocity.shape, root_y.shape) + root_data = np.concatenate([r_velocity, l_velocity, root_y[:-1]], axis=-1) + + '''Get Joint Rotation Representation''' + # (seq_len, (joints_num-1) *6) quaternion for skeleton joints + rot_data = cont_6d_params[:, 1:].reshape(len(cont_6d_params), -1) + + '''Get Joint Rotation Invariant Position Represention''' + # (seq_len, (joints_num-1)*3) local joint position + ric_data = positions[:, 1:].reshape(len(positions), -1) + + '''Get Joint Velocity Representation''' + # (seq_len-1, joints_num*3) + local_vel = qrot_np(np.repeat(r_rot[:-1, None], global_positions.shape[1], axis=1), + global_positions[1:] - global_positions[:-1]) + local_vel = local_vel.reshape(len(local_vel), -1) + + data = root_data + data = np.concatenate([data, ric_data[:-1]], axis=-1) + data = np.concatenate([data, rot_data[:-1]], axis=-1) + # print(data.shape, local_vel.shape) + data = np.concatenate([data, local_vel], axis=-1) + data = np.concatenate([data, feet_l, feet_r], axis=-1) + + return data + + +def process_file(positions, feet_thre): + # (seq_len, joints_num, 3) + # '''Down Sample''' + # positions = positions[::ds_num] + + '''Uniform Skeleton''' + positions = uniform_skeleton(positions, tgt_offsets) + + '''Put on Floor''' + floor_height = positions.min(axis=0).min(axis=0)[1] + positions[:, :, 1] -= floor_height + # print(floor_height) + + # plot_3d_motion("./positions_1.mp4", kinematic_chain, positions, 'title', fps=20) + + '''XZ at origin''' + root_pos_init = positions[0] + root_pose_init_xz = root_pos_init[0] * np.array([1, 0, 1]) + positions = positions - root_pose_init_xz + + # '''Move the first pose to origin ''' + # root_pos_init = positions[0] + # positions = positions - root_pos_init[0] + + '''All initially face Z+''' + r_hip, l_hip, sdr_r, sdr_l = face_joint_indx + across1 = root_pos_init[r_hip] - root_pos_init[l_hip] + across2 = root_pos_init[sdr_r] - root_pos_init[sdr_l] + across = across1 + across2 + across = across / np.sqrt((across ** 2).sum(axis=-1))[..., np.newaxis] + + # forward (3,), rotate around y-axis + forward_init = np.cross(np.array([[0, 1, 0]]), across, axis=-1) + # forward (3,) + forward_init = forward_init / np.sqrt((forward_init ** 2).sum(axis=-1))[..., np.newaxis] + + # print(forward_init) + + target = np.array([[0, 0, 1]]) + root_quat_init = qbetween_np(forward_init, target) + root_quat_init = np.ones(positions.shape[:-1] + (4,)) * root_quat_init + + positions_b = positions.copy() + + positions = qrot_np(root_quat_init, positions) + + # plot_3d_motion("./positions_2.mp4", kinematic_chain, positions, 'title', fps=20) + + '''New ground truth positions''' + global_positions = positions.copy() + + # plt.plot(positions_b[:, 0, 0], positions_b[:, 0, 2], marker='*') + # plt.plot(positions[:, 0, 0], positions[:, 0, 2], marker='o', color='r') + # plt.xlabel('x') + # plt.ylabel('z') + # plt.axis('equal') + # plt.show() + + """ Get Foot Contacts """ + + def foot_detect(positions, thres): + velfactor, heightfactor = np.array([thres, thres]), np.array([3.0, 2.0]) + + feet_l_x = (positions[1:, fid_l, 0] - positions[:-1, fid_l, 0]) ** 2 + feet_l_y = (positions[1:, fid_l, 1] - positions[:-1, fid_l, 1]) ** 2 + feet_l_z = (positions[1:, fid_l, 2] - positions[:-1, fid_l, 2]) ** 2 + # feet_l_h = positions[:-1,fid_l,1] + # feet_l = (((feet_l_x + feet_l_y + feet_l_z) < velfactor) & (feet_l_h < heightfactor)).astype(np.float) + feet_l = ((feet_l_x + feet_l_y + feet_l_z) < velfactor).astype(np.float) + + feet_r_x = (positions[1:, fid_r, 0] - positions[:-1, fid_r, 0]) ** 2 + feet_r_y = (positions[1:, fid_r, 1] - positions[:-1, fid_r, 1]) ** 2 + feet_r_z = (positions[1:, fid_r, 2] - positions[:-1, fid_r, 2]) ** 2 + # feet_r_h = positions[:-1,fid_r,1] + # feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor) & (feet_r_h < heightfactor)).astype(np.float) + feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor)).astype(np.float) + return feet_l, feet_r + # + feet_l, feet_r = foot_detect(positions, feet_thre) + # feet_l, feet_r = foot_detect(positions, 0.002) + + '''Quaternion and Cartesian representation''' + r_rot = None + + def get_rifke(positions): + '''Local pose''' + positions[..., 0] -= positions[:, 0:1, 0] + positions[..., 2] -= positions[:, 0:1, 2] + '''All pose face Z+''' + positions = qrot_np(np.repeat(r_rot[:, None], positions.shape[1], axis=1), positions) + return positions + + def get_quaternion(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=False) + + '''Fix Quaternion Discontinuity''' + quat_params = qfix(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + quat_params[1:, 0] = r_velocity + # (seq_len, joints_num, 4) + return quat_params, r_velocity, velocity, r_rot + + def get_cont6d_params(positions): + skel = Skeleton(n_raw_offsets, kinematic_chain, "cpu") + # (seq_len, joints_num, 4) + quat_params = skel.inverse_kinematics_np(positions, face_joint_indx, smooth_forward=True) + + '''Quaternion to continuous 6D''' + cont_6d_params = quaternion_to_cont6d_np(quat_params) + # (seq_len, 4) + r_rot = quat_params[:, 0].copy() + # print(r_rot[0]) + '''Root Linear Velocity''' + # (seq_len - 1, 3) + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + # print(r_rot.shape, velocity.shape) + velocity = qrot_np(r_rot[1:], velocity) + '''Root Angular Velocity''' + # (seq_len - 1, 4) + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + # (seq_len, joints_num, 4) + return cont_6d_params, r_velocity, velocity, r_rot + + cont_6d_params, r_velocity, velocity, r_rot = get_cont6d_params(positions) + positions = get_rifke(positions) + + # trejec = np.cumsum(np.concatenate([np.array([[0, 0, 0]]), velocity], axis=0), axis=0) + # r_rotations, r_pos = recover_ric_glo_np(r_velocity, velocity[:, [0, 2]]) + + # plt.plot(positions_b[:, 0, 0], positions_b[:, 0, 2], marker='*') + # plt.plot(ground_positions[:, 0, 0], ground_positions[:, 0, 2], marker='o', color='r') + # plt.plot(trejec[:, 0], trejec[:, 2], marker='^', color='g') + # plt.plot(r_pos[:, 0], r_pos[:, 2], marker='s', color='y') + # plt.xlabel('x') + # plt.ylabel('z') + # plt.axis('equal') + # plt.show() + + '''Root height''' + root_y = positions[:, 0, 1:2] + + '''Root rotation and linear velocity''' + # (seq_len-1, 1) rotation velocity along y-axis + # (seq_len-1, 2) linear velovity on xz plane + r_velocity = np.arcsin(r_velocity[:, 2:3]) + l_velocity = velocity[:, [0, 2]] + # print(r_velocity.shape, l_velocity.shape, root_y.shape) + root_data = np.concatenate([r_velocity, l_velocity, root_y[:-1]], axis=-1) + + '''Get Joint Rotation Representation''' + # (seq_len, (joints_num-1) *6) quaternion for skeleton joints + rot_data = cont_6d_params[:, 1:].reshape(len(cont_6d_params), -1) + + '''Get Joint Rotation Invariant Position Represention''' + # (seq_len, (joints_num-1)*3) local joint position + ric_data = positions[:, 1:].reshape(len(positions), -1) + + '''Get Joint Velocity Representation''' + # (seq_len-1, joints_num*3) + local_vel = qrot_np(np.repeat(r_rot[:-1, None], global_positions.shape[1], axis=1), + global_positions[1:] - global_positions[:-1]) + local_vel = local_vel.reshape(len(local_vel), -1) + + data = root_data + data = np.concatenate([data, ric_data[:-1]], axis=-1) + data = np.concatenate([data, rot_data[:-1]], axis=-1) + # print(data.shape, local_vel.shape) + data = np.concatenate([data, local_vel], axis=-1) + data = np.concatenate([data, feet_l, feet_r], axis=-1) + + return data, global_positions, positions, l_velocity + + +# Recover global angle and positions for rotation data +# root_rot_velocity (B, seq_len, 1) +# root_linear_velocity (B, seq_len, 2) +# root_y (B, seq_len, 1) +# ric_data (B, seq_len, (joint_num - 1)*3) +# rot_data (B, seq_len, (joint_num - 1)*6) +# local_velocity (B, seq_len, joint_num*3) +# foot contact (B, seq_len, 4) +def recover_root_rot_pos(data): + rot_vel = data[..., 0] + r_rot_ang = torch.zeros_like(rot_vel).to(data.device) + '''Get Y-axis rotation from rotation velocity''' + r_rot_ang[..., 1:] = rot_vel[..., :-1] + r_rot_ang = torch.cumsum(r_rot_ang, dim=-1) + + r_rot_quat = torch.zeros(data.shape[:-1] + (4,)).to(data.device) + r_rot_quat[..., 0] = torch.cos(r_rot_ang) + r_rot_quat[..., 2] = torch.sin(r_rot_ang) + + r_pos = torch.zeros(data.shape[:-1] + (3,)).to(data.device) + r_pos[..., 1:, [0, 2]] = data[..., :-1, 1:3] + '''Add Y-axis rotation to root position''' + r_pos = qrot(qinv(r_rot_quat), r_pos) + + r_pos = torch.cumsum(r_pos, dim=-2) + + r_pos[..., 1] = data[..., 3] + return r_rot_quat, r_pos + + +def recover_from_rot(data, joints_num, skeleton): + r_rot_quat, r_pos = recover_root_rot_pos(data) + + r_rot_cont6d = quaternion_to_cont6d(r_rot_quat) + + start_indx = 1 + 2 + 1 + (joints_num - 1) * 3 + end_indx = start_indx + (joints_num - 1) * 6 + cont6d_params = data[..., start_indx:end_indx] + # print(r_rot_cont6d.shape, cont6d_params.shape, r_pos.shape) + cont6d_params = torch.cat([r_rot_cont6d, cont6d_params], dim=-1) + cont6d_params = cont6d_params.view(-1, joints_num, 6) + + positions = skeleton.forward_kinematics_cont6d(cont6d_params, r_pos) + + return positions + + +def recover_from_ric(data, joints_num): + r_rot_quat, r_pos = recover_root_rot_pos(data) + positions = data[..., 4:(joints_num - 1) * 3 + 4] + positions = positions.view(positions.shape[:-1] + (-1, 3)) + + '''Add Y-axis rotation to local joints''' + positions = qrot(qinv(r_rot_quat[..., None, :]).expand(positions.shape[:-1] + (4,)), positions) + + '''Add root XZ to joints''' + positions[..., 0] += r_pos[..., 0:1] + positions[..., 2] += r_pos[..., 2:3] + + '''Concate root and joints''' + positions = torch.cat([r_pos.unsqueeze(-2), positions], dim=-2) + + return positions +''' +For Text2Motion Dataset +''' +''' +if __name__ == "__main__": + example_id = "000021" + # Lower legs + l_idx1, l_idx2 = 5, 8 + # Right/Left foot + fid_r, fid_l = [8, 11], [7, 10] + # Face direction, r_hip, l_hip, sdr_r, sdr_l + face_joint_indx = [2, 1, 17, 16] + # l_hip, r_hip + r_hip, l_hip = 2, 1 + joints_num = 22 + # ds_num = 8 + data_dir = '../dataset/pose_data_raw/joints/' + save_dir1 = '../dataset/pose_data_raw/new_joints/' + save_dir2 = '../dataset/pose_data_raw/new_joint_vecs/' + + n_raw_offsets = torch.from_numpy(t2m_raw_offsets) + kinematic_chain = t2m_kinematic_chain + + # Get offsets of target skeleton + example_data = np.load(os.path.join(data_dir, example_id + '.npy')) + example_data = example_data.reshape(len(example_data), -1, 3) + example_data = torch.from_numpy(example_data) + tgt_skel = Skeleton(n_raw_offsets, kinematic_chain, 'cpu') + # (joints_num, 3) + tgt_offsets = tgt_skel.get_offsets_joints(example_data[0]) + # print(tgt_offsets) + + source_list = os.listdir(data_dir) + frame_num = 0 + for source_file in tqdm(source_list): + source_data = np.load(os.path.join(data_dir, source_file))[:, :joints_num] + try: + data, ground_positions, positions, l_velocity = process_file(source_data, 0.002) + rec_ric_data = recover_from_ric(torch.from_numpy(data).unsqueeze(0).float(), joints_num) + np.save(pjoin(save_dir1, source_file), rec_ric_data.squeeze().numpy()) + np.save(pjoin(save_dir2, source_file), data) + frame_num += data.shape[0] + except Exception as e: + print(source_file) + print(e) + + print('Total clips: %d, Frames: %d, Duration: %fm' % + (len(source_list), frame_num, frame_num / 20 / 60)) +''' + +if __name__ == "__main__": + example_id = "03950_gt" + # Lower legs + l_idx1, l_idx2 = 17, 18 + # Right/Left foot + fid_r, fid_l = [14, 15], [19, 20] + # Face direction, r_hip, l_hip, sdr_r, sdr_l + face_joint_indx = [11, 16, 5, 8] + # l_hip, r_hip + r_hip, l_hip = 11, 16 + joints_num = 21 + # ds_num = 8 + data_dir = '../dataset/kit_mocap_dataset/joints/' + save_dir1 = '../dataset/kit_mocap_dataset/new_joints/' + save_dir2 = '../dataset/kit_mocap_dataset/new_joint_vecs/' + + n_raw_offsets = torch.from_numpy(kit_raw_offsets) + kinematic_chain = kit_kinematic_chain + + '''Get offsets of target skeleton''' + example_data = np.load(os.path.join(data_dir, example_id + '.npy')) + example_data = example_data.reshape(len(example_data), -1, 3) + example_data = torch.from_numpy(example_data) + tgt_skel = Skeleton(n_raw_offsets, kinematic_chain, 'cpu') + # (joints_num, 3) + tgt_offsets = tgt_skel.get_offsets_joints(example_data[0]) + # print(tgt_offsets) + + source_list = os.listdir(data_dir) + frame_num = 0 + '''Read source data''' + for source_file in tqdm(source_list): + source_data = np.load(os.path.join(data_dir, source_file))[:, :joints_num] + try: + name = ''.join(source_file[:-7].split('_')) + '.npy' + data, ground_positions, positions, l_velocity = process_file(source_data, 0.05) + rec_ric_data = recover_from_ric(torch.from_numpy(data).unsqueeze(0).float(), joints_num) + if np.isnan(rec_ric_data.numpy()).any(): + print(source_file) + continue + np.save(pjoin(save_dir1, name), rec_ric_data.squeeze().numpy()) + np.save(pjoin(save_dir2, name), data) + frame_num += data.shape[0] + except Exception as e: + print(source_file) + print(e) + + print('Total clips: %d, Frames: %d, Duration: %fm' % + (len(source_list), frame_num, frame_num / 12.5 / 60)) \ No newline at end of file diff --git a/src/momask-preenc/utils/paramUtil.py b/src/momask-preenc/utils/paramUtil.py new file mode 100644 index 0000000000000000000000000000000000000000..6e820ca930f919efa2855f4200d1af3659622922 --- /dev/null +++ b/src/momask-preenc/utils/paramUtil.py @@ -0,0 +1,63 @@ +import numpy as np + +# Define a kinematic tree for the skeletal struture +kit_kinematic_chain = [[0, 11, 12, 13, 14, 15], [0, 16, 17, 18, 19, 20], [0, 1, 2, 3, 4], [3, 5, 6, 7], [3, 8, 9, 10]] + +kit_raw_offsets = np.array( + [ + [0, 0, 0], + [0, 1, 0], + [0, 1, 0], + [0, 1, 0], + [0, 1, 0], + [1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [-1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [0, 0, 1], + [0, 0, 1], + [-1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [0, 0, 1], + [0, 0, 1] + ] +) + +t2m_raw_offsets = np.array([[0,0,0], + [1,0,0], + [-1,0,0], + [0,1,0], + [0,-1,0], + [0,-1,0], + [0,1,0], + [0,-1,0], + [0,-1,0], + [0,1,0], + [0,0,1], + [0,0,1], + [0,1,0], + [1,0,0], + [-1,0,0], + [0,0,1], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0]]) + +t2m_kinematic_chain = [[0, 2, 5, 8, 11], [0, 1, 4, 7, 10], [0, 3, 6, 9, 12, 15], [9, 14, 17, 19, 21], [9, 13, 16, 18, 20]] +t2m_left_hand_chain = [[20, 22, 23, 24], [20, 34, 35, 36], [20, 25, 26, 27], [20, 31, 32, 33], [20, 28, 29, 30]] +t2m_right_hand_chain = [[21, 43, 44, 45], [21, 46, 47, 48], [21, 40, 41, 42], [21, 37, 38, 39], [21, 49, 50, 51]] + + +kit_tgt_skel_id = '03950' + +t2m_tgt_skel_id = '000021' + diff --git a/src/momask-preenc/utils/plot_script.py b/src/momask-preenc/utils/plot_script.py new file mode 100644 index 0000000000000000000000000000000000000000..91b09d900740421b8db4332b3e0f029b39c115d5 --- /dev/null +++ b/src/momask-preenc/utils/plot_script.py @@ -0,0 +1,548 @@ +import math +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.animation import FuncAnimation, FFMpegFileWriter +from mpl_toolkits.mplot3d.art3d import Poly3DCollection +import mpl_toolkits.mplot3d.axes3d as p3 + + +COLORS = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0], + [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255], + [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] + + +def plot_2d_pose(pose, pose_tree, class_type, save_path=None, excluded_joints=None): + def init(): + plt.xlabel('x') + plt.ylabel('y') + plt.title(class_type) + + fig = plt.figure() + init() + data = np.array(pose, dtype=float) + + if excluded_joints is None: + plt.scatter(data[:, 0], data[:, 1], color='b', marker='h', s=15) + else: + plot_joints = [i for i in range(data.shape[1]) if i not in excluded_joints] + plt.scatter(data[plot_joints, 0], data[plot_joints, 1], color='b', marker='h', s=15) + + for idx1, idx2 in pose_tree: + plt.plot([data[idx1, 0], data[idx2, 0]], + [data[idx1, 1], data[idx2, 1]], color='r', linewidth=2.0) + + # update(1) + # plt.show() + # Writer = writers['ffmpeg'] + # writer = Writer(fps=15, metadata={}) + if save_path is not None: + plt.savefig(save_path) + plt.show() + plt.close() + + +def list_cut_average(ll, intervals): + if intervals == 1: + return ll + + bins = math.ceil(len(ll) * 1.0 / intervals) + ll_new = [] + for i in range(bins): + l_low = intervals * i + l_high = l_low + intervals + l_high = l_high if l_high < len(ll) else len(ll) + ll_new.append(np.mean(ll[l_low:l_high])) + return ll_new + + +# def draw_pose_from_cords(img_mat_size, pose_2d, kinematic_tree, radius=2): +# img = np.zeros(shape=img_mat_size + (3,), dtype=np.uint8) +# lw = 2 +# pose = pose_2d.astype(np.int32) +# for i, (idx1, idx2) in enumerate(kinematic_tree): +# cv2.line(img, (pose[idx1, 0], pose[idx1, 1]), (pose[idx2, 0], pose[idx2, 1]), (255, 255, 255), lw) +# +# for i, uv in enumerate(pose_2d): +# point = tuple(uv.astype(np.int32)) +# cv2.circle(img, point, radius, COLORS[i % len(COLORS)], -1) +# return img + +def plot_3d_pose_v2(savePath, kinematic_tree, joints, title=None): + figure = plt.figure() + # ax = plt.axes(xlim=(-1, 1), ylim=(-1, 1), zlim=(-1, 1), projection='3d') + ax = Axes3D(figure) +# ax.set_ylim(-1, 1) +# ax.set_xlim(-1, 1) +# ax.set_zlim(-1, 1) + if title is not None: + ax.set_title(title) + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + ax.view_init(elev=110, azim=90) + ax.scatter(joints[:, 0], joints[:, 1], joints[:, 2], color='black') + colors = ['red', 'magenta', 'black', 'magenta', 'black', 'green', 'blue'] + for chain, color in zip(kinematic_tree, colors): + ax.plot3D(joints[chain, 0], joints[chain, 1], joints[chain, 2], linewidth=2.0, color=color) +# ax.set_aspect(1) +# # plt.axis('off') +# ax.set_xticklabels([]) +# ax.set_yticklabels([]) +# ax.set_zticklabels([]) +# plt.savefig(savePath) + plt.show() + +def plot_3d_motion_v2(motion, kinematic_tree, save_path, interval=50, dataset=None, title=None): +# matplotlib.use('Agg') + + def init(): + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + ax.set_ylim(0, 800) + ax.set_xlim(0, 800) + ax.set_zlim(0, 5000) + # ax.set_ylim(-0.75, 0.75) + # ax.set_xlim(-0.75, 0.75) + # ax.set_zlim(-0.75, 0.75) + if title is not None: + ax.set_title(title) + + motion = motion.reshape(motion.shape[0], -1, 3) + fig = plt.figure() + # ax = fig.add_subplot(111, projection='3d') + ax = p3.Axes3D(fig) + init() + + data = np.array(motion, dtype=float) + colors = ['red', 'magenta', 'black', 'green', 'blue','red', 'magenta', 'black', 'green', 'blue'] + frame_number = data.shape[0] + # dim (frame, joints, xyz) + print(data.shape) + + def update(index): + ax.lines = [] + ax.collections = [] + ax.view_init(elev=110, azim=-90) + ax.scatter(motion[index, :, 0], motion[index, :, 1], motion[index, :, 2], color='black') + for chain, color in zip(kinematic_tree, colors): + ax.plot3D(motion[index, chain, 0], motion[index, chain, 1], motion[index, chain, 2], linewidth=2.0, color=color) +# ax.set_aspect('equal') +# plt.axis('off') +# ax.set_xticklabels([]) +# ax.set_yticklabels([]) +# ax.set_zticklabels([]) + + ani = FuncAnimation(fig, update, frames=frame_number, interval=interval, repeat=True, repeat_delay=50) + # update(1) + # plt.show() + # Writer = writers['ffmpeg'] + # writer = Writer(fps=15, metadata={}) + ani.save(save_path, writer='pillow') + plt.close() + + +# radius = 10*offsets +def plot_3d_motion_kit(save_path, kinematic_tree, joints, title, figsize=(5, 5), interval=100, radius=246 * 12): + matplotlib.use('Agg') + + title_sp = title.split(' ') + if len(title_sp) > 10: + title = '\n'.join([' '.join(title_sp[:10]), ' '.join(title_sp[10:])]) + def init(): + ax.set_xlim3d([-radius / 2, radius / 2]) + ax.set_ylim3d([-radius / 2, radius / 2]) + ax.set_zlim3d([0, radius]) + # print(title) + fig.suptitle(title) + ax.grid(b=False) + + def plot_xzPlane(minx, maxx, miny, minz, maxz): + ## Plot a plane XZ + verts = [ + [minx, miny, minz], + [minx, miny, maxz], + [maxx, miny, maxz], + [maxx, miny, minz] + ] + xz_plane = Poly3DCollection([verts]) + xz_plane.set_facecolor((0.5, 0.5, 0.5, 0.5)) + ax.add_collection3d(xz_plane) + + # return ax + + # (seq_len, joints_num, 3) + data = joints.reshape(len(joints), -1, 3) + fig = plt.figure(figsize=figsize) + ax = p3.Axes3D(fig) + init() + MINS = data.min(axis=0).min(axis=0) + MAXS = data.max(axis=0).max(axis=0) + colors = ['red', 'magenta', 'black', 'green', 'blue', 'red', 'magenta', 'black', 'green', 'blue'] + frame_number = data.shape[0] + # print(data.shape) + + height_offset = MINS[1] + data[:, :, 1] -= height_offset + trajec = data[:, 0, [0, 2]] + + # print(trajec.shape) + + def update(index): + # print(index) + ax.lines = [] + ax.collections = [] + ax.view_init(elev=110, azim=-90) + ax.dist = 7.5 + # ax = + plot_xzPlane(MINS[0], MAXS[0], 0, MINS[2], MAXS[2]) + ax.scatter(data[index, :, 0], data[index, :, 1], data[index, :, 2], color='black') + for chain, color in zip(kinematic_tree, colors): + ax.plot3D(data[index, chain, 0], data[index, chain, 1], data[index, chain, 2], linewidth=2.0, color=color) + # print(trajec[:index, 0].shape) + if index > 1: + ax.plot3D(trajec[:index, 0], np.zeros_like(trajec[:index, 0]), trajec[:index, 1], linewidth=1.0, + color='blue') + # ax = plot_xzPlane(ax, MINS[0], MAXS[0], 0, MINS[2], MAXS[2]) + + plt.axis('off') + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_zticklabels([]) + + ani = FuncAnimation(fig, update, frames=frame_number, interval=interval, repeat=True, repeat_delay=50) + + ani.save(save_path, writer='pillow') + plt.close() + +def plot_3d_motion_gt_pred(save_path, kinematic_tree, gt_joints, pred_joints, title, figsize=(10, 10), fps=120, radius=4): + matplotlib.use('Agg') + + title_sp = title.split(' ') + if len(title_sp) > 20: + title = '\n'.join([' '.join(title_sp[:10]), ' '.join(title_sp[10:20]), ' '.join(title_sp[20:])]) + elif len(title_sp) > 10: + title = '\n'.join([' '.join(title_sp[:10]), ' '.join(title_sp[10:])]) + + def init(): + for ax in axs: + ax.set_xlim3d([-radius / 2, radius / 2]) + ax.set_ylim3d([0, radius]) + ax.set_zlim3d([0, radius]) + fig.suptitle(title, fontsize=20) + ax.grid(b=False) + + def plot_xzPlane(minx, maxx, miny, minz, maxz, ax): + ## Plot a plane XZ + verts = [ + [minx, miny, minz], + [minx, miny, maxz], + [maxx, miny, maxz], + [maxx, miny, minz] + ] + xz_plane = Poly3DCollection([verts]) + xz_plane.set_facecolor((0.5, 0.5, 0.5, 0.5)) + ax.add_collection3d(xz_plane) + + # return ax + + def update(index): + for i, ax in enumerate(axs): + ax.lines = [] + ax.collections = [] + ax.view_init(elev=120, azim=-90) + ax.dist = 7.5 + + MINS = motions_min[i] + MAXS = motions_max[i] + trajec = motions_traj[i] + data = motions_data[i] + + plot_xzPlane(MINS[0] - trajec[index, 0], MAXS[0] - trajec[index, 0], 0, MINS[2] - trajec[index, 1], + MAXS[2] - trajec[index, 1], ax) + + if index > 1: + ax.plot3D(trajec[:index, 0] - trajec[index, 0], np.zeros_like(trajec[:index, 0]), + trajec[:index, 1] - trajec[index, 1], linewidth=1.0, + color='blue') + + for i, (chain, color) in enumerate(zip(kinematic_tree, colors)): + if i < 5: + linewidth = 4.0 + else: + linewidth = 2.0 + ax.plot3D(data[index, chain, 0], data[index, chain, 1], data[index, chain, 2], linewidth=linewidth, + color=color) + + plt.axis('off') + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_zticklabels([]) + + # (seq_len, joints_num, 3) + + motions_data = [] + motions_traj = [] + motions_min = [] + motions_max = [] + colors = ['red', 'blue', 'black', 'red', 'blue', + 'darkblue', 'darkblue', 'darkblue', 'darkblue', 'darkblue', + 'darkred', 'darkred', 'darkred', 'darkred', 'darkred'] + for i, joints in enumerate((gt_joints, pred_joints)): + data = joints.copy().reshape(len(joints), -1, 3) + frame_number = data.shape[0] + + MINS = data.min(axis=0).min(axis=0) + motions_min.append(MINS) + MAXS = data.max(axis=0).max(axis=0) + motions_max.append(MAXS) + height_offset = MINS[1] + + data[:, :, 1] -= height_offset + trajec = data[:, 0, [0, 2]] + motions_traj.append(trajec) + + data[..., 0] -= data[:, 0:1, 0] + data[..., 2] -= data[:, 0:1, 2] + motions_data.append(data) + + axs = [] + fig = plt.figure(figsize=(20,10)) + axs.append(fig.add_subplot(1, 2, 1, projection='3d')) + axs.append(fig.add_subplot(1, 2, 2, projection='3d')) + init() + + ani = FuncAnimation(fig, update, frames=frame_number, interval=1000 / fps, repeat=False) + + # writer = FFMpegFileWriter(fps=fps) + ani.save(save_path, fps=fps) + plt.close() + +def plot_3d_motion(save_path, kinematic_tree, joints, title, figsize=(10, 10), fps=120, radius=4): + matplotlib.use('Agg') + + title_sp = title.split(' ') + if len(title_sp) > 20: + title = '\n'.join([' '.join(title_sp[:10]), ' '.join(title_sp[10:20]), ' '.join(title_sp[20:])]) + elif len(title_sp) > 10: + title = '\n'.join([' '.join(title_sp[:10]), ' '.join(title_sp[10:])]) + + def init(): + ax.set_xlim3d([-radius / 2, radius / 2]) + ax.set_ylim3d([0, radius]) + ax.set_zlim3d([0, radius]) + # print(title) + fig.suptitle(title, fontsize=20) + ax.grid(b=False) + + def plot_xzPlane(minx, maxx, miny, minz, maxz): + ## Plot a plane XZ + verts = [ + [minx, miny, minz], + [minx, miny, maxz], + [maxx, miny, maxz], + [maxx, miny, minz] + ] + xz_plane = Poly3DCollection([verts]) + xz_plane.set_facecolor((0.5, 0.5, 0.5, 0.5)) + ax.add_collection3d(xz_plane) + + # return ax + + # (seq_len, joints_num, 3) + data = joints.copy().reshape(len(joints), -1, 3) + fig = plt.figure(figsize=figsize) + ax = p3.Axes3D(fig) + init() + MINS = data.min(axis=0).min(axis=0) + MAXS = data.max(axis=0).max(axis=0) + colors = ['red', 'blue', 'black', 'red', 'blue', + 'darkblue', 'darkblue', 'darkblue', 'darkblue', 'darkblue', + 'darkred', 'darkred', 'darkred', 'darkred', 'darkred'] + frame_number = data.shape[0] + # print(data.shape) + + height_offset = MINS[1] + data[:, :, 1] -= height_offset + trajec = data[:, 0, [0, 2]] + + data[..., 0] -= data[:, 0:1, 0] + data[..., 2] -= data[:, 0:1, 2] + + # print(trajec.shape) + + def update(index): + # print(index) + ax.lines = [] + ax.collections = [] + ax.view_init(elev=120, azim=-90) + ax.dist = 7.5 + # ax = + plot_xzPlane(MINS[0] - trajec[index, 0], MAXS[0] - trajec[index, 0], 0, MINS[2] - trajec[index, 1], + MAXS[2] - trajec[index, 1]) + # ax.scatter(data[index, :22, 0], data[index, :22, 1], data[index, :22, 2], color='black', s=3) + + if index > 1: + ax.plot3D(trajec[:index, 0] - trajec[index, 0], np.zeros_like(trajec[:index, 0]), + trajec[:index, 1] - trajec[index, 1], linewidth=1.0, + color='blue') + # ax = plot_xzPlane(ax, MINS[0], MAXS[0], 0, MINS[2], MAXS[2]) + + for i, (chain, color) in enumerate(zip(kinematic_tree, colors)): + # print(color) + if i < 5: + linewidth = 4.0 + else: + linewidth = 2.0 + ax.plot3D(data[index, chain, 0], data[index, chain, 1], data[index, chain, 2], linewidth=linewidth, + color=color) + # print(trajec[:index, 0].shape) + + plt.axis('off') + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_zticklabels([]) + + ani = FuncAnimation(fig, update, frames=frame_number, interval=1000 / fps, repeat=False) + + # writer = FFMpegFileWriter(fps=fps) + ani.save(save_path, fps=fps) + plt.close() + + +def plot_3d_motion_old(motion, pose_tree, class_type, save_path, interval=300, excluded_joints=None): + matplotlib.use('Agg') + + def init(): + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + ax.set_ylim(-0.75, 0.75) + ax.set_xlim(-0.75, 0.75) + ax.set_zlim(-0.75, 0.75) + # ax.set_ylim(-1.0, 0.2) + # ax.set_xlim(-0.2, 1.0) + # ax.set_zlim(-1.0, 0.4) + ax.set_title(class_type) + + fig = plt.figure() + # ax = fig.add_subplot(111, projection='3d') + ax = p3.Axes3D(fig) + init() + + data = np.array(motion, dtype=float) + frame_number = data.shape[0] + # dim (frame, joints, xyz) + print(data.shape) + + def update(index): + ax.lines = [] + ax.collections = [] + if excluded_joints is None: + ax.scatter(data[index, :, 0], data[index, :, 1], data[index, :, 2], color='b', marker='h', s=15) + else: + plot_joints = [i for i in range(data.shape[1]) if i not in excluded_joints] + ax.scatter(data[index, plot_joints, 0], data[index, plot_joints, 1], data[index, plot_joints, 2], color='b', marker='h', s=15) + + for idx1, idx2 in pose_tree: + ax.plot([data[index, idx1, 0], data[index, idx2, 0]], + [data[index, idx1, 1], data[index, idx2, 1]], [data[index, idx1, 2], data[index, idx2, 2]], color='r', linewidth=2.0) + + ani = FuncAnimation(fig, update, frames=frame_number, interval=interval, repeat=False, repeat_delay=200) + # update(1) + # plt.show() + # Writer = writers['ffmpeg'] + # writer = Writer(fps=15, metadata={}) + ani.save(save_path, writer='pillow') + plt.close() + + +def plot_2d_motion(motion, pose_tree, axis_0, axis_1, class_type, save_path, interval=300): + matplotlib.use('Agg') + + fig = plt.figure() + plt.title(class_type) + # ax = fig.add_subplot(111, projection='3d') + data = np.array(motion, dtype=float) + frame_number = data.shape[0] + # dim (frame, joints, xyz) + print(data.shape) + + def update(index): + plt.clf() + plt.xlim(-0.7, 0.7) + plt.ylim(-0.7, 0.7) + plt.scatter(data[index, :, axis_0], data[index, :, axis_1], color='b', marker='h', s=15) + for idx1, idx2 in pose_tree: + plt.plot([data[index, idx1, axis_0], data[index, idx2, axis_0]], + [data[index, idx1, axis_1], data[index, idx2, axis_1]], color='r', linewidth=2.0) + + ani = FuncAnimation(fig, update, frames=frame_number, interval=interval, repeat=False, repeat_delay=200) + # update(1) + # plt.show() + # Writer = writers['ffmpeg'] + # writer = Writer(fps=15, metadata={}) + ani.save(save_path, writer='pillow') + plt.close() + +def plot_3d_multi_motion(motion_list, kinematic_tree, save_path, interval=50, dataset=None): + matplotlib.use('Agg') + + def init(): + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_zlabel('z') + if dataset == "mocap": + ax.set_ylim(-1.5, 1.5) + ax.set_xlim(0, 3) + ax.set_zlim(-1.5, 1.5) + else: + ax.set_ylim(-1, 1) + ax.set_xlim(-1, 1) + ax.set_zlim(-1, 1) + # ax.set_ylim(-1.0, 0.2) + # ax.set_xlim(-0.2, 1.0) + # ax.set_zlim(-1.0, 0.4) + + fig = plt.figure() + # ax = fig.add_subplot(111, projection='3d') + ax = p3.Axes3D(fig) + init() + + colors = ['red', 'magenta', 'black', 'magenta', 'black', 'green', 'blue'] + frame_number = motion_list[0].shape[0] + # dim (frame, joints, xyz) + # print(data.shape) + print("Number of motions %d" % (len(motion_list))) + def update(index): + ax.lines = [] + ax.collections = [] + if dataset == "mocap": + ax.view_init(elev=110, azim=-90) + else: + ax.view_init(elev=110, azim=90) + for motion in motion_list: + for chain, color in zip(kinematic_tree, colors): + ax.plot3D(motion[index, chain, 0], motion[index, chain, 1], motion[index, chain, 2], + linewidth=4.0, color=color) + plt.axis('off') + +# ax.set_xticks([]) +# ax.set_yticks([]) + + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_zticklabels([]) + + ani = FuncAnimation(fig, update, frames=frame_number, interval=interval, repeat=False, repeat_delay=200) + # update(1) + # plt.show() + # Writer = writers['ffmpeg'] + # writer = Writer(fps=15, metadata={}) + ani.save(save_path, writer='pillow') + plt.close() + + + diff --git a/src/momask-preenc/utils/utils.py b/src/momask-preenc/utils/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..1883a8ef6dd8e78e460a0a5d44e3bfda7322c4a7 --- /dev/null +++ b/src/momask-preenc/utils/utils.py @@ -0,0 +1,171 @@ +import os +import numpy as np +# import cv2 +from PIL import Image +from utils import paramUtil +import math +import time +import matplotlib.pyplot as plt +# from scipy.ndimage import gaussian_filter + + +def mkdir(path): + if not os.path.exists(path): + os.makedirs(path) + +COLORS = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0], + [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255], + [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] + +MISSING_VALUE = -1 + +def save_image(image_numpy, image_path): + img_pil = Image.fromarray(image_numpy) + img_pil.save(image_path) + + +def save_logfile(log_loss, save_path): + with open(save_path, 'wt') as f: + for k, v in log_loss.items(): + w_line = k + for digit in v: + w_line += ' %.3f' % digit + f.write(w_line + '\n') + + +def print_current_loss(start_time, niter_state, total_niters, losses, epoch=None, sub_epoch=None, + inner_iter=None, tf_ratio=None, sl_steps=None): + + def as_minutes(s): + m = math.floor(s / 60) + s -= m * 60 + return '%dm %ds' % (m, s) + + def time_since(since, percent): + now = time.time() + s = now - since + es = s / percent + rs = es - s + return '%s (- %s)' % (as_minutes(s), as_minutes(rs)) + + if epoch is not None: + print('ep/it:%2d-%4d niter:%6d' % (epoch, inner_iter, niter_state), end=" ") + + message = ' %s completed:%3d%%)' % (time_since(start_time, niter_state / total_niters), niter_state / total_niters * 100) + # now = time.time() + # message += '%s'%(as_minutes(now - start_time)) + + + for k, v in losses.items(): + if k != 'lr': + message += ' %s: %.4f ' % (k, v) + else: + message += ' %s: %.6f ' % (k, v) + # message += ' sl_length:%2d tf_ratio:%.2f'%(sl_steps, tf_ratio) + print(message) + +def print_current_loss_decomp(start_time, niter_state, total_niters, losses, epoch=None, inner_iter=None): + + def as_minutes(s): + m = math.floor(s / 60) + s -= m * 60 + return '%dm %ds' % (m, s) + + def time_since(since, percent): + now = time.time() + s = now - since + es = s / percent + rs = es - s + return '%s (- %s)' % (as_minutes(s), as_minutes(rs)) + + print('epoch: %03d inner_iter: %5d' % (epoch, inner_iter), end=" ") + # now = time.time() + message = '%s niter: %07d completed: %3d%%)'%(time_since(start_time, niter_state / total_niters), niter_state, niter_state / total_niters * 100) + for k, v in losses.items(): + message += ' %s: %.4f ' % (k, v) + print(message) + + +def compose_gif_img_list(img_list, fp_out, duration): + img, *imgs = [Image.fromarray(np.array(image)) for image in img_list] + img.save(fp=fp_out, format='GIF', append_images=imgs, optimize=False, + save_all=True, loop=0, duration=duration) + + +def save_images(visuals, image_path): + if not os.path.exists(image_path): + os.makedirs(image_path) + + for i, (label, img_numpy) in enumerate(visuals.items()): + img_name = '%d_%s.jpg' % (i, label) + save_path = os.path.join(image_path, img_name) + save_image(img_numpy, save_path) + + +def save_images_test(visuals, image_path, from_name, to_name): + if not os.path.exists(image_path): + os.makedirs(image_path) + + for i, (label, img_numpy) in enumerate(visuals.items()): + img_name = "%s_%s_%s" % (from_name, to_name, label) + save_path = os.path.join(image_path, img_name) + save_image(img_numpy, save_path) + + +def compose_and_save_img(img_list, save_dir, img_name, col=4, row=1, img_size=(256, 200)): + # print(col, row) + compose_img = compose_image(img_list, col, row, img_size) + if not os.path.exists(save_dir): + os.makedirs(save_dir) + img_path = os.path.join(save_dir, img_name) + # print(img_path) + compose_img.save(img_path) + + +def compose_image(img_list, col, row, img_size): + to_image = Image.new('RGB', (col * img_size[0], row * img_size[1])) + for y in range(0, row): + for x in range(0, col): + from_img = Image.fromarray(img_list[y * col + x]) + # print((x * img_size[0], y*img_size[1], + # (x + 1) * img_size[0], (y + 1) * img_size[1])) + paste_area = (x * img_size[0], y*img_size[1], + (x + 1) * img_size[0], (y + 1) * img_size[1]) + to_image.paste(from_img, paste_area) + # to_image[y*img_size[1]:(y + 1) * img_size[1], x * img_size[0] :(x + 1) * img_size[0]] = from_img + return to_image + + +def plot_loss_curve(losses, save_path, intervals=500): + plt.figure(figsize=(10, 5)) + plt.title("Loss During Training") + for key in losses.keys(): + plt.plot(list_cut_average(losses[key], intervals), label=key) + plt.xlabel("Iterations/" + str(intervals)) + plt.ylabel("Loss") + plt.legend() + plt.savefig(save_path) + plt.show() + + +def list_cut_average(ll, intervals): + if intervals == 1: + return ll + + bins = math.ceil(len(ll) * 1.0 / intervals) + ll_new = [] + for i in range(bins): + l_low = intervals * i + l_high = l_low + intervals + l_high = l_high if l_high < len(ll) else len(ll) + ll_new.append(np.mean(ll[l_low:l_high])) + return ll_new + + +# def motion_temporal_filter(motion, sigma=1): +# motion = motion.reshape(motion.shape[0], -1) +# # print(motion.shape) +# for i in range(motion.shape[1]): +# motion[:, i] = gaussian_filter(motion[:, i], sigma=sigma, mode="nearest") +# return motion.reshape(motion.shape[0], -1, 3) + diff --git a/src/momask-preenc/utils/word_vectorizer.py b/src/momask-preenc/utils/word_vectorizer.py new file mode 100644 index 0000000000000000000000000000000000000000..557ff97a9539c084167f3eca51fb50f53f33c8ea --- /dev/null +++ b/src/momask-preenc/utils/word_vectorizer.py @@ -0,0 +1,99 @@ +import numpy as np +import pickle +from os.path import join as pjoin + +POS_enumerator = { + 'VERB': 0, + 'NOUN': 1, + 'DET': 2, + 'ADP': 3, + 'NUM': 4, + 'AUX': 5, + 'PRON': 6, + 'ADJ': 7, + 'ADV': 8, + 'Loc_VIP': 9, + 'Body_VIP': 10, + 'Obj_VIP': 11, + 'Act_VIP': 12, + 'Desc_VIP': 13, + 'OTHER': 14, +} + +Loc_list = ('left', 'right', 'clockwise', 'counterclockwise', 'anticlockwise', 'forward', 'back', 'backward', + 'up', 'down', 'straight', 'curve') + +Body_list = ('arm', 'chin', 'foot', 'feet', 'face', 'hand', 'mouth', 'leg', 'waist', 'eye', 'knee', 'shoulder', 'thigh') + +Obj_List = ('stair', 'dumbbell', 'chair', 'window', 'floor', 'car', 'ball', 'handrail', 'baseball', 'basketball') + +Act_list = ('walk', 'run', 'swing', 'pick', 'bring', 'kick', 'put', 'squat', 'throw', 'hop', 'dance', 'jump', 'turn', + 'stumble', 'dance', 'stop', 'sit', 'lift', 'lower', 'raise', 'wash', 'stand', 'kneel', 'stroll', + 'rub', 'bend', 'balance', 'flap', 'jog', 'shuffle', 'lean', 'rotate', 'spin', 'spread', 'climb') + +Desc_list = ('slowly', 'carefully', 'fast', 'careful', 'slow', 'quickly', 'happy', 'angry', 'sad', 'happily', + 'angrily', 'sadly') + +VIP_dict = { + 'Loc_VIP': Loc_list, + 'Body_VIP': Body_list, + 'Obj_VIP': Obj_List, + 'Act_VIP': Act_list, + 'Desc_VIP': Desc_list, +} + + +class WordVectorizer(object): + def __init__(self, meta_root, prefix): + vectors = np.load(pjoin(meta_root, '%s_data.npy'%prefix)) + words = pickle.load(open(pjoin(meta_root, '%s_words.pkl'%prefix), 'rb')) + self.word2idx = pickle.load(open(pjoin(meta_root, '%s_idx.pkl'%prefix), 'rb')) + self.word2vec = {w: vectors[self.word2idx[w]] for w in words} + + def _get_pos_ohot(self, pos): + pos_vec = np.zeros(len(POS_enumerator)) + if pos in POS_enumerator: + pos_vec[POS_enumerator[pos]] = 1 + else: + pos_vec[POS_enumerator['OTHER']] = 1 + return pos_vec + + def __len__(self): + return len(self.word2vec) + + def __getitem__(self, item): + word, pos = item.split('/') + if word in self.word2vec: + word_vec = self.word2vec[word] + vip_pos = None + for key, values in VIP_dict.items(): + if word in values: + vip_pos = key + break + if vip_pos is not None: + pos_vec = self._get_pos_ohot(vip_pos) + else: + pos_vec = self._get_pos_ohot(pos) + else: + word_vec = self.word2vec['unk'] + pos_vec = self._get_pos_ohot('OTHER') + return word_vec, pos_vec + + +class WordVectorizerV2(WordVectorizer): + def __init__(self, meta_root, prefix): + super(WordVectorizerV2, self).__init__(meta_root, prefix) + self.idx2word = {self.word2idx[w]: w for w in self.word2idx} + + def __getitem__(self, item): + word_vec, pose_vec = super(WordVectorizerV2, self).__getitem__(item) + word, pos = item.split('/') + if word in self.word2vec: + return word_vec, pose_vec, self.word2idx[word] + else: + return word_vec, pose_vec, self.word2idx['unk'] + + def itos(self, idx): + if idx == len(self.idx2word): + return "pad" + return self.idx2word[idx] \ No newline at end of file diff --git a/src/momask-preenc/visualization/.bvh b/src/momask-preenc/visualization/.bvh new file mode 100644 index 0000000000000000000000000000000000000000..b4d4a27110baa7a9a2c45d7b6f7eedbfffa9f6ec --- /dev/null +++ b/src/momask-preenc/visualization/.bvh @@ -0,0 +1,864 @@ +HIERARCHY +ROOT Pelvis +{ + OFFSET -0.179506 -22.333345 2.821913 + CHANNELS 6 Xposition Yposition Zposition Zrotation Yrotation Xrotation + JOINT Left_hip + { + OFFSET 6.951974 -9.140623 -0.681533 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_knee + { + OFFSET 3.427654 -37.519855 -0.449580 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_ankle + { + OFFSET -1.359570 -39.796059 -4.369333 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_foot + { + OFFSET 2.635814 -5.579078 11.928840 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT Right_hip + { + OFFSET -6.767048 -9.052170 -0.431982 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_knee + { + OFFSET -3.829005 -38.256897 -0.885003 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_ankle + { + OFFSET 1.577377 -39.841461 -4.231180 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_foot + { + OFFSET -2.537174 -4.814398 12.334795 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT Spine1 + { + OFFSET -0.253288 10.896323 -2.669631 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Spine2 + { + OFFSET 0.548704 13.518043 0.109247 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Spine3 + { + OFFSET 0.145701 5.292222 2.542457 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Neck + { + OFFSET -0.277840 21.387037 -4.285703 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Head + { + OFFSET 0.515184 6.496960 5.134897 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + JOINT Left_collar + { + OFFSET 7.884473 12.174932 -3.408961 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_shoulder + { + OFFSET 9.097692 3.046888 -0.886815 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_elbow + { + OFFSET 25.961220 -1.277207 -2.745643 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_wrist + { + OFFSET 24.923361 0.898606 -0.117091 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Left_palm + { + OFFSET 8.404213 -0.816156 -1.494537 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + } + JOINT Right_collar + { + OFFSET -8.175920 11.883285 -3.861528 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_shoulder + { + OFFSET -9.601238 3.255117 -0.914307 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_elbow + { + OFFSET -25.374195 -1.332924 -2.140099 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_wrist + { + OFFSET -25.529810 0.777228 -0.555919 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Right_palm + { + OFFSET -8.462191 -0.611722 -1.031508 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + } + } + } + } +} +MOTION +Frames: 720 +Frame Time: 0.016667 +-15.953562 158.261215 3.012963 -6.548568 2.583855 -18.484306 2.567626 -0.642801 -12.453255 -17.111603 3.336555 16.983561 -0.646515 0.385496 -0.056215 0.325094 -0.032605 0.189901 11.448563 8.871870 6.436031 21.109348 -6.065577 45.020580 -0.174829 0.026075 0.116341 0.072238 0.260225 0.053027 4.465475 2.398752 11.553416 -5.916316 5.109896 9.693657 -10.230002 5.977373 8.161955 -4.592945 0.456784 10.607079 11.999027 -6.871897 -9.583961 0.986580 11.602270 -6.802592 -10.811317 -2.869949 -1.570219 43.446667 -20.007170 -7.731044 0.092445 -0.321820 0.690197 -0.099926 -0.000055 0.179611 0.794326 -2.761873 -4.701620 6.150688 4.680287 -2.319729 -7.082062 6.923985 -0.347780 -0.400098 0.244321 -0.323698 0.385978 0.072713 -0.159744 +-16.108706 158.342819 3.003159 -6.436900 2.553235 -18.466497 2.628736 -0.640951 -12.167108 -17.277838 3.260565 16.452961 -0.623134 0.361270 -0.052679 0.329175 -0.021943 0.188075 11.625759 8.663714 6.621767 20.507597 -5.825788 44.947929 -0.176207 0.037369 0.118593 0.068431 0.250536 0.048086 4.242087 2.434052 12.115721 -6.077591 5.185571 9.527125 -10.338363 5.937043 7.690588 -4.605536 0.197104 10.837864 12.726488 -7.272390 -9.544734 1.642845 11.950652 -6.932811 -11.680576 -4.277152 -1.549070 43.571354 -20.612377 -8.049021 0.109730 -0.311815 0.682838 -0.110624 0.006377 0.183225 0.926398 -3.272447 -4.630198 7.445030 3.782560 -2.564028 -8.259988 8.206085 -0.503641 -0.385034 0.241649 -0.309882 0.376944 0.060723 -0.150942 +-16.289064 158.460114 2.898096 -6.337712 2.417876 -18.367199 2.387673 -0.769141 -11.783619 -16.808804 2.974704 15.581153 -0.597874 0.341984 -0.045163 0.336606 -0.010386 0.182390 11.895297 8.444583 6.677911 19.618019 -5.451431 44.845573 -0.181456 0.041560 0.120532 0.063814 0.249287 0.050308 4.130446 2.249803 12.813165 -6.341510 5.110845 9.366212 -10.591797 5.717437 7.166194 -4.550250 0.315001 10.694882 13.649382 -7.465281 -9.502808 2.140804 12.233712 -6.924524 -12.244494 -5.059723 -1.525820 43.379272 -21.237177 -8.295979 0.124976 -0.288952 0.674843 -0.118383 0.010494 0.193642 1.297063 -3.571788 -4.703934 8.010023 3.486611 -2.652901 -8.476348 8.605403 -0.545584 -0.372898 0.231243 -0.293915 0.365742 0.049422 -0.138878 +-16.564602 158.731995 2.726458 -6.002626 2.455181 -17.973370 1.834383 -0.983811 -11.526038 -15.971136 2.528754 14.111326 -0.602751 0.340437 -0.036803 0.336285 -0.008456 0.180600 11.654990 8.101241 6.587115 18.879175 -5.168495 44.240204 -0.184101 0.051312 0.135291 0.064663 0.260571 0.042015 3.051892 2.191581 13.253531 -6.533848 4.771447 9.180534 -10.291628 5.312028 6.718891 -4.273476 0.849475 10.492126 14.207470 -6.976998 -9.746916 2.845061 11.944734 -6.652175 -13.332726 -5.224829 -1.703026 43.879097 -20.990297 -8.364495 0.124505 -0.311719 0.688117 -0.116233 0.012790 0.202472 1.603163 -3.485494 -4.864434 8.750508 3.673903 -2.785898 -8.287816 8.146102 -0.511701 -0.381603 0.246283 -0.306233 0.384884 0.045592 -0.141288 +-16.712265 159.061188 2.544503 -6.138146 2.120839 -17.193476 1.495634 -1.153967 -11.531704 -14.562866 2.010199 12.596170 -0.564200 0.317475 -0.030186 0.355434 0.019825 0.183202 11.821760 7.832906 6.029297 17.854931 -4.734118 43.749580 -0.192897 0.046537 0.137743 0.063975 0.252156 0.061209 2.591154 2.105130 12.956139 -6.259222 4.452549 8.945457 -9.745981 4.985147 6.536089 -4.571469 1.506478 10.368932 14.273899 -6.712031 -9.471840 3.448703 11.540046 -6.184101 -15.225222 -5.342481 -1.930704 43.757050 -21.041569 -8.442200 0.134142 -0.275313 0.666342 -0.116295 0.025142 0.214703 1.627102 -3.484644 -5.032462 9.050708 4.006345 -2.802380 -8.178758 7.832633 -0.502845 -0.366619 0.222956 -0.270694 0.358248 0.025778 -0.124002 +-16.738913 159.395050 2.409832 -6.371427 1.715281 -16.212042 1.344112 -1.182214 -11.552453 -13.644547 1.596031 10.760131 -0.553557 0.301520 -0.029561 0.378947 0.055993 0.190589 11.912018 7.518050 5.477684 17.113008 -4.432878 43.021950 -0.200891 0.036620 0.141589 0.080178 0.245286 0.068790 2.655632 1.979555 12.242448 -6.059598 4.245433 8.709062 -9.529772 4.797668 6.568608 -4.468900 1.918368 10.300252 13.968842 -6.223287 -9.409180 3.466537 11.571606 -6.341009 -16.185760 -6.324979 -1.868305 43.140266 -21.341555 -8.512464 0.137919 -0.253948 0.652056 -0.111901 0.031955 0.226485 1.538267 -4.164848 -5.698076 9.921809 4.595060 -2.894332 -8.263926 7.278342 -0.511822 -0.369502 0.201231 -0.253245 0.348287 0.008170 -0.117610 +-16.776548 159.748032 2.157786 -6.428220 0.974121 -15.499296 0.936812 -1.201844 -11.313258 -12.177716 1.160200 8.771048 -0.541815 0.290366 -0.027408 0.385098 0.072718 0.195796 11.659352 7.261486 5.164932 16.596523 -4.206794 42.218369 -0.209730 0.039482 0.143880 0.082221 0.241970 0.075982 2.573596 1.944514 12.080869 -5.894100 4.092123 8.473337 -9.288622 4.620084 6.356588 -4.217100 2.342363 10.327727 13.891860 -5.639298 -9.494050 3.559528 11.211238 -6.158870 -16.793213 -6.551462 -1.894842 42.277451 -21.691759 -8.545035 0.136256 -0.254222 0.648655 -0.109668 0.045148 0.229905 1.508747 -4.268039 -5.966607 10.860933 4.783715 -3.082765 -8.835072 6.579336 -0.500989 -0.366672 0.202077 -0.242371 0.346106 -0.000085 -0.113156 +-16.773758 159.985733 1.840756 -6.892040 -0.265036 -14.707372 1.328187 -0.964429 -11.259574 -11.177370 0.888995 6.940612 -0.568827 0.312146 -0.017006 0.384319 0.065389 0.219003 11.855839 7.198880 4.539358 16.104712 -3.967600 41.788979 -0.207010 0.039457 0.152789 0.090576 0.252497 0.064945 2.552962 2.114229 11.497072 -5.267292 4.029208 8.392828 -8.548087 4.680492 6.497765 -3.776544 2.099114 10.020322 12.838959 -5.162495 -9.682754 2.628662 11.070118 -6.654572 -17.138351 -7.377963 -1.785861 42.147392 -22.057623 -8.732569 0.117987 -0.294817 0.657766 -0.096000 0.038727 0.228189 1.382665 -4.553769 -6.347175 11.398166 5.195314 -3.140609 -8.480102 5.291673 -0.409761 -0.384078 0.213121 -0.268936 0.375780 -0.002055 -0.129671 +-16.773798 160.242065 1.385337 -7.016428 -1.505329 -14.080323 1.266081 -0.892498 -11.216756 -9.875610 0.647913 5.458475 -0.596244 0.324718 -0.036018 0.380901 0.056116 0.246956 11.449362 7.158514 3.991309 15.985287 -3.963041 41.578953 -0.208718 0.038813 0.142284 0.092089 0.233258 0.069335 2.184994 2.446226 11.041884 -4.768640 4.030961 8.394737 -7.787795 4.783552 6.747200 -2.993406 1.860639 10.339728 11.743679 -4.358018 -9.782350 2.318040 10.238366 -6.903628 -17.624683 -8.450515 -1.814095 41.897972 -21.614748 -8.678004 0.099946 -0.314608 0.672528 -0.091236 0.046330 0.203243 0.738849 -4.534195 -6.355844 13.447996 5.103255 -3.444934 -9.040357 4.058734 -0.338981 -0.394386 0.223943 -0.279044 0.371005 0.006839 -0.155564 +-16.809313 160.425140 0.933804 -7.032182 -2.290404 -13.168996 0.963916 -0.950240 -11.661660 -8.774489 0.446624 4.215530 -0.591520 0.324756 -0.038110 0.405520 0.077245 0.283295 11.117752 6.917726 3.290086 15.538538 -3.851339 41.050232 -0.220738 0.015278 0.131980 0.102497 0.209776 0.094493 1.436988 2.649358 10.414960 -4.232882 3.861250 8.380134 -6.796241 4.627924 7.040365 -2.038058 1.271019 9.802289 10.280865 -3.758888 -9.653845 1.583092 9.638629 -7.427457 -17.063530 -9.797557 -1.697351 40.920959 -21.239902 -8.413903 0.092666 -0.282492 0.658618 -0.081128 0.057634 0.202768 0.736511 -4.848399 -6.580435 14.807322 5.148545 -3.579633 -9.770852 4.246374 -0.421145 -0.396556 0.186414 -0.259444 0.338819 -0.013721 -0.165114 +-16.789700 160.592651 0.367741 -7.171580 -3.178783 -12.647384 0.967041 -0.922395 -11.908892 -7.793193 0.286271 3.119777 -0.577536 0.297129 -0.039632 0.452639 0.135876 0.330994 10.758710 6.621087 2.877956 15.536983 -3.949389 40.555130 -0.244916 0.003562 0.132633 0.125324 0.175011 0.115623 1.386160 2.668587 9.904191 -3.783525 3.787306 8.664775 -6.183028 4.540397 7.717748 -1.120352 1.032352 9.925644 8.940594 -2.772691 -9.750923 0.745054 8.419509 -7.993518 -16.237057 -11.405189 -1.721316 39.923317 -20.612867 -8.124463 0.100576 -0.256890 0.647661 -0.077922 0.087036 0.213942 0.813248 -4.988221 -6.677959 16.553080 5.027795 -3.795870 -11.128160 5.261421 -0.631432 -0.398122 0.151377 -0.228331 0.311798 -0.055161 -0.170009 +-16.741749 160.729294 -0.316900 -7.558708 -4.539864 -12.112906 1.386975 -0.769382 -12.272948 -6.737583 0.165605 2.225166 -0.576300 0.265689 -0.056850 0.509184 0.216077 0.371496 11.096457 6.453204 2.496656 14.883972 -3.657289 40.090054 -0.270425 -0.000597 0.123822 0.166345 0.140374 0.129843 1.571359 2.641582 9.193312 -3.330585 3.747882 9.214892 -5.608980 4.529363 8.885200 -0.731368 1.462196 9.633437 8.470182 -1.802790 -10.920446 0.051031 7.202787 -8.527828 -15.546686 -12.708365 -1.861073 39.913399 -20.185949 -8.141868 0.112741 -0.227957 0.639310 -0.085768 0.116664 0.220135 2.036472 -4.811833 -7.356366 16.969507 5.912110 -3.819465 -11.867729 5.299818 -0.755479 -0.403036 0.124151 -0.197492 0.296620 -0.087526 -0.170286 +-16.553652 160.764511 -1.042054 -7.925178 -5.998769 -11.598991 1.845736 -0.696072 -12.929962 -5.726211 0.092250 2.030888 -0.569470 0.269086 -0.064483 0.529535 0.244756 0.386711 11.167949 6.396535 1.932726 14.707852 -3.614619 39.896099 -0.281741 -0.023981 0.115069 0.179399 0.131774 0.161120 1.726923 2.839438 8.667390 -2.650086 3.818988 9.649557 -4.748201 4.631983 9.787368 -0.131880 1.360343 9.359412 7.636412 -1.246999 -11.012045 -1.206931 5.552031 -9.087198 -14.850809 -14.288842 -1.986183 40.316353 -20.254745 -8.431984 0.094950 -0.196905 0.620114 -0.070309 0.128415 0.221138 3.140409 -4.329516 -7.363596 16.994743 6.043010 -3.810810 -12.448504 6.366045 -0.970701 -0.409567 0.097504 -0.171583 0.272599 -0.095192 -0.167232 +-16.352150 160.888748 -1.785974 -8.061885 -7.845345 -11.192497 2.414356 -0.553609 -13.384150 -4.966199 0.047758 1.862995 -0.564971 0.259399 -0.069010 0.559372 0.295034 0.402097 10.879979 6.500432 1.349209 14.677989 -3.608514 39.977642 -0.297743 -0.033641 0.114398 0.203599 0.126196 0.178321 2.030623 3.112092 8.190439 -2.180508 4.059436 10.116151 -4.206339 4.850182 10.759787 0.209076 1.335603 9.352204 7.140994 -0.794189 -11.571316 -2.253699 3.974662 -9.873274 -14.183203 -16.453354 -2.139265 40.883957 -20.160650 -8.718738 0.085774 -0.183659 0.604347 -0.061338 0.144865 0.229600 4.736768 -3.786916 -7.713704 17.506262 6.563680 -3.926220 -13.609794 7.310733 -1.246494 -0.419190 0.083070 -0.148184 0.271298 -0.108919 -0.158972 +-16.086176 160.952591 -2.683252 -8.046998 -9.908904 -10.881722 3.178403 -0.502334 -14.330916 -4.741286 0.060714 2.819452 -0.555648 0.238704 -0.085571 0.582981 0.340153 0.427670 10.591507 6.828996 0.462272 14.245204 -3.450773 40.673283 -0.309660 -0.039848 0.105944 0.222041 0.096309 0.195670 2.300500 3.250377 8.068968 -1.867627 4.212889 10.539503 -3.831827 4.921741 11.586883 0.605016 1.225105 9.274499 5.971914 -0.082918 -12.144478 -3.228095 2.257882 -10.338022 -12.876457 -17.771721 -2.434823 41.225170 -19.998362 -8.844715 0.078872 -0.166713 0.585088 -0.057407 0.167470 0.220838 5.875173 -2.771969 -7.843284 18.682720 7.382069 -4.064976 -14.685915 9.481850 -1.764936 -0.417760 0.068578 -0.117976 0.250361 -0.122834 -0.158966 +-15.819700 160.804840 -3.482929 -7.975517 -12.322988 -10.388718 4.410126 -0.496662 -16.022293 -5.157393 0.167969 5.244440 -0.579617 0.243325 -0.095244 0.608477 0.373700 0.450725 10.490107 7.335312 -0.667436 13.604923 -3.189647 41.799717 -0.313874 -0.043234 0.106417 0.251317 0.093546 0.192373 2.630287 3.390921 7.611517 -1.650590 4.381994 10.853812 -3.557493 5.043419 12.445291 0.630615 1.692654 9.087181 5.536309 0.514806 -12.791163 -3.279937 1.171122 -10.690102 -12.859802 -19.157557 -2.569380 41.454315 -19.932009 -9.059175 0.069723 -0.175345 0.584963 -0.051675 0.169156 0.220703 6.833838 -1.895792 -8.632036 19.644712 9.359219 -4.074486 -15.135581 9.993315 -2.034602 -0.435857 0.065232 -0.122267 0.265944 -0.129340 -0.167343 +-15.525534 160.693253 -4.243557 -7.904150 -14.910521 -9.976284 6.132611 -0.396099 -17.974174 -6.482966 0.442776 8.747579 -0.607337 0.263478 -0.093182 0.624604 0.389966 0.463768 10.625152 7.725592 -1.360209 12.235993 -2.568690 42.515491 -0.318295 -0.057561 0.101954 0.279279 0.105677 0.188364 3.059854 3.420854 7.726108 -1.554179 4.566720 10.980680 -3.558352 5.161422 12.777025 0.538786 2.560840 8.562731 5.153638 1.251932 -13.002645 -3.437396 0.448450 -11.197196 -12.642103 -20.749588 -2.599976 41.375114 -19.952688 -9.183331 0.061028 -0.179509 0.588692 -0.042495 0.163473 0.231345 8.093701 -1.192280 -9.645938 20.499111 11.572705 -4.045588 -15.529764 10.370626 -2.277901 -0.452976 0.052024 -0.142714 0.285838 -0.135389 -0.174425 +-15.208327 160.648315 -5.178411 -7.567080 -17.146141 -10.049934 8.152706 -0.344608 -20.190386 -8.707283 1.042604 13.983326 -0.615083 0.277083 -0.103284 0.639628 0.414488 0.466801 10.462480 7.969729 -1.951233 11.097867 -2.149283 43.216347 -0.323782 -0.070184 0.094681 0.297566 0.114381 0.205735 3.036006 3.326841 8.200000 -1.485536 4.555881 11.291413 -3.447955 5.101433 13.248490 0.252534 3.551512 8.317461 5.070338 1.925607 -13.335642 -3.601868 -0.670601 -11.612844 -12.342030 -22.204805 -2.806740 42.235493 -19.971783 -9.538338 0.040605 -0.167086 0.578094 -0.030262 0.165803 0.231062 9.817141 -0.125658 -10.633718 20.723526 13.895201 -3.950775 -15.358629 10.303440 -2.375078 -0.464874 0.044683 -0.132438 0.287497 -0.129146 -0.169719 +-14.876552 160.664368 -6.072125 -7.386243 -19.553471 -10.331503 10.622969 -0.118184 -22.140608 -11.675226 2.077783 19.915577 -0.634292 0.271717 -0.123380 0.676542 0.458746 0.491102 10.640180 8.157366 -2.223415 9.724277 -1.597904 43.703949 -0.343389 -0.068934 0.086461 0.325110 0.094941 0.217119 3.201195 3.166709 9.122756 -1.395641 4.617937 11.632595 -3.419672 5.162120 13.598430 -0.601054 4.760435 8.004275 4.673171 2.721645 -14.529936 -3.788130 -1.876887 -11.856270 -12.363192 -23.442291 -2.995182 43.647419 -21.224220 -10.523670 0.046908 -0.158676 0.591816 -0.040620 0.186445 0.232800 11.626849 0.905302 -11.395967 20.860348 15.695547 -3.925965 -15.010798 10.483617 -2.454436 -0.477184 0.041214 -0.122190 0.288444 -0.137025 -0.175816 +-14.380869 160.812134 -6.984997 -6.752759 -21.915737 -10.967949 12.350435 -0.150520 -23.741671 -14.259523 3.365441 25.961500 -0.678074 0.287212 -0.137323 0.690565 0.467266 0.517168 10.132088 8.252432 -2.336057 8.676771 -1.232475 44.009972 -0.347024 -0.061635 0.087100 0.345248 0.089695 0.206591 2.914943 3.179664 10.192928 -1.256652 4.672759 12.059586 -3.178120 5.233828 13.956268 -0.853625 5.446908 7.955490 4.222835 3.458758 -15.352881 -4.715968 -3.841550 -12.430705 -11.510841 -25.186232 -3.382696 44.712788 -21.933510 -11.247051 0.039736 -0.191908 0.619013 -0.042147 0.189061 0.224734 13.512440 2.369993 -11.666486 20.429726 17.129457 -3.930598 -14.336025 11.806147 -2.659317 -0.500018 0.058389 -0.146900 0.313396 -0.133684 -0.199465 +-13.789561 160.985413 -7.765205 -5.823012 -24.055769 -11.668018 13.779216 -0.294715 -25.182566 -16.967180 4.977308 31.880217 -0.714081 0.310344 -0.143757 0.693127 0.461524 0.529300 9.403065 8.282658 -2.397833 7.210505 -0.694751 44.228523 -0.354469 -0.063269 0.080190 0.356486 0.095099 0.204466 2.438852 3.261651 10.994482 -1.147426 4.692928 12.445843 -2.880855 5.274017 14.316557 -0.927538 6.005843 8.148997 3.969277 4.118996 -15.678823 -5.316980 -5.580879 -12.721301 -11.133784 -26.776617 -3.605953 45.565617 -24.253584 -12.633064 0.031767 -0.214452 0.645872 -0.041343 0.191638 0.222985 14.898627 3.831013 -11.785723 20.248457 18.586010 -3.900503 -13.525084 13.505468 -2.873523 -0.516495 0.068957 -0.173095 0.332979 -0.126529 -0.215806 +-13.086726 161.216568 -8.485121 -4.875965 -25.981440 -12.199566 15.083968 -0.514531 -26.784744 -19.957155 6.923659 37.548882 -0.696912 0.291710 -0.163743 0.726395 0.490140 0.574809 8.477742 8.146724 -2.492680 5.551526 -0.122520 43.949738 -0.380759 -0.072170 0.057762 0.357321 0.044334 0.242526 2.158102 3.111463 11.672981 -1.094743 4.592554 12.783085 -2.704907 5.140908 14.687515 -0.885196 6.413784 8.514328 2.674360 5.196745 -15.926392 -5.635658 -7.048832 -12.588388 -11.202438 -27.804913 -3.808431 46.915981 -27.456287 -14.557017 0.040479 -0.164475 0.645094 -0.051680 0.226000 0.213113 15.019759 5.338651 -11.741925 21.237589 20.218506 -3.618650 -12.086660 15.796215 -3.075075 -0.504326 0.037830 -0.132508 0.277114 -0.146613 -0.227494 +-12.456934 161.513885 -9.119720 -3.793108 -27.912590 -12.866165 16.083836 -0.745651 -27.852245 -22.382816 8.920979 42.601986 -0.718903 0.294819 -0.176465 0.746321 0.501490 0.619812 7.491395 7.949832 -2.409604 3.972824 0.429350 43.304806 -0.394515 -0.062772 0.052734 0.364812 0.020979 0.248542 1.629811 3.106494 12.275188 -1.131571 4.522753 13.153068 -2.561482 5.073355 15.087170 -0.799961 6.805485 8.702858 1.749366 6.156599 -16.791067 -5.698677 -8.449005 -12.665860 -11.313059 -29.085314 -3.926397 47.764103 -31.461718 -16.861189 0.037331 -0.182031 0.668726 -0.057050 0.244585 0.200352 15.449378 7.066398 -11.848394 22.377285 22.042166 -3.412206 -10.939917 17.745220 -3.241103 -0.512922 0.047209 -0.136056 0.277517 -0.154058 -0.251574 +-11.800477 161.971481 -9.755994 -2.591225 -29.314501 -13.581259 16.482523 -1.302634 -28.535030 -24.110374 10.683502 47.065063 -0.736296 0.261939 -0.213807 0.795541 0.563422 0.675948 6.338984 7.540351 -2.273709 2.772543 0.743658 42.251862 -0.422817 -0.045223 0.036012 0.396663 -0.039910 0.254975 0.778419 3.097676 12.655063 -1.149864 4.316111 13.703722 -2.193244 4.838350 15.886477 -0.761904 7.446394 9.015975 0.933794 7.305212 -18.504755 -5.104967 -10.050616 -12.855439 -12.143413 -30.883242 -4.121560 49.404926 -34.883862 -19.457796 0.056960 -0.174758 0.689441 -0.083203 0.286455 0.185384 15.945306 8.780711 -12.205355 23.646778 24.080421 -3.216335 -10.003852 20.238850 -3.506859 -0.516217 0.046552 -0.115759 0.261439 -0.175445 -0.273750 +-11.098733 162.471466 -10.325916 -1.339180 -31.126358 -13.841406 16.718086 -1.643628 -28.929125 -25.513557 12.321860 50.518543 -0.757916 0.253705 -0.245401 0.835283 0.611165 0.711364 5.128810 7.305420 -2.759619 1.290884 1.174620 41.272972 -0.452961 -0.043838 0.024794 0.418304 -0.071846 0.282597 0.033580 3.332775 12.349244 -1.225869 4.260793 14.080084 -1.894949 4.776854 16.723743 -0.553547 7.925304 9.409863 0.367788 8.212152 -20.010220 -3.718606 -11.724162 -12.963178 -13.988247 -33.032402 -3.971232 50.071518 -38.298206 -21.960804 0.056370 -0.167856 0.713036 -0.092219 0.323943 0.179229 15.872032 10.391656 -12.292434 25.809473 25.670246 -2.896585 -9.064837 22.811100 -3.769757 -0.532793 0.050022 -0.095163 0.250130 -0.181549 -0.286184 +-10.435786 162.991608 -10.710837 -0.340732 -33.205326 -13.578669 17.083504 -1.833149 -29.206976 -26.589983 13.897703 53.715229 -0.750196 0.241307 -0.253408 0.863857 0.651652 0.735837 4.311136 7.021362 -3.433456 -0.456643 1.696122 39.838036 -0.473439 -0.051012 0.014963 0.434047 -0.087968 0.303216 -0.223134 3.382552 11.446911 -1.400740 4.257839 14.186185 -1.932330 4.763020 17.431128 -0.462293 8.599119 10.001927 -0.113684 9.099281 -20.279131 -2.714864 -13.559663 -13.001805 -16.253441 -35.308578 -3.677524 50.599213 -40.458481 -23.806383 0.056001 -0.147974 0.707228 -0.091238 0.347422 0.183218 16.279284 11.652099 -12.259357 28.209742 26.976212 -2.448616 -7.462887 26.771383 -4.023708 -0.531461 0.033484 -0.071842 0.235322 -0.198041 -0.283387 +-9.826798 163.554047 -10.991090 0.095756 -34.932892 -12.928908 17.427895 -2.150764 -29.353802 -26.683149 14.960142 56.886841 -0.775600 0.247563 -0.266523 0.883510 0.678218 0.748740 3.784520 6.614614 -4.137233 -1.790574 1.957662 37.979965 -0.477766 -0.066562 0.013452 0.461028 -0.090299 0.304044 -0.407725 3.278637 10.209656 -1.420716 4.060065 14.271961 -1.720481 4.602381 18.262276 -0.373787 9.429996 10.366678 -0.548301 10.009103 -20.323969 -1.789331 -15.031480 -12.958756 -19.087252 -37.659576 -2.932446 52.041370 -43.372192 -26.582546 0.045365 -0.143714 0.707814 -0.080395 0.347199 0.186579 16.690390 12.616516 -12.644693 30.147425 28.905918 -1.605877 -4.369041 29.553823 -3.560164 -0.552401 0.020006 -0.078770 0.239218 -0.202314 -0.293935 +-9.188797 164.157013 -11.226430 0.575041 -36.718918 -12.161089 17.424295 -2.511493 -29.285671 -26.184809 15.767151 60.096672 -0.797658 0.267854 -0.271517 0.892794 0.684860 0.776970 3.201453 6.249115 -5.004308 -2.994241 2.138109 36.112057 -0.481794 -0.083401 0.002949 0.477859 -0.092093 0.310422 -0.648649 3.246926 8.861405 -1.392490 3.866477 14.333423 -1.413709 4.428638 19.104046 -0.103472 9.798611 10.709154 -1.598368 10.882658 -20.192261 -1.001857 -16.252991 -13.005049 -21.506372 -40.416660 -1.777879 51.999561 -46.621296 -28.735558 0.023997 -0.147788 0.705759 -0.064154 0.347950 0.181424 16.538864 13.521867 -13.129786 32.457268 31.055237 -0.443250 -1.188440 31.425295 -2.842073 -0.564919 0.006470 -0.089682 0.240732 -0.206360 -0.309598 +-8.547242 164.780991 -11.443678 1.149869 -38.550419 -11.313907 16.880774 -2.879326 -28.938185 -25.122160 16.001858 62.530167 -0.800713 0.277662 -0.269268 0.916811 0.714510 0.797108 2.501112 5.940675 -6.077391 -4.076771 2.259006 34.245506 -0.493576 -0.108549 0.004034 0.497184 -0.087258 0.332298 -0.720109 3.121574 7.480189 -1.547512 3.663750 14.362247 -1.480661 4.174148 19.906746 0.302679 10.420553 10.867702 -2.370678 11.809701 -20.080130 0.080329 -17.179731 -12.855272 -23.805977 -42.529972 -0.519510 52.495544 -50.011547 -31.235239 0.005652 -0.132177 0.693393 -0.041967 0.356078 0.195625 16.178818 14.208493 -13.697104 35.824646 33.236565 1.004251 1.353943 33.600208 -2.300271 -0.579396 -0.019572 -0.080469 0.234431 -0.222485 -0.309392 +-7.848021 165.301025 -11.619472 1.207361 -40.712685 -9.825318 16.680843 -2.806930 -28.324362 -24.440128 16.056738 63.384495 -0.809462 0.299104 -0.257650 0.937312 0.742363 0.820825 2.239747 5.904922 -7.614280 -4.972218 2.391983 32.895176 -0.493000 -0.150027 0.012597 0.524501 -0.069347 0.347535 -0.265043 2.983308 5.719175 -1.626428 3.519567 14.301897 -1.620521 3.922987 20.849640 0.737091 11.077666 10.400050 -3.793144 12.827089 -19.545074 1.880812 -17.590981 -12.729789 -26.810213 -44.778999 1.364611 51.941055 -52.983013 -32.928169 -0.031328 -0.121367 0.661322 0.001801 0.346610 0.211794 15.189126 14.529465 -14.530971 39.804871 35.688026 3.097610 3.818692 35.366108 -1.687046 -0.603707 -0.059245 -0.080730 0.234790 -0.242066 -0.312148 +-7.218434 165.737732 -11.819319 1.385782 -42.416286 -8.287569 16.030611 -2.871326 -27.688341 -23.520807 15.715948 63.505116 -0.816973 0.334522 -0.244307 0.918547 0.731033 0.812317 1.770311 5.845553 -9.166382 -5.213834 2.293669 31.509369 -0.465045 -0.197759 0.024919 0.536055 -0.029868 0.349608 -0.226790 2.996415 3.967878 -1.667355 3.354706 14.080020 -1.546612 3.628032 21.509533 1.374760 11.638236 9.989178 -4.807969 13.829537 -18.186932 3.542742 -17.832680 -12.688412 -30.009165 -47.536533 4.054867 49.613194 -55.754639 -33.152542 -0.088418 -0.114964 0.612616 0.060944 0.308567 0.215652 14.385589 14.381516 -15.278356 44.007767 37.964916 5.674764 6.515521 37.070274 -0.834909 -0.626331 -0.091569 -0.096701 0.237112 -0.237776 -0.313776 +-6.489751 166.176529 -12.054281 1.130265 -44.115372 -6.712142 15.345182 -2.838210 -26.461418 -22.331165 14.909662 62.758747 -0.841119 0.368879 -0.252606 0.925117 0.741987 0.825588 1.790442 5.890166 -10.511384 -5.616301 2.297547 30.119736 -0.455930 -0.249934 0.017280 0.560090 -0.013790 0.371284 0.169494 2.961426 2.498317 -1.640429 3.221840 14.007882 -1.540515 3.396683 22.322811 2.146389 12.141342 9.480089 -5.753473 14.751775 -17.673609 4.438820 -18.124252 -12.933593 -33.573544 -50.742359 7.278052 46.982243 -57.752182 -32.590134 -0.139609 -0.092477 0.581458 0.107911 0.289127 0.209973 13.425660 14.140767 -16.370064 47.970409 40.470715 8.781833 9.949854 38.282684 0.500140 -0.655403 -0.131579 -0.099691 0.222140 -0.234597 -0.324209 +-5.869152 166.619370 -12.287939 0.943071 -45.379837 -5.602497 14.113273 -2.820513 -24.223135 -20.786242 13.536302 60.696419 -0.859730 0.397450 -0.247367 0.932780 0.759700 0.837800 2.014765 5.937261 -11.284970 -6.085701 2.381442 28.709223 -0.454839 -0.281371 0.015891 0.588520 0.009324 0.379726 0.527073 2.901817 1.245380 -1.638134 3.063291 14.126240 -1.628127 3.101448 23.195272 2.950866 12.442166 9.319098 -6.279268 15.430611 -17.397217 5.542769 -18.514566 -13.119287 -36.356892 -53.352074 10.368772 44.535427 -59.931213 -32.017178 -0.176244 -0.095668 0.560239 0.143774 0.281906 0.220318 11.997142 14.337797 -17.430725 51.889919 42.790203 12.079476 13.062656 39.001709 1.774395 -0.677188 -0.153680 -0.112580 0.235886 -0.241941 -0.325845 +-5.330501 167.043243 -12.490552 0.990812 -45.974033 -4.750149 12.411217 -2.871249 -21.573986 -18.896820 11.765480 57.618347 -0.887348 0.422795 -0.257062 0.940096 0.778581 0.861149 1.785346 5.759792 -11.596251 -5.834585 2.168309 26.426180 -0.446658 -0.318423 0.009561 0.618595 0.014775 0.388418 0.441593 2.873629 -0.103128 -1.561562 2.784042 14.372162 -1.410620 2.633698 24.328606 3.489204 12.555588 8.856671 -7.603151 16.014280 -17.478388 7.586046 -18.413704 -13.385505 -40.309376 -55.989292 14.399580 42.882065 -62.046642 -31.940090 -0.222067 -0.095247 0.531140 0.183188 0.270392 0.210737 10.866857 14.158597 -18.542252 56.235340 44.844139 15.544897 15.105147 40.132389 2.681415 -0.703506 -0.179786 -0.119619 0.235530 -0.243374 -0.338900 +-4.806040 167.217438 -12.524003 1.067987 -46.165146 -3.752481 10.301759 -2.922394 -19.107533 -16.376680 9.702046 54.235184 -0.921379 0.473185 -0.256851 0.918703 0.760504 0.852552 1.150216 5.573877 -11.928140 -4.950298 1.803252 24.475002 -0.424977 -0.365920 0.012501 0.632206 0.051694 0.397874 0.642000 2.780384 -1.415163 -1.532778 2.485471 14.412150 -1.429190 2.160666 25.085745 3.981361 12.783957 8.131550 -8.602957 16.508448 -17.115501 9.339681 -18.554905 -13.560049 -44.180595 -58.379166 18.957266 40.880371 -64.374359 -31.448904 -0.286232 -0.103685 0.503654 0.238155 0.237844 0.203281 10.254326 13.675895 -19.172379 60.629196 46.249130 18.838848 15.949635 41.748264 3.152300 -0.739694 -0.196867 -0.143546 0.244974 -0.222852 -0.349205 +-4.390038 167.089661 -12.528413 1.001006 -45.875393 -2.444858 8.380536 -2.904169 -16.533070 -13.964335 7.628642 49.627232 -0.939751 0.546710 -0.238290 0.874880 0.705128 0.829222 0.590914 5.385997 -12.298265 -3.988642 1.445380 22.669090 -0.396043 -0.415146 0.015164 0.622019 0.114329 0.417053 0.537711 2.648932 -2.827901 -1.372797 2.059048 14.222775 -1.103769 1.555918 25.482716 4.664692 12.824980 7.398415 -9.081342 16.854027 -16.197807 11.205435 -18.278149 -13.618406 -49.798798 -60.747002 25.021957 39.232407 -65.726738 -30.701593 -0.363890 -0.110333 0.471449 0.301735 0.192670 0.195906 9.617601 12.529979 -19.236971 64.963943 47.001232 22.184855 17.124798 45.165901 4.042819 -0.767472 -0.210164 -0.170605 0.254291 -0.189595 -0.352268 +-3.883516 166.887329 -12.402857 -0.051792 -45.021545 -0.811618 6.972673 -2.898533 -13.583907 -11.232874 5.433945 44.436188 -0.947751 0.593338 -0.225656 0.858661 0.677015 0.822131 0.704947 5.046429 -11.901040 -3.123290 1.088188 20.078775 -0.379908 -0.453130 0.015702 0.619103 0.149058 0.435917 1.769720 2.184735 -4.041565 -1.098175 1.514576 14.195010 -1.159758 0.891981 26.017015 5.077238 12.591658 6.953607 -9.457038 16.804754 -15.542446 12.277021 -18.676941 -13.749967 -55.035603 -62.946720 31.018974 36.727680 -66.060059 -28.745161 -0.408735 -0.099008 0.446163 0.341721 0.164727 0.196604 8.671971 11.541602 -18.997971 68.022797 47.576248 24.943020 17.899282 49.754269 5.004252 -0.784801 -0.233018 -0.180115 0.250543 -0.176821 -0.352987 +-3.377771 166.582535 -12.285482 -1.644150 -45.003338 1.184331 6.261551 -2.294415 -9.887939 -8.866342 3.690083 37.367271 -0.964685 0.627722 -0.227996 0.859038 0.670105 0.837439 1.428151 4.887099 -11.612030 -2.767780 0.915274 17.491590 -0.377034 -0.487039 0.002939 0.627601 0.157720 0.458584 3.198275 1.851826 -5.349900 -0.718613 1.082784 14.195268 -1.134445 0.412229 26.654737 5.591552 12.342720 6.582157 -10.255214 16.826820 -15.509573 13.337549 -19.134537 -14.107331 -61.931351 -64.535240 37.758808 32.681770 -65.366150 -25.521833 -0.444237 -0.087423 0.430981 0.369992 0.155414 0.188677 6.535807 10.997141 -18.706129 70.987419 48.440365 28.019770 17.424387 54.716484 5.401154 -0.800673 -0.257395 -0.182369 0.238485 -0.171886 -0.361781 +-2.840847 166.107208 -12.187520 -3.386826 -44.952564 3.472615 5.986441 -1.822455 -6.303314 -6.960638 2.314524 29.584284 -1.021682 0.705801 -0.240431 0.824908 0.614910 0.856751 2.116085 4.837297 -11.882384 -2.382343 0.715351 15.446751 -0.354885 -0.537739 -0.014611 0.628387 0.178956 0.479975 4.597176 1.368080 -6.635199 -0.448872 0.443305 14.086830 -1.067970 -0.256211 27.268509 6.369960 12.367743 5.941165 -12.047565 17.573902 -15.524791 13.117796 -18.458702 -14.757030 -69.187172 -66.160110 45.245892 28.394566 -62.623966 -21.438742 -0.525574 -0.105639 0.423171 0.426595 0.124809 0.152334 5.044918 9.783927 -18.814711 75.794197 49.609234 32.938976 16.483166 57.893078 5.489139 -0.838915 -0.269500 -0.219826 0.231970 -0.137788 -0.400477 +-2.159992 165.633835 -12.135101 -5.287672 -44.062309 5.598478 5.934884 -1.503548 -3.159291 -4.732643 1.173690 22.743078 -1.046881 0.743444 -0.243968 0.817461 0.603384 0.873714 2.503117 4.763614 -12.120962 -1.031927 0.409366 13.689591 -0.344708 -0.573331 -0.031582 0.643150 0.189425 0.490796 5.780529 0.611710 -7.560449 0.075164 -0.464842 14.042303 -0.558760 -1.223659 27.760399 6.800697 12.390827 5.251103 -12.960823 17.841030 -15.378655 12.954215 -18.894741 -15.182395 -75.067116 -67.311241 51.108837 26.665586 -59.707905 -19.447872 -0.566331 -0.102286 0.404490 0.458931 0.108439 0.138467 3.816491 9.591886 -18.812263 76.916672 51.492241 36.605915 14.393044 61.566483 5.152966 -0.854445 -0.294575 -0.235665 0.225663 -0.131867 -0.414920 +-1.562871 165.351776 -12.183123 -6.413427 -43.556396 6.810956 5.758468 -1.113977 -0.148297 -2.971282 0.508582 16.795404 -1.093626 0.785855 -0.248032 0.819832 0.594512 0.902399 2.577854 4.773362 -12.325134 0.070174 0.216528 12.493884 -0.339645 -0.594409 -0.032351 0.662205 0.202237 0.492637 5.809247 -0.016117 -8.234126 0.608593 -1.360903 14.243618 0.220945 -2.177500 28.592331 7.149487 12.864558 4.956171 -13.939013 18.381048 -15.768514 13.005028 -19.239588 -15.432404 -79.147278 -68.317902 55.433243 27.881001 -57.690834 -19.729433 -0.602868 -0.130434 0.413066 0.487138 0.098011 0.132223 3.223720 9.842345 -18.926743 77.674423 54.088097 40.439648 8.925491 64.015701 2.446074 -0.885967 -0.297864 -0.267894 0.243982 -0.128780 -0.440763 +-0.951122 165.236237 -12.295166 -6.929716 -43.515507 7.495130 5.519564 -0.751940 2.094325 -2.186687 0.225381 12.160829 -1.099132 0.797103 -0.248010 0.833374 0.600344 0.919265 2.269024 4.885890 -12.946620 0.674467 0.160533 12.058118 -0.338613 -0.611228 -0.037628 0.672390 0.200799 0.500881 4.820080 -0.626984 -8.584022 1.205361 -2.215324 14.415998 1.435496 -3.089177 29.269243 7.063026 13.389710 5.056177 -14.251827 18.610365 -15.521502 12.593791 -19.622505 -15.151218 -81.647087 -68.300377 57.171257 29.932955 -57.071125 -21.068310 -0.609943 -0.114523 0.404766 0.496720 0.092287 0.133535 3.399432 10.797357 -18.948591 77.225815 57.010139 43.767872 3.393359 65.383881 -0.394404 -0.891226 -0.321322 -0.266715 0.232539 -0.137575 -0.446539 +-0.394605 165.331757 -12.381517 -6.885468 -44.663975 7.695644 5.187340 -0.291453 3.890344 -2.541987 0.223339 8.532451 -1.117140 0.801245 -0.267242 0.834591 0.594175 0.939182 1.802652 5.030499 -13.570665 0.711658 0.187010 11.936299 -0.346661 -0.600188 -0.049527 0.668507 0.178776 0.506545 3.192840 -0.801445 -8.758616 1.720175 -2.692236 14.665085 2.629276 -3.557991 29.969830 7.070270 13.811339 5.552103 -14.908219 18.893860 -16.259546 11.855654 -20.295658 -14.865569 -83.178001 -67.945152 57.457966 31.336916 -56.571087 -22.084843 -0.612736 -0.128142 0.425917 0.486676 0.106070 0.112974 3.816317 12.269733 -18.680784 76.948586 59.026657 45.520245 -1.865840 65.493958 -3.497915 -0.894533 -0.304211 -0.267270 0.228243 -0.126757 -0.464269 +0.176090 165.523270 -12.434559 -6.579142 -46.234596 8.046661 4.656163 0.081303 4.554468 -3.113094 0.278055 6.232237 -1.127210 0.823834 -0.263681 0.814377 0.578803 0.926491 1.274173 5.147223 -14.523710 0.477030 0.218763 11.626559 -0.341266 -0.602457 -0.036708 0.660191 0.204042 0.512253 1.746988 -0.730604 -8.866467 2.042861 -2.838937 14.719042 3.544269 -3.740258 30.349012 7.169073 13.989533 5.682276 -15.478142 19.064768 -16.509010 10.911860 -20.253353 -14.677760 -86.460815 -67.311989 59.288643 31.654510 -56.379906 -22.451283 -0.646311 -0.160174 0.423832 0.509498 0.101289 0.109684 4.626831 13.185744 -18.693058 78.480377 60.003563 47.908428 -2.020316 64.956230 -3.200493 -0.911410 -0.279415 -0.275454 0.251395 -0.106448 -0.463168 +0.933267 165.762054 -12.433804 -6.472995 -47.341961 8.576585 4.205546 0.213702 4.044258 -3.587841 0.330169 5.425428 -1.126349 0.809526 -0.264870 0.823958 0.597954 0.940228 0.849821 5.131092 -15.312308 0.103994 0.243861 11.041361 -0.350120 -0.585546 -0.033320 0.666741 0.193453 0.505179 1.429579 -0.797612 -8.716608 2.139693 -2.915079 14.693138 3.740379 -3.784433 30.401634 7.043937 14.150191 5.797968 -15.883853 19.073729 -17.120924 10.346807 -20.345032 -14.659486 -89.258263 -66.284660 60.292755 31.098484 -57.209187 -22.589682 -0.637520 -0.180510 0.429691 0.500505 0.117670 0.111454 4.761446 13.555538 -18.738310 80.210358 60.019650 49.298573 -1.498041 65.180580 -2.789700 -0.907889 -0.264516 -0.272584 0.265839 -0.115691 -0.462101 +1.755774 166.043671 -12.402987 -6.268582 -47.881737 8.854125 3.464362 0.107938 3.181649 -3.432943 0.272249 5.332133 -1.106604 0.773785 -0.273964 0.839897 0.616288 0.956771 0.406110 4.787937 -15.489355 -0.344432 0.191002 9.758792 -0.364568 -0.562914 -0.036360 0.660200 0.154695 0.506582 1.649841 -0.911833 -8.468642 2.077375 -2.954264 14.714210 3.544783 -3.753711 30.269840 6.802404 14.052200 6.278881 -16.291964 18.974131 -17.704203 10.014317 -20.816105 -14.630104 -90.282364 -65.453041 59.759747 30.129396 -57.729111 -22.358538 -0.604684 -0.171517 0.439503 0.471866 0.144679 0.108995 4.535153 13.596904 -18.583553 80.765663 59.084404 48.395939 -0.569358 66.139709 -2.427980 -0.887886 -0.259113 -0.248803 0.247672 -0.130804 -0.461382 +2.493180 166.174667 -12.366567 -5.774625 -48.506908 9.085707 2.614579 -0.050837 2.036926 -3.463555 0.237043 5.522469 -1.063135 0.737336 -0.262337 0.850471 0.632353 0.959339 -0.112639 4.358645 -15.707052 -0.908793 0.130067 8.416176 -0.378207 -0.551583 -0.034225 0.647481 0.134903 0.513983 1.871063 -1.086206 -8.289625 1.702105 -2.926984 14.552122 2.979524 -3.672489 29.695045 6.647815 14.124891 6.812924 -16.372850 19.085279 -17.664579 10.502190 -20.661245 -15.201012 -90.221375 -64.278061 58.313332 25.227022 -58.710171 -19.633062 -0.572811 -0.147708 0.432977 0.453417 0.166347 0.122767 4.751923 12.818569 -18.327557 82.402374 57.111286 47.400349 2.960052 67.184059 -0.406084 -0.858947 -0.269306 -0.219772 0.225386 -0.154835 -0.444730 +3.104337 166.138580 -12.361123 -5.377493 -49.274864 9.322409 2.131159 -0.111259 1.092507 -3.976084 0.309012 5.863755 -1.025827 0.721481 -0.249544 0.836927 0.618318 0.944057 -0.604539 4.050637 -15.948699 -1.127587 0.053991 7.163304 -0.375311 -0.548874 -0.028757 0.622785 0.134066 0.520451 1.838435 -0.905329 -8.154225 1.573599 -2.645225 14.307020 2.816289 -3.331951 29.011986 6.591502 13.913296 7.036322 -16.348001 19.110130 -17.179478 10.881913 -21.098469 -15.744227 -90.360291 -63.713367 57.684105 20.660542 -58.324493 -16.694958 -0.562860 -0.128252 0.419226 0.450257 0.167456 0.127348 5.057077 12.476528 -17.941404 80.768524 55.652431 44.213364 4.705201 67.917755 0.458741 -0.837151 -0.274073 -0.201588 0.205340 -0.158432 -0.430704 +3.644735 165.965012 -12.278456 -5.281791 -49.636047 9.618383 1.888535 -0.184299 0.406428 -4.302277 0.337856 6.122027 -0.965617 0.679858 -0.243522 0.837380 0.631183 0.925393 -1.007041 3.752043 -15.998919 -0.935912 -0.043269 5.980521 -0.379512 -0.550163 -0.028129 0.601935 0.117710 0.537046 2.434662 -0.888802 -8.131194 1.270829 -2.427172 14.036299 2.224445 -3.116610 28.279497 6.660919 13.862987 7.469388 -16.024477 19.298777 -16.575005 11.597098 -21.390266 -16.256451 -89.184990 -63.032146 55.885300 15.832952 -58.088898 -13.656969 -0.540590 -0.075053 0.390487 0.440754 0.178806 0.135258 4.910627 12.040683 -17.521587 80.955994 53.802822 41.872486 6.294748 67.669899 0.963872 -0.804616 -0.296598 -0.155846 0.160504 -0.172258 -0.405104 +4.165997 165.794037 -12.161412 -5.519197 -49.605152 10.036591 1.999714 -0.232633 -0.278105 -4.897634 0.411094 6.522964 -0.919088 0.621024 -0.238613 0.845250 0.649124 0.914100 -1.107759 3.589437 -16.049902 -0.967949 -0.086224 5.304147 -0.391172 -0.526863 -0.020104 0.585343 0.085673 0.531035 3.086859 -0.884777 -7.949316 1.180746 -2.246736 13.757518 1.977015 -2.857955 27.356874 6.458653 13.692559 8.186945 -15.852287 19.265665 -16.475861 11.546116 -21.749334 -16.434526 -88.645180 -61.485912 53.443806 9.938176 -58.401215 -10.271932 -0.486820 -0.052285 0.393372 0.406538 0.202982 0.149657 4.690033 11.603480 -17.109907 79.806252 51.520981 38.171230 10.749758 67.738121 3.542996 -0.770098 -0.298185 -0.126424 0.135701 -0.196477 -0.387150 +4.610957 165.588043 -12.151082 -5.346190 -49.173733 10.048797 1.917262 -0.353518 -1.104606 -5.477421 0.511152 7.359171 -0.877000 0.594389 -0.218418 0.806916 0.605841 0.877691 -1.339873 3.501498 -16.382124 -1.248385 -0.097400 5.231574 -0.380703 -0.490192 -0.005740 0.540049 0.090139 0.509067 3.116958 -0.870246 -7.545007 1.188169 -2.145591 13.448503 2.106918 -2.618797 26.097023 6.284989 13.591178 8.933543 -15.135174 19.193541 -15.749553 10.937140 -22.790348 -16.320213 -86.314384 -59.476040 48.946125 2.471347 -58.989697 -6.025545 -0.455803 -0.067012 0.401371 0.381975 0.200434 0.150844 4.853712 11.953414 -16.529488 76.978729 49.035892 33.332592 18.638786 67.594078 8.579813 -0.733749 -0.265663 -0.126498 0.138597 -0.188529 -0.371983 +5.077330 165.365860 -12.137441 -5.391473 -48.710621 10.250090 2.027637 -0.505501 -2.038249 -5.863139 0.586008 8.369407 -0.852626 0.554730 -0.221162 0.795097 0.592508 0.861273 -1.326099 3.550413 -16.915388 -1.715844 -0.076003 5.523638 -0.387742 -0.455855 -0.005836 0.513414 0.062845 0.496346 3.203425 -0.794127 -7.074530 1.232844 -1.989836 13.110909 2.322623 -2.342943 24.812037 6.321569 13.192057 9.625464 -14.632455 18.971157 -15.732099 10.149632 -23.322330 -16.620564 -85.172020 -57.131077 45.054642 -7.118002 -57.804947 -0.524927 -0.409888 -0.070343 0.426631 0.342373 0.219029 0.147328 4.889943 12.002140 -16.083113 75.060051 46.177998 28.621929 24.905453 65.980881 11.947321 -0.704013 -0.241795 -0.117339 0.126451 -0.189432 -0.366851 +5.511160 164.997635 -12.047602 -5.293961 -47.953358 10.497688 2.154961 -0.692010 -3.131081 -6.283369 0.665802 9.389389 -0.817303 0.533133 -0.208708 0.768745 0.558134 0.836564 -1.495044 3.673358 -17.859495 -2.161002 -0.043866 6.412472 -0.385248 -0.428509 0.003951 0.471933 0.059712 0.490823 3.366324 -0.841835 -6.683656 1.144231 -1.938038 12.597975 2.447562 -2.237129 23.291262 6.324219 12.568447 10.208038 -14.122289 18.686655 -15.177151 9.719419 -22.911745 -16.879511 -84.739273 -54.613197 41.959877 -16.604340 -55.848263 4.634556 -0.385034 -0.075838 0.437635 0.321342 0.223975 0.146350 5.108632 11.309784 -15.649613 74.939606 42.879398 24.665571 29.090019 62.523048 13.160874 -0.676342 -0.216955 -0.108009 0.118117 -0.182742 -0.355973 +5.975729 164.718033 -11.863252 -5.302130 -46.612427 10.746910 2.308228 -1.000390 -4.335661 -6.614056 0.711387 10.700800 -0.781744 0.506835 -0.202375 0.744644 0.521985 0.822127 -1.789793 3.734812 -18.708181 -2.280045 -0.040708 7.495085 -0.380034 -0.410630 0.005870 0.431718 0.040083 0.487112 3.765532 -0.969738 -6.342091 1.184046 -1.964829 12.088542 2.803968 -2.239013 21.910166 6.255766 11.739151 10.689406 -13.973336 18.508034 -14.365384 8.812634 -22.665823 -16.757832 -85.319992 -52.447044 39.642731 -20.552885 -51.679966 5.998483 -0.357530 -0.064613 0.443843 0.300321 0.227201 0.137715 5.475376 10.360473 -15.217603 74.407814 39.593071 20.598122 31.128378 58.222523 12.645628 -0.645197 -0.209855 -0.095934 0.087798 -0.182156 -0.354024 +6.541968 164.494919 -11.715359 -5.427540 -44.333920 10.843918 2.756126 -1.444317 -5.672246 -6.777926 0.705462 12.394989 -0.766476 0.478938 -0.202541 0.730849 0.495727 0.827638 -2.056098 3.820168 -19.514698 -2.203588 -0.050312 9.261275 -0.378896 -0.384161 0.010805 0.402850 0.009135 0.473366 4.468591 -1.445414 -5.715921 1.308857 -2.312465 11.729095 3.126073 -2.509551 20.640215 6.035393 11.112825 10.824742 -14.353500 18.398081 -14.218781 7.004889 -23.173594 -16.541067 -84.018723 -50.534496 36.170940 -22.095377 -46.706219 5.857731 -0.326100 -0.075654 0.465094 0.274303 0.237849 0.126984 5.811011 10.063232 -15.150534 72.621315 37.037312 16.759340 31.535904 53.127449 11.101893 -0.622997 -0.192670 -0.095404 0.071260 -0.187882 -0.364899 +7.204546 164.207764 -11.697965 -4.652223 -40.580994 10.249565 2.977822 -2.213176 -7.686277 -7.158882 0.688755 14.940269 -0.744488 0.439522 -0.197998 0.749786 0.521325 0.835127 -3.285902 3.518858 -20.242908 -1.598179 -0.160115 11.265115 -0.389100 -0.361604 0.016573 0.405462 -0.011673 0.460464 4.526140 -2.320081 -4.996784 1.293780 -3.029412 11.429747 3.473411 -3.203922 19.562258 6.089178 10.789883 10.601437 -13.639040 18.064959 -14.178087 6.084700 -23.231354 -16.491701 -82.813477 -48.533394 32.645943 -22.093161 -41.960434 4.915391 -0.285835 -0.071272 0.472608 0.247912 0.255488 0.139776 5.753143 9.326966 -15.474208 70.718216 35.166328 14.048994 31.147116 48.390144 9.502047 -0.603989 -0.192389 -0.083363 0.067918 -0.214041 -0.356415 +7.832886 163.948059 -11.567706 -4.039166 -37.380020 9.506545 2.927914 -2.938613 -9.052074 -7.279142 0.624617 17.243574 -0.733843 0.413355 -0.193854 0.753221 0.523080 0.833917 -4.374572 3.232094 -20.898985 -1.082501 -0.312375 13.822042 -0.401555 -0.326908 0.023027 0.394541 -0.027260 0.446990 4.823312 -3.076018 -4.203299 1.283053 -3.649585 11.199993 3.514127 -3.731237 18.540051 5.794246 10.439932 10.872869 -13.158144 17.439377 -14.327139 4.120765 -23.466368 -15.931002 -80.162827 -46.181778 28.302616 -21.938387 -37.609352 4.062568 -0.247865 -0.094603 0.500648 0.215785 0.276697 0.147368 5.583919 9.475564 -15.545424 68.876045 33.652359 11.724177 29.231306 43.623585 7.412969 -0.588198 -0.164948 -0.081871 0.080303 -0.223093 -0.351407 +8.460488 163.585617 -11.405798 -3.755568 -34.813919 9.017931 3.085687 -3.651858 -10.354903 -7.821445 0.668097 19.724806 -0.724290 0.408701 -0.193456 0.741831 0.501515 0.825046 -5.085648 3.045202 -21.837099 -0.542986 -0.520094 16.834372 -0.401134 -0.315330 0.013051 0.377212 -0.034518 0.445089 5.564223 -3.490164 -3.462853 1.290342 -3.870229 10.969480 3.369160 -3.876795 17.628319 5.523723 9.889712 10.375631 -12.552778 16.659075 -13.887792 1.677854 -23.285875 -15.208591 -77.581581 -43.983147 24.594301 -21.347328 -33.903473 3.281768 -0.231740 -0.091070 0.510287 0.197986 0.276955 0.138715 5.728739 9.141832 -15.529655 66.954773 31.854429 9.537202 27.638260 38.865200 5.758027 -0.572394 -0.157926 -0.079069 0.070625 -0.215600 -0.349366 +9.015208 163.217804 -11.239435 -3.403262 -32.989090 8.500189 3.090080 -4.113754 -11.104386 -8.442555 0.771487 21.286917 -0.710280 0.403827 -0.193826 0.722182 0.466220 0.810645 -5.685480 2.989309 -23.588095 -0.342014 -0.723596 21.241095 -0.396328 -0.305020 0.010894 0.346616 -0.043217 0.446991 6.037810 -3.588850 -2.669135 1.318733 -3.803905 10.653463 3.278777 -3.718045 16.624069 5.429049 9.262973 10.152700 -12.197408 16.071753 -13.294462 -1.349499 -22.502745 -14.363648 -75.219315 -41.628216 21.271864 -20.064365 -29.805319 2.374411 -0.218976 -0.083991 0.520432 0.183799 0.274121 0.127887 5.536554 8.492969 -15.240474 65.425079 29.779852 7.567086 25.802567 34.194653 4.266063 -0.558312 -0.148548 -0.073258 0.051430 -0.203097 -0.350735 +9.548126 162.947296 -11.017152 -3.334122 -31.344221 7.811875 3.351379 -4.316428 -11.063261 -9.298347 0.937335 22.033400 -0.689912 0.363937 -0.207350 0.731362 0.468459 0.818316 -5.819951 3.058365 -25.497442 -0.364857 -0.890390 26.363552 -0.405666 -0.279739 -0.000129 0.330689 -0.088644 0.442846 6.311384 -3.578702 -1.601789 1.718378 -3.716057 10.377161 3.749720 -3.616927 15.713515 4.782694 8.640299 10.450081 -12.011909 15.353668 -13.190159 -3.850189 -21.759279 -13.490373 -72.640694 -39.642048 18.165287 -17.126104 -26.735561 1.163237 -0.172690 -0.064552 0.536757 0.142780 0.293126 0.117057 6.209223 8.137712 -15.045162 62.200516 27.879116 5.806174 24.360037 28.679926 3.186207 -0.530866 -0.145853 -0.050635 0.020775 -0.211659 -0.352408 +10.185560 162.654160 -10.763127 -2.855600 -29.450518 6.683204 2.893708 -4.608005 -10.756348 -9.644609 1.004357 23.003426 -0.678482 0.338515 -0.217568 0.723085 0.447610 0.812042 -6.404965 2.954863 -27.601337 -0.203286 -1.163822 32.067871 -0.415417 -0.234679 -0.001782 0.300252 -0.119911 0.435331 6.261549 -3.621241 -0.182850 2.180018 -3.794796 10.020690 4.288009 -3.625567 14.534997 3.831196 7.921453 11.326707 -11.752654 14.255855 -13.344999 -6.215108 -21.321112 -12.427036 -69.406548 -37.072773 14.570958 -14.190797 -24.220568 0.088817 -0.131624 -0.084574 0.573870 0.097807 0.315769 0.105037 6.855547 8.504256 -14.322910 58.582947 25.681368 3.904279 22.017820 23.576063 2.106881 -0.508782 -0.104326 -0.039798 0.017972 -0.201427 -0.353207 +10.898045 162.396591 -10.544028 -2.723150 -27.932606 5.635265 2.712929 -4.813019 -10.472246 -10.119644 1.150131 24.116980 -0.673374 0.314505 -0.231421 0.718763 0.445225 0.801680 -6.691819 3.079387 -29.902905 0.070381 -1.444628 37.795067 -0.430214 -0.181526 -0.004979 0.281600 -0.141277 0.426583 6.789803 -3.691722 1.488590 2.592946 -3.780725 9.747213 4.403991 -3.533485 13.484839 2.744977 7.700224 12.089128 -11.140582 13.081986 -14.175436 -8.084806 -20.713964 -11.708460 -66.024620 -34.458389 11.332027 -11.020774 -21.438622 -0.841928 -0.097585 -0.121823 0.611253 0.052846 0.345008 0.092906 7.555381 8.497947 -13.813388 55.422333 23.877342 2.475344 18.792103 18.776834 1.139875 -0.491107 -0.046234 -0.028338 0.037339 -0.184903 -0.345369 +11.529470 162.111633 -10.298327 -2.495443 -26.280951 4.348070 2.442348 -5.055665 -10.023326 -10.582248 1.317064 25.364876 -0.672470 0.287845 -0.237984 0.715858 0.438845 0.791396 -6.766778 3.206179 -32.194660 0.263626 -1.714481 43.795910 -0.436268 -0.125258 -0.000960 0.266797 -0.157468 0.399156 7.112445 -3.866680 3.392800 2.979767 -3.884837 9.434582 4.469942 -3.548762 12.360051 1.561258 7.796877 12.856572 -10.119952 12.006000 -14.783854 -9.160623 -19.783697 -11.121583 -62.669003 -31.926392 8.742968 -8.672855 -19.054754 -1.357062 -0.052632 -0.162017 0.651091 0.004424 0.361064 0.086630 8.535338 7.598685 -13.142087 52.223011 21.846369 0.988571 16.367065 16.431997 0.643504 -0.472848 0.007767 -0.031653 0.064928 -0.175544 -0.341088 +12.164960 161.952927 -10.013915 -2.398540 -24.582956 2.902677 2.131619 -5.065949 -8.908701 -10.783195 1.434792 26.044443 -0.682050 0.250719 -0.257115 0.742176 0.457198 0.811764 -6.397417 3.647838 -34.433758 0.370956 -1.873216 49.838406 -0.459638 -0.072150 -0.004570 0.266195 -0.205717 0.383250 7.290061 -3.869615 5.479620 3.580310 -3.928139 9.217341 4.835080 -3.525605 11.416520 0.683580 7.435403 13.507328 -9.651917 10.950624 -16.168123 -9.879373 -18.907215 -10.701279 -59.599251 -29.748726 6.808343 -6.897329 -16.836237 -1.625901 0.007793 -0.188465 0.706273 -0.055879 0.398046 0.081977 8.602891 6.605799 -12.287846 49.425083 19.517731 -0.634265 13.037437 15.636235 0.109706 -0.459547 0.046651 -0.026176 0.074384 -0.185141 -0.349778 +12.792810 161.843613 -9.693863 -2.208760 -23.385796 1.331861 1.790020 -5.037875 -7.601022 -11.237442 1.604962 26.510326 -0.681876 0.204592 -0.274475 0.763898 0.482873 0.828570 -6.042880 4.158489 -36.232037 1.036411 -2.243263 54.902790 -0.485143 -0.021191 -0.008208 0.265067 -0.254825 0.368472 7.415636 -3.840186 7.724665 4.146320 -3.938944 9.068166 5.089520 -3.467563 10.542577 -0.231859 7.442299 14.200356 -9.666759 10.348071 -17.698994 -10.695885 -17.898386 -10.264501 -56.126587 -27.516502 4.990882 -5.431382 -15.129548 -1.759436 0.064350 -0.213054 0.751027 -0.111806 0.439705 0.077823 8.596458 5.660647 -11.704353 46.838070 17.569216 -1.648499 9.836167 13.006682 -0.268956 -0.441483 0.084346 -0.014633 0.082491 -0.196309 -0.353075 +13.414145 161.735931 -9.187688 -2.175047 -22.502855 -0.033394 1.442016 -5.004296 -6.335374 -11.580451 1.757685 27.042522 -0.647801 0.173622 -0.270630 0.772992 0.485825 0.838400 -5.459860 4.745141 -37.654560 1.706883 -2.655010 59.103065 -0.494912 0.001233 -0.009212 0.246123 -0.283816 0.372076 8.114553 -3.976257 9.545574 4.598077 -3.864997 8.910819 5.013246 -3.345956 9.754962 -1.001537 7.293248 14.474712 -9.936454 9.855046 -17.760483 -11.828453 -16.445377 -9.789140 -52.368984 -25.280626 3.461583 -4.625863 -13.554544 -1.701028 0.100089 -0.199133 0.755116 -0.140229 0.459397 0.079458 8.290041 4.392107 -11.157803 44.434635 15.724664 -2.269015 7.302358 9.910656 -0.422149 -0.412208 0.086069 0.011751 0.061697 -0.211697 -0.344706 +13.942862 161.691879 -8.696178 -1.858540 -21.448971 -1.656369 0.888064 -5.126836 -5.047823 -12.242907 1.971118 27.952705 -0.615681 0.139276 -0.264203 0.781038 0.499090 0.826399 -4.752303 5.159188 -38.227467 2.341050 -3.057036 62.024246 -0.504690 0.024116 -0.009551 0.237936 -0.300295 0.366054 8.618409 -4.335685 11.381587 4.874151 -3.995136 8.851495 4.695196 -3.417089 9.072591 -2.195494 7.657135 14.549543 -9.631670 9.209462 -17.948116 -12.417798 -14.865746 -9.102456 -48.489285 -22.627131 1.870270 -3.348772 -12.978039 -1.758532 0.142590 -0.185488 0.757652 -0.172193 0.475031 0.091796 8.490059 3.146681 -10.875352 41.980942 14.299168 -2.710303 5.103944 6.871451 -0.438732 -0.384523 0.089374 0.032075 0.056389 -0.224175 -0.324902 +14.527939 161.639938 -8.070327 -1.987689 -20.319613 -2.985504 0.706570 -5.149181 -3.575767 -12.617609 2.093268 28.402304 -0.621510 0.131086 -0.250697 0.766813 0.484197 0.815888 -3.668618 5.603782 -38.432129 3.418152 -3.815818 64.042374 -0.501132 0.053684 0.006717 0.230114 -0.293987 0.334956 9.512220 -4.957158 12.669002 5.109103 -4.244118 8.977954 4.303888 -3.544610 8.780342 -2.899643 8.002971 14.370511 -9.765591 8.928611 -18.517262 -11.988320 -12.979684 -8.505713 -45.862499 -20.219334 0.759443 -1.738338 -12.751713 -1.887986 0.161790 -0.231011 0.778745 -0.188785 0.473831 0.097934 7.048268 1.408308 -10.675583 40.771896 13.135155 -3.063498 3.419028 5.025157 -0.406247 -0.380247 0.124140 0.008445 0.094086 -0.222191 -0.325160 +15.040525 161.656525 -7.452050 -1.894586 -18.880018 -4.391121 0.481657 -5.295700 -2.164596 -12.952045 2.166445 28.891436 -0.630033 0.142582 -0.253220 0.727329 0.426361 0.797037 -2.630907 5.739707 -37.904804 4.469209 -4.569435 64.450294 -0.483549 0.058387 0.006610 0.199678 -0.295886 0.324848 9.759647 -5.494516 13.911802 5.429357 -4.656223 9.024693 4.294415 -3.798410 8.361103 -3.074886 7.880970 14.327673 -10.304857 8.868049 -18.220480 -12.193139 -11.478036 -7.681106 -42.719383 -17.627207 -0.263942 -0.189310 -12.348225 -1.957202 0.160933 -0.247615 0.794794 -0.192907 0.458769 0.078164 5.803906 0.075581 -10.055680 39.129917 11.509327 -3.619625 1.621444 4.144966 -0.371325 -0.374193 0.143016 -0.011654 0.086946 -0.198184 -0.339092 +15.483229 161.690399 -6.799458 -1.882743 -17.358936 -5.631904 0.137725 -5.501371 -0.916787 -12.694860 2.077723 29.550722 -0.627206 0.155013 -0.244108 0.699355 0.375096 0.788940 -1.516503 5.878325 -37.532955 5.978587 -5.575004 64.459106 -0.469407 0.064039 0.010145 0.170551 -0.292572 0.318183 9.886794 -5.959762 14.860575 5.715011 -5.003253 9.114919 4.414496 -4.008487 8.049731 -3.010254 7.480557 14.010108 -10.442042 8.661354 -17.830647 -11.740071 -9.412351 -7.007250 -40.645203 -15.243233 -1.102214 1.421734 -13.038127 -2.120101 0.162378 -0.254339 0.804854 -0.195971 0.443658 0.068695 4.065310 -1.720223 -9.502506 37.865334 9.886753 -4.142363 0.112870 3.768971 -0.336539 -0.365749 0.152017 -0.026651 0.080070 -0.186366 -0.349371 +16.041679 161.748291 -6.069899 -1.887914 -15.910677 -6.742328 -0.618311 -5.646820 0.535678 -12.046301 1.813194 29.865625 -0.610213 0.168314 -0.226951 0.659603 0.324452 0.757086 -0.585518 5.865366 -37.233700 7.715429 -6.666444 63.780704 -0.452771 0.056697 0.015954 0.136990 -0.270471 0.319443 10.671004 -6.626561 15.513944 5.748904 -5.205064 9.258593 3.959971 -4.088583 7.821506 -2.948819 7.156615 13.324201 -10.562287 8.470918 -17.229403 -11.438228 -7.300696 -6.615018 -38.184170 -13.297992 -1.688035 2.497124 -13.812566 -2.190413 0.151661 -0.250631 0.795968 -0.185534 0.422929 0.065663 2.446911 -4.015463 -9.051552 36.803410 8.150711 -4.753599 -1.518933 4.348881 -0.365237 -0.355870 0.155265 -0.033555 0.072713 -0.167967 -0.343057 +16.591484 161.696030 -5.245648 -1.490190 -14.574328 -7.540933 -1.759423 -5.829533 1.599605 -11.689550 1.616582 30.079950 -0.609239 0.211854 -0.205383 0.590290 0.226915 0.724539 0.065190 5.642805 -36.876362 9.463140 -7.560835 61.792778 -0.415422 0.042000 0.018199 0.091344 -0.233593 0.309348 11.077460 -6.996579 15.539642 5.708070 -5.314978 9.222696 3.738240 -4.055237 7.560711 -2.657047 6.570048 12.704834 -10.919835 8.463791 -15.690054 -10.987993 -5.187271 -6.401853 -36.524437 -11.817648 -2.097512 4.168013 -14.285155 -2.344460 0.118566 -0.264619 0.786008 -0.159759 0.377041 0.046383 0.686815 -6.502624 -8.381346 35.541290 6.082051 -5.362917 -2.860470 5.193972 -0.388392 -0.349154 0.162360 -0.068609 0.069980 -0.132993 -0.352963 +17.110605 161.788162 -4.456103 -1.006073 -13.803840 -8.508443 -2.746237 -5.761288 3.084855 -11.968323 1.649002 29.830801 -0.621846 0.249213 -0.191296 0.527758 0.150228 0.693692 1.059205 5.777504 -36.152599 10.692547 -7.849844 59.134991 -0.378494 0.034080 0.030050 0.059990 -0.198980 0.290624 11.152011 -7.225734 15.588461 5.632852 -5.457507 9.456184 3.526150 -4.056798 7.710233 -2.530942 6.034244 12.079504 -11.756313 8.451816 -14.921094 -11.175639 -3.053476 -6.329702 -34.059891 -10.027780 -2.528913 5.571686 -15.767790 -2.540047 0.081960 -0.300600 0.777732 -0.132580 0.336451 0.027590 -0.203889 -8.401016 -8.051851 33.242374 4.668390 -5.617304 -3.848776 5.753705 -0.377522 -0.354285 0.184400 -0.106498 0.087019 -0.097616 -0.363339 +17.647844 162.072861 -3.672932 -0.406610 -13.206940 -9.828917 -3.926695 -5.543361 5.001095 -11.975647 1.562431 29.236265 -0.605870 0.235404 -0.174646 0.501454 0.138229 0.670391 2.219491 5.904577 -34.555080 11.299890 -7.582111 55.713551 -0.365749 0.038043 0.048153 0.049649 -0.186592 0.270805 11.202026 -7.514512 15.726274 5.375001 -5.591716 9.919951 2.940408 -4.147343 8.114386 -2.081576 5.591244 11.877518 -12.220236 8.634819 -14.657080 -12.036433 -1.674009 -6.001417 -30.690527 -7.703784 -3.032579 7.436668 -18.564142 -2.906068 0.079899 -0.318285 0.762967 -0.123294 0.327401 0.034242 -0.570418 -9.385583 -7.559289 31.135132 3.161576 -5.824035 -5.063494 6.330867 -0.398877 -0.347763 0.193552 -0.116251 0.100272 -0.098737 -0.355191 +18.158537 162.349335 -2.803040 0.276213 -12.243917 -10.925541 -5.044120 -5.461626 6.484826 -12.113650 1.485913 28.846609 -0.622692 0.252239 -0.177419 0.513717 0.135079 0.688628 3.152166 5.742441 -32.748402 11.320073 -7.014176 51.762642 -0.364545 0.028658 0.038032 0.058784 -0.189687 0.273278 11.138654 -7.884581 14.951833 5.003368 -5.947675 10.527719 2.451710 -4.471189 9.198942 -2.240231 5.349474 11.703313 -12.293002 8.299742 -14.648385 -12.094965 -0.320884 -5.883162 -28.073393 -5.768735 -3.212739 8.910892 -19.257002 -3.104298 0.079176 -0.309282 0.767407 -0.123939 0.319132 0.030366 0.014648 -10.083215 -7.654359 28.080332 2.456949 -5.655083 -6.328747 5.859103 -0.365277 -0.353820 0.178416 -0.123510 0.095629 -0.101039 -0.365864 +18.770279 162.584869 -1.938410 0.948997 -11.169830 -12.090234 -6.205921 -5.487468 7.750029 -12.270072 1.400043 28.896019 -0.614251 0.254936 -0.174718 0.524315 0.147737 0.685233 3.936343 5.381242 -30.783531 11.288417 -6.469450 47.540325 -0.366559 0.013733 0.030338 0.066280 -0.185210 0.285442 11.497007 -8.432092 14.508771 4.575527 -6.238729 11.029610 1.642748 -4.743938 9.940915 -2.526060 5.175299 11.113753 -12.130023 7.805564 -14.652235 -12.238344 0.929030 -5.919174 -25.380159 -4.183997 -3.190051 9.866738 -19.473000 -3.134611 0.078861 -0.281435 0.751820 -0.120745 0.315577 0.036771 0.236508 -10.990725 -7.711123 25.326334 1.746981 -5.389225 -7.042243 5.636880 -0.329813 -0.351790 0.156201 -0.110504 0.084722 -0.105083 -0.354697 +19.306488 162.671982 -0.995856 1.516709 -10.182038 -12.921791 -7.064865 -5.638588 8.497404 -12.987692 1.524318 29.409908 -0.598530 0.237255 -0.183489 0.540163 0.167509 0.695151 4.908900 5.088339 -28.563667 11.085308 -5.740803 42.433559 -0.371213 0.007427 0.024585 0.068714 -0.207223 0.298049 11.417262 -8.636563 13.968605 4.485554 -6.467214 11.234585 1.521598 -4.931324 10.365324 -2.464418 4.806523 11.110563 -12.440313 7.651311 -14.648966 -11.645477 1.991255 -5.863386 -24.028017 -3.135989 -3.148629 10.323083 -18.225908 -2.946486 0.087290 -0.250448 0.738480 -0.125137 0.324078 0.034429 -0.959873 -11.958897 -7.447312 23.567247 0.935212 -5.259473 -7.842466 5.129245 -0.262309 -0.344164 0.136116 -0.084886 0.056354 -0.115765 -0.351602 +19.768217 162.487488 -0.107242 1.953781 -9.176653 -13.187037 -7.526330 -5.930067 8.515532 -14.109015 1.814248 30.256285 -0.604168 0.249534 -0.170041 0.532370 0.156245 0.691577 5.666242 4.769866 -26.777435 11.231659 -5.129622 36.885464 -0.357742 -0.007828 0.036477 0.071792 -0.190712 0.287566 11.503110 -8.733062 12.791336 4.297537 -6.545551 11.291996 1.375769 -4.975177 10.847047 -2.383180 4.415726 10.993388 -12.934181 7.620457 -13.793324 -10.655560 2.977595 -5.967607 -22.697716 -2.777072 -2.927337 9.957746 -16.833422 -2.644819 0.076326 -0.257731 0.725798 -0.106267 0.305064 0.043539 -2.167334 -13.120697 -7.042492 21.803942 -0.052955 -5.041074 -7.735918 5.238700 -0.248794 -0.352818 0.124083 -0.100952 0.065147 -0.120454 -0.353779 +20.221535 162.244736 0.823468 2.448682 -8.356561 -13.450181 -7.877079 -6.188453 8.431261 -15.576659 2.252379 31.159008 -0.598571 0.254664 -0.154423 0.539586 0.167877 0.695055 6.516151 4.564859 -24.830172 10.912866 -4.308444 31.196280 -0.354991 -0.026848 0.038192 0.084091 -0.174946 0.286965 11.573364 -8.923255 11.627342 3.975466 -6.685982 11.402855 1.041291 -5.135677 11.418332 -2.181147 4.167827 10.772692 -13.010827 7.578401 -13.137735 -10.077913 4.352905 -6.223819 -21.219194 -2.141149 -2.757571 9.944093 -16.126392 -2.469346 0.069230 -0.247309 0.704824 -0.089953 0.294846 0.057591 -2.731207 -14.117768 -7.233391 19.786867 -0.068752 -4.672304 -8.087139 5.048856 -0.261509 -0.354468 0.098691 -0.103191 0.068015 -0.135121 -0.345937 +20.680140 161.951660 1.678796 2.786683 -7.637924 -13.842036 -8.103809 -6.427369 8.446346 -16.739782 2.635273 32.203377 -0.592900 0.252512 -0.166239 0.553172 0.191362 0.688646 7.454468 4.416574 -22.449331 10.176303 -3.389392 25.191154 -0.353870 -0.053241 0.034468 0.095390 -0.178290 0.306808 11.792910 -9.076713 10.506375 3.685543 -6.803295 11.677050 0.640462 -5.262598 12.224933 -2.152959 4.107105 10.590669 -13.219475 7.525066 -12.941433 -9.822303 5.423920 -6.269403 -19.306263 -1.167899 -2.527622 9.634776 -16.665014 -2.404252 0.056142 -0.206853 0.678734 -0.075488 0.289858 0.057882 -2.770318 -14.699391 -7.437585 17.794374 0.024914 -4.264306 -8.372012 5.305501 -0.306069 -0.364081 0.069364 -0.078687 0.042213 -0.134066 -0.338943 +21.181623 161.525574 2.553061 3.174287 -6.853773 -14.296515 -8.387883 -6.648635 8.555002 -18.129774 3.115965 33.321651 -0.569421 0.241591 -0.161353 0.576049 0.227869 0.694772 8.175173 4.123074 -20.040339 9.147344 -2.592812 19.726526 -0.372583 -0.065819 0.032260 0.104084 -0.181297 0.334243 11.961381 -9.134136 9.740479 3.471229 -6.830770 11.823802 0.264697 -5.294850 12.673656 -1.842391 3.666550 10.645670 -13.441114 7.366487 -13.118397 -9.513453 6.524550 -6.731490 -17.901108 -1.097103 -2.321706 9.492599 -16.394730 -2.287619 0.055952 -0.179758 0.661451 -0.069759 0.310509 0.074933 -3.781359 -15.804683 -7.406123 16.705795 -0.257333 -4.038604 -8.600548 6.224546 -0.384813 -0.360754 0.048516 -0.047453 0.028149 -0.151769 -0.320413 +21.622448 160.804031 3.513095 4.024562 -5.872289 -14.642283 -9.198136 -6.860587 8.581141 -19.530458 3.640507 34.533554 -0.579719 0.253971 -0.155659 0.546840 0.207574 0.676913 8.536102 3.700110 -17.784891 7.390490 -1.835848 14.727482 -0.353685 -0.065003 0.039600 0.103787 -0.159785 0.313112 11.468879 -8.959882 9.120256 3.207470 -6.883799 11.685587 0.094433 -5.330815 12.655455 -1.645102 3.692533 10.653983 -13.556220 7.550326 -12.820971 -8.396857 7.524016 -7.196652 -16.704649 -1.651066 -2.020716 8.377947 -14.339320 -1.900223 0.035184 -0.212803 0.651831 -0.053620 0.292445 0.067909 -5.057623 -17.278666 -7.363119 15.874871 -0.451871 -3.816604 -8.187613 7.389155 -0.448485 -0.365736 0.065905 -0.071869 0.053810 -0.137226 -0.321579 +22.020214 160.024261 4.511944 4.652291 -4.303390 -15.109838 -9.622871 -7.251557 8.833234 -20.994297 4.199568 35.949417 -0.598364 0.258581 -0.167188 0.547445 0.215617 0.683633 8.627649 3.233695 -15.915921 5.674345 -1.375939 11.181055 -0.347103 -0.066404 0.036311 0.117678 -0.159872 0.303920 11.206360 -9.162292 8.149042 2.664571 -7.193390 11.761765 -0.441466 -5.649238 13.152406 -1.220223 3.763769 10.648293 -13.470514 7.756055 -13.140706 -7.481570 8.353357 -7.507329 -14.938253 -1.851918 -1.652692 6.814520 -12.610357 -1.557185 0.021610 -0.222909 0.648065 -0.047038 0.285600 0.055837 -5.657560 -18.414675 -7.735792 15.230223 -0.335267 -3.684000 -8.878238 7.703172 -0.504095 -0.376232 0.069974 -0.080859 0.062912 -0.130681 -0.330252 +22.437374 159.174530 5.460219 5.171485 -3.457431 -15.370790 -9.825744 -7.448458 8.913004 -22.667845 4.944061 37.109230 -0.591631 0.253804 -0.164216 0.557258 0.228446 0.684968 8.518587 2.939024 -14.829436 4.944679 -1.191964 9.281343 -0.343713 -0.077966 0.040118 0.125604 -0.158084 0.305579 11.167620 -9.222609 7.832871 2.365947 -7.227389 11.530937 -0.845358 -5.731473 12.915031 -0.981042 3.773301 10.388954 -13.276467 7.836535 -12.853318 -6.722301 9.333761 -7.985518 -13.801444 -2.412543 -1.430594 6.226957 -11.007538 -1.342433 0.021177 -0.204437 0.634001 -0.039528 0.279344 0.062892 -6.706178 -19.608217 -7.942707 14.592486 -0.076018 -3.491260 -9.746717 8.378202 -0.583484 -0.378160 0.050233 -0.074835 0.053379 -0.141134 -0.327017 +22.864645 158.411270 6.196711 4.831555 -2.748364 -15.783571 -9.225907 -7.776366 8.926030 -24.031298 5.731648 38.716942 -0.597881 0.277068 -0.165818 0.534448 0.198134 0.663393 8.674477 2.893362 -14.287873 5.410257 -1.265435 8.954817 -0.324279 -0.096132 0.043077 0.114325 -0.140422 0.309628 11.981267 -9.557547 8.165059 2.365206 -7.284143 11.348562 -1.261078 -5.744738 12.413712 -1.155864 3.925361 9.609926 -13.480472 7.815515 -12.445586 -6.881211 9.920022 -8.470833 -12.467811 -2.588734 -1.232047 5.971716 -9.312444 -1.180564 -0.004238 -0.194875 0.619768 -0.020242 0.253201 0.053161 -7.286872 -20.409159 -7.970345 13.427250 0.127721 -3.174537 -10.771729 9.433916 -0.667027 -0.388629 0.045664 -0.080765 0.046399 -0.117792 -0.329869 +23.241074 157.710938 6.783777 4.144207 -2.425409 -15.781723 -8.203087 -7.968066 8.519644 -25.089634 6.510585 40.094185 -0.579136 0.307647 -0.131935 0.487959 0.144525 0.630558 8.906473 3.192267 -15.039022 6.293676 -1.476150 10.436006 -0.305540 -0.118252 0.055447 0.083143 -0.092260 0.315156 13.385659 -9.779045 7.938061 2.355916 -7.076808 11.100707 -1.788212 -5.547588 12.016577 -0.932139 3.678276 9.006067 -13.877441 7.967982 -11.015976 -7.067632 9.342567 -8.069016 -10.995346 -2.142030 -1.045620 5.361242 -7.672340 -1.006917 -0.037122 -0.205235 0.597120 0.014963 0.227051 0.061175 -8.266223 -19.996689 -7.042833 12.910398 -0.900626 -3.110002 -12.091113 10.091917 -0.735080 -0.384823 0.044058 -0.095253 0.053339 -0.103161 -0.316673 +23.613152 157.256958 7.096375 3.597286 -2.611845 -16.187992 -7.489793 -7.887073 8.349902 -25.800768 7.256255 41.346813 -0.531356 0.278513 -0.124628 0.488078 0.154872 0.620352 8.746735 3.552403 -16.098890 7.686231 -1.858089 13.307311 -0.310598 -0.125455 0.055216 0.066379 -0.104139 0.333931 14.335569 -9.991561 8.815681 2.481429 -6.824279 11.091916 -2.123575 -5.359133 11.562819 -0.885094 3.771662 8.164620 -14.169802 8.207080 -10.830535 -7.799534 8.883418 -7.355741 -9.854422 -0.736476 -0.935953 5.340904 -7.290670 -0.889146 -0.027120 -0.160519 0.570353 0.013719 0.236340 0.067043 -8.677763 -19.193880 -6.446342 12.455900 -1.332025 -3.024599 -13.342148 10.396764 -0.788946 -0.361597 0.021108 -0.057897 0.015915 -0.114818 -0.297967 +23.844151 156.977127 7.323804 3.347018 -2.652537 -16.740406 -7.375207 -7.711689 8.383319 -25.727104 7.586590 42.271820 -0.463973 0.230246 -0.111409 0.505858 0.181223 0.617479 8.021312 3.660187 -16.761732 9.231949 -2.305269 15.797264 -0.325900 -0.115557 0.060151 0.049510 -0.127910 0.352130 14.189692 -9.782053 10.172961 2.975234 -6.529137 10.956674 -1.669143 -5.116862 10.777116 -1.200501 3.797822 8.106646 -14.033078 8.104652 -10.478606 -7.993258 8.264083 -6.661626 -10.299190 0.147855 -1.115474 5.471440 -6.472231 -0.790633 0.010795 -0.111835 0.550053 -0.005898 0.262341 0.088325 -9.272883 -18.396490 -5.630602 12.047355 -2.115676 -2.988931 -14.155423 10.398777 -0.760044 -0.324367 -0.001117 -0.007940 -0.022945 -0.146085 -0.269980 +23.930017 156.796844 7.354068 3.232635 -2.714440 -17.350124 -7.334579 -7.424700 8.558422 -25.526226 7.887050 43.080967 -0.447463 0.204414 -0.111069 0.502641 0.172903 0.606165 7.340649 3.785547 -17.041624 10.449183 -2.607938 17.317030 -0.324861 -0.094518 0.060861 0.035556 -0.140497 0.337043 13.701658 -9.486518 12.066614 3.393023 -6.236355 10.768343 -1.294028 -4.821706 9.665657 -1.459673 4.129537 8.364676 -13.016049 7.899854 -10.193143 -7.596145 7.995392 -6.292735 -11.293535 0.554614 -1.373175 5.006302 -4.492879 -0.680459 0.045295 -0.104305 0.563128 -0.032564 0.264055 0.088959 -10.157625 -17.852879 -5.125590 12.633853 -2.311388 -3.170700 -14.824760 10.544926 -0.756092 -0.304272 0.005752 -0.005393 -0.031846 -0.150019 -0.266452 +23.856419 156.653244 7.419426 3.325954 -2.423187 -17.376730 -7.334501 -7.138654 8.343206 -25.127584 8.075340 43.822269 -0.447108 0.171137 -0.127983 0.516570 0.187323 0.621114 6.550024 3.865166 -17.312525 11.427946 -2.741930 17.661400 -0.331139 -0.075508 0.056071 0.035816 -0.177751 0.325450 13.008883 -8.993628 12.844796 3.521046 -5.916663 10.562853 -1.005907 -4.542493 9.142510 -1.138466 3.693968 8.605086 -12.772305 7.698024 -10.650091 -7.479589 7.651973 -6.116244 -11.652186 0.886873 -1.537213 3.645853 -1.769328 -0.583025 0.076684 -0.096917 0.578621 -0.060658 0.277091 0.078553 -10.745539 -17.122847 -4.673400 13.821847 -2.803336 -3.496293 -15.482805 10.930993 -0.831296 -0.294332 0.009093 0.003584 -0.047452 -0.159441 -0.276344 +23.915344 156.684326 7.588482 3.421980 -2.739570 -16.814859 -7.461777 -6.667479 7.809859 -24.639397 8.146693 43.947014 -0.430532 0.148933 -0.102314 0.533586 0.205458 0.645152 6.055876 4.020766 -17.621496 12.238129 -2.710548 17.189711 -0.336762 -0.067415 0.065153 0.047211 -0.185195 0.305626 12.452289 -8.537021 12.897413 3.652378 -5.638501 10.291553 -0.624201 -4.363271 8.798929 -0.895484 3.114164 8.706623 -13.015443 7.644840 -10.131007 -7.753488 8.381293 -6.008514 -12.298010 1.854503 -1.687602 2.822390 -1.896179 -0.552010 0.108215 -0.106698 0.577784 -0.069780 0.287303 0.104293 -11.160137 -16.421246 -4.610118 14.126824 -1.905852 -3.442018 -15.352974 11.317345 -0.952855 -0.276235 -0.006753 -0.006018 -0.037793 -0.203557 -0.271825 +23.917660 156.880936 7.577765 3.635858 -2.996314 -16.444433 -7.990368 -6.281932 7.378393 -23.796600 7.970345 44.079601 -0.443616 0.148955 -0.098127 0.547156 0.214189 0.665587 5.968394 4.145527 -17.386885 12.070896 -2.459974 16.260868 -0.335538 -0.061054 0.062121 0.063255 -0.192392 0.288797 11.827845 -8.069633 12.835941 3.734097 -5.432897 10.364620 -0.277183 -4.170524 9.002407 -1.296627 2.593288 8.650102 -13.169559 7.001642 -10.244490 -8.438615 9.182777 -6.225212 -12.940074 2.511759 -1.765737 2.479276 -3.195770 -0.586702 0.122088 -0.121010 0.583306 -0.079201 0.285275 0.106246 -10.258843 -15.881330 -4.890172 13.244956 -0.917805 -3.141329 -14.945401 12.025268 -1.090425 -0.274869 -0.010445 -0.019491 -0.023750 -0.217901 -0.277901 +23.785475 157.166687 7.430794 3.742484 -3.022104 -16.182823 -8.155717 -5.972003 7.115982 -23.271181 7.831366 43.896961 -0.454370 0.166697 -0.093497 0.549135 0.199649 0.676859 6.399158 4.287436 -16.850082 11.069496 -2.047534 14.816210 -0.340110 -0.047780 0.054480 0.059340 -0.188815 0.287366 11.079630 -7.701436 12.968838 3.806796 -5.352726 10.448554 0.070969 -4.042615 9.084357 -1.837973 2.108558 9.006285 -12.976683 6.125064 -10.396426 -8.787158 9.857566 -6.270024 -14.229845 3.270169 -1.998384 3.380275 -4.951536 -0.670378 0.126871 -0.138003 0.599859 -0.091286 0.286247 0.103373 -9.521758 -15.276771 -5.001869 12.978760 -0.229275 -3.026392 -14.286368 13.509858 -1.280340 -0.273381 0.003472 -0.028202 -0.007353 -0.212008 -0.281228 +23.787437 157.497894 7.334952 3.916366 -2.999098 -15.497661 -8.379184 -5.687141 6.592358 -22.912998 7.669127 43.419495 -0.474225 0.205595 -0.103315 0.518960 0.159867 0.626114 6.770722 4.265765 -16.439150 9.820209 -1.645097 12.761703 -0.324324 -0.066942 0.048884 0.046597 -0.155477 0.297358 10.853627 -7.473538 12.355332 3.533782 -5.250336 10.355438 -0.090546 -3.914981 9.207302 -2.497175 2.057365 9.405300 -12.175316 5.221722 -9.648104 -9.085279 10.289204 -6.179782 -15.580684 4.047948 -2.249991 5.602591 -7.238420 -0.863319 0.100241 -0.130031 0.599009 -0.077603 0.256925 0.094417 -8.066611 -14.656738 -5.179974 12.438390 0.248389 -2.882872 -13.990202 15.914768 -1.600016 -0.292725 0.011596 -0.037084 -0.004163 -0.164923 -0.275547 +23.744059 157.821106 7.061959 3.966943 -2.758923 -14.997231 -8.255903 -5.275952 6.219133 -22.613592 7.577706 42.818169 -0.486116 0.206624 -0.111840 0.507172 0.149262 0.588332 7.219385 4.358348 -16.288055 8.392530 -1.305886 11.431644 -0.322421 -0.045340 0.054456 0.039325 -0.143085 0.286862 11.052332 -7.310450 12.500518 3.238065 -4.955773 10.136659 -0.594737 -3.594270 8.804580 -3.663041 2.154204 9.779023 -11.004403 4.005689 -10.240213 -8.505431 10.448475 -5.773791 -18.117880 4.637877 -2.785499 6.715659 -8.673582 -1.064377 0.112852 -0.150194 0.621550 -0.096954 0.254000 0.094244 -7.738446 -13.803526 -4.988966 13.479264 0.211893 -3.157707 -13.342627 17.015072 -1.690594 -0.298428 0.048389 -0.043107 0.020931 -0.138038 -0.265213 +23.739830 157.988235 6.865539 3.915880 -1.910652 -14.186563 -8.201230 -5.107973 5.733835 -22.151482 7.343387 42.362785 -0.511901 0.222026 -0.109240 0.485651 0.130104 0.557590 7.463756 4.280293 -16.385405 7.268109 -1.066722 9.818549 -0.300969 -0.027601 0.069566 0.044621 -0.111182 0.250634 11.261729 -7.288606 11.584753 2.795177 -4.878383 9.998405 -1.089216 -3.528922 8.968927 -4.448556 2.584807 9.904210 -9.842669 3.384850 -10.298676 -7.812850 10.518723 -5.223654 -20.149229 5.139461 -3.193446 7.856315 -11.169394 -1.391444 0.107171 -0.194572 0.631180 -0.096747 0.227661 0.093443 -6.759946 -12.934830 -5.323911 13.938816 1.061456 -3.255354 -12.383081 17.219070 -1.687908 -0.312584 0.083752 -0.078546 0.069793 -0.114924 -0.264587 +23.636047 158.111359 6.496283 3.929877 -0.941418 -13.533870 -7.996876 -4.990278 5.135885 -21.927469 7.293117 42.274246 -0.549865 0.234974 -0.117861 0.492396 0.136284 0.549065 7.582891 4.309534 -16.800430 6.249775 -0.886080 8.812644 -0.297516 -0.018000 0.073336 0.065061 -0.097271 0.230101 10.937512 -7.263999 11.058602 2.400058 -4.923978 10.019734 -1.322454 -3.577488 9.265025 -5.040269 3.045179 9.654984 -8.846375 2.926775 -11.206724 -7.393446 10.881449 -5.031012 -22.179565 5.405029 -3.609457 8.773015 -13.110270 -1.729870 0.110542 -0.218408 0.653744 -0.105067 0.216663 0.095752 -5.507053 -12.225116 -6.204278 14.523633 2.753454 -3.305740 -11.148066 16.988642 -1.627354 -0.333915 0.102853 -0.105414 0.105213 -0.102960 -0.270973 +23.484468 158.164917 6.072131 3.986720 0.293346 -12.739963 -7.654302 -4.882473 4.416079 -21.998569 7.350576 42.115250 -0.547735 0.250104 -0.097882 0.497172 0.134265 0.534943 7.582975 4.293560 -17.427608 5.116940 -0.724834 7.756304 -0.291911 -0.022962 0.084830 0.069134 -0.063990 0.225600 10.813659 -7.430016 10.891404 1.969849 -4.983264 9.676713 -1.745103 -3.714412 8.829390 -5.708045 3.450609 9.289143 -7.832101 2.426238 -10.875951 -7.104867 11.702751 -5.084884 -23.953802 5.307051 -3.929873 8.978323 -14.319538 -1.925886 0.110809 -0.216004 0.649272 -0.098411 0.199108 0.117064 -4.346658 -11.749608 -7.279705 15.521336 4.790210 -3.314195 -9.785967 16.417763 -1.509638 -0.339683 0.096390 -0.114652 0.124657 -0.105852 -0.257998 +23.341188 158.157196 5.580336 3.775319 1.672165 -11.777369 -7.033292 -4.788127 3.521564 -22.137239 7.445682 41.968452 -0.515993 0.230168 -0.089332 0.507043 0.161869 0.500739 7.698678 4.313052 -18.264874 4.180147 -0.594026 6.658639 -0.287723 -0.032990 0.084378 0.080215 -0.046340 0.222400 11.285539 -7.720548 10.262361 1.398567 -4.948231 9.393126 -2.533347 -3.817032 8.643242 -6.390893 4.103488 8.806616 -6.189029 1.904761 -10.325876 -6.523434 12.216082 -4.812400 -25.931305 5.195932 -4.311809 8.751471 -15.619110 -2.088205 0.126039 -0.166522 0.616119 -0.100764 0.185453 0.138669 -3.088890 -11.064935 -8.197205 16.603577 6.510370 -3.252963 -7.919317 15.592102 -1.325857 -0.327689 0.067163 -0.094621 0.116711 -0.113256 -0.226546 +23.089725 158.086304 5.018661 4.015799 3.678971 -10.785007 -6.931099 -4.929534 2.397871 -21.978741 7.430902 42.452541 -0.477851 0.208516 -0.066912 0.530927 0.204815 0.492551 7.210684 4.170346 -19.322847 3.342558 -0.494656 5.710546 -0.292831 -0.040698 0.091523 0.097800 -0.031054 0.223175 10.415236 -7.448551 9.125325 1.036125 -4.891435 9.295308 -2.451778 -3.881030 9.031610 -6.138915 3.527831 8.738290 -4.978232 1.146277 -9.697126 -6.564608 12.156527 -4.697127 -27.791201 4.649632 -4.682385 8.688181 -17.831499 -2.418213 0.138719 -0.133231 0.580192 -0.096196 0.185097 0.170602 -1.508436 -10.180712 -8.818911 17.569128 7.265364 -3.296164 -6.512549 14.376296 -1.200077 -0.317080 0.034944 -0.071596 0.116870 -0.142780 -0.195621 +22.933704 158.056152 4.401904 4.110227 5.690945 -10.244308 -6.929873 -5.036515 1.840681 -21.676477 7.306552 42.726692 -0.495579 0.220861 -0.066152 0.528701 0.203812 0.481851 6.676253 3.980944 -19.938200 2.722808 -0.462652 4.965367 -0.286320 -0.041199 0.094890 0.107734 -0.015076 0.212900 10.124492 -7.383855 8.667751 0.654095 -4.869855 9.284740 -2.775603 -3.868451 9.219626 -6.245075 2.965687 8.491001 -4.417862 0.373769 -10.003896 -7.289856 11.837891 -4.838820 -28.685011 4.091335 -4.803697 8.299001 -20.205982 -2.751060 0.133615 -0.147711 0.582997 -0.093395 0.173413 0.173023 -0.020337 -9.361313 -9.387289 18.991123 7.890006 -3.470946 -5.426448 13.439445 -1.115033 -0.329365 0.042717 -0.086118 0.138532 -0.134594 -0.193994 +22.788465 158.074020 3.655849 3.989285 7.949725 -9.934842 -7.068533 -5.204543 1.643520 -20.526823 6.693830 42.749378 -0.508891 0.215092 -0.072599 0.543176 0.224990 0.481077 6.195630 3.750312 -20.308958 2.124880 -0.445103 4.174116 -0.292244 -0.030613 0.096160 0.123765 -0.016537 0.204749 10.131637 -7.436130 8.328128 0.316831 -4.869542 9.379216 -3.204801 -3.871868 9.497863 -6.320107 2.476312 8.564158 -3.651485 -0.358465 -10.802533 -8.144701 11.110174 -5.017533 -29.684099 3.367062 -4.971554 8.151765 -21.797413 -3.052512 0.144774 -0.157932 0.594302 -0.105054 0.179071 0.178167 1.288811 -8.415938 -9.779671 20.788771 8.305515 -3.690272 -4.315142 12.585699 -1.044921 -0.337616 0.052764 -0.089072 0.156108 -0.136386 -0.191363 +22.615467 158.106491 2.890676 3.769262 10.142946 -9.510277 -6.915069 -5.322228 1.394679 -19.605961 6.208193 42.629673 -0.510372 0.215335 -0.076032 0.543365 0.226132 0.487787 5.713652 3.548740 -20.770416 1.664305 -0.443494 3.353856 -0.290367 -0.026321 0.090741 0.126217 -0.022510 0.201783 10.316546 -7.432814 8.029937 0.058176 -4.764056 9.331895 -3.617023 -3.772039 9.562066 -6.183808 1.687234 8.672363 -3.677676 -0.877481 -10.900681 -9.766968 10.159907 -5.444710 -30.188738 2.365940 -5.018300 8.369763 -23.435642 -3.397267 0.143089 -0.161792 0.589737 -0.107632 0.179003 0.170278 2.599916 -7.522945 -9.998303 22.741796 8.443540 -3.925492 -3.408916 12.107288 -1.021405 -0.335550 0.055184 -0.087100 0.157698 -0.134709 -0.192863 +22.281652 158.083267 2.035510 3.618756 12.252890 -9.076368 -6.690907 -5.411732 1.122130 -18.549414 5.688759 42.417320 -0.538027 0.242453 -0.073322 0.554020 0.229933 0.479347 4.936792 3.344814 -21.383074 1.699067 -0.449997 2.620759 -0.284977 -0.039939 0.098484 0.144329 0.004372 0.199168 9.816666 -6.962046 7.528543 -0.039398 -4.484248 9.457363 -3.540447 -3.473099 9.998437 -6.029660 0.806877 8.952204 -2.826485 -1.948157 -10.763220 -11.109665 9.095212 -6.498713 -30.926548 0.077262 -4.825849 7.688038 -24.054075 -3.533066 0.132304 -0.169422 0.593304 -0.095621 0.161164 0.183734 4.921353 -6.842754 -10.428096 23.844744 8.481438 -4.067387 -2.322381 12.109526 -1.006630 -0.362359 0.050860 -0.103329 0.180925 -0.129467 -0.191675 +21.957394 158.036362 1.142491 3.550957 14.287050 -8.726614 -6.379864 -5.428999 0.794932 -17.746920 5.337739 42.294090 -0.535887 0.226656 -0.084761 0.580355 0.268597 0.482841 4.350528 3.155591 -21.945658 1.090674 -0.427852 1.924945 -0.299845 -0.040489 0.085117 0.164848 -0.009739 0.206339 9.103741 -6.473783 7.299942 -0.109634 -4.198224 9.543425 -3.346781 -3.215122 10.306419 -5.728807 -0.407918 9.457000 -2.026471 -3.029159 -11.204853 -12.260705 8.086427 -7.409365 -32.157204 -2.181705 -4.767282 6.970241 -24.860491 -3.664497 0.148826 -0.147639 0.590159 -0.109668 0.176054 0.190158 6.565689 -5.866500 -10.769029 25.746321 8.863983 -4.256690 -1.788428 11.721493 -1.041462 -0.361173 0.037906 -0.084140 0.174698 -0.139571 -0.180529 +21.600687 157.879700 0.259337 3.490875 16.290594 -8.369267 -6.123561 -5.512448 0.225715 -16.835335 4.993694 42.538658 -0.529575 0.207246 -0.086186 0.615729 0.312163 0.498897 3.516533 3.003710 -22.705107 0.668865 -0.408122 1.784638 -0.314774 -0.037352 0.088549 0.183948 -0.024658 0.213033 8.206921 -5.884849 7.235759 -0.100704 -3.860188 9.605570 -2.969213 -2.920262 10.506064 -5.384141 -1.912697 9.630924 -1.621377 -4.116765 -11.796526 -13.357919 6.874176 -8.138259 -33.406586 -4.287539 -4.698488 5.737362 -26.136980 -3.716217 0.166870 -0.136341 0.588231 -0.119701 0.193111 0.204740 7.898942 -4.715439 -10.719953 27.507015 9.022906 -4.338861 -0.610406 11.896057 -1.024677 -0.364636 0.026022 -0.063349 0.172629 -0.162706 -0.171987 +21.222399 157.739349 -0.618976 3.340810 18.523157 -8.042706 -5.865916 -5.697076 -0.416960 -15.923670 4.634014 42.836346 -0.536444 0.210563 -0.089110 0.599900 0.297343 0.479028 2.465173 2.803395 -23.360516 0.585940 -0.401643 1.831574 -0.303996 -0.036967 0.085269 0.181694 -0.016078 0.199682 7.528837 -5.509830 7.462965 -0.149009 -3.666417 9.473260 -2.767115 -2.749368 10.227280 -5.084553 -2.815793 9.776386 -0.847751 -4.947966 -11.539871 -14.476995 5.471475 -8.519284 -34.511204 -5.950130 -4.605996 4.380730 -27.435734 -3.686648 0.166957 -0.139515 0.586323 -0.121440 0.179011 0.199476 9.410004 -3.304622 -10.528950 29.007563 9.310977 -4.369510 0.753923 12.473527 -0.974835 -0.365232 0.031272 -0.074194 0.179254 -0.149632 -0.170004 +20.778021 157.671585 -1.532560 3.287005 20.838064 -7.844714 -5.518689 -5.826994 -0.980344 -15.070426 4.300341 42.896290 -0.534537 0.212007 -0.085149 0.596286 0.289448 0.476515 1.264955 2.684575 -24.172754 0.426945 -0.366344 2.753053 -0.300671 -0.028023 0.083905 0.178467 -0.011404 0.191490 6.621900 -5.139517 7.803907 -0.199702 -3.535221 9.445150 -2.494071 -2.652894 10.059346 -4.773354 -3.821144 10.110120 -0.015896 -5.843062 -11.397410 -15.678273 3.577830 -8.493804 -35.572437 -7.095898 -4.682981 3.000078 -29.461643 -3.713570 0.172351 -0.146007 0.587641 -0.127482 0.174582 0.198836 11.145553 -1.264125 -10.237552 30.348742 9.749285 -4.419700 1.657949 12.984951 -0.966791 -0.360956 0.037398 -0.078080 0.186802 -0.148174 -0.167314 +20.261976 157.702515 -2.481036 3.256681 22.984734 -7.872527 -5.162873 -5.859348 -1.408191 -14.382940 4.094215 42.937103 -0.539098 0.207744 -0.082608 0.600674 0.291186 0.468888 -0.207190 2.664389 -25.038120 0.797997 -0.322369 4.699804 -0.302919 -0.010965 0.090315 0.180230 -0.005879 0.179071 5.797762 -4.752203 8.556449 -0.271644 -3.353103 9.426964 -2.341650 -2.505987 9.730827 -4.784332 -4.614678 10.739384 1.244864 -6.861841 -11.686688 -16.594900 1.732789 -8.498295 -36.596138 -8.472041 -4.625274 1.232092 -31.370882 -3.566630 0.189349 -0.161561 0.603688 -0.141620 0.176454 0.207889 12.708038 1.014437 -10.021794 31.675770 10.688722 -4.352881 2.392825 12.995306 -0.928877 -0.362566 0.053165 -0.085564 0.205371 -0.149643 -0.162833 +19.763088 157.805084 -3.386162 2.829273 25.304111 -7.843194 -4.616441 -5.980406 -2.100504 -13.393435 3.729141 42.964241 -0.530055 0.178920 -0.086158 0.605119 0.311920 0.469364 -1.889207 2.667138 -26.108799 1.948417 -0.339328 6.981335 -0.311025 0.009784 0.090043 0.183934 -0.022455 0.166879 5.214069 -4.490573 9.074948 -0.133009 -3.294852 9.350096 -1.899279 -2.502079 9.444696 -4.713366 -5.866538 11.395557 1.495125 -7.722886 -12.131602 -17.307749 0.277800 -8.493655 -38.308933 -10.029378 -4.505558 -0.954443 -33.294331 -3.227742 0.209214 -0.176359 0.606336 -0.159298 0.193554 0.207459 13.183927 3.151016 -9.768736 33.386993 11.832898 -4.183924 3.019323 13.261099 -0.913734 -0.352236 0.068232 -0.076462 0.214183 -0.157738 -0.155035 +19.322313 157.937271 -4.257771 2.484049 27.977200 -7.751638 -4.311097 -6.176940 -2.884927 -12.196054 3.263193 43.070892 -0.541206 0.169968 -0.093550 0.598434 0.308080 0.448574 -3.990055 2.576065 -27.252754 3.420485 -0.471439 9.995322 -0.312175 0.030379 0.093349 0.182591 -0.019568 0.149795 4.723536 -4.344171 9.331675 -0.129103 -3.378669 9.279859 -1.612962 -2.613530 9.213121 -4.821572 -6.535404 12.433414 2.953179 -8.676460 -12.525736 -17.024481 -0.717313 -8.231140 -41.065678 -11.602469 -4.369796 -2.967537 -36.218510 -3.001929 0.227194 -0.198091 0.630069 -0.177501 0.196757 0.209210 13.138674 5.245288 -9.554245 35.690285 13.279067 -3.963859 3.592250 13.918047 -0.905734 -0.354573 0.095316 -0.088315 0.233263 -0.148248 -0.152201 +18.907169 158.158401 -4.995666 1.865449 30.718611 -7.708497 -3.815501 -6.392940 -3.783800 -10.971092 2.815003 43.304989 -0.534970 0.167854 -0.084985 0.606785 0.311432 0.452643 -6.223923 2.558901 -28.502472 5.851733 -0.823917 13.767307 -0.316229 0.043373 0.094435 0.182772 -0.014767 0.144054 4.592986 -4.333395 9.320169 -0.114940 -3.472768 9.247038 -1.439753 -2.778500 9.155622 -4.868971 -7.447747 13.027915 3.870798 -9.664237 -12.613807 -17.200693 -1.608177 -8.112102 -43.106060 -13.259000 -4.006097 -5.770580 -39.520477 -2.308715 0.240749 -0.203619 0.634872 -0.188184 0.199478 0.218125 13.289014 7.497856 -9.622794 37.697971 15.197155 -3.475591 4.001468 13.937556 -0.895281 -0.348751 0.100176 -0.087928 0.244808 -0.156016 -0.145232 +18.343428 158.626251 -5.854055 1.354488 33.492352 -8.010381 -3.657483 -6.613099 -4.373858 -9.373219 2.160142 43.303696 -0.573775 0.160410 -0.114128 0.631004 0.333316 0.470132 -8.697450 2.512557 -29.453897 9.226365 -1.555251 18.160492 -0.334760 0.066750 0.087823 0.200052 -0.042485 0.139982 4.095198 -4.177905 10.162710 0.115392 -3.627291 9.343244 -0.937899 -2.929913 9.061774 -4.925704 -8.555503 13.678267 4.634355 -10.417125 -14.409803 -18.023531 -3.492726 -7.916337 -44.503078 -14.743550 -3.742747 -8.245678 -43.131371 -1.610453 0.262669 -0.227501 0.681649 -0.217857 0.224401 0.210756 13.618281 10.377492 -9.356873 38.796154 16.679996 -3.279438 4.152055 15.609466 -0.961879 -0.365449 0.127999 -0.095035 0.258298 -0.153785 -0.161440 +17.621674 159.201157 -6.829165 0.799060 36.031700 -8.099056 -3.281379 -6.738570 -5.465189 -7.982557 1.680459 43.266087 -0.566937 0.115050 -0.133147 0.660233 0.386010 0.471406 -11.225476 2.588183 -30.847837 13.429811 -2.744313 22.998085 -0.355908 0.096970 0.083642 0.217307 -0.070753 0.133214 3.846922 -3.873697 10.806840 0.361600 -3.546401 9.458077 -0.480839 -2.924969 9.071146 -5.239531 -9.521555 14.326625 6.134569 -11.360838 -16.173449 -17.974445 -5.779720 -7.498515 -46.566113 -16.905218 -3.198153 -9.844667 -46.421879 -1.112694 0.299874 -0.225781 0.696549 -0.253184 0.255485 0.214203 13.410293 13.657501 -8.780685 39.728176 17.928946 -3.231884 3.462525 18.221159 -1.250502 -0.358443 0.144400 -0.071750 0.262768 -0.165974 -0.149281 +17.171635 159.773895 -7.603308 -0.032820 38.894947 -8.414475 -2.958220 -6.839622 -6.135656 -6.211365 0.963992 42.859600 -0.571935 0.092545 -0.145623 0.692347 0.433616 0.478547 -13.706189 2.448046 -31.291513 18.053425 -4.395908 26.954058 -0.385581 0.120470 0.080358 0.237111 -0.084937 0.139118 4.136022 -3.832840 10.867440 0.535374 -3.585797 9.711209 -0.327272 -2.992548 9.469954 -5.224710 -10.536887 14.897994 7.549404 -12.029225 -18.052181 -17.926872 -8.213971 -6.929181 -48.450596 -19.065207 -2.565194 -11.832041 -51.055241 -0.311980 0.324362 -0.234166 0.723374 -0.279122 0.291380 0.226534 12.128415 17.020140 -8.116495 40.463005 19.111759 -3.092690 3.265156 21.091084 -1.503549 -0.363474 0.163179 -0.058007 0.277903 -0.177584 -0.140358 +16.689190 160.645325 -8.259390 -0.986604 41.164921 -9.050812 -2.338379 -6.536524 -6.123587 -4.565276 0.398401 41.492256 -0.598095 0.095629 -0.174320 0.713298 0.455097 0.479037 -15.436587 2.733941 -31.114683 22.152109 -6.075501 30.274235 -0.401053 0.138537 0.068341 0.251989 -0.092328 0.146244 4.486831 -3.650137 10.774572 0.768417 -3.542802 10.123421 -0.219267 -2.918562 10.168700 -5.561408 -11.080263 15.945494 9.239957 -12.714532 -19.686199 -17.813103 -11.346509 -6.293537 -49.703735 -21.218960 -1.877871 -13.144697 -54.774200 0.236067 0.335323 -0.241181 0.755782 -0.301869 0.309840 0.221561 11.018990 20.890614 -7.532472 40.089783 20.403116 -3.088251 2.579782 23.512043 -1.844808 -0.375570 0.188226 -0.054556 0.289759 -0.164476 -0.140813 +16.066856 161.580490 -8.824518 -1.853320 43.062630 -9.441301 -1.339475 -6.037842 -6.332682 -3.387012 0.132577 39.805664 -0.619465 0.109737 -0.177787 0.722688 0.471034 0.472999 -16.483078 3.285605 -30.935383 25.272814 -7.653162 33.403931 -0.400728 0.145437 0.068078 0.273476 -0.072611 0.136654 4.428743 -3.256482 10.213517 0.996265 -3.393944 10.690474 0.089975 -2.768482 11.277493 -5.710121 -11.815079 16.473843 10.322266 -13.455010 -20.496716 -17.237873 -14.124852 -6.098426 -50.826546 -24.112024 -0.599019 -13.688970 -57.544189 0.584880 0.330893 -0.263808 0.761597 -0.302538 0.305991 0.227099 9.987198 23.809050 -7.424174 38.840832 21.946421 -3.125399 2.746468 27.756496 -2.139348 -0.388964 0.203511 -0.066864 0.324018 -0.157679 -0.133831 +15.431815 162.631470 -9.463816 -3.073774 44.850723 -9.905937 -0.344240 -5.578189 -6.716943 -1.911630 -0.279858 37.920002 -0.623508 0.096479 -0.165812 0.744080 0.513826 0.461181 -16.938362 3.848876 -30.790859 28.068054 -9.270862 36.143795 -0.402151 0.150942 0.079236 0.306245 -0.052972 0.110588 5.211053 -3.336648 9.509777 1.031199 -3.293776 11.254478 -0.178179 -2.707068 12.427032 -5.961352 -12.370652 16.709988 11.296601 -14.166090 -21.112555 -16.655561 -16.645897 -5.943945 -51.455486 -26.810942 0.572534 -13.033577 -60.670258 0.385723 0.345693 -0.273928 0.750689 -0.306151 0.298678 0.253007 8.647395 26.343460 -7.789784 38.213287 23.906502 -3.027874 2.377561 31.528460 -2.609058 -0.397251 0.200191 -0.074216 0.363389 -0.172271 -0.115292 +14.853101 163.563324 -10.080289 -3.933380 46.278973 -9.955809 0.413590 -5.102113 -7.086916 -0.932157 -0.491077 35.874622 -0.639863 0.111243 -0.174512 0.760998 0.540621 0.437238 -17.193575 4.362242 -30.709711 30.442806 -10.772586 38.339657 -0.402071 0.133349 0.080059 0.331685 -0.029798 0.119525 6.140442 -3.352044 8.535958 0.901594 -3.103024 11.807942 -0.672497 -2.527911 13.692346 -6.163641 -12.825690 16.548044 12.354906 -14.784432 -21.978983 -15.088415 -18.759619 -6.019587 -52.421284 -29.914448 2.272311 -11.611681 -64.063637 -0.263262 0.338116 -0.257264 0.743823 -0.298166 0.289532 0.268452 7.017131 28.010439 -8.476720 38.743263 26.015669 -2.845664 1.119649 35.386250 -3.466334 -0.418539 0.190524 -0.071105 0.376006 -0.163420 -0.099423 +14.262692 164.465393 -10.662485 -4.394501 47.968857 -9.604960 0.657915 -4.733649 -7.321080 0.089162 -0.752888 33.365192 -0.668674 0.165574 -0.183821 0.742590 0.521443 0.398544 -17.627085 4.568457 -30.288893 32.563927 -12.124274 39.766102 -0.385010 0.102899 0.073843 0.338087 0.019461 0.138895 6.942648 -3.350641 7.566299 0.700247 -2.982768 12.279763 -1.249782 -2.383368 14.820922 -6.096032 -13.441024 15.856439 13.158281 -15.428647 -22.558655 -13.408677 -20.584801 -6.537934 -52.518108 -33.455959 4.535246 -10.482761 -66.780449 -0.520075 0.292532 -0.255472 0.731951 -0.268361 0.261156 0.263346 5.890178 28.982708 -9.354383 39.226479 28.550785 -2.334633 -0.334999 38.468678 -4.334949 -0.444521 0.194979 -0.081779 0.392443 -0.121912 -0.086680 +13.720578 165.351089 -11.217707 -4.691928 49.484642 -9.036269 0.941338 -4.341800 -7.423440 0.383917 -0.763143 30.667219 -0.694495 0.208821 -0.179007 0.735090 0.526543 0.351110 -17.716873 4.716155 -29.748976 33.810562 -13.147319 41.044502 -0.360803 0.067176 0.078932 0.368001 0.079686 0.134477 7.611152 -3.423563 6.156785 0.419732 -2.923985 12.849116 -1.851515 -2.331616 16.350416 -5.897556 -13.818178 14.803720 14.000675 -16.115679 -22.806025 -11.285778 -21.951818 -7.596064 -52.932182 -37.586761 7.357834 -7.134709 -67.640076 -2.259878 0.257978 -0.250388 0.700944 -0.234961 0.218763 0.279734 4.518273 29.397842 -10.628153 39.539623 31.923159 -1.339439 -2.295041 41.609447 -5.461801 -0.473009 0.181154 -0.101665 0.427437 -0.097784 -0.064249 +13.206133 166.135834 -11.689218 -4.721579 50.519264 -8.231894 1.369676 -3.931972 -7.428536 0.069967 -0.589116 27.996649 -0.705249 0.243011 -0.159639 0.734859 0.538727 0.313279 -17.462400 4.917012 -29.297411 34.568932 -14.030864 42.485584 -0.340604 0.034988 0.090503 0.395314 0.141447 0.127457 7.829512 -3.335648 4.849782 0.209402 -2.813303 13.250191 -2.196557 -2.252837 17.614441 -5.549158 -14.082881 13.704345 14.663925 -16.709972 -22.696003 -8.531152 -23.391979 -8.679949 -53.343193 -41.482845 10.101558 -1.912550 -67.067848 -5.372011 0.229854 -0.244411 0.663624 -0.201570 0.178161 0.305315 2.932108 29.817005 -11.610174 39.405567 34.995018 -0.163858 -3.843818 44.598351 -6.436661 -0.494800 0.160975 -0.116155 0.464488 -0.087584 -0.037675 +12.806966 166.813156 -12.108746 -4.765068 51.619850 -7.472770 1.687264 -3.538800 -7.139813 -0.021548 -0.550014 24.713989 -0.711897 0.259648 -0.139709 0.757639 0.578440 0.300162 -16.783701 4.947324 -28.501793 34.548111 -14.707168 43.973442 -0.337574 -0.001493 0.097800 0.436337 0.177332 0.123631 7.923903 -3.287674 3.454765 0.036565 -2.742622 13.537065 -2.399040 -2.254027 18.830299 -4.749619 -14.726138 12.635323 14.308443 -17.039587 -22.261341 -6.170968 -24.408869 -9.756115 -53.373894 -45.434513 12.881877 4.733017 -65.473183 -9.183408 0.214087 -0.222208 0.624443 -0.173738 0.153593 0.339315 0.880408 30.138102 -12.370649 39.587921 37.750633 1.172552 -6.238890 47.454464 -7.925097 -0.517609 0.118406 -0.120527 0.489027 -0.100248 -0.018800 +12.485918 167.349182 -12.455145 -4.546903 52.472927 -6.440916 1.790508 -3.155471 -6.712024 0.006666 -0.538840 21.043997 -0.741445 0.317358 -0.127913 0.740768 0.552199 0.279518 -16.014681 4.871949 -27.506166 34.232586 -15.069905 44.868546 -0.301013 -0.040530 0.099281 0.454912 0.228842 0.111434 8.023895 -3.151315 2.042318 -0.236207 -2.600844 13.690130 -2.729212 -2.113617 19.842817 -4.128011 -15.161515 11.507362 13.993971 -17.594133 -21.337301 -3.516108 -24.910122 -10.827344 -53.465519 -49.066177 15.660485 10.845249 -62.916119 -12.373714 0.171895 -0.221116 0.588836 -0.134309 0.096760 0.341677 -0.983713 29.978006 -12.921232 39.739288 40.512497 2.811495 -8.581274 50.315239 -9.412786 -0.540438 0.094500 -0.153488 0.514443 -0.079074 -0.016819 +12.185399 167.680847 -12.770546 -4.199746 53.300293 -5.104796 2.011855 -2.797463 -6.613676 -0.297071 -0.445910 17.846504 -0.766706 0.393060 -0.121096 0.698258 0.501681 0.214382 -15.122671 4.816261 -26.472750 33.415573 -15.000266 45.211437 -0.256473 -0.096737 0.093961 0.458889 0.304505 0.116285 8.007273 -2.930420 0.612796 -0.493445 -2.432881 13.695381 -2.954969 -1.909390 20.669956 -3.729801 -15.489372 10.222374 14.363081 -18.483309 -20.452068 -0.516053 -24.818974 -11.770927 -55.440075 -52.854946 19.578350 17.035805 -60.294605 -15.535601 0.114273 -0.199549 0.545407 -0.085207 0.027928 0.342457 -2.414251 29.132845 -13.523192 40.007385 43.564026 4.947254 -10.685788 52.179882 -10.543545 -0.563612 0.071504 -0.182300 0.530502 -0.029085 0.001265 +11.827415 167.908798 -13.025373 -3.258121 54.340790 -3.223927 1.884056 -2.521969 -6.641483 -0.738588 -0.356498 15.033443 -0.786429 0.462044 -0.113364 0.672532 0.466679 0.157387 -14.276792 4.649783 -25.241364 31.972466 -14.392402 44.932030 -0.219025 -0.165812 0.096303 0.466160 0.372005 0.135307 7.085906 -2.563354 -0.670349 -0.628186 -2.313606 13.572267 -2.657947 -1.830939 21.292379 -2.972504 -15.984257 8.863647 14.277975 -19.240900 -19.270519 2.247758 -24.691788 -12.692981 -57.466736 -56.847778 24.138208 21.543144 -57.074776 -17.199856 0.058151 -0.159590 0.499103 -0.029841 -0.035013 0.353270 -3.120981 28.574865 -13.730799 39.697868 46.499565 6.885114 -13.931258 53.517982 -12.202740 -0.594531 0.029750 -0.197572 0.529147 0.007511 0.017945 +11.576501 168.005081 -13.240208 -2.372653 54.892162 -1.302026 1.798462 -2.161704 -6.592886 -1.374662 -0.240132 12.139935 -0.785975 0.504077 -0.088770 0.659712 0.475048 0.084610 -13.029270 4.599431 -23.689720 29.901279 -12.982606 43.378571 -0.176936 -0.230933 0.113545 0.496891 0.453736 0.130870 6.270736 -2.257029 -2.202848 -0.801386 -2.127399 13.521660 -2.435039 -1.698844 22.225773 -2.369886 -16.387335 7.009543 14.367639 -20.225208 -18.367674 4.681623 -23.712393 -13.480686 -61.294563 -60.470791 29.778421 25.807856 -54.062775 -18.728111 0.013014 -0.118481 0.420013 0.027117 -0.106332 0.385430 -3.867907 27.760944 -14.162540 39.734589 49.959095 9.323121 -17.782619 54.002815 -14.106361 -0.620794 -0.021250 -0.204888 0.553346 0.026988 0.059859 +11.298621 167.994858 -13.368040 -0.792905 55.117901 0.992292 1.331171 -1.825020 -6.295365 -2.043552 -0.140157 9.480446 -0.806420 0.542573 -0.069253 0.657416 0.492128 0.048487 -12.006227 4.464552 -21.888779 27.517517 -11.207448 40.990120 -0.151873 -0.275528 0.123679 0.536979 0.516732 0.115415 4.665720 -1.940511 -3.655426 -1.080963 -2.009114 13.416307 -2.087149 -1.627495 23.073221 -1.301061 -16.551044 5.809267 13.975609 -20.398928 -17.605257 7.058963 -22.867157 -14.088727 -64.752594 -63.495991 35.174774 29.102512 -50.911228 -19.560602 -0.026070 -0.111168 0.369820 0.071671 -0.156600 0.410573 -5.647641 27.745802 -14.611363 40.926132 53.300507 11.981313 -22.539183 52.508587 -16.325834 -0.650313 -0.053849 -0.229089 0.595152 0.036668 0.080354 +11.044272 167.863754 -13.506510 0.689970 55.309681 3.017497 0.712117 -1.525772 -5.918084 -2.489396 -0.095539 7.264932 -0.796555 0.562162 -0.039260 0.664602 0.518503 -0.000107 -10.791027 4.340140 -19.392477 24.839870 -8.935286 36.903790 -0.134061 -0.318434 0.134922 0.569795 0.577360 0.106810 3.188261 -1.623040 -4.846014 -1.245507 -1.824696 13.449485 -1.734775 -1.503938 23.828091 -0.655398 -16.558241 4.449826 14.372648 -20.930107 -17.078518 9.612616 -22.311209 -14.395437 -66.392403 -65.933136 39.015152 32.935078 -49.109322 -21.000660 -0.040477 -0.070331 0.312961 0.102478 -0.202122 0.452650 -6.989347 28.121992 -15.001750 39.929863 56.287239 13.442595 -25.634418 50.352642 -17.219332 -0.663450 -0.102301 -0.232946 0.620826 0.034268 0.118344 +10.683971 167.607010 -13.641575 2.301018 55.495644 5.225068 0.136649 -1.301191 -6.003906 -3.139930 -0.030604 5.361740 -0.791643 0.598247 -0.007455 0.636454 0.498858 -0.056506 -9.415196 4.088541 -16.926962 21.280912 -6.608449 32.432419 -0.101092 -0.366363 0.156036 0.573975 0.645436 0.102147 1.486730 -1.276938 -5.811574 -1.339177 -1.625680 13.308718 -1.164265 -1.270748 24.099091 0.122562 -16.696753 3.312419 13.982677 -21.384287 -15.820205 11.485244 -22.223478 -14.397874 -67.658150 -67.822037 42.112904 35.702618 -47.122803 -21.767176 -0.081452 -0.054435 0.259550 0.152341 -0.258025 0.476082 -8.356370 28.885790 -14.853574 37.338409 58.112141 13.393728 -28.892778 48.827816 -18.279493 -0.682336 -0.132696 -0.248042 0.640709 0.051143 0.143560 +10.433165 167.313736 -13.822708 3.085291 55.201031 6.583440 -0.182547 -1.107644 -6.131724 -3.486523 -0.002874 3.804310 -0.774682 0.613866 0.017077 0.615278 0.481965 -0.093948 -7.659652 3.835726 -14.356615 17.591459 -4.572694 27.843292 -0.079045 -0.387056 0.167921 0.568818 0.686795 0.096004 0.669106 -0.811065 -6.553516 -1.355054 -1.195394 13.194625 -0.869005 -0.763251 24.211855 0.569497 -17.043695 2.612498 14.208424 -21.997995 -15.270849 12.650104 -22.158976 -14.445641 -70.607552 -69.651314 46.479816 36.791348 -44.981388 -21.559603 -0.098274 -0.040712 0.222557 0.175401 -0.292177 0.490606 -9.119526 28.959354 -14.593018 34.873951 59.328346 13.131479 -30.959402 48.125580 -18.858667 -0.681409 -0.148675 -0.252443 0.651665 0.059984 0.165620 +10.168530 166.994415 -13.932798 3.440435 54.120106 7.253881 -0.327975 -0.966965 -6.204790 -3.845398 0.030914 2.937017 -0.768880 0.620936 0.033052 0.599479 0.476993 -0.131315 -5.748344 3.571602 -11.632558 13.994715 -2.931813 23.635168 -0.055769 -0.409885 0.177687 0.576763 0.718004 0.079172 0.054127 -0.220166 -7.222698 -1.366285 -0.596868 13.257779 -0.665200 -0.087652 24.573917 0.785538 -17.182543 1.930159 14.138578 -22.439123 -14.657471 13.215646 -22.514431 -14.361300 -72.916046 -71.137932 49.822723 38.065071 -42.924686 -21.498182 -0.108553 -0.025506 0.186367 0.194525 -0.328299 0.503421 -9.584297 29.608854 -14.482474 32.095570 60.248268 12.352732 -31.489964 47.351395 -18.650467 -0.685298 -0.170123 -0.262035 0.663012 0.066536 0.182081 +9.876453 166.776535 -14.079514 3.705465 52.135876 7.563731 -0.634769 -0.985742 -6.384923 -3.967617 0.028612 2.851323 -0.733407 0.593263 0.055491 0.613572 0.508526 -0.152162 -4.228597 3.184979 -9.141521 10.468566 -1.651037 19.803923 -0.055230 -0.414818 0.191513 0.586018 0.730800 0.069975 -0.178917 0.590098 -7.646791 -1.499009 0.337605 13.456400 -0.790496 0.859650 24.964397 0.559576 -16.949734 1.702214 14.728318 -22.738453 -14.576132 13.943546 -22.919796 -14.628919 -73.628769 -72.062859 51.199928 37.536575 -41.313354 -20.662922 -0.086744 0.005011 0.156555 0.192519 -0.335725 0.534067 -9.482147 30.307566 -14.418263 30.040119 61.405636 11.847075 -31.358892 46.619648 -18.184090 -0.672619 -0.195990 -0.244785 0.664581 0.044254 0.210639 +9.541223 166.600311 -14.281933 3.897967 49.956551 7.945073 -0.835268 -0.994800 -6.756844 -4.159813 0.035783 2.472673 -0.761857 0.639733 0.057832 0.585431 0.472841 -0.191228 -3.390173 2.775713 -7.327933 7.811741 -0.870193 16.256784 -0.041512 -0.421091 0.191806 0.583036 0.775388 0.068135 0.157326 1.451674 -7.918721 -1.763887 1.283587 13.637240 -1.321790 1.970589 25.279144 0.132657 -17.040478 1.363859 15.331385 -23.328138 -15.201108 14.069064 -23.202278 -14.966962 -74.900719 -72.624817 52.846272 36.863003 -40.433186 -20.076008 -0.111019 -0.022263 0.165581 0.204544 -0.358252 0.534861 -9.620315 30.997015 -14.753606 29.495163 62.514088 11.926205 -30.272646 45.762093 -17.296398 -0.689332 -0.170738 -0.273464 0.701419 0.081499 0.218607 +9.165306 166.542740 -14.588821 4.312086 48.742527 8.651112 -1.267901 -1.120650 -7.363928 -3.927954 -0.017736 2.007799 -0.784652 0.667005 0.053832 0.589126 0.479262 -0.204507 -3.074463 2.334141 -6.427413 6.136187 -0.500483 13.593515 -0.039706 -0.431810 0.183195 0.601509 0.798533 0.070578 0.326973 1.923448 -8.098138 -1.979100 1.878178 13.755208 -1.468070 2.656774 25.650402 -0.320981 -17.012539 0.838655 15.417466 -23.638208 -15.848079 13.990120 -23.491034 -15.341755 -77.930733 -72.656303 55.037014 36.375736 -39.230991 -19.693182 -0.123361 -0.026028 0.163329 0.210050 -0.368757 0.539255 -9.793149 31.793833 -15.295434 29.589550 63.675911 12.513328 -28.640936 45.407253 -16.345547 -0.701877 -0.169262 -0.283468 0.725509 0.097339 0.227777 +8.800166 166.512451 -14.923620 4.501782 47.991787 9.502778 -1.567154 -1.301594 -8.329415 -3.535054 -0.081842 1.741989 -0.802597 0.684757 0.039981 0.602603 0.494486 -0.214386 -3.045985 2.127106 -6.651189 5.411744 -0.371149 12.115112 -0.035919 -0.454349 0.175064 0.621735 0.803925 0.082878 0.959851 2.374315 -8.147620 -2.129027 2.486639 13.625222 -1.678009 3.319854 25.686594 -0.743208 -17.362083 0.332323 15.154826 -24.157352 -16.242849 13.197869 -23.827110 -15.367462 -84.174477 -72.335609 59.836182 36.009281 -38.454174 -19.556496 -0.131846 -0.004850 0.152749 0.216757 -0.378459 0.541594 -10.089988 32.153591 -16.014200 31.557972 64.344025 14.306068 -25.902817 45.694057 -15.074304 -0.716068 -0.186516 -0.277857 0.722627 0.107022 0.234166 +8.586409 166.435776 -15.205557 4.357199 48.056946 10.202083 -1.541206 -1.458974 -9.371375 -3.338039 -0.145400 1.436439 -0.790205 0.650547 0.035060 0.640863 0.551252 -0.195058 -2.866284 1.915725 -7.251720 5.079064 -0.357461 11.291877 -0.051994 -0.445918 0.171395 0.646115 0.779552 0.081174 2.122202 2.365496 -8.087042 -2.359376 2.746652 13.304601 -2.086706 3.539975 25.337971 -1.233855 -17.532305 0.141490 15.119608 -24.367640 -17.006695 12.299326 -24.492140 -15.525284 -87.916679 -71.367073 61.343941 34.485294 -36.580051 -18.552229 -0.104693 0.010584 0.144377 0.198554 -0.358704 0.551563 -10.357691 32.372093 -16.816174 35.862228 64.677437 17.374866 -22.408247 45.315441 -13.420506 -0.707343 -0.200197 -0.252300 0.719723 0.081239 0.245471 +8.365909 166.348557 -15.287476 4.481395 48.717144 11.229159 -1.506186 -1.746563 -10.662601 -3.187374 -0.194939 1.672659 -0.790696 0.653744 0.050814 0.622708 0.528947 -0.202562 -3.029966 1.665542 -8.089219 5.585807 -0.538036 10.837866 -0.044540 -0.434963 0.185036 0.634671 0.792574 0.064563 2.281876 2.203046 -8.005975 -2.511377 2.668709 12.764715 -1.892890 3.375859 24.415306 -1.564923 -17.423315 0.330084 15.106267 -24.453798 -16.821606 11.703501 -25.013308 -15.621318 -90.749596 -69.434044 60.911686 32.497971 -34.802826 -17.526775 -0.104625 -0.021541 0.152061 0.200787 -0.365619 0.554622 -9.781490 32.639088 -17.248283 41.267487 64.379097 21.050037 -17.403309 45.503872 -11.094868 -0.706645 -0.182058 -0.271120 0.740292 0.082561 0.243460 +8.143301 166.261108 -15.231646 4.537762 49.026669 11.842216 -1.513544 -1.891543 -11.292871 -2.788465 -0.261638 1.423785 -0.774746 0.612598 0.033162 0.658000 0.571083 -0.164493 -3.255824 1.469867 -8.872176 6.203793 -0.732421 11.028582 -0.070961 -0.409952 0.169279 0.642828 0.742670 0.071686 2.249299 2.036830 -7.920214 -2.575247 2.564997 12.438123 -1.540122 3.139765 23.828650 -2.026118 -17.326401 0.966563 15.329157 -24.199612 -17.587408 10.904853 -25.179010 -15.937105 -92.720840 -67.124458 58.881336 30.363918 -32.735668 -16.416487 -0.068388 -0.006885 0.166931 0.166842 -0.325089 0.549229 -9.647424 33.000530 -18.185049 46.914017 63.340549 24.205454 -11.747767 45.353100 -8.513728 -0.685879 -0.183125 -0.241217 0.716831 0.056860 0.240440 +7.919151 166.182098 -15.086643 4.882562 49.088245 12.560188 -1.646205 -1.994519 -11.730253 -2.593798 -0.276948 1.103996 -0.783290 0.629875 0.025744 0.622093 0.511723 -0.169862 -3.661989 1.384174 -9.660918 6.778508 -0.931180 11.547165 -0.064407 -0.396727 0.162346 0.609184 0.738423 0.071848 1.721237 2.052161 -7.859854 -2.630929 2.439674 12.125605 -1.150576 2.843761 22.986265 -2.266062 -17.056347 1.921646 15.527466 -23.977873 -17.125113 10.585032 -25.467415 -16.166025 -92.096764 -64.311882 54.587063 27.116297 -32.591377 -15.272180 -0.074578 -0.027446 0.194861 0.161210 -0.325202 0.527176 -8.040195 34.027721 -18.237406 52.058891 60.867493 25.269495 -6.801988 44.892387 -6.477385 -0.679810 -0.155272 -0.259965 0.708341 0.080392 0.221564 +7.708000 166.076431 -15.019375 4.891163 49.298996 12.903920 -1.373117 -2.050375 -12.124472 -2.788312 -0.301026 0.887262 -0.781020 0.581281 -0.000643 0.655208 0.545500 -0.116903 -3.786401 1.322249 -10.318563 7.443825 -1.102855 11.907032 -0.095816 -0.355242 0.154380 0.608799 0.674809 0.073234 1.653304 2.060060 -7.563870 -2.557212 2.350304 11.908047 -0.815841 2.471697 22.056047 -2.351642 -17.028824 3.059626 15.872387 -23.246794 -17.891459 9.994926 -25.295576 -16.630726 -90.056297 -61.521477 49.970879 21.031487 -34.317795 -13.115070 -0.034842 -0.041571 0.239237 0.121379 -0.272106 0.512454 -6.797518 34.856380 -19.077749 56.475948 57.286404 24.898460 0.848842 43.729294 -3.297004 -0.665992 -0.133079 -0.240759 0.686760 0.053617 0.199505 +7.558056 166.022339 -14.928993 5.156370 49.299538 13.119983 -1.497503 -2.198920 -12.268657 -2.729464 -0.327182 1.159377 -0.783565 0.555791 -0.023744 0.663726 0.532889 -0.048060 -4.328371 1.219764 -10.495923 8.310390 -1.310449 12.102896 -0.133338 -0.295499 0.140272 0.577394 0.610945 0.086199 1.366414 2.158886 -7.040232 -2.427647 2.258941 11.764637 -0.494538 2.209458 20.906759 -2.444399 -17.329126 4.586859 16.052788 -22.484980 -18.733454 9.007660 -25.980270 -16.963682 -86.752937 -58.920528 45.109226 13.114853 -35.913803 -9.907279 -0.009002 -0.092468 0.312361 0.079502 -0.204796 0.479826 -4.655673 36.298157 -18.884190 57.715847 52.779709 21.508251 7.616702 42.152321 -0.713929 -0.646352 -0.076203 -0.233521 0.669795 0.041403 0.162606 +7.403898 166.014511 -14.856607 5.713187 49.824459 13.451518 -1.743251 -2.458213 -12.548515 -2.618566 -0.363211 1.814877 -0.786483 0.525021 -0.054097 0.661560 0.515255 -0.009823 -4.868898 1.036621 -10.419855 9.133850 -1.507971 12.084392 -0.162641 -0.232021 0.127880 0.544656 0.556157 0.089013 1.125299 2.039922 -6.385442 -2.395841 1.977829 11.655608 -0.446087 1.867340 19.737991 -2.823179 -17.366270 6.628657 17.273310 -21.811930 -19.744745 8.735539 -26.703094 -17.844551 -84.353661 -56.155235 40.941517 4.522118 -34.931519 -6.049644 0.025305 -0.138276 0.387438 0.030916 -0.146052 0.449501 -1.636153 37.035191 -18.094498 59.075771 48.025200 17.861216 13.302143 39.757851 1.084397 -0.624654 -0.011383 -0.230898 0.656818 0.041508 0.134486 +7.308335 165.935120 -14.677050 6.056174 49.621754 13.558562 -1.633479 -2.515436 -12.523724 -3.137474 -0.346319 2.238423 -0.759760 0.460495 -0.074241 0.667497 0.518837 0.034681 -5.284434 1.105066 -10.308366 9.520355 -1.525271 12.103705 -0.192411 -0.162917 0.120529 0.511170 0.485184 0.083934 1.281461 1.884225 -5.767192 -2.425411 1.804386 11.461668 -0.875435 1.796514 18.503225 -3.681761 -17.133041 8.797185 18.042494 -21.308290 -20.588692 7.917057 -27.224052 -18.161848 -81.689880 -52.850731 36.326008 -3.390332 -32.716526 -2.646130 0.077336 -0.172603 0.441501 -0.024765 -0.082742 0.422332 0.328119 37.369125 -16.871666 60.195213 43.979336 15.223101 16.415321 36.569405 1.750872 -0.584668 0.040649 -0.207953 0.632627 0.021520 0.116506 +7.222530 165.790985 -14.424200 6.222787 49.329704 13.502449 -1.433889 -2.583524 -12.568765 -3.683424 -0.320416 2.849767 -0.720465 0.402833 -0.080576 0.651156 0.491172 0.055143 -5.537789 1.240691 -10.269406 9.959090 -1.563341 12.347569 -0.216733 -0.099602 0.118456 0.456482 0.427040 0.081281 1.626643 1.603362 -4.958027 -2.575586 1.579837 11.144292 -1.625325 1.762221 17.042660 -4.523530 -16.530920 10.625171 18.984337 -20.977682 -21.005888 5.460007 -28.200312 -17.344046 -77.952995 -49.019753 30.493645 -8.920753 -29.659513 -0.577901 0.128504 -0.197832 0.493621 -0.076991 -0.029937 0.401339 3.389914 37.707573 -14.546169 60.476727 39.951435 12.292974 17.520931 33.188557 1.663699 -0.540439 0.090417 -0.189045 0.602464 0.010152 0.103146 +7.257911 165.664780 -14.196741 6.068663 48.982750 13.092708 -1.275038 -2.676178 -12.624972 -3.994640 -0.311980 3.708781 -0.688832 0.333421 -0.100070 0.683049 0.515016 0.101976 -5.683858 1.390805 -10.201271 10.577806 -1.652842 12.895468 -0.253211 -0.046870 0.110512 0.435673 0.347642 0.086127 2.665548 1.094023 -4.339436 -2.886705 1.315713 10.892720 -2.841803 1.705405 16.039413 -5.164535 -15.548826 12.096003 19.783546 -20.322725 -21.678541 2.952286 -28.455566 -16.529682 -74.839020 -45.312260 25.573900 -12.479416 -25.392401 0.484022 0.196305 -0.187884 0.541870 -0.137517 0.031081 0.391990 5.444046 37.254150 -12.769888 62.033958 36.442944 10.233200 15.985066 29.018864 0.743560 -0.504401 0.107433 -0.153911 0.558445 -0.024636 0.087492 +7.231276 165.497192 -13.960865 5.475095 48.362885 12.382147 -0.824226 -2.812631 -13.001430 -3.978670 -0.307449 5.025348 -0.661843 0.300261 -0.109850 0.671723 0.496168 0.119168 -5.375193 1.652507 -10.291723 10.698443 -1.700049 13.704402 -0.273456 -0.010510 0.099592 0.399161 0.302346 0.096335 3.733293 0.557089 -3.720694 -3.145124 1.017859 10.615686 -3.931014 1.646758 15.080782 -5.588854 -14.606967 12.909463 19.854031 -19.796961 -21.773750 -0.130361 -28.346601 -15.149776 -71.731926 -41.652863 20.817795 -13.233912 -21.507406 0.455692 0.224275 -0.194925 0.574062 -0.171004 0.072025 0.372647 7.195993 36.783283 -10.976293 62.795464 33.251778 8.260902 13.735017 25.166000 -0.040252 -0.472748 0.135788 -0.134973 0.528030 -0.028566 0.077301 +7.105272 165.311066 -13.613081 5.365870 47.606838 11.957332 -0.538040 -3.057651 -13.304878 -4.192593 -0.304740 6.399856 -0.650173 0.252107 -0.115379 0.677482 0.490095 0.172096 -5.172139 1.813432 -10.405328 10.582556 -1.750540 14.726678 -0.299217 0.050152 0.097882 0.372158 0.239246 0.079847 3.885468 0.141295 -2.767048 -3.308509 0.747439 10.234798 -4.435966 1.553199 13.910095 -6.260769 -14.032915 14.104314 19.477415 -19.237778 -22.176252 -3.312828 -27.336796 -13.724944 -69.054184 -37.969772 16.503103 -12.997993 -18.359997 0.165917 0.270593 -0.237211 0.626109 -0.219446 0.119931 0.352479 8.999011 36.399685 -9.411306 63.235405 29.776789 6.474898 13.439345 20.425074 -0.066040 -0.444366 0.178019 -0.131684 0.520294 -0.051423 0.049051 +7.042147 164.932983 -13.228033 4.824483 46.797722 11.392849 -0.083983 -3.394823 -14.077321 -4.293402 -0.300665 8.456056 -0.634155 0.229818 -0.122591 0.656022 0.450906 0.187335 -4.734184 2.077147 -10.795070 10.579069 -1.847365 15.975374 -0.309027 0.081003 0.093228 0.329289 0.196039 0.084422 4.108383 -0.183911 -1.766162 -3.243842 0.505394 9.733383 -4.532923 1.434235 12.593848 -7.003399 -13.480977 14.350963 18.841665 -19.048658 -22.202625 -6.427839 -25.577593 -11.991044 -67.157104 -34.113861 12.289431 -11.049267 -17.101004 -0.551275 0.293133 -0.251012 0.659670 -0.247789 0.147469 0.329104 11.165059 35.918949 -7.724825 62.905212 26.482115 5.093244 12.972432 14.852954 0.108594 -0.419988 0.206679 -0.124221 0.491589 -0.048909 0.030095 +6.826192 164.504303 -12.779776 4.175603 45.557297 10.881368 0.448597 -3.728263 -15.026337 -4.297830 -0.260523 10.802460 -0.614247 0.221575 -0.113740 0.599972 0.372359 0.181538 -4.251351 2.433985 -11.365546 10.651768 -1.925857 17.210424 -0.291211 0.104595 0.103873 0.267363 0.181165 0.073371 4.026907 -0.312265 -0.623641 -3.172777 0.416439 9.113387 -4.541625 1.421509 11.086587 -7.507260 -12.729448 14.226683 18.121353 -18.877125 -21.256618 -9.175915 -23.504866 -10.361178 -65.151901 -30.284336 8.537227 -9.121081 -16.351141 -1.149289 0.294063 -0.280362 0.676108 -0.254043 0.142960 0.299431 13.987885 34.725685 -5.470861 61.839397 23.133219 3.524296 11.366380 10.243397 0.161910 -0.396158 0.240859 -0.135098 0.471649 -0.032325 0.010899 +6.506155 164.064133 -12.251725 3.412129 43.764992 10.115116 0.985803 -4.085879 -16.042143 -4.126146 -0.223476 13.661530 -0.613642 0.220927 -0.121255 0.561487 0.298364 0.202701 -3.609402 2.853647 -11.758275 10.677591 -1.968582 18.319479 -0.297043 0.129127 0.095936 0.211727 0.141164 0.080597 3.531725 -0.253081 0.892367 -3.065955 0.415709 8.368942 -4.364793 1.486223 9.405380 -7.611533 -12.066051 14.440909 17.307844 -18.250181 -20.697237 -11.348995 -20.444183 -9.172819 -63.677010 -26.558044 5.366391 -6.893565 -15.402795 -1.734634 0.302791 -0.301576 0.724223 -0.274390 0.163824 0.266954 15.546034 32.418419 -3.771429 61.089897 19.951551 2.112639 10.172945 6.662013 0.296893 -0.378721 0.272346 -0.147324 0.437777 -0.020333 -0.026765 +6.270269 163.501343 -11.728296 2.547572 41.254810 9.590787 1.434347 -4.510625 -17.496738 -3.671793 -0.182095 17.110561 -0.587604 0.239457 -0.098354 0.486555 0.185531 0.202223 -3.313914 3.312979 -12.456188 11.156573 -2.086648 19.510107 -0.268126 0.131424 0.100042 0.137139 0.139845 0.078573 3.180734 -0.130206 2.323437 -3.089445 0.572474 7.443666 -4.492903 1.658461 7.478240 -7.205336 -11.211704 13.523434 15.947338 -17.675100 -18.471857 -13.653336 -16.838743 -8.284184 -61.181000 -22.719866 2.679110 -5.590855 -13.611327 -1.902488 0.279948 -0.316662 0.723500 -0.259124 0.141694 0.232700 17.166412 29.084427 -2.380426 59.493000 16.912361 0.801035 8.886380 3.304665 0.423479 -0.351249 0.285523 -0.167323 0.403455 -0.000649 -0.052955 +5.913066 163.001617 -11.229018 1.213431 38.326046 8.412236 2.212956 -4.774106 -19.006292 -3.330813 -0.102043 21.463533 -0.549878 0.203116 -0.101125 0.470505 0.157558 0.225149 -2.369908 3.889864 -12.674294 11.299666 -2.080574 20.550905 -0.277710 0.143380 0.098707 0.092169 0.089359 0.094967 3.141000 -0.008211 4.258471 -3.003833 0.843278 6.515022 -4.620874 1.877322 5.577638 -6.824768 -10.422808 13.283290 14.911944 -16.659822 -17.575895 -14.880026 -12.994343 -7.629478 -59.113651 -19.071966 0.607224 -4.753996 -11.675690 -1.889405 0.294586 -0.296074 0.733408 -0.272156 0.167317 0.211889 16.979078 25.233715 -2.003001 58.096233 14.364386 -0.510373 7.698509 1.706884 0.453945 -0.324445 0.283107 -0.142486 0.343959 -0.012808 -0.072890 +5.397470 162.586990 -10.679737 -0.227933 35.157028 6.861727 3.194799 -4.878402 -20.666231 -2.867561 0.027170 26.923565 -0.537782 0.179553 -0.107601 0.476880 0.162012 0.263674 -0.870204 4.567334 -12.544567 11.073423 -1.961666 21.739981 -0.298687 0.157751 0.097679 0.076028 0.051865 0.112071 2.805073 0.195785 6.161027 -2.921648 1.150901 5.961303 -4.623248 2.137849 4.354261 -5.903542 -9.686723 13.038357 14.175903 -15.188299 -17.623960 -15.228307 -9.128397 -7.554036 -56.767712 -16.037092 -0.813273 -4.627177 -9.664286 -1.740720 0.297891 -0.300012 0.754379 -0.279758 0.202141 0.198200 15.820862 21.832270 -2.592506 56.321861 12.903458 -1.278687 6.751014 -0.140766 0.521406 -0.316811 0.291446 -0.127856 0.316180 -0.028892 -0.093567 +4.567258 162.272659 -10.177400 -1.307575 31.504532 5.101419 4.136148 -4.640971 -22.067869 -2.598397 0.350302 32.738289 -0.563362 0.161129 -0.127968 0.494197 0.179267 0.322679 0.685926 5.363585 -12.062779 10.674849 -1.765763 23.466158 -0.328965 0.191945 0.090683 0.080065 0.005377 0.112212 1.624512 0.736497 8.313964 -2.786476 1.541635 5.643032 -4.202678 2.522297 3.509857 -5.044995 -9.162097 13.436290 13.404222 -13.516983 -18.700151 -15.006967 -5.872342 -7.430754 -54.737816 -13.181705 -1.995807 -4.067081 -8.022627 -1.679808 0.306207 -0.344855 0.806030 -0.301548 0.248960 0.177105 14.090717 19.669712 -3.132192 53.779202 11.851755 -1.879015 6.290861 -1.316035 0.559270 -0.321668 0.327179 -0.136427 0.320980 -0.042366 -0.130047 +3.806163 162.113342 -9.799991 -2.539107 28.322392 2.833482 4.872251 -4.300162 -23.150055 -1.660327 0.401590 38.239227 -0.578022 0.133079 -0.154250 0.524875 0.209181 0.383968 2.411171 5.959274 -10.860471 10.297550 -1.562141 24.708605 -0.363893 0.226103 0.082705 0.082651 -0.050679 0.124605 1.081031 1.220703 11.061692 -2.509348 2.084770 5.352878 -3.891179 3.074405 2.609147 -4.580213 -8.891906 14.238051 12.953568 -12.245547 -20.158567 -15.471665 -3.481658 -7.349738 -52.073566 -10.683299 -2.900753 -3.261326 -6.653798 -1.618655 0.323486 -0.370119 0.855304 -0.329994 0.303045 0.157654 12.743415 17.718288 -3.151638 49.721561 10.354803 -2.680617 6.189994 -1.063249 0.490560 -0.322229 0.356002 -0.125303 0.309838 -0.060494 -0.160120 +3.116638 161.917282 -9.458108 -3.576508 25.685055 0.670709 5.226413 -4.126737 -24.746094 -0.384913 0.198002 44.123356 -0.585848 0.104052 -0.175516 0.532001 0.226030 0.414568 3.902846 6.359382 -9.497768 10.259862 -1.487704 25.945204 -0.382850 0.248775 0.077002 0.080979 -0.092923 0.126200 0.738732 1.671333 13.854104 -2.295930 2.724071 5.140554 -3.725916 3.717514 1.736037 -4.080506 -9.088213 14.627869 12.427448 -11.449990 -21.170031 -15.863491 -1.992991 -7.198258 -49.243698 -8.534172 -3.418180 -2.403185 -4.782040 -1.463233 0.332926 -0.390102 0.882469 -0.347846 0.337877 0.137207 11.418810 16.064615 -2.736591 45.485100 8.325389 -3.542760 5.982856 0.200104 0.376738 -0.320224 0.379267 -0.118529 0.299937 -0.067278 -0.180210 +2.539884 161.656021 -8.998959 -4.476938 22.734089 -1.434413 5.619981 -3.726193 -26.316362 0.458103 0.125947 49.857468 -0.585286 0.097488 -0.174620 0.529123 0.229392 0.428094 5.274849 6.652184 -7.818714 10.122679 -1.367846 27.086338 -0.384313 0.257991 0.081860 0.079427 -0.097722 0.123479 0.380052 2.073292 15.931518 -2.079429 3.274668 5.250958 -3.499412 4.270154 1.402892 -3.867792 -8.653831 14.407247 12.065282 -10.680009 -21.544882 -16.196476 0.124349 -7.140453 -46.873825 -6.247642 -4.067607 -1.032439 -3.984376 -1.395412 0.325300 -0.407583 0.885460 -0.344694 0.345540 0.129567 10.699325 14.104102 -3.202756 40.436977 7.522338 -3.815850 5.914464 0.539262 0.303880 -0.319828 0.391584 -0.121211 0.304949 -0.071017 -0.187362 +2.065509 161.339554 -8.460928 -5.093108 20.353559 -3.235485 5.517555 -3.530102 -28.271029 1.613774 -0.235199 55.886833 -0.548762 0.069867 -0.163076 0.533215 0.242867 0.429141 5.972101 6.726998 -6.121060 10.821815 -1.510506 27.929968 -0.387530 0.254599 0.086945 0.072083 -0.106932 0.128263 0.033118 2.417176 17.530741 -1.996534 3.811437 5.452229 -3.413073 4.751803 1.222151 -3.637442 -8.410713 13.970202 12.022425 -10.333411 -21.116890 -15.794313 2.174526 -6.808105 -45.186874 -4.069597 -4.732700 0.800223 -3.966060 -1.338225 0.334250 -0.376853 0.863421 -0.343209 0.350388 0.138062 9.464603 12.674188 -3.069733 35.959827 6.309332 -4.051636 6.294337 2.371308 0.220190 -0.304255 0.369474 -0.099351 0.280923 -0.090210 -0.178240 +1.482761 161.167542 -7.862010 -5.105045 17.429916 -5.118362 5.301467 -3.021235 -29.252670 2.287838 -0.272677 60.713123 -0.526412 0.040705 -0.153377 0.543770 0.266556 0.440963 6.468807 6.813415 -4.084388 10.750420 -1.387013 28.837938 -0.397870 0.267213 0.090966 0.075976 -0.116623 0.121134 -1.099141 3.081818 19.142580 -2.032782 4.302707 5.847382 -3.151303 5.194668 1.248127 -3.378396 -7.691559 13.719065 12.371578 -9.482788 -21.355881 -15.105375 4.480360 -6.642928 -43.629379 -1.998153 -5.356958 2.524998 -4.507165 -1.314576 0.348870 -0.370547 0.859371 -0.350891 0.364211 0.146919 8.503178 11.524672 -3.270375 31.654100 5.848723 -4.026677 5.530474 2.325818 0.206212 -0.291550 0.364538 -0.091793 0.278902 -0.112845 -0.174920 +1.038719 160.995148 -7.260876 -5.345058 14.688125 -6.975748 5.474342 -2.406427 -30.006945 2.088737 0.141902 64.787849 -0.519593 0.028243 -0.154257 0.555017 0.280568 0.453635 6.893890 7.053107 -2.387663 11.187949 -1.449732 30.159697 -0.403435 0.263138 0.089436 0.079694 -0.127255 0.124990 -1.460409 3.397153 20.199087 -2.119491 4.680070 6.417265 -3.262808 5.568897 1.606546 -3.255279 -7.043422 13.304834 12.098211 -8.700166 -21.440773 -14.071699 7.722288 -6.880201 -42.371433 -0.171041 -5.995424 3.715330 -6.530705 -1.455800 0.353388 -0.351580 0.856379 -0.351830 0.368961 0.148064 6.268089 10.051180 -3.797478 28.483416 5.984369 -3.853035 4.664458 0.974154 0.201976 -0.288708 0.349797 -0.084637 0.264350 -0.124614 -0.178977 +0.785386 161.005997 -6.642054 -5.648067 12.173503 -8.847096 5.375130 -1.763657 -30.022617 1.978590 0.499626 67.122322 -0.545612 0.079110 -0.150612 0.511550 0.204792 0.434366 7.434772 7.277781 -0.486197 11.442039 -1.431772 31.150515 -0.382807 0.266754 0.086399 0.052911 -0.094596 0.117976 -1.047283 3.538762 21.477217 -2.243210 5.087854 6.822426 -3.809104 6.064154 1.529290 -3.932249 -5.776592 13.389167 12.846866 -8.462846 -21.006618 -12.809849 10.142777 -6.662536 -41.667118 2.006035 -6.584204 6.149600 -7.207947 -1.508674 0.333018 -0.381019 0.882698 -0.345543 0.343357 0.133918 4.741908 8.771924 -3.687470 24.915491 5.407989 -3.852806 4.101911 0.939659 0.237225 -0.292536 0.379015 -0.127357 0.281774 -0.089107 -0.193621 +0.469341 161.051086 -5.990804 -5.553627 10.545307 -10.150057 4.915453 -1.486096 -30.243385 1.034615 1.266122 67.861649 -0.543040 0.082356 -0.129364 0.478734 0.184843 0.395283 7.701634 7.322996 1.120506 11.417393 -1.347143 31.755268 -0.360893 0.268556 0.106343 0.046299 -0.057175 0.089449 -0.601671 3.804550 21.464237 -2.410040 5.565807 7.625996 -4.264804 6.574021 2.422313 -4.367423 -5.561579 12.944975 13.121475 -8.732081 -20.762899 -11.872951 10.754381 -6.306997 -40.254539 3.484143 -6.836795 8.056922 -7.418377 -1.473992 0.321282 -0.411070 0.866785 -0.330668 0.315600 0.140275 4.001138 7.251029 -3.342404 21.593536 4.211805 -3.882658 2.409232 1.797303 0.239636 -0.295353 0.396028 -0.149704 0.316801 -0.075377 -0.180396 +0.169476 161.245056 -5.286876 -5.373340 9.269474 -11.470525 4.428051 -1.365638 -30.148535 -0.642694 2.402830 67.441689 -0.534814 0.107326 -0.118022 0.450683 0.145472 0.360703 8.120428 7.188668 2.995039 10.812201 -1.088163 31.921980 -0.344101 0.258554 0.111191 0.026410 -0.025023 0.093232 -0.100794 3.927018 21.314911 -2.640380 5.895441 8.416068 -4.807360 6.954647 3.320374 -4.931509 -5.015524 12.786389 13.782091 -9.102973 -20.026529 -10.843379 10.628262 -5.400447 -38.944599 5.289118 -7.127090 9.904167 -8.429241 -1.579623 0.306926 -0.404736 0.857221 -0.317638 0.292600 0.144280 3.611411 6.399340 -2.556140 18.077679 2.872836 -3.705589 1.466547 2.345926 0.274155 -0.293713 0.397912 -0.157386 0.318325 -0.054775 -0.169470 +-0.253318 161.462997 -4.527893 -5.086693 8.736547 -12.279838 3.726744 -1.454920 -30.136715 -2.490851 3.443774 65.184624 -0.528844 0.141864 -0.113646 0.416009 0.100414 0.310043 8.414451 7.136766 4.190736 10.623656 -0.981190 32.101711 -0.320516 0.236213 0.107548 0.007305 0.018829 0.103387 0.150617 4.007604 20.791025 -2.994122 6.005545 9.158159 -5.350822 7.082654 4.278436 -5.295396 -4.060397 11.986820 15.227148 -9.325465 -19.372549 -9.056774 11.164083 -4.787869 -37.750969 6.504941 -7.302257 11.679968 -9.863174 -1.795802 0.283280 -0.378539 0.840487 -0.298774 0.258260 0.143530 3.347882 5.020547 -2.222383 15.141552 2.119232 -3.431368 0.960813 2.482885 0.304130 -0.293330 0.391712 -0.164680 0.310879 -0.021655 -0.153889 +-0.707196 161.832962 -3.703665 -4.574328 8.190018 -13.558673 2.755128 -1.544344 -28.792286 -4.203548 4.239782 61.150776 -0.568483 0.195638 -0.121904 0.369375 0.036844 0.272950 8.547026 7.038483 6.083698 10.264359 -0.804472 32.223774 -0.292347 0.227951 0.105588 -0.006923 0.060853 0.095513 0.115850 4.215330 20.639395 -3.419868 6.087671 10.035092 -5.856781 7.230531 5.247694 -5.462580 -3.812564 11.649525 16.199734 -9.598606 -19.389700 -8.072838 11.716550 -4.692099 -36.073376 7.265125 -7.217174 14.116966 -11.897864 -2.226597 0.248184 -0.409151 0.855543 -0.281168 0.224145 0.125174 2.918489 4.261512 -1.706414 12.424563 1.498610 -3.087065 1.254789 1.707770 0.349793 -0.311587 0.422375 -0.206980 0.335070 0.026540 -0.162422 +-1.131265 162.227234 -2.939591 -4.255844 7.941957 -14.780095 1.861434 -1.673558 -27.223433 -6.228176 4.854126 55.953262 -0.587504 0.220829 -0.118198 0.356204 0.019289 0.270622 9.028520 6.898214 7.874267 10.045667 -0.652826 32.229458 -0.284912 0.230328 0.105408 -0.005869 0.083497 0.089263 0.510640 4.188280 20.285748 -3.885718 6.199993 11.005700 -6.553563 7.363367 6.472535 -5.153725 -4.140232 11.177868 16.760815 -9.684392 -19.926695 -7.825684 12.028406 -4.898031 -33.660114 7.600220 -6.873980 16.058943 -14.039983 -2.725705 0.229814 -0.434820 0.862424 -0.272607 0.213473 0.119740 2.425594 3.497288 -1.279037 10.274022 0.985408 -2.698193 2.102755 0.730417 0.348464 -0.320857 0.439757 -0.229002 0.359924 0.040118 -0.166117 +-1.520667 162.671402 -2.051301 -4.133640 7.775108 -16.066874 1.016259 -1.680784 -24.754183 -7.782279 4.954781 49.632782 -0.602724 0.231635 -0.125577 0.334359 -0.002994 0.252413 9.620517 6.863173 9.653393 10.166613 -0.585444 32.524147 -0.275121 0.229829 0.100303 -0.009738 0.090823 0.078906 0.596255 4.280644 20.244202 -4.089829 6.214974 11.609694 -6.775900 7.392162 7.049859 -5.379565 -4.175507 11.369206 16.904623 -9.879606 -19.786856 -7.276313 12.442415 -4.864797 -32.285316 8.225782 -6.806865 19.245926 -15.601656 -3.279148 0.223029 -0.447532 0.868091 -0.271488 0.203065 0.109887 1.792449 3.360036 -0.724649 8.254638 0.454911 -2.409374 2.880080 -1.335449 0.300510 -0.323989 0.452285 -0.246231 0.368112 0.059046 -0.170111 +-1.838051 163.000549 -1.170230 -3.991011 7.566072 -16.811357 0.015242 -1.759893 -22.646992 -8.783721 4.611768 42.975014 -0.600023 0.228006 -0.119236 0.335753 -0.004177 0.258429 10.054263 7.056480 10.484654 10.304205 -0.518566 33.243122 -0.275476 0.240011 0.098153 -0.008033 0.091124 0.066278 0.856621 4.318690 19.646355 -4.427507 6.256151 12.018683 -7.213134 7.389434 7.654943 -5.540719 -3.978971 11.650670 17.325384 -9.919218 -19.608664 -5.986817 13.069184 -4.650084 -31.265684 8.768179 -6.832482 21.656338 -17.152130 -3.848125 0.233543 -0.453307 0.870992 -0.279542 0.202209 0.112996 0.894782 2.747542 -0.364839 7.325491 -0.062510 -2.233165 3.256404 -1.812000 0.276014 -0.316195 0.453849 -0.253969 0.376768 0.052224 -0.170688 +-2.069604 163.063599 -0.239760 -4.126831 7.794203 -16.931412 -0.838905 -1.945436 -20.907887 -9.649115 4.012560 36.095867 -0.586681 0.242247 -0.101813 0.333547 -0.021901 0.247374 10.426807 7.294118 10.473509 10.715249 -0.609220 34.109272 -0.272744 0.220915 0.097301 -0.015245 0.106236 0.071910 1.288474 4.161274 18.749071 -4.554429 6.068383 11.918659 -7.490805 7.137002 7.757003 -5.724540 -3.703621 11.876848 17.202044 -10.260029 -18.103973 -4.190076 14.253014 -4.313207 -30.333218 9.290280 -6.741004 22.727171 -18.430447 -4.210660 0.236752 -0.424085 0.858514 -0.272035 0.187165 0.131754 -0.457903 1.925927 -0.257216 6.762671 -0.182746 -2.122958 3.273176 -2.112386 0.259466 -0.312003 0.424635 -0.254839 0.365665 0.047466 -0.163797 +-2.287521 162.974655 0.670188 -4.472632 8.186842 -17.068024 -1.681443 -2.192682 -19.145027 -10.050715 3.262365 29.829958 -0.580924 0.220266 -0.092879 0.369760 0.015570 0.270284 10.700032 7.579958 10.174514 11.769273 -0.956435 35.226055 -0.285394 0.215500 0.102202 0.004025 0.089943 0.066559 1.851078 3.906550 17.835476 -4.600837 5.890313 11.957416 -7.671165 6.931386 8.162291 -5.633642 -3.869373 11.850266 16.729771 -10.200115 -17.948910 -3.339663 14.925987 -4.434889 -29.188829 9.280815 -6.522336 25.171671 -19.160498 -4.643772 0.260612 -0.400930 0.853417 -0.279848 0.191324 0.151523 -1.802044 0.956153 -0.305770 6.092908 -0.285560 -1.983551 3.251094 -2.641173 0.214050 -0.314547 0.392826 -0.245236 0.359221 0.016158 -0.165461 +-2.406758 162.612686 1.605807 -5.273454 8.759889 -16.899858 -2.325442 -2.321586 -17.611217 -9.977678 2.435954 23.767332 -0.583020 0.220507 -0.083728 0.361795 0.016042 0.254268 11.224492 7.864279 9.390880 13.273502 -1.518406 36.308239 -0.274971 0.206743 0.115033 0.010522 0.109031 0.050706 3.165966 3.297576 16.746153 -4.833251 5.644050 11.693574 -8.450964 6.624115 8.286426 -5.066832 -3.607091 12.068057 16.789845 -9.951369 -16.948109 -2.176359 15.778897 -4.120201 -27.414852 9.957491 -6.149684 26.460249 -20.542669 -5.067749 0.252733 -0.407751 0.841299 -0.264546 0.175027 0.162073 -3.061572 0.003088 -0.553859 5.996947 -0.045110 -1.955649 3.121947 -3.069754 0.191597 -0.323283 0.387458 -0.258793 0.372885 0.015049 -0.162605 +-2.570024 162.004578 2.745764 -5.823000 9.023178 -16.107115 -3.114632 -2.334603 -16.552248 -9.486646 1.767136 18.535543 -0.586465 0.239557 -0.066767 0.340895 0.002554 0.236150 11.608273 8.240806 8.167039 14.639769 -2.008888 37.219173 -0.244436 0.195399 0.129728 0.019045 0.144947 0.024487 3.615959 3.252626 14.353859 -4.823358 5.471860 11.435597 -8.546617 6.525540 8.967821 -4.747459 -3.621076 12.051307 16.356836 -10.078753 -15.634142 -1.407556 16.463936 -3.780350 -25.572245 11.023976 -5.787002 27.796854 -22.104076 -5.580411 0.226584 -0.429262 0.807359 -0.235593 0.138073 0.165091 -3.407697 -1.064206 -1.018846 4.634058 0.453520 -1.711582 3.157428 -3.292393 0.142838 -0.330055 0.384666 -0.281421 0.401913 0.022230 -0.156269 +-2.701938 161.330673 3.853200 -6.460461 9.240113 -15.371279 -3.561190 -2.234961 -15.754445 -9.184750 1.340235 14.598996 -0.591596 0.238616 -0.074665 0.342567 0.025995 0.220906 11.966275 8.574569 6.935697 16.050371 -2.548697 38.008537 -0.231573 0.179489 0.127971 0.042171 0.156777 0.015269 4.535338 3.111742 11.601721 -4.877549 5.408737 11.400077 -8.911553 6.609269 10.182840 -4.239476 -3.753650 12.304109 16.287533 -10.061085 -15.114967 -1.045628 16.588171 -3.591037 -23.517746 11.893268 -5.349704 29.385859 -22.672020 -5.911297 0.210626 -0.420950 0.777305 -0.219133 0.121203 0.163044 -3.712678 -2.101429 -1.395728 3.350409 0.689741 -1.434433 3.358288 -3.473799 0.085072 -0.338465 0.371201 -0.279711 0.408401 0.027977 -0.147176 +-2.907429 160.675476 4.802375 -6.810372 9.275526 -15.355342 -3.931231 -2.122959 -14.697793 -9.139399 1.159144 12.435735 -0.570536 0.196972 -0.066574 0.386659 0.095302 0.240252 12.099261 8.897943 6.390271 17.576565 -3.165321 39.007683 -0.251564 0.187064 0.139145 0.070132 0.141384 0.011566 4.882299 3.023941 9.901226 -4.852162 5.337343 11.577704 -8.958626 6.600912 11.189610 -4.053915 -3.954886 12.654314 16.261168 -9.924858 -15.537534 -0.587312 16.302937 -3.170566 -22.000633 12.982309 -5.143117 30.010637 -22.280674 -5.793110 0.234604 -0.409866 0.764058 -0.227618 0.142593 0.187401 -4.055399 -2.499152 -1.299668 2.119795 0.429654 -1.166324 3.541401 -3.541464 0.042051 -0.336532 0.353557 -0.254124 0.413109 -0.010322 -0.133254 +-3.139224 160.038803 5.561710 -6.669817 9.652380 -15.728880 -4.499605 -2.291588 -14.128936 -9.495353 1.221258 12.546248 -0.552937 0.164668 -0.059256 0.414982 0.141496 0.263696 11.617004 9.110893 6.263068 19.087206 -3.937845 40.179920 -0.253824 0.197457 0.158306 0.086927 0.129370 0.001806 4.488379 3.002986 9.375340 -4.834395 5.191481 11.796747 -8.757939 6.424351 11.727263 -3.739225 -4.088414 12.754100 15.967181 -9.654363 -15.645126 -0.089609 15.987109 -3.053134 -20.490063 13.025313 -4.758587 30.259727 -21.178267 -5.408865 0.243799 -0.416562 0.747185 -0.225891 0.151635 0.196645 -4.446105 -2.732316 -1.197526 1.270329 0.162522 -1.006136 3.400819 -3.779029 0.008734 -0.334872 0.347403 -0.236856 0.417840 -0.040635 -0.128409 +-3.428349 159.475601 6.144428 -6.032451 9.876884 -16.616261 -4.996894 -2.444383 -13.455304 -10.543872 1.508445 13.736222 -0.513213 0.117958 -0.057877 0.432978 0.185026 0.268405 10.887471 9.295085 6.745805 20.079943 -4.566698 41.559490 -0.268517 0.199890 0.155451 0.092760 0.102950 0.009131 3.859790 2.859071 10.205362 -5.215463 5.088456 12.065938 -8.967978 6.137178 11.686544 -3.472038 -4.360729 12.366304 15.827411 -9.488283 -15.909581 -0.003556 15.518715 -3.015717 -18.173122 13.000220 -4.203537 30.487890 -19.424179 -4.788542 0.264949 -0.383947 0.724507 -0.236084 0.174683 0.204792 -4.277845 -2.476399 -0.903966 0.835400 -0.360045 -0.924176 2.730377 -3.356227 0.044024 -0.314029 0.326410 -0.200417 0.392245 -0.066848 -0.111943 +-3.682288 159.016922 6.581068 -5.551052 9.878587 -17.501078 -4.845501 -2.537252 -13.493332 -11.813136 1.986752 16.000912 -0.492978 0.098405 -0.046346 0.439015 0.189605 0.260722 10.277125 9.390698 7.223122 21.047129 -5.237915 42.820995 -0.277432 0.201850 0.158928 0.086599 0.099001 0.008465 2.762301 2.987737 11.206544 -5.156317 4.976137 12.254649 -8.437346 5.901616 11.419457 -3.573648 -4.205540 12.035791 16.597221 -9.643493 -15.806314 0.703397 14.689911 -2.570893 -17.622530 12.990817 -4.139852 30.650360 -18.257814 -4.419649 0.289771 -0.362214 0.728043 -0.248031 0.180494 0.222484 -3.701504 -1.919399 -0.251441 -0.229506 -1.340169 -0.773066 2.409193 -2.807476 0.081000 -0.303515 0.312764 -0.193625 0.380727 -0.082580 -0.104205 +-3.893998 158.568985 6.966792 -4.929891 9.488955 -18.203884 -4.374753 -2.442448 -13.616536 -13.454579 2.611083 17.959927 -0.514775 0.121368 -0.062201 0.439389 0.175490 0.287939 9.826928 9.542854 7.654323 21.269226 -5.587439 44.119705 -0.279158 0.200912 0.144325 0.084202 0.082448 0.025800 1.578688 3.293712 11.785263 -5.032387 4.914522 12.684107 -7.779404 5.887495 11.745414 -3.241165 -5.044104 11.124470 15.849629 -9.586782 -16.922413 0.453727 14.212224 -2.916010 -16.196539 12.211713 -3.703997 29.969469 -17.242598 -4.093431 0.271847 -0.369436 0.740453 -0.247855 0.186755 0.196897 -3.718600 -1.895893 0.084661 -0.592408 -1.914284 -0.630470 2.649701 -2.121696 0.100070 -0.310996 0.321019 -0.194241 0.371055 -0.070079 -0.123736 +-3.979040 158.242630 7.281065 -4.576007 8.706415 -18.530401 -3.584489 -2.097750 -13.497498 -14.935224 3.097521 18.574690 -0.521081 0.121746 -0.063135 0.434012 0.176286 0.287586 9.717605 9.692623 7.891283 21.109074 -5.654881 45.152569 -0.268262 0.193425 0.145458 0.091038 0.083881 0.015469 0.982511 3.662735 12.186826 -4.826372 5.090731 12.834388 -7.313937 6.037491 11.749137 -3.035353 -4.881558 10.555465 15.230491 -9.235505 -16.684244 0.394961 13.954680 -3.416221 -15.286575 10.527269 -3.318347 29.636141 -16.606667 -3.922671 0.262765 -0.371829 0.727575 -0.238874 0.174062 0.190039 -3.584359 -2.293776 0.217537 -0.775149 -2.474589 -0.462050 2.933989 -1.096669 0.106055 -0.314221 0.315177 -0.201086 0.373615 -0.067791 -0.127781 +-4.046525 158.050903 7.495108 -4.728564 8.062548 -18.326052 -2.658056 -1.862699 -13.731881 -15.715814 3.277472 18.571857 -0.538020 0.158503 -0.057617 0.431562 0.152943 0.296664 10.045768 9.655723 7.644972 20.876585 -5.667818 45.662395 -0.261336 0.184374 0.145326 0.089048 0.103409 0.023173 1.339209 3.571880 12.295890 -4.946685 5.165821 12.674780 -7.660355 6.102020 11.527073 -2.805838 -4.561454 9.957518 15.306567 -8.992541 -16.592108 0.786733 13.993357 -3.709794 -14.286946 8.952341 -2.837391 28.665321 -16.804798 -3.933703 0.243113 -0.377100 0.733552 -0.226125 0.159843 0.188638 -3.508577 -2.782237 -0.131474 0.263298 -2.266652 -0.607973 2.883276 -0.491513 0.123234 -0.325678 0.314343 -0.217065 0.381197 -0.059061 -0.137099 +-4.140383 158.089508 7.484550 -4.895236 7.432902 -17.854683 -2.113874 -1.748330 -13.805694 -15.552965 3.098426 17.744396 -0.499506 0.114727 -0.035493 0.438645 0.184729 0.282994 10.561412 9.551908 7.204821 20.163866 -5.389934 46.087952 -0.255190 0.182641 0.156341 0.101020 0.106092 -0.004834 1.377042 3.508867 12.480667 -4.967859 5.230163 12.347021 -7.737837 5.998957 11.026372 -2.667446 -3.880090 9.767068 15.675796 -8.730340 -15.417990 1.133555 13.875749 -3.730793 -14.355453 7.654456 -2.759485 28.763899 -17.518848 -4.125731 0.269161 -0.352353 0.697577 -0.227401 0.149859 0.212410 -2.973618 -2.897520 -0.396360 1.103943 -2.022044 -0.677411 3.001562 -0.240137 0.089109 -0.304632 0.283507 -0.209004 0.379361 -0.090245 -0.116526 +-4.167020 158.272018 7.312718 -5.474507 7.057204 -17.512535 -1.687398 -1.742356 -13.658428 -14.894259 2.706068 16.541752 -0.495791 0.114264 -0.023061 0.427961 0.171091 0.262201 11.342493 9.234778 6.946210 19.550903 -5.158121 45.869450 -0.249277 0.164995 0.170132 0.093401 0.118133 -0.009661 1.798280 3.362192 13.147634 -4.674337 5.177801 11.889111 -7.586560 5.886666 10.112708 -2.821289 -3.283498 9.898936 15.097484 -8.465652 -14.126748 1.029614 13.545817 -3.816471 -15.260507 6.508913 -2.838840 29.547970 -18.949345 -4.683426 0.270714 -0.341940 0.692529 -0.215772 0.135852 0.228733 -2.872077 -3.019885 -0.337296 2.468552 -2.573386 -0.929480 2.518557 0.383905 0.109882 -0.310458 0.267723 -0.217600 0.374737 -0.092460 -0.115118 +-4.255490 158.591217 7.080715 -5.525690 6.643189 -16.781773 -1.739013 -1.828545 -13.588310 -14.104346 2.258789 14.864264 -0.498152 0.119066 -0.023439 0.428673 0.170815 0.263698 11.382758 8.901643 6.531032 18.890930 -4.876945 45.151787 -0.253825 0.156564 0.166454 0.094393 0.117203 -0.001975 1.698232 3.400842 13.139298 -4.583563 5.124149 11.549253 -7.427307 5.820834 9.700743 -2.909871 -3.053829 10.202699 14.552790 -8.203836 -13.751229 1.219036 13.474152 -4.119719 -16.445009 4.803295 -2.917284 29.472849 -19.894625 -5.070312 0.267972 -0.338880 0.694202 -0.211910 0.140027 0.231273 -2.926183 -3.471682 -0.689204 4.793883 -2.590908 -1.346429 2.217576 0.814022 0.112270 -0.311758 0.261684 -0.217550 0.370002 -0.093555 -0.116016 +-4.275052 158.914322 6.783090 -5.611749 6.028143 -15.916254 -1.954579 -1.867604 -13.460104 -13.062427 1.765702 12.707577 -0.515330 0.148724 -0.025044 0.411756 0.147614 0.271001 11.490089 8.564092 6.122901 17.992548 -4.464954 44.180592 -0.253084 0.158921 0.169666 0.083305 0.128684 0.010883 1.636103 3.406329 13.129486 -4.443459 4.975444 11.189629 -7.216844 5.715500 9.268760 -2.622431 -3.128877 10.111777 13.734401 -7.724998 -14.168811 0.922523 13.521897 -4.463075 -17.292879 3.709733 -2.923253 28.915710 -21.382702 -5.532259 0.233529 -0.374101 0.704379 -0.195574 0.142817 0.216052 -3.052137 -3.872083 -1.161016 7.203297 -2.304205 -1.821709 1.787751 1.143558 0.125811 -0.326457 0.289703 -0.226884 0.385336 -0.072945 -0.127077 +-4.333601 159.203186 6.425268 -5.793404 5.034198 -14.978838 -1.817959 -1.641853 -13.311058 -12.262595 1.359153 10.131037 -0.495148 0.144533 -0.022228 0.428027 0.171063 0.303682 11.463897 8.376217 5.533312 17.434933 -4.198422 43.530918 -0.261829 0.150629 0.174898 0.082494 0.114929 0.040429 0.630329 3.872684 12.953299 -3.687336 4.864581 10.882153 -5.875412 5.628141 8.981506 -1.851942 -3.682354 9.725750 12.149154 -7.123487 -14.332967 -0.194883 13.913610 -5.201725 -18.561829 2.385224 -2.992951 28.892714 -23.348284 -6.170388 0.210860 -0.367843 0.682539 -0.176941 0.160753 0.210733 -3.146991 -4.473629 -1.666033 8.737342 -1.890279 -2.024049 1.897110 1.376961 0.097880 -0.326871 0.279169 -0.195067 0.366087 -0.087691 -0.126955 +-4.335764 159.504257 5.962725 -6.056501 4.317076 -14.044091 -1.841374 -1.586961 -13.457497 -11.196698 0.991095 8.074436 -0.490393 0.146872 -0.026956 0.444629 0.180284 0.342418 11.092835 8.019511 4.849185 17.630259 -4.340019 42.492218 -0.278549 0.143104 0.174461 0.076181 0.091871 0.073083 -0.359603 4.231621 12.956341 -2.881751 4.618248 10.394810 -4.477184 5.408149 8.407340 -1.154337 -3.624262 9.796670 10.514549 -6.032311 -14.355914 -0.925410 13.901865 -5.417738 -20.188593 1.606490 -3.137655 28.223068 -25.602871 -6.777121 0.196185 -0.360462 0.686601 -0.167378 0.184548 0.204213 -3.157259 -5.153779 -2.180488 11.304285 -1.971972 -2.651613 -0.129108 2.851939 0.085543 -0.331694 0.271134 -0.174107 0.340289 -0.099098 -0.141155 +-4.265573 159.766876 5.346015 -6.426638 3.536702 -13.586271 -1.945859 -1.582665 -13.331447 -9.689974 0.632015 6.213453 -0.470395 0.102348 -0.048291 0.466405 0.200744 0.366441 10.910153 7.551595 4.636722 17.629892 -4.397682 41.544319 -0.299257 0.150129 0.157674 0.070936 0.033515 0.084942 -0.534407 4.211211 14.273615 -2.380306 4.423529 9.663254 -3.860014 5.113439 7.002732 -1.014222 -2.874205 10.240171 10.420996 -5.094820 -14.366950 -1.235526 13.494546 -5.240668 -21.792099 0.956805 -3.356978 27.958836 -27.097466 -7.202539 0.233332 -0.313191 0.699692 -0.197356 0.214318 0.196125 -2.577214 -5.349192 -2.378464 14.041695 -2.504968 -3.431460 -2.565401 4.379806 0.022432 -0.311519 0.248779 -0.145534 0.285337 -0.120281 -0.154062 +-4.198506 159.976089 4.694472 -7.111927 2.733611 -12.768071 -1.623541 -1.522498 -13.890051 -8.352998 0.378807 4.952783 -0.450083 0.091897 -0.062484 0.493507 0.225836 0.378559 11.236578 7.084146 4.047431 17.564560 -4.421905 40.534851 -0.321440 0.137019 0.140104 0.070200 0.011470 0.125927 -0.194313 4.178257 14.585880 -1.791273 4.375157 9.218682 -3.322288 5.068130 6.408412 -0.799754 -2.438090 10.195643 10.786695 -4.700784 -14.650027 -1.472904 12.910835 -5.800559 -23.600740 -1.389718 -3.381789 27.297716 -26.758974 -7.163976 0.240964 -0.255909 0.697913 -0.205029 0.237606 0.198226 -2.048752 -5.800371 -2.739186 16.061876 -2.447714 -3.813282 -2.833793 4.235734 0.012486 -0.304081 0.220733 -0.106104 0.239204 -0.129378 -0.148072 +-4.062976 160.074249 3.919719 -7.842191 1.821958 -11.850981 -1.344640 -1.537237 -14.852860 -6.840158 0.192858 4.260090 -0.470127 0.104994 -0.068153 0.518332 0.244448 0.396797 11.346648 6.684801 3.279359 18.139788 -4.707869 39.552475 -0.333094 0.129464 0.131481 0.089450 0.011423 0.135001 0.763873 4.111154 14.052859 -1.389540 4.523220 9.240656 -3.171785 5.271646 6.775806 -0.507326 -2.363046 9.887308 11.086481 -4.533690 -15.255362 -1.711168 11.937687 -6.742143 -24.926035 -4.446634 -3.197478 25.960289 -25.971628 -6.959079 0.241144 -0.246440 0.709604 -0.207264 0.241889 0.204043 -1.741394 -6.143349 -3.013689 17.872826 -2.106651 -3.922175 -1.163330 3.032800 0.037642 -0.317028 0.209550 -0.109558 0.242839 -0.134966 -0.154173 +-4.002143 160.271332 2.955624 -8.507977 1.138346 -11.368317 -1.176508 -1.626343 -15.616118 -5.140998 0.044430 4.068170 -0.492683 0.103531 -0.081990 0.531865 0.244946 0.427342 11.428002 6.171286 2.768709 19.046562 -5.170203 38.563126 -0.349212 0.143883 0.119972 0.093479 -0.014539 0.133957 1.787275 3.758174 14.483984 -1.229457 4.507627 9.122309 -3.388549 5.265185 6.605910 -0.015911 -2.415135 10.400638 11.310843 -4.113503 -15.783969 -2.181336 9.796334 -6.965028 -25.545555 -6.310042 -3.187025 24.959631 -25.215872 -6.821713 0.256305 -0.257824 0.746413 -0.227078 0.261342 0.195915 -1.265792 -5.382290 -2.575724 21.292364 -2.632297 -4.571605 -1.560523 3.144281 0.037535 -0.320099 0.219349 -0.121027 0.240424 -0.141356 -0.177148 +-4.049554 160.403305 2.072108 -8.633756 -1.573110 -11.131506 -0.203922 -1.224436 -15.803123 -4.197039 0.004062 3.513190 -0.502556 0.082074 -0.103136 0.571505 0.289076 0.465337 11.485034 6.254771 2.735065 18.980968 -4.991551 38.182899 -0.375473 0.153498 0.109329 0.114425 -0.051667 0.143695 1.708814 4.016927 14.783199 -1.004399 4.721136 9.165123 -3.098986 5.446383 6.684872 0.168611 -1.713058 11.103239 11.074471 -3.057301 -16.518053 -2.915517 8.498285 -7.275072 -26.412558 -7.560674 -3.246636 24.463438 -24.882555 -6.837063 0.275801 -0.246606 0.768323 -0.246557 0.293801 0.195718 -0.038173 -4.175982 -3.132375 23.756567 -1.008345 -4.766864 -2.484317 2.362930 0.049244 -0.322589 0.214022 -0.107409 0.227608 -0.161461 -0.190197 +-3.982683 160.382217 1.110609 -8.537161 -5.603940 -10.895358 1.388055 -0.640032 -16.175356 -4.060088 0.036970 3.348687 -0.530282 0.083468 -0.127672 0.593581 0.317036 0.492598 11.600969 6.851070 2.496194 18.122404 -4.475215 38.860382 -0.389137 0.151589 0.102064 0.134564 -0.073257 0.155409 1.672062 4.506456 14.977209 -0.909994 5.174288 9.396465 -2.968445 5.891224 7.051129 0.448807 -0.948838 11.272614 10.081798 -1.760068 -17.441475 -4.506136 7.173597 -7.921355 -26.435722 -8.692410 -3.251347 24.333052 -24.820116 -6.956473 0.265957 -0.252267 0.784387 -0.246645 0.311669 0.183596 1.465188 -3.019612 -3.733973 25.382353 0.768599 -4.717405 -2.609383 3.173218 -0.046670 -0.340359 0.218296 -0.104868 0.225037 -0.160753 -0.208198 +-3.846908 160.344986 0.065614 -8.669955 -8.889622 -11.010361 2.918513 -0.311682 -16.804071 -3.715788 0.060996 4.770159 -0.563680 0.084882 -0.158341 0.642437 0.361210 0.553384 11.842121 7.214280 2.396221 17.341831 -4.117503 39.610577 -0.419174 0.146923 0.080880 0.165016 -0.119036 0.180379 1.583976 4.852439 15.092634 -0.438878 5.399742 10.036619 -2.262841 6.173857 8.026983 0.872611 -0.598690 11.179655 8.533089 -0.450847 -18.925381 -6.853514 5.159647 -8.631979 -26.402456 -9.910235 -3.360875 24.437632 -25.717844 -7.433562 0.267544 -0.238903 0.809897 -0.258282 0.344903 0.172067 2.978642 -1.577064 -4.083611 25.788862 2.369560 -4.421221 -1.979339 4.469774 -0.160062 -0.357317 0.204773 -0.093568 0.207167 -0.175287 -0.236513 +-3.785211 160.255768 -0.939924 -8.528865 -11.782388 -11.195033 4.459744 -0.110428 -17.892426 -3.735615 0.167769 7.501095 -0.599703 0.106453 -0.172358 0.657286 0.377027 0.600818 12.099599 7.397387 2.463532 15.885890 -3.528864 40.273319 -0.426225 0.145770 0.070183 0.189493 -0.133071 0.184561 0.915948 5.305832 14.975981 -0.037992 5.541575 10.677609 -1.368023 6.343130 9.082764 1.788709 -0.880840 11.040250 6.904176 0.548386 -19.768591 -9.620966 2.947673 -9.533632 -25.201527 -11.288460 -3.407972 24.132675 -27.396652 -7.948968 0.239935 -0.269987 0.818005 -0.246933 0.356549 0.153252 5.349040 0.007910 -4.450488 25.759266 3.802063 -4.170220 -1.572287 6.403039 -0.322354 -0.375529 0.212634 -0.106757 0.222181 -0.176610 -0.262144 +-3.557226 160.112869 -1.870080 -8.460671 -14.527918 -11.673638 6.337739 0.072293 -19.120441 -4.539550 0.399319 11.629545 -0.622813 0.106341 -0.195881 0.685742 0.414705 0.629621 12.305518 7.433043 2.855242 14.219005 -2.873035 40.789646 -0.441972 0.146645 0.053224 0.217805 -0.153457 0.192429 0.884196 5.316093 15.401406 0.188066 5.599452 11.225707 -1.031792 6.389999 9.863536 1.962904 -0.619630 11.305351 6.481837 1.201231 -20.698587 -12.037810 0.462215 -10.103388 -24.030695 -12.430778 -3.561134 23.659901 -29.257032 -8.453406 0.235837 -0.268050 0.825987 -0.253056 0.374124 0.143284 8.291071 1.970936 -4.981664 25.244617 5.533561 -3.994895 -1.858768 8.133864 -0.502231 -0.386510 0.211124 -0.100760 0.223942 -0.178936 -0.272788 +-3.196674 159.876678 -2.811517 -8.202033 -17.271656 -12.029581 8.168844 0.142976 -20.848936 -5.765432 0.832474 16.946722 -0.678158 0.145943 -0.222460 0.700551 0.408424 0.675796 12.332624 7.529608 2.954453 12.540421 -2.259396 41.437984 -0.448535 0.144590 0.036579 0.232147 -0.167545 0.204412 0.344542 5.466733 15.686317 0.592577 5.489139 11.656077 -0.191052 6.344524 10.536777 1.996294 -0.162407 11.627958 5.226803 2.072626 -21.464582 -13.769635 -2.252175 -10.151012 -23.997086 -13.259304 -3.765440 22.946787 -30.919790 -8.927555 0.211025 -0.295198 0.858036 -0.249756 0.380503 0.116691 10.503650 4.041214 -5.526779 24.693262 7.500402 -3.864114 -1.800703 9.561327 -0.632198 -0.411608 0.225655 -0.119966 0.231962 -0.163862 -0.308462 +-2.780333 159.780212 -3.829581 -7.493930 -20.085546 -12.756677 9.833111 0.131750 -22.539646 -7.500815 1.534848 22.963163 -0.689699 0.155924 -0.238336 0.724115 0.436334 0.693573 11.932456 7.729371 3.050954 10.584814 -1.494938 42.297615 -0.465228 0.136853 0.027093 0.248603 -0.173967 0.228126 -0.365394 5.540658 16.634020 0.781927 5.382965 11.937026 0.315444 6.206819 10.709776 1.702091 0.962741 12.321740 4.547072 3.029237 -21.655489 -15.226779 -4.632668 -10.294576 -23.944445 -14.416365 -3.948618 22.693195 -31.371840 -9.148130 0.198781 -0.288318 0.862737 -0.244923 0.398923 0.116980 12.859879 6.237404 -6.419742 24.072592 10.100929 -3.650813 -1.070169 10.362658 -0.666614 -0.422411 0.222532 -0.106768 0.228769 -0.163415 -0.310463 +-2.403623 159.867004 -4.829451 -6.744398 -22.626949 -13.503515 11.471275 0.112351 -24.025383 -9.662679 2.541649 28.939156 -0.706735 0.150195 -0.262449 0.763716 0.479853 0.726663 11.914480 7.862225 3.132725 8.254448 -0.520064 42.922150 -0.489629 0.133154 0.010901 0.274273 -0.200378 0.245752 -1.220822 5.615343 17.529762 0.933697 5.239964 12.212817 0.846218 6.006251 10.912934 1.484120 2.219348 13.229385 3.987791 4.196107 -22.047091 -15.953197 -6.503157 -10.496484 -24.116835 -15.854611 -4.032582 22.157085 -32.495907 -9.432555 0.204493 -0.271942 0.877351 -0.253995 0.424459 0.115734 14.681398 8.250980 -7.425218 24.198839 12.861330 -3.409259 0.455122 11.024898 -0.605893 -0.431157 0.210858 -0.092617 0.216975 -0.174109 -0.320899 +-1.957768 159.956421 -5.777781 -5.753385 -24.796505 -14.087120 12.781827 -0.207441 -25.675493 -12.218158 3.856990 34.823349 -0.728402 0.145072 -0.285555 0.798853 0.520402 0.758505 11.549994 7.961546 2.747579 5.990807 0.354238 43.553497 -0.509133 0.132643 0.000493 0.298837 -0.223943 0.257642 -1.953511 5.594425 18.223082 0.937189 5.056224 12.397540 1.186916 5.778185 11.090706 1.037798 3.244866 14.073717 3.185899 5.111345 -22.634178 -16.179165 -8.301425 -10.830832 -24.511190 -17.792847 -3.967719 20.699020 -33.894817 -9.485025 0.208119 -0.270920 0.892861 -0.261299 0.447494 0.112228 16.211451 10.084715 -8.288543 25.085737 15.262400 -3.263641 1.651075 12.056154 -0.578516 -0.441781 0.208540 -0.083026 0.214279 -0.182551 -0.331225 +-1.442752 160.134232 -6.668283 -4.659774 -26.503271 -14.570338 13.707999 -0.876459 -27.343254 -14.741407 5.410605 40.615929 -0.769704 0.150191 -0.314337 0.814781 0.543442 0.772671 10.616905 8.038514 1.844983 4.421527 0.827156 44.246857 -0.514995 0.130340 -0.002675 0.324365 -0.238970 0.254222 -2.824683 5.566606 18.798265 0.901086 4.761019 12.483549 1.575875 5.467233 11.194688 0.661860 4.355558 15.046920 2.263628 6.139658 -22.975840 -16.242790 -10.588554 -11.123248 -24.970383 -19.963137 -3.880551 19.440142 -35.328617 -9.593328 0.199534 -0.289451 0.911532 -0.260070 0.455719 0.102632 17.808470 12.115895 -9.035743 26.005264 17.621380 -3.116271 2.568244 12.555613 -0.539392 -0.466386 0.218758 -0.094191 0.225199 -0.174701 -0.350544 +-0.882936 160.310898 -7.468408 -3.951068 -28.314140 -14.658726 14.656464 -1.484501 -28.988861 -16.692184 6.948024 46.013744 -0.781411 0.157537 -0.326287 0.834949 0.561806 0.796363 10.009518 8.156072 0.609379 2.790552 1.355837 44.942593 -0.529109 0.132999 -0.007122 0.334129 -0.246105 0.268468 -3.047845 5.335081 19.334686 0.839016 4.587658 12.353227 1.608082 5.275980 11.017730 0.437865 5.567584 16.024952 1.901066 7.147861 -23.041361 -16.170395 -13.187204 -11.091045 -25.422512 -21.855394 -3.810431 18.075987 -36.958931 -9.666641 0.192161 -0.295266 0.924107 -0.259308 0.472521 0.100895 19.069092 14.252347 -9.332437 27.213049 19.503361 -2.955547 3.485200 13.497530 -0.491509 -0.474513 0.224502 -0.088273 0.227158 -0.176478 -0.358150 +-0.385209 160.709290 -8.098943 -2.896662 -30.115959 -14.805517 15.251166 -2.069932 -29.847027 -18.544859 8.535769 50.239414 -0.805040 0.159552 -0.347084 0.865764 0.586449 0.845685 8.913358 8.079727 -0.280793 1.316384 1.804896 44.753677 -0.552468 0.146162 -0.028084 0.351881 -0.276800 0.277291 -3.832794 5.394170 19.295912 0.814932 4.357676 12.312677 1.997712 5.024978 11.154979 0.011191 6.492095 17.167461 1.177251 8.008206 -23.738403 -15.853295 -15.522545 -11.102896 -26.583313 -23.804476 -3.760355 17.679979 -38.716789 -10.173847 0.199799 -0.308034 0.952064 -0.276772 0.502234 0.088901 20.382586 16.483505 -9.621178 28.525106 21.361944 -2.873426 4.053050 14.467405 -0.493729 -0.474997 0.232469 -0.086949 0.228462 -0.185461 -0.376933 +0.109740 161.208115 -8.563685 -2.009492 -32.103107 -14.571639 15.690452 -2.468781 -30.211660 -20.086716 9.942435 53.228905 -0.824168 0.149686 -0.371978 0.900415 0.627798 0.870592 7.707985 7.885155 -1.140233 0.317813 2.014092 43.834743 -0.568441 0.149165 -0.037252 0.377586 -0.301117 0.284288 -4.087099 5.370061 18.836349 0.673531 4.316521 12.288920 2.009706 4.951563 11.451797 -0.449880 7.678872 17.719826 0.946899 8.769865 -24.558426 -15.501579 -17.728943 -11.281701 -27.603498 -26.205488 -3.452594 16.468843 -40.785332 -10.343193 0.208900 -0.300627 0.965986 -0.288729 0.521930 0.086196 22.039856 18.005072 -9.962749 29.935440 23.090492 -2.860291 4.654496 16.845171 -0.536531 -0.484247 0.229993 -0.077167 0.224943 -0.193187 -0.385325 +0.615264 161.803940 -8.906473 -1.159633 -34.417976 -14.113240 16.254591 -2.486581 -30.078491 -21.829233 11.530076 55.452095 -0.817439 0.111422 -0.398393 0.929744 0.686760 0.888795 6.591913 7.667726 -1.917775 -0.506562 2.177115 42.379234 -0.581796 0.150947 -0.049624 0.403784 -0.337581 0.287185 -4.317830 5.527941 17.547800 0.622589 4.396069 12.401053 2.226631 4.937293 12.249357 -0.603485 8.691172 18.291443 0.333090 9.715027 -25.155951 -14.696858 -19.727465 -11.243314 -29.037321 -28.495146 -3.001236 15.277623 -42.961945 -10.489894 0.218893 -0.277447 0.951106 -0.298480 0.544736 0.077655 23.210218 19.423939 -10.020134 31.335407 24.357399 -2.894075 5.340564 20.328924 -0.598119 -0.478576 0.217230 -0.047901 0.206710 -0.206626 -0.383251 +1.198880 162.473297 -9.250564 -0.508101 -36.275551 -13.372909 16.369020 -2.927111 -29.939592 -22.814600 12.535553 57.173092 -0.836719 0.107558 -0.423427 0.972779 0.732218 0.948996 5.427729 7.206614 -2.720895 -1.176937 2.110198 40.667812 -0.605508 0.140913 -0.063456 0.430563 -0.378063 0.311365 -4.656405 5.472090 15.542945 0.534732 4.162086 12.803163 2.584735 4.643502 13.712276 -0.035264 9.062766 18.888077 -1.375103 10.961511 -26.018171 -12.964817 -21.662720 -11.440739 -30.999987 -31.429777 -2.242731 14.988541 -45.140751 -11.083923 0.209694 -0.266970 0.957691 -0.295261 0.575338 0.067502 22.610880 21.099209 -10.295825 33.775581 26.205519 -2.374150 6.621922 22.771980 -0.497026 -0.492275 0.199208 -0.030320 0.185510 -0.226563 -0.406514 +1.895378 163.283859 -9.539839 -0.188872 -37.987804 -12.384252 16.186266 -3.313287 -29.581469 -23.117594 13.074473 58.509781 -0.859864 0.137657 -0.422318 1.000346 0.754921 0.980029 4.516550 6.785149 -3.590943 -1.777411 2.037611 38.593773 -0.622438 0.119869 -0.074240 0.456210 -0.368956 0.331829 -4.081478 5.046100 13.537821 0.307615 3.955226 13.266047 2.319573 4.426194 15.248762 0.099114 9.324507 18.971975 -2.113749 11.425934 -26.141409 -11.261165 -23.439707 -11.521269 -32.529953 -34.112473 -1.371864 15.120495 -48.673763 -12.116186 0.189029 -0.266114 0.959605 -0.278709 0.583505 0.077869 21.793381 22.915958 -10.753973 35.712666 28.473804 -1.489384 8.507584 24.322695 -0.140397 -0.511834 0.180841 -0.034278 0.195644 -0.235733 -0.412708 +2.530561 164.138290 -9.730065 -0.542251 -39.944088 -10.915195 16.314032 -3.403374 -28.652822 -22.771137 13.174883 59.425407 -0.911298 0.178894 -0.421773 1.002673 0.749986 0.990762 4.396669 6.370944 -4.169369 -2.806166 2.146480 35.777962 -0.615354 0.099170 -0.070744 0.482067 -0.346302 0.320824 -2.882785 4.556510 11.570958 0.197635 3.843090 13.670925 1.922955 4.362372 16.704454 -0.018685 10.005386 18.846231 -3.027206 11.904634 -26.099365 -9.734567 -25.398897 -11.464329 -34.038246 -36.989613 -0.178231 15.993881 -51.362659 -13.309598 0.160318 -0.297221 0.967722 -0.254360 0.563586 0.081063 21.165436 24.301682 -11.337437 37.767395 30.888477 -0.584838 9.875473 26.708069 0.148753 -0.547113 0.178486 -0.073544 0.229573 -0.227812 -0.432248 +3.130436 165.013077 -9.881728 -0.856332 -41.929783 -9.695102 15.919070 -3.492672 -27.085224 -21.717609 12.839348 60.061893 -0.937801 0.192432 -0.437172 1.015883 0.768596 1.021454 4.173833 5.876807 -4.288719 -3.558881 2.115716 32.378529 -0.618884 0.076039 -0.078767 0.503126 -0.359664 0.332117 -2.260154 4.276648 9.761883 0.186860 3.655869 14.210108 1.881805 4.161911 18.277431 0.333169 10.605669 18.321684 -4.968009 12.809434 -26.825466 -8.415435 -26.805695 -11.385502 -35.180901 -39.826572 1.051894 17.880074 -54.470871 -15.113780 0.132578 -0.296201 0.958876 -0.233944 0.566775 0.069467 19.697815 25.482771 -12.363465 39.688690 33.755463 0.871723 12.100214 28.769585 0.842052 -0.566970 0.162527 -0.074986 0.223590 -0.229272 -0.450840 +3.686080 165.810837 -10.013850 -0.708711 -43.809464 -8.467267 14.905660 -3.534812 -25.559381 -20.248421 12.217989 60.160931 -0.946055 0.210920 -0.418664 1.024623 0.787402 1.030497 3.471545 5.498128 -4.822309 -3.885707 1.971624 29.379862 -0.611777 0.046737 -0.062921 0.526348 -0.332026 0.331516 -1.974897 4.220587 7.711865 0.019630 3.570854 14.578968 1.722256 3.962033 19.697908 0.817285 11.011915 17.349674 -5.980451 13.452775 -26.642031 -6.325960 -27.790190 -11.353952 -36.349861 -42.721581 2.795760 19.648014 -57.580349 -16.854179 0.100534 -0.300538 0.929589 -0.195230 0.550063 0.087429 18.356791 26.276810 -13.279320 42.114651 36.407654 2.660153 14.139043 30.977058 1.550706 -0.589365 0.137617 -0.085893 0.241467 -0.243162 -0.449749 +4.259910 166.414413 -10.207077 -0.526642 -45.121262 -7.063622 13.826838 -3.506287 -24.599703 -19.174902 11.631252 59.457645 -0.946995 0.258391 -0.387693 0.999439 0.771575 1.008299 2.826969 5.272092 -5.705747 -3.972290 1.806051 27.176693 -0.582507 -0.008145 -0.044892 0.536935 -0.267804 0.336139 -2.219940 4.336460 5.366789 0.003672 3.388917 14.782374 2.017438 3.591717 21.089649 1.700519 10.786987 16.190712 -6.775830 13.974439 -25.134264 -3.153059 -28.147654 -11.463265 -38.719383 -46.343384 5.620354 23.407269 -59.769814 -19.725792 0.033027 -0.296529 0.870817 -0.124095 0.503584 0.103738 16.166775 26.730240 -14.252510 44.815201 38.909500 4.892429 15.825143 33.364933 2.250826 -0.615879 0.101931 -0.105385 0.256990 -0.237588 -0.440071 +4.808022 166.904221 -10.422624 -0.733068 -46.235039 -5.375851 12.913041 -3.198283 -23.421019 -17.914255 10.767119 57.741364 -0.954308 0.307424 -0.364783 0.986264 0.777217 0.987194 2.533220 5.195895 -6.705918 -4.037186 1.696595 25.221849 -0.553377 -0.077391 -0.025005 0.561223 -0.200391 0.349465 -2.017075 4.387517 3.086557 -0.028125 3.278562 14.960279 2.086468 3.206985 22.626192 2.779102 10.826136 14.578620 -7.635259 14.627603 -23.868572 0.433951 -27.764511 -11.965924 -40.785454 -49.879936 8.719790 27.362999 -60.750969 -22.435328 -0.046996 -0.280404 0.800177 -0.040896 0.455218 0.121873 13.817894 26.494278 -15.624992 48.139809 41.790955 7.802432 16.585855 35.660488 2.705543 -0.655214 0.055326 -0.116324 0.269366 -0.232309 -0.427753 +5.337681 167.258530 -10.614243 -0.671565 -46.814785 -3.893197 11.459826 -2.942939 -22.181154 -16.140398 9.583920 55.547531 -0.950636 0.365005 -0.340331 0.966309 0.764097 0.954548 1.957998 5.182302 -7.797228 -3.645499 1.523312 23.671066 -0.517947 -0.164296 -0.022018 0.578267 -0.131754 0.372793 -1.919564 4.425741 1.148464 -0.076473 3.175823 14.957006 2.065717 2.795013 23.794067 3.826082 10.731641 12.605187 -7.889929 15.008503 -21.867220 3.222129 -27.083439 -12.216269 -42.217484 -53.365868 12.120479 31.694693 -61.845379 -25.287073 -0.122936 -0.224026 0.718904 0.040902 0.393354 0.137271 12.114221 25.818710 -16.546345 51.171307 44.459446 10.872104 16.401535 38.809841 2.942775 -0.682854 -0.019257 -0.122532 0.252873 -0.223520 -0.411786 +5.970829 167.468262 -10.722678 -0.859234 -46.958382 -2.335909 9.919062 -2.736645 -20.640936 -14.101479 8.071872 52.302254 -0.958169 0.440343 -0.315949 0.939822 0.745111 0.919628 1.410876 5.200613 -8.952253 -2.924253 1.288273 22.457314 -0.481776 -0.251803 -0.021149 0.597846 -0.051501 0.399063 -1.350319 4.238487 -0.561026 -0.121929 2.950678 14.955166 1.860435 2.281338 24.973686 4.827607 10.758275 10.633663 -8.282496 15.194546 -20.152388 6.449837 -25.609381 -12.709257 -43.667767 -56.592579 15.710822 35.943020 -62.011654 -27.848598 -0.213995 -0.185012 0.638861 0.129724 0.330546 0.149686 9.052210 24.649481 -17.605297 55.137161 47.822521 15.320253 15.135632 43.891220 2.928677 -0.717636 -0.082079 -0.135897 0.252205 -0.204097 -0.395094 +6.541596 167.615463 -10.855451 -0.878984 -46.990540 -1.003827 8.527240 -2.343069 -18.514132 -12.292443 6.673387 47.958683 -0.971574 0.502153 -0.290632 0.947485 0.767150 0.897013 1.071578 5.108507 -9.644040 -2.864466 1.226002 20.680563 -0.453429 -0.340292 -0.010996 0.641907 0.025014 0.420717 -0.767321 4.114294 -2.158368 -0.179680 2.845925 15.011827 1.526419 1.896911 26.267313 5.323076 10.922235 8.268052 -8.490258 14.956399 -18.852190 9.191633 -24.203531 -13.362367 -45.204578 -60.212364 19.946867 39.044483 -61.700741 -29.297483 -0.289116 -0.141418 0.558560 0.213191 0.272033 0.179572 7.379398 23.140976 -18.209124 58.328152 51.342308 20.247238 12.153774 49.311752 2.164521 -0.762205 -0.156868 -0.142680 0.261443 -0.205165 -0.372922 +7.057555 167.557571 -10.920549 -1.230472 -46.656609 0.442605 7.331985 -1.740466 -16.060001 -10.061866 5.214743 42.836052 -0.997944 0.571828 -0.276640 0.947832 0.780475 0.880163 1.053766 5.037213 -10.068597 -2.993827 1.212883 18.801537 -0.425038 -0.432788 -0.008094 0.684772 0.094772 0.446590 -0.284973 3.882831 -3.749554 -0.072697 2.528199 14.991328 1.398276 1.312439 27.576986 6.027594 11.206347 5.910971 -9.104285 15.137292 -17.829308 11.725971 -22.904642 -13.194918 -47.234917 -64.533775 25.224836 48.677532 -60.326427 -34.716457 -0.376537 -0.100843 0.483832 0.301007 0.215342 0.196626 4.899434 21.511467 -18.576088 61.936188 55.069584 26.199390 4.828767 54.079399 -1.240528 -0.812577 -0.227911 -0.154991 0.264950 -0.197050 -0.362811 +7.587570 167.365753 -10.901763 -2.077862 -46.110245 2.012757 6.535984 -1.331937 -13.081786 -8.285513 3.906640 36.841415 -1.018823 0.641023 -0.253573 0.927581 0.766131 0.849975 1.363298 4.890635 -10.263627 -2.874372 1.114060 16.737457 -0.388357 -0.516681 -0.005158 0.712771 0.169920 0.458273 0.481760 3.436158 -5.048006 0.158610 2.045128 14.902683 1.410088 0.645872 28.431152 6.507666 11.548370 4.081892 -9.396035 15.291439 -16.265709 13.629256 -22.269430 -12.785307 -47.420818 -67.600021 28.423721 55.280792 -57.893425 -37.501396 -0.455382 -0.070563 0.415153 0.382152 0.149462 0.210388 2.309518 20.545267 -18.556328 63.445854 58.406113 31.174095 -3.587263 57.647339 -5.777683 -0.851452 -0.290484 -0.180625 0.271849 -0.183372 -0.353475 +8.139922 167.086945 -10.794964 -3.024992 -45.163448 3.657308 5.893311 -1.174371 -10.053085 -6.714139 2.707225 30.537392 -1.019406 0.691615 -0.225973 0.901554 0.746145 0.812211 1.922684 4.651367 -10.529010 -3.311572 1.057028 14.482162 -0.352628 -0.579892 0.002972 0.725711 0.238784 0.462736 1.321715 2.750009 -6.127728 0.409789 1.401359 14.669721 1.591582 -0.009055 28.826303 6.777174 12.019965 2.717205 -9.378774 15.401419 -14.719897 14.439263 -21.786655 -12.179305 -48.106052 -69.398895 30.808195 59.139744 -55.577740 -38.558247 -0.514520 -0.042489 0.351448 0.446580 0.090689 0.226204 -0.302565 19.854856 -17.972563 63.413548 61.707382 35.246841 -15.484043 60.341480 -12.905975 -0.872714 -0.338976 -0.199186 0.278354 -0.171877 -0.336583 +8.799688 166.731125 -10.707587 -4.209492 -43.682922 5.327074 5.640352 -1.121407 -7.192679 -4.969370 1.564939 24.122175 -1.042845 0.742357 -0.223079 0.920845 0.791623 0.796968 2.511583 4.493289 -10.739907 -3.291160 0.951021 12.801895 -0.332223 -0.665120 0.001257 0.783237 0.295874 0.487380 2.675274 1.955778 -7.170510 0.667585 0.729253 14.539393 1.773978 -0.718704 29.603876 6.918083 12.356170 0.999013 -9.626181 15.236059 -13.834995 15.685409 -19.757973 -12.304187 -52.083424 -71.228249 35.669212 61.458885 -53.491234 -38.906113 -0.587467 0.003552 0.274759 0.521872 0.045669 0.245024 -2.650172 18.035553 -18.101049 64.836891 65.297920 40.881710 -27.158100 60.834400 -19.952339 -0.919769 -0.409900 -0.196231 0.282147 -0.170038 -0.317770 +9.478745 166.407898 -10.659604 -4.985158 -41.739777 6.478364 5.355981 -1.161506 -4.619622 -3.154108 0.644335 18.145716 -1.090246 0.817315 -0.219817 0.915304 0.789075 0.788350 2.564704 4.277537 -10.861807 -2.881729 0.762308 11.261994 -0.306446 -0.734677 -0.003111 0.822015 0.355988 0.500772 3.502032 1.115947 -7.960092 0.944044 -0.097512 14.434904 2.296673 -1.536874 30.153122 7.272769 12.537025 -0.196136 -10.017186 15.306556 -13.035751 15.669153 -17.467937 -12.309466 -56.735508 -72.494247 40.849648 63.261333 -51.987835 -39.211372 -0.667121 0.012065 0.229978 0.592134 -0.004957 0.247079 -4.700796 16.199377 -18.488214 66.628220 68.156883 46.066250 -34.702087 59.956367 -24.123089 -0.970360 -0.451779 -0.225195 0.301113 -0.150006 -0.322229 +10.139124 166.208511 -10.655588 -5.300417 -40.164059 6.764904 4.916523 -1.123915 -2.158214 -1.728130 0.088607 13.530686 -1.099236 0.839905 -0.209688 0.915599 0.801475 0.780011 2.097042 4.026699 -10.743176 -2.141443 0.577856 10.268116 -0.295503 -0.763969 0.000655 0.844227 0.386985 0.501329 3.746252 0.343584 -8.364570 1.232044 -0.869282 14.649433 2.940700 -2.295182 30.753368 7.235092 12.683440 -0.707292 -10.284906 15.279030 -12.616693 15.196456 -16.014782 -11.866718 -56.073547 -72.118721 40.071522 67.018219 -51.379295 -41.398281 -0.697536 0.014138 0.198975 0.624464 -0.025672 0.257716 -6.720199 15.631665 -18.756304 65.503212 70.584396 47.880749 -40.419041 58.486000 -26.962854 -0.987462 -0.472984 -0.233663 0.316679 -0.150354 -0.313422 +10.654404 166.179779 -10.645554 -4.944256 -39.087788 6.348263 4.325727 -0.970683 0.016181 -1.205743 -0.157807 9.864465 -1.096951 0.822241 -0.219537 0.954418 0.851100 0.799497 1.295098 3.731236 -10.465878 -1.462644 0.427104 9.707247 -0.313712 -0.764381 -0.004805 0.867795 0.368795 0.511673 3.171412 -0.430666 -8.544799 1.389963 -1.645985 15.086342 3.622384 -2.982769 31.504795 6.846983 12.960088 -0.861428 -10.437006 15.113918 -13.143548 13.846340 -14.872466 -11.076325 -54.482483 -70.344421 37.039261 72.295982 -51.172344 -45.048656 -0.682150 0.032925 0.196125 0.613875 -0.006114 0.268225 -8.196864 15.559580 -19.170992 64.083588 72.440781 48.616299 -43.497639 57.674503 -28.336992 -0.988700 -0.487447 -0.210443 0.311457 -0.168925 -0.305869 +11.125395 166.299744 -10.601816 -4.740160 -38.537167 6.115050 4.048481 -0.737400 1.379201 -1.179225 -0.227580 7.158032 -1.084738 0.788376 -0.228655 1.000917 0.920972 0.829529 0.713187 3.411147 -10.135060 -0.925823 0.299939 8.839221 -0.336795 -0.755659 -0.007592 0.898849 0.341237 0.516950 2.366146 -0.958242 -8.728352 1.630340 -2.214990 15.438787 4.476635 -3.578359 32.226089 6.641571 12.948731 -0.745057 -10.782589 14.985612 -13.848970 13.948818 -13.862144 -10.626502 -56.628014 -69.249527 36.820278 75.675552 -49.002544 -46.430412 -0.661248 0.045069 0.186051 0.600412 0.025978 0.282437 -9.989197 15.184614 -19.792603 63.833912 73.167816 49.030106 -44.953426 57.150688 -29.091829 -0.983364 -0.499070 -0.180107 0.311097 -0.200623 -0.294014 +11.704982 166.443573 -10.500327 -4.902152 -38.577633 6.606191 3.967666 -0.571117 1.688066 -1.402363 -0.226259 5.278137 -1.077761 0.775152 -0.227254 1.014740 0.938797 0.830495 0.492277 3.368220 -10.587141 -0.772997 0.246548 8.689735 -0.344673 -0.747596 -0.001659 0.902613 0.336509 0.516506 2.692729 -1.349458 -8.828351 1.617638 -2.523815 15.354789 4.594627 -3.812340 32.288555 6.288514 13.026314 -0.367314 -10.775361 14.813252 -14.011901 13.776206 -13.612578 -9.788488 -60.582260 -68.036064 37.971722 78.955338 -46.889603 -47.705170 -0.646007 0.045985 0.189765 0.590842 0.035649 0.293364 -11.118945 14.942119 -19.831707 66.460342 73.011261 51.017929 -46.437981 57.026867 -30.156076 -0.980619 -0.496784 -0.170941 0.315331 -0.209686 -0.286371 +12.290704 166.611801 -10.457254 -4.451474 -38.422558 6.790403 3.186703 -0.593420 1.158560 -1.276390 -0.268725 4.707998 -1.069638 0.768653 -0.232556 1.016225 0.945699 0.824963 0.018032 3.191138 -10.856431 -1.310403 0.235380 8.007919 -0.350006 -0.756330 -0.000957 0.898630 0.330614 0.531174 2.337476 -1.658933 -8.863449 1.543133 -2.792575 15.227049 4.852370 -4.019577 32.291412 6.229304 13.150345 -0.183849 -11.170837 15.021295 -14.089559 13.014682 -13.408588 -8.975149 -65.255104 -67.021538 40.152306 82.305130 -45.638062 -49.411636 -0.647906 0.061677 0.185085 0.594335 0.043850 0.295907 -11.717545 14.692482 -19.848322 69.128975 72.343956 52.539219 -47.315952 57.403542 -31.085566 -0.980848 -0.502920 -0.156300 0.300064 -0.209540 -0.281604 +12.875531 166.796127 -10.318791 -4.070812 -38.260422 7.089659 2.559883 -0.654498 0.366627 -1.238704 -0.282167 4.543143 -1.077106 0.788649 -0.222730 0.994107 0.917558 0.828116 -0.513203 2.922876 -10.851745 -1.647080 0.162917 6.766772 -0.346808 -0.757777 0.008350 0.884187 0.340838 0.534871 2.385808 -1.728528 -8.986812 1.525151 -2.863063 14.998963 5.042413 -4.071307 32.190971 6.303298 12.619086 0.119050 -12.283116 15.076365 -14.216791 12.455155 -13.078830 -8.884089 -72.097710 -67.240944 45.277969 81.637329 -44.454758 -48.337662 -0.669855 0.028617 0.190516 0.610847 0.044922 0.292762 -11.799401 14.050757 -19.717897 72.974464 71.297256 54.834290 -47.838268 58.205597 -31.992229 -0.988223 -0.485575 -0.170921 0.313014 -0.202340 -0.289735 +13.395077 166.737762 -10.082503 -4.089847 -38.572506 7.906460 2.023226 -0.771835 -0.614322 -0.956871 -0.310606 4.438101 -1.090999 0.837962 -0.221204 0.939800 0.833757 0.820332 -0.772714 2.743091 -11.101755 -2.010183 0.080789 5.364624 -0.320281 -0.772708 -0.000133 0.844304 0.358260 0.544182 3.062252 -1.634425 -9.226872 1.376643 -2.750168 14.442250 4.875720 -3.944598 31.619038 6.492706 12.150744 0.513427 -13.014243 15.226171 -13.560247 12.360047 -12.960727 -9.066564 -79.192009 -67.515518 50.885387 78.395531 -42.794807 -45.265221 -0.717387 0.013727 0.188676 0.637388 0.013729 0.254864 -11.302478 13.244636 -19.318937 77.865608 69.759842 57.727581 -47.193928 59.089581 -32.161739 -0.993525 -0.474057 -0.192754 0.299459 -0.161056 -0.313150 +13.828653 166.652512 -9.840980 -4.151379 -39.715862 8.555477 1.746907 -0.754878 -1.088156 -1.389479 -0.252810 4.218377 -1.094460 0.847454 -0.218103 0.918178 0.790864 0.826976 -1.008653 2.547835 -11.201224 -2.324178 0.017737 3.860257 -0.313390 -0.762404 -0.003633 0.820353 0.350867 0.538424 3.126805 -1.284690 -9.438453 1.382890 -2.418868 14.068754 5.008206 -3.604424 31.115501 6.412742 11.882789 1.204330 -13.347988 15.287351 -13.348889 12.705297 -13.583503 -9.407660 -85.446564 -67.152603 54.847454 74.411972 -41.302387 -42.276527 -0.715568 -0.002619 0.206030 0.630796 0.009265 0.238870 -10.225543 13.082952 -19.100153 79.090797 68.281090 57.511650 -43.573631 60.552917 -30.385550 -0.984893 -0.460988 -0.207544 0.293337 -0.152303 -0.329515 +14.215366 166.400497 -9.639891 -4.677720 -41.686428 9.656706 1.885013 -0.656468 -1.603452 -2.277337 -0.131871 4.024805 -1.096539 0.847049 -0.216312 0.899181 0.765406 0.823466 -0.900262 2.684221 -12.250626 -2.741712 0.018088 3.545446 -0.316231 -0.743360 -0.003258 0.803856 0.347300 0.530707 3.160746 -0.712731 -9.501808 1.436634 -1.890032 13.627561 5.169096 -3.120769 30.388159 6.273380 12.225251 1.860964 -13.435210 15.693666 -13.532401 13.751966 -14.217770 -9.579228 -91.074524 -66.179016 58.107872 71.605705 -41.023403 -41.015305 -0.707246 -0.029610 0.230715 0.619336 0.019214 0.234175 -8.760969 13.039057 -19.083811 80.860359 66.582199 57.432156 -37.243942 61.676510 -26.572687 -0.976292 -0.434797 -0.222670 0.302144 -0.146139 -0.336545 +14.641613 166.171127 -9.462562 -4.921983 -42.801075 10.401458 1.961649 -0.653288 -2.308728 -2.962060 -0.032566 4.267697 -1.101563 0.853457 -0.224961 0.870326 0.719591 0.826937 -0.979882 2.826349 -13.204652 -3.001142 0.008811 3.600504 -0.311085 -0.731952 -0.012616 0.774296 0.332458 0.530921 3.247879 -0.434707 -9.442404 1.396472 -1.644224 13.281281 5.101701 -2.848711 29.631275 6.132382 12.535857 2.332519 -13.839775 16.173334 -13.591652 14.036519 -14.964469 -10.235558 -94.001587 -65.193275 59.397999 65.991959 -42.356003 -38.854191 -0.711980 -0.044189 0.250843 0.612267 0.019960 0.205883 -6.929202 13.165133 -19.168177 81.738197 65.022469 56.448383 -29.359505 61.857716 -21.390314 -0.967768 -0.414291 -0.232128 0.287072 -0.126680 -0.356596 +14.929004 165.985611 -9.151836 -5.146772 -44.025570 10.659870 1.861766 -0.618712 -2.457432 -3.627368 0.076044 4.691832 -1.113603 0.862037 -0.234416 0.836180 0.655577 0.837443 -1.104248 2.909253 -13.575015 -3.150526 -0.015004 3.813988 -0.314156 -0.699742 -0.017814 0.729508 0.310522 0.530876 3.055251 -0.057957 -9.364016 1.450817 -1.412310 13.194138 5.110569 -2.577329 29.038452 6.297140 12.702289 3.478209 -14.333034 16.750994 -14.108746 14.413742 -15.568020 -11.278418 -95.429695 -63.821934 59.185909 57.418194 -45.314835 -35.808811 -0.706590 -0.085103 0.302984 0.591128 0.034978 0.175094 -5.280315 13.301097 -19.151182 81.850861 62.609364 53.425987 -20.594717 61.990658 -15.891312 -0.957578 -0.366274 -0.250480 0.280691 -0.103298 -0.386017 +15.239906 165.860687 -8.873873 -5.101358 -44.078457 10.554264 1.762973 -0.619790 -2.705960 -4.132512 0.163494 5.248610 -1.065822 0.808932 -0.239849 0.811836 0.623993 0.841892 -1.365934 2.949719 -13.787544 -3.244636 -0.017868 4.303505 -0.331706 -0.644221 -0.022773 0.671724 0.259055 0.532400 2.976861 -0.084707 -9.119883 1.366517 -1.515588 13.196385 4.765889 -2.713930 28.262587 6.814708 12.806744 5.025874 -14.482751 17.505720 -14.744325 14.495887 -16.764977 -12.363049 -92.717079 -62.055065 55.235191 46.282558 -50.457123 -31.692688 -0.660865 -0.094262 0.338789 0.541981 0.078395 0.152664 -3.421954 14.127910 -18.576777 82.206139 59.136444 48.684807 -12.521753 61.617619 -11.249223 -0.906939 -0.322045 -0.224770 0.247289 -0.103141 -0.389675 +15.554181 165.727951 -8.521416 -4.992289 -43.029907 10.302081 1.799044 -0.734454 -3.166370 -4.538305 0.242601 6.367111 -1.036913 0.752425 -0.246099 0.799819 0.595353 0.851504 -1.727636 3.030383 -13.933911 -3.180070 0.005409 5.350820 -0.342926 -0.582150 -0.018190 0.625031 0.202747 0.512445 3.246763 -0.343732 -8.779749 1.318521 -1.792602 13.138346 4.421697 -2.928024 27.262768 7.133666 12.467698 6.503696 -14.343180 17.727160 -15.214037 13.763721 -18.234430 -13.430535 -90.439125 -59.598083 50.590897 32.098812 -54.040592 -24.599171 -0.596401 -0.113991 0.388799 0.482040 0.111295 0.135804 -1.226582 14.862134 -17.865034 81.529343 55.168659 42.481625 -3.667370 60.634468 -6.241711 -0.865408 -0.278168 -0.215349 0.225861 -0.110626 -0.402989 +15.849076 165.574310 -8.131860 -5.068333 -41.067970 10.106946 2.219613 -0.983507 -3.892625 -4.928264 0.300052 8.002980 -0.974695 0.673846 -0.249245 0.785369 0.561364 0.864256 -1.804403 3.097839 -13.968277 -3.114265 0.019697 6.572827 -0.362699 -0.512554 -0.022638 0.559440 0.124588 0.503094 3.246873 -0.894110 -8.172311 1.569622 -2.382916 12.990288 4.773133 -3.400424 25.807117 7.534362 11.780448 8.253345 -14.297837 18.063457 -15.435966 12.291859 -20.430418 -13.915789 -87.921021 -56.758984 44.783585 17.719345 -55.451141 -16.588863 -0.510555 -0.109447 0.436906 0.405972 0.161027 0.118351 0.317219 15.617240 -17.052387 78.412018 50.447380 34.290943 8.714778 60.411060 0.767698 -0.795650 -0.242457 -0.184958 0.174225 -0.129363 -0.409777 +16.292578 165.454025 -7.821098 -4.871679 -38.688713 9.761529 2.260157 -1.424712 -5.083307 -4.831028 0.272306 10.155741 -0.929159 0.591818 -0.264899 0.778132 0.545931 0.891141 -2.257285 3.204778 -14.475119 -2.807207 0.011261 8.639344 -0.386443 -0.438901 -0.028916 0.507698 0.036384 0.489523 3.615349 -1.483473 -7.302910 1.715158 -2.932990 12.817417 4.830313 -3.806264 24.267712 7.908114 10.728236 9.849509 -14.754625 18.273989 -16.239548 10.317590 -21.980553 -14.548903 -85.792686 -53.839848 39.431683 2.632618 -54.322548 -7.791092 -0.432590 -0.123592 0.486953 0.331576 0.219326 0.092193 1.359591 15.725340 -16.802837 77.041733 45.500538 26.988073 19.085180 56.334438 5.642725 -0.736002 -0.196466 -0.155901 0.134010 -0.147351 -0.423532 +16.767014 165.220108 -7.596445 -4.816630 -36.790577 9.367983 2.466438 -1.855611 -6.022723 -5.049363 0.254085 12.265924 -0.890086 0.510714 -0.288790 0.798678 0.555843 0.921003 -2.412832 3.453909 -15.473419 -2.841933 0.052842 11.852003 -0.429361 -0.365020 -0.042164 0.468560 -0.055111 0.493362 4.239603 -1.800911 -6.213076 1.862685 -3.158482 12.595392 4.732828 -3.848646 22.623755 8.044323 9.594744 11.559546 -14.349407 17.979103 -17.310083 8.532695 -23.883814 -15.057103 -83.152710 -51.063713 33.961685 -8.430391 -50.342369 -1.799217 -0.341301 -0.123655 0.553789 0.244320 0.293513 0.077877 2.455341 15.799919 -16.267269 75.115257 40.511330 19.463898 24.019423 50.752930 6.489604 -0.683317 -0.154140 -0.114255 0.092475 -0.169525 -0.430516 +17.290911 164.959213 -7.414825 -4.478417 -35.145138 8.876101 2.365196 -2.374192 -7.190221 -5.518082 0.285005 14.595009 -0.847710 0.429252 -0.295581 0.817548 0.578810 0.953382 -2.935126 3.624351 -16.941275 -2.514184 0.023516 15.458811 -0.462106 -0.291627 -0.037040 0.440824 -0.127184 0.480081 4.448170 -2.098420 -4.941921 2.011973 -3.327550 12.311473 4.844123 -3.878735 21.023130 7.943216 8.780449 12.722813 -14.475996 17.711874 -18.331877 5.413836 -24.815405 -15.323556 -80.279602 -48.015671 28.767843 -16.461260 -44.307777 1.851089 -0.264389 -0.148040 0.597518 0.176007 0.357297 0.073871 3.838594 15.699075 -15.997826 72.945160 36.886215 14.157047 24.673544 44.276363 5.275273 -0.636407 -0.109438 -0.081147 0.079550 -0.201851 -0.430333 +17.785343 164.539001 -7.141523 -3.791245 -33.846031 8.387157 1.852908 -2.899937 -8.296381 -6.096842 0.341151 16.631353 -0.808238 0.355307 -0.302025 0.831616 0.598727 0.951845 -3.781037 3.740919 -19.018318 -2.164133 -0.041196 19.654463 -0.487705 -0.232848 -0.030307 0.416189 -0.179527 0.467214 4.306993 -2.352704 -3.638881 2.095264 -3.466448 11.781212 5.023437 -3.875977 19.177557 7.386358 8.591800 13.662288 -13.834954 17.137136 -18.778818 1.960691 -25.163218 -14.632752 -78.016800 -44.202263 23.552284 -19.917215 -38.329239 2.590349 -0.187717 -0.154263 0.635079 0.111997 0.403640 0.079281 5.163298 15.574767 -15.607550 70.591850 33.865841 10.379823 24.017225 37.946579 3.954708 -0.597360 -0.074694 -0.049744 0.067209 -0.221737 -0.418418 +18.330759 164.179581 -6.870327 -3.681135 -33.151340 8.070025 1.865900 -3.263278 -9.093833 -7.076929 0.525211 18.374027 -0.798733 0.300127 -0.318664 0.838479 0.605428 0.959621 -4.173430 4.119389 -21.660055 -1.905512 -0.082959 24.898504 -0.506839 -0.166358 -0.028408 0.397086 -0.230968 0.442493 4.744067 -2.604010 -2.125001 2.256796 -3.581299 11.288576 5.008955 -3.833755 17.503284 6.419683 8.837600 14.846249 -13.476909 16.512730 -19.515322 -1.287033 -25.412186 -13.747530 -75.364235 -40.273064 18.525545 -19.840181 -32.175537 1.762491 -0.122956 -0.192694 0.686309 0.048361 0.443977 0.068460 6.177608 15.792447 -15.426707 68.357788 31.555937 7.664391 21.241856 31.155571 2.268438 -0.569114 -0.019661 -0.039187 0.075034 -0.226762 -0.421802 +18.939306 163.776047 -6.580958 -3.720657 -32.206123 7.651282 2.004519 -3.678839 -9.836908 -7.989707 0.724398 20.425817 -0.760992 0.249768 -0.309020 0.846747 0.610231 0.966991 -4.569657 4.494790 -24.502705 -1.122313 -0.321967 30.765654 -0.523824 -0.115091 -0.017938 0.373039 -0.266962 0.427568 5.576309 -2.850151 -0.464693 2.555452 -3.584078 10.752144 4.959300 -3.723801 15.846239 5.325629 8.634088 15.645189 -13.433267 15.707110 -19.426193 -5.470442 -25.574333 -12.463014 -71.813065 -36.774284 14.242193 -18.183001 -26.963381 0.834180 -0.061498 -0.211856 0.711779 -0.000145 0.478787 0.079219 7.203215 16.091066 -14.941464 65.143066 29.111261 5.211731 18.671806 25.223808 1.173900 -0.532027 0.009685 -0.019613 0.075905 -0.250108 -0.410450 +19.439470 163.280258 -6.358846 -3.231553 -30.929041 6.858565 1.773720 -4.101543 -10.373734 -8.927192 0.938995 22.065350 -0.725303 0.186942 -0.318703 0.872240 0.637902 0.986968 -5.462763 4.586460 -27.163103 0.127730 -0.821714 36.262287 -0.552885 -0.064471 -0.024821 0.358027 -0.325464 0.425053 5.291738 -2.864788 1.258097 2.988086 -3.640156 10.240232 5.567379 -3.770025 14.406233 4.510455 8.365150 16.270124 -13.276519 15.029097 -20.173136 -7.593249 -24.577877 -11.412386 -69.818794 -33.859203 11.203640 -15.123612 -23.856007 -0.217358 0.006055 -0.206937 0.740991 -0.060412 0.527148 0.078416 7.802942 15.485609 -14.418867 62.464172 26.800749 3.287712 15.403626 20.315866 0.300987 -0.492762 0.030450 0.016900 0.056504 -0.274000 -0.402824 +19.946774 162.931671 -6.141751 -2.898714 -29.681501 5.870984 1.895730 -4.475026 -10.590205 -10.181825 1.255313 23.522692 -0.724974 0.146599 -0.336209 0.882914 0.638385 1.002475 -6.115812 4.700952 -29.537872 1.648692 -1.540842 41.458977 -0.568589 -0.009576 -0.027956 0.343671 -0.376250 0.405295 4.895731 -2.932024 3.379297 3.563492 -3.887345 9.761519 6.236234 -3.949844 12.988148 3.558750 8.314308 17.141518 -13.135340 14.367659 -21.049139 -9.910426 -23.669518 -10.299650 -66.558167 -30.758142 8.031378 -11.624775 -21.327078 -1.136563 0.063747 -0.232437 0.790183 -0.118794 0.558664 0.065577 9.075508 14.934098 -13.808750 59.144989 24.671946 1.479747 11.770635 15.992798 -0.301133 -0.470865 0.071178 0.022373 0.057114 -0.278523 -0.414184 +20.385530 162.420090 -5.809050 -2.629579 -28.410467 5.047889 1.947702 -4.909387 -10.967044 -11.035223 1.555276 25.477037 -0.688370 0.129967 -0.322121 0.851673 0.598775 0.973703 -6.486128 4.818720 -32.389385 2.907674 -2.365039 47.160591 -0.562033 0.015903 -0.023939 0.302312 -0.378122 0.398145 4.998044 -3.110595 5.404242 4.020192 -4.073726 9.107855 6.576442 -4.041526 11.299379 2.619753 8.141638 17.236959 -12.970862 13.684276 -20.442793 -12.173937 -22.142656 -9.391544 -63.350090 -27.746367 5.657024 -9.421108 -18.544302 -1.481310 0.088213 -0.236741 0.793615 -0.140827 0.558756 0.062063 10.041064 13.447751 -13.078409 56.055981 22.263443 0.006051 9.110870 12.424438 -0.542901 -0.438307 0.093594 0.031726 0.050469 -0.267912 -0.399299 +20.655802 162.026123 -5.410189 -2.579285 -27.030783 3.905214 2.193041 -5.118251 -10.440008 -11.731739 1.839855 26.942944 -0.670667 0.106306 -0.319521 0.839352 0.575707 0.980028 -5.922709 5.223995 -34.627769 3.335677 -2.860260 52.538612 -0.569161 0.054167 -0.021103 0.271084 -0.405383 0.389587 5.081206 -3.273753 7.688556 4.604631 -4.311306 8.630200 6.929250 -4.148957 9.902285 2.230366 7.774840 17.572731 -13.491461 13.308335 -20.964165 -13.982994 -20.404556 -8.745137 -59.872799 -24.946609 3.649870 -7.365471 -16.181147 -1.686979 0.119134 -0.259946 0.819565 -0.173347 0.578928 0.052047 9.670031 11.711251 -12.443888 53.719810 20.020018 -1.216445 6.452978 9.831444 -0.684007 -0.413292 0.126729 0.037462 0.048415 -0.268086 -0.403226 +20.923830 161.772049 -4.961757 -2.448963 -26.234571 2.501436 2.375989 -5.115589 -9.258163 -12.836029 2.252694 27.794682 -0.665110 0.086009 -0.329235 0.833262 0.564884 0.964623 -5.266737 5.865745 -36.718525 4.138410 -3.463048 57.418667 -0.572619 0.075839 -0.026541 0.255885 -0.426751 0.383084 5.098778 -3.299753 10.047618 5.168306 -4.453836 8.310069 7.203218 -4.160669 8.788762 1.265124 7.959083 17.824543 -13.343112 12.685974 -21.318361 -15.072963 -18.624985 -8.199430 -56.492081 -22.251076 1.979178 -5.183663 -14.359780 -1.866831 0.152452 -0.261217 0.841903 -0.205720 0.588665 0.044471 9.763039 9.814312 -12.009745 50.379032 18.102114 -2.084780 4.678450 7.296798 -0.614830 -0.396773 0.144943 0.043737 0.040403 -0.259832 -0.400414 +21.304970 161.639526 -4.406205 -2.477626 -25.583950 1.134860 2.446629 -5.093029 -7.781987 -13.718141 2.549747 28.231613 -0.650031 0.086525 -0.313719 0.812903 0.526092 0.965160 -4.345796 6.413343 -37.727325 5.292819 -4.207455 59.874550 -0.569063 0.094820 -0.020372 0.225577 -0.431553 0.377287 5.368691 -3.518675 12.142909 5.688255 -4.636598 8.160872 7.295374 -4.185848 7.942498 0.932564 7.465970 17.837507 -14.010962 12.280703 -21.185457 -16.195415 -16.694933 -7.628699 -52.625534 -19.637558 0.561332 -3.642333 -13.151987 -1.899352 0.165656 -0.279686 0.853868 -0.218140 0.590423 0.042038 8.520665 8.301280 -11.396812 47.538345 16.361395 -2.569279 3.455353 4.880548 -0.454788 -0.378742 0.162765 0.038497 0.041495 -0.258521 -0.403009 +21.733635 161.645325 -3.841963 -2.286617 -25.117910 -0.636689 1.986293 -5.084488 -5.939081 -14.112706 2.645925 28.494408 -0.632304 0.063293 -0.300490 0.807424 0.519311 0.950874 -3.194491 6.859639 -37.570408 6.066957 -4.599330 60.515621 -0.570016 0.119315 -0.009515 0.213131 -0.435593 0.357969 5.798743 -3.771970 14.191962 6.053557 -4.701538 8.294361 7.031574 -4.094211 7.448591 0.239990 7.740993 17.806854 -13.703785 11.927844 -21.271889 -16.054817 -15.618456 -6.624852 -48.945755 -16.865530 -0.683796 -2.067552 -12.982361 -1.973437 0.199944 -0.290488 0.866414 -0.241907 0.594869 0.054184 6.860387 7.078993 -10.348022 44.608337 14.283694 -3.020995 2.963342 3.447149 -0.298268 -0.360637 0.177405 0.035423 0.051756 -0.266719 -0.393854 +22.125004 161.531906 -3.083708 -2.166203 -24.630690 -1.663722 1.515905 -5.174159 -4.827649 -14.471898 2.769121 29.009676 -0.600593 0.070499 -0.270768 0.743624 0.453749 0.892089 -1.901205 7.162938 -37.692253 6.769125 -4.928093 60.020603 -0.535954 0.111024 0.003509 0.173496 -0.396985 0.339500 6.378611 -4.183243 15.112103 6.172395 -4.737058 8.396427 6.765175 -3.990396 7.125211 0.108338 7.708813 16.786697 -13.546597 11.916632 -19.829775 -15.221964 -13.651916 -5.751749 -46.389057 -14.438077 -1.558282 -0.554936 -13.152649 -2.043138 0.188790 -0.289363 0.838840 -0.224319 0.555854 0.054913 4.676977 4.906705 -9.400670 42.898899 12.146390 -3.640697 1.656223 3.159911 -0.287754 -0.340275 0.179447 0.018132 0.051056 -0.245426 -0.377672 +22.466068 161.500366 -2.304932 -2.055101 -23.829338 -2.975442 1.081498 -5.366776 -3.480710 -14.614173 2.810500 29.752996 -0.580074 0.087083 -0.245907 0.686938 0.390968 0.825781 -0.878860 7.192424 -37.356110 8.201337 -5.672806 58.829304 -0.500118 0.103878 0.024154 0.136142 -0.348393 0.324482 7.110904 -4.645409 16.056213 6.283606 -4.748927 8.607339 6.359359 -3.813424 6.912333 -0.444602 7.587723 15.901487 -12.809057 11.334287 -18.524189 -14.213674 -11.942996 -5.137749 -43.866344 -12.573420 -2.079563 0.714412 -13.109380 -2.073658 0.173702 -0.291662 0.817658 -0.206092 0.511064 0.057749 3.064054 2.571803 -8.369623 40.710045 9.655045 -4.404863 0.360695 3.894627 -0.319801 -0.334030 0.190125 0.002431 0.059564 -0.214290 -0.359476 +22.872311 161.422791 -1.313470 -2.041801 -22.954294 -4.169893 0.394290 -5.555633 -1.919752 -14.591467 2.741154 30.261702 -0.562184 0.104488 -0.218997 0.637668 0.336687 0.781187 0.177427 7.040009 -36.515480 9.750964 -6.347628 56.410931 -0.475205 0.096511 0.041173 0.103359 -0.310694 0.316994 8.046453 -5.338715 16.680611 6.365494 -4.895295 8.906464 5.858542 -3.778972 6.917534 -0.668868 7.227249 14.600461 -13.153727 11.007820 -18.080950 -13.998933 -9.715944 -4.894775 -40.921242 -10.897231 -2.568496 1.856445 -13.603149 -2.119638 0.155882 -0.300594 0.800210 -0.187286 0.481149 0.060986 1.558456 0.042937 -7.874634 38.117565 7.941613 -4.851634 -0.943324 4.074091 -0.304717 -0.327695 0.199637 -0.012387 0.069006 -0.193076 -0.347032 +23.301834 161.322922 -0.261919 -2.056665 -22.119368 -5.023495 -0.362816 -5.720055 -0.578047 -14.546800 2.626470 30.498734 -0.509479 0.104380 -0.184608 0.601993 0.300938 0.747661 1.292220 6.826552 -35.948139 11.114471 -6.784885 53.397564 -0.454093 0.078111 0.056263 0.068971 -0.284203 0.324373 9.215619 -6.142268 16.680567 6.343857 -4.990275 9.155828 5.281582 -3.772311 7.048426 -0.810808 6.742489 13.154643 -13.888503 10.898558 -17.038511 -13.540312 -7.637950 -4.623315 -38.357166 -9.490891 -2.898944 3.393082 -13.749544 -2.143231 0.142634 -0.272378 0.754306 -0.163511 0.457513 0.071870 -0.374009 -2.491237 -7.236812 35.854542 6.106411 -5.189278 -1.819005 4.761631 -0.318013 -0.305341 0.178193 0.001749 0.048948 -0.192783 -0.323438 +23.686234 161.253693 0.765744 -1.725216 -21.339085 -5.937430 -1.456206 -5.890038 0.603888 -14.389922 2.487462 30.867016 -0.467344 0.106356 -0.154289 0.573984 0.274580 0.705853 2.280473 6.587149 -35.320629 11.818334 -6.785094 50.434319 -0.430463 0.055359 0.069255 0.047685 -0.249134 0.325109 10.032748 -6.845631 16.477690 6.122768 -5.138239 9.398839 4.615995 -3.864534 7.240083 -1.097282 6.626784 11.815160 -13.572453 10.636536 -15.706458 -12.353410 -5.602449 -4.248758 -36.042843 -8.030957 -3.102039 4.601740 -14.035872 -2.149399 0.133448 -0.237907 0.710573 -0.141117 0.425247 0.087278 -1.906721 -4.765110 -6.783354 33.498581 4.657531 -5.353775 -2.893635 5.280101 -0.335961 -0.289823 0.150717 0.009177 0.034345 -0.191540 -0.297698 +24.157162 161.186646 1.785058 -1.249826 -20.869225 -6.807131 -2.470140 -6.057405 1.476139 -14.745549 2.538543 31.418257 -0.432540 0.122809 -0.118299 0.539019 0.236929 0.654842 3.155160 6.387020 -34.742477 12.157935 -6.587288 47.521358 -0.401949 0.028409 0.084073 0.027185 -0.198550 0.322055 11.136605 -7.642877 16.154589 5.693991 -5.246580 9.628061 3.579639 -3.931761 7.420284 -1.653527 6.734112 10.493245 -13.025815 10.277324 -13.970187 -10.855429 -3.764762 -3.729257 -33.783527 -6.491786 -3.186473 5.447280 -14.330245 -2.110219 0.118431 -0.211203 0.668036 -0.112853 0.383642 0.107391 -3.683405 -6.718032 -6.234053 31.197969 3.397299 -5.334574 -3.333689 6.100046 -0.351692 -0.279308 0.125034 0.004580 0.031082 -0.184717 -0.270690 +24.543816 161.174515 2.710782 -0.406381 -20.720381 -8.002530 -3.568417 -6.142345 2.381830 -15.562885 2.771184 31.928183 -0.431420 0.139155 -0.105472 0.504654 0.206354 0.612895 3.927871 6.285587 -33.950470 12.257437 -6.179771 44.537949 -0.377832 0.010202 0.097563 0.016162 -0.162029 0.312303 11.388369 -8.015214 16.041689 5.233425 -5.344669 10.024038 2.808575 -3.967666 7.848491 -1.716463 6.841720 9.684943 -12.925175 10.299583 -13.257487 -9.800729 -2.117863 -3.490895 -31.199598 -5.060237 -3.232592 6.552756 -14.953437 -2.155915 0.095794 -0.212339 0.647986 -0.088289 0.351028 0.110882 -4.967220 -8.380969 -6.015828 28.897964 2.465482 -5.281107 -4.415234 5.208174 -0.258431 -0.287061 0.123772 -0.011843 0.040513 -0.164899 -0.262101 +24.924366 161.217102 3.655488 0.191367 -20.605526 -9.026384 -4.248478 -6.148026 3.274610 -16.468519 3.030528 32.124470 -0.422023 0.168055 -0.076619 0.478701 0.179473 0.574375 4.985765 6.271129 -32.759853 12.047461 -5.575088 40.923805 -0.353344 -0.003018 0.115113 0.009624 -0.103811 0.301709 11.800886 -8.365379 15.511666 4.840786 -5.417903 10.482122 2.078977 -3.982810 8.514678 -2.136933 7.185528 9.123150 -11.892690 9.930886 -12.057791 -8.794961 -0.788652 -3.314827 -29.166594 -3.931620 -3.237716 8.134041 -15.434363 -2.293288 0.070375 -0.218305 0.620836 -0.059979 0.313135 0.127324 -5.318571 -9.627439 -5.699814 25.206091 1.572420 -4.848063 -4.352842 4.992142 -0.188344 -0.293107 0.122209 -0.029410 0.067850 -0.151368 -0.242778 +25.193609 161.167664 4.602196 1.085115 -20.448780 -9.963815 -4.886878 -6.181475 3.799244 -17.912523 3.479262 32.480518 -0.424365 0.174109 -0.074736 0.492259 0.198889 0.570425 5.998796 6.188677 -31.345177 11.295822 -4.744587 36.859245 -0.355300 -0.017430 0.108482 0.028617 -0.095045 0.306364 12.166010 -8.641418 14.318472 4.200000 -5.463840 11.083456 1.172160 -4.028099 9.788781 -2.614137 7.395840 8.664772 -11.645167 9.604754 -12.155647 -7.988835 0.250729 -3.292256 -26.588480 -3.090108 -3.088936 8.976839 -15.737493 -2.332803 0.069957 -0.200423 0.609161 -0.055942 0.308886 0.138074 -4.957414 -10.655613 -5.491759 21.727760 0.616460 -4.410783 -4.809480 5.624505 -0.204448 -0.296788 0.102599 -0.026947 0.069686 -0.156954 -0.233054 +25.456829 161.244141 5.453497 1.736750 -20.427681 -11.156069 -5.374030 -6.222365 4.504257 -19.052168 3.874412 33.023182 -0.437924 0.150381 -0.100211 0.518343 0.239356 0.593834 7.190833 6.185464 -29.300119 10.783119 -3.999894 32.469421 -0.371075 -0.006022 0.088833 0.051988 -0.131293 0.303353 12.465596 -8.790054 13.584994 3.781213 -5.458520 11.813186 0.470457 -3.974958 11.109085 -2.747384 7.548503 8.673517 -11.898371 9.585697 -13.587842 -7.373384 0.819262 -3.283963 -24.075962 -2.472735 -2.910372 9.845958 -15.636508 -2.342551 0.087705 -0.194055 0.618596 -0.079389 0.329918 0.124256 -5.216070 -11.429153 -5.208989 19.450302 -0.398579 -4.194067 -5.936078 6.376239 -0.240710 -0.294362 0.102938 -0.015351 0.064767 -0.163053 -0.240143 +25.698383 161.138306 6.436345 2.892162 -20.001850 -12.208860 -6.475965 -6.325407 4.848981 -20.120022 4.218717 33.639622 -0.471859 0.164892 -0.121375 0.539506 0.249544 0.620807 7.586610 5.788868 -27.347414 10.269388 -3.381520 28.162188 -0.379934 -0.012640 0.076778 0.068466 -0.149705 0.314046 11.988592 -8.701845 12.435961 3.351420 -5.639734 12.286113 0.189429 -4.091787 12.314336 -2.659556 7.639043 8.754080 -12.352654 9.730159 -14.466087 -7.064513 1.410851 -3.125251 -21.823694 -1.374560 -2.774240 10.792620 -16.393957 -2.506936 0.083639 -0.192459 0.639503 -0.083278 0.337054 0.113143 -5.042308 -11.842555 -5.062421 16.680347 -0.995635 -3.812165 -6.916070 6.431099 -0.238458 -0.312520 0.098612 -0.020152 0.058101 -0.160936 -0.261275 +25.910547 160.746063 7.528904 3.924113 -19.865732 -12.489672 -7.217910 -6.430526 4.354159 -21.375229 4.735176 34.472313 -0.499915 0.194250 -0.133975 0.542332 0.238445 0.632616 7.996422 5.566041 -26.023098 9.874848 -2.810990 23.790653 -0.369057 -0.045052 0.063140 0.079297 -0.146567 0.323266 12.182547 -8.621762 10.518632 2.661422 -5.556366 12.418596 -0.555461 -4.011299 13.401420 -2.376703 7.685660 8.586832 -12.654561 10.033906 -13.944119 -6.880316 2.327541 -2.986557 -19.112417 -0.204298 -2.457000 11.087448 -18.449564 -2.716679 0.058582 -0.170983 0.632414 -0.063287 0.314534 0.098669 -4.668498 -12.376065 -4.947219 13.996045 -1.585193 -3.327476 -7.717884 7.298539 -0.326011 -0.331249 0.070305 -0.030487 0.039385 -0.151176 -0.279891 +26.052021 160.273605 8.584429 4.806239 -19.632235 -13.064582 -7.715621 -6.342493 4.432799 -22.586929 5.274814 34.970837 -0.489861 0.185404 -0.143962 0.552735 0.251568 0.656764 8.671461 5.407711 -24.186220 8.888281 -2.175031 19.701267 -0.375103 -0.054682 0.048656 0.082436 -0.172786 0.338558 11.768655 -8.262827 9.238684 2.377448 -5.469508 12.582779 -0.662310 -3.947859 14.229674 -1.736867 7.117267 8.668033 -13.515453 10.301500 -14.036817 -6.721479 2.992761 -2.866513 -16.485685 0.725539 -2.119512 11.011719 -19.122166 -2.659690 0.055014 -0.146449 0.618094 -0.061560 0.326148 0.087453 -5.208820 -12.966419 -4.296618 11.950583 -2.782593 -2.860738 -7.771271 10.034022 -0.503808 -0.323195 0.049335 -0.010854 0.009566 -0.161316 -0.285744 +26.153206 159.678543 9.662126 5.672128 -18.970856 -13.546414 -8.245645 -6.402678 4.487336 -23.962164 5.919540 35.867405 -0.500612 0.185703 -0.158949 0.570092 0.266128 0.686847 9.002768 5.130283 -22.726898 7.715869 -1.720452 16.748243 -0.381572 -0.063968 0.036125 0.094156 -0.196960 0.349873 10.852424 -7.770256 7.820620 2.277093 -5.488703 12.662539 -0.247948 -3.966291 15.092892 -1.069332 6.490489 9.018487 -14.107321 10.396463 -14.210186 -6.334041 3.310056 -2.894783 -14.495990 0.994944 -1.739919 10.128114 -18.132761 -2.339853 0.050780 -0.135380 0.618027 -0.060182 0.335982 0.076359 -5.528442 -13.431081 -3.641950 9.321138 -4.092422 -2.240047 -7.630692 11.321389 -0.535636 -0.327795 0.033850 -0.002989 -0.009905 -0.170114 -0.299785 +26.242157 159.056427 10.724662 6.239224 -18.439138 -13.832105 -8.276051 -6.393949 4.521906 -25.458183 6.643927 36.547966 -0.496688 0.175647 -0.160750 0.577563 0.277503 0.699962 9.444031 4.985506 -21.522278 6.333249 -1.344602 14.636082 -0.385986 -0.062631 0.034807 0.097818 -0.211049 0.349949 10.432845 -7.430657 6.505866 2.204266 -5.445946 12.615464 -0.008785 -3.937363 15.670188 -0.808022 5.748035 9.652847 -14.600969 10.175768 -14.012423 -6.143517 2.936904 -2.591632 -12.561704 1.405478 -1.361714 8.655087 -15.916533 -1.840423 0.055462 -0.137581 0.613813 -0.062066 0.345170 0.075847 -5.586308 -13.156336 -2.825740 7.037210 -5.722049 -1.792325 -8.625985 11.727399 -0.570697 -0.324443 0.029863 0.004498 -0.014347 -0.180219 -0.300817 +26.399019 158.383530 11.562453 6.533475 -17.922400 -14.316073 -7.979004 -6.343099 4.786395 -27.093172 7.461286 37.119217 -0.493312 0.173595 -0.156623 0.559692 0.264990 0.673086 9.796853 4.936187 -20.476849 5.442249 -1.156112 13.837215 -0.376387 -0.056508 0.047114 0.086998 -0.195152 0.339814 10.242302 -7.191998 6.184825 2.204404 -5.354572 12.535324 0.027349 -3.832601 15.604261 -0.881193 5.293744 10.168983 -14.078119 9.615062 -13.474258 -5.599453 2.358453 -2.155710 -10.843760 1.645387 -0.994144 7.265853 -13.519618 -1.419459 0.052831 -0.154183 0.611387 -0.058915 0.335555 0.077141 -5.829693 -12.584954 -2.257865 5.677421 -6.869461 -1.663387 -10.191896 10.472950 -0.491181 -0.326507 0.047627 0.001029 -0.000401 -0.167178 -0.291572 +26.556192 157.718582 12.271540 6.380319 -17.821911 -14.912741 -7.214255 -6.308482 5.186727 -28.627035 8.357115 37.895264 -0.502947 0.189029 -0.148456 0.539859 0.231104 0.662457 10.433414 5.125310 -19.600311 4.987060 -1.078429 14.101810 -0.372256 -0.046240 0.052173 0.071082 -0.183588 0.332093 10.780457 -7.219910 6.421147 2.165573 -5.227078 12.534270 -0.395986 -3.628470 15.337234 -0.903387 4.694060 10.529661 -13.867648 9.058832 -13.140133 -5.473867 1.789398 -1.842234 -9.069353 1.955936 -0.692501 6.765570 -11.384302 -1.172269 0.053850 -0.183758 0.631207 -0.062547 0.330982 0.076491 -6.667338 -12.042867 -1.616639 5.184549 -7.902985 -1.719086 -11.263196 10.000395 -0.429110 -0.327843 0.070151 -0.018191 0.016333 -0.155435 -0.295633 +26.731493 156.977783 12.911215 5.749510 -17.947865 -14.876196 -5.851326 -6.331138 5.040051 -29.888397 9.278985 38.921448 -0.474540 0.157612 -0.148240 0.569026 0.268236 0.676936 11.234821 5.722392 -20.142626 4.913271 -1.063747 15.794083 -0.385339 -0.048800 0.049852 0.078833 -0.207793 0.343647 11.758659 -7.348148 6.340791 2.178893 -4.991047 12.479827 -0.749495 -3.448191 15.302140 -0.682128 4.096339 10.429544 -13.748868 8.698037 -13.057429 -5.074018 1.774790 -1.874582 -7.806669 1.625470 -0.471274 5.780463 -9.237125 -0.904145 0.077873 -0.146096 0.616830 -0.073632 0.348433 0.089247 -7.607245 -12.092249 -1.168332 4.679462 -8.638221 -1.543763 -11.696060 10.721169 -0.482377 -0.313834 0.042196 0.013536 -0.010936 -0.183904 -0.284186 +26.891027 156.377167 13.327655 5.102214 -18.261744 -14.989128 -4.493482 -6.281982 4.900490 -31.179941 10.266704 39.922405 -0.422486 0.141373 -0.125782 0.568139 0.268646 0.660581 11.452759 6.226135 -20.913805 5.716265 -1.264047 17.816898 -0.393678 -0.046054 0.063594 0.051667 -0.198186 0.366875 12.710560 -7.537663 7.008316 2.244766 -4.738725 12.402573 -1.175083 -3.204752 14.764139 -0.712356 3.531544 10.237663 -13.413303 8.135630 -12.556401 -4.845258 1.259388 -1.474052 -7.046921 1.925379 -0.417065 5.304293 -7.158357 -0.725759 0.087746 -0.122387 0.600189 -0.073734 0.360527 0.110370 -8.791560 -11.651553 -0.099968 4.421490 -9.981215 -1.359460 -10.710456 12.106461 -0.460870 -0.293659 0.037225 0.048437 -0.027140 -0.194823 -0.255111 +27.101107 156.043045 13.694946 4.697536 -18.423611 -15.267931 -3.937472 -6.205709 5.060474 -31.456608 10.751298 40.701042 -0.399266 0.143924 -0.117422 0.520904 0.218609 0.623662 10.952353 6.396293 -21.324078 7.208697 -1.647410 19.398800 -0.376667 -0.046153 0.068833 0.013533 -0.184599 0.366184 12.932963 -7.529281 8.156934 2.585635 -4.603326 12.251548 -1.017434 -3.043784 13.895927 -0.493754 3.309174 10.327525 -13.491726 8.260924 -11.463746 -4.908482 0.669472 -1.020941 -7.123051 2.385113 -0.504608 5.168424 -5.807739 -0.632258 0.076307 -0.125171 0.589326 -0.064653 0.347131 0.100362 -10.074076 -10.977517 0.428025 4.954909 -10.342515 -1.620351 -11.143819 11.153753 -0.333773 -0.279048 0.050680 0.047705 -0.038492 -0.172133 -0.248216 +27.194288 155.846420 13.936865 4.701903 -18.551880 -15.282547 -4.043174 -6.009355 4.924394 -30.971451 10.876100 41.320034 -0.432705 0.161970 -0.126431 0.499012 0.195372 0.622888 10.194672 6.491040 -21.727839 8.407451 -1.928726 20.240858 -0.370883 -0.039833 0.072352 0.009404 -0.178451 0.355870 12.588210 -7.230810 8.310842 2.648266 -4.500310 12.434989 -0.794833 -2.930981 14.160366 0.025211 3.324046 10.314309 -14.083448 8.724505 -12.161400 -5.362034 0.395737 -0.855348 -6.332723 2.787757 -0.322037 4.268990 -5.250574 -0.593896 0.054698 -0.168896 0.609935 -0.056865 0.342853 0.082302 -9.795193 -10.363143 0.388712 4.674984 -9.632312 -1.531737 -10.542274 10.957416 -0.288951 -0.296860 0.082814 0.021042 -0.015547 -0.149623 -0.267156 +27.134975 155.743454 14.119104 4.866178 -18.754177 -14.911173 -4.413141 -5.829868 4.291426 -30.403328 10.966003 42.058308 -0.443076 0.162847 -0.135465 0.496240 0.209208 0.629194 9.746473 6.590886 -21.979713 8.958549 -1.952113 20.073042 -0.368603 -0.040893 0.070331 0.021396 -0.177149 0.351628 11.625760 -6.701251 7.977545 2.728663 -4.390416 12.595148 -0.174122 -2.894235 14.726892 0.475400 3.593171 10.128131 -14.531621 9.306484 -12.766029 -5.640609 0.840139 -0.923499 -6.266956 3.086096 -0.221611 3.600195 -5.750442 -0.585954 0.034334 -0.180985 0.599332 -0.045491 0.343424 0.071668 -8.850672 -10.132401 -0.220471 3.726614 -7.886056 -1.196005 -9.602070 9.824903 -0.204288 -0.304721 0.090413 0.018053 -0.004247 -0.143547 -0.270982 +27.062412 155.897614 14.185462 4.702141 -19.053236 -14.384278 -4.415975 -5.643900 3.719175 -29.743181 10.891949 42.371990 -0.467203 0.202572 -0.131737 0.477178 0.180415 0.614331 9.676705 6.627028 -21.723570 9.503357 -1.894399 18.747835 -0.350951 -0.057369 0.070556 0.023243 -0.141812 0.347057 11.220742 -6.430196 7.645423 2.674302 -4.319846 12.615208 -0.026985 -2.858220 14.937925 0.489133 3.992332 10.205354 -13.973082 9.419083 -11.967360 -5.423677 1.658094 -0.831925 -6.988938 3.735090 -0.181672 3.191122 -7.736469 -0.655280 0.002146 -0.193190 0.595066 -0.021536 0.313398 0.066251 -8.299221 -9.855960 -1.085185 3.824841 -5.498709 -1.199955 -9.165343 8.670361 -0.180918 -0.323850 0.091876 -0.007959 0.012804 -0.121144 -0.277245 +26.992191 156.161606 14.099715 4.555770 -19.342144 -14.047582 -4.414412 -5.385990 3.318237 -29.494419 10.859699 42.231865 -0.492666 0.209197 -0.137513 0.494581 0.188470 0.623404 10.090039 6.664544 -21.057207 9.166448 -1.611408 16.985708 -0.349878 -0.065192 0.065160 0.044501 -0.145483 0.336497 10.774750 -6.179006 7.997629 2.765304 -4.189679 12.617057 0.178246 -2.758378 14.784556 0.270554 4.443264 10.026545 -13.477418 9.427879 -11.957512 -5.108586 2.557919 -1.056708 -8.722729 3.730608 -0.403459 3.220789 -9.435929 -0.753071 0.013643 -0.185955 0.608641 -0.027546 0.303895 0.070405 -8.267813 -9.953661 -2.072025 5.138704 -3.423807 -1.551119 -10.128530 8.562395 -0.314663 -0.335373 0.075550 -0.025827 0.014133 -0.128854 -0.289766 +26.987343 156.460098 13.970010 4.490609 -19.488827 -13.573097 -4.599210 -5.061740 2.984394 -28.941542 10.625731 41.845757 -0.471325 0.195291 -0.129447 0.502002 0.202721 0.628204 10.613971 6.722864 -20.567158 8.240331 -1.278735 15.357640 -0.356053 -0.074055 0.072337 0.041762 -0.152517 0.348630 9.903635 -5.862104 8.455859 3.012755 -4.150947 12.518068 0.777431 -2.790006 14.417215 0.442027 4.229431 9.528186 -14.437084 9.750953 -12.091187 -5.485703 3.754303 -1.016181 -10.247355 4.713041 -0.688243 3.366843 -13.604311 -0.925722 0.015632 -0.167266 0.593708 -0.021514 0.313167 0.081685 -8.639348 -10.035387 -2.757028 6.858379 -1.634200 -1.842050 -10.581150 9.948848 -0.556240 -0.329964 0.059227 -0.008103 -0.000885 -0.144429 -0.282356 +27.042225 156.783188 13.806610 4.659094 -19.197525 -13.044544 -5.068776 -4.902409 2.437808 -28.315224 10.283175 41.516159 -0.474125 0.171340 -0.140275 0.529055 0.236669 0.654004 10.537061 6.465377 -20.141174 7.708049 -1.064868 13.489205 -0.368797 -0.052746 0.065490 0.060202 -0.180087 0.338810 9.260909 -5.600124 8.508336 2.984706 -4.083634 12.421692 0.997052 -2.794501 14.303719 0.456483 4.345447 9.565057 -14.154104 9.709458 -13.109565 -5.049250 4.453298 -1.191234 -12.520348 4.535635 -1.130031 3.057467 -15.342595 -1.053553 0.040708 -0.168739 0.605905 -0.045994 0.332512 0.080146 -8.760953 -10.089581 -3.432847 8.951596 -0.166791 -2.195595 -10.796643 11.474017 -0.817903 -0.323014 0.062987 -0.002441 0.002310 -0.161951 -0.287229 +27.070889 157.234970 13.528239 4.903712 -18.720329 -12.927723 -5.512418 -4.715675 2.360307 -27.731236 9.908867 41.028164 -0.477246 0.156903 -0.135797 0.543174 0.249506 0.661473 10.562078 6.176329 -19.512178 6.723522 -0.852359 11.850883 -0.373618 -0.028442 0.074022 0.066938 -0.187156 0.320934 8.727835 -5.533699 9.303082 3.017570 -4.114739 12.357384 1.063477 -2.808567 13.785796 -0.230280 4.581351 9.294343 -13.841100 9.295181 -13.909553 -5.128854 4.818499 -1.252134 -15.042760 4.622199 -1.686208 3.063397 -16.986532 -1.240066 0.067187 -0.186711 0.623804 -0.067853 0.339453 0.088623 -8.651815 -9.830698 -3.828869 10.705467 0.940320 -2.467958 -10.391334 13.223785 -1.037322 -0.319277 0.078133 -0.009016 0.022561 -0.173202 -0.286916 +26.986586 157.590607 13.186358 5.012701 -18.067570 -12.930072 -5.372014 -4.466617 2.459729 -27.557915 9.784141 40.590881 -0.471680 0.123901 -0.138377 0.574212 0.291438 0.664764 10.969322 6.010783 -18.855867 5.319505 -0.622480 10.490996 -0.391638 0.001657 0.076048 0.083402 -0.204681 0.308211 8.584237 -5.565907 9.963150 2.858659 -4.056869 12.347676 0.719612 -2.744308 13.410662 -1.246601 4.708414 9.410886 -13.012686 8.383268 -15.060739 -4.918186 5.557430 -1.442591 -17.879261 4.507411 -2.341301 2.711143 -20.059032 -1.497263 0.110704 -0.189878 0.641546 -0.104537 0.361338 0.103874 -8.360275 -9.815798 -4.342082 13.306748 1.874758 -2.877626 -9.748920 15.809143 -1.339157 -0.310267 0.090705 0.002475 0.039870 -0.190156 -0.273932 +26.906708 157.760803 12.829111 4.854756 -17.224089 -12.678609 -4.929375 -4.249716 2.338118 -27.427681 9.810705 40.501656 -0.510225 0.125282 -0.146793 0.588786 0.301252 0.661127 11.230856 5.995492 -18.778353 4.613470 -0.515085 9.511367 -0.387786 0.020918 0.085521 0.104535 -0.200386 0.278312 8.805017 -5.612277 10.296252 2.588215 -3.922820 12.294346 0.189282 -2.574376 13.151801 -2.070658 5.127629 9.181087 -11.833127 7.709471 -16.023748 -4.859659 6.526140 -1.717043 -20.353580 4.569479 -2.956875 1.867328 -24.672789 -1.792726 0.130983 -0.216984 0.673472 -0.124453 0.351242 0.108111 -7.566781 -9.982410 -4.962242 15.302258 2.886967 -3.070437 -7.576477 17.814629 -1.349365 -0.329445 0.111982 -0.025851 0.075409 -0.186052 -0.283825 +26.815115 157.864319 12.497855 4.924721 -16.216825 -12.316346 -4.654912 -4.099193 2.081384 -27.293919 9.813270 40.508087 -0.518692 0.121333 -0.146329 0.612912 0.322181 0.662344 11.254688 5.856118 -18.849113 3.853991 -0.424935 8.387758 -0.391993 0.027134 0.079190 0.125100 -0.199861 0.266143 9.296464 -5.855909 10.270830 2.076872 -3.821786 12.133689 -0.715761 -2.497265 12.911652 -3.107941 5.499163 9.035397 -10.670680 6.946041 -16.242304 -5.356088 7.391653 -2.020617 -22.447056 4.581450 -3.540382 0.937092 -29.087660 -2.009561 0.155863 -0.205404 0.681187 -0.143718 0.346435 0.119327 -5.987111 -9.926026 -5.926064 17.180820 4.220630 -3.234891 -5.696939 19.242548 -1.326080 -0.329774 0.102066 -0.029986 0.086474 -0.194954 -0.278788 +26.659124 157.943207 12.169959 4.859987 -15.116076 -11.892836 -4.337543 -3.943635 1.862045 -26.815838 9.700011 40.556553 -0.550309 0.137075 -0.154518 0.616718 0.314161 0.663701 11.290402 5.702821 -18.866014 3.467953 -0.388343 6.996898 -0.385153 0.036794 0.063159 0.140074 -0.196789 0.244390 9.748339 -5.940992 10.234177 1.713615 -3.667295 11.879894 -1.411407 -2.315864 12.557143 -4.324069 5.610637 8.939877 -9.744225 5.958096 -16.518559 -6.014820 8.367314 -2.558960 -24.833706 4.231818 -4.135959 -1.290569 -33.533619 -1.890175 0.168390 -0.217421 0.698695 -0.162414 0.330731 0.109340 -4.295988 -9.792051 -7.065080 19.297012 5.752541 -3.388582 -3.293059 19.013685 -1.064755 -0.333000 0.109641 -0.054212 0.107591 -0.183210 -0.286600 +26.515316 157.901016 11.759671 4.807269 -13.484087 -11.489164 -4.137255 -3.910171 1.484195 -26.640656 9.700407 40.882957 -0.524699 0.123896 -0.152201 0.611788 0.313108 0.634553 11.033256 5.473466 -19.081562 3.073832 -0.392885 5.774340 -0.383263 0.045491 0.065881 0.128239 -0.191084 0.247199 10.058475 -6.178772 10.699552 1.380789 -3.634420 11.328674 -2.047322 -2.317542 11.489108 -5.245039 5.890705 9.065252 -8.738092 5.379755 -16.304274 -6.554654 9.050294 -2.446669 -27.858294 4.502713 -5.078484 -2.840371 -38.116318 -1.847121 0.183287 -0.197429 0.691635 -0.174104 0.329862 0.116615 -3.358305 -9.287728 -7.815396 22.462214 6.949452 -3.673169 -0.902472 17.718649 -0.758431 -0.319374 0.112783 -0.037015 0.100534 -0.177346 -0.266515 +26.306656 157.776184 11.267117 4.839050 -11.727406 -11.001966 -3.834506 -3.868490 1.047179 -26.601889 9.774189 41.098186 -0.555251 0.145967 -0.167107 0.601194 0.280988 0.630159 10.576476 5.318708 -19.630301 2.764632 -0.406107 4.771560 -0.373656 0.059760 0.056095 0.120614 -0.189217 0.236221 9.857733 -6.068625 10.935959 1.167104 -3.554060 10.888759 -2.255041 -2.191351 10.775484 -6.065399 5.740546 9.245204 -7.850909 4.512421 -16.660528 -7.384904 9.359608 -2.757970 -30.861374 3.993416 -5.845351 -4.789071 -41.530552 -1.607389 0.185243 -0.212717 0.718226 -0.190144 0.314913 0.095968 -1.855538 -8.743054 -8.532251 25.217468 7.756401 -3.927855 1.596913 16.263815 -0.455132 -0.326537 0.136692 -0.056528 0.111847 -0.149478 -0.281023 +26.114286 157.597610 10.723449 4.716276 -9.624189 -10.479853 -3.739584 -4.021657 0.548557 -26.112980 9.656566 41.748707 -0.577937 0.177641 -0.168691 0.592469 0.254534 0.604110 10.067262 5.205142 -20.363268 2.529005 -0.425975 4.069306 -0.367860 0.063679 0.055492 0.114634 -0.160620 0.236597 9.802147 -5.967939 10.979726 1.028962 -3.471475 10.523513 -2.402449 -2.058527 10.217140 -7.130763 5.573710 9.386131 -6.328254 3.203214 -16.783506 -8.484742 8.957127 -3.029775 -33.953762 3.292509 -6.626560 -7.017308 -44.012741 -1.226701 0.182797 -0.223873 0.739750 -0.195965 0.298846 0.097647 0.458223 -7.724097 -9.000288 27.013821 8.032151 -4.087436 4.054659 14.477692 -0.181294 -0.339967 0.156815 -0.072456 0.133511 -0.122512 -0.276555 +25.916487 157.455811 10.199613 4.670084 -7.338297 -10.300797 -3.895435 -4.159964 0.582911 -25.178894 9.282801 42.194668 -0.574634 0.164542 -0.163019 0.595336 0.262054 0.593679 9.369881 4.891112 -20.577894 2.434323 -0.441372 3.148265 -0.371523 0.090557 0.064148 0.115273 -0.154506 0.219829 9.431767 -5.738033 11.215042 0.952251 -3.324126 10.186142 -2.411686 -1.925531 9.619166 -7.584638 5.099226 10.090036 -4.995748 2.242509 -17.106539 -10.570612 7.410359 -3.246912 -36.271412 2.644565 -7.413864 -8.593998 -45.261997 -1.018589 0.203851 -0.247843 0.754265 -0.214596 0.305387 0.107132 3.029017 -5.952456 -8.946297 28.792797 7.620810 -4.380876 5.840284 12.691720 -0.065811 -0.335193 0.182003 -0.076656 0.159745 -0.125077 -0.265792 +25.745251 157.297531 9.693662 4.423495 -4.274629 -10.228219 -3.893450 -4.529612 0.806820 -24.042398 8.784903 42.971752 -0.602301 0.173217 -0.169910 0.604564 0.269073 0.592192 8.490770 4.424596 -20.520472 2.333200 -0.479128 1.894250 -0.373120 0.099132 0.068494 0.129599 -0.148509 0.208769 9.601429 -5.766817 11.069847 0.767838 -3.276084 9.994817 -2.749448 -1.874221 9.415981 -7.590339 4.250040 10.665347 -4.116496 1.322327 -17.491209 -13.358111 5.516834 -4.044376 -37.003029 1.573470 -7.682173 -11.342407 -45.520077 -0.242328 0.208400 -0.270839 0.774051 -0.221445 0.304286 0.111403 6.133065 -4.313951 -9.096095 30.607971 7.255584 -4.688371 7.064330 11.090743 -0.062798 -0.352996 0.198008 -0.092206 0.185160 -0.120486 -0.270013 +25.531706 157.166061 9.101324 4.161376 -0.834290 -10.446733 -3.975892 -4.945456 1.404327 -22.585575 8.050953 43.591694 -0.598067 0.133688 -0.180868 0.637798 0.322711 0.592698 7.473336 3.811609 -20.074999 2.251366 -0.496543 0.502736 -0.388241 0.113412 0.065960 0.156185 -0.169070 0.196699 9.818007 -5.846576 11.486664 0.534102 -3.122881 9.775263 -3.278131 -1.817143 8.961064 -7.373227 3.353601 11.186131 -2.572386 0.401389 -18.192921 -16.107353 3.484877 -5.033530 -36.699684 0.031289 -7.538526 -15.536052 -45.114285 1.264453 0.244420 -0.255367 0.777872 -0.247589 0.321157 0.124479 9.469285 -2.864840 -9.128163 32.647564 6.604574 -5.104352 7.752701 10.238572 -0.132748 -0.350924 0.191467 -0.076953 0.187508 -0.140899 -0.258916 +25.209158 156.818207 8.386859 3.828655 2.023537 -10.117173 -3.468967 -5.236921 1.043330 -21.544348 7.663456 44.343750 -0.570909 0.120236 -0.179599 0.641667 0.328595 0.586454 6.861521 3.596713 -20.530397 1.824625 -0.504063 -0.356226 -0.391018 0.111424 0.060805 0.149690 -0.173360 0.206386 9.599277 -5.563447 11.689716 0.498821 -2.836181 9.123884 -3.280163 -1.643335 7.986537 -6.808116 2.327319 12.055702 -1.516734 -0.287329 -17.221106 -18.193110 1.999612 -5.655128 -37.793228 -1.652143 -7.366753 -18.318998 -44.206226 2.192696 0.253549 -0.227260 0.763649 -0.250796 0.325911 0.129709 11.832187 -1.481771 -8.924092 35.450375 6.280396 -5.441105 8.288719 9.165815 -0.190472 -0.337215 0.176245 -0.055525 0.165307 -0.149095 -0.246122 +24.847097 156.383591 7.533623 3.721751 4.879978 -9.477643 -3.042947 -5.589835 -0.035472 -20.616989 7.408252 45.445644 -0.569450 0.122345 -0.178182 0.636411 0.314559 0.583278 5.886562 3.440506 -21.692240 1.394545 -0.511669 -0.788263 -0.385715 0.113102 0.061480 0.142489 -0.169409 0.200891 8.678166 -5.064479 11.722814 0.517921 -2.636893 8.438732 -2.811278 -1.523808 7.031809 -6.231205 1.407000 12.914324 -0.570672 -0.875652 -16.285509 -19.611526 0.930178 -6.256313 -40.387711 -3.769873 -7.148487 -19.535673 -43.007294 2.421836 0.257133 -0.225797 0.766129 -0.251670 0.318736 0.129937 13.758798 -0.240966 -8.900966 38.669701 6.552589 -5.696430 8.528685 8.375411 -0.248222 -0.335611 0.175233 -0.060468 0.161823 -0.148666 -0.248106 +24.535866 155.949326 6.433429 3.802368 7.748441 -8.602230 -3.077964 -6.018642 -1.701371 -19.535862 7.034848 46.534950 -0.585153 0.133042 -0.183780 0.639225 0.302339 0.601442 4.462458 3.274096 -23.445269 1.319420 -0.507568 -0.766699 -0.391103 0.122348 0.046915 0.143838 -0.178774 0.197510 7.590504 -4.562126 11.586148 0.471536 -2.526878 7.937625 -2.249391 -1.468629 6.394088 -5.641346 0.345929 13.352772 0.160228 -1.450039 -16.353872 -20.509108 0.026955 -6.960819 -43.833282 -6.510883 -6.700148 -19.920439 -41.955315 2.320637 0.264619 -0.233541 0.786740 -0.264726 0.323732 0.122255 15.006690 1.179326 -9.170542 42.392532 7.808506 -5.653571 8.531593 7.388583 -0.286677 -0.334315 0.180338 -0.073642 0.163719 -0.148938 -0.261412 +24.124430 155.570068 5.179022 3.836435 10.442585 -7.864359 -2.965987 -6.365535 -3.638305 -18.362511 6.733033 47.964172 -0.580414 0.108383 -0.186810 0.656527 0.329477 0.615084 3.173679 3.271018 -25.314598 0.993819 -0.473843 -0.018452 -0.403016 0.140582 0.047083 0.152491 -0.197651 0.190691 6.377074 -4.030612 11.631017 0.527748 -2.412762 7.654690 -1.498821 -1.430330 5.981479 -5.577111 -1.031725 13.792198 0.455371 -2.338925 -17.048454 -21.250620 -0.795422 -7.357775 -47.492542 -9.091974 -6.239094 -20.852167 -42.617462 2.610243 0.285258 -0.242645 0.793194 -0.282571 0.342326 0.124836 15.980021 3.321923 -9.372711 45.732521 9.482300 -5.338425 8.587959 7.091434 -0.304551 -0.328837 0.188460 -0.063272 0.170002 -0.163722 -0.257812 +23.753006 155.345917 3.945578 3.863834 14.059731 -7.228943 -3.319113 -6.905756 -5.304638 -16.388081 5.875019 49.268200 -0.583609 0.089593 -0.195664 0.671628 0.358817 0.611225 0.932183 2.946592 -26.931299 1.248913 -0.446963 1.034098 -0.412388 0.143520 0.052484 0.164705 -0.208289 0.192006 5.306148 -3.734197 11.501960 0.565875 -2.536134 7.531897 -0.809094 -1.623996 5.838099 -5.223068 -2.808840 14.069006 0.850660 -3.432649 -17.701313 -22.089006 -2.057857 -7.494957 -50.515770 -11.524740 -5.521890 -23.292805 -43.900520 3.624616 0.296318 -0.244097 0.797204 -0.289495 0.356175 0.132081 16.767611 5.999707 -9.231911 48.348701 11.014623 -5.011138 8.688776 8.261131 -0.349238 -0.337626 0.191589 -0.051924 0.172442 -0.171174 -0.251248 +23.309441 155.264282 2.826828 4.111592 17.674257 -6.881403 -3.913498 -7.288972 -6.164492 -14.497955 4.975121 49.818653 -0.587333 0.066806 -0.206933 0.707021 0.402999 0.615155 -1.893774 2.377265 -27.814182 2.409767 -0.408580 2.047779 -0.431174 0.151502 0.051649 0.186766 -0.222262 0.192969 4.145580 -3.496328 11.304860 0.424542 -2.723857 7.577475 -0.401002 -1.913743 5.976470 -4.913081 -4.037910 14.807783 2.343868 -4.454819 -18.385695 -22.553858 -4.045407 -7.175439 -52.633076 -13.663358 -4.702799 -26.666391 -45.610611 5.192018 0.324264 -0.229451 0.810790 -0.309627 0.374565 0.148554 17.999743 9.289962 -8.921168 50.278049 12.624461 -4.646735 8.624006 9.929495 -0.432258 -0.344826 0.185796 -0.038409 0.173140 -0.187924 -0.244040 +22.793024 155.210022 1.698605 4.493822 20.482740 -6.421607 -4.431934 -7.307833 -7.189582 -12.660108 4.311404 50.303913 -0.582762 0.060059 -0.201322 0.736502 0.447602 0.617016 -4.645497 2.134581 -29.104486 3.654890 -0.372033 4.280870 -0.440022 0.144040 0.054767 0.213628 -0.210173 0.195853 3.239133 -3.146387 10.831362 0.068052 -2.666142 7.790592 -0.441883 -2.004601 6.464919 -4.315325 -5.160226 14.898944 3.344346 -5.289037 -18.472836 -22.831137 -6.664237 -6.995344 -53.339500 -16.099321 -3.346295 -31.606388 -46.503654 7.625729 0.327833 -0.218572 0.795719 -0.304830 0.378268 0.170042 18.901545 13.133191 -8.883245 51.624283 15.097320 -3.595460 9.410044 10.908044 -0.404377 -0.352693 0.169015 -0.026174 0.184938 -0.205841 -0.226138 +22.153725 155.534195 0.445792 4.496091 22.709753 -6.216164 -4.626124 -7.051406 -8.234066 -10.608727 3.632791 50.479397 -0.592794 0.066681 -0.199819 0.755584 0.478782 0.607219 -6.835126 2.310300 -30.303844 4.845688 -0.384654 7.111731 -0.445872 0.146122 0.056126 0.238134 -0.189865 0.193352 2.958538 -2.705926 10.555647 -0.013030 -2.428483 8.196683 -0.412132 -1.842441 7.171907 -4.772450 -5.995138 15.109875 4.325140 -6.467134 -19.196730 -22.196098 -9.665896 -6.501179 -54.681339 -18.796181 -1.929911 -35.664619 -49.075684 10.145767 0.329286 -0.227890 0.792700 -0.306229 0.378902 0.186276 18.804504 17.298859 -8.714624 51.821636 17.645992 -2.570530 10.939686 13.409426 -0.257283 -0.364106 0.174324 -0.024961 0.216003 -0.206128 -0.207712 +21.437477 156.033264 -0.661024 4.388953 25.229528 -6.303065 -4.968287 -6.776238 -8.790914 -8.046519 2.649043 50.264370 -0.620825 0.089464 -0.200700 0.761881 0.493157 0.587970 -9.254323 2.494391 -30.850775 6.880153 -0.524728 10.084287 -0.442769 0.144983 0.056740 0.264186 -0.159252 0.181764 2.615285 -2.370515 10.146715 0.022019 -2.400139 8.804703 -0.219228 -1.864779 8.246807 -5.459122 -6.702700 15.540776 5.175652 -7.626729 -19.747723 -21.068577 -12.517859 -5.891361 -55.731277 -21.532248 -0.432078 -40.251881 -53.597481 13.876031 0.321620 -0.250991 0.794432 -0.302493 0.367082 0.197824 18.277132 21.315578 -8.726027 51.008251 20.431128 -1.553502 12.897674 16.670612 0.064321 -0.383831 0.186821 -0.042208 0.259246 -0.193301 -0.195523 +20.721432 156.807175 -1.581186 3.795110 27.435413 -7.085177 -4.961713 -6.300267 -8.407109 -5.199611 1.480661 49.303040 -0.648547 0.088877 -0.212747 0.788091 0.538566 0.576575 -11.169778 2.999451 -30.760841 9.694053 -0.864509 13.432578 -0.454299 0.155687 0.055076 0.301472 -0.144436 0.170218 3.110669 -2.302642 9.941418 -0.014270 -2.320063 9.602319 -0.633501 -1.807837 9.560841 -5.843490 -7.381454 16.392851 6.797629 -8.557486 -21.156933 -20.214958 -15.906149 -5.384365 -55.917622 -24.649147 1.190591 -43.778782 -58.914532 18.013430 0.332103 -0.269568 0.808841 -0.314670 0.374599 0.212889 16.941525 25.085981 -8.888502 50.174759 23.270790 -0.771669 14.531515 21.109221 0.447366 -0.402182 0.203533 -0.049644 0.300854 -0.191208 -0.181571 +20.031929 157.662140 -2.400096 2.777732 29.538780 -7.823514 -4.448115 -5.747032 -8.073668 -2.505160 0.433191 47.928043 -0.641914 0.066350 -0.202172 0.841373 0.616117 0.589978 -13.172125 3.668555 -30.902479 13.909971 -1.518764 16.762117 -0.471343 0.164712 0.058421 0.349494 -0.137658 0.156724 3.932424 -2.384698 9.243716 0.012733 -2.247405 10.462512 -1.067577 -1.825832 11.188011 -6.011738 -8.375024 16.675428 8.037700 -9.531872 -22.222546 -18.911068 -18.861050 -5.272528 -56.358997 -28.444658 3.424997 -44.977745 -63.592274 21.113293 0.357964 -0.261906 0.793259 -0.327232 0.385135 0.247121 14.562156 28.035074 -9.719762 49.200481 26.549614 0.265991 15.455927 25.518578 0.823556 -0.404551 0.186554 -0.036497 0.333780 -0.225720 -0.156246 +19.422081 158.708893 -3.271727 1.710253 31.497774 -8.516628 -3.840318 -5.346277 -8.012822 -0.299954 -0.397873 46.392822 -0.672334 0.075173 -0.212277 0.864550 0.650575 0.582955 -15.094209 4.347300 -31.262259 18.669193 -2.664842 20.526146 -0.469444 0.159128 0.057306 0.387004 -0.122239 0.144876 4.911663 -2.389993 8.773745 0.135144 -2.136640 11.232418 -1.453451 -1.708559 12.642705 -5.961019 -9.412144 16.473419 9.266899 -10.405655 -23.407852 -17.493361 -21.887951 -5.568738 -56.963165 -32.855019 6.266396 -41.238132 -67.341003 20.685965 0.358680 -0.265110 0.793117 -0.327811 0.374620 0.256940 12.068085 29.912214 -10.582129 47.820347 29.429298 0.875161 16.201103 31.620316 1.321605 -0.426427 0.183564 -0.047305 0.362284 -0.223986 -0.149524 +18.758335 159.839401 -3.967716 0.733870 33.511097 -9.153356 -3.084331 -4.985604 -7.702051 1.610186 -1.105956 44.294090 -0.701760 0.107750 -0.213779 0.861877 0.654081 0.553341 -16.591969 4.855028 -31.064398 23.107437 -4.054433 23.645189 -0.459530 0.139094 0.059155 0.408347 -0.082537 0.142226 5.501267 -2.342492 8.116296 0.326053 -2.138457 11.951130 -1.592406 -1.691216 14.084813 -5.680015 -10.315038 16.221285 10.206091 -11.183959 -23.858860 -15.543792 -24.753969 -6.028838 -57.068516 -37.336067 9.196218 -32.151024 -70.046745 15.756139 0.335588 -0.270035 0.785632 -0.309219 0.350668 0.267028 9.700342 31.387445 -11.328193 45.932888 32.372513 1.471487 15.805153 37.733971 1.637959 -0.453894 0.182822 -0.065254 0.392543 -0.203495 -0.139394 +18.105206 161.019791 -4.658534 -0.169937 35.400925 -9.663845 -2.538609 -4.759207 -7.453774 3.514984 -1.833609 41.955551 -0.707142 0.135180 -0.201232 0.870556 0.666802 0.529003 -17.669367 5.209222 -30.869720 26.962191 -5.698649 26.863974 -0.447113 0.107116 0.069708 0.428832 -0.041499 0.149003 6.245407 -2.487264 7.390812 0.411670 -2.204336 12.628109 -1.923052 -1.790040 15.518140 -5.473561 -10.979053 15.464891 10.703759 -11.930090 -23.739332 -13.374066 -27.076847 -6.589390 -55.996731 -41.723072 11.788804 -19.079777 -72.476227 7.411460 0.314177 -0.249905 0.755919 -0.281562 0.322699 0.290543 7.427842 32.449253 -12.272974 44.017368 35.669479 2.383014 13.749253 42.179935 1.301836 -0.475039 0.156267 -0.066811 0.406735 -0.200478 -0.120483 +17.422455 162.117386 -5.215325 -0.429994 37.429478 -9.535018 -2.518772 -4.729338 -7.216983 4.934760 -2.388943 39.231010 -0.708301 0.151048 -0.192370 0.875117 0.686744 0.502157 -18.544069 5.097215 -30.500792 29.617065 -7.388950 30.038145 -0.436299 0.077574 0.071532 0.452704 -0.007588 0.150338 6.289950 -2.462613 6.344170 0.370640 -2.269462 13.183566 -2.007634 -1.936915 16.980207 -4.944070 -11.884566 14.463154 11.157345 -12.697670 -23.735731 -10.034667 -28.902767 -7.422763 -54.564869 -45.669411 13.694847 -1.036588 -72.294579 -5.575310 0.296647 -0.228568 0.720374 -0.258666 0.298935 0.308522 4.418246 33.405659 -12.823284 42.196316 38.273712 2.832731 9.709265 47.540882 -0.230787 -0.487892 0.129683 -0.065812 0.419651 -0.197592 -0.098218 +16.753540 163.191544 -5.734206 -0.766524 38.922153 -9.221552 -2.264905 -4.517166 -6.918632 5.999410 -2.678671 36.169243 -0.690242 0.170276 -0.167414 0.852778 0.689416 0.432916 -18.749798 5.160038 -30.086773 31.478643 -8.934193 32.906456 -0.400055 0.030926 0.086133 0.467867 0.056473 0.140165 6.812069 -2.283485 4.961699 0.378932 -2.029304 13.650519 -2.150700 -1.810958 18.474911 -4.829890 -12.518760 13.218391 11.477771 -13.902327 -22.622032 -6.377359 -30.391581 -8.104938 -53.222935 -49.543530 15.323508 18.399584 -69.751839 -19.170794 0.265840 -0.195103 0.646876 -0.215288 0.242330 0.333733 1.596743 33.932720 -13.299437 39.514057 40.713444 3.202540 4.352972 51.515404 -2.666320 -0.497040 0.091027 -0.065668 0.435778 -0.182720 -0.056700 +16.221933 164.221085 -6.192954 -0.817226 40.484974 -8.702502 -2.302989 -4.279409 -6.310658 6.788893 -2.818560 32.679237 -0.687663 0.198758 -0.143415 0.851882 0.703400 0.390262 -19.082367 5.061860 -29.382994 33.000816 -10.373069 35.331257 -0.371540 -0.014722 0.101521 0.494755 0.114010 0.134616 6.924529 -2.022293 3.569913 0.515867 -1.854895 14.060697 -1.921576 -1.729836 19.964748 -4.591812 -13.348774 11.752779 11.447014 -15.099760 -21.954708 -2.613687 -31.019751 -9.261097 -52.360462 -53.560795 17.272785 29.927357 -64.910141 -25.544796 0.237261 -0.169460 0.586437 -0.174395 0.192802 0.362726 -1.420432 33.781910 -13.922628 36.037041 43.099483 3.385478 -2.334826 54.551388 -6.039674 -0.515655 0.050238 -0.069348 0.457937 -0.178672 -0.024820 +15.655078 165.160690 -6.656846 -0.932292 41.850872 -8.284892 -2.005469 -4.007881 -5.551103 6.978714 -2.733078 29.034914 -0.707976 0.237623 -0.125828 0.866429 0.720326 0.379021 -18.890686 4.939996 -28.491638 33.571877 -11.709288 38.031689 -0.355075 -0.052512 0.105369 0.531491 0.158752 0.130410 7.370888 -1.884177 2.460661 0.499105 -1.656441 14.480565 -2.089760 -1.582556 21.360121 -3.895012 -14.453313 9.984084 11.453084 -16.089018 -21.944504 0.618517 -31.101831 -10.762492 -50.359234 -58.023094 19.186573 35.760273 -59.815830 -26.961369 0.213829 -0.157674 0.551682 -0.144413 0.155493 0.386023 -4.421941 33.097923 -14.526329 32.930218 45.515430 3.559974 -10.676677 57.759983 -10.877616 -0.539267 0.014678 -0.085215 0.486389 -0.180870 -0.009863 +15.172079 165.921936 -7.120212 -1.228807 42.945683 -7.674042 -1.384421 -3.596232 -5.008263 6.997127 -2.488699 25.135151 -0.744766 0.303388 -0.099993 0.816954 0.676069 0.304685 -18.586819 4.938560 -27.659491 34.164070 -12.909202 40.184898 -0.304439 -0.099671 0.124308 0.547151 0.247971 0.099840 8.399351 -1.856482 1.354432 0.279511 -1.409547 14.653395 -2.761358 -1.334362 22.294418 -3.288990 -14.837470 8.181435 11.494079 -16.975590 -20.952135 3.693878 -31.148304 -11.745128 -47.346420 -61.643314 20.054596 40.707436 -55.649750 -27.901323 0.159934 -0.177911 0.510017 -0.090085 0.076169 0.401396 -6.610831 32.223427 -14.741937 30.305374 47.920795 3.772357 -20.391186 58.728012 -16.582783 -0.575876 0.004675 -0.141257 0.542778 -0.139841 0.005509 +14.746009 166.565430 -7.560210 -1.498593 43.988770 -6.815135 -0.711396 -3.187897 -4.504516 6.695819 -2.180803 20.696096 -0.768782 0.349091 -0.092746 0.817768 0.699488 0.266654 -17.801920 4.570080 -26.598909 33.292236 -13.723327 42.428619 -0.268520 -0.154498 0.127791 0.593068 0.310591 0.092052 9.363267 -2.038183 -0.176428 -0.023613 -1.320607 14.700050 -3.336374 -1.228303 23.442545 -2.681811 -15.313403 6.131666 10.967842 -17.828402 -20.459042 6.901023 -30.088480 -13.177217 -45.270607 -64.958664 20.804037 42.543510 -49.781395 -26.288889 0.109323 -0.160439 0.441874 -0.039261 0.016395 0.413454 -9.692622 30.772814 -15.409515 28.486740 50.483730 4.426569 -29.514660 57.910091 -21.757524 -0.606906 -0.033656 -0.152327 0.576409 -0.119679 0.031851 +14.331110 167.137146 -7.833845 -1.018964 44.913437 -5.734782 -0.656269 -2.683207 -3.549790 6.586194 -1.896998 16.325548 -0.788344 0.404743 -0.069504 0.807718 0.690519 0.211853 -17.089457 4.368497 -24.683519 31.823704 -13.856279 44.013763 -0.244250 -0.203064 0.137892 0.617792 0.387344 0.089147 8.927692 -1.869438 -1.513067 -0.241486 -1.261811 14.758851 -3.354580 -1.167326 24.305511 -2.080103 -15.138094 5.291570 11.544012 -18.311682 -19.590296 10.742352 -29.177095 -14.289844 -43.815407 -67.432449 21.324484 43.927773 -44.544197 -24.902868 0.074827 -0.142320 0.407322 0.002023 -0.037589 0.447332 -11.811888 29.618423 -15.626767 26.345934 52.538223 4.644286 -35.202942 55.660599 -24.161993 -0.636790 -0.065185 -0.180114 0.611419 -0.100336 0.056201 +13.885376 167.529358 -8.048647 -0.482630 45.431965 -4.537291 -0.339754 -2.180312 -2.827226 5.794690 -1.531284 12.804880 -0.764533 0.415231 -0.048522 0.802000 0.703182 0.173800 -15.933917 4.276096 -22.689014 29.678133 -13.277908 44.719940 -0.221824 -0.236136 0.146749 0.630602 0.429216 0.089359 8.744745 -1.738192 -2.640304 -0.559519 -1.083892 14.675805 -3.702135 -0.980965 24.784090 -1.789838 -15.569306 4.680195 11.493908 -19.090755 -18.789513 13.560601 -28.396606 -15.121990 -41.001778 -69.709290 20.738363 43.747368 -39.183022 -22.528307 0.054596 -0.112516 0.347903 0.032581 -0.071916 0.467023 -13.853784 29.051785 -15.733978 24.564468 54.460114 4.761767 -39.383476 52.361546 -25.161339 -0.636036 -0.098886 -0.168575 0.617409 -0.098787 0.090564 +13.448483 167.663147 -8.263962 0.195717 45.231274 -3.128685 -0.011186 -1.658668 -2.221748 4.826827 -1.168970 9.436467 -0.749783 0.439417 -0.015549 0.787245 0.703784 0.113216 -14.568318 4.369922 -20.656429 26.746553 -11.856483 44.400692 -0.191816 -0.279148 0.165609 0.645942 0.497640 0.078831 8.297199 -1.259358 -3.759178 -0.798297 -0.624896 14.550812 -3.848387 -0.549422 25.172953 -1.183136 -15.715086 3.919689 11.901684 -19.744865 -17.656733 16.391243 -27.028820 -16.111454 -38.907597 -72.513435 21.067381 42.426201 -33.731606 -19.780941 0.029960 -0.082909 0.288493 0.072443 -0.126040 0.501692 -14.964015 27.849743 -15.640100 22.269495 56.370136 4.798512 -42.100193 49.376343 -25.172220 -0.647315 -0.137282 -0.177014 0.639869 -0.091549 0.127237 +13.007328 167.637421 -8.454124 0.767569 44.928761 -1.782283 0.509134 -1.221781 -1.911390 3.412644 -0.829386 6.636091 -0.758993 0.492438 -0.001979 0.754094 0.659401 0.071364 -12.815981 4.407954 -18.125818 23.272379 -9.826630 42.483952 -0.159064 -0.321423 0.170573 0.637418 0.551604 0.087760 7.943984 -0.852346 -4.734510 -1.020349 -0.285872 14.316947 -4.005085 -0.130775 25.251595 -0.868558 -15.892940 3.365562 11.685101 -20.308231 -16.669403 18.799007 -25.586620 -16.688164 -34.908241 -74.762756 19.751120 41.601349 -29.191996 -17.742386 -0.014654 -0.070588 0.256102 0.113673 -0.175328 0.502797 -16.054989 26.912159 -15.420857 19.690828 58.074780 4.447591 -44.031979 46.105930 -24.506008 -0.663059 -0.155037 -0.193317 0.644462 -0.060307 0.138163 +12.420537 167.398560 -8.625968 1.967225 43.764427 0.202303 0.504705 -0.859863 -1.929529 1.945452 -0.545212 4.169034 -0.762333 0.543554 0.022784 0.690453 0.590349 0.009558 -11.169040 4.519945 -15.637813 18.981491 -7.193574 39.306675 -0.118138 -0.358126 0.178990 0.616272 0.617879 0.078567 6.847950 -0.120638 -5.636936 -1.336518 0.329786 13.978885 -4.052551 0.560723 25.026461 -0.386074 -15.576569 2.864381 11.446191 -20.448399 -15.114246 20.869890 -24.428535 -17.067520 -29.271109 -76.415794 16.808975 39.941898 -25.100555 -15.637975 -0.064683 -0.073615 0.219950 0.159141 -0.234351 0.501691 -16.502871 26.487867 -15.007523 16.682652 59.630512 3.696869 -44.426018 42.656334 -22.918911 -0.672870 -0.161228 -0.226947 0.661385 -0.019779 0.148838 +11.780876 167.072342 -8.880464 3.448924 42.885639 2.210522 0.141660 -0.648863 -2.357196 0.520956 -0.344025 2.251959 -0.768953 0.594289 0.045223 0.632013 0.526932 -0.037802 -10.092422 4.117255 -12.452794 14.830821 -4.812202 34.507946 -0.077818 -0.391207 0.184329 0.599858 0.675685 0.068405 5.933909 0.405359 -6.374796 -1.785075 0.850545 13.808910 -4.429502 1.257895 24.924658 -0.013854 -15.575856 1.977893 10.785868 -20.744312 -13.798529 21.957529 -23.667435 -17.448750 -20.105944 -77.514778 10.777072 37.615070 -22.265532 -13.733365 -0.115279 -0.084654 0.182735 0.202864 -0.288960 0.494822 -16.886011 26.492393 -14.660309 12.204076 60.558693 1.668747 -44.748600 39.188293 -21.343992 -0.681110 -0.165429 -0.259252 0.680324 0.016723 0.156164 +11.227678 166.680374 -9.086118 4.620787 41.402538 3.698118 -0.286626 -0.442885 -2.379221 -0.296352 -0.241916 0.429926 -0.769058 0.634095 0.057668 0.622495 0.518155 -0.069037 -9.352085 3.693133 -9.311338 11.043532 -2.895259 29.523508 -0.051834 -0.439227 0.185082 0.610616 0.721879 0.081057 4.758600 0.927456 -7.249749 -2.077712 1.348227 13.840073 -4.450324 1.909000 25.318718 0.310471 -15.499961 0.829487 10.410777 -21.069214 -13.001333 23.017033 -22.512407 -17.712187 -14.018231 -77.859108 6.454906 37.030121 -20.466269 -12.947874 -0.153964 -0.050286 0.134281 0.242683 -0.333068 0.503079 -17.590157 26.656893 -14.675323 8.037049 61.179928 -0.561792 -45.052948 35.573811 -19.879066 -0.694358 -0.203448 -0.259499 0.678581 0.032797 0.174567 +10.621062 166.444778 -9.312825 5.261193 39.040073 4.449441 -0.352671 -0.188311 -2.051232 -1.078750 -0.167498 -1.218452 -0.777754 0.663959 0.070799 0.616743 0.514688 -0.113247 -8.420516 3.445328 -6.752825 7.082187 -1.279330 25.117249 -0.038604 -0.478872 0.192347 0.624364 0.767513 0.085820 4.282636 1.596659 -7.755801 -2.379991 2.097527 14.099246 -4.830224 2.851779 25.788324 0.202419 -14.896953 0.053566 10.577357 -21.147591 -12.533170 23.910519 -21.962946 -18.070442 -7.380886 -77.556740 1.343654 36.276272 -18.760559 -12.161076 -0.172370 -0.022229 0.111240 0.268745 -0.367205 0.528178 -17.678221 26.862728 -14.862659 3.101145 61.723366 -3.145608 -43.651379 33.226028 -18.178875 -0.714337 -0.232760 -0.270911 0.688809 0.045430 0.192257 +9.950531 166.382294 -9.580123 5.455435 37.154781 4.644238 -0.402416 -0.025748 -1.772301 -1.016685 -0.138610 -2.438679 -0.757992 0.662718 0.089419 0.595243 0.508698 -0.146290 -7.426170 3.136102 -4.473663 3.952729 -0.209896 20.902784 -0.025871 -0.481140 0.199171 0.621075 0.794388 0.073606 4.312849 2.315561 -7.894930 -2.497273 2.906760 14.517030 -5.136310 3.777774 26.250202 -0.159372 -14.889859 -0.343930 10.712523 -21.506483 -12.412816 24.332123 -21.721045 -18.506142 -0.129292 -77.292854 -4.122736 34.700958 -17.894260 -11.333456 -0.178325 -0.025789 0.084454 0.278048 -0.382818 0.537295 -16.980810 27.381304 -14.754991 -2.094314 61.330296 -6.117772 -42.635696 31.602150 -16.905416 -0.704379 -0.231069 -0.273044 0.706330 0.051655 0.214697 +9.280651 166.360245 -9.857265 5.211547 35.087025 4.684586 -0.184278 -0.044609 -2.079165 -0.858331 -0.142753 -2.841350 -0.777921 0.670625 0.084950 0.605498 0.523687 -0.148342 -6.566237 2.882733 -3.341674 1.942742 0.332822 17.679333 -0.027756 -0.485999 0.198132 0.639198 0.803720 0.068719 5.011559 2.857304 -7.863353 -2.785936 3.625932 14.726908 -5.907342 4.651711 26.532146 -0.373554 -14.466948 -0.621476 10.872719 -21.329311 -12.795491 24.202517 -21.236774 -18.827250 2.790069 -76.905296 -6.039688 33.688625 -18.252241 -11.020083 -0.180736 -0.031376 0.089304 0.279787 -0.387206 0.542364 -16.987125 27.242277 -15.192152 -3.880207 61.844578 -7.118716 -41.363770 30.655727 -16.077665 -0.717463 -0.231448 -0.282872 0.723002 0.054444 0.214632 +8.693721 166.342102 -10.037588 4.831928 33.538353 4.941697 0.158729 -0.239598 -3.075771 -0.683784 -0.171888 -2.380670 -0.813354 0.730170 0.081609 0.608570 0.528031 -0.181476 -6.025341 2.779716 -3.324180 1.261428 0.492542 15.758355 -0.013733 -0.534744 0.191867 0.670189 0.856857 0.086009 6.017321 3.364200 -7.929292 -3.029213 4.315345 14.687223 -6.735345 5.502752 26.782696 -0.327290 -14.347259 -1.368294 10.789804 -21.599205 -12.693804 23.901497 -19.977432 -19.416935 2.272611 -78.419380 -5.367332 32.757080 -18.064423 -10.824881 -0.224632 -0.010287 0.064272 0.316471 -0.423982 0.555081 -17.001711 26.078747 -15.855872 -3.526985 63.092155 -6.654686 -40.548397 30.509621 -15.823312 -0.753414 -0.257017 -0.296162 0.743583 0.082580 0.228449 +8.147728 166.256927 -10.123615 4.090908 32.946072 5.377330 0.823818 -0.483727 -4.586555 -0.229213 -0.221832 -1.648501 -0.863706 0.782214 0.053037 0.620970 0.541519 -0.194590 -5.338080 2.811177 -4.091404 1.497100 0.430727 14.954982 0.000841 -0.583773 0.183775 0.703402 0.884149 0.111408 7.154171 3.659247 -8.068837 -3.092623 4.718558 14.222916 -7.268971 6.067945 26.617887 -0.193863 -14.446340 -1.762977 10.273693 -21.747290 -12.772013 23.019650 -18.810026 -19.752174 -4.497456 -81.214943 0.289883 32.559399 -17.086882 -10.854053 -0.272812 0.006697 0.048296 0.352954 -0.450772 0.547974 -17.606268 24.344473 -16.548855 0.018092 64.941002 -4.002574 -40.092724 30.982365 -16.004272 -0.797053 -0.277354 -0.300430 0.745589 0.112109 0.227132 +7.563061 166.260620 -10.074532 3.460313 32.976471 5.710641 1.651751 -0.598342 -5.862648 -0.220353 -0.229545 -1.193220 -0.924313 0.852111 0.031840 0.608909 0.507222 -0.193184 -4.589757 2.812429 -4.654297 1.586486 0.375017 14.338484 0.012426 -0.597335 0.169291 0.712591 0.912611 0.123434 7.424440 3.845426 -8.311149 -3.011508 4.804329 13.762800 -7.142565 6.292909 26.404932 -0.122025 -14.670962 -1.414737 10.276059 -21.916969 -13.140939 22.433922 -17.528334 -19.910950 -27.151760 -83.391960 20.414181 32.921360 -16.879583 -11.344308 -0.315939 -0.025322 0.070809 0.371862 -0.467816 0.528272 -18.030359 22.724833 -16.860800 6.800633 66.340378 0.729718 -40.609013 33.137920 -17.157066 -0.828607 -0.254875 -0.334881 0.771931 0.151767 0.209647 +6.774364 166.301926 -10.015993 2.750137 32.451008 5.964579 2.709828 -0.654018 -7.029812 -0.114215 -0.240247 -0.610304 -0.930584 0.864305 0.032429 0.609857 0.508663 -0.197719 -3.674926 2.945854 -5.614472 1.624561 0.393651 14.123142 0.018196 -0.609623 0.169756 0.719909 0.924489 0.125479 6.925022 4.113745 -8.470967 -2.708726 4.964619 13.365863 -6.311509 6.434574 26.121767 -0.087647 -14.617156 -1.313665 10.179727 -21.897840 -12.920235 21.621241 -16.789473 -19.702494 -55.289963 -83.062332 45.417103 33.694054 -18.238564 -12.221183 -0.328209 -0.018812 0.060631 0.383174 -0.479172 0.530283 -17.603447 22.193762 -16.885450 12.234296 67.057144 4.719404 -40.514904 35.660309 -18.112703 -0.837186 -0.264026 -0.337863 0.774821 0.155843 0.211070 +6.045072 166.323853 -9.917975 1.937882 32.343819 5.958369 3.803444 -0.623412 -7.813339 0.243347 -0.258939 -0.337957 -0.931584 0.849311 0.020650 0.625676 0.531819 -0.167987 -2.776719 2.871157 -5.914401 1.981815 0.313143 13.251905 0.004562 -0.600031 0.164373 0.727190 0.900327 0.131984 6.693370 4.130381 -8.602763 -2.492925 4.878021 13.085575 -5.623110 6.248312 25.914974 0.026765 -14.322717 -0.993933 9.866907 -21.264786 -13.101703 20.605280 -16.762232 -19.441797 -69.444542 -81.344215 56.811363 33.558720 -20.169079 -12.845671 -0.327240 -0.026446 0.068682 0.378528 -0.455873 0.520965 -16.992315 22.335329 -16.871490 19.327330 67.236977 9.520151 -39.864265 38.640488 -19.115461 -0.836243 -0.259119 -0.327297 0.766715 0.143850 0.201078 +5.289488 166.324463 -9.806248 1.322211 31.782982 6.073307 4.770546 -0.606652 -8.541510 0.440738 -0.270776 0.067088 -0.946148 0.846498 0.018886 0.636753 0.539766 -0.140044 -2.060540 2.844466 -6.400616 2.237840 0.249050 12.528689 -0.009189 -0.584895 0.170410 0.730516 0.888239 0.129532 6.422508 4.134879 -8.697432 -2.410754 4.796368 12.828496 -5.160326 6.120498 25.663195 -0.058329 -14.074247 -0.515942 9.547147 -20.743080 -13.313732 19.289627 -16.371893 -19.119247 -77.490204 -78.407585 61.343708 32.973049 -23.363062 -13.643740 -0.326028 -0.056824 0.093424 0.374472 -0.437565 0.520119 -16.234922 22.454899 -16.763935 28.269604 66.825409 15.260168 -39.315926 42.380127 -20.557898 -0.846430 -0.241830 -0.335911 0.779489 0.134141 0.184590 +4.603719 166.270309 -9.628306 0.787367 30.777323 6.156832 5.514717 -0.599568 -8.969502 0.851362 -0.302157 0.421786 -0.949322 0.835268 0.015171 0.670398 0.577169 -0.101702 -1.576798 2.885718 -6.904355 2.616249 0.196066 12.201994 -0.030733 -0.580131 0.166903 0.748952 0.868787 0.138336 6.046391 4.173681 -8.953986 -2.359094 4.779506 12.608792 -4.672663 6.045753 25.626432 -0.169140 -13.511759 -0.112721 9.216455 -20.021311 -13.482525 17.449570 -15.208226 -18.445559 -84.397644 -74.431297 63.724461 32.583523 -28.703791 -15.143194 -0.319589 -0.056320 0.103005 0.369467 -0.413696 0.525590 -15.929209 22.354614 -17.222151 39.593220 66.615494 22.832735 -36.562370 45.757362 -20.921675 -0.851164 -0.249906 -0.326012 0.776898 0.110530 0.175946 +3.998624 166.124008 -9.425032 0.268377 29.780293 6.220406 6.298190 -0.564981 -9.349019 0.998647 -0.311890 0.877572 -0.933065 0.800760 0.008394 0.679123 0.579550 -0.065802 -1.058189 2.943848 -7.337451 3.144549 0.100472 12.102241 -0.051450 -0.548698 0.166443 0.728923 0.824585 0.143160 5.764920 4.117283 -9.040600 -2.385677 4.656163 12.352559 -4.369051 5.882736 25.184273 -0.646732 -13.006015 0.784969 9.144421 -19.396803 -13.731958 15.495880 -14.966761 -17.312281 -85.709503 -69.846359 59.936234 31.575283 -34.764702 -16.622219 -0.293988 -0.068191 0.133468 0.344056 -0.375884 0.513981 -14.899734 23.063726 -17.113855 49.787735 64.896858 28.465288 -33.056538 49.319580 -20.803890 -0.833715 -0.231214 -0.311077 0.754286 0.091641 0.159334 +3.397810 165.981445 -9.153444 -0.302558 29.064325 6.142828 7.322985 -0.437458 -9.538744 0.848280 -0.305337 1.118544 -0.866625 0.702229 0.007516 0.707805 0.610742 -0.013836 -0.160860 3.001503 -7.586288 3.062507 0.123911 11.990170 -0.100697 -0.482750 0.163399 0.695277 0.734926 0.146518 5.599644 4.083576 -8.875501 -2.442043 4.600804 12.146664 -4.164323 5.635550 24.392145 -1.014126 -12.510187 2.059135 9.851705 -18.615873 -14.412713 13.283307 -15.468011 -16.367182 -83.872742 -65.445190 53.785103 26.602276 -40.988811 -16.044506 -0.213428 -0.055911 0.174528 0.277061 -0.297394 0.513203 -12.405194 24.297611 -16.526840 57.423985 61.840282 31.015785 -26.612154 53.179672 -18.892153 -0.779497 -0.214809 -0.261756 0.703918 0.038142 0.151123 +2.881973 165.802383 -8.892565 -0.746657 28.167524 6.127325 8.064070 -0.379529 -9.955431 0.907637 -0.290271 1.757425 -0.863072 0.682274 -0.021868 0.666808 0.526805 0.029060 0.478978 3.230084 -8.036625 3.128987 0.096436 12.437164 -0.114635 -0.420108 0.138320 0.623208 0.658848 0.151542 5.547206 4.232161 -8.374828 -2.461287 4.608712 11.943456 -4.066922 5.601864 23.144876 -1.775282 -12.153822 3.146666 9.957205 -18.016468 -14.850808 11.300803 -17.004930 -15.459740 -80.482262 -60.903999 46.393951 19.054178 -46.859386 -13.795204 -0.182508 -0.096380 0.253326 0.224151 -0.248860 0.452766 -9.225326 26.157406 -15.612331 60.147099 57.151772 28.553387 -15.392452 56.765541 -13.648410 -0.738761 -0.149773 -0.266975 0.657665 0.053602 0.102323 +2.425914 165.646896 -8.576248 -1.114040 27.719856 6.093285 8.523989 -0.430282 -10.678864 1.398656 -0.310160 3.087777 -0.846434 0.638121 -0.033779 0.648257 0.451581 0.105528 1.106315 3.339919 -8.165560 3.134204 0.068032 12.561898 -0.143586 -0.330029 0.129613 0.543585 0.565688 0.144133 5.384788 4.208803 -7.622181 -2.479476 4.468927 11.626424 -3.963840 5.386047 21.362310 -2.538534 -11.799301 4.994083 10.342610 -17.223997 -15.281015 9.602264 -18.411757 -14.489587 -77.448097 -55.665230 39.080826 6.912807 -52.168674 -8.421310 -0.118701 -0.149964 0.355887 0.150352 -0.183869 0.407708 -6.191836 27.530190 -14.616426 62.100391 51.022358 24.285908 1.487765 58.231964 -4.515537 -0.689516 -0.079265 -0.272603 0.616457 0.037388 0.043850 +1.892877 165.527222 -8.307420 -1.320157 27.438904 6.024343 8.804043 -0.520952 -11.724448 2.009363 -0.351595 5.107023 -0.821493 0.577180 -0.043184 0.633540 0.417549 0.156606 1.545581 3.443554 -8.345448 3.594228 -0.016706 12.732988 -0.175229 -0.243758 0.126685 0.486679 0.488302 0.130215 5.240254 3.885373 -6.604835 -2.608207 4.173019 11.420531 -4.110647 5.116705 19.652153 -3.248586 -11.309921 6.543055 10.628420 -16.363821 -15.987360 6.680974 -19.585842 -13.844151 -74.320900 -50.182953 31.355860 -7.711515 -52.438782 -0.885073 -0.059364 -0.209896 0.435250 0.084899 -0.115409 0.376087 -3.225844 29.060011 -13.800301 62.489117 45.105511 18.976837 16.208967 54.689651 3.029758 -0.642904 -0.006721 -0.268939 0.597875 0.019412 0.010474 +1.503293 165.241867 -8.062940 -1.872544 27.256689 5.607562 9.173531 -0.578054 -12.846951 2.860530 -0.454417 7.441465 -0.788694 0.480980 -0.074902 0.689558 0.468411 0.255373 2.273404 3.650125 -8.432840 3.960526 -0.066124 13.463724 -0.241096 -0.160799 0.110128 0.466335 0.363913 0.143251 5.612366 3.288752 -5.623464 -2.656493 3.701338 11.200472 -4.344469 4.696045 18.251329 -3.845389 -10.786163 8.410403 10.468436 -15.161457 -17.444098 3.094943 -19.395794 -13.516047 -73.244728 -45.120861 25.429760 -18.212690 -46.996372 3.674936 0.025590 -0.224607 0.512006 0.000911 -0.008011 0.353825 -1.161697 29.294413 -13.281642 64.009697 39.762363 14.683785 22.268076 46.992287 4.549775 -0.596414 0.031837 -0.218076 0.548583 -0.035363 -0.020596 +1.163953 164.898224 -7.719171 -2.245581 27.119728 5.125892 9.064021 -0.807862 -14.144335 4.062254 -0.661653 10.636581 -0.745959 0.377733 -0.093884 0.720589 0.512561 0.308761 2.603768 3.693428 -8.156476 4.766854 -0.200310 13.924015 -0.292988 -0.075202 0.109002 0.443478 0.266891 0.134219 6.102139 2.769947 -4.489749 -2.817702 3.419485 10.893922 -4.828446 4.471055 16.777538 -4.311166 -10.366948 10.302101 10.827532 -14.326761 -18.647331 -1.315633 -19.761639 -12.828084 -70.823479 -40.584328 19.598974 -21.849625 -39.580322 4.089746 0.109032 -0.251681 0.572904 -0.076450 0.082209 0.343583 1.364328 30.279877 -12.183983 64.271088 34.851540 10.480817 21.889658 37.390999 2.871182 -0.549648 0.082061 -0.177757 0.524112 -0.079039 -0.033122 +0.643611 164.648163 -7.454764 -2.396243 26.319700 4.583327 8.914662 -1.189471 -15.442275 4.765430 -0.898953 14.346115 -0.723408 0.294975 -0.135524 0.743085 0.528034 0.373324 2.980075 3.828263 -8.064270 5.169292 -0.293313 14.740459 -0.342242 0.005466 0.091262 0.408499 0.155941 0.140283 5.703667 2.319776 -2.885660 -2.926263 3.118362 10.440119 -4.921028 4.242048 15.125410 -4.530672 -9.600414 12.492696 11.073767 -13.146041 -19.750673 -6.323945 -20.328955 -11.684490 -67.008247 -35.957207 13.765593 -21.655010 -32.839359 2.890163 0.180359 -0.271922 0.651909 -0.155295 0.171850 0.307683 5.002633 31.745455 -10.233080 63.596897 30.567308 6.877375 19.962444 29.748713 1.476035 -0.507224 0.136706 -0.141464 0.476642 -0.103063 -0.066566 +0.034367 164.298172 -7.302047 -2.904719 24.550039 4.002471 9.285649 -1.613476 -17.397533 4.939266 -1.143864 19.367868 -0.697447 0.217400 -0.168870 0.756723 0.526457 0.423855 3.587287 4.304657 -8.709493 5.652985 -0.400704 16.713232 -0.386285 0.079799 0.077989 0.364376 0.053933 0.145328 5.431520 1.962162 -0.648394 -2.911253 2.992637 9.621492 -4.957923 4.159826 12.917857 -5.287396 -8.375392 14.502936 11.358890 -12.071952 -20.585999 -11.452865 -19.708029 -10.074731 -63.529682 -30.909336 8.358694 -18.492363 -28.223272 1.091566 0.255661 -0.283423 0.731517 -0.233197 0.251245 0.278785 10.075599 31.886204 -7.699796 62.630482 26.192200 3.791089 17.663208 23.004074 0.625034 -0.463677 0.185246 -0.110898 0.425963 -0.124505 -0.097750 +-0.727353 163.896835 -7.223492 -3.008276 22.035337 3.677706 9.522751 -1.967760 -19.711714 4.694295 -1.246534 24.977421 -0.670678 0.151376 -0.195416 0.757548 0.525458 0.467222 3.970089 5.080105 -10.031467 5.631836 -0.377111 19.647587 -0.415510 0.142913 0.068845 0.326898 -0.026727 0.145717 3.924162 2.163312 1.951574 -2.670274 3.175872 8.709508 -4.227693 4.268992 10.655452 -5.574524 -7.478019 15.723668 11.241080 -10.879519 -21.340027 -15.470458 -17.810436 -9.378189 -60.964703 -27.026674 4.770772 -14.935219 -24.731766 -0.247103 0.302369 -0.302749 0.782621 -0.287427 0.313982 0.245332 14.839340 30.607428 -5.876314 60.586037 22.582407 1.804074 15.459748 16.683353 0.302390 -0.425095 0.231847 -0.085000 0.388648 -0.138982 -0.122654 +-1.276703 163.205933 -7.114695 -3.188107 20.125826 3.490277 9.567676 -2.516288 -23.157537 4.592924 -1.440678 32.002728 -0.626222 0.103103 -0.206375 0.751699 0.518213 0.477906 4.004121 5.862217 -11.714152 6.379379 -0.572347 23.018656 -0.430698 0.163487 0.059324 0.290569 -0.077932 0.162258 2.812906 2.184469 4.341192 -2.370742 3.204790 7.776482 -3.547487 4.181605 8.470813 -5.922029 -6.688453 15.734831 10.983440 -10.183174 -21.245098 -17.941589 -14.558348 -9.286791 -59.890591 -23.472286 2.041696 -11.116385 -21.778189 -1.341169 0.333187 -0.271548 0.793085 -0.315946 0.347390 0.228498 17.773335 27.986938 -5.341005 58.811947 19.628033 0.867582 13.436264 9.585812 0.273600 -0.388544 0.233265 -0.048803 0.331934 -0.149897 -0.126763 +-1.740516 162.326385 -6.962516 -3.763556 18.597235 3.088673 9.740908 -3.066433 -27.092962 4.828552 -1.805309 39.742638 -0.596579 0.085221 -0.193604 0.736575 0.486607 0.477354 4.233627 6.701496 -13.441511 7.622811 -0.982310 26.802177 -0.432961 0.173024 0.066673 0.254320 -0.093286 0.166765 2.684459 1.835391 6.730634 -2.192938 3.169391 6.868375 -3.495774 4.099107 6.328510 -6.301057 -5.814495 15.146177 10.791109 -9.730202 -20.768696 -19.510109 -11.365467 -9.245909 -58.665051 -19.894918 -0.162634 -8.531816 -19.381807 -1.890725 0.352819 -0.256297 0.803771 -0.328059 0.353822 0.229448 18.986029 24.900455 -5.439965 57.112122 17.176193 0.052519 11.351021 3.933233 0.299241 -0.367915 0.231857 -0.041567 0.303101 -0.157904 -0.131875 +-2.247162 161.614761 -6.609315 -4.606283 16.783684 2.038433 10.257225 -3.237386 -30.051424 4.860679 -2.070026 46.780174 -0.610522 0.061044 -0.204255 0.718773 0.467486 0.504439 5.313603 7.236397 -13.443831 7.945229 -1.112726 29.058994 -0.441672 0.214755 0.068919 0.236123 -0.130152 0.144288 2.724490 1.566288 9.486620 -2.050978 3.328049 6.083529 -3.622650 4.284473 4.461007 -6.048547 -5.272292 15.347760 10.143270 -8.627272 -21.611727 -21.036156 -8.525801 -9.344939 -56.316929 -16.534935 -1.850828 -6.523263 -16.867512 -2.104004 0.366587 -0.310249 0.846832 -0.352342 0.379628 0.203147 18.836288 21.985016 -5.754991 55.359642 15.102925 -0.912700 8.728246 -0.011556 0.353473 -0.360199 0.279839 -0.061794 0.312966 -0.157242 -0.163019 +-2.860375 161.271774 -6.154327 -5.205863 14.780851 0.184086 10.481403 -3.321495 -31.716125 4.762765 -2.255331 53.005367 -0.608191 0.027894 -0.229788 0.735862 0.478802 0.550138 6.409328 7.461229 -11.889744 8.249804 -1.161624 30.333080 -0.477710 0.252686 0.055904 0.219036 -0.188509 0.163519 2.189550 1.555688 13.131711 -1.949141 3.727525 5.295633 -3.683510 4.680171 2.536283 -5.645040 -5.248861 16.697853 10.199049 -7.850960 -22.905785 -22.588839 -6.642550 -9.222620 -52.489914 -13.294887 -3.059737 -4.999961 -14.308742 -2.081709 0.393287 -0.323604 0.898454 -0.389480 0.437701 0.182589 19.141649 19.729973 -5.567057 51.953823 12.876890 -2.060239 6.453767 -2.555665 0.451266 -0.346359 0.311769 -0.041931 0.287430 -0.169046 -0.185381 +-3.346518 161.154312 -5.731280 -5.288341 12.923439 -2.078186 9.747585 -3.666156 -32.410072 4.921432 -2.548815 58.253490 -0.615517 -0.012988 -0.252891 0.765817 0.502750 0.614105 6.882721 7.336810 -9.424691 8.648570 -1.214429 30.933720 -0.517838 0.305340 0.039539 0.217254 -0.255142 0.161152 1.377738 1.673654 16.938850 -1.885749 4.143285 4.763104 -3.648863 5.081563 0.997109 -5.403621 -5.038651 18.570427 10.438336 -6.968575 -24.290100 -23.327129 -5.456102 -8.691787 -49.202919 -10.225882 -3.913328 -3.029912 -12.153958 -2.069226 0.436552 -0.352176 0.959725 -0.440223 0.498335 0.164844 18.800640 18.027386 -5.097826 47.701511 10.585001 -3.161278 4.930471 -3.219490 0.474945 -0.329705 0.346126 -0.035995 0.279390 -0.193889 -0.215205 +-3.700055 161.089981 -5.304625 -5.459035 11.417397 -4.370905 8.919687 -3.990988 -32.892670 4.719621 -2.631299 62.414093 -0.621527 -0.032382 -0.253748 0.772318 0.510506 0.637159 7.178439 7.141113 -6.887559 9.413719 -1.396781 31.385492 -0.533739 0.338407 0.046544 0.215893 -0.274104 0.146453 1.183635 1.560423 20.112841 -1.946585 4.516106 4.633256 -3.969219 5.446738 0.062529 -5.270811 -4.611331 19.771185 10.590975 -6.358570 -24.764013 -23.337696 -4.727475 -7.933431 -46.059875 -7.455133 -4.352599 -1.121212 -10.099092 -1.953547 0.454304 -0.390862 0.992206 -0.459425 0.523939 0.164508 17.932812 16.644169 -4.852449 43.475632 8.879509 -3.809905 3.719316 -3.919387 0.493247 -0.327533 0.376892 -0.046392 0.297838 -0.206166 -0.228980 +-4.230170 161.009979 -4.908067 -5.391903 9.911004 -6.324331 8.141214 -4.015886 -33.465736 3.902835 -2.138607 65.653336 -0.618434 -0.059633 -0.262143 0.784273 0.531671 0.657152 7.362815 7.137530 -4.857063 10.020396 -1.511466 32.175289 -0.546387 0.353239 0.049146 0.217707 -0.301873 0.146027 0.480422 1.964811 22.227631 -1.941046 4.897775 5.094965 -3.796236 5.802814 0.099601 -5.052799 -4.603489 19.660629 10.209729 -5.799301 -25.733595 -22.133482 -3.793023 -7.513168 -44.155209 -5.861660 -4.444392 1.045169 -7.803169 -1.774016 0.467210 -0.396980 1.004365 -0.472255 0.546696 0.159212 15.947800 15.561639 -4.604399 39.730682 7.417494 -4.274111 2.618038 -3.673816 0.461445 -0.324058 0.385768 -0.036964 0.290964 -0.219299 -0.237070 +-4.649909 160.982407 -4.456345 -4.897097 8.044132 -7.759527 7.129580 -3.701488 -33.950520 2.434736 -0.905148 68.046700 -0.567278 -0.109690 -0.251736 0.791232 0.558504 0.656296 6.894688 7.341344 -3.339985 10.693041 -1.602174 33.169521 -0.550341 0.356923 0.053911 0.209904 -0.321924 0.146254 -0.180039 2.533565 23.303581 -2.283835 5.312343 5.754400 -4.028460 6.098253 0.544943 -4.827488 -4.434423 18.788912 10.298202 -5.464774 -25.856817 -20.136738 -2.228923 -6.826283 -42.542194 -4.035356 -4.797617 2.826261 -7.419703 -1.665038 0.488975 -0.357993 0.975026 -0.480038 0.556512 0.165826 13.555342 14.611179 -4.277354 36.701172 6.347998 -4.459073 1.805836 -3.291048 0.420920 -0.296834 0.362327 -0.003108 0.260032 -0.244870 -0.220737 +-5.136848 160.980515 -3.908926 -4.729520 5.262616 -9.072851 7.009119 -2.416961 -33.923206 0.479808 0.948071 69.028908 -0.538666 -0.111515 -0.231386 0.758328 0.530239 0.627724 7.340661 7.830291 -1.892002 10.257276 -1.192133 34.147629 -0.540927 0.352997 0.060729 0.184976 -0.303629 0.147970 -0.553872 3.476938 23.967199 -2.540746 6.006273 6.481787 -4.276760 6.742264 1.088838 -4.740468 -4.220420 17.433125 10.389961 -5.287320 -25.893085 -17.643950 -0.260914 -6.279697 -41.360966 -2.508306 -5.087936 4.177069 -7.586514 -1.621331 0.480496 -0.350431 0.957908 -0.470131 0.547013 0.168863 10.696718 13.640912 -3.638309 33.917938 5.195716 -4.513232 1.852453 -2.401143 0.371252 -0.282587 0.362839 -0.002393 0.254553 -0.238057 -0.207730 +-5.673102 160.968918 -3.179827 -4.488407 2.199222 -9.961704 6.761600 -0.874082 -33.753017 -1.260345 2.780887 68.746666 -0.499820 -0.121450 -0.192676 0.722658 0.497435 0.586983 7.735133 8.368250 -0.669134 9.878084 -0.718180 34.887722 -0.511474 0.341385 0.082580 0.163110 -0.270551 0.124350 -1.171180 4.802898 23.820547 -2.737865 6.803915 7.112964 -4.354832 7.428541 1.673593 -4.726437 -3.751820 15.659914 10.995532 -5.321371 -24.884024 -14.488888 2.454476 -5.832412 -40.615459 -1.178024 -5.458930 5.070867 -8.539602 -1.633265 0.481976 -0.333029 0.920877 -0.453265 0.508516 0.185136 8.172437 12.075585 -3.089619 31.262337 4.172236 -4.510634 1.568522 -1.391018 0.315117 -0.265113 0.341937 -0.013063 0.251946 -0.243925 -0.190034 +-6.045443 161.154938 -2.479811 -4.345602 0.264955 -11.284180 6.274473 -0.036605 -33.198147 -3.752834 4.673784 67.294670 -0.480361 -0.101782 -0.162420 0.681199 0.447092 0.548282 7.943894 8.597098 1.079643 9.849933 -0.493284 35.296005 -0.489628 0.329359 0.096662 0.134069 -0.230963 0.121538 -1.291891 5.575139 24.090136 -2.811716 7.291533 7.981347 -4.524038 7.883126 2.367414 -4.924322 -3.425659 14.103881 11.398785 -5.455873 -24.535128 -12.019752 4.652412 -5.502891 -39.678032 0.003667 -5.805753 7.218094 -9.860481 -1.791672 0.465212 -0.330656 0.903789 -0.433754 0.478217 0.192308 5.731482 10.316743 -2.458726 28.315857 3.008001 -4.513628 1.214985 0.744363 0.264369 -0.259341 0.340508 -0.027417 0.255682 -0.229515 -0.178362 +-6.375471 161.469376 -1.775160 -4.304479 -0.941565 -12.486661 5.513461 0.377790 -32.600277 -5.867639 5.965476 64.767662 -0.458755 -0.070563 -0.131322 0.624120 0.374667 0.509615 8.318394 8.705842 2.775874 9.894506 -0.329877 35.559410 -0.452123 0.309094 0.104436 0.097279 -0.189909 0.114958 -1.222909 6.178157 24.121780 -2.744253 7.680165 8.791437 -4.580501 8.260159 3.067840 -5.085841 -3.527663 12.588505 11.146073 -5.948100 -23.310976 -10.716431 5.865695 -5.068224 -37.476646 1.250844 -5.898730 9.290425 -11.227266 -1.957080 0.436431 -0.325781 0.868926 -0.405232 0.431453 0.186142 4.466258 8.685677 -1.626946 24.942867 1.430896 -4.528524 -0.582997 2.888362 0.218945 -0.247001 0.331940 -0.044248 0.251913 -0.206343 -0.169544 +-6.683355 161.830551 -0.993514 -4.271409 -1.728187 -13.761124 4.440903 0.464509 -31.423830 -7.689936 6.672837 60.742199 -0.495195 -0.005116 -0.120670 0.554363 0.285538 0.458506 8.833310 8.657389 4.785453 10.033473 -0.234974 35.574581 -0.406920 0.301080 0.104227 0.077810 -0.130853 0.086522 -0.575349 6.261177 23.886868 -2.979573 7.890209 9.879624 -5.202965 8.540730 4.265458 -5.753566 -3.037740 11.241445 11.695488 -6.384079 -23.090385 -9.103849 6.938199 -4.883404 -35.290504 2.090719 -5.796532 11.265144 -12.689768 -2.240234 0.395483 -0.366637 0.867585 -0.382639 0.372902 0.166308 3.262946 7.174008 -1.315178 21.187616 1.068536 -4.075763 -0.351786 2.925920 0.261723 -0.258810 0.362569 -0.104326 0.293801 -0.149990 -0.175701 +-7.043891 162.098755 -0.049330 -4.160469 -1.791052 -14.417738 2.994115 0.122842 -30.840187 -8.887682 6.811105 56.824108 -0.496656 0.027183 -0.106951 0.541792 0.265790 0.420645 8.846130 8.662286 5.966333 10.838997 -0.455921 35.720875 -0.384959 0.265421 0.106791 0.080409 -0.088521 0.089626 -0.084268 6.365775 22.389635 -3.164983 8.041585 10.889608 -5.576904 8.716266 5.974546 -6.069462 -3.125971 10.091981 12.230101 -7.198275 -22.276144 -7.419556 7.690780 -4.718075 -32.664898 2.460795 -5.464011 12.799684 -13.810371 -2.472816 0.376884 -0.336484 0.838519 -0.358137 0.332176 0.180393 2.351725 5.616473 -1.170618 17.296295 0.982234 -3.428511 0.276717 1.454743 0.286641 -0.269410 0.332852 -0.112497 0.294625 -0.135123 -0.159617 +-7.422910 162.364868 0.918160 -4.123700 -2.242906 -15.092424 1.826603 0.074590 -29.423367 -9.619883 6.583418 51.775143 -0.483441 0.033626 -0.083505 0.533490 0.261007 0.391314 8.879706 8.889065 6.860559 11.753366 -0.647050 36.130367 -0.370328 0.257235 0.120622 0.081716 -0.052200 0.076185 0.452950 6.533315 21.246351 -3.406180 8.319160 11.633908 -6.080700 8.961723 7.215721 -6.468230 -2.835513 9.475590 13.120923 -7.689601 -21.768579 -5.713641 8.120588 -4.185177 -30.186108 3.302296 -5.242072 14.473454 -14.910348 -2.715931 0.374842 -0.330612 0.816061 -0.346283 0.306125 0.200743 1.718016 4.551305 -0.803679 13.974302 0.513172 -2.942636 0.756237 -0.179769 0.285791 -0.269165 0.322657 -0.119974 0.313021 -0.135265 -0.139872 +-7.895586 162.493103 2.090932 -4.333530 -2.742626 -15.129280 1.447024 0.330546 -28.100103 -11.089450 6.488171 45.802528 -0.479104 0.038896 -0.068683 0.524312 0.257081 0.363153 9.413212 9.269198 6.943058 12.501180 -0.769285 36.864906 -0.352879 0.242712 0.130685 0.088373 -0.023924 0.060189 1.294305 6.604326 19.510118 -3.770504 8.642481 11.895184 -6.832510 9.248810 8.184788 -6.554145 -2.706801 9.125379 13.703918 -8.081475 -20.992449 -3.931792 8.749782 -3.796303 -27.135714 3.872879 -4.786327 15.746517 -15.616330 -2.856759 0.371702 -0.322755 0.793702 -0.332653 0.278484 0.215741 1.016898 3.078273 -0.572713 12.038421 -0.203411 -2.654481 0.782950 -0.493135 0.264350 -0.272291 0.307191 -0.131190 0.324828 -0.134601 -0.126623 +-8.325589 162.601318 3.268969 -4.537520 -3.553150 -15.281181 1.292840 0.744865 -25.927687 -12.554935 6.178078 38.921799 -0.487318 0.079555 -0.055947 0.468658 0.195079 0.311466 9.913964 9.700968 7.122727 12.962446 -0.762768 37.477596 -0.318319 0.231444 0.139498 0.066270 0.029360 0.043972 2.342352 6.794458 17.749067 -4.053502 9.034330 12.074540 -7.597500 9.693402 8.992167 -6.849308 -2.476460 9.744621 14.074791 -8.685578 -19.323400 -2.267720 8.541321 -3.049881 -24.066637 4.820086 -4.326739 16.908501 -15.207360 -2.838797 0.335593 -0.351225 0.777400 -0.303854 0.235210 0.208854 0.295125 2.417596 0.292638 9.725731 -1.509158 -2.288901 1.440996 -0.498258 0.256831 -0.278899 0.327252 -0.161716 0.351425 -0.093769 -0.118488 +-8.709893 162.543915 4.454265 -4.879022 -3.550818 -15.363842 0.729406 0.667539 -23.566408 -13.148077 5.263333 31.820438 -0.498152 0.114442 -0.056705 0.451587 0.158480 0.297821 10.746673 10.023183 7.140649 13.338786 -0.776102 38.205318 -0.304517 0.210080 0.134912 0.055933 0.049590 0.052829 3.071229 6.932812 15.987280 -4.073936 9.171741 12.167547 -7.862047 9.902498 9.749548 -6.619665 -2.501984 10.385706 14.162013 -8.986056 -17.884083 -1.087291 8.534575 -2.592966 -21.284298 5.593383 -3.912184 18.667006 -15.473011 -3.024328 0.314754 -0.341191 0.773489 -0.286038 0.212983 0.205542 -0.518731 1.754865 0.949679 7.635855 -2.551775 -1.919943 2.011223 -0.354104 0.242023 -0.287486 0.316954 -0.173439 0.342645 -0.075311 -0.123357 +-9.090425 162.285110 5.649485 -5.405794 -3.362160 -14.824477 0.163126 0.396351 -21.957710 -12.847582 4.088204 25.156433 -0.512493 0.122933 -0.067894 0.459526 0.174108 0.284005 11.073026 10.466381 6.261765 14.638362 -1.185547 39.084148 -0.298691 0.192396 0.125199 0.076768 0.058601 0.050769 4.082524 7.049643 13.160181 -4.111020 9.359155 12.337749 -8.149163 10.249475 11.264407 -6.492524 -3.143072 10.836895 14.594754 -9.670050 -17.719236 -0.660843 8.277614 -2.550275 -17.510607 5.862931 -3.222911 20.243835 -16.140551 -3.287871 0.308926 -0.322903 0.758851 -0.280071 0.198310 0.206856 -0.527988 0.741014 1.023506 4.499062 -2.922536 -1.327293 2.958824 -1.229639 0.152621 -0.298473 0.299991 -0.173350 0.344645 -0.066927 -0.116699 +-9.481856 161.961151 6.749311 -5.928102 -2.501269 -14.513174 -0.667793 -0.155260 -20.689739 -11.678638 2.950583 19.980234 -0.546611 0.152325 -0.074074 0.464723 0.172147 0.289092 11.398046 10.681211 5.581599 16.150942 -1.806721 39.871658 -0.294526 0.177528 0.119519 0.095148 0.072382 0.047761 4.497272 6.969127 11.071962 -4.101716 9.174507 12.408237 -8.161904 10.204678 12.322958 -5.981243 -3.629343 11.007959 14.470870 -9.804289 -17.583473 -0.087978 8.411112 -2.557572 -14.237834 6.203336 -2.560209 21.779766 -17.071503 -3.602466 0.293362 -0.329949 0.763684 -0.269080 0.184615 0.207111 -1.037800 -0.035908 0.837356 2.260914 -2.695381 -0.929959 3.706935 -2.154623 0.054548 -0.319326 0.294437 -0.194493 0.360667 -0.058418 -0.126474 +-9.864823 161.544952 7.893945 -6.429725 -0.689891 -14.590741 -1.791793 -0.927324 -19.238655 -10.153143 1.988053 15.987058 -0.560850 0.163427 -0.081149 0.467508 0.173826 0.280844 11.678406 10.444448 5.446476 17.918608 -2.690297 40.274136 -0.285932 0.177088 0.120247 0.106621 0.082785 0.039348 4.902253 6.458735 9.532441 -4.223984 8.674844 12.528913 -8.378658 9.819111 13.155441 -6.139990 -3.543532 11.555869 15.155403 -10.102446 -17.464794 1.106026 8.140964 -2.268770 -11.319903 6.410719 -1.963722 22.542982 -16.883654 -3.589069 0.289758 -0.333608 0.763419 -0.267200 0.172771 0.207659 -1.278386 -0.559549 0.782265 0.024249 -2.711612 -0.594961 3.936903 -2.636563 0.006567 -0.328585 0.297146 -0.203621 0.372415 -0.050499 -0.126424 +-10.236027 160.926682 9.184352 -7.071791 1.453924 -14.736541 -2.764009 -1.457778 -17.713989 -9.014901 1.390483 13.116459 -0.590805 0.172143 -0.094154 0.493037 0.193191 0.307161 12.320220 9.984034 5.581549 19.335611 -3.506281 40.569923 -0.296159 0.176414 0.114903 0.129018 0.071098 0.039683 4.689802 6.005881 7.902266 -4.081151 7.967450 12.642797 -7.943502 9.226802 14.069006 -5.914043 -3.457068 11.850121 14.906630 -9.697120 -17.907877 2.018377 7.953105 -1.862757 -8.093374 7.126615 -1.215654 21.884457 -16.812366 -3.389329 0.293359 -0.338993 0.783288 -0.272826 0.180915 0.209022 -1.602516 -1.213488 0.670260 -1.894455 -2.772046 -0.266233 4.040524 -2.370249 -0.003042 -0.344508 0.294356 -0.213830 0.379849 -0.057685 -0.142113 +-10.576520 160.189362 10.298396 -7.475506 2.554207 -15.058746 -3.038265 -1.506967 -16.541637 -8.988110 1.246997 11.744662 -0.566054 0.077389 -0.095852 0.569936 0.315127 0.363072 12.580375 9.777960 5.806503 20.950594 -4.317551 41.111622 -0.330561 0.204935 0.124383 0.181698 0.011658 0.012631 4.339998 5.832718 6.643101 -3.928652 7.675804 12.793781 -7.478076 8.866470 14.945797 -5.388284 -3.582959 12.486918 14.711348 -8.928375 -18.849380 2.608743 7.828300 -1.661123 -5.340085 7.505740 -0.701340 22.242306 -16.825874 -3.263389 0.355096 -0.331090 0.777423 -0.306707 0.227505 0.233599 -2.128025 -1.689717 0.631834 -3.311277 -2.893536 0.072751 4.037404 -1.962477 -0.025643 -0.330064 0.270560 -0.181401 0.380369 -0.133207 -0.136969 +-11.032528 159.446243 11.193484 -7.607469 3.634754 -15.747669 -3.134311 -1.553056 -15.765891 -9.566685 1.375394 12.152218 -0.535405 0.030291 -0.098619 0.592533 0.347728 0.405280 12.620081 9.516385 6.353779 22.621572 -5.248260 41.567814 -0.351778 0.220795 0.125732 0.177200 -0.034986 0.021091 3.374327 5.782463 6.562540 -3.768897 7.341855 12.736885 -6.838039 8.423208 14.859060 -4.586175 -3.785986 13.274812 13.829673 -8.101556 -18.517960 3.129670 6.874203 -0.997113 -2.948442 8.548265 -0.354932 23.053068 -16.098471 -3.058595 0.376533 -0.325137 0.779378 -0.319449 0.266113 0.230989 -2.915638 -1.166665 1.384980 -3.977428 -3.900332 0.220550 4.057785 -1.815060 -0.014403 -0.309928 0.263900 -0.151795 0.349665 -0.169242 -0.144192 +-11.477907 158.634018 12.021916 -7.294706 3.866702 -16.411154 -2.865041 -1.395903 -15.400959 -10.996572 1.788512 13.340425 -0.535774 0.012436 -0.110394 0.592584 0.359519 0.411562 12.396415 9.513542 6.994771 23.720787 -5.925977 42.378113 -0.360968 0.227914 0.122886 0.177864 -0.053487 0.022422 2.369140 6.021291 6.628178 -3.811535 7.327988 12.753875 -6.479008 8.357909 14.825266 -3.926337 -3.957463 13.469325 13.676326 -7.555861 -18.777166 3.649189 6.354259 -0.838647 -0.453328 8.693585 0.091548 23.335814 -15.458507 -2.870138 0.377976 -0.330938 0.787290 -0.324018 0.283123 0.222324 -3.221347 -0.906817 1.711321 -4.653479 -4.566107 0.260133 3.746727 -2.333239 -0.028880 -0.309737 0.272668 -0.146323 0.342351 -0.171088 -0.150913 +-11.754618 157.874908 12.566226 -6.659654 3.815828 -17.352358 -2.966582 -1.490204 -15.250084 -12.057277 2.244631 15.386659 -0.532942 0.010417 -0.119503 0.575033 0.339235 0.401948 11.586409 9.632736 7.758195 24.762545 -6.661480 43.461388 -0.357823 0.244944 0.119760 0.160645 -0.057218 0.021373 1.668211 6.086178 7.625755 -4.124602 7.338911 12.900241 -6.647751 8.325468 14.473283 -4.114501 -3.687254 13.286473 14.529540 -7.468236 -19.317369 4.519283 5.972566 -0.655293 0.756444 8.910223 0.194656 24.363049 -15.196894 -2.902202 0.377059 -0.338005 0.798529 -0.333622 0.285687 0.206502 -3.229116 -0.433697 2.063303 -5.193028 -5.077242 0.235147 3.725788 -2.920979 -0.041102 -0.303371 0.296200 -0.146385 0.339356 -0.154236 -0.154506 +-12.004084 157.237991 12.936157 -6.305942 3.615783 -18.167765 -2.459479 -1.337810 -15.212354 -13.498231 2.791792 17.171534 -0.489782 -0.050843 -0.094904 0.603037 0.385974 0.406871 11.293916 9.692673 8.308476 25.431528 -7.210978 44.615311 -0.369310 0.265380 0.138930 0.170041 -0.069312 -0.002897 1.127866 5.955515 8.764842 -4.382669 7.334832 12.957771 -6.816120 8.136098 13.948115 -4.419566 -3.153421 13.009773 15.650078 -7.373028 -19.349434 5.438451 5.678382 -0.388690 0.913781 9.065556 0.015867 25.505732 -14.885599 -2.884380 0.430137 -0.323295 0.791334 -0.356550 0.300953 0.241294 -3.014028 0.153495 2.275024 -5.376196 -5.154175 0.194067 3.504311 -3.401726 -0.070221 -0.277609 0.279147 -0.132339 0.340039 -0.204605 -0.134652 +-12.140893 156.678543 13.231537 -6.229176 3.445084 -18.446049 -1.536514 -1.159212 -15.634907 -15.038079 3.294131 18.541788 -0.463389 -0.059730 -0.076676 0.604382 0.388259 0.389530 11.291673 9.667732 8.384093 25.887857 -7.714139 45.613132 -0.368481 0.256638 0.150165 0.161794 -0.054369 0.002377 1.364210 5.486217 9.669513 -4.779380 7.198331 12.780397 -7.464574 7.914199 13.271833 -4.824913 -2.566663 12.457442 16.054541 -7.431819 -18.840149 5.961504 5.381151 -0.254147 1.152591 8.954454 -0.044735 25.942503 -14.216311 -2.751684 0.439331 -0.300730 0.778080 -0.352244 0.295451 0.261929 -2.842363 0.548663 2.284291 -5.187572 -4.820549 0.114477 3.618735 -3.787461 -0.104767 -0.269047 0.262371 -0.121411 0.331794 -0.215339 -0.117003 +-12.163268 156.325226 13.313647 -6.207879 2.716420 -18.530725 -0.798228 -0.952371 -15.733153 -15.976245 3.521087 18.726164 -0.451276 -0.060329 -0.062844 0.566421 0.359079 0.338161 11.524342 9.766999 8.315435 25.639431 -7.772152 46.547638 -0.343655 0.253816 0.164740 0.146837 -0.021867 -0.019739 1.977451 4.988690 10.728998 -5.274837 7.147072 12.504950 -8.386013 7.781594 12.364853 -5.290700 -1.732056 11.745614 16.866001 -7.538753 -18.161772 6.321446 5.139113 -0.095538 0.651253 9.072498 -0.247198 26.910023 -14.317163 -2.854932 0.433777 -0.305133 0.760922 -0.341527 0.265702 0.266666 -2.344515 0.992614 2.391790 -4.722337 -4.535479 0.062922 3.664660 -3.335208 -0.064310 -0.264414 0.270255 -0.136835 0.344769 -0.197493 -0.102238 +-12.189753 156.204514 13.209477 -6.296937 2.237329 -18.538651 -0.196385 -0.842635 -15.620030 -16.648272 3.532489 18.272446 -0.421624 -0.062168 -0.044324 0.548567 0.338759 0.306686 11.848676 9.686393 8.116293 25.149817 -7.674862 47.029305 -0.335757 0.249593 0.175524 0.125016 0.000061 -0.014687 2.419848 4.389591 11.900627 -5.707050 6.949331 12.287120 -9.131953 7.471502 11.475921 -5.680685 -1.111133 10.893270 17.812616 -7.712327 -17.820562 6.519305 4.803987 0.275100 -0.151435 9.524633 -0.458687 27.471832 -15.247224 -3.120506 0.434999 -0.286010 0.748011 -0.336069 0.253858 0.279028 -1.653504 1.503774 2.651853 -3.934599 -4.403604 0.036218 3.880179 -2.273012 0.014895 -0.253817 0.264878 -0.129494 0.336162 -0.193867 -0.084758 +-12.258320 156.320297 12.972820 -6.370316 2.379146 -18.180025 -0.111760 -1.011142 -15.512547 -16.722134 3.250673 17.135126 -0.440092 -0.007641 -0.028148 0.517641 0.298907 0.276611 12.050435 9.344055 7.730395 24.413095 -7.506826 47.093266 -0.309598 0.220128 0.180614 0.122768 0.053540 -0.014729 2.093888 4.088501 12.456456 -5.736309 6.593401 12.289157 -9.027953 7.131604 11.195807 -5.441470 -0.945093 9.397714 17.450848 -7.749553 -17.205772 6.627807 5.445283 -0.556064 -2.006414 7.137973 -0.851998 28.450481 -15.871873 -3.580874 0.388686 -0.293490 0.725561 -0.298766 0.210566 0.279196 -1.326600 1.048519 2.015600 -2.466781 -3.484174 -0.133951 3.995342 -2.012242 0.005046 -0.274097 0.260361 -0.156308 0.359528 -0.163621 -0.081235 +-12.233031 156.677017 12.600430 -6.862566 2.167047 -17.945341 0.107629 -1.063304 -14.915633 -16.067343 2.740838 15.318274 -0.466176 0.045496 -0.023798 0.488294 0.249888 0.274261 12.590283 8.930395 7.613179 23.621336 -7.181594 46.643768 -0.293799 0.218007 0.181075 0.108841 0.084267 -0.009947 2.462157 3.703882 13.238460 -5.646223 6.314587 12.249623 -9.064575 6.913510 10.781544 -5.288212 -1.016388 8.728507 17.213570 -7.698281 -17.416704 6.649496 5.805310 -1.218261 -4.689087 4.937608 -1.356343 29.498144 -17.218878 -4.320535 0.346171 -0.329679 0.732530 -0.277607 0.190315 0.260818 -1.481122 0.950674 1.551869 0.289414 -2.788719 -0.583706 3.724111 -2.041247 0.041688 -0.290575 0.286985 -0.182382 0.383343 -0.131012 -0.093848 +-12.187605 157.092422 12.134873 -7.277102 2.349147 -17.486326 -0.299998 -1.329397 -14.468218 -14.614100 2.097471 13.347012 -0.474041 0.108227 -0.019255 0.420475 0.162894 0.228699 12.924494 8.456316 7.200593 22.933365 -6.960938 46.031380 -0.267872 0.182777 0.172078 0.069147 0.126971 0.012523 2.433203 3.421620 14.182847 -5.411819 5.896744 11.808802 -8.784131 6.479448 9.729136 -4.818884 -1.033386 8.062301 16.318027 -7.672631 -15.897619 6.520482 5.928554 -1.331696 -7.374492 3.514424 -1.666415 29.705997 -19.821272 -5.242815 0.285555 -0.327840 0.716255 -0.236875 0.154716 0.239262 -1.659985 1.161210 1.459286 3.382258 -2.585826 -1.051680 3.455165 -1.741092 0.094011 -0.300304 0.291817 -0.200811 0.372951 -0.075877 -0.096976 +-12.105247 157.532501 11.632055 -7.176392 2.172981 -16.553852 -1.237175 -1.552315 -14.162011 -12.741652 1.438776 10.710757 -0.459499 0.110266 -0.010060 0.422467 0.170392 0.241272 12.404871 8.134282 6.572304 22.403255 -6.671595 44.991665 -0.269803 0.159104 0.171338 0.069817 0.126816 0.029661 1.367676 3.754752 14.370745 -4.876679 5.635292 11.436094 -7.680348 6.152471 9.166446 -3.867156 -1.165315 7.536928 14.857112 -6.968556 -15.042185 6.164510 6.532460 -1.823331 -10.642793 1.309045 -2.002665 29.405722 -22.136473 -6.036434 0.266510 -0.310068 0.691340 -0.214316 0.155742 0.241722 -2.195982 0.912099 0.883817 6.705359 -1.676299 -1.420694 3.741755 -1.833966 0.063025 -0.299391 0.265327 -0.188253 0.354361 -0.087377 -0.095894 +-11.824604 158.009827 10.992702 -7.711839 2.075364 -15.587891 -2.088654 -1.835086 -14.202435 -10.109858 0.801686 8.486234 -0.441670 0.088577 -0.027452 0.479225 0.227037 0.306912 12.040537 7.666810 5.746990 22.462009 -6.724844 43.824299 -0.295205 0.133230 0.165084 0.084466 0.069559 0.081053 0.806512 3.957070 14.487797 -3.805872 5.297740 11.191707 -6.132635 5.824849 8.921922 -2.679579 -1.973135 7.175693 12.479910 -6.068850 -15.259023 4.406346 7.096613 -2.811057 -13.778641 -1.106776 -2.268214 28.906534 -24.795628 -6.924478 0.263654 -0.253814 0.673941 -0.206272 0.191188 0.238607 -3.153684 0.288356 0.224831 10.035183 -0.926798 -1.743588 4.105676 -1.873696 0.025924 -0.303234 0.214187 -0.132173 0.288749 -0.126169 -0.109405 +-11.486158 158.456665 10.193080 -8.740442 1.905554 -14.505961 -2.350240 -1.884379 -14.665668 -7.717851 0.374252 6.604163 -0.439979 0.081357 -0.036211 0.511341 0.261599 0.356569 12.131114 7.159822 4.751263 22.863031 -6.897527 42.459049 -0.318512 0.120248 0.161797 0.093616 0.037566 0.114388 1.206626 3.983779 14.601110 -2.751334 5.130107 10.879861 -5.038743 5.701476 8.615458 -1.284028 -2.591045 7.060310 10.643373 -5.052985 -15.613962 2.561202 7.182442 -3.885128 -16.511860 -3.883932 -2.304093 27.073845 -27.518414 -7.518256 0.250585 -0.238313 0.671737 -0.196097 0.220594 0.234636 -4.112470 -0.486091 -0.340489 13.856544 -0.541222 -2.200242 4.130472 -1.385617 0.026595 -0.312973 0.194391 -0.104998 0.260935 -0.147834 -0.123990 +-11.165329 158.871689 9.294290 -9.580932 1.938409 -13.071809 -2.774422 -1.995113 -15.587181 -5.479844 0.084802 4.950943 -0.450784 0.073900 -0.059684 0.516137 0.270156 0.368477 12.051138 6.629433 3.344998 23.300184 -7.073602 40.853096 -0.325742 0.112034 0.151600 0.096996 0.010127 0.127193 2.367603 3.662552 14.544272 -2.300927 5.032442 10.374562 -4.940774 5.629103 8.166381 -0.456285 -2.840114 7.537911 9.931774 -4.497946 -15.633410 1.278644 6.299837 -4.638807 -18.993738 -6.416201 -2.319404 24.388172 -28.466503 -7.368638 0.246393 -0.226625 0.678114 -0.196447 0.234327 0.220154 -4.338342 -1.046778 -0.519125 18.322056 -0.927267 -2.912134 3.519533 0.244504 0.066412 -0.319135 0.188831 -0.095946 0.236173 -0.145618 -0.138050 +-10.768684 159.136658 8.369044 -10.365875 1.587422 -11.407109 -3.041477 -2.004628 -16.891371 -3.434665 -0.069550 3.456881 -0.468509 0.084028 -0.069495 0.529481 0.272144 0.419691 11.766008 6.263106 1.633495 24.164347 -7.413058 39.434261 -0.344595 0.114909 0.143007 0.096394 -0.017786 0.148005 3.174097 3.375661 14.198696 -1.732412 4.794790 9.791350 -4.461377 5.439648 7.734949 0.695003 -3.263393 7.727342 8.347216 -3.514747 -16.261333 -0.609418 5.460496 -5.295821 -21.369019 -7.883554 -2.388442 21.405855 -29.465984 -7.074156 0.232986 -0.244612 0.700580 -0.194923 0.261266 0.204230 -4.472658 -1.269404 -0.997553 22.855288 -0.506443 -3.657374 2.081141 1.298265 0.078064 -0.327344 0.196078 -0.094661 0.226753 -0.153219 -0.164778 +-10.362288 159.424927 7.513436 -10.676368 -0.541627 -10.126528 -2.962898 -1.659159 -17.407568 -1.695443 -0.096874 1.489791 -0.472091 0.054948 -0.101665 0.572698 0.324096 0.480299 11.640573 6.414000 0.549522 24.135914 -7.255526 38.962532 -0.374231 0.121832 0.122955 0.116367 -0.078071 0.170036 3.389520 3.627431 13.544667 -1.203354 4.916288 9.550274 -3.726349 5.574574 7.882900 1.832137 -2.895388 8.249529 7.252992 -1.913786 -17.259890 -3.327069 4.371879 -6.073265 -23.620604 -8.793082 -2.706412 19.274776 -29.980612 -6.865378 0.242340 -0.222372 0.712701 -0.211066 0.304585 0.186890 -3.192371 -1.151574 -1.539329 25.508799 0.351278 -3.907566 1.875103 2.776520 0.017741 -0.325225 0.183665 -0.065521 0.191465 -0.176826 -0.187005 +-10.015802 159.633789 6.774328 -10.743060 -4.249978 -9.004866 -2.176583 -1.023096 -17.446777 -0.428128 -0.050101 -0.618364 -0.486922 0.037035 -0.126380 0.618947 0.360951 0.545748 11.812025 6.992308 -0.135721 22.769899 -6.445992 39.025208 -0.410490 0.136140 0.103693 0.129657 -0.135156 0.191831 3.887447 3.945993 13.276469 -1.011871 5.296007 9.298170 -3.598031 5.982064 7.785995 1.855152 -1.910181 8.998516 6.085312 -0.431414 -18.625816 -5.510310 3.480265 -6.606335 -26.439394 -9.226962 -3.130168 17.302073 -29.293293 -6.484406 0.265439 -0.214550 0.751546 -0.239301 0.350855 0.175817 -1.920061 -1.061195 -1.949684 28.230600 1.015548 -4.318895 2.411154 6.408478 -0.120510 -0.323313 0.180882 -0.048902 0.166654 -0.200655 -0.213644 +-9.753320 159.763275 5.946462 -10.768269 -7.751304 -8.021132 -1.151258 -0.476258 -17.733234 0.198507 0.003402 -1.863529 -0.481496 0.011635 -0.135894 0.662701 0.404263 0.602277 11.815592 7.464859 -0.753441 21.749920 -5.827280 39.087379 -0.442300 0.152349 0.090666 0.145218 -0.180264 0.205419 3.474221 4.371689 13.129768 -0.515508 5.450000 9.112489 -2.694355 6.131138 7.655249 1.867284 -0.771943 9.392219 5.225754 0.983774 -19.677412 -7.801723 2.592673 -6.890826 -29.759911 -9.232000 -3.716399 16.027205 -28.753725 -6.338119 0.291514 -0.202986 0.771694 -0.263768 0.392568 0.177291 0.135106 -0.453572 -2.622035 29.660341 2.229525 -4.469664 2.748702 9.116249 -0.250170 -0.311327 0.171817 -0.030197 0.149583 -0.234253 -0.226408 +-9.554166 159.707367 5.080445 -10.682375 -11.093835 -7.073360 0.232117 -0.034097 -18.682926 0.234990 0.017817 -1.927449 -0.497061 0.011271 -0.154227 0.695764 0.438507 0.622805 12.035393 7.999822 -1.598497 20.276812 -5.091345 39.508476 -0.456617 0.143508 0.079380 0.168213 -0.197154 0.221194 2.834883 4.844185 12.949556 -0.078207 5.593792 9.071894 -1.730728 6.275786 7.728148 1.451176 0.621287 8.959104 4.835809 1.975133 -20.670458 -9.961541 1.764418 -7.482730 -32.615372 -9.744394 -4.036368 13.958906 -28.009691 -5.955474 0.294939 -0.177878 0.779480 -0.270012 0.403941 0.176914 3.292212 0.021180 -3.832868 29.940405 3.884016 -4.385713 3.431431 11.219625 -0.329157 -0.321903 0.155525 -0.019049 0.137339 -0.240127 -0.233515 +-9.172022 159.536179 4.287268 -10.531297 -13.868399 -6.487523 1.454017 0.080399 -19.953587 0.083305 -0.016876 -0.470651 -0.544859 0.050466 -0.173859 0.709304 0.448273 0.636417 11.873093 8.151453 -1.935811 18.922718 -4.566908 39.686890 -0.458207 0.120636 0.071339 0.193853 -0.189472 0.235707 2.585171 4.929061 12.497750 0.263597 5.477036 9.288976 -0.986578 6.209398 8.301510 1.181025 1.761880 8.599656 3.503222 2.945799 -21.269123 -12.909211 0.250549 -8.175206 -33.912518 -10.129675 -4.193420 10.952181 -27.437540 -5.363461 0.261794 -0.185990 0.787387 -0.250892 0.397778 0.167995 6.924839 0.775010 -5.268367 29.368313 5.833721 -4.142728 4.577650 12.763718 -0.318809 -0.355796 0.153093 -0.032387 0.149409 -0.222347 -0.250208 +-8.735766 159.302094 3.495360 -10.154297 -16.510944 -6.336051 2.687575 0.032264 -21.391552 -0.546176 -0.056879 2.189341 -0.582823 0.086696 -0.183261 0.734651 0.480606 0.666497 11.586700 8.275984 -2.092062 17.515150 -4.091831 40.286354 -0.461133 0.090816 0.060040 0.235942 -0.177562 0.247518 2.311195 4.932173 12.279837 0.499985 5.371855 9.665775 -0.405770 6.070732 9.070761 1.400689 2.949356 7.851189 1.935036 4.203703 -21.539318 -16.289186 -1.296401 -9.335744 -34.191463 -11.115684 -4.075907 7.255441 -26.229082 -4.458590 0.222805 -0.189869 0.773111 -0.221481 0.392052 0.166237 10.983436 1.267169 -7.181695 28.194967 8.150480 -3.735981 6.912456 14.313531 -0.148609 -0.384245 0.132853 -0.042660 0.166261 -0.222504 -0.260851 +-8.228956 159.090851 2.613524 -9.674929 -19.653587 -6.441548 4.778462 0.103319 -23.311642 -2.880351 0.039479 6.514984 -0.613003 0.109717 -0.188663 0.758729 0.502808 0.692191 11.037043 8.567432 -2.312833 16.089779 -3.593109 41.139725 -0.469174 0.095240 0.049079 0.267381 -0.170634 0.242277 2.197282 4.846527 13.150053 0.622613 5.322367 9.724824 -0.215018 6.000103 8.952825 0.588603 4.860611 7.727464 1.822828 5.147485 -22.076241 -18.109533 -2.546503 -10.031176 -35.841206 -12.272231 -3.879541 4.546419 -24.582525 -3.834703 0.216030 -0.207590 0.784267 -0.223131 0.394707 0.168411 14.176224 2.165993 -8.892341 28.154507 10.636209 -3.422447 9.278061 15.029361 0.134653 -0.396183 0.136905 -0.059782 0.196579 -0.224280 -0.268998 +-7.672782 158.921707 1.752458 -9.337086 -22.675936 -6.650127 7.111570 0.265263 -25.584240 -5.432250 0.419341 12.321162 -0.636163 0.111654 -0.204623 0.789197 0.526674 0.726981 10.958919 8.799173 -2.446165 14.123393 -2.879994 41.935795 -0.487384 0.104296 0.040392 0.285007 -0.192338 0.248215 2.081067 4.785146 14.379545 0.974503 5.271582 9.644013 0.256006 5.960065 8.507165 -0.287498 6.491506 8.313399 1.108517 6.137515 -22.766132 -19.582798 -3.797518 -10.279150 -38.393330 -13.199995 -3.839222 2.764426 -24.543068 -3.639683 0.226223 -0.216343 0.810983 -0.237401 0.415800 0.166459 16.254305 3.311919 -10.049994 29.119520 12.619970 -3.263388 10.961274 15.305230 0.368482 -0.402988 0.142162 -0.060848 0.200952 -0.232675 -0.283983 +-7.063866 158.794724 0.929292 -8.588428 -25.256002 -7.034620 9.284584 0.214736 -28.314030 -8.723649 1.278155 19.648899 -0.619495 0.064143 -0.228233 0.837040 0.585594 0.758053 10.341713 8.946970 -2.767771 12.391591 -2.348774 42.892838 -0.521324 0.120074 0.027642 0.298312 -0.245361 0.265464 1.843598 4.651171 15.952848 1.166214 5.239953 9.381445 0.535340 5.878619 7.715352 -1.167545 8.114583 9.229746 0.719982 7.116445 -23.612904 -20.519329 -5.584527 -9.936342 -40.615978 -13.899993 -3.865438 1.144542 -25.576572 -3.512211 0.267486 -0.182611 0.826508 -0.272163 0.461143 0.170335 18.022318 4.773543 -10.540502 30.964613 13.816966 -3.302941 11.883787 16.041054 0.493940 -0.387114 0.131579 -0.020390 0.169809 -0.259166 -0.282431 +-6.425145 158.786209 0.182950 -7.582339 -27.892616 -7.406356 11.398551 0.158419 -30.935560 -12.378336 2.696329 27.031349 -0.615334 0.024362 -0.251280 0.858736 0.620031 0.785345 9.368890 8.993286 -3.085620 10.803086 -1.870944 43.360626 -0.545688 0.151365 0.020230 0.302255 -0.291567 0.264251 1.344945 4.636975 17.044071 1.277169 5.192320 9.088566 0.881750 5.828482 7.038770 -1.838528 9.580663 11.048082 -0.033992 8.218720 -24.259003 -20.974840 -7.602017 -9.410316 -43.056358 -14.798287 -3.768966 -0.274711 -26.678377 -3.435072 0.295781 -0.194723 0.850567 -0.302749 0.502459 0.160458 19.080612 6.628206 -10.669480 33.482502 14.985076 -3.254134 12.418055 16.110548 0.547830 -0.373111 0.153378 -0.001379 0.163181 -0.270848 -0.289993 +-5.734099 158.856125 -0.518818 -6.809907 -30.579470 -7.550349 13.400704 0.121882 -33.016388 -15.408962 4.352577 33.676102 -0.626646 0.023545 -0.263316 0.858298 0.613667 0.795665 8.653202 9.076246 -3.766886 9.173681 -1.362657 43.767143 -0.547694 0.166566 0.016648 0.299375 -0.304079 0.257012 1.180748 4.611382 17.794598 1.416092 5.238131 8.803474 1.131272 5.921054 6.466387 -2.449370 10.721713 12.514604 -0.285077 8.840532 -23.884501 -21.824026 -9.999587 -8.896431 -45.014500 -15.913357 -3.560483 -1.642877 -28.329353 -3.389562 0.301999 -0.213824 0.869005 -0.313514 0.510015 0.150139 20.552895 8.372422 -10.289063 34.785896 15.441662 -3.345138 13.876097 18.417870 0.850852 -0.370481 0.171608 -0.008109 0.167767 -0.265264 -0.301268 +-5.080856 159.128662 -1.222585 -6.123955 -33.404877 -7.895464 15.146324 0.036083 -34.329250 -17.774126 6.158177 39.931210 -0.658255 0.021642 -0.291472 0.870189 0.615126 0.847926 8.029611 9.127069 -4.338978 7.508443 -0.824190 44.040855 -0.566306 0.185212 0.002085 0.301694 -0.349018 0.258370 0.837340 4.727928 18.217047 1.625928 5.275351 8.767420 1.628955 6.021292 6.427030 -2.078348 11.463920 14.774514 -1.915507 10.211136 -24.178553 -22.797016 -12.876400 -8.575180 -46.401260 -17.695297 -3.031675 -3.264457 -29.202883 -3.167481 0.304311 -0.247500 0.908528 -0.328271 0.541705 0.124476 21.120480 10.514746 -9.856177 36.316490 16.214890 -3.311450 15.704465 20.593342 1.256162 -0.374275 0.194726 -0.016687 0.163494 -0.266890 -0.338205 +-4.478435 159.522491 -1.854326 -5.243031 -36.308411 -8.383995 16.863348 0.024552 -35.057407 -20.436405 8.400620 45.672112 -0.705283 0.028226 -0.325621 0.902137 0.633898 0.910241 7.333644 9.236161 -5.073282 5.537334 -0.134703 44.540131 -0.595285 0.202722 -0.012282 0.316869 -0.393063 0.270928 0.219744 5.124094 18.338137 1.784375 5.417981 8.933867 2.215036 6.213049 6.807394 -1.600638 12.038110 16.592712 -3.133415 11.378983 -25.478693 -23.222706 -15.719395 -8.550082 -48.061256 -20.138439 -2.316854 -4.268013 -30.914459 -3.161460 0.305300 -0.280671 0.961503 -0.345210 0.581408 0.104103 21.850754 12.503804 -9.593614 37.586441 17.192619 -3.314294 17.168060 23.052763 1.671400 -0.392749 0.219261 -0.023702 0.165436 -0.270484 -0.377512 +-3.787992 160.187195 -2.410276 -3.944030 -38.643448 -9.156026 17.917011 -0.480206 -35.352627 -23.084803 10.693775 50.365582 -0.760832 0.039299 -0.373129 0.930771 0.653277 0.982446 6.154510 8.923654 -5.498709 3.367103 0.524818 44.249519 -0.627968 0.231209 -0.041062 0.334425 -0.446824 0.285819 -0.361312 5.279794 18.052982 1.663221 5.347169 9.327538 2.453972 6.220126 7.678231 -1.024856 12.227106 18.894524 -4.340035 12.329124 -27.314934 -23.006369 -19.134781 -8.570673 -49.065998 -22.984152 -1.486997 -3.958987 -32.332741 -3.495274 0.298242 -0.329179 1.019500 -0.367896 0.631365 0.065429 22.184492 15.048985 -9.186317 39.179314 18.316572 -3.430213 18.396908 26.191151 2.081500 -0.408578 0.261018 -0.029149 0.172290 -0.263264 -0.421354 +-3.014895 161.107498 -2.893906 -2.329648 -40.833126 -10.386823 18.169176 -1.266523 -34.731030 -25.180538 12.671412 53.777958 -0.806785 0.034349 -0.425188 0.951582 0.682212 1.029198 4.770388 8.366419 -5.484551 1.306127 1.101586 43.291843 -0.648813 0.245138 -0.060089 0.351240 -0.496251 0.298748 -1.128718 5.329763 18.030581 1.481508 5.127775 9.848531 2.584974 6.069211 8.565516 -0.546830 12.558703 20.621790 -5.885605 13.296539 -29.129614 -23.385605 -22.317192 -8.452600 -48.575809 -25.492346 -1.046355 -4.139489 -35.633602 -3.682168 0.286223 -0.359278 1.054532 -0.379544 0.669189 0.027126 22.967888 17.741011 -9.044477 39.877590 20.014585 -3.284785 20.479877 28.782412 2.791781 -0.426642 0.292744 -0.023073 0.168148 -0.250560 -0.454105 +-2.376011 161.956879 -3.285404 -1.326498 -43.010807 -10.709376 18.430225 -1.895622 -34.283737 -26.259142 14.162395 56.798191 -0.819272 0.039760 -0.437249 0.966845 0.698361 1.059230 4.112092 7.786780 -5.768792 -0.637084 1.620485 41.965118 -0.659374 0.240475 -0.067026 0.361953 -0.509176 0.310738 -1.792899 5.393530 17.076418 1.463870 4.935923 10.288431 2.979496 5.876730 9.544247 -0.114180 12.799664 21.578428 -6.735719 14.133934 -29.321909 -22.626268 -25.042858 -8.110881 -48.956902 -28.113268 -0.340618 -3.898420 -39.556431 -4.051702 0.272360 -0.363527 1.058355 -0.371989 0.683263 0.019641 23.371780 20.147465 -8.846654 40.778412 21.673870 -2.934761 22.840670 31.196224 3.653859 -0.435051 0.290253 -0.019083 0.163445 -0.255501 -0.467088 +-1.622311 162.840790 -3.643581 -0.216050 -45.438114 -11.067581 18.018665 -2.597883 -33.349453 -26.379347 15.012912 59.110443 -0.835889 0.056691 -0.438466 0.969832 0.701991 1.067346 3.373744 7.170098 -5.937366 -2.400672 2.029167 40.177803 -0.666412 0.220319 -0.066142 0.371481 -0.500474 0.322498 -2.171825 5.444689 15.962061 1.283122 4.864514 10.808869 3.004338 5.795840 10.635302 0.692456 13.137923 22.173567 -7.396810 15.286156 -29.202721 -21.606020 -27.714966 -7.596881 -48.126549 -30.798569 0.248973 -3.130774 -45.408188 -4.650240 0.251227 -0.364526 1.062479 -0.351314 0.686477 0.026679 23.310848 22.688040 -8.672698 42.126072 23.556051 -2.417055 24.519754 33.130379 4.331645 -0.453022 0.280190 -0.029984 0.164061 -0.257531 -0.477192 +-0.852601 163.804398 -3.949569 0.345234 -47.872005 -10.937167 17.421329 -3.125296 -32.033611 -25.642794 15.282559 61.087753 -0.837751 0.067096 -0.437068 0.974866 0.701410 1.089191 3.166177 6.576193 -5.947394 -4.319799 2.479144 37.531116 -0.657222 0.196616 -0.065618 0.376822 -0.502651 0.327464 -1.956878 5.400740 14.711784 1.194172 4.918184 11.425623 2.904609 5.784266 11.959918 1.117989 13.210009 21.947445 -8.610518 16.099981 -28.826668 -20.874163 -29.544418 -7.399006 -46.854317 -34.086674 1.400307 -2.687394 -50.646118 -4.816702 0.230056 -0.344587 1.039803 -0.328243 0.672071 0.022215 23.148514 24.658007 -9.095463 43.398216 26.029205 -1.486876 26.502352 34.626743 5.208508 -0.460241 0.250342 -0.029836 0.146204 -0.265386 -0.490343 +-0.093514 164.650482 -4.151788 0.539706 -50.054752 -9.855972 16.460606 -3.308074 -30.890961 -23.812643 14.871906 62.651970 -0.886891 0.138802 -0.433379 0.949382 0.664410 1.087481 2.945152 6.139464 -6.565036 -5.846557 2.695843 34.269836 -0.633040 0.144105 -0.075635 0.393932 -0.459723 0.330813 -1.115814 5.348762 11.864999 0.971613 4.946169 12.265228 2.660460 5.698934 14.396877 1.647901 13.167585 20.787241 -9.799139 16.669756 -28.166208 -18.044188 -30.541647 -7.698162 -46.300476 -37.622993 3.030749 -0.091714 -55.815071 -6.255778 0.165026 -0.352996 1.020585 -0.274671 0.629202 0.013001 21.673033 26.092312 -10.106341 45.357559 29.047106 -0.123314 27.783638 36.686089 6.012128 -0.495624 0.225790 -0.074628 0.160639 -0.241234 -0.510553 +0.525571 165.410446 -4.278963 0.180768 -51.755867 -8.524004 15.233724 -3.320123 -29.348419 -20.762964 13.701805 64.384651 -0.922192 0.206464 -0.415517 0.926679 0.639159 1.071826 3.150133 5.716417 -6.779891 -7.098650 2.763778 30.621151 -0.603276 0.075717 -0.060993 0.411713 -0.396930 0.338897 -0.248446 5.369173 8.997069 0.924284 4.954095 13.070316 2.593556 5.510279 16.858480 2.638926 13.059347 19.503614 -11.000761 17.470186 -27.056196 -14.042281 -30.683777 -8.197059 -46.377510 -41.534576 5.418648 4.556721 -60.567123 -9.093345 0.088124 -0.352478 0.981064 -0.198035 0.577001 0.023669 18.646257 26.848083 -11.631490 47.801434 32.582085 2.096767 29.180138 39.328918 7.140772 -0.542986 0.187719 -0.111771 0.175284 -0.226365 -0.519731 +1.117691 166.077911 -4.363993 -0.469235 -53.071259 -6.989410 13.761934 -3.153218 -27.470335 -17.129795 11.876129 65.177322 -0.911274 0.253083 -0.387259 0.916468 0.637943 1.050353 3.287821 5.362221 -6.796794 -7.664825 2.653923 27.192055 -0.570571 -0.010453 -0.049478 0.430593 -0.333544 0.360278 0.547004 5.408997 6.066652 1.050094 4.879773 13.713514 2.748568 5.061334 19.246479 3.534879 12.996459 18.051666 -11.654007 18.193640 -24.736010 -10.033770 -30.943958 -8.249392 -46.187489 -45.406017 7.950586 13.101711 -64.287277 -14.734966 0.016811 -0.296766 0.895948 -0.113391 0.520277 0.046639 15.871672 27.807774 -13.028104 49.537968 36.451687 4.874414 29.105736 41.918633 7.908497 -0.569591 0.107595 -0.112899 0.156810 -0.231375 -0.504004 +1.638704 166.623810 -4.484794 -0.959668 -53.882881 -5.552499 12.213819 -2.928858 -25.481783 -13.724709 9.862381 64.569145 -0.916958 0.324771 -0.356828 0.901538 0.634897 1.014652 3.142250 5.076992 -6.864185 -7.635260 2.412869 24.364468 -0.535911 -0.107094 -0.038566 0.459450 -0.241564 0.385661 1.130234 5.566401 3.170544 1.058378 4.840948 14.234748 2.809404 4.619390 21.631672 4.854272 13.062694 16.165592 -11.430703 18.843885 -22.495291 -5.166532 -30.817669 -8.758216 -46.752029 -49.712818 11.130754 25.075491 -65.071457 -22.712080 -0.075701 -0.247868 0.810599 -0.014457 0.453432 0.074521 12.475660 27.929701 -14.499917 51.519993 40.565510 8.342980 28.173979 45.857697 8.624625 -0.613121 0.031345 -0.127145 0.157953 -0.223307 -0.484167 +2.082988 167.039734 -4.628028 -1.173458 -54.036171 -4.447215 10.211468 -2.619926 -23.342306 -9.943294 7.504820 62.743015 -0.924339 0.395978 -0.316326 0.881915 0.642009 0.967881 2.867887 4.733041 -6.549827 -7.494579 2.181579 21.506014 -0.487309 -0.203339 -0.012636 0.501230 -0.130522 0.391574 1.392416 5.757218 0.467651 1.095656 4.768246 14.747674 2.965233 4.081998 24.094690 6.116565 13.032990 13.736625 -11.123012 19.097061 -20.254526 -0.352057 -30.210875 -9.411083 -46.832886 -54.058926 14.280040 37.173328 -63.409958 -30.079004 -0.177564 -0.218721 0.706202 0.097012 0.371822 0.109367 8.951498 27.810001 -15.535131 52.720387 45.184765 12.208359 22.750887 51.308090 7.374693 -0.663522 -0.039998 -0.151357 0.185855 -0.217286 -0.455523 +2.477910 167.304169 -4.694244 -1.207814 -53.699409 -3.406551 8.081964 -2.286350 -21.152769 -6.200592 5.203951 59.949688 -0.955523 0.495282 -0.271555 0.843363 0.618496 0.903873 2.424139 4.396047 -6.316773 -7.264716 1.935531 18.867821 -0.429256 -0.303297 0.012807 0.538343 0.002920 0.389868 1.364346 5.850482 -1.809862 1.178314 4.569081 14.985292 3.229892 3.523268 26.012440 6.973453 13.034779 11.015517 -10.673641 18.890011 -17.991638 3.776378 -28.534470 -9.806660 -47.814186 -58.275261 18.333158 47.887138 -61.011257 -35.994171 -0.289825 -0.209766 0.615003 0.212634 0.271673 0.140565 5.595275 26.873817 -16.162714 53.966068 49.995464 16.869511 13.628213 56.403671 3.585502 -0.725472 -0.098484 -0.201196 0.234147 -0.190314 -0.431647 +2.820475 167.423233 -4.687130 -1.731077 -53.389935 -2.209347 6.634295 -1.896335 -18.054928 -3.255263 3.346537 55.452576 -0.952764 0.580243 -0.230159 0.815210 0.607671 0.854501 2.321575 4.141191 -6.075737 -7.021814 1.742799 16.766270 -0.387872 -0.405575 0.024409 0.563725 0.112042 0.420521 1.612369 5.624309 -3.722794 1.276926 4.217242 15.137303 3.405852 2.949592 27.700352 7.629457 13.192994 8.730769 -10.962315 18.834248 -16.023176 6.578010 -26.134007 -9.956131 -48.455280 -62.111660 22.208340 55.361801 -57.581387 -38.757103 -0.396962 -0.167755 0.511097 0.321970 0.198023 0.169169 1.730402 25.434643 -16.466232 55.496189 55.334835 22.541298 -1.647177 60.404892 -4.847795 -0.765889 -0.171096 -0.211955 0.246358 -0.173759 -0.397485 +3.236367 167.411102 -4.672798 -2.256626 -52.909401 -1.212368 5.671906 -1.638146 -14.262360 -1.447922 2.107789 49.348183 -0.978126 0.660523 -0.218000 0.799541 0.601928 0.820214 2.373644 3.955387 -5.971650 -6.946975 1.612850 14.967504 -0.349134 -0.499687 0.018829 0.599420 0.192782 0.444575 1.776198 5.200869 -5.293624 1.343317 3.707423 15.260667 3.587335 2.341715 29.165981 7.954035 13.782743 6.735585 -10.919444 18.844135 -14.506988 9.238744 -24.303852 -9.831750 -47.349991 -65.011215 24.013906 62.591080 -52.897907 -40.513161 -0.491916 -0.122490 0.430504 0.411046 0.127134 0.175550 -1.964227 24.323439 -16.556448 55.734577 60.556126 27.633781 -19.343679 61.188793 -15.520700 -0.812115 -0.239581 -0.227336 0.247925 -0.148344 -0.384183 +3.662779 167.220795 -4.494472 -3.290248 -51.874744 0.218740 5.343167 -1.660143 -10.303707 -0.142126 1.052480 42.519733 -0.991421 0.721342 -0.201778 0.784318 0.588885 0.784218 2.616390 3.734074 -5.848286 -6.675889 1.426349 13.244569 -0.319236 -0.567511 0.019174 0.619432 0.260619 0.460455 2.390364 4.560790 -6.592905 1.469314 3.057482 15.107872 3.782181 1.669818 29.797119 7.957111 14.290574 5.547637 -10.542043 18.747747 -13.086506 11.997070 -22.997919 -9.590491 -46.092548 -66.755424 24.712898 66.278648 -48.393105 -39.981495 -0.555400 -0.086110 0.373948 0.473903 0.070515 0.188289 -5.343866 23.352652 -16.281370 55.876293 64.525116 31.861109 -32.759510 59.920414 -23.383692 -0.843582 -0.289677 -0.241344 0.251568 -0.128917 -0.369590 +4.067396 166.960800 -4.361309 -3.971669 -49.764397 1.110065 4.906065 -1.693422 -5.860209 1.581229 -0.038105 34.556232 -1.004003 0.768534 -0.182840 0.781436 0.604544 0.758929 2.851780 3.597019 -5.586694 -6.457114 1.328944 12.091945 -0.300859 -0.630621 0.023102 0.653213 0.322256 0.475104 2.864322 3.852616 -7.794526 1.681827 2.299321 15.162473 4.052951 0.829506 30.627407 8.214466 13.888855 4.378451 -10.685382 18.297972 -12.226327 13.817783 -21.144844 -9.592664 -44.480293 -68.980453 25.606787 68.248352 -44.624580 -38.483128 -0.613867 -0.067973 0.316851 0.535738 0.032209 0.209655 -8.763444 21.954578 -16.415827 55.347401 67.717171 34.784950 -42.139133 57.252598 -28.182941 -0.875570 -0.334535 -0.250543 0.269055 -0.124705 -0.348265 +4.636602 166.587784 -4.223289 -5.266114 -47.395664 2.447992 5.499413 -1.687430 -1.929722 2.888417 -0.734935 26.990812 -1.021686 0.821962 -0.172238 0.789213 0.629818 0.740743 3.344638 3.586419 -5.642381 -5.905100 1.213343 11.412690 -0.281618 -0.706338 0.022509 0.694830 0.380198 0.499937 4.427049 3.121125 -8.798155 1.844641 1.628747 15.129389 3.878113 0.099112 31.315825 8.514285 13.229555 3.092165 -10.868461 17.653017 -11.290122 15.057023 -19.230263 -10.093170 -43.471043 -71.199425 26.536755 67.296043 -40.778664 -35.348030 -0.682056 -0.033064 0.249698 0.604689 -0.010018 0.226973 -11.940026 19.959269 -16.712763 55.291599 69.953644 37.190300 -48.890438 54.577919 -31.261019 -0.915902 -0.393446 -0.250274 0.275328 -0.119153 -0.329358 +5.258411 166.205856 -4.252935 -6.431387 -45.600491 3.536648 6.545576 -1.448728 1.483114 3.318952 -0.881176 20.197004 -1.053736 0.890126 -0.173544 0.781340 0.633095 0.723494 3.656317 3.838358 -6.202827 -5.067804 1.155454 11.784363 -0.254432 -0.782688 0.007056 0.731455 0.436476 0.522428 5.698939 2.602547 -9.497391 2.025046 1.099972 15.120334 3.744249 -0.509495 31.891428 8.952615 12.836171 1.812229 -10.962914 17.272177 -10.331335 16.333370 -17.039124 -10.781209 -41.696667 -73.221825 27.045338 66.291214 -38.236027 -33.038532 -0.764934 -0.000685 0.185126 0.675182 -0.062096 0.221397 -14.918709 17.772314 -17.137106 55.093426 71.923866 39.101379 -53.966152 51.682739 -33.063679 -0.957524 -0.446228 -0.260021 0.277547 -0.093860 -0.323296 +5.940244 165.971054 -4.369731 -6.941912 -43.825195 4.096900 7.384290 -1.291045 3.835479 3.335922 -0.885262 14.936798 -1.070965 0.941834 -0.168678 0.763326 0.608673 0.717506 3.259534 4.009666 -6.897241 -3.953108 0.989223 12.205113 -0.233730 -0.836430 0.000128 0.737230 0.469353 0.544554 6.251256 1.813306 -9.726709 2.104901 0.305617 15.195408 3.689377 -1.289448 32.115398 9.139599 12.732682 0.892009 -11.632235 17.393703 -9.632825 15.845903 -15.424744 -10.881114 -35.908157 -73.655998 23.703051 66.948273 -38.058380 -32.749851 -0.824684 0.018171 0.148919 0.726738 -0.097002 0.212133 -17.233620 16.339539 -17.520828 53.774715 73.631668 39.765720 -57.063835 49.789803 -33.938019 -0.982580 -0.481283 -0.269793 0.264861 -0.076571 -0.329458 +6.565021 165.825562 -4.427698 -6.960798 -42.819855 4.254874 7.894347 -1.021454 5.713054 2.831353 -0.751921 10.657269 -1.093285 0.974740 -0.174080 0.777262 0.629688 0.723006 2.666457 3.954504 -7.205228 -3.366493 0.862160 11.838869 -0.224978 -0.876358 -0.012163 0.769780 0.490264 0.557184 6.221876 1.351170 -9.992504 2.197429 -0.202390 15.383808 3.802520 -1.891260 32.659401 9.215397 12.493174 -0.003385 -11.743753 17.016123 -9.390532 15.405009 -13.737053 -11.154136 -33.295506 -74.476639 22.625280 67.601135 -37.414944 -32.410606 -0.863725 0.039984 0.114554 0.759402 -0.119916 0.210162 -18.051785 15.042164 -18.000347 54.186207 75.059509 41.497402 -58.337666 48.361847 -33.912193 -1.007614 -0.516090 -0.269926 0.266493 -0.070930 -0.328159 +7.082328 165.710281 -4.391743 -6.624625 -42.166958 4.360177 8.257011 -0.711776 6.669240 1.727280 -0.532054 7.685227 -1.131355 1.010287 -0.180984 0.779319 0.629125 0.711936 2.132733 3.850815 -7.505539 -3.429740 0.796503 11.226822 -0.221321 -0.889229 -0.010573 0.786140 0.518447 0.559677 5.580051 0.903072 -10.195440 2.176279 -0.735132 15.361766 4.049510 -2.390837 32.779556 9.361556 12.301540 -0.254739 -11.477374 16.561384 -9.548285 15.325025 -12.597578 -11.071490 -34.168427 -74.630302 23.741774 69.028702 -37.350571 -33.110500 -0.888781 0.022408 0.122476 0.774981 -0.135194 0.211680 -18.965796 14.503507 -18.262161 56.813812 75.778625 44.233711 -58.781261 47.249149 -33.698475 -1.039101 -0.507392 -0.288164 0.294950 -0.049528 -0.330990 +7.768935 165.863647 -4.307055 -6.150938 -41.920200 4.456381 8.277065 -0.478351 6.700149 0.481968 -0.337764 6.213029 -1.131555 1.012600 -0.176054 0.794275 0.646771 0.697315 1.232634 3.713801 -7.990142 -3.224606 0.705244 10.715714 -0.222676 -0.893515 -0.007201 0.799883 0.533038 0.558755 5.059777 0.589834 -10.146471 2.153121 -1.048556 15.340273 4.230238 -2.765184 32.699535 9.375555 11.903297 -0.494516 -10.807954 15.824446 -9.379675 14.942574 -12.093244 -11.114971 -33.925117 -74.529976 23.870192 69.151634 -38.333408 -33.687523 -0.879296 0.033744 0.118045 0.771651 -0.141821 0.229311 -18.729731 14.625992 -18.368483 57.384201 76.129707 45.143669 -58.358936 47.403790 -33.485218 -1.044106 -0.516080 -0.284995 0.306432 -0.052185 -0.316006 +8.548353 166.192734 -4.173178 -5.664074 -42.278553 4.492303 7.746435 -0.331188 6.350278 -0.283085 -0.236999 5.495908 -1.113932 0.962798 -0.181273 0.814125 0.668730 0.716813 0.357089 3.470462 -8.216311 -3.202318 0.606696 9.835293 -0.241930 -0.852172 -0.004854 0.794553 0.488132 0.543959 5.107885 0.546471 -9.911638 2.062612 -1.049525 15.409582 3.960825 -2.791318 32.515560 9.518795 11.310336 -0.036939 -10.851774 15.532160 -10.103300 13.933469 -12.918200 -11.285889 -32.305183 -74.560608 22.812469 67.706062 -39.827080 -33.549690 -0.824694 0.024096 0.146381 0.726684 -0.107127 0.232896 -18.389204 15.134132 -18.385303 57.119015 75.494225 44.306969 -57.490253 48.662090 -33.653316 -1.019513 -0.497376 -0.270958 0.301726 -0.076522 -0.317127 +9.359624 166.420334 -4.018769 -4.980245 -42.585957 4.528403 6.748477 -0.345814 5.401388 -0.612134 -0.229382 5.507876 -1.061504 0.872676 -0.184004 0.860353 0.734717 0.752643 -0.608260 3.066938 -8.290551 -3.396968 0.495681 8.386323 -0.279327 -0.794633 0.002359 0.793846 0.420124 0.535340 4.990063 0.232380 -9.595216 1.811546 -1.217914 15.452978 3.632563 -3.002324 32.208752 9.137323 11.172256 0.456108 -11.087883 15.433730 -11.303026 13.811772 -13.750783 -11.015731 -31.568436 -72.803108 21.177378 68.638733 -41.581448 -35.130375 -0.744773 0.028673 0.165079 0.666047 -0.042311 0.250341 -18.155415 15.966803 -18.517729 58.780121 74.756401 45.004471 -56.288155 50.593178 -34.050549 -0.974973 -0.482421 -0.223742 0.287238 -0.129294 -0.301964 +10.093596 166.565506 -3.750374 -4.851494 -42.918503 4.991039 6.128959 -0.414692 4.447311 -0.730564 -0.226466 5.675186 -1.012589 0.837694 -0.165143 0.824244 0.697142 0.730515 -1.125341 2.800078 -8.398616 -3.701256 0.393578 7.181369 -0.277407 -0.768437 0.018475 0.743861 0.407759 0.529132 5.622285 0.062739 -9.338334 1.646016 -1.260815 15.273209 3.222669 -2.966510 31.482546 8.900829 11.097034 1.196562 -11.634215 15.757787 -11.096888 12.574641 -14.611901 -10.659853 -32.807045 -71.467697 21.783295 67.862419 -44.899872 -36.592525 -0.718117 0.020984 0.170223 0.648878 -0.029075 0.251782 -17.496250 16.396448 -18.462267 60.482620 73.606079 45.763588 -53.659897 53.374538 -33.807327 -0.938385 -0.459205 -0.212416 0.270893 -0.132420 -0.291465 +10.794363 166.642181 -3.541695 -4.596417 -43.395435 5.175663 5.457792 -0.496397 3.517495 -1.078575 -0.196427 6.311500 -0.974749 0.780668 -0.163388 0.820627 0.689769 0.744531 -1.642789 2.546052 -8.427622 -4.049558 0.309586 6.042753 -0.299952 -0.703966 0.026589 0.705866 0.356667 0.517156 6.046828 0.041803 -8.905970 1.527175 -1.197564 15.290967 2.845442 -2.827752 30.899927 8.216281 11.102348 2.039486 -12.221486 15.800844 -12.111193 11.664289 -16.094206 -10.256409 -33.386311 -69.210411 20.947456 67.827560 -48.146358 -38.698151 -0.657422 -0.008357 0.211921 0.593311 0.020017 0.249210 -16.078112 17.573017 -18.489208 60.644829 72.001205 44.495499 -49.511589 56.666138 -32.676971 -0.895810 -0.410989 -0.194314 0.265356 -0.149073 -0.291383 +11.397287 166.650146 -3.314070 -4.500572 -44.459019 5.589544 4.845727 -0.572288 2.760034 -1.405391 -0.158790 6.873722 -0.938904 0.720062 -0.169756 0.805515 0.658026 0.760777 -1.968096 2.420747 -8.855069 -4.587792 0.254511 5.263743 -0.316734 -0.631423 0.030523 0.650070 0.290673 0.501396 6.165148 0.031671 -8.372957 1.463254 -1.149219 15.194142 2.717439 -2.623543 29.967518 7.220787 11.423241 3.161364 -13.030349 16.043474 -13.118226 11.026108 -17.601217 -9.535933 -35.553368 -65.519913 20.492027 68.550468 -53.134136 -42.831207 -0.589981 -0.037744 0.265702 0.527175 0.065515 0.228966 -14.804384 19.207966 -18.320457 60.737556 69.818146 42.683041 -44.328365 60.766979 -31.053774 -0.846057 -0.354925 -0.178190 0.244977 -0.155759 -0.303762 +11.983794 166.418793 -3.056225 -4.421982 -45.209560 6.166308 4.473031 -0.678857 1.548273 -1.955051 -0.065309 7.805702 -0.916213 0.691242 -0.171022 0.774650 0.596437 0.775521 -2.267616 2.453084 -9.706220 -4.968254 0.199363 4.946353 -0.326653 -0.575739 0.033555 0.585762 0.241905 0.495994 6.181069 0.107803 -7.738973 1.522928 -1.077061 14.888722 2.838022 -2.415406 28.691483 6.613058 11.705554 4.125902 -14.210561 16.619797 -13.880965 9.641332 -18.575409 -8.817298 -38.789005 -62.281868 21.170906 69.500053 -59.297649 -48.146931 -0.548917 -0.071280 0.320779 0.480842 0.097408 0.203452 -13.292752 20.391663 -18.324484 62.099762 67.012436 41.241535 -34.907124 64.508705 -26.134050 -0.808710 -0.302179 -0.176434 0.223469 -0.149361 -0.326458 +12.532157 166.130295 -2.841735 -4.377361 -45.672707 6.526807 4.219688 -0.768439 0.590855 -2.410159 0.026082 8.730102 -0.891450 0.652645 -0.179821 0.748705 0.550470 0.795075 -2.341130 2.569870 -10.539226 -5.786746 0.226897 5.222316 -0.341068 -0.518091 0.030929 0.528253 0.186050 0.491540 5.754165 0.033900 -6.946912 1.606812 -1.198418 14.751355 3.033429 -2.419646 27.453598 6.516326 12.231105 5.118654 -15.293788 17.574949 -14.951193 7.721933 -19.823172 -8.838898 -41.099621 -58.811192 20.892488 65.099014 -67.298988 -50.746021 -0.508307 -0.101154 0.372155 0.432807 0.137275 0.173980 -10.801096 21.643499 -18.480904 63.152889 63.530182 38.564259 -18.909105 67.012184 -15.848239 -0.768460 -0.249448 -0.168292 0.199135 -0.145352 -0.347893 +13.101308 165.769394 -2.659800 -4.453258 -45.942970 6.991978 4.415339 -0.856235 -0.659217 -3.494602 0.243570 10.097691 -0.873301 0.613409 -0.196407 0.726417 0.503780 0.813032 -2.406764 2.942341 -12.055311 -6.285938 0.339976 6.883733 -0.351333 -0.469104 0.020538 0.474887 0.125047 0.486048 5.265535 -0.026331 -6.048739 1.705586 -1.306025 14.418541 3.359947 -2.434633 25.993261 6.661047 12.708971 6.387573 -15.911964 18.513685 -15.605532 5.632679 -21.029112 -8.941526 -44.075436 -55.430077 20.366735 51.416321 -73.424759 -44.198700 -0.463724 -0.115237 0.424151 0.382492 0.168375 0.138209 -7.638421 22.793562 -18.287312 64.739471 59.724045 35.616867 -1.782592 66.147781 -4.215763 -0.729727 -0.210127 -0.160917 0.160747 -0.139511 -0.374400 +13.696461 165.348923 -2.397422 -4.521633 -45.725830 7.388296 4.483037 -1.057476 -2.085336 -4.176654 0.403314 11.732553 -0.867445 0.592837 -0.208538 0.691294 0.435699 0.832543 -2.533491 3.337996 -13.621043 -6.774370 0.482145 8.947886 -0.359912 -0.411738 0.010253 0.416349 0.072407 0.475403 4.871581 -0.246062 -5.124758 1.836820 -1.582595 14.014394 3.768221 -2.510570 24.460619 6.810654 12.864364 7.930159 -16.746666 19.227747 -16.260281 2.965408 -22.061213 -8.680306 -48.570004 -51.732334 19.659237 27.193115 -76.521805 -26.792507 -0.426237 -0.157376 0.488585 0.332779 0.198937 0.099880 -4.904137 23.625067 -17.895819 66.220039 55.488194 31.908815 12.223148 63.248169 4.490403 -0.693902 -0.152226 -0.170990 0.141553 -0.125085 -0.406830 +14.305160 164.889618 -2.036281 -4.495141 -44.764992 7.658629 4.488468 -1.379789 -3.798103 -4.596609 0.525367 14.010952 -0.831222 0.531814 -0.217955 0.682929 0.409611 0.856343 -3.078216 3.660815 -15.151029 -6.676285 0.579731 11.220285 -0.382651 -0.351531 0.003074 0.365460 -0.001633 0.469220 4.757620 -0.595176 -3.978148 2.049545 -1.920521 13.467404 4.118104 -2.689900 22.567736 6.930366 12.380527 9.402244 -17.516674 19.528595 -16.929794 -0.012258 -22.851067 -8.408978 -52.526741 -48.008633 18.469044 -7.590754 -76.449936 0.444432 -0.357465 -0.169757 0.540488 0.267607 0.248686 0.079328 -2.011261 23.782238 -17.223866 66.824760 50.381554 26.817139 24.083410 59.091946 10.577999 -0.642315 -0.114108 -0.150107 0.104644 -0.138778 -0.421500 +14.886238 164.387512 -1.763201 -4.183511 -43.525417 7.595090 4.401174 -1.802899 -5.546171 -5.170064 0.673737 16.674118 -0.789561 0.464006 -0.230393 0.687754 0.401881 0.869909 -3.802325 3.991675 -16.874559 -6.649596 0.738451 14.440981 -0.405543 -0.287675 0.003462 0.321853 -0.069122 0.463111 4.463219 -0.795635 -2.599943 2.312649 -2.114779 12.826352 4.533935 -2.694463 20.484848 6.896309 11.852939 11.126021 -17.182184 19.496807 -17.269096 -2.752407 -23.620628 -7.963122 -55.815571 -44.499950 16.535870 -26.048658 -71.816406 13.034382 -0.282766 -0.171104 0.587890 0.199461 0.296775 0.068761 0.886948 23.275854 -16.631189 65.736572 45.030788 20.954069 33.301323 52.791771 13.676422 -0.595075 -0.076559 -0.119057 0.071439 -0.153751 -0.425724 +15.488286 163.950043 -1.434724 -3.952111 -42.859989 7.177482 4.217796 -2.165020 -6.750565 -5.872120 0.866282 19.222778 -0.753862 0.359087 -0.255454 0.728589 0.453576 0.912722 -4.427598 4.334466 -18.402655 -6.350749 0.890851 17.821808 -0.450297 -0.204934 -0.004609 0.309768 -0.171708 0.445258 4.493441 -0.795755 -0.803910 2.651134 -2.057292 12.403310 4.741822 -2.486247 18.691319 6.296203 11.196002 12.656752 -17.367382 18.993441 -18.930382 -5.976078 -23.964989 -7.841374 -57.104824 -41.319092 14.021559 -37.124447 -66.126198 18.605885 -0.178738 -0.184126 0.643282 0.106015 0.376059 0.060735 3.962199 22.460783 -16.232822 64.023254 40.227348 15.564224 37.379642 45.102654 12.936171 -0.542611 -0.035657 -0.076470 0.050171 -0.193948 -0.428257 +16.194368 163.490112 -1.175920 -3.624690 -41.216553 6.610679 3.951601 -2.668632 -8.204784 -6.136802 0.959292 21.872089 -0.759114 0.302059 -0.286162 0.749270 0.468503 0.947720 -5.367487 4.698485 -20.130106 -5.477237 0.915694 21.989759 -0.486524 -0.122276 -0.012147 0.293463 -0.247265 0.428272 4.711639 -1.034817 1.278527 2.975082 -2.259655 11.942585 4.859623 -2.419474 16.898903 5.903854 10.808914 13.883596 -17.309713 18.336639 -21.036810 -9.521943 -23.761175 -7.978493 -58.523380 -37.839813 11.367652 -43.421028 -58.994205 19.311821 -0.106374 -0.233111 0.721655 0.024953 0.440136 0.040245 6.406395 20.762794 -15.469452 62.367306 35.865894 10.767262 36.992363 39.701912 10.647602 -0.516289 0.035127 -0.064840 0.058249 -0.200613 -0.446041 +17.006392 162.912994 -0.907528 -3.444241 -39.284695 6.231213 3.829916 -3.293027 -9.879519 -6.495755 1.058800 24.725649 -0.754982 0.269786 -0.300205 0.761945 0.459902 0.973735 -6.257490 5.073783 -22.343895 -4.398115 0.820258 26.873705 -0.512405 -0.067296 -0.024008 0.270396 -0.300231 0.423904 5.269894 -1.382351 3.423795 3.371609 -2.480225 11.244256 5.033272 -2.412079 14.893768 5.392836 10.416062 14.909293 -16.869602 17.628906 -21.772068 -13.232208 -23.038097 -7.981762 -59.119865 -34.393570 8.746590 -44.601337 -51.713383 16.603939 -0.047086 -0.256108 0.782542 -0.037219 0.482518 0.027068 8.527350 18.771461 -14.726421 60.229092 31.975515 6.909196 34.578453 34.544041 8.062260 -0.488524 0.075146 -0.055864 0.049817 -0.207906 -0.458777 +17.902313 162.423233 -0.567994 -3.033178 -37.391220 5.512206 3.491205 -3.902393 -11.113439 -7.162653 1.214173 27.127600 -0.736799 0.192764 -0.323251 0.797155 0.504792 0.995987 -7.372683 5.268885 -24.478722 -3.137982 0.572447 31.934090 -0.546745 0.001534 -0.033947 0.269889 -0.373712 0.403724 5.922967 -1.927678 5.699970 3.633477 -2.782386 10.548667 4.868347 -2.539112 13.010868 4.513954 10.171990 16.265821 -16.226355 16.539724 -22.917603 -16.698685 -22.427568 -7.556205 -58.835835 -30.670757 5.690525 -42.173485 -45.785538 12.677499 0.040073 -0.271519 0.830115 -0.117784 0.540528 0.023204 9.808117 17.575054 -14.134135 58.379482 28.969801 4.067314 29.634253 29.714815 5.257321 -0.451411 0.113266 -0.026746 0.047174 -0.232385 -0.454731 +18.721773 161.868317 -0.226671 -2.605163 -34.879635 4.914313 3.046903 -4.656746 -12.478355 -7.420127 1.229704 29.546038 -0.711239 0.147343 -0.340485 0.819170 0.524886 0.997773 -8.520115 5.253216 -26.768766 -1.726469 0.054987 37.355255 -0.565195 0.036468 -0.038888 0.254604 -0.418922 0.410910 6.409304 -2.403704 7.782810 4.125042 -3.133983 9.743608 5.192228 -2.774892 11.148511 3.403871 9.677570 16.816675 -15.659340 15.222878 -23.277140 -19.632877 -21.240931 -7.260473 -58.621105 -27.510284 3.479827 -38.387852 -40.804810 9.153694 0.092385 -0.254987 0.851352 -0.166824 0.572179 0.018582 11.254871 16.041977 -13.623103 55.768978 26.235464 1.782423 24.367012 25.221102 3.116332 -0.426772 0.129361 0.013673 0.023160 -0.238685 -0.443704 +19.430500 161.399658 0.177520 -2.288307 -32.851723 3.967691 2.703844 -5.153720 -12.850134 -7.953547 1.358947 31.270790 -0.698414 0.096963 -0.356549 0.842767 0.552246 1.014011 -9.148337 5.325193 -28.786930 -0.714273 -0.404600 42.586533 -0.586495 0.076122 -0.047146 0.252922 -0.472858 0.400619 6.646039 -2.618747 9.819848 4.734432 -3.355924 9.162924 5.695049 -2.914185 9.745563 2.512045 9.177427 17.574385 -15.744227 14.253150 -24.006432 -22.228968 -19.740435 -7.085320 -57.749424 -24.582052 1.439801 -33.931557 -37.110916 6.299410 0.149845 -0.256800 0.878182 -0.219157 0.608140 0.014143 11.863873 14.548391 -13.310349 53.104740 23.895857 0.100879 19.478428 20.854410 1.608147 -0.402387 0.146677 0.036676 0.013243 -0.255005 -0.442592 +20.126310 161.011841 0.608608 -2.327027 -31.099403 2.870206 2.381796 -5.580511 -12.723948 -7.934176 1.325979 32.989853 -0.682956 0.036722 -0.358770 0.881691 0.605609 1.028350 -9.303290 5.486425 -30.532761 0.284049 -0.945813 47.793709 -0.612889 0.124015 -0.041279 0.267501 -0.512159 0.376640 7.379470 -2.905293 12.060617 5.309377 -3.435803 8.629048 5.778666 -2.915177 8.375629 1.540879 9.073153 18.691069 -15.092113 13.284627 -24.736008 -24.357878 -18.819170 -7.070393 -56.475105 -22.000605 -0.157597 -28.633747 -33.075798 3.665793 0.219429 -0.273426 0.905945 -0.273052 0.647471 0.033284 12.367572 13.094316 -12.963645 50.282692 21.702820 -1.278263 14.900525 17.145065 0.587470 -0.380792 0.167063 0.053415 0.030504 -0.288669 -0.429528 +20.770863 160.438416 1.101381 -2.353167 -29.912111 2.007099 2.284309 -5.963962 -12.845187 -8.616246 1.596230 34.956253 -0.662806 0.018555 -0.351764 0.891663 0.608407 1.029204 -9.486059 5.699275 -32.877155 1.545682 -1.761310 53.238129 -0.618997 0.143367 -0.037511 0.258957 -0.522302 0.372144 8.280876 -3.290240 13.912273 5.570117 -3.449355 8.008027 5.474157 -2.846458 6.984489 0.930497 9.203594 19.336174 -14.435527 12.795671 -24.173891 -25.812794 -17.991150 -6.952791 -55.176247 -19.268736 -1.442510 -22.778328 -28.591728 1.386261 0.250855 -0.270604 0.914900 -0.295212 0.657831 0.044205 12.353775 11.632796 -12.436190 48.206047 19.478132 -2.272755 10.966945 13.694363 -0.035486 -0.363277 0.171000 0.063997 0.027674 -0.301951 -0.420339 +21.294569 160.090195 1.500493 -2.232178 -28.943707 0.841761 2.092714 -6.125780 -12.356762 -9.351002 1.912997 36.142456 -0.640044 0.001634 -0.345737 0.884866 0.605499 1.014645 -9.142975 6.126957 -34.794361 2.505933 -2.422399 58.017353 -0.620042 0.155452 -0.031153 0.244268 -0.522474 0.369844 8.508903 -3.401925 15.757234 5.904156 -3.489964 7.582520 5.495264 -2.837539 5.880509 0.753470 9.200855 19.965719 -14.059690 12.595991 -23.599268 -26.705629 -17.333450 -6.753673 -53.189896 -16.783232 -2.378613 -17.928053 -24.805099 0.007808 0.264654 -0.270058 0.912420 -0.303977 0.663224 0.049866 12.203951 10.515841 -11.840201 45.933983 17.428593 -3.132921 6.885266 10.672898 -0.437023 -0.349242 0.179733 0.075674 0.025631 -0.303132 -0.407394 +21.761662 159.815231 1.846341 -2.422344 -28.266836 -0.213680 2.384688 -6.169274 -11.725047 -10.250439 2.309789 37.179012 -0.627467 -0.005690 -0.338040 0.880146 0.605068 1.003250 -7.957209 6.755866 -36.335049 3.045662 -2.854320 61.451057 -0.617705 0.162732 -0.022512 0.238445 -0.515040 0.364330 8.803827 -3.590994 17.310053 6.248067 -3.532067 7.518818 5.570156 -2.840569 5.360534 0.445384 9.484275 20.050589 -13.868807 12.523541 -23.320898 -26.635658 -16.416365 -6.703548 -51.207039 -14.749820 -3.010349 -13.735137 -22.040749 -0.846930 0.269768 -0.274837 0.907647 -0.305382 0.662256 0.057052 11.624216 9.373830 -11.652646 43.596210 16.136440 -3.422815 3.609488 6.572214 -0.483453 -0.343426 0.186547 0.078617 0.033054 -0.304010 -0.397660 +22.320045 159.602982 2.181905 -2.126665 -27.469275 -1.782652 1.672478 -6.275284 -10.474031 -10.499490 2.396171 37.662640 -0.616860 -0.006900 -0.331650 0.866167 0.589540 0.986558 -6.976762 7.222673 -37.534420 3.723891 -3.344597 64.431877 -0.612402 0.168087 -0.021989 0.226652 -0.508166 0.360377 8.921383 -3.723997 18.985485 6.473265 -3.605864 7.640119 5.492465 -2.842886 5.004388 0.089600 9.669833 19.598154 -13.567339 12.329703 -23.242409 -25.870852 -15.735442 -6.393273 -48.581055 -12.837318 -3.493513 -10.766448 -20.503654 -1.264581 0.274474 -0.274216 0.906299 -0.309988 0.656384 0.056406 10.560067 8.299950 -10.998531 41.179836 14.527845 -3.715440 1.601997 4.220675 -0.388568 -0.334070 0.192388 0.077697 0.033594 -0.296959 -0.390957 +22.817327 159.465469 2.627353 -1.804563 -26.249460 -3.201733 1.116353 -6.438733 -9.327925 -11.025900 2.542485 38.049370 -0.599428 -0.002646 -0.316438 0.835593 0.562387 0.957062 -5.905601 7.413191 -38.674904 4.282881 -3.907092 66.977798 -0.596452 0.164580 -0.011475 0.207418 -0.485009 0.354803 8.979470 -4.108222 19.868603 6.578048 -3.876720 7.998407 5.497869 -3.045623 5.163596 0.085632 9.592309 18.688194 -13.585629 12.303694 -22.891462 -24.372791 -14.470881 -6.077526 -46.156403 -11.102891 -3.884527 -8.626238 -20.160210 -1.482221 0.262829 -0.275212 0.888902 -0.297416 0.638990 0.058311 8.526585 6.826194 -10.426429 39.768200 13.140475 -3.864841 0.097821 2.475348 -0.271209 -0.326864 0.197372 0.072966 0.037596 -0.285126 -0.379767 +23.303511 159.441849 3.254570 -1.679562 -25.187477 -4.569133 0.649584 -6.550749 -7.753493 -11.571621 2.644225 38.114288 -0.592167 0.009912 -0.298127 0.798294 0.518295 0.923493 -4.838246 7.452619 -39.132042 5.525730 -4.913861 67.985703 -0.577268 0.164719 0.003418 0.182496 -0.458970 0.342713 9.485059 -4.720131 20.373091 6.649680 -4.108967 8.430401 5.298298 -3.126735 5.475948 -0.369367 9.422765 17.998899 -13.810413 12.008615 -22.386843 -22.625044 -13.237387 -5.419275 -44.513908 -9.355874 -4.310347 -5.695478 -20.559711 -1.872646 0.254915 -0.291378 0.884264 -0.288041 0.616524 0.060628 5.596475 5.260001 -9.416073 38.917995 11.203755 -4.222831 -1.260209 1.850868 -0.182855 -0.323587 0.211240 0.056097 0.050000 -0.268056 -0.374050 +23.753942 159.401199 4.097319 -1.369306 -23.922575 -5.858514 -0.190446 -6.753480 -6.070091 -11.693400 2.536991 38.169586 -0.557929 0.006513 -0.270935 0.758018 0.478166 0.888748 -3.834711 7.193406 -38.980324 6.743868 -5.844870 67.739456 -0.553247 0.162813 0.015484 0.154361 -0.436303 0.327568 9.717808 -5.259652 20.589069 6.750438 -4.362711 8.765852 5.287862 -3.257515 5.691108 -0.638797 9.074290 16.874151 -13.886122 11.831811 -21.495819 -20.882048 -11.357428 -4.882822 -43.165756 -7.866342 -4.637118 -3.110697 -21.031797 -2.176273 0.252341 -0.285944 0.856838 -0.277880 0.590495 0.064064 2.777769 2.966269 -8.525648 37.869495 9.267689 -4.563337 -2.013566 1.638327 -0.114193 -0.302557 0.207712 0.050126 0.047238 -0.262352 -0.359875 +24.155758 159.387039 4.988288 -1.137395 -22.644058 -7.118357 -1.082106 -6.991593 -4.388474 -11.620667 2.315094 38.246460 -0.532350 0.017920 -0.240523 0.717990 0.433369 0.850833 -2.455350 6.906177 -38.022877 7.700905 -6.476032 66.191360 -0.531317 0.145299 0.032092 0.125703 -0.401843 0.325653 10.066670 -5.855882 20.784899 6.810965 -4.592896 9.141994 5.112583 -3.339120 5.909271 -0.483722 8.501899 15.326027 -14.102504 11.753889 -20.816017 -19.446186 -8.925656 -4.786551 -40.987446 -6.825021 -4.739176 -1.446009 -21.974779 -2.326929 0.237352 -0.275945 0.833284 -0.255058 0.561620 0.073958 0.253488 0.020324 -8.014013 36.687878 7.660507 -4.946275 -3.033747 1.922114 -0.093912 -0.294967 0.197615 0.040467 0.042407 -0.254279 -0.347579 +24.532532 159.492935 5.917622 -0.992732 -21.498859 -8.308155 -1.786819 -7.143144 -2.590635 -11.733212 2.163009 38.019768 -0.519135 0.048771 -0.215020 0.658370 0.361778 0.801031 -0.939768 6.676599 -36.849350 8.720360 -6.980497 63.667435 -0.492477 0.118114 0.043373 0.093474 -0.357561 0.316849 10.578384 -6.652063 20.656233 6.704151 -4.918283 9.545127 4.670345 -3.512694 6.248835 -0.448315 8.141277 13.875668 -14.265206 11.796906 -19.359398 -18.058964 -6.696718 -4.494890 -38.188206 -5.580476 -4.696716 -0.132041 -22.873039 -2.398786 0.206586 -0.267084 0.803434 -0.221894 0.511592 0.071381 -1.599140 -2.580541 -7.574400 34.919418 6.328996 -5.193836 -3.674332 2.580867 -0.105720 -0.292031 0.186116 0.016203 0.036365 -0.228462 -0.342831 +24.927576 159.545868 6.890191 -0.752424 -21.160147 -8.835504 -2.347541 -7.187489 -1.492656 -12.235509 2.264957 37.955757 -0.503667 0.091914 -0.188338 0.594650 0.287194 0.732210 0.554019 6.769032 -36.269821 9.701848 -7.221381 60.671131 -0.444765 0.072507 0.053694 0.061815 -0.293378 0.316138 11.295139 -7.161820 19.812965 6.449951 -4.914819 9.812726 4.141172 -3.409309 6.670527 -0.860671 8.030176 12.236598 -13.923474 11.581095 -17.174906 -16.058844 -4.218153 -4.399998 -36.286671 -4.918536 -4.433996 1.328168 -22.950310 -2.469236 0.162052 -0.240848 0.756723 -0.174511 0.445003 0.070721 -2.953982 -5.473418 -7.301291 32.532204 5.066698 -5.341957 -4.687658 3.692283 -0.162840 -0.294537 0.161614 -0.002857 0.025150 -0.192444 -0.327539 +25.360332 159.598389 7.853303 -0.353159 -20.863052 -9.418110 -3.112488 -7.195996 -0.515826 -13.038367 2.441380 37.689999 -0.484368 0.137768 -0.162546 0.551024 0.227875 0.671411 1.954434 6.754713 -35.222424 10.491559 -7.133895 56.510468 -0.412410 0.024120 0.058850 0.034093 -0.231056 0.333744 12.196878 -7.741111 18.814215 5.980557 -4.902232 10.083558 3.217443 -3.337538 7.153722 -1.428625 8.099026 10.856631 -13.217525 11.193367 -15.086435 -13.838768 -1.959012 -4.134923 -34.329456 -4.112505 -4.201969 3.111566 -23.294819 -2.650537 0.122979 -0.197190 0.715563 -0.132278 0.390529 0.080014 -4.444632 -7.952677 -6.987654 30.151312 4.023106 -5.303527 -5.204040 4.299339 -0.168203 -0.299081 0.128436 -0.007568 0.007292 -0.162349 -0.306927 +25.743879 159.766647 8.795291 0.199103 -20.652004 -10.102246 -3.920231 -7.163254 0.413223 -13.601293 2.549612 37.388134 -0.479359 0.173017 -0.138925 0.506357 0.178985 0.635593 3.299662 6.747756 -33.865356 10.635223 -6.604719 52.185276 -0.377644 -0.004087 0.068466 0.020086 -0.180425 0.324222 12.686689 -8.104976 17.675224 5.507959 -4.951399 10.508345 2.472768 -3.361330 7.983298 -1.240639 8.130158 10.004673 -13.038573 11.434473 -13.516266 -12.176252 -0.193220 -4.035262 -31.750566 -3.487419 -3.874991 4.649142 -23.136652 -2.723243 0.083046 -0.198047 0.680857 -0.091826 0.344003 0.080170 -5.660131 -9.944618 -6.737962 27.548159 3.247669 -5.119371 -5.767383 4.830956 -0.187820 -0.303476 0.116337 -0.032524 0.015164 -0.142871 -0.300761 +26.125280 160.239395 9.664731 0.776359 -20.831135 -11.147813 -4.575734 -6.881484 1.836203 -14.331759 2.726639 36.564987 -0.466982 0.169822 -0.129164 0.507544 0.193566 0.644823 4.656156 6.844425 -31.854317 10.507524 -5.794252 47.216835 -0.376880 -0.006475 0.070464 0.026580 -0.176622 0.324213 12.725271 -8.135523 16.651106 5.237010 -4.970528 11.373977 2.077701 -3.349981 9.513337 -1.168206 7.798651 9.570769 -13.808531 11.459855 -13.832242 -11.750551 0.569963 -4.130961 -28.771826 -3.039447 -3.619078 6.532375 -22.596296 -2.856187 0.070913 -0.202767 0.657517 -0.080359 0.345857 0.081775 -5.820331 -10.849893 -6.253922 23.705336 2.202748 -4.659867 -6.019753 5.628711 -0.206974 -0.299128 0.111720 -0.025288 0.022816 -0.151305 -0.293108 +26.510223 160.578262 10.631166 1.509543 -20.546747 -11.941781 -5.426848 -6.834595 2.596623 -15.080201 2.882154 36.342155 -0.439381 0.155297 -0.110472 0.509255 0.223222 0.627560 5.388550 6.478948 -30.098579 10.345504 -5.109653 42.165100 -0.369353 -0.014280 0.083978 0.039218 -0.152108 0.316187 13.148519 -8.472137 15.162544 4.605397 -5.061192 11.928950 1.169580 -3.510801 10.782343 -1.216235 7.744538 9.140695 -13.484951 11.285516 -13.437781 -10.701100 1.506507 -3.970622 -25.873207 -2.326818 -3.344156 8.325457 -22.733202 -3.012520 0.062421 -0.194426 0.615338 -0.062408 0.336520 0.100752 -5.866334 -11.664648 -5.973337 20.448063 1.453238 -4.190457 -6.813042 6.217705 -0.259349 -0.294202 0.098407 -0.013473 0.037498 -0.163875 -0.265679 +26.771172 160.777542 11.501239 2.507116 -20.461100 -12.670695 -6.273822 -6.805063 2.954646 -15.928895 3.128758 36.399998 -0.441079 0.147544 -0.116088 0.541775 0.265972 0.640284 6.203708 6.307174 -28.441244 9.863848 -4.286054 37.236328 -0.377128 -0.039560 0.084529 0.066705 -0.161141 0.329236 13.001389 -8.391287 13.406409 3.984993 -5.040024 12.439559 0.595321 -3.548923 12.278625 -1.044972 7.466175 9.051798 -13.864154 11.280949 -13.441063 -9.812380 2.114730 -3.989099 -22.634626 -2.013847 -2.904276 9.932492 -21.954315 -3.042250 0.063089 -0.161804 0.598456 -0.052110 0.341347 0.116681 -5.675417 -12.203488 -5.743667 17.233034 0.692959 -3.680873 -7.530044 6.283172 -0.283310 -0.306511 0.061624 0.001928 0.021749 -0.185621 -0.262076 +26.972334 160.862076 12.383259 3.415229 -20.432686 -13.422240 -6.531923 -6.755730 3.241849 -17.213652 3.600445 36.568054 -0.435094 0.140483 -0.127908 0.578140 0.304986 0.676491 7.103052 6.117584 -26.149174 9.459355 -3.466158 31.442125 -0.394230 -0.055242 0.070113 0.084411 -0.186495 0.356628 12.805659 -8.272581 11.670363 3.390185 -5.033550 12.947404 0.031338 -3.579120 13.775165 -0.679220 7.280112 9.481005 -14.451628 11.549043 -13.697821 -8.897223 2.924107 -3.860555 -19.323626 -1.382806 -2.470083 10.623823 -22.644186 -3.106488 0.062249 -0.127346 0.587278 -0.049843 0.361036 0.116726 -5.800202 -12.774473 -5.730629 14.982851 0.286638 -3.362186 -8.968638 6.913739 -0.391247 -0.306559 0.030014 0.030572 -0.008319 -0.206609 -0.264299 +27.158152 160.817322 13.273156 4.178040 -20.401508 -13.989384 -6.728358 -6.666316 3.472641 -18.435589 4.057239 36.627659 -0.448988 0.137338 -0.134323 0.594408 0.332478 0.676378 8.150285 5.966251 -24.118416 8.591938 -2.674802 26.335051 -0.393951 -0.066596 0.071292 0.109303 -0.185483 0.349733 13.017832 -8.322638 10.027901 2.739346 -5.033140 13.218043 -0.787431 -3.596462 14.859611 -0.958070 7.543903 9.780329 -14.447697 11.533258 -13.625312 -7.711068 3.614034 -3.627153 -16.468252 -0.666111 -1.985993 10.841960 -22.122223 -2.931691 0.062805 -0.121886 0.579755 -0.044828 0.356741 0.125079 -5.805629 -13.148984 -5.854373 12.717903 0.189523 -3.025524 -10.356219 6.965841 -0.462074 -0.319137 0.016402 0.027700 -0.001117 -0.213462 -0.262797 +27.321890 160.801422 14.255095 4.946043 -20.508833 -14.940403 -6.958041 -6.559960 4.086045 -19.648905 4.556996 36.886921 -0.450139 0.123199 -0.135574 0.624946 0.364964 0.705129 9.229939 5.678442 -21.447493 7.385245 -1.915828 21.160921 -0.405331 -0.058375 0.070062 0.129015 -0.203491 0.345481 12.976206 -8.243620 8.728724 2.239534 -5.024657 13.625073 -1.424046 -3.578228 15.948986 -0.981530 7.313973 10.527342 -14.422009 11.311280 -13.748481 -6.871079 3.704405 -3.267263 -13.163970 0.135595 -1.440503 10.389285 -20.049818 -2.452715 0.082419 -0.124207 0.584684 -0.056666 0.372598 0.134666 -6.183993 -13.081244 -5.309736 10.162413 -0.671082 -2.564939 -10.699128 7.353082 -0.487681 -0.316043 0.008306 0.032860 0.002225 -0.239125 -0.264070 +27.428707 160.531082 15.294714 5.703775 -20.256701 -15.519925 -7.196785 -6.545850 4.257950 -20.927525 5.093308 37.295616 -0.500497 0.140539 -0.153777 0.629641 0.370836 0.719907 10.193837 5.346374 -19.318495 5.769405 -1.305561 16.639442 -0.409684 -0.056625 0.063502 0.150821 -0.207580 0.335314 12.797185 -7.907486 6.964044 1.761632 -4.947074 13.856715 -1.827735 -3.432480 17.138826 -0.531857 6.803260 11.213492 -14.633528 11.101587 -14.468023 -6.005608 3.623890 -3.380766 -9.705785 -0.122615 -0.731042 8.637973 -16.405525 -1.742671 0.071445 -0.164527 0.611322 -0.056107 0.376654 0.122694 -6.471622 -13.350546 -4.653766 7.661216 -2.127180 -2.048133 -10.403763 7.991581 -0.476066 -0.341601 0.028269 0.006326 0.028966 -0.228808 -0.284350 +27.493876 159.986969 16.225090 6.505923 -19.816099 -15.792547 -7.225764 -6.594086 4.017480 -22.743587 5.930781 38.025814 -0.524168 0.152893 -0.170459 0.622984 0.364369 0.725636 10.931604 5.140923 -18.166302 4.152296 -0.897252 13.644516 -0.412881 -0.051382 0.050218 0.154105 -0.213325 0.335602 12.312098 -7.396590 5.260131 1.402020 -4.795534 13.713645 -1.886873 -3.237499 17.828917 -0.183519 6.420335 12.238024 -14.572721 10.980402 -14.632392 -4.635122 3.152243 -3.321966 -7.274454 -0.893738 -0.275724 7.121032 -12.048379 -1.200795 0.059367 -0.186750 0.625442 -0.057743 0.382362 0.104220 -7.011807 -13.445061 -3.798611 5.645732 -3.947573 -1.640895 -10.607961 8.770006 -0.469666 -0.349905 0.047000 -0.002222 0.037439 -0.211954 -0.295601 +27.532330 159.363861 17.213467 7.416900 -19.494242 -15.515124 -7.424826 -6.558841 3.373274 -24.341486 6.689623 38.389465 -0.518145 0.139356 -0.193565 0.633673 0.382409 0.753107 11.013094 4.972200 -17.876244 3.351829 -0.731983 11.951494 -0.425001 -0.057061 0.041721 0.149341 -0.245427 0.360881 11.158368 -6.683503 2.925661 1.058700 -4.698024 13.332677 -1.426903 -3.248408 18.659351 1.121216 5.317670 13.745837 -15.512632 11.424509 -14.613899 -3.754623 2.911975 -2.823275 -4.038575 -0.525182 0.325413 4.316759 -9.738640 -0.771512 0.044617 -0.172640 0.617361 -0.051132 0.405158 0.085168 -7.524969 -13.032667 -3.001089 3.638146 -5.289234 -1.164997 -10.563555 8.773877 -0.409337 -0.351947 0.042364 0.028888 0.005034 -0.213377 -0.305255 +27.695181 158.627518 18.155806 7.794327 -19.313000 -15.174962 -7.297858 -6.537753 2.950397 -25.697102 7.403965 38.881237 -0.492120 0.129246 -0.203287 0.633125 0.386721 0.770137 11.229336 5.004048 -17.991112 2.874230 -0.663293 11.619857 -0.424290 -0.073812 0.033037 0.137936 -0.267916 0.386499 11.414920 -6.510054 1.247990 0.610726 -4.569388 12.911345 -1.834156 -3.198718 18.979137 1.936558 4.535670 14.316800 -16.555805 11.890673 -14.008277 -3.470664 2.829899 -2.519805 -0.606102 -0.176974 0.854123 2.670272 -8.343901 -0.529685 0.027446 -0.140962 0.587086 -0.036035 0.413880 0.069573 -8.204558 -12.842981 -2.446150 1.981864 -6.081917 -0.724465 -10.856956 9.108917 -0.407645 -0.340807 0.019659 0.062113 -0.039142 -0.218698 -0.305900 +27.910583 157.872910 18.796307 7.579402 -19.323778 -15.490830 -6.361194 -6.463493 3.213246 -27.150126 8.325544 39.662460 -0.443766 0.083952 -0.203008 0.640009 0.397184 0.786582 11.456369 5.230164 -18.043110 3.342711 -0.729393 12.733683 -0.435465 -0.061484 0.028717 0.117925 -0.311334 0.396568 12.139112 -6.629135 1.241002 0.523028 -4.460130 12.709960 -2.277727 -3.122156 18.574244 2.059748 4.103112 14.764845 -17.487783 12.194468 -13.765767 -2.983247 2.301095 -1.975176 1.602722 0.192268 1.049478 1.480643 -6.219151 -0.375063 0.059949 -0.111983 0.576696 -0.056698 0.442031 0.069010 -10.012108 -12.408910 -1.667515 1.691757 -6.802887 -0.690436 -11.437198 9.514336 -0.399485 -0.303349 0.006077 0.098906 -0.081915 -0.244688 -0.298526 +28.256033 157.243652 19.202314 6.619047 -19.515514 -16.170013 -5.049762 -6.438457 3.994563 -27.722490 8.970179 40.695061 -0.414075 0.060881 -0.196965 0.645113 0.382013 0.812867 12.207331 5.730344 -17.998344 3.794617 -0.809540 14.557367 -0.448982 -0.036615 0.027127 0.086324 -0.347967 0.407241 13.207967 -6.881624 2.611502 1.062378 -4.369789 12.824994 -2.233368 -2.979116 17.863140 1.805662 3.666406 14.254072 -18.466263 12.003782 -14.364811 -3.470206 1.145984 -1.504568 3.472540 0.628361 1.088927 1.137852 -3.970195 -0.355941 0.093388 -0.105908 0.595226 -0.086336 0.467340 0.064301 -11.256709 -11.627702 -0.682971 0.497248 -8.147976 -0.546913 -12.174492 9.683573 -0.324828 -0.273249 0.012949 0.120209 -0.108675 -0.260369 -0.302822 +28.469486 156.712158 19.476837 5.936457 -19.291494 -16.510584 -4.314813 -6.596530 4.166833 -27.716173 9.325768 41.968533 -0.394559 0.036430 -0.196829 0.638981 0.376217 0.808760 12.360656 6.107997 -18.496819 4.488555 -0.965436 16.414574 -0.452255 -0.026597 0.027710 0.070869 -0.368298 0.406355 13.689814 -7.071288 3.664774 1.392390 -4.324204 12.869937 -2.131558 -2.953768 17.327047 1.898479 3.659154 13.519573 -18.857964 12.177397 -14.835176 -3.913601 0.263147 -0.987425 5.348692 1.344064 1.236656 0.650495 -2.797549 -0.337061 0.115479 -0.094630 0.600837 -0.102653 0.478225 0.063150 -11.445036 -10.924508 -0.109233 -0.463606 -9.095818 -0.408058 -12.674798 9.739704 -0.280264 -0.255049 0.013882 0.129564 -0.127421 -0.266965 -0.301590 +28.507732 156.328735 19.608248 5.877979 -19.275055 -16.642439 -4.231072 -6.563033 3.977530 -27.651634 9.639736 42.940331 -0.356939 0.009156 -0.193326 0.623640 0.366510 0.792632 11.944232 6.402825 -19.390488 5.223431 -1.148553 18.239754 -0.453429 -0.008864 0.037452 0.041037 -0.377324 0.410700 13.449501 -6.987158 4.385611 1.450511 -4.202438 12.782251 -2.048116 -2.894012 16.811174 2.206767 3.451781 13.570646 -18.901318 12.359043 -14.885515 -4.097636 -0.487771 -0.104574 6.466041 2.751614 1.433196 0.520889 -2.941653 -0.287135 0.128721 -0.085205 0.596147 -0.113573 0.490175 0.063327 -11.562263 -9.780145 0.505087 -0.402581 -9.572149 -0.456800 -12.212416 9.738600 -0.208238 -0.232805 0.028218 0.151654 -0.142755 -0.265534 -0.288885 +28.495174 156.061432 19.592438 5.501058 -19.350945 -16.332731 -3.837939 -6.523833 3.333602 -27.364178 9.856051 43.908699 -0.339580 -0.002777 -0.172045 0.606557 0.354069 0.763989 11.635836 6.679457 -20.195469 6.269488 -1.349541 19.030222 -0.451436 0.013829 0.061649 0.020584 -0.352534 0.395421 13.789616 -6.851826 5.068429 1.554950 -3.860307 12.644027 -2.129804 -2.590947 16.209314 1.986827 3.537918 13.261209 -18.228060 12.075634 -15.078617 -3.935500 -1.102296 0.624516 6.667927 3.518052 1.607352 0.009885 -3.920501 -0.230239 0.140701 -0.109313 0.604410 -0.120620 0.487589 0.079452 -11.419358 -8.933211 1.035986 -0.023178 -10.230865 -0.564252 -11.882740 10.352825 -0.206273 -0.225986 0.058319 0.145742 -0.114051 -0.260981 -0.272093 +28.516125 156.039536 19.465685 5.674904 -19.822447 -16.197651 -4.145495 -6.207398 2.875183 -27.154366 9.923443 44.033684 -0.346207 -0.009245 -0.169459 0.605458 0.361128 0.730350 11.433462 6.782385 -20.254290 6.450199 -1.295807 18.598076 -0.457899 0.031789 0.079264 0.020780 -0.336233 0.386858 13.316810 -6.445817 5.878270 1.711433 -3.542288 12.712184 -1.883802 -2.277228 15.895347 1.282376 3.780632 12.934625 -17.386822 11.335402 -16.010757 -3.421887 -1.236075 1.136385 5.349965 4.078175 1.609992 -0.275495 -5.253672 -0.200125 0.157189 -0.128348 0.626756 -0.135326 0.493070 0.098471 -11.274018 -8.355663 1.170930 0.794309 -9.959766 -0.767251 -11.134212 10.553237 -0.177398 -0.235596 0.088233 0.139320 -0.082620 -0.251042 -0.257743 +28.419094 156.204727 19.251654 5.892371 -19.963974 -15.925244 -4.408271 -5.949177 2.377213 -27.043991 9.973926 43.967609 -0.374413 0.006644 -0.166641 0.606943 0.355931 0.732649 11.376003 6.714146 -19.852692 6.347617 -1.127597 17.053879 -0.450238 0.036726 0.080054 0.035612 -0.323032 0.366030 12.463628 -5.909529 6.296504 1.896662 -3.284564 12.838424 -1.374429 -2.048463 15.925504 0.894400 4.254560 12.223474 -16.760063 11.133621 -16.480106 -3.083818 -0.701103 1.128502 3.556656 3.962779 1.557954 -0.022438 -7.912034 -0.173670 0.155078 -0.149009 0.639582 -0.137145 0.475649 0.095825 -10.680950 -8.496921 0.640541 1.857337 -8.790471 -0.998634 -11.055090 10.886378 -0.275493 -0.249577 0.095522 0.111265 -0.056308 -0.245438 -0.269083 +28.313145 156.535706 18.844357 6.165240 -20.005770 -15.635146 -4.529255 -5.598358 1.993390 -27.011898 9.929109 43.251141 -0.386259 0.027305 -0.175337 0.592773 0.337767 0.726744 11.544346 6.617626 -19.253981 5.727003 -0.878350 15.151564 -0.439691 0.025442 0.068230 0.032976 -0.316646 0.370999 10.791121 -5.186068 6.735569 2.329285 -3.194785 13.007287 -0.173148 -1.983963 16.022852 0.677495 4.371609 11.771368 -16.974062 11.088167 -16.466160 -2.745077 0.247081 1.107432 0.963121 4.017067 1.385157 -0.171500 -12.009102 -0.173802 0.132109 -0.144011 0.630670 -0.126670 0.459860 0.076396 -10.462401 -8.816373 0.005802 3.416561 -7.173996 -1.271380 -11.018720 12.153153 -0.479636 -0.255963 0.094012 0.107897 -0.061731 -0.223382 -0.275463 +28.334148 156.812119 18.526560 6.289305 -19.746407 -14.884016 -4.902536 -5.495458 1.099663 -26.763027 9.758233 42.975407 -0.415889 0.059626 -0.185210 0.583701 0.324088 0.717177 11.583754 6.413103 -19.225742 5.001235 -0.703977 13.211629 -0.418526 -0.003871 0.055076 0.049219 -0.298876 0.367174 10.197975 -5.057222 6.696467 2.248960 -3.233037 12.986701 0.029809 -2.038419 16.098520 0.279523 4.780741 10.948934 -16.759459 11.051241 -15.972192 -2.211918 2.186041 0.787180 -2.457603 4.425470 0.989875 0.640502 -19.069113 -0.399566 0.102359 -0.130607 0.614572 -0.105141 0.424362 0.059924 -10.418701 -9.652276 -1.245412 5.683992 -4.246824 -1.551325 -10.165564 12.994842 -0.655952 -0.275387 0.073272 0.089560 -0.064554 -0.202645 -0.286362 +28.281919 157.144897 18.168497 6.217362 -19.357489 -14.474430 -4.849624 -5.331503 0.930427 -26.812569 9.613960 42.313641 -0.403308 0.078879 -0.146240 0.557345 0.301291 0.677366 12.044024 6.111474 -18.542292 3.879405 -0.524048 11.047929 -0.394174 -0.001332 0.083649 0.044970 -0.240997 0.340116 9.875425 -5.108322 7.570101 2.444498 -3.287029 12.839657 0.196800 -2.030328 15.280421 -0.938392 5.296642 10.237026 -16.154505 10.578448 -14.960071 -1.530023 3.556155 0.491242 -7.524105 4.169093 0.007737 1.661104 -24.897514 -0.924328 0.090254 -0.158742 0.591527 -0.085258 0.390342 0.085933 -10.930408 -10.264109 -2.102443 8.866497 -2.155239 -2.066560 -9.462255 14.177317 -0.841838 -0.276961 0.084889 0.064382 -0.016323 -0.197072 -0.263368 +28.145256 157.478989 17.888103 6.438879 -18.983433 -13.634878 -4.996562 -5.069914 0.448505 -26.976662 9.485672 41.312210 -0.422910 0.093854 -0.131487 0.555352 0.289601 0.655290 12.217135 5.817385 -18.419966 2.987233 -0.421200 9.006659 -0.382674 0.009685 0.098585 0.053556 -0.210113 0.311102 9.557613 -4.999937 7.469336 2.257371 -3.230847 12.454625 0.070070 -1.940069 14.706028 -2.111923 5.587919 10.418703 -14.805476 9.686121 -14.442270 -0.763843 4.530457 0.527368 -12.203588 4.299384 -0.972285 1.466293 -30.320681 -1.396747 0.101831 -0.185206 0.606704 -0.091391 0.366431 0.102442 -10.523526 -10.248473 -2.707335 11.884771 -0.730212 -2.555654 -8.184539 15.410304 -0.957671 -0.289411 0.099144 0.033561 0.024572 -0.191287 -0.259780 +27.987555 157.757355 17.597153 6.590900 -18.473894 -13.192081 -4.916700 -4.718124 0.624047 -27.230591 9.335514 40.014912 -0.463780 0.120630 -0.126881 0.559995 0.275832 0.629370 12.542315 5.505054 -17.914700 1.989046 -0.353302 7.205283 -0.378806 0.028358 0.094119 0.070591 -0.179430 0.281900 9.933933 -5.209037 7.816594 1.871777 -3.203335 12.190755 -0.783658 -1.798967 14.023971 -4.328123 6.556165 10.329533 -12.491396 8.176528 -14.687619 0.190274 5.511032 0.480901 -17.630054 4.033924 -2.144210 1.617397 -34.709877 -2.087683 0.127531 -0.214165 0.647752 -0.118627 0.345093 0.113497 -9.684559 -10.317213 -3.567543 15.014855 0.938921 -3.019521 -6.052627 15.941678 -0.893611 -0.301818 0.122427 -0.007204 0.074227 -0.173948 -0.257328 +27.929296 157.955902 17.287289 6.486798 -17.915457 -12.626208 -4.511978 -4.278030 0.804780 -28.024992 9.420947 38.596401 -0.489453 0.129820 -0.129154 0.568080 0.276546 0.608589 12.735289 5.294944 -17.750332 1.437603 -0.335111 5.804255 -0.367318 0.039235 0.085673 0.091633 -0.162829 0.251417 11.098965 -5.663876 8.365790 1.353060 -3.084488 11.893389 -2.159447 -1.653312 13.226781 -6.287505 7.422965 9.465563 -10.485162 6.895879 -15.016730 0.474856 6.809224 0.156094 -21.475296 3.574103 -2.908965 -1.135661 -38.719398 -1.769933 0.151326 -0.214316 0.661112 -0.142134 0.318277 0.116235 -8.335995 -10.673432 -4.835954 18.136326 2.821139 -3.338707 -3.690794 15.674169 -0.742449 -0.306081 0.125532 -0.031618 0.102438 -0.162563 -0.253174 +27.820786 158.063278 16.915325 6.496053 -16.799917 -11.761994 -4.164052 -3.978837 0.356744 -28.888428 9.588257 37.660709 -0.507119 0.134476 -0.129004 0.585881 0.290950 0.600550 12.797791 5.124864 -18.132662 0.542473 -0.328995 4.499585 -0.364432 0.034018 0.084952 0.113231 -0.155069 0.239447 11.851890 -5.916537 8.227574 0.933982 -2.980747 11.454706 -3.032334 -1.553424 12.648370 -7.550700 7.497711 8.998584 -9.774533 5.935246 -15.131180 -0.501927 8.176579 -0.420931 -24.914446 3.240446 -3.683295 -4.279117 -43.584110 -1.103521 0.167474 -0.206179 0.665795 -0.151180 0.304746 0.128596 -6.558388 -10.994789 -6.181376 21.090391 4.318823 -3.659433 -1.781320 14.683353 -0.619247 -0.315897 0.113235 -0.041881 0.115313 -0.166165 -0.249075 +27.651077 157.989929 16.520098 6.606724 -15.515498 -10.761499 -3.912666 -3.663511 -0.209434 -29.450039 9.703647 36.938599 -0.506894 0.146098 -0.118172 0.594446 0.297968 0.570985 12.580979 5.085282 -19.097672 -0.048135 -0.347027 3.694326 -0.359252 0.020107 0.094678 0.123812 -0.125763 0.240416 12.546407 -6.086960 7.963864 0.383093 -2.807762 10.893657 -4.044005 -1.429007 11.900754 -8.525380 7.479922 8.555558 -8.612842 4.936915 -14.725146 -1.606824 9.750141 -0.882209 -28.435911 3.098134 -4.524391 -8.374520 -49.044765 0.252092 0.171887 -0.186432 0.657627 -0.146265 0.287062 0.154063 -4.515014 -11.329265 -7.604988 24.580059 5.540813 -4.107621 -0.214454 13.408257 -0.554438 -0.327152 0.098074 -0.043467 0.125894 -0.165557 -0.230575 +27.509054 157.929886 16.061840 6.846951 -13.412206 -9.996031 -4.205574 -3.688550 -0.661251 -29.383148 9.554474 36.704128 -0.507193 0.167680 -0.100546 0.564406 0.262201 0.536705 11.579796 4.791521 -20.036314 -0.129270 -0.401878 2.908229 -0.329231 0.016390 0.100761 0.116940 -0.087856 0.215536 12.808699 -6.272559 7.860372 0.026687 -2.846469 10.349310 -4.609389 -1.489342 11.069439 -9.777775 7.490836 8.138124 -7.942896 4.006900 -13.645101 -3.247888 10.604901 -1.366510 -31.971022 2.656558 -5.334971 -14.056494 -52.754684 2.650846 0.162624 -0.198499 0.638849 -0.135547 0.247199 0.154897 -2.040987 -11.456670 -8.653467 27.142281 6.240992 -4.321498 2.422256 12.260751 -0.365779 -0.323963 0.101538 -0.066962 0.149150 -0.147834 -0.219480 +27.358770 157.782593 15.496133 6.788787 -11.134368 -9.614805 -4.261551 -3.814380 -0.808450 -29.310335 9.510910 36.974522 -0.521859 0.191249 -0.089561 0.559006 0.239795 0.532668 10.937528 4.572268 -20.635897 -0.337695 -0.445414 2.217181 -0.320929 0.033838 0.105267 0.112757 -0.065382 0.201044 12.753426 -6.405128 8.169694 0.008934 -2.971954 10.075360 -4.622120 -1.569485 10.458385 -11.021444 7.419281 7.895995 -7.173454 2.898945 -13.991714 -5.389252 10.770049 -1.971978 -35.751251 2.154402 -6.323444 -20.101421 -55.027874 5.328976 0.164766 -0.227667 0.653576 -0.144029 0.232152 0.155477 0.690645 -10.992711 -9.553598 29.057413 6.800388 -4.482231 4.684982 10.646732 -0.206501 -0.327411 0.125222 -0.086834 0.182883 -0.135296 -0.218393 +27.256611 157.571075 14.938485 6.907387 -8.808911 -9.017999 -4.747157 -3.956686 -1.112989 -28.830578 9.288108 37.203205 -0.538541 0.209651 -0.081172 0.552664 0.231140 0.507164 9.714401 4.300671 -21.690802 -0.050915 -0.481154 1.758110 -0.307726 0.027059 0.108730 0.124085 -0.035511 0.183618 12.783366 -6.612916 7.836720 -0.255752 -3.141009 9.813004 -4.893421 -1.766727 10.150003 -11.858894 7.526943 7.324223 -6.254012 2.068009 -13.801638 -8.428396 10.003999 -2.483597 -38.703457 2.293346 -7.564543 -24.192644 -55.855354 6.923777 0.164581 -0.233411 0.651674 -0.140658 0.206786 0.166690 4.469385 -9.501974 -10.452719 30.442530 7.312328 -4.552038 6.268474 8.732052 -0.183151 -0.337578 0.123945 -0.109508 0.208811 -0.125698 -0.210384 +27.127756 157.316086 14.274278 6.775599 -6.507912 -8.862823 -5.171206 -4.089110 -0.955636 -27.720991 8.876371 37.626236 -0.534073 0.188696 -0.087676 0.576613 0.266977 0.499557 8.937410 4.127944 -22.383862 -0.121529 -0.483163 1.646141 -0.317544 0.032691 0.104554 0.141972 -0.041325 0.181035 13.116732 -6.870962 8.310552 -0.555759 -3.112181 9.578821 -5.486259 -1.838255 9.563967 -12.046547 7.589824 7.081832 -4.907162 1.466473 -14.496325 -11.639562 8.751147 -3.462270 -40.203728 1.616122 -8.190225 -28.786757 -54.461182 8.540463 0.188206 -0.211507 0.652425 -0.158670 0.213600 0.177908 7.835373 -8.014629 -11.214699 32.668186 7.632522 -4.768003 7.094429 6.933567 -0.238031 -0.336093 0.115624 -0.096245 0.208993 -0.134662 -0.197264 +26.811459 157.055984 13.589232 6.633000 -3.379308 -8.963644 -5.359104 -4.458471 -0.615360 -26.219837 8.311506 38.355980 -0.506872 0.168480 -0.082647 0.590854 0.280681 0.504045 7.685139 3.786134 -22.846666 0.119188 -0.486873 1.514526 -0.322953 0.044360 0.106106 0.138804 -0.051946 0.183437 12.830571 -6.839167 9.189353 -0.610072 -2.988507 9.075729 -5.569285 -1.865801 8.469414 -11.673670 6.729028 7.838302 -3.860596 0.691865 -14.111486 -15.080119 6.766972 -4.574650 -40.491974 0.356427 -8.174877 -32.617580 -51.536537 9.515482 0.209653 -0.193560 0.646073 -0.172186 0.223482 0.187531 11.314700 -6.320184 -11.282820 35.187767 6.961077 -5.255075 6.964103 5.145133 -0.332704 -0.320729 0.107729 -0.076074 0.196459 -0.151824 -0.186032 +26.506559 156.778824 12.884620 6.195649 0.476792 -9.144032 -5.695021 -5.174690 -0.457100 -23.786228 7.350578 39.803192 -0.489150 0.136968 -0.103485 0.598728 0.284289 0.520162 6.428799 3.452326 -23.384386 -0.012477 -0.509746 1.821608 -0.340038 0.060420 0.093679 0.120103 -0.100616 0.200337 12.191336 -6.764834 10.340174 -0.289334 -3.037114 8.305818 -4.977554 -1.994376 6.976995 -10.789354 5.058816 9.340853 -3.860896 0.062813 -14.103300 -18.551046 4.631237 -5.555517 -41.698776 -1.277525 -8.032069 -33.229149 -48.064198 8.790215 0.235023 -0.176267 0.662087 -0.198794 0.255394 0.172102 13.340326 -4.712874 -10.690874 38.376675 6.124826 -5.813799 6.899889 3.997362 -0.349236 -0.303472 0.111973 -0.044822 0.156026 -0.157777 -0.192411 +26.112862 156.503250 12.168968 5.889039 4.027993 -9.381686 -6.177385 -5.733287 -0.360138 -21.145191 6.346475 41.281322 -0.480794 0.095810 -0.136325 0.635769 0.326584 0.544057 4.886581 3.243263 -24.132982 0.126773 -0.492946 3.124017 -0.375925 0.076931 0.074487 0.122696 -0.157869 0.226612 11.215116 -6.394166 11.346626 0.031668 -2.962643 7.721260 -4.228791 -2.005972 5.892842 -9.931376 3.643891 10.932244 -3.249624 -0.614939 -15.026593 -21.152819 3.001294 -6.619433 -43.263359 -3.333680 -7.552732 -34.165466 -44.198189 8.164322 0.272759 -0.146938 0.689683 -0.236841 0.305170 0.166074 15.491241 -3.360891 -10.549704 41.642200 5.898207 -6.354410 6.035789 3.544833 -0.377619 -0.293818 0.111690 -0.003321 0.117389 -0.172473 -0.194160 +25.682352 156.340729 11.418087 5.790192 7.748963 -9.290643 -6.843565 -6.347860 -0.874907 -18.338005 5.277672 42.960579 -0.489328 0.076215 -0.158331 0.639729 0.330039 0.571174 2.649520 2.890831 -25.126398 0.867230 -0.512140 4.613028 -0.392325 0.101840 0.069029 0.113425 -0.197171 0.230841 9.274328 -5.609239 11.931591 0.496533 -2.974296 7.063812 -2.776736 -2.062853 4.870038 -8.351538 1.289216 12.945567 -3.259971 -1.269555 -15.253655 -23.412178 1.997335 -7.498384 -45.566925 -5.403112 -6.880269 -35.154152 -40.903614 7.734395 0.283502 -0.174639 0.719710 -0.255564 0.339071 0.146662 16.905842 -1.801016 -10.186190 44.908562 6.075357 -6.669163 5.625559 3.377562 -0.373105 -0.292405 0.140568 0.005154 0.108520 -0.175083 -0.211244 +25.267401 156.330109 10.413910 5.444503 11.091393 -9.337664 -7.292743 -6.890935 -1.679170 -15.633410 4.239280 44.620853 -0.524525 0.069692 -0.180778 0.666439 0.346769 0.626465 0.377726 2.727043 -26.340738 2.068004 -0.556169 6.900183 -0.418630 0.133603 0.057653 0.124755 -0.241335 0.229123 7.783958 -4.982745 12.536944 1.037389 -3.030974 6.807705 -1.400781 -2.109975 4.427903 -7.269387 -0.934046 14.430367 -3.465406 -2.017185 -16.500044 -25.518169 0.690638 -8.085207 -47.981094 -7.350722 -6.314770 -36.430801 -39.605522 7.813423 0.300733 -0.217047 0.768918 -0.284452 0.377752 0.130339 18.112000 0.683629 -9.987900 47.187668 7.177171 -6.534894 5.841741 3.755847 -0.366709 -0.301735 0.171345 -0.001595 0.120323 -0.185919 -0.240601 +24.757339 156.462357 9.398056 5.140917 14.700566 -9.257553 -7.617283 -7.396221 -2.665056 -12.831518 3.093703 45.989662 -0.561137 0.056750 -0.205102 0.685723 0.363207 0.669600 -2.078820 2.491378 -27.523489 3.325748 -0.667084 9.491775 -0.435423 0.166990 0.052831 0.137159 -0.282085 0.215167 6.187521 -4.564235 12.958233 1.452019 -3.341072 6.580101 -0.106627 -2.414554 4.067213 -6.466203 -3.041080 15.888473 -3.680738 -2.808351 -17.588573 -27.122450 -0.889863 -7.959660 -50.138367 -8.858303 -5.839655 -38.189217 -39.620178 8.375214 0.317559 -0.266440 0.812265 -0.311224 0.407679 0.111665 19.045721 4.053458 -9.486546 49.144295 8.513583 -6.285137 6.160067 5.144678 -0.403840 -0.312525 0.207287 -0.012288 0.138114 -0.192091 -0.268036 +24.252823 156.548935 8.511737 4.674037 17.894131 -9.122764 -7.568373 -7.568077 -3.641251 -10.455710 2.214752 46.878716 -0.568833 0.022832 -0.221989 0.727509 0.419270 0.704310 -4.612614 2.401094 -28.861809 5.347660 -0.924410 12.816666 -0.461351 0.185382 0.046128 0.164893 -0.319433 0.213177 5.360588 -4.290269 12.378952 1.442705 -3.491658 6.765563 0.463507 -2.665859 4.571858 -5.536810 -4.904373 16.657133 -3.049927 -3.569868 -18.673468 -27.262775 -2.064705 -7.615417 -52.433380 -10.924396 -5.001574 -41.596893 -41.422283 10.258605 0.345629 -0.269561 0.830347 -0.336001 0.442730 0.115190 18.869480 7.188067 -9.061037 51.782959 10.265279 -6.012962 6.841997 8.344935 -0.568907 -0.315193 0.208405 0.002023 0.138439 -0.219836 -0.272929 +23.750124 156.894760 7.657303 4.352764 20.701208 -9.514061 -7.624806 -7.507493 -3.916563 -8.307099 1.435458 47.252907 -0.589037 -0.003764 -0.241422 0.780072 0.490548 0.729637 -7.280618 2.358363 -29.561993 7.891869 -1.388176 16.730862 -0.491534 0.211425 0.040546 0.206172 -0.341295 0.207593 4.675524 -3.995425 12.212840 1.493172 -3.606462 7.209406 0.835801 -2.859912 5.356023 -5.429156 -6.063474 17.707420 -1.559872 -4.580997 -20.432966 -27.186787 -4.661180 -7.050848 -54.059475 -13.224689 -4.012879 -44.873283 -43.280090 12.223423 0.376182 -0.283724 0.857334 -0.366426 0.477827 0.126877 19.185154 11.218606 -8.611263 52.720711 12.296453 -5.495497 7.627233 11.524870 -0.680140 -0.326706 0.222715 0.012090 0.163704 -0.240877 -0.268886 +23.076286 157.396027 6.736727 3.902190 23.131449 -9.817772 -7.091005 -7.263295 -4.586116 -6.470473 0.922654 47.406464 -0.599875 -0.023277 -0.252923 0.834138 0.569557 0.739246 -9.796522 2.663103 -30.255285 11.229040 -2.094781 20.610754 -0.515379 0.210846 0.036121 0.254810 -0.345627 0.209716 4.079899 -3.611621 11.961162 1.617828 -3.604820 7.787615 1.232804 -2.995565 6.384168 -5.370366 -7.014481 18.022215 -0.329715 -5.486229 -21.524443 -26.786692 -7.744493 -6.469048 -54.614410 -15.926503 -2.720302 -48.847843 -46.338074 15.293496 0.394347 -0.268519 0.855962 -0.377946 0.496745 0.150311 19.520689 15.817826 -8.554372 52.306324 15.267834 -4.242362 8.479193 13.175737 -0.634887 -0.342827 0.207970 0.029750 0.180711 -0.262620 -0.252554 +22.342482 158.155441 5.738756 3.340364 24.986353 -10.399273 -6.553118 -6.700752 -4.828434 -4.284128 0.304712 46.842049 -0.611254 -0.041784 -0.260557 0.896812 0.650461 0.749104 -11.787798 3.423436 -30.931515 14.524968 -3.007082 24.950720 -0.535138 0.217434 0.034414 0.308262 -0.345590 0.203098 4.307357 -3.246231 11.763131 1.693547 -3.355433 8.567758 1.115697 -2.875676 7.686456 -6.087947 -7.601295 18.446281 1.503665 -6.731266 -22.879425 -25.852041 -11.266815 -5.984095 -54.646667 -19.303923 -1.083377 -51.974373 -50.511169 18.938475 0.426271 -0.253215 0.858091 -0.398647 0.509887 0.180783 19.293089 20.227831 -8.606131 51.271729 18.473427 -3.167467 8.610084 15.805938 -0.696701 -0.355118 0.193019 0.043103 0.205915 -0.289462 -0.232204 +21.487509 159.118042 4.886203 2.574727 26.411364 -11.249447 -5.704976 -5.767097 -4.465809 -2.047333 -0.226933 45.554066 -0.629889 -0.041481 -0.267808 0.928224 0.700160 0.729131 -13.002821 4.720261 -31.158447 17.416796 -3.973168 29.132910 -0.546667 0.215335 0.031523 0.347864 -0.326138 0.198373 4.755208 -2.895724 11.626527 1.745035 -3.077947 9.427836 0.749930 -2.676699 9.038092 -6.702932 -8.187261 18.972996 3.247222 -7.902697 -23.919952 -24.892681 -14.792261 -5.269094 -53.935734 -22.475761 0.428190 -56.237373 -56.129036 24.449215 0.439075 -0.247233 0.860718 -0.407486 0.511458 0.205393 18.506235 24.502462 -8.734241 49.908413 21.849981 -2.127067 8.686869 18.662460 -0.728739 -0.373203 0.189986 0.043915 0.237030 -0.290892 -0.210483 +20.714626 160.259537 4.110352 1.084065 27.862707 -12.237287 -4.531384 -4.959218 -3.949564 0.621185 -1.050939 43.435452 -0.648016 -0.027089 -0.265759 0.939690 0.720619 0.711155 -13.544262 6.035306 -31.078773 20.601147 -5.201355 32.541603 -0.543211 0.211734 0.033525 0.373458 -0.297999 0.187902 6.174717 -2.997992 11.238691 1.889531 -2.923465 10.237421 0.114070 -2.531337 10.361115 -7.205350 -8.818517 19.124388 4.377102 -8.996162 -24.557495 -24.104315 -18.352659 -4.705760 -52.976940 -25.857395 2.054389 -57.892948 -61.063164 28.683056 0.436944 -0.255652 0.855481 -0.404871 0.498203 0.220227 16.802036 27.978418 -9.021023 48.240959 24.988777 -1.289507 9.076638 22.529875 -0.701426 -0.388458 0.192115 0.033908 0.271387 -0.285011 -0.195005 +19.973467 161.286697 3.467018 -0.157658 29.672157 -12.791768 -3.645278 -4.357064 -3.632952 3.092369 -1.792673 41.157894 -0.685380 0.008217 -0.269988 0.936455 0.717409 0.690593 -14.261652 6.967924 -31.090961 23.464724 -6.652688 35.937088 -0.528016 0.192493 0.031125 0.397189 -0.264269 0.176891 7.117581 -3.085521 10.249029 1.881544 -2.924058 11.022483 -0.383868 -2.526937 11.900953 -6.970782 -9.615442 18.835859 5.266111 -9.773144 -24.735203 -22.032505 -21.499079 -4.712995 -52.627575 -29.853632 4.281100 -56.841473 -64.996628 30.823324 0.415342 -0.263186 0.850021 -0.388351 0.468042 0.222964 13.979361 30.389048 -9.677240 46.967880 28.108070 -0.523525 8.869577 27.491089 -0.840880 -0.415441 0.188452 0.007703 0.299879 -0.265162 -0.194290 +19.270384 162.365479 2.924788 -0.737231 31.760529 -12.884562 -3.408679 -4.051496 -3.396710 4.978698 -2.371037 38.835121 -0.706923 0.073935 -0.256831 0.914537 0.678078 0.667553 -15.058596 7.311622 -30.568090 25.421272 -8.025341 38.849129 -0.507950 0.165078 0.029166 0.395852 -0.206473 0.188079 7.443910 -3.043360 9.057798 1.799011 -2.997092 11.672008 -0.711227 -2.571478 13.298458 -6.665573 -10.362669 18.288492 6.055379 -10.549313 -24.359921 -19.468855 -24.336796 -4.853502 -52.497917 -34.061764 6.764423 -51.246044 -68.780975 29.489822 0.370312 -0.269720 0.836988 -0.354585 0.431586 0.225656 11.452595 31.989756 -10.172949 45.385487 30.810452 0.092491 8.423731 32.605316 -1.004074 -0.435630 0.186024 -0.016336 0.323025 -0.235989 -0.187823 +18.489204 163.473816 2.426389 -1.132650 33.618259 -12.843373 -3.003345 -3.686340 -2.951400 6.131579 -2.600552 35.830009 -0.709885 0.099541 -0.249105 0.891214 0.668219 0.617282 -15.390014 7.580908 -29.836866 26.334887 -9.080176 41.527023 -0.483952 0.135351 0.037219 0.401409 -0.156557 0.187774 7.727562 -2.955788 7.902610 1.562106 -2.933486 12.376259 -1.237518 -2.519610 14.772305 -6.146260 -11.046305 17.343742 7.078821 -11.191075 -24.219412 -16.798454 -26.725185 -5.159769 -51.688663 -38.204365 8.997954 -40.547810 -72.454163 23.877092 0.336436 -0.258022 0.802829 -0.321951 0.394577 0.233161 9.020132 33.083729 -10.574512 43.823509 33.360817 0.529452 6.874249 38.518837 -1.641460 -0.452358 0.175818 -0.024151 0.337114 -0.211633 -0.166974 +17.818249 164.549911 1.987082 -1.669462 35.966488 -12.863760 -2.559472 -3.487328 -2.332265 7.178030 -2.834816 32.471252 -0.729256 0.151028 -0.219987 0.872741 0.654954 0.570624 -15.867421 7.378201 -28.716722 27.359146 -10.412948 44.096806 -0.458428 0.106448 0.054889 0.420764 -0.077641 0.173900 8.401584 -3.092587 6.181583 1.264567 -2.992383 13.212544 -1.919180 -2.575034 16.747463 -5.791980 -11.739221 16.280205 8.157859 -12.109204 -24.015450 -13.222481 -28.496101 -6.037446 -50.733482 -42.651997 11.294716 -21.121883 -74.588760 10.186108 0.298478 -0.274024 0.774145 -0.282015 0.346651 0.261231 5.780999 33.472885 -11.349483 42.253662 36.111099 1.044659 2.876709 43.645061 -3.439074 -0.480661 0.169581 -0.058964 0.391435 -0.193450 -0.144480 +17.118929 165.492126 1.560435 -2.363856 37.232601 -12.555926 -1.380674 -3.145419 -2.132905 7.019211 -2.561817 29.061306 -0.742413 0.212739 -0.198082 0.839089 0.621893 0.506912 -15.523519 7.535924 -28.395220 27.470814 -11.503848 47.098637 -0.416069 0.047610 0.066194 0.429589 0.000715 0.174507 9.755501 -3.024456 4.374388 0.919355 -2.623699 13.767676 -2.787028 -2.188471 18.505575 -5.478118 -12.435144 14.685334 8.432644 -13.261312 -22.895044 -9.676352 -29.617075 -6.837114 -50.237061 -46.967857 13.555501 4.105612 -73.626404 -8.817780 0.243427 -0.254196 0.719400 -0.225253 0.277913 0.276940 2.239951 33.225170 -11.838243 40.831387 38.575310 1.665223 -2.832540 49.904495 -6.576490 -0.509175 0.137014 -0.081751 0.411589 -0.160528 -0.121352 +16.425905 166.335007 1.199889 -2.609052 38.426685 -12.076783 -0.686929 -2.750493 -1.495627 7.254966 -2.379292 25.025646 -0.774158 0.270261 -0.177352 0.809937 0.595219 0.464178 -15.145264 7.698559 -27.491161 26.864889 -12.157074 49.959770 -0.376674 0.006841 0.076937 0.449703 0.068978 0.154006 10.270957 -2.727148 2.926963 0.814813 -2.322742 14.248929 -3.079625 -1.842541 20.066139 -5.208372 -13.197989 13.085619 8.233158 -14.254351 -22.296799 -6.165112 -30.107103 -7.931626 -49.386536 -51.513702 15.947107 21.838621 -69.800568 -20.796450 0.196388 -0.268825 0.680208 -0.179166 0.215795 0.287396 -1.146971 32.630714 -12.537682 37.888630 41.263901 2.404889 -8.778207 53.905449 -9.855884 -0.538860 0.121953 -0.123116 0.456289 -0.134009 -0.110284 +15.823487 166.939453 0.957338 -2.458194 39.096638 -11.085819 -0.113667 -2.426255 -1.043060 6.853725 -2.088103 21.353891 -0.770172 0.309080 -0.140322 0.811535 0.612144 0.411920 -14.523732 7.664659 -26.699749 25.181278 -12.337781 53.073620 -0.342226 -0.054531 0.096298 0.486188 0.147364 0.144993 10.486082 -2.210652 1.133899 0.656766 -1.770930 14.519561 -3.172300 -1.319613 21.613180 -4.837639 -13.836258 11.312216 8.424127 -15.531708 -21.024355 -2.186809 -29.764450 -9.434537 -49.840656 -55.719635 18.427782 30.441025 -62.633739 -24.320833 0.162637 -0.231475 0.604523 -0.125768 0.150358 0.331688 -4.162244 31.209024 -12.945097 34.833958 43.420773 3.052536 -16.312780 57.293392 -14.431362 -0.562502 0.061849 -0.133599 0.485390 -0.135037 -0.070651 +15.263407 167.397781 0.771993 -1.931368 39.525993 -9.763933 0.107907 -2.125005 -0.672897 6.383749 -1.817671 18.206617 -0.767250 0.329273 -0.107957 0.810795 0.633394 0.368567 -13.959478 7.614527 -25.785774 23.240271 -12.039417 55.526455 -0.309201 -0.111123 0.111688 0.525504 0.204671 0.123270 10.172791 -1.773887 -0.443471 0.409661 -1.348616 14.542229 -3.182944 -0.971675 22.748981 -4.490136 -14.192956 9.860512 7.893536 -16.344986 -19.524393 1.747664 -28.534069 -10.507598 -50.045864 -59.156509 20.711250 36.987701 -57.076359 -26.331371 0.139308 -0.198371 0.531335 -0.080003 0.090823 0.368534 -6.831972 29.629082 -13.198753 32.790993 45.884430 4.096642 -25.357063 58.677620 -19.937016 -0.579806 -0.000013 -0.148199 0.508312 -0.143690 -0.040736 +14.752724 167.685059 0.590487 -1.855489 39.993675 -8.534652 0.581855 -1.898165 -0.609261 6.072489 -1.618398 15.414845 -0.787126 0.387814 -0.098280 0.805649 0.638670 0.320845 -13.009922 7.475474 -24.452150 21.262867 -11.278568 56.305237 -0.269699 -0.196729 0.111687 0.563239 0.272173 0.132773 10.211312 -1.471810 -2.060840 0.113046 -1.017849 14.419915 -3.395011 -0.697476 23.777367 -3.498134 -14.639064 7.884964 7.236074 -16.955624 -17.916395 5.028893 -26.834433 -11.602651 -50.155472 -62.959286 23.695637 40.778461 -52.011105 -26.312860 0.078547 -0.141134 0.453787 -0.013559 0.018010 0.385684 -9.251797 27.824507 -13.586556 31.788395 48.672009 5.606067 -33.552673 58.065155 -24.539715 -0.616679 -0.071504 -0.157200 0.510329 -0.122149 -0.018888 +14.248546 167.855164 0.315558 -1.287819 40.650135 -7.109170 0.558041 -1.741863 -0.675211 5.791753 -1.464033 12.952365 -0.790623 0.451500 -0.069028 0.776776 0.617841 0.259159 -12.303564 7.058856 -22.429678 18.755112 -9.946091 55.874199 -0.230309 -0.259377 0.123348 0.577013 0.361300 0.138715 9.836038 -1.238977 -3.412211 -0.246978 -0.797325 14.255778 -3.648972 -0.426101 24.427528 -2.777560 -14.911052 6.580720 7.138536 -17.656530 -16.478281 8.136375 -25.788128 -12.451897 -50.526089 -66.041878 26.097467 42.857132 -46.487469 -25.181768 0.015304 -0.119410 0.386420 0.051393 -0.049064 0.407519 -11.358751 26.511700 -13.646576 30.249725 50.779602 6.367391 -40.160397 55.919910 -27.509962 -0.642141 -0.108385 -0.173704 0.536329 -0.093548 0.013469 +13.723034 167.887222 0.162565 -0.229136 40.975327 -5.397136 0.326516 -1.540542 -0.694824 5.043427 -1.231175 10.463954 -0.812217 0.517534 -0.055132 0.754188 0.581387 0.209459 -11.642634 6.754961 -19.837704 16.044327 -8.091333 53.924271 -0.196655 -0.308766 0.122851 0.586104 0.429061 0.141518 8.833982 -0.679342 -4.589886 -0.478321 -0.393616 14.082074 -3.582697 0.051444 24.868689 -2.445581 -15.071013 5.926495 7.649890 -18.425760 -15.514771 11.560550 -24.841127 -13.458413 -52.238525 -69.530991 29.758286 43.397720 -39.980606 -22.952154 -0.025506 -0.094189 0.352894 0.090917 -0.110142 0.420627 -12.530213 25.207895 -13.675694 28.082966 52.878036 6.931263 -42.668774 53.344749 -27.421837 -0.665601 -0.138593 -0.200275 0.552777 -0.061097 0.028205 +13.154796 167.765732 -0.017444 0.959566 41.104847 -3.594487 0.155735 -1.279684 -0.811514 4.171115 -0.979924 7.751913 -0.824138 0.572533 -0.040398 0.721922 0.552391 0.146740 -11.233198 6.256358 -17.111258 13.639364 -6.406019 50.908218 -0.154620 -0.365771 0.127401 0.596922 0.499197 0.139764 8.097175 -0.219603 -5.654725 -0.871037 0.053406 13.916703 -3.923025 0.583317 25.213308 -2.116305 -15.147931 4.912374 7.587058 -19.085005 -14.261256 14.231448 -24.117250 -14.527091 -51.549965 -72.897079 31.825752 42.341152 -33.660423 -20.002796 -0.074823 -0.067302 0.297338 0.141296 -0.176819 0.431586 -13.124614 24.301594 -13.621152 25.465263 55.125561 7.022866 -44.859642 50.077713 -26.820478 -0.687026 -0.172790 -0.220541 0.567529 -0.027324 0.050942 +12.652427 167.478043 -0.145238 1.830665 40.887085 -2.090642 0.203341 -0.954765 -0.745023 3.412243 -0.753820 4.873243 -0.814740 0.600247 -0.016794 0.684655 0.520836 0.093087 -10.378187 5.538208 -13.516997 10.813956 -4.532704 46.161552 -0.120794 -0.398017 0.143334 0.589635 0.552605 0.131268 7.501117 0.185551 -6.643847 -1.183736 0.461419 13.700514 -4.161107 1.097803 25.225357 -2.021372 -15.178529 4.577046 7.414250 -19.561419 -13.088565 16.812534 -23.516056 -15.387744 -48.947865 -75.615837 32.031956 40.235561 -27.932566 -17.082621 -0.107736 -0.059401 0.252675 0.179024 -0.224679 0.442622 -13.820351 23.767580 -13.328532 21.956116 56.987392 6.513611 -45.908699 47.053776 -25.580280 -0.694409 -0.188261 -0.233888 0.581082 -0.006072 0.071746 +12.110833 167.092346 -0.138848 3.214448 39.995869 -0.400861 -0.172369 -0.706984 -0.704552 2.465333 -0.578901 2.867577 -0.784245 0.603264 0.001498 0.668136 0.519923 0.044827 -9.935522 5.001680 -9.852243 8.032180 -2.723483 40.627617 -0.100701 -0.429270 0.152086 0.587611 0.590374 0.135726 6.053524 0.832766 -7.594070 -1.472706 1.063311 13.561659 -4.107346 1.763380 25.276775 -1.713637 -15.009738 4.171632 7.770448 -19.833454 -12.257958 18.805857 -22.693398 -16.168581 -45.025600 -78.042137 31.089230 37.399231 -23.531763 -14.552328 -0.123626 -0.021353 0.203154 0.205293 -0.255328 0.459199 -13.979415 23.608257 -13.260382 17.644209 58.995838 5.293576 -44.641987 43.057518 -22.753746 -0.689299 -0.218243 -0.220942 0.573001 0.000448 0.103300 +11.541359 166.711639 -0.186912 4.041986 38.260788 0.594429 -0.001946 -0.393636 -0.289911 1.297697 -0.416093 1.081805 -0.765974 0.607201 0.024447 0.670154 0.529064 0.026175 -9.254503 4.691311 -6.477743 4.992439 -1.036441 35.051476 -0.097320 -0.446263 0.162433 0.592240 0.618592 0.138083 5.467309 1.606624 -8.325973 -1.702718 1.867656 13.662179 -4.398946 2.648496 25.536352 -1.452954 -14.958820 3.692956 7.889690 -19.984180 -11.892357 19.756786 -22.420794 -16.740669 -36.328949 -79.980850 25.520666 34.929585 -20.203608 -12.623283 -0.128426 -0.004274 0.177889 0.220466 -0.269024 0.482984 -14.112598 24.032343 -13.301061 13.245157 60.299522 3.252534 -43.238102 39.019749 -20.197981 -0.689144 -0.238971 -0.216283 0.580505 -0.007443 0.123910 +10.863702 166.350510 -0.373708 5.104290 37.222961 1.615566 -0.240683 -0.185450 -0.144335 0.592479 -0.316342 -0.405420 -0.736195 0.618846 0.038954 0.636596 0.503462 -0.030630 -9.081887 4.134128 -3.473577 2.565075 -0.024397 29.616327 -0.081818 -0.457703 0.163048 0.572104 0.659229 0.146194 5.097970 2.293075 -8.704230 -2.106709 2.635574 13.919961 -5.069269 3.550424 25.750603 -1.375894 -14.946222 3.327837 8.987719 -20.545603 -11.755752 20.987288 -22.442354 -17.527714 -22.815420 -81.186272 14.998302 32.264179 -17.207109 -10.897923 -0.142293 0.015493 0.149503 0.233261 -0.289754 0.489851 -13.741647 24.259371 -13.205703 8.258407 60.593971 0.634206 -41.903019 36.643791 -18.400705 -0.675251 -0.238598 -0.207686 0.580802 0.016713 0.156652 +10.141197 166.161774 -0.587359 5.852717 36.023449 2.215918 -0.185361 -0.036818 -0.171264 -0.349911 -0.229349 -1.285258 -0.734838 0.602443 0.031015 0.624536 0.507131 -0.056659 -8.748388 3.513398 -0.655237 0.248337 0.668614 24.423582 -0.078985 -0.441205 0.166362 0.570012 0.663036 0.132547 5.001862 2.743685 -8.852294 -2.554771 3.222870 14.288876 -5.795392 4.371886 26.114792 -1.622642 -14.624389 3.388548 9.966020 -20.587978 -12.521220 21.675379 -22.483337 -17.954811 -10.330646 -81.106750 4.553654 31.120750 -15.683968 -10.084130 -0.132992 0.000772 0.155983 0.222329 -0.287111 0.486711 -13.817961 24.514492 -13.282081 3.933015 60.883949 -1.739448 -41.091583 34.993103 -17.245577 -0.670386 -0.214035 -0.209511 0.594442 0.028626 0.166587 +9.369382 165.964890 -0.762876 6.131881 35.297848 2.557128 0.140792 -0.076288 -0.700369 -0.945605 -0.195595 -1.348137 -0.735919 0.615639 0.039135 0.623030 0.509823 -0.064835 -8.137462 2.948272 1.566549 -1.656938 1.063582 20.056902 -0.078516 -0.436332 0.170880 0.573877 0.685527 0.132780 5.203964 3.027670 -8.987067 -2.935827 3.644809 14.544716 -6.430330 4.970622 26.468714 -1.715857 -14.595074 3.133125 10.391131 -20.751883 -13.027472 22.307554 -22.069473 -18.394569 -3.464134 -80.831306 -1.070836 30.342783 -14.991481 -9.655028 -0.143049 -0.016428 0.153628 0.227996 -0.289435 0.493076 -14.138993 24.599751 -13.440356 1.880020 61.035263 -2.997286 -41.170979 33.948147 -16.881983 -0.673929 -0.200437 -0.213240 0.618767 0.034946 0.177534 +8.520331 165.831375 -0.949296 5.960455 34.002510 3.163736 0.682037 -0.217011 -1.864792 -1.128206 -0.188258 -1.227100 -0.763171 0.674046 0.045236 0.601561 0.487997 -0.111852 -7.494087 2.730364 1.876862 -2.839525 1.258644 17.465479 -0.051700 -0.484481 0.174603 0.586676 0.746890 0.141622 5.676180 3.298579 -9.076401 -3.282069 4.062600 14.392307 -7.085402 5.542564 26.450905 -1.872245 -14.158875 2.274806 10.132704 -20.946558 -12.466346 22.521252 -20.788273 -18.695835 -4.992489 -80.579605 0.703920 29.917797 -15.813098 -9.680202 -0.192998 -0.006835 0.124030 0.272350 -0.337309 0.500791 -14.273344 24.135994 -14.065504 1.358220 62.807419 -3.065654 -40.000774 32.790577 -16.121183 -0.705238 -0.218068 -0.234289 0.638900 0.069540 0.190551 +7.720246 165.761398 -0.991845 5.453221 33.028862 3.660711 1.641788 -0.297832 -3.050116 -1.474649 -0.163428 -1.000444 -0.771593 0.711449 0.065923 0.569237 0.444057 -0.147392 -6.791658 2.609566 1.474994 -3.132654 1.263377 16.153952 -0.028051 -0.499574 0.183984 0.575861 0.793300 0.131388 6.246250 3.485019 -9.047722 -3.525821 4.374689 14.036756 -7.661132 6.001658 26.009985 -2.389523 -13.841954 2.069211 10.304131 -21.346611 -11.900013 22.487663 -20.205582 -18.443094 -12.881796 -80.229149 7.255956 30.983335 -17.082664 -10.321006 -0.215359 -0.018506 0.113267 0.293341 -0.374778 0.507041 -13.915841 23.607002 -14.039582 3.067813 64.022621 -1.645805 -40.102722 34.100372 -16.643835 -0.713974 -0.215651 -0.262187 0.662469 0.092126 0.197328 +6.980124 165.773621 -0.957662 4.916332 32.620441 4.376898 2.315460 -0.452144 -4.469755 -1.153489 -0.179857 -0.798818 -0.775162 0.750004 0.075509 0.529064 0.385368 -0.186128 -6.208131 2.539699 0.584355 -2.812706 1.134082 15.222023 -0.000596 -0.528919 0.180524 0.555788 0.825924 0.133544 6.671027 3.718239 -9.128987 -3.618779 4.642916 13.447472 -7.950418 6.331552 25.371599 -2.808104 -13.534370 1.966437 10.238871 -21.713171 -10.781826 22.177227 -19.920835 -17.643257 -27.425217 -79.746002 19.012197 33.702026 -19.412605 -11.854951 -0.239858 0.000493 0.096109 0.315196 -0.415017 0.502440 -13.289996 22.932802 -13.565120 8.296214 64.747215 1.989123 -41.725578 37.136616 -18.509134 -0.716703 -0.230645 -0.281501 0.653199 0.120688 0.198927 +6.303924 165.845642 -0.861806 4.003965 32.788124 4.840666 3.212996 -0.618104 -6.001636 -0.504762 -0.219728 -0.282488 -0.801564 0.772736 0.073209 0.522865 0.363371 -0.172984 -5.456772 2.489627 -0.343292 -1.937934 0.914417 14.788194 0.009172 -0.538319 0.179718 0.557816 0.824922 0.126989 7.351855 3.833125 -9.183214 -3.492319 4.739820 12.859618 -7.923731 6.443955 24.833860 -2.974798 -13.731130 1.955606 9.426987 -21.815243 -10.321687 21.122181 -19.454792 -16.758776 -44.364414 -79.027069 32.739819 36.405079 -22.399908 -13.767385 -0.252362 -0.011473 0.102143 0.324003 -0.429063 0.493708 -13.294688 22.132700 -13.033670 15.881107 64.539932 6.900066 -44.752182 41.038544 -21.676315 -0.730775 -0.234082 -0.303218 0.657013 0.126173 0.178843 +5.592465 165.937042 -0.638661 3.210335 33.209690 5.070128 3.959821 -0.709801 -7.099002 0.274986 -0.267421 0.040806 -0.806341 0.780559 0.075508 0.538505 0.373692 -0.140717 -4.776027 2.418915 -0.944138 -1.029419 0.707528 14.399861 0.009676 -0.557325 0.178543 0.568182 0.814972 0.136537 7.483667 3.717680 -9.406837 -3.278350 4.567672 12.435507 -7.474792 6.227635 24.650534 -3.096117 -13.722536 1.924549 8.107860 -21.527048 -9.606344 19.553572 -18.304516 -15.632386 -59.704826 -77.050789 44.409248 39.375587 -26.958700 -16.423458 -0.267279 -0.001405 0.087542 0.340513 -0.432183 0.490210 -13.110203 21.245829 -12.729794 24.303730 64.399689 12.467034 -46.927135 45.180073 -24.919319 -0.739410 -0.260204 -0.298586 0.642587 0.111272 0.166142 +4.852282 166.008621 -0.355108 2.405284 33.847500 4.986825 4.808879 -0.743719 -7.914105 1.202046 -0.333014 0.483440 -0.807180 0.775475 0.071905 0.575853 0.433174 -0.115036 -4.165576 2.212433 -0.919981 0.230435 0.431386 13.634420 -0.003064 -0.576829 0.181055 0.601705 0.811189 0.155496 7.609995 3.478138 -9.731476 -3.102810 4.281628 12.252445 -6.982843 5.896212 24.948536 -2.947755 -13.687493 1.699193 7.137354 -21.073893 -9.711421 17.436028 -16.506262 -14.743447 -72.680977 -74.272087 53.267750 41.411968 -31.998646 -19.207521 -0.285676 0.010030 0.063321 0.360609 -0.419922 0.499057 -13.027251 20.394306 -12.891348 34.501976 64.344765 19.099611 -47.908665 49.015976 -27.805302 -0.756503 -0.283991 -0.275118 0.641048 0.091051 0.171695 +4.095486 165.900436 -0.024518 1.769227 33.683697 5.158602 5.985386 -0.606450 -8.480288 1.259977 -0.313284 0.189739 -0.865306 0.817283 0.056830 0.586940 0.437726 -0.076280 -3.764702 2.160793 -1.428794 1.191885 0.218834 13.231978 -0.008952 -0.580450 0.172351 0.627847 0.815678 0.158247 7.201216 3.339205 -10.041555 -2.972286 3.987144 11.928468 -6.350002 5.627696 24.860329 -2.910725 -13.472461 1.538499 6.097837 -20.417250 -10.162145 16.063993 -14.072212 -14.076571 -81.620674 -70.282127 57.399010 42.221367 -37.094517 -21.832954 -0.320447 -0.038487 0.086913 0.376605 -0.415515 0.483393 -13.495538 19.350491 -13.298965 45.798290 63.360043 26.231855 -46.811165 53.752232 -30.072666 -0.790140 -0.265427 -0.305028 0.673871 0.100981 0.143754 +3.438848 165.760529 0.300029 1.144738 33.025787 5.307882 7.033484 -0.448961 -8.729427 1.381562 -0.301370 -0.251613 -0.877875 0.818331 0.044097 0.596842 0.448076 -0.057899 -3.291155 2.121921 -1.888854 1.963012 0.078161 12.697372 -0.016969 -0.572665 0.162653 0.636253 0.804818 0.161538 6.976700 3.347194 -10.208448 -2.928607 3.909959 11.683503 -5.986039 5.510717 24.604748 -2.745797 -13.007541 1.366728 6.285728 -19.888689 -10.660829 14.415115 -12.292968 -13.341600 -85.224579 -66.551514 57.041687 41.779133 -42.537186 -23.895697 -0.321497 -0.045966 0.100342 0.370424 -0.403293 0.473996 -13.231837 18.825428 -13.634550 54.367344 61.988094 31.261580 -43.298069 57.807617 -30.236252 -0.792365 -0.257303 -0.306645 0.674957 0.100598 0.134627 +2.931377 165.649948 0.509723 0.669527 32.429909 5.372944 7.841229 -0.380284 -9.006553 1.467680 -0.304590 -0.109049 -0.890625 0.816625 0.032260 0.605173 0.445830 -0.034567 -2.892600 2.141472 -2.302336 2.423281 -0.002901 12.440843 -0.029012 -0.555611 0.155990 0.633152 0.785317 0.164586 6.744302 3.348310 -10.215914 -2.882294 3.829966 11.536366 -5.658938 5.414783 24.333467 -2.706018 -12.687343 1.444749 6.532473 -19.482269 -11.222239 13.231344 -11.151945 -12.730559 -86.726524 -63.624542 55.535744 40.800503 -47.029503 -25.299522 -0.311934 -0.059239 0.130391 0.354695 -0.384995 0.464434 -12.893551 18.718836 -13.714771 59.558746 60.562210 33.678078 -40.230492 60.605011 -29.822653 -0.792353 -0.241202 -0.310784 0.672523 0.098763 0.118684 +2.266824 165.460464 0.728210 0.092142 31.597691 5.424376 8.836014 -0.350310 -9.512893 1.626200 -0.317067 0.738954 -0.897748 0.795198 0.014435 0.604065 0.421635 0.001174 -2.476802 2.180535 -2.854814 3.073027 -0.122512 12.143336 -0.047730 -0.509152 0.148696 0.605717 0.736376 0.160575 6.412073 3.356744 -9.996611 -2.835008 3.732319 11.412697 -5.244916 5.289596 23.673195 -2.849306 -12.387654 1.799806 6.992700 -18.997723 -12.095221 11.217264 -10.980042 -11.968382 -85.918465 -59.576199 50.509739 36.548660 -52.498924 -25.223112 -0.278501 -0.088753 0.191059 0.313190 -0.348340 0.441471 -11.630080 19.760973 -13.522481 63.401157 57.686375 33.489197 -32.438881 64.026749 -26.379099 -0.777157 -0.200458 -0.316274 0.658965 0.095432 0.087940 +1.581632 165.189804 0.931117 -0.346052 30.225321 5.750088 9.531106 -0.300225 -10.131926 2.119071 -0.325227 1.347871 -0.878593 0.754624 0.003394 0.570500 0.358994 0.024517 -2.025930 2.525628 -4.155605 3.312904 -0.146578 12.885932 -0.056367 -0.451923 0.144641 0.543078 0.674624 0.147494 5.965568 3.657798 -9.588206 -2.725786 3.915745 11.112229 -4.736913 5.366370 22.351368 -3.014244 -12.278728 2.694350 7.286094 -18.560572 -12.151581 9.155830 -11.925589 -10.879488 -84.275963 -54.997200 43.980423 28.727808 -57.309170 -22.576441 -0.234277 -0.117662 0.250222 0.264371 -0.313926 0.406452 -10.244849 21.932104 -13.108867 65.382286 53.725140 30.628954 -18.825352 65.762871 -18.167976 -0.738716 -0.151958 -0.319804 0.623572 0.095499 0.054250 +0.876000 164.962646 1.251027 -0.999998 29.335575 5.424058 10.527983 -0.171201 -10.518970 2.311136 -0.339245 2.378149 -0.825436 0.665377 -0.006380 0.596336 0.362738 0.100848 -1.173438 2.781909 -4.656137 3.620914 -0.168552 13.683772 -0.110414 -0.373355 0.135275 0.492918 0.564564 0.156979 5.869252 3.727466 -8.864503 -2.668628 3.966125 11.067311 -4.468282 5.249524 21.111616 -3.081929 -12.207443 3.958512 7.653275 -17.707989 -12.922266 5.672904 -13.086706 -10.138650 -80.174736 -50.558403 36.178272 14.291852 -61.110950 -14.655278 -0.146614 -0.120485 0.323428 0.184229 -0.223386 0.391120 -7.790674 24.402287 -12.775517 65.683685 49.101234 25.930243 1.063916 64.972542 -5.279998 -0.680986 -0.120330 -0.279121 0.562519 0.044203 0.024809 +0.234245 164.796951 1.590622 -1.545002 28.503132 4.917855 11.255604 -0.112813 -11.187887 2.554923 -0.356537 4.445276 -0.768865 0.547068 -0.029979 0.592443 0.356620 0.158759 -0.336017 2.999358 -4.896440 3.812555 -0.206337 14.648819 -0.159455 -0.259794 0.131750 0.424873 0.443809 0.144621 6.138334 3.888362 -7.623950 -2.718828 4.163181 10.921990 -4.609787 5.295933 19.414034 -3.299735 -12.379153 6.243906 8.549666 -16.876646 -14.212322 2.163591 -14.333405 -9.709208 -75.590454 -45.950649 28.556053 -5.795544 -61.292072 -2.159915 -0.054062 -0.168231 0.410493 0.090287 -0.120858 0.352537 -4.063213 26.283182 -11.405672 66.063904 43.012012 19.783836 18.945408 61.808441 5.129745 -0.612648 -0.037668 -0.241363 0.516014 0.010772 -0.004653 +-0.403436 164.440872 1.904445 -2.046311 27.653175 4.539516 11.724346 -0.073588 -12.399853 3.162879 -0.415166 7.392632 -0.672674 0.418927 -0.035707 0.608762 0.372285 0.222884 0.397444 3.299001 -5.284660 4.084406 -0.221023 15.640098 -0.218023 -0.160060 0.132093 0.354525 0.324163 0.157174 6.143893 3.934645 -6.121440 -2.699832 4.324343 10.455042 -4.652387 5.300210 17.206573 -3.460623 -12.583629 8.459460 9.184999 -16.207094 -14.927953 -1.505674 -15.215812 -8.888121 -71.796814 -40.839802 21.651861 -23.209408 -57.960960 7.782998 0.042970 -0.176965 0.470766 0.003347 -0.010367 0.334550 -0.510126 27.831076 -9.719409 65.360329 37.274128 13.784561 27.870729 55.404690 8.450658 -0.531611 0.012753 -0.169966 0.445913 -0.045909 -0.014322 +-1.049809 164.093292 2.234870 -2.233043 27.238579 3.961143 11.760059 -0.163287 -13.844517 3.857262 -0.544328 11.236992 -0.609022 0.298193 -0.070127 0.655837 0.422302 0.289971 0.990264 3.529787 -5.217776 4.242348 -0.228390 16.699554 -0.288210 -0.073266 0.122675 0.313232 0.196006 0.182494 5.940618 3.663647 -4.339733 -2.750357 4.217844 9.962990 -4.756522 5.125760 15.130462 -3.696817 -12.523713 10.992363 9.895925 -15.424960 -16.279505 -5.669021 -16.076023 -8.397373 -67.712822 -36.101723 15.293859 -30.137659 -50.419628 9.602019 0.141062 -0.167769 0.544226 -0.088092 0.106709 0.319358 3.041803 29.458523 -8.241609 64.120483 32.167873 8.529281 27.684877 45.489082 5.932588 -0.474296 0.054013 -0.093745 0.374274 -0.096529 -0.028182 +-1.792906 163.759460 2.473819 -2.526578 26.390026 3.281994 11.859721 -0.398713 -15.907858 4.322669 -0.720167 16.379829 -0.576837 0.201797 -0.107915 0.706499 0.483274 0.362983 1.691269 3.903660 -5.586570 4.314372 -0.212810 18.413666 -0.347105 0.000672 0.105034 0.303264 0.083556 0.191757 5.669950 3.361036 -2.416411 -2.743640 4.133983 9.466788 -4.766204 5.008610 13.434272 -3.972103 -12.054435 12.986801 9.888752 -14.380226 -17.601641 -9.669702 -15.824588 -8.754024 -64.464470 -32.356384 10.911187 -30.276041 -40.833458 7.347875 0.219656 -0.172996 0.604624 -0.165769 0.204699 0.300488 6.769095 29.729076 -6.881930 63.583786 27.953762 4.900280 24.332163 36.803856 3.119418 -0.431472 0.088738 -0.041413 0.331128 -0.141005 -0.046751 +-2.590592 163.491791 2.530944 -2.978992 24.742067 2.354896 12.045663 -0.707246 -17.998175 4.633310 -0.932183 22.216169 -0.580952 0.124310 -0.156029 0.754247 0.531115 0.438724 2.318411 4.542555 -6.405538 4.740817 -0.267876 21.177885 -0.401851 0.084192 0.084814 0.300761 -0.022304 0.185894 5.319794 3.151179 0.003651 -2.663121 4.167975 8.904583 -4.675383 5.063518 11.740530 -4.406235 -11.455246 15.146665 10.427155 -13.344041 -19.584890 -13.915477 -14.979415 -8.975922 -61.607368 -28.843891 7.250041 -27.536211 -33.652313 4.740300 0.295767 -0.204325 0.690821 -0.249960 0.294306 0.273039 10.796494 29.657585 -5.520434 62.738575 24.077337 2.029039 20.597664 28.916431 1.261694 -0.403661 0.144232 -0.017180 0.312105 -0.170763 -0.080729 +-3.360403 163.146057 2.629056 -2.938291 23.196104 1.665060 11.743255 -1.365583 -20.472963 4.670496 -1.176808 28.744678 -0.593355 0.094028 -0.184494 0.759990 0.528423 0.452361 2.454143 4.989292 -7.128467 5.086215 -0.372964 23.673584 -0.425461 0.140258 0.071171 0.288516 -0.060632 0.171416 4.127890 3.104728 2.044532 -2.478197 4.114188 8.424778 -4.044780 5.023692 10.357756 -5.493556 -10.132643 16.806961 12.063702 -12.761723 -20.664846 -15.978810 -13.230397 -9.054479 -61.277134 -26.025434 4.431917 -21.489691 -30.057558 1.932083 0.343104 -0.232048 0.758958 -0.305309 0.333233 0.257443 14.737449 28.680328 -4.591903 60.852917 20.876347 0.473342 17.325766 20.632584 0.450206 -0.386390 0.195444 -0.025037 0.315633 -0.166996 -0.097865 +-4.031923 162.546143 2.692072 -3.139272 21.789230 1.088092 11.549229 -2.144103 -23.743189 4.734555 -1.493840 35.868851 -0.587350 0.067222 -0.196489 0.758475 0.518299 0.470893 2.479411 5.563029 -8.446764 6.035028 -0.702205 26.933628 -0.440072 0.178666 0.061357 0.271258 -0.097874 0.161634 2.955367 2.870569 4.298859 -2.124471 3.861637 7.741437 -3.255532 4.744660 8.609985 -6.378093 -9.075284 17.438549 12.287344 -12.162248 -21.043112 -18.055866 -10.573992 -9.369792 -60.906883 -23.154047 1.943765 -16.244444 -26.982914 -0.032990 0.376918 -0.243729 0.795665 -0.343021 0.360711 0.243796 17.573069 26.370966 -4.479882 58.671471 18.371773 -0.064664 14.899653 12.588306 0.298212 -0.364035 0.222130 -0.025561 0.306315 -0.171456 -0.112915 +-4.530951 161.683258 2.857551 -3.721910 20.571373 0.405763 11.584590 -2.809723 -27.204296 4.597153 -1.777532 42.993851 -0.596537 0.064302 -0.204855 0.740473 0.484392 0.472920 2.781845 6.112828 -9.514110 7.276214 -1.195430 30.066996 -0.437875 0.197874 0.062607 0.248340 -0.114336 0.153702 2.887526 2.501115 6.548411 -1.863120 3.751830 6.986165 -3.113288 4.678326 6.820383 -6.980174 -8.374520 17.448805 12.196870 -11.864803 -21.240942 -19.825966 -8.055820 -9.822625 -59.771877 -20.386696 0.043366 -12.204634 -23.521408 -1.211346 0.388413 -0.262002 0.826478 -0.359661 0.365460 0.228310 18.780666 23.616423 -4.681273 56.686462 16.278784 -0.600133 12.053510 6.484162 0.243022 -0.358833 0.247507 -0.038983 0.301182 -0.160750 -0.131050 +-5.038999 160.985016 3.152823 -4.164714 18.779064 -0.571429 11.651412 -3.189358 -29.927025 3.951278 -1.723227 49.565891 -0.585724 0.046345 -0.199193 0.727997 0.464540 0.485919 3.089249 6.575175 -9.795017 8.262147 -1.562730 32.450603 -0.447486 0.230806 0.058465 0.227480 -0.131548 0.140561 2.905967 2.278013 9.153730 -1.862588 3.990889 6.227502 -3.481675 4.923924 5.023766 -7.037124 -7.792000 17.676662 12.762646 -11.455729 -21.567152 -20.872562 -6.144718 -9.970915 -57.116722 -17.528547 -1.568299 -9.404504 -20.669231 -1.741714 0.410909 -0.283389 0.853394 -0.384777 0.383264 0.220238 19.181568 20.903532 -4.870619 54.449150 14.406320 -1.301590 9.243716 2.090031 0.278573 -0.337335 0.272931 -0.047898 0.303888 -0.166358 -0.140697 +-5.721070 160.578217 3.626643 -4.612236 16.427341 -2.135710 11.820450 -3.107033 -31.206917 3.091653 -1.322016 54.947258 -0.626754 0.048919 -0.216443 0.718806 0.443222 0.517402 4.185810 6.984067 -8.841696 8.102322 -1.426917 33.979382 -0.460147 0.266863 0.053371 0.220950 -0.153298 0.122410 2.427021 2.401033 11.749820 -1.927197 4.383028 5.716813 -3.726162 5.376480 3.741900 -6.367495 -7.498810 18.583605 13.039213 -10.518732 -22.383707 -21.309656 -4.651912 -10.035110 -53.589840 -14.920925 -2.754882 -7.078250 -18.959539 -2.059306 0.415850 -0.343465 0.913075 -0.405832 0.405266 0.196802 18.751753 18.903433 -4.866766 51.884148 12.727719 -2.065844 6.672866 -0.804184 0.376527 -0.345897 0.323400 -0.083478 0.327273 -0.157800 -0.177928 +-6.412808 160.304092 4.112237 -4.742250 14.785318 -3.866420 11.541334 -3.234601 -32.209484 2.247242 -0.883049 59.591805 -0.645862 0.057845 -0.233904 0.700061 0.416020 0.543019 5.047765 7.111754 -7.223330 8.218668 -1.401028 34.957157 -0.463283 0.285419 0.046263 0.203705 -0.170998 0.126565 1.404873 2.644516 14.223445 -1.885231 4.638927 5.455352 -3.553349 5.662379 2.828120 -5.478572 -7.589102 19.147963 12.737132 -9.688244 -22.674809 -21.496178 -3.338287 -9.826394 -49.896580 -12.431218 -3.733506 -5.174586 -18.959841 -2.288249 0.397207 -0.381450 0.942090 -0.406944 0.421878 0.164374 18.211502 17.283218 -4.631820 48.264683 11.044409 -2.834854 4.661848 -2.397516 0.448268 -0.348293 0.359857 -0.096127 0.325584 -0.143053 -0.205678 +-6.928055 160.086761 4.571081 -5.080117 13.542512 -5.808462 11.198509 -3.444896 -32.859943 0.999826 -0.218608 63.356174 -0.663429 0.060625 -0.245815 0.696588 0.411216 0.562385 5.840366 7.123978 -5.370850 8.698271 -1.541639 35.842030 -0.474441 0.292967 0.043815 0.198753 -0.183775 0.134869 1.130462 2.583256 16.295437 -1.830120 4.790107 5.639744 -3.595851 5.847186 2.595757 -4.652845 -7.310275 19.085495 12.422848 -8.621764 -23.338688 -20.916506 -2.140730 -9.444902 -46.766697 -10.292544 -4.396543 -3.669480 -19.995323 -2.481628 0.384241 -0.401387 0.966884 -0.406327 0.438743 0.148852 16.610487 15.358989 -4.852176 44.734409 10.001855 -3.376023 3.274905 -2.787215 0.446029 -0.358763 0.379680 -0.103430 0.324597 -0.137116 -0.226226 +-7.445780 159.876572 5.082046 -4.873990 13.022504 -7.250898 10.048257 -3.977962 -33.546955 -0.350746 0.582151 65.759186 -0.655742 0.068646 -0.232701 0.684207 0.395246 0.565436 5.888405 7.001862 -3.791795 9.446332 -1.827027 36.441429 -0.471601 0.287115 0.052007 0.186085 -0.173529 0.141450 0.411803 2.723772 17.395706 -1.855618 4.776449 6.162052 -3.440972 5.829131 2.923939 -4.101944 -7.133761 18.307856 11.991088 -8.035526 -23.165541 -19.417786 -0.824710 -8.871023 -44.519711 -8.417058 -4.978661 -1.524055 -21.865860 -2.850051 0.367466 -0.405771 0.961909 -0.391070 0.435149 0.148666 14.722197 13.643157 -4.894085 41.189999 9.011080 -3.776797 2.086179 -2.738231 0.412427 -0.360218 0.379198 -0.106974 0.322193 -0.137707 -0.229997 +-7.978439 159.790924 5.635437 -4.809546 12.073950 -8.736429 9.394713 -3.925914 -33.527271 -2.189096 1.901391 66.879860 -0.654295 0.069118 -0.219790 0.659468 0.379724 0.552277 6.313759 7.036048 -2.154211 9.629060 -1.800329 36.975513 -0.459036 0.281753 0.066804 0.178455 -0.158759 0.129122 -0.323338 3.194349 18.095259 -1.827985 4.958994 6.899821 -3.158443 6.019390 3.627603 -3.309435 -7.412144 17.305094 11.513452 -7.628661 -23.046267 -17.866680 0.381365 -8.430048 -42.091728 -6.959424 -5.241391 0.621886 -23.314865 -3.173356 0.347769 -0.422449 0.949155 -0.371875 0.420659 0.146335 12.663950 12.007515 -4.618950 37.429699 7.834501 -4.095014 1.314404 -1.346673 0.306888 -0.367366 0.384559 -0.120845 0.332854 -0.132252 -0.233317 +-8.498578 159.830307 6.232878 -4.905817 10.690448 -10.232709 8.813299 -3.516993 -32.624908 -4.000945 3.209200 66.177353 -0.628822 0.058627 -0.204224 0.642016 0.366629 0.535934 7.012474 7.160951 -0.450217 9.502440 -1.554054 37.370792 -0.447925 0.280693 0.073057 0.165153 -0.149896 0.122007 -0.181530 3.576280 18.614855 -1.929441 5.403606 7.652115 -3.457149 6.456235 4.370292 -3.180257 -7.459258 16.531399 11.955357 -7.746142 -22.854734 -16.217678 1.189944 -7.740199 -39.297939 -5.592618 -5.362935 2.573493 -25.246054 -3.504770 0.349338 -0.411427 0.929805 -0.367434 0.409310 0.149344 11.004084 10.558630 -3.919111 33.727859 6.368999 -4.323321 0.380682 0.369494 0.223897 -0.353273 0.377183 -0.118240 0.325865 -0.135512 -0.223299 +-9.004461 159.945602 6.838213 -4.764175 9.472632 -11.389778 8.194818 -3.203891 -32.080097 -6.308816 4.726672 64.876518 -0.594184 0.045811 -0.180859 0.635236 0.366382 0.513613 7.542616 7.199426 1.087874 9.245399 -1.267772 37.488579 -0.435391 0.260886 0.083774 0.159656 -0.134604 0.119195 -0.259709 4.182143 18.623560 -2.098221 5.970319 8.501646 -3.703206 6.969938 5.385630 -2.635448 -7.721590 15.207582 12.445002 -7.977115 -22.183935 -14.880594 1.646604 -7.528221 -35.811028 -5.224490 -5.009884 4.472164 -26.187166 -3.699622 0.350936 -0.371288 0.891654 -0.353397 0.387704 0.166744 10.114367 8.734211 -3.147747 30.044931 4.500038 -4.546605 -1.424486 2.797348 0.078395 -0.344060 0.341090 -0.107309 0.308501 -0.148347 -0.206307 +-9.464327 160.107834 7.399134 -4.638529 8.865036 -12.056458 7.228813 -3.230319 -32.151878 -8.541168 5.885347 62.703785 -0.555931 0.053639 -0.153522 0.609414 0.348818 0.467438 7.763189 7.193855 2.031472 9.502087 -1.262183 37.493080 -0.408380 0.224220 0.093881 0.148360 -0.095332 0.124063 -0.292985 4.645823 18.018602 -2.202692 6.297347 9.379336 -3.796278 7.270170 6.604698 -2.245090 -7.906760 13.372962 12.713310 -8.492113 -21.010517 -13.608711 1.922604 -7.252903 -32.840405 -4.936044 -4.726596 7.798020 -27.078276 -4.277680 0.330077 -0.326625 0.833062 -0.320507 0.348671 0.181711 9.330679 7.079579 -2.544061 25.858721 3.136989 -4.277082 -2.185851 3.598872 0.036887 -0.335863 0.301582 -0.096241 0.291781 -0.144004 -0.177700 +-9.850870 160.419327 8.055057 -4.668190 8.392828 -12.915040 6.143889 -3.214820 -31.367960 -10.638514 6.606496 58.815426 -0.540175 0.060363 -0.146239 0.596673 0.333300 0.454337 8.259864 7.206565 3.228472 9.769401 -1.242452 37.568943 -0.395849 0.203685 0.091858 0.138729 -0.085013 0.131284 0.298186 4.796818 17.381380 -2.475327 6.585726 10.201623 -4.377612 7.573607 7.831286 -1.571793 -8.462477 12.707538 12.794375 -8.827060 -20.202139 -12.766110 1.656136 -6.799743 -29.322397 -4.287319 -4.482095 11.376641 -27.964632 -5.002304 0.317255 -0.298695 0.806718 -0.304854 0.330211 0.180226 7.995950 6.170955 -1.583618 22.531973 1.801779 -3.888522 -2.336093 3.534618 0.079791 -0.331641 0.278165 -0.088712 0.271598 -0.139880 -0.171659 +-10.258888 160.899261 8.780128 -4.515129 8.508290 -14.171170 4.724641 -3.417014 -29.568516 -12.679696 6.892889 53.679901 -0.542896 0.079948 -0.150197 0.576519 0.307418 0.444044 8.547130 6.856709 5.327373 10.324254 -1.367736 36.719761 -0.389933 0.207023 0.087851 0.123648 -0.071947 0.140988 0.205218 5.100698 17.009731 -2.506179 6.642416 11.258969 -4.329958 7.734841 9.163054 -1.460240 -8.582478 12.430688 13.390949 -8.933520 -20.630688 -11.434558 1.256941 -6.365737 -26.768579 -3.896862 -4.375902 15.567303 -28.356167 -5.987316 0.298042 -0.308146 0.810638 -0.299096 0.326829 0.166893 6.794379 5.634328 -0.460415 18.499191 0.520377 -3.301985 -1.353282 2.821591 0.201188 -0.332234 0.297272 -0.091726 0.273853 -0.118369 -0.171647 +-10.613203 161.235306 9.647246 -4.647935 8.156320 -15.108036 3.612535 -3.238226 -27.646391 -14.134160 6.781410 48.175400 -0.587231 0.127416 -0.160943 0.540394 0.254167 0.424194 9.165415 6.904548 6.592752 10.859378 -1.441973 36.782459 -0.369400 0.208376 0.081467 0.115114 -0.043592 0.129077 0.849933 5.252676 16.002842 -2.686818 6.808344 12.135622 -4.747991 8.073049 10.572889 -1.661015 -8.504340 12.417289 14.038247 -9.160443 -20.928003 -10.109330 1.281690 -6.068034 -24.055748 -3.332074 -4.221080 19.610655 -29.577295 -7.185842 0.270424 -0.346844 0.833003 -0.290987 0.301251 0.144569 5.606927 4.894911 0.205645 14.801491 -0.173862 -2.729801 -0.228601 1.499159 0.287694 -0.349434 0.331402 -0.133159 0.302040 -0.075991 -0.186777 +-10.971545 161.485229 10.616828 -4.666320 8.091014 -15.454363 2.215467 -3.202193 -26.107677 -14.568086 6.133189 42.664192 -0.640263 0.188589 -0.171176 0.506537 0.205565 0.380487 9.456243 7.161919 6.923061 11.556711 -1.607391 37.258102 -0.340074 0.188872 0.077757 0.120177 0.004275 0.116288 1.205187 5.488316 14.241652 -2.874127 6.890341 12.829988 -4.989864 8.338240 12.124058 -2.303243 -8.041579 12.304311 14.657230 -9.638011 -20.747490 -8.696290 1.593258 -6.027452 -21.449450 -3.081878 -3.912217 23.158499 -29.773090 -8.086489 0.238096 -0.369093 0.842276 -0.272110 0.257303 0.136079 5.142882 3.800783 0.207637 10.800345 -0.143235 -2.115229 0.981255 0.112588 0.285438 -0.377984 0.348321 -0.179623 0.335737 -0.027293 -0.191795 +-11.274673 161.662460 11.509485 -4.990741 8.164786 -15.865658 1.043461 -3.087590 -24.173313 -14.748280 5.222101 36.373734 -0.683668 0.250060 -0.168607 0.465346 0.141514 0.348504 9.717762 7.497554 6.983899 12.795793 -2.025599 38.039116 -0.318883 0.179148 0.078920 0.107374 0.051464 0.109039 2.012276 5.423952 13.253212 -3.071696 6.888405 13.184701 -5.539055 8.461892 12.861990 -2.746953 -7.700154 12.335080 14.982339 -9.958453 -20.515394 -7.200118 1.981705 -5.887343 -18.871796 -2.684505 -3.586296 26.492111 -28.849470 -8.599340 0.206723 -0.408235 0.863617 -0.254611 0.225739 0.129634 4.042210 3.053280 0.576295 8.387979 -0.728333 -1.799165 1.430843 -0.014770 0.295403 -0.399283 0.377449 -0.227601 0.371532 0.015396 -0.199687 +-11.546304 161.685944 12.419944 -5.450464 8.495954 -15.980325 -0.082884 -3.123311 -22.469206 -14.564780 4.167786 30.123472 -0.689176 0.276901 -0.158702 0.423207 0.082733 0.319910 10.045534 7.669461 6.689302 14.109858 -2.541101 38.632874 -0.294464 0.182988 0.081005 0.083759 0.081419 0.089145 2.597516 5.272849 12.169952 -3.216062 6.739087 13.135448 -5.925075 8.380306 13.078330 -3.344894 -6.949200 13.024004 15.546537 -10.218468 -19.273079 -5.055687 2.270844 -5.061776 -17.396822 -1.643019 -3.473819 29.611986 -28.293369 -9.116992 0.196602 -0.430118 0.866134 -0.248265 0.196712 0.122852 2.710117 2.595574 1.058337 6.394696 -1.610484 -1.632326 1.544837 -1.646039 0.288008 -0.392895 0.396230 -0.258273 0.388419 0.041031 -0.200705 +-11.785805 161.486267 13.405548 -6.061451 9.195331 -15.831934 -1.501298 -3.426906 -21.074863 -13.357212 2.985122 24.702532 -0.692994 0.303578 -0.143693 0.389224 0.033678 0.299776 10.340446 7.637849 6.225935 15.497364 -3.190669 39.035683 -0.274082 0.177473 0.089672 0.063842 0.109614 0.076712 2.998128 5.011083 10.540645 -3.275383 6.376997 12.872963 -6.085165 8.089252 13.292309 -3.519217 -6.618376 13.792407 15.296922 -10.437434 -17.670822 -3.321713 2.294897 -4.212504 -15.451892 -0.475142 -3.209919 31.677366 -27.372871 -9.164584 0.180383 -0.451834 0.862879 -0.231886 0.171063 0.122296 1.352678 2.111200 1.626733 4.355453 -2.467059 -1.297570 2.130320 -1.259604 0.279247 -0.393655 0.405323 -0.283223 0.402052 0.057760 -0.202901 +-12.051274 161.253021 14.408487 -6.603261 9.545199 -15.825659 -2.758981 -3.560180 -19.574232 -11.625344 1.991087 20.069298 -0.665384 0.288755 -0.130584 0.387868 0.038364 0.282512 10.582731 7.690639 5.792287 16.742950 -3.754691 39.623516 -0.274453 0.182917 0.097448 0.055862 0.121235 0.073051 3.591081 4.775169 9.176961 -3.424733 6.216575 12.704245 -6.480902 7.936376 13.571879 -4.004970 -5.928668 14.800937 15.995433 -10.609320 -16.790525 -1.665542 1.946813 -3.410395 -13.143541 0.400385 -2.866153 32.169460 -25.569466 -8.505278 0.191705 -0.443357 0.851276 -0.233687 0.170198 0.137078 0.621885 1.823771 1.944118 1.827471 -3.001677 -0.957822 2.640047 -2.206958 0.227907 -0.380538 0.402652 -0.271961 0.402752 0.051237 -0.184742 +-12.322012 160.850052 15.339103 -7.189845 9.813557 -15.963759 -3.706390 -3.512677 -18.148531 -9.916778 1.270711 16.204428 -0.637864 0.259861 -0.124064 0.398722 0.075254 0.257444 11.109981 7.739640 5.467600 17.587557 -4.148072 40.342140 -0.276966 0.172983 0.105461 0.068731 0.128764 0.070546 4.055035 4.415062 8.204596 -3.618448 5.985120 12.616246 -6.899271 7.640937 13.838318 -3.975210 -5.029077 15.042229 16.410110 -10.256472 -16.080297 -0.136868 2.209439 -3.057927 -10.736804 0.844927 -2.434971 32.167191 -23.359604 -7.573365 0.201447 -0.413948 0.823907 -0.228574 0.169179 0.158222 -0.264165 1.500163 1.611749 -0.304248 -2.315142 -0.683312 3.107346 -3.377892 0.129038 -0.375496 0.380101 -0.252288 0.396436 0.037889 -0.161639 +-12.538857 160.330368 16.155071 -7.762503 9.759625 -16.367041 -4.034342 -3.274439 -16.713995 -8.999638 0.903693 13.275191 -0.662607 0.286004 -0.145914 0.390860 0.053399 0.256722 11.935142 7.936140 5.336325 18.010324 -4.393959 41.526081 -0.267515 0.164279 0.089025 0.069417 0.126679 0.077573 4.779641 4.019969 7.819373 -3.762131 5.749017 12.606022 -7.364584 7.474751 13.956902 -4.216215 -4.234599 14.905465 16.374588 -9.882743 -16.095068 1.578741 2.796022 -2.966520 -9.473142 0.768060 -2.114720 32.032555 -21.322016 -6.828822 0.190352 -0.406092 0.834044 -0.228533 0.160055 0.140082 -1.883126 1.124859 1.292994 -1.650442 -1.648684 -0.590864 3.239905 -3.963721 0.092462 -0.380052 0.381701 -0.263474 0.386230 0.059140 -0.173989 +-12.769197 159.662827 16.990501 -8.287926 9.927526 -16.833183 -4.033185 -3.067184 -15.561388 -8.623568 0.755996 11.709300 -0.673577 0.305737 -0.146311 0.389679 0.038754 0.268602 12.661439 7.976710 5.375806 18.591475 -4.774434 42.587254 -0.262180 0.156926 0.082958 0.070027 0.129305 0.080348 5.197240 3.631244 7.733939 -3.852854 5.487174 12.597133 -7.647515 7.222457 13.924252 -4.091022 -3.659539 14.312510 16.001905 -9.378504 -15.880338 2.847676 3.333412 -2.945452 -7.813217 0.838075 -1.802546 32.203983 -19.784925 -6.276993 0.181334 -0.402622 0.836016 -0.223418 0.151377 0.134456 -3.128233 0.662186 1.185500 -2.829223 -1.517295 -0.430593 3.348774 -3.719612 0.078712 -0.382202 0.374753 -0.274060 0.383173 0.062286 -0.184350 +-13.008210 158.888672 17.714485 -8.330001 9.957185 -17.164865 -3.891643 -3.021239 -15.265197 -9.403909 0.900846 11.950698 -0.647356 0.275239 -0.131935 0.390185 0.059145 0.270892 12.436865 8.089232 5.304255 19.960138 -5.633677 43.946957 -0.261032 0.171944 0.096977 0.070410 0.127425 0.064011 5.324252 3.333356 7.641685 -4.170708 5.342016 12.541788 -8.132067 6.992322 13.855093 -4.123245 -2.979521 14.180596 15.774145 -8.761547 -15.667060 3.951105 3.313497 -2.394172 -5.163102 1.918368 -1.360538 31.343094 -18.887360 -5.635419 0.187795 -0.414962 0.818552 -0.222999 0.155543 0.139012 -3.774750 0.417719 1.397858 -4.096479 -1.912895 -0.166186 3.689137 -3.036293 0.077865 -0.369428 0.379664 -0.265328 0.392554 0.046167 -0.175291 +-13.338208 158.261139 18.312387 -7.826780 10.170585 -17.862226 -4.203766 -3.196898 -14.825809 -10.091387 1.055095 12.835079 -0.616163 0.214050 -0.131929 0.444946 0.141572 0.282222 11.478287 8.016389 5.764610 21.524401 -6.641990 44.930347 -0.284557 0.168425 0.106538 0.100806 0.095701 0.067029 4.610313 3.198848 8.023445 -4.533473 5.237597 12.838604 -8.313654 6.720548 14.093591 -4.039423 -2.456700 13.694516 15.934319 -8.169155 -16.077951 4.854856 3.296032 -2.243026 -2.315151 2.106153 -0.906347 29.448811 -17.323748 -4.749540 0.228575 -0.363391 0.802308 -0.238617 0.179106 0.169733 -3.731920 0.233858 1.292859 -5.112161 -2.066021 -0.036885 3.336510 -3.255187 0.040207 -0.364527 0.337668 -0.225992 0.367532 -0.000662 -0.160436 +-13.723080 157.632706 18.793112 -7.121253 10.531985 -18.186544 -4.260695 -3.446183 -15.352843 -11.534386 1.446088 14.706898 -0.570227 0.165423 -0.105773 0.470611 0.198730 0.283171 10.551448 7.893314 5.902022 22.302813 -7.336543 45.840302 -0.297606 0.173449 0.123018 0.116589 0.094797 0.057875 3.073220 3.358293 8.209476 -4.744444 5.136832 12.972291 -7.971725 6.424567 14.194328 -3.737944 -2.164491 13.171371 16.108210 -7.749840 -15.899817 5.731382 3.020430 -1.954063 0.465151 2.154952 -0.428763 27.217068 -16.087132 -3.961681 0.250958 -0.345510 0.771507 -0.239812 0.191843 0.200815 -3.211960 0.240280 1.175716 -6.022431 -2.161690 0.025215 3.156392 -4.088842 -0.047712 -0.349228 0.314280 -0.200142 0.370574 -0.041112 -0.134898 +-14.030610 157.259918 19.143858 -6.592206 10.240909 -19.057102 -3.434460 -3.264237 -15.230490 -13.532403 2.045304 16.499632 -0.551856 0.139127 -0.092752 0.491966 0.235377 0.289152 9.931205 7.788028 6.900056 23.022402 -7.871183 46.414806 -0.307767 0.174311 0.133989 0.129016 0.091692 0.055088 2.064168 3.528348 9.150163 -4.910594 5.235661 13.378220 -7.797083 6.389178 14.276160 -3.419210 -2.299507 12.188269 16.229305 -7.511631 -16.391148 5.789742 3.068403 -2.031269 2.835380 2.154497 -0.023702 26.051004 -16.586554 -3.816801 0.264727 -0.332984 0.760163 -0.241807 0.200023 0.219618 -2.497242 0.398254 1.184679 -6.591057 -2.424860 0.055855 3.158596 -4.734885 -0.128560 -0.347283 0.299110 -0.186866 0.372044 -0.065951 -0.124609 +-14.171595 156.933487 19.540659 -6.353044 9.415371 -19.082039 -2.199905 -2.846102 -15.510859 -15.509788 2.605154 17.334547 -0.538553 0.108959 -0.086098 0.525088 0.280027 0.303491 9.947392 7.863386 7.057430 23.056442 -7.970661 47.010242 -0.319354 0.181068 0.141923 0.149293 0.081143 0.045526 1.735502 3.752327 8.963759 -5.055427 5.500407 13.345960 -7.861662 6.612251 14.374300 -3.254130 -2.108151 12.072378 16.796209 -7.275157 -16.625864 5.668366 2.969278 -2.230520 4.069798 1.680057 0.132304 26.270441 -17.528345 -4.008077 0.289562 -0.316038 0.754805 -0.252802 0.208970 0.239755 -1.705533 0.194707 1.183935 -6.843164 -2.626917 0.219491 3.792644 -4.511384 -0.184095 -0.344831 0.281109 -0.175595 0.373390 -0.095911 -0.118615 +-14.310120 156.854355 19.641788 -6.376348 8.893342 -19.057211 -1.229423 -2.522139 -15.357548 -16.606953 2.785415 17.004843 -0.558100 0.148736 -0.103374 0.491119 0.225618 0.285350 10.435431 7.811507 7.003367 22.413446 -7.748784 47.337887 -0.314780 0.175398 0.123969 0.123129 0.088886 0.068763 1.815699 3.812340 9.163201 -5.085547 5.553216 13.219941 -7.927145 6.780885 14.084849 -3.655902 -2.285224 12.369410 16.903236 -7.623636 -16.768309 5.900065 2.361028 -2.219217 3.477397 0.895341 -0.016064 26.504028 -18.293598 -4.334065 0.266281 -0.324072 0.776435 -0.249641 0.207721 0.216053 -1.628961 0.383049 1.647285 -5.465694 -3.566809 0.060792 3.674902 -3.976267 -0.093138 -0.348287 0.304610 -0.185130 0.363247 -0.055847 -0.126876 +-14.375191 156.995682 19.562551 -6.484953 8.266230 -19.135204 -0.690552 -2.263261 -14.517349 -16.955652 2.631006 15.561074 -0.589233 0.190014 -0.115982 0.459007 0.166414 0.289427 11.040097 7.663756 7.134979 21.777348 -7.467365 47.370899 -0.304290 0.192719 0.107907 0.101133 0.093824 0.067390 2.112092 3.630659 9.536168 -5.167405 5.459273 13.233742 -8.115698 6.837215 13.866920 -4.260360 -2.236377 12.409307 17.142771 -7.847057 -17.424526 6.202000 1.857190 -2.381680 1.555007 -0.287408 -0.432220 26.827141 -18.519663 -4.659024 0.248269 -0.362111 0.807142 -0.256908 0.200660 0.182979 -1.685102 0.562694 2.063397 -3.754040 -4.032571 -0.064484 4.200025 -2.719692 0.010411 -0.349034 0.345750 -0.212681 0.377489 -0.018700 -0.147145 +-14.398546 157.302170 19.289284 -6.793901 7.878791 -19.172327 -0.803406 -2.253219 -13.635481 -15.883826 2.152753 13.820489 -0.614937 0.243773 -0.114223 0.415279 0.103309 0.258889 11.517089 7.314377 7.338673 21.419472 -7.320105 46.954151 -0.270968 0.168336 0.109150 0.085642 0.135478 0.063689 2.311306 3.393768 10.115484 -5.090553 5.254531 13.245630 -8.110356 6.662442 13.521987 -4.201078 -1.637134 11.857196 16.948696 -7.744476 -16.186363 6.481126 1.807885 -2.691044 -1.026267 -1.925356 -0.799904 26.896662 -19.123970 -5.044866 0.207140 -0.373712 0.800068 -0.226061 0.157184 0.169163 -1.534479 0.603735 1.959674 -1.537172 -3.777610 -0.342273 3.933936 -2.019085 0.079294 -0.363879 0.351008 -0.247020 0.386809 0.019835 -0.155328 +-14.439279 157.693924 18.954605 -6.986670 7.315241 -18.699711 -0.961043 -2.208764 -13.202392 -14.564507 1.686006 11.968073 -0.606289 0.250283 -0.091712 0.400672 0.092039 0.249615 11.614175 7.103593 6.981585 21.224133 -7.227644 46.577984 -0.256939 0.160631 0.123151 0.083043 0.159910 0.049123 2.201218 3.302735 10.348373 -4.909746 5.085827 13.087318 -7.856518 6.429253 13.164340 -3.938548 -1.188530 11.354896 16.469244 -7.364497 -15.220625 6.351259 1.954167 -2.725461 -3.412626 -2.873261 -0.945976 25.997648 -21.183775 -5.495074 0.192430 -0.382679 0.778344 -0.206314 0.135676 0.177166 -1.256353 0.563632 1.626116 0.892594 -3.231622 -0.653357 3.608182 -1.686814 0.105301 -0.365417 0.344464 -0.259478 0.402062 0.017901 -0.151415 +-14.365933 158.138412 18.603601 -7.495810 6.453617 -17.765280 -0.986510 -2.028461 -12.905587 -12.970312 1.166472 9.457721 -0.602859 0.255636 -0.088477 0.409610 0.092206 0.264427 12.007066 6.980643 6.232749 20.594732 -6.836505 45.949673 -0.262479 0.144549 0.119619 0.081127 0.153874 0.064547 2.632933 3.205266 10.285327 -4.560654 4.972835 12.574561 -7.589255 6.307287 12.560180 -3.681509 -1.032625 11.141140 15.622170 -6.963575 -14.742293 5.639156 1.985555 -2.895957 -6.700336 -4.034534 -1.208667 25.352171 -23.627840 -6.154997 0.188470 -0.361756 0.773928 -0.199145 0.137143 0.180202 -1.396793 0.603253 1.190646 3.956604 -2.464126 -1.092180 3.573009 -2.528329 0.078660 -0.366740 0.322445 -0.251896 0.382938 0.009540 -0.156602 +-14.356105 158.577118 18.106121 -7.891331 5.616909 -16.707088 -1.038863 -1.802781 -12.918028 -11.334343 0.765626 7.155252 -0.563200 0.216995 -0.084229 0.447742 0.145252 0.285479 12.216041 6.825730 5.474120 20.164080 -6.483178 45.036446 -0.273089 0.111050 0.121525 0.095101 0.124934 0.087404 2.341167 3.530588 10.308640 -3.887582 5.052749 12.077816 -6.654142 6.223885 11.990242 -2.464138 -1.317241 10.427986 14.437721 -6.324741 -13.786943 4.690553 2.173807 -3.396336 -9.275579 -6.174442 -1.186380 22.296011 -25.873808 -6.119763 0.196593 -0.287739 0.729604 -0.186558 0.143773 0.195417 -1.544602 0.495562 0.648046 7.137653 -1.726215 -1.438157 3.776860 -4.089069 -0.020733 -0.361225 0.253950 -0.204654 0.326911 -0.030071 -0.149602 +-14.215321 158.958664 17.503614 -8.382668 5.219317 -15.597998 -1.532654 -1.802671 -13.185382 -9.114792 0.383747 5.110231 -0.550915 0.200093 -0.096390 0.479667 0.183914 0.326947 12.052597 6.470433 4.705566 20.159279 -6.414818 43.695225 -0.290919 0.085088 0.115604 0.107265 0.084800 0.121962 2.162014 3.718744 10.174959 -3.101935 4.942400 11.654117 -5.554317 6.049561 11.634850 -0.930983 -1.712035 10.194112 12.484281 -5.139941 -13.407394 2.641463 1.490197 -4.106717 -11.139167 -7.997139 -1.177489 18.854153 -26.704941 -5.618512 0.187962 -0.247050 0.712372 -0.173090 0.168627 0.193514 -1.719518 0.568603 0.357677 10.001715 -1.212972 -1.662145 4.643026 -5.751441 -0.138964 -0.365632 0.212493 -0.169808 0.277734 -0.057646 -0.161671 +-14.037974 159.328674 16.699490 -9.027204 4.744779 -14.548042 -1.834996 -1.733656 -13.647279 -6.889219 0.114915 3.309836 -0.524321 0.135803 -0.085273 0.553670 0.280203 0.406310 11.977673 6.048143 3.933865 20.365271 -6.431501 42.296783 -0.331244 0.085103 0.126267 0.143234 0.024844 0.131496 1.957164 3.846817 10.438134 -2.151007 4.837667 11.290313 -4.242143 5.805895 11.173327 0.496606 -2.232753 9.864738 10.426703 -3.796636 -13.983381 0.913270 1.353712 -5.223752 -14.701874 -10.597493 -1.279086 15.743221 -26.208647 -4.987829 0.222932 -0.226788 0.704068 -0.182250 0.219037 0.219655 -2.448790 -0.074496 -0.085176 14.311878 -1.080026 -2.129186 3.667845 -4.527225 -0.033735 -0.359982 0.167045 -0.132422 0.252796 -0.138133 -0.169306 +-13.840364 159.646179 15.895675 -9.776383 4.059186 -13.215046 -1.823263 -1.599085 -14.620114 -4.978984 -0.023326 1.825259 -0.529056 0.102689 -0.093614 0.604510 0.347831 0.471339 12.011581 5.687165 2.887980 20.592323 -6.407331 40.697468 -0.358858 0.087499 0.127645 0.175376 -0.020692 0.138435 2.239821 3.759958 10.046341 -1.569953 4.691078 10.848043 -3.491640 5.583406 10.962569 1.769138 -2.739426 9.969313 8.666273 -2.647504 -14.892704 -1.436027 1.036598 -6.581644 -17.266937 -12.685010 -1.299336 12.923602 -25.313492 -4.355545 0.233338 -0.229518 0.706753 -0.186229 0.256771 0.223405 -1.956451 -0.521411 -1.048034 18.555513 0.041602 -2.587674 1.968000 -3.485270 0.080998 -0.366786 0.150112 -0.113797 0.244570 -0.181793 -0.185074 +-13.659189 159.917450 15.107999 -10.123203 2.627091 -12.215950 -1.639940 -1.305538 -15.035771 -3.632050 -0.074025 0.244632 -0.534666 0.068475 -0.135518 0.653835 0.406840 0.544688 11.738663 5.458891 2.501002 20.946465 -6.356446 39.155716 -0.397137 0.095535 0.097983 0.195685 -0.101240 0.171619 1.958084 3.950155 9.993382 -0.962064 4.607348 10.527426 -2.480434 5.447578 10.744049 2.818562 -3.179649 10.169446 6.974784 -1.446680 -16.642561 -3.630328 0.799495 -7.603771 -20.407801 -13.888970 -1.456517 10.679452 -25.084690 -4.031521 0.245982 -0.205878 0.723671 -0.209876 0.315023 0.196766 -1.488651 -0.430521 -1.875865 22.543802 1.385357 -2.937092 1.078595 -2.840028 0.137294 -0.361989 0.138753 -0.073214 0.198053 -0.206707 -0.210380 +-13.508257 160.085754 14.418826 -9.921177 0.429309 -11.025945 -1.522462 -1.031967 -15.446438 -2.604009 -0.066624 -1.350608 -0.555501 0.070501 -0.159216 0.671909 0.421145 0.586737 11.004803 5.515843 1.924380 21.285566 -6.297642 38.132904 -0.417411 0.086992 0.081938 0.203967 -0.137504 0.195586 0.761206 4.727621 9.494501 -0.323004 4.765357 10.057901 -1.034976 5.567124 10.391333 4.051054 -3.483506 10.728874 5.551555 -0.387897 -17.001297 -5.892351 -0.022687 -8.610061 -23.867548 -15.246643 -1.548837 8.653895 -23.296774 -3.633492 0.236323 -0.202818 0.742190 -0.208958 0.342896 0.180671 -0.240737 -0.049205 -2.362751 25.758085 2.082410 -3.302260 -0.158863 -2.434607 0.179976 -0.372734 0.132387 -0.065850 0.173663 -0.213200 -0.236007 +-13.336955 160.173843 13.622364 -9.872581 -1.958033 -10.419094 -0.974630 -0.763192 -15.773066 -2.127169 -0.062394 -2.083020 -0.560238 0.034634 -0.186074 0.720761 0.474156 0.653326 10.591419 5.524019 1.835879 21.385736 -6.156803 37.283363 -0.453897 0.104719 0.068437 0.220656 -0.200710 0.214201 0.246868 5.133430 9.404133 0.160709 4.869890 9.934151 -0.075491 5.603343 10.382166 4.942047 -3.348382 11.450862 4.746633 0.889198 -18.371925 -8.541239 -1.717255 -8.951467 -26.295155 -15.325187 -1.916689 7.033906 -22.497637 -3.423249 0.259060 -0.195746 0.771228 -0.234239 0.395154 0.169499 1.956504 1.080357 -2.437992 27.462528 2.755091 -3.295211 1.043740 -0.479981 0.071965 -0.369953 0.129946 -0.040088 0.145705 -0.245095 -0.259321 +-13.137746 160.093826 12.730692 -9.647944 -4.717923 -9.603690 -0.181527 -0.592949 -16.732410 -1.922405 -0.060226 -2.180478 -0.573406 0.038840 -0.196856 0.735534 0.484681 0.678446 10.065540 5.806950 1.165645 21.006548 -5.907564 37.174519 -0.467924 0.109972 0.061205 0.226874 -0.214063 0.225854 0.004381 5.561260 9.440401 0.346306 5.146581 9.712429 0.378251 5.841915 10.135528 5.383222 -2.770237 11.409024 4.639002 1.752362 -19.222498 -10.953382 -3.305969 -9.397245 -28.514326 -15.637279 -2.164821 5.665021 -21.511124 -3.250450 0.255333 -0.198069 0.789267 -0.239079 0.411382 0.162711 4.930441 1.781448 -2.727591 28.419796 3.227601 -3.387752 2.119611 1.880615 -0.043422 -0.377108 0.135304 -0.039138 0.142840 -0.247318 -0.272967 +-12.888702 159.950317 11.690556 -9.435866 -8.336448 -9.044202 1.072722 -0.350759 -17.867008 -1.701352 -0.055423 -1.565981 -0.570078 0.044278 -0.202251 0.739645 0.484156 0.699613 9.642530 6.390440 0.401400 20.297215 -5.556819 37.873341 -0.471934 0.105642 0.053451 0.223669 -0.227152 0.241272 -0.511208 6.070325 9.962725 0.767912 5.388580 9.476942 1.170743 6.043721 9.625716 5.392399 -2.009586 11.325860 3.590637 2.672496 -19.259977 -13.122442 -4.297865 -9.679485 -31.407284 -15.839343 -2.294109 4.222370 -20.115103 -3.025065 0.243795 -0.190079 0.785190 -0.234021 0.419163 0.151603 6.907000 2.738156 -3.273437 29.183681 4.394856 -3.306818 3.386668 3.407023 -0.105924 -0.373941 0.129223 -0.029048 0.126487 -0.248216 -0.281648 +-12.545887 159.692703 10.750896 -9.579888 -12.482688 -8.710219 3.218583 0.164389 -18.823792 -2.294463 -0.039032 -0.200836 -0.598475 0.079064 -0.198656 0.732407 0.456978 0.723299 9.919378 7.204762 -0.242160 19.012878 -4.946747 39.071743 -0.475799 0.115121 0.048912 0.220032 -0.218750 0.240670 -0.197150 6.413641 10.692559 1.198683 5.700399 9.260411 1.581454 6.399115 9.084744 4.879220 -0.716920 11.851513 2.745705 3.679646 -19.395247 -14.985984 -5.263210 -9.868348 -34.493706 -16.091789 -2.213836 2.355788 -18.341587 -2.734648 0.228040 -0.232483 0.813469 -0.231168 0.422047 0.142613 8.582987 3.859685 -4.011241 30.194662 5.973421 -3.219791 5.035597 4.872182 -0.108568 -0.381901 0.153516 -0.057304 0.151473 -0.238224 -0.301722 +-12.277743 159.336380 9.788832 -9.621915 -16.257168 -8.492223 5.581728 0.548239 -20.448727 -3.441711 0.032108 2.765704 -0.649798 0.130821 -0.215174 0.719918 0.422466 0.749807 10.243298 7.870256 -0.881705 17.446238 -4.341547 40.453072 -0.475809 0.117225 0.036306 0.219003 -0.215250 0.248608 -0.015302 6.352480 11.665519 1.357820 5.650978 9.115265 1.721152 6.421092 8.623117 4.457086 0.846030 12.155046 1.287119 5.082987 -20.030216 -17.033148 -6.029000 -10.108616 -36.442879 -16.019316 -2.198514 0.349033 -17.851665 -2.506887 0.191687 -0.277205 0.846225 -0.221250 0.421904 0.114733 10.546683 5.033948 -5.614567 31.639616 8.637599 -3.017914 5.724503 4.252343 -0.080797 -0.403582 0.184758 -0.088853 0.172117 -0.208333 -0.334773 +-11.929791 159.047577 8.945885 -9.481879 -19.985016 -8.062796 7.796534 0.922420 -22.435055 -4.939568 0.209307 6.174063 -0.666812 0.146424 -0.223765 0.715919 0.420337 0.742581 10.370801 8.495475 -1.841652 15.481376 -3.582494 41.885983 -0.477879 0.133934 0.034691 0.222963 -0.202073 0.244527 0.551531 6.038683 12.324843 1.319908 5.570701 8.872602 1.483746 6.370450 8.112102 2.867787 3.224009 13.106088 1.354752 5.982525 -20.309654 -17.359308 -6.610505 -9.838503 -39.501263 -15.943443 -2.191265 -0.601712 -17.903221 -2.519135 0.184742 -0.308019 0.863673 -0.226122 0.426409 0.110598 12.392279 6.264670 -7.094346 34.072922 11.061261 -2.913743 5.914622 3.737904 -0.079236 -0.407806 0.217524 -0.100409 0.201589 -0.189231 -0.333620 +-11.448876 158.742737 8.197535 -9.274545 -23.175203 -7.785938 10.007998 1.131527 -24.849091 -7.023811 0.599764 11.149457 -0.670079 0.126128 -0.241967 0.755516 0.456824 0.790589 10.364804 8.819472 -2.587156 13.743673 -2.977644 42.937664 -0.504013 0.154947 0.017147 0.238442 -0.243901 0.249530 1.156577 5.539341 13.141547 1.230909 5.455766 8.570706 1.167110 6.250221 7.549374 1.922059 5.131760 14.335105 0.781624 7.218653 -20.829351 -18.412113 -7.918836 -9.608155 -42.011936 -16.222061 -2.262578 -0.726578 -18.261301 -2.653229 0.212447 -0.302836 0.886735 -0.255388 0.460646 0.105881 13.953840 7.823244 -8.118277 36.925816 13.004215 -2.746341 5.865743 3.119009 -0.091559 -0.395417 0.217486 -0.086116 0.191793 -0.209862 -0.346154 +-10.889590 158.517548 7.413692 -8.762495 -25.924629 -7.754950 12.031774 1.131276 -27.485889 -9.645499 1.328093 17.197067 -0.687709 0.119248 -0.266042 0.790041 0.496253 0.813684 9.943075 9.045139 -3.406051 12.187231 -2.537788 44.153786 -0.521947 0.165835 0.006951 0.262374 -0.262313 0.254600 1.589427 5.226251 13.705013 1.158972 5.452733 8.432469 0.979250 6.246717 7.334709 1.036815 6.983210 15.751721 0.984053 8.138221 -21.077276 -19.032856 -10.142715 -9.630461 -44.503723 -17.551111 -1.831762 -1.091477 -17.844158 -2.690248 0.223094 -0.304052 0.905518 -0.270287 0.482230 0.104549 16.070225 9.397329 -8.833432 38.891705 14.483012 -2.578414 5.835265 2.930105 -0.111479 -0.401666 0.223817 -0.077578 0.196082 -0.214703 -0.351749 +-10.229075 158.476227 6.629466 -7.816001 -28.115036 -8.147283 13.419366 0.693598 -29.869659 -12.206682 2.305882 23.625994 -0.696405 0.056317 -0.297852 0.873517 0.614997 0.858728 8.771408 9.046077 -4.187751 11.085727 -2.365952 45.094135 -0.574014 0.196291 -0.001958 0.317981 -0.319456 0.255461 1.554944 5.041385 14.371879 1.189048 5.416692 8.521784 1.147369 6.143015 7.442298 -0.194363 8.499720 17.237143 0.886822 8.808413 -22.982040 -19.039608 -12.887521 -9.880662 -47.570629 -19.674337 -0.998168 -1.062973 -16.635492 -2.707341 0.277885 -0.302164 0.934549 -0.316259 0.547239 0.123153 17.732674 11.242092 -9.265613 40.413792 15.682255 -2.383039 6.131542 3.302848 -0.129522 -0.402671 0.227531 -0.042700 0.206322 -0.256617 -0.345801 +-9.636073 158.571884 6.016896 -6.691835 -30.089706 -8.750011 14.670211 0.031095 -31.673883 -14.979071 3.596771 29.695944 -0.718236 0.024334 -0.335466 0.932299 0.690109 0.911402 7.233939 8.810682 -4.688260 10.272268 -2.388019 45.652504 -0.609610 0.214794 -0.014848 0.356029 -0.372964 0.264123 1.305026 4.891948 14.583576 1.154468 5.291867 8.657742 1.334564 5.993772 7.777369 -0.631232 9.540623 18.960327 0.130144 9.759798 -24.206102 -19.518185 -15.832146 -10.050529 -49.407986 -21.665363 -0.200329 -1.556772 -16.551971 -2.694484 0.300610 -0.307333 0.961227 -0.342373 0.596212 0.118353 19.362965 13.120638 -9.314664 41.827682 16.515898 -2.339788 6.624511 4.969577 -0.176897 -0.410893 0.233801 -0.019914 0.203498 -0.279153 -0.359809 +-9.108415 158.779251 5.573061 -5.477449 -32.075066 -9.677759 15.671294 -0.764595 -32.850010 -17.560083 5.196311 35.689594 -0.738064 0.006293 -0.366415 0.974487 0.741309 0.969742 5.625000 8.470283 -4.934976 9.352080 -2.374818 46.169750 -0.639899 0.225438 -0.028207 0.380821 -0.420701 0.278680 0.932556 4.851438 14.410307 1.086872 5.197838 8.903420 1.533651 5.888756 8.391475 -0.234748 10.003583 20.866310 -1.149614 10.969938 -25.009699 -20.286894 -18.609407 -10.178786 -50.358410 -23.728495 0.546397 -2.814398 -17.875938 -2.616239 0.304100 -0.318012 0.982428 -0.353601 0.639846 0.105693 20.621862 14.892151 -9.138578 43.287216 17.228731 -2.406753 7.340977 7.993001 -0.253480 -0.419112 0.238936 -0.002798 0.194605 -0.297183 -0.381385 +-8.505656 159.232880 5.093085 -4.275481 -34.218761 -10.699747 16.894588 -1.436849 -33.462967 -20.510601 7.126741 40.893337 -0.768753 0.000108 -0.398985 0.997171 0.765775 1.027212 4.422439 8.145576 -5.102117 7.808385 -1.992654 46.386856 -0.658558 0.243981 -0.047508 0.397433 -0.464001 0.280237 0.548574 4.702779 14.729568 0.978264 5.056152 9.099132 1.566480 5.795266 8.751904 0.091444 10.723618 22.479464 -2.354585 12.248425 -26.003216 -21.443880 -21.453941 -10.138045 -50.662258 -25.681345 1.116512 -3.489121 -19.547783 -2.630942 0.300990 -0.345499 1.008927 -0.366877 0.671679 0.076758 22.205805 16.651075 -9.074614 43.962494 18.337772 -2.364227 8.833105 11.021660 -0.203839 -0.423237 0.258786 -0.003379 0.194872 -0.300714 -0.411882 +-7.834593 159.966415 4.643678 -1.882970 -36.433475 -12.618097 16.977129 -2.366022 -33.195255 -23.068577 9.127148 45.066254 -0.826644 0.006783 -0.446866 1.016415 0.779554 1.082392 2.403907 7.729887 -4.978648 5.499464 -1.208755 46.202560 -0.680634 0.256667 -0.071243 0.415049 -0.514808 0.288189 -0.894960 5.008406 14.773674 0.728998 4.814317 9.539832 1.880666 5.625733 9.502871 0.481985 11.132852 24.406157 -3.963163 13.447228 -27.493416 -21.919958 -24.452873 -9.874481 -50.519382 -27.605021 1.394769 -3.481914 -22.680683 -2.919984 0.293171 -0.381413 1.057725 -0.381508 0.706927 0.039973 23.551392 19.155375 -8.678759 44.427933 19.475800 -2.534384 10.078039 14.917957 -0.136241 -0.443249 0.286654 -0.014468 0.192930 -0.291066 -0.456353 +-7.165162 160.793503 4.283707 0.238823 -39.238861 -14.378939 17.246164 -2.741065 -32.197899 -25.600136 11.241257 48.281536 -0.828927 -0.003474 -0.459932 1.046581 0.800791 1.133092 0.858499 7.428174 -4.730891 3.079095 -0.211007 45.367607 -0.697090 0.261287 -0.081477 0.423085 -0.556403 0.300455 -1.830559 5.288857 14.921275 0.611014 4.816435 9.875745 2.063020 5.651507 9.983761 0.213365 11.375553 25.710402 -5.501446 14.038312 -27.795765 -22.714998 -26.952948 -9.265451 -49.609154 -29.469955 1.793366 -5.268327 -26.537363 -2.625034 0.303896 -0.376783 1.066818 -0.392220 0.732552 0.031906 24.831026 21.618864 -8.144290 43.932644 20.646214 -2.517233 12.358344 18.527437 0.213746 -0.438089 0.275954 0.001273 0.171888 -0.312142 -0.473910 +-6.430449 161.606766 3.940396 1.876936 -41.408436 -15.453056 17.315481 -3.309673 -31.762228 -27.458036 13.012508 51.162342 -0.853230 0.017257 -0.470488 1.040103 0.791094 1.137349 -0.158021 6.884166 -4.704592 0.910457 0.515511 44.064404 -0.694193 0.252056 -0.086085 0.427463 -0.553359 0.303073 -2.211656 5.232605 14.399217 0.448939 4.656695 10.410739 2.072017 5.548632 10.922960 0.120679 12.149110 26.049734 -6.363546 14.769971 -28.047478 -21.885748 -28.814566 -8.885612 -49.217857 -31.430677 2.167693 -6.195895 -32.240715 -2.587411 0.283281 -0.386881 1.072084 -0.381140 0.727265 0.021449 25.270052 23.226330 -8.199663 44.350948 22.273361 -2.195814 15.428885 21.894342 0.860539 -0.452317 0.280859 -0.011759 0.177549 -0.297239 -0.487329 +-5.631417 162.491837 3.606476 3.008605 -43.793907 -16.128222 17.358213 -3.807299 -31.181992 -28.127312 14.355082 54.328346 -0.875380 0.030412 -0.478622 1.045152 0.801579 1.140562 -0.503042 6.345408 -4.653802 -1.238565 1.208363 42.467804 -0.696775 0.241634 -0.084501 0.439878 -0.545771 0.308435 -1.805209 4.923957 13.687533 0.194250 4.627897 11.082767 1.639677 5.581228 12.179871 0.086009 13.153048 25.982771 -7.032184 15.516168 -28.798433 -20.668625 -30.623541 -8.528894 -48.476280 -33.652847 2.571884 -6.499969 -39.004627 -2.637658 0.265644 -0.395420 1.076154 -0.369095 0.727069 0.020652 25.220594 24.555351 -8.555973 45.347664 24.207422 -1.781312 18.345381 25.557941 1.650612 -0.470212 0.284291 -0.019050 0.188891 -0.289525 -0.492938 +-4.759070 163.480988 3.296902 4.000474 -46.216972 -16.110279 17.041389 -4.012347 -30.829884 -27.407703 15.105681 57.414116 -0.887821 0.055647 -0.475868 1.036110 0.781297 1.144281 -0.706903 5.986824 -5.174107 -3.264966 1.854724 40.227932 -0.678233 0.208492 -0.083553 0.442425 -0.537517 0.310133 -1.355690 4.766460 12.246209 0.064123 4.615983 11.587502 1.463282 5.535231 13.488696 0.044245 13.203000 25.498465 -8.423624 15.900200 -28.055286 -19.438356 -31.717064 -8.047983 -47.874111 -35.727654 3.130935 -5.793884 -45.148911 -2.987562 0.240502 -0.379545 1.054626 -0.341293 0.699712 0.016981 24.315844 26.448877 -8.999475 46.777725 26.329975 -0.899163 20.277107 27.449997 2.255914 -0.482816 0.254171 -0.031246 0.175106 -0.286093 -0.505863 +-3.919379 164.453705 3.035330 4.618347 -47.894962 -15.853466 15.937125 -4.265170 -30.084673 -25.190874 14.861521 60.253738 -0.912246 0.125652 -0.456237 1.006235 0.737047 1.116181 -0.879146 5.668768 -5.506497 -4.686450 2.204998 37.523163 -0.653045 0.161770 -0.074532 0.440689 -0.471368 0.322588 -0.624978 4.708740 10.677910 0.049026 4.637609 12.178946 1.260018 5.524060 14.939481 0.318657 13.213214 24.626966 -8.532291 16.065853 -26.863483 -17.165804 -32.795708 -7.951488 -47.850529 -38.542503 4.630060 -4.767030 -50.241539 -3.444657 0.179878 -0.383156 1.032963 -0.286382 0.654024 0.025608 22.603704 27.744493 -9.898866 47.679058 28.825258 0.351815 22.340576 29.293272 3.080029 -0.514913 0.238386 -0.062805 0.193268 -0.259166 -0.505391 +-3.137157 165.394684 2.850589 4.788627 -49.274307 -15.089492 14.558990 -4.433570 -29.314163 -22.124289 14.005825 63.133274 -0.924392 0.175187 -0.438430 0.987270 0.716609 1.096602 -0.808694 5.284151 -5.709283 -5.983040 2.418431 33.917595 -0.626072 0.105059 -0.069825 0.452400 -0.421861 0.330248 0.304352 4.579569 8.491406 0.017570 4.591809 12.866518 1.035248 5.328427 16.938099 0.759341 12.989155 23.195707 -9.210006 16.262569 -25.678915 -14.440363 -33.361832 -8.051211 -47.944576 -41.797501 6.582096 -2.172716 -55.054985 -4.706615 0.125628 -0.361458 0.986659 -0.230048 0.607496 0.035212 20.547213 28.646639 -11.131923 49.223793 31.833120 1.986602 23.129206 31.748959 3.673123 -0.540090 0.195796 -0.082153 0.195005 -0.248516 -0.502579 +-2.406451 166.210403 2.752489 4.892838 -50.037384 -14.225322 12.903289 -4.695079 -28.256201 -18.902647 12.606822 65.083183 -0.925088 0.253884 -0.412462 0.926391 0.644968 1.054169 -1.135631 4.860869 -5.757716 -6.393168 2.246193 30.598225 -0.577139 0.020560 -0.068196 0.435293 -0.348041 0.354351 0.982351 4.503106 6.147602 0.095033 4.374615 13.454057 1.047192 4.932051 18.879015 1.807042 12.452356 21.543949 -10.254242 16.826929 -23.443832 -11.566036 -33.395061 -8.345017 -48.071400 -45.383736 9.172027 0.914795 -58.477112 -6.211321 0.032111 -0.325246 0.915370 -0.141573 0.534780 0.029169 17.950436 28.770397 -12.194605 50.850979 34.642761 3.826443 24.424410 36.040520 4.733373 -0.563204 0.142196 -0.103941 0.173594 -0.213898 -0.499864 +-1.741199 166.936127 2.686651 4.567204 -50.538330 -13.126105 11.204014 -4.747783 -26.838512 -15.149994 10.656993 66.579414 -0.955702 0.338249 -0.397941 0.896324 0.602005 1.037689 -1.304852 4.599656 -5.750942 -6.092016 1.940378 27.872324 -0.541907 -0.065016 -0.068236 0.442993 -0.283998 0.381872 1.818287 4.337660 3.753734 0.135362 4.067211 14.070420 0.972161 4.424769 21.120447 2.898300 12.165617 19.755478 -11.424712 17.272381 -22.140577 -7.813501 -32.500191 -9.049336 -48.975452 -48.780499 11.931283 7.332956 -61.042088 -10.123203 -0.059005 -0.298473 0.863049 -0.057371 0.473225 0.026906 14.149646 28.324905 -13.783198 53.313660 38.319782 6.839855 24.272905 40.452888 5.504963 -0.606896 0.087924 -0.130276 0.163959 -0.187855 -0.508663 +-1.116850 167.522873 2.557625 4.297440 -51.116196 -12.040836 9.675473 -4.519208 -24.997295 -11.616341 8.511946 66.435524 -0.962903 0.379689 -0.370564 0.886650 0.604063 1.012242 -1.389569 4.485321 -5.933987 -5.458545 1.680303 25.809126 -0.510909 -0.126777 -0.052937 0.470299 -0.222756 0.380826 2.431949 4.417589 1.790206 0.288639 4.008914 14.463243 1.102686 4.126750 22.880022 3.484895 12.243679 17.819023 -11.681596 17.269367 -21.005154 -4.042046 -31.650074 -9.746116 -50.608727 -51.772160 14.626603 15.499710 -60.727291 -15.139826 -0.112405 -0.276126 0.800831 0.006442 0.420169 0.050234 11.013492 27.429026 -14.641417 54.557671 41.780724 9.835437 22.937544 46.543819 6.112786 -0.636364 0.035755 -0.149238 0.177622 -0.189456 -0.494775 +-0.541391 167.898407 2.453864 4.361744 -51.434917 -11.054779 7.878354 -3.735228 -23.162697 -7.941105 6.429951 65.177292 -0.949777 0.437757 -0.329240 0.861100 0.597817 0.944796 -1.804626 4.502451 -6.149775 -4.466592 1.429586 23.820765 -0.463412 -0.216011 -0.034420 0.493983 -0.121902 0.390823 2.997385 4.571626 -0.257583 0.370569 4.035855 14.711700 1.023057 3.951723 24.626509 3.914071 12.578932 15.228978 -11.110199 16.875650 -18.752180 -0.743901 -30.664396 -10.028459 -52.518311 -55.049278 18.219839 24.426231 -60.330238 -20.521482 -0.187869 -0.222364 0.699917 0.095241 0.339233 0.084744 8.055830 26.482649 -14.916796 54.994991 46.488121 13.880345 15.687236 53.654606 3.903935 -0.666761 -0.038188 -0.158363 0.186500 -0.177474 -0.454581 +-0.017238 168.023041 2.402568 3.871042 -52.003544 -9.528176 6.709861 -2.892868 -20.983067 -4.907027 4.673044 62.769791 -0.954610 0.534384 -0.294666 0.822020 0.562186 0.882944 -1.723489 4.555834 -6.583753 -3.497004 1.180878 22.104990 -0.413836 -0.329201 -0.024414 0.506356 -0.010320 0.427512 3.750002 4.468297 -2.291674 0.330457 3.861936 14.705108 0.769654 3.718451 26.160660 4.599025 13.089343 12.731689 -11.231078 17.006748 -16.437872 2.541770 -28.768927 -10.236218 -55.160057 -57.955772 22.532944 33.399292 -59.995354 -26.060850 -0.301763 -0.163693 0.600793 0.208210 0.250513 0.104402 4.048083 25.138454 -15.242782 57.143761 51.430218 19.309547 2.892658 58.712181 -2.700378 -0.714362 -0.116505 -0.171942 0.181699 -0.144272 -0.429184 +0.539191 168.027603 2.341322 3.245795 -52.347149 -8.080647 5.777129 -2.232229 -18.337067 -2.540280 3.240963 59.102299 -0.965928 0.613875 -0.258828 0.786637 0.532197 0.849030 -1.567415 4.424007 -6.680613 -2.641161 0.928540 19.995281 -0.369216 -0.409351 -0.008863 0.520865 0.082009 0.440413 4.445382 4.289368 -3.820657 0.398321 3.613709 14.689941 0.682775 3.432298 27.302216 4.940606 13.312265 10.404421 -11.891983 17.157036 -14.969582 5.120941 -26.997736 -10.015025 -56.990723 -60.259449 26.320190 43.209087 -60.279366 -32.511528 -0.399214 -0.149394 0.521621 0.303220 0.178195 0.117346 0.246590 24.085421 -15.501101 58.610477 55.349571 24.087618 -9.708085 61.525383 -10.294286 -0.753909 -0.165854 -0.198434 0.200387 -0.123885 -0.415817 +1.014935 167.862869 2.262209 2.580691 -52.641598 -6.906631 5.184370 -1.621103 -14.734839 -0.888774 2.226668 54.012791 -0.958989 0.669210 -0.238241 0.763504 0.529607 0.816491 -1.240811 4.195116 -6.455062 -2.224697 0.781500 17.749666 -0.338735 -0.486533 -0.007768 0.538846 0.153963 0.468239 5.080504 4.268611 -5.177485 0.521450 3.463481 14.743793 0.583985 3.059003 28.372547 5.678744 13.514594 8.482979 -12.038959 17.624033 -13.800121 7.956075 -25.593958 -9.929939 -56.198639 -63.232788 29.245718 51.822342 -58.840752 -37.121258 -0.487091 -0.106499 0.436747 0.386674 0.126779 0.125656 -2.841308 22.841391 -15.862072 60.078983 58.608681 28.536282 -20.106514 61.781517 -16.742739 -0.780824 -0.222018 -0.197245 0.195458 -0.107803 -0.393776 +1.574889 167.596359 2.205952 1.446637 -52.762737 -5.367519 5.059177 -1.391165 -10.710621 0.018047 1.433262 47.472149 -0.977717 0.731497 -0.225167 0.720070 0.485519 0.777411 -0.809864 3.966638 -6.352109 -2.113040 0.665520 15.869721 -0.305485 -0.549534 -0.004019 0.538197 0.215648 0.482522 5.767570 3.989911 -6.267773 0.639618 3.058176 14.700214 0.619620 2.579630 28.883720 6.159400 13.960284 7.362110 -12.458116 18.283043 -12.751431 10.052903 -24.351517 -9.480057 -53.699905 -64.759018 29.512980 58.553856 -56.511219 -40.093899 -0.560956 -0.092764 0.394651 0.453986 0.074504 0.123734 -6.371673 21.826117 -16.047449 60.999523 61.296791 32.375477 -28.739771 61.659569 -22.103241 -0.812228 -0.251972 -0.224097 0.195156 -0.076674 -0.393788 +2.122991 167.238693 2.187022 0.313755 -52.490204 -3.947927 4.938060 -1.299505 -6.705627 0.775312 0.735472 40.713821 -0.969301 0.772447 -0.194572 0.698240 0.467648 0.746544 -0.394179 3.708625 -6.110442 -1.957030 0.565109 14.122602 -0.279853 -0.608436 0.003066 0.544972 0.274963 0.493684 6.583023 3.607448 -7.297063 0.777250 2.633056 14.704673 0.659450 2.071916 29.388580 6.446123 14.108173 6.241909 -12.469319 18.545872 -11.315546 11.498991 -23.173052 -8.540711 -50.360516 -65.460114 28.249987 66.244225 -53.850945 -43.499607 -0.610585 -0.062093 0.339693 0.511628 0.028498 0.142019 -10.072805 20.962786 -16.156094 60.228111 63.554401 34.681648 -37.216831 61.106831 -27.350290 -0.827337 -0.300907 -0.235957 0.192610 -0.073424 -0.377537 +2.693966 166.916077 2.238712 -1.309960 -50.965702 -2.402592 5.175356 -1.478482 -2.685783 1.809810 -0.111490 33.517467 -0.961846 0.803516 -0.183226 0.676091 0.450051 0.720657 0.021776 3.442335 -5.737654 -1.272760 0.363422 12.778367 -0.264133 -0.651729 0.003701 0.540997 0.309819 0.515863 7.776382 2.774622 -8.128393 0.951592 1.749423 14.789710 0.656776 1.213658 29.835453 6.426330 14.210180 5.425530 -12.987343 18.695934 -10.650862 11.861858 -22.243177 -7.641180 -47.053417 -65.694344 26.514828 71.933510 -51.484486 -45.556492 -0.654173 -0.038133 0.300737 0.553796 0.003786 0.145219 -12.953259 19.873320 -16.167242 58.951290 65.573540 36.233543 -44.506298 60.223156 -31.614584 -0.837967 -0.328028 -0.232760 0.180454 -0.059542 -0.365360 +3.344231 166.516556 2.275648 -2.831777 -49.371227 -0.856844 5.602200 -1.604262 0.739984 3.104707 -0.801787 26.816574 -0.944391 0.822720 -0.162772 0.665852 0.444867 0.702334 0.268972 3.304372 -5.801988 -0.497117 0.202136 11.966423 -0.246493 -0.682495 0.009563 0.543759 0.344848 0.522821 8.932507 1.857474 -8.854094 1.053901 0.813424 14.744324 0.536229 0.242072 30.082453 6.469250 14.160932 4.716728 -12.887718 18.627659 -9.715234 11.906597 -21.417625 -6.675105 -44.719986 -65.960693 25.528608 77.199326 -49.268978 -47.273605 -0.682575 -0.014174 0.256794 0.586916 -0.024312 0.156279 -15.117030 18.801651 -16.190924 58.871418 67.275948 38.253052 -49.385948 58.973614 -34.156399 -0.840701 -0.358036 -0.229551 0.177425 -0.059580 -0.348875 +4.088347 166.135605 2.221860 -3.789623 -47.718605 0.243229 5.992908 -1.589058 3.621816 3.787888 -1.090564 20.618830 -0.964842 0.858817 -0.154754 0.645432 0.425519 0.680821 0.050851 3.428034 -6.595347 0.510630 0.033225 12.253393 -0.233086 -0.715098 0.009229 0.550480 0.381367 0.525954 9.625408 0.879968 -9.279586 1.091767 -0.226128 14.730681 0.445644 -0.853653 30.219864 6.392773 14.505769 3.931043 -13.087815 18.835524 -9.332656 12.099916 -20.844944 -6.184596 -40.841709 -66.085686 23.457973 80.984131 -47.533329 -48.129200 -0.718396 -0.016723 0.242627 0.619485 -0.050645 0.158796 -16.214434 17.959436 -16.351107 59.169277 69.208435 40.529335 -52.380905 57.442654 -35.167660 -0.861407 -0.370403 -0.252081 0.189459 -0.042917 -0.348726 +4.813396 165.871536 2.114463 -4.114263 -46.526340 0.768420 6.077905 -1.426612 6.019614 4.207882 -1.172302 15.388182 -0.975140 0.885805 -0.149485 0.645791 0.427648 0.698457 -0.542137 3.532210 -7.431653 1.385947 -0.112376 12.560043 -0.226389 -0.739483 0.003196 0.564623 0.395839 0.535510 9.543374 0.233090 -9.648150 1.246564 -0.986023 14.809028 0.725695 -1.763279 30.628012 6.600634 14.256324 3.307508 -13.710839 18.911345 -9.298841 12.732289 -19.973492 -6.519726 -38.631401 -67.696899 23.152399 80.889015 -45.741447 -46.305912 -0.753440 -0.017552 0.219062 0.648916 -0.061414 0.154361 -17.137726 16.946499 -16.522482 59.544132 70.997849 42.608353 -55.432217 55.552082 -36.067253 -0.873225 -0.388853 -0.257990 0.192265 -0.045149 -0.353095 +5.533974 165.746384 2.075864 -4.566462 -45.609764 1.454927 6.405031 -1.199720 7.733717 4.191383 -1.094135 11.088933 -0.992532 0.917020 -0.145568 0.636329 0.416415 0.697439 -0.942615 3.576872 -8.171201 2.072731 -0.253487 12.510178 -0.216528 -0.763465 0.004822 0.570931 0.418819 0.542791 9.632628 -0.336958 -9.938972 1.325083 -1.658846 14.787740 0.885473 -2.586810 30.807547 6.838702 14.095219 2.803681 -14.081438 18.978403 -9.149955 12.765807 -19.520563 -6.676977 -36.691902 -68.672310 22.575163 80.770302 -44.505062 -44.939026 -0.789069 -0.023248 0.205625 0.678495 -0.078759 0.151664 -17.390558 16.595470 -16.580105 61.515057 72.139572 45.213779 -56.794827 53.990479 -36.097549 -0.893428 -0.397582 -0.270697 0.199780 -0.035105 -0.358478 +6.182292 165.742096 2.022618 -4.448292 -45.172607 1.775614 6.603162 -0.842956 8.960481 3.519059 -0.881249 7.358668 -1.002064 0.928626 -0.132967 0.648525 0.432218 0.700545 -1.366270 3.568439 -8.801847 2.040270 -0.265983 12.231169 -0.217740 -0.772941 0.017745 0.587647 0.440070 0.540895 9.359339 -0.615042 -10.195879 1.330779 -1.990932 14.762650 0.993268 -3.045335 30.958542 7.037008 13.999804 2.575595 -13.990031 18.902618 -9.162629 12.861414 -19.338072 -6.997868 -36.704880 -69.690643 23.087234 79.349464 -43.535240 -43.198849 -0.798091 -0.034187 0.201807 0.693341 -0.083715 0.170899 -16.809072 16.337109 -16.476202 63.666771 72.694939 47.586052 -57.554092 53.302601 -36.181171 -0.909447 -0.403617 -0.280776 0.221884 -0.045928 -0.354175 +6.931452 165.857742 2.042048 -4.524076 -45.471512 2.415572 6.684500 -0.525990 9.548419 2.799656 -0.689551 4.551904 -0.998985 0.917826 -0.125861 0.647533 0.435453 0.706568 -1.552945 3.579619 -9.558947 1.619832 -0.219466 11.813200 -0.221203 -0.750366 0.023462 0.587641 0.438556 0.524521 9.622713 -0.744724 -10.239721 1.259315 -2.083407 14.659130 0.779097 -3.142443 30.788919 7.092689 13.957775 2.779118 -13.979992 18.911421 -9.485190 12.599025 -19.564396 -7.049825 -37.936455 -69.937202 23.966663 78.551476 -43.408169 -42.624744 -0.784627 -0.061749 0.212402 0.681619 -0.073988 0.175305 -16.565708 16.180525 -16.328308 65.363434 72.428841 48.807285 -58.076004 53.666645 -36.776566 -0.900515 -0.383453 -0.289668 0.243410 -0.053883 -0.352447 +7.675751 166.100204 2.070122 -4.128090 -45.772118 2.760961 6.582593 -0.288415 9.202554 1.806580 -0.502180 3.280814 -1.007232 0.934264 -0.125298 0.618597 0.400284 0.699762 -1.928900 3.487741 -10.127186 0.726737 -0.150823 10.941847 -0.214101 -0.738840 0.025129 0.568147 0.448070 0.520274 9.418840 -0.749399 -10.224453 1.178980 -2.105778 14.525285 0.775315 -3.132056 30.578533 7.119805 13.919209 2.932585 -14.344238 19.053808 -9.693613 12.580996 -20.104471 -7.008117 -41.190720 -69.969582 25.981901 78.363060 -43.288658 -42.714020 -0.801493 -0.093635 0.223122 0.685947 -0.077671 0.159990 -16.251534 16.404156 -16.139996 67.353638 71.347771 49.360287 -58.352673 54.922142 -37.832985 -0.901637 -0.353418 -0.304566 0.257814 -0.031979 -0.360226 +8.448124 166.301224 2.234575 -4.153297 -46.296391 3.781082 6.706800 -0.174174 8.164332 0.664245 -0.338887 2.763365 -0.968317 0.904292 -0.121538 0.613074 0.398732 0.685733 -2.018538 3.354179 -10.796198 -0.126673 -0.113046 9.494903 -0.217796 -0.735774 0.029467 0.544810 0.431228 0.531432 9.976312 -0.604007 -10.213030 1.122508 -1.857118 14.020645 0.699111 -2.880503 29.795309 6.919830 13.569256 3.437332 -14.687613 19.020651 -9.391164 12.138350 -20.374187 -6.631380 -48.149910 -69.667625 30.390884 77.630547 -43.134418 -42.613262 -0.782190 -0.067446 0.212994 0.675874 -0.066330 0.163441 -15.813344 16.263140 -15.958813 70.225433 69.319916 49.998711 -56.459789 57.044991 -37.963970 -0.879355 -0.360009 -0.274940 0.226777 -0.038582 -0.346344 +9.282786 166.494858 2.347009 -3.928795 -46.267166 4.502756 6.428177 -0.230351 6.592460 0.199388 -0.289583 3.161477 -0.936374 0.874512 -0.119686 0.626233 0.424233 0.686618 -2.211951 3.086046 -11.023399 -1.190971 -0.081117 7.473042 -0.226323 -0.730708 0.036597 0.541421 0.414474 0.540792 10.648317 -0.454686 -10.119455 1.047008 -1.567978 13.704820 0.487235 -2.615505 29.267078 6.617688 13.330579 3.289179 -15.048615 18.882923 -9.547975 11.276918 -20.780516 -6.425837 -53.815285 -69.043030 33.721661 77.028404 -43.968567 -43.241825 -0.766231 -0.046558 0.197844 0.668443 -0.049111 0.174003 -14.653196 16.206802 -15.984611 71.905121 67.237083 49.336391 -53.345303 59.163342 -37.195278 -0.865278 -0.367869 -0.244182 0.210047 -0.055226 -0.331272 +9.987024 166.609894 2.473021 -3.136998 -46.390316 4.714163 5.770554 -0.289849 4.999285 -0.387645 -0.227076 3.891324 -0.933112 0.862783 -0.114195 0.628699 0.422997 0.684465 -2.971613 2.695870 -11.014588 -1.807122 -0.127723 5.261276 -0.230353 -0.710394 0.043340 0.536817 0.410120 0.528214 10.550545 -0.095100 -10.051905 0.981614 -1.129025 13.418004 0.567488 -2.125025 28.658171 6.289466 13.210185 3.521309 -14.803766 18.554222 -9.669437 10.998502 -21.039623 -6.738458 -60.729252 -67.804482 37.449417 73.295395 -45.765530 -42.805649 -0.743066 -0.061895 0.214802 0.650001 -0.042513 0.181157 -12.756871 16.009085 -15.728785 72.112259 64.787239 47.309265 -49.490715 62.374615 -36.256721 -0.857743 -0.352462 -0.248829 0.222600 -0.060435 -0.328974 +10.609015 166.630081 2.673107 -3.135434 -46.986843 5.377173 5.519662 -0.344492 3.658340 -1.161456 -0.143338 4.655225 -0.925148 0.801436 -0.138361 0.680590 0.482693 0.714220 -3.008521 2.466415 -10.979682 -2.571390 -0.128521 3.314441 -0.258659 -0.674429 0.033636 0.555778 0.347898 0.518019 11.077219 0.304370 -9.943113 0.911144 -0.610080 13.158225 0.347211 -1.585290 28.096113 5.962961 13.161081 4.155705 -14.352313 18.135397 -10.577666 10.876793 -20.990904 -7.267356 -67.501236 -66.295486 41.076885 68.054977 -48.515629 -41.867592 -0.674972 -0.044893 0.243331 0.593388 -0.002065 0.185195 -11.143422 15.545979 -15.801326 74.072563 62.349815 46.512150 -42.419422 64.815987 -32.580124 -0.838154 -0.351920 -0.220728 0.206311 -0.091956 -0.329915 +11.287258 166.575317 2.875085 -3.017461 -47.034439 5.605857 5.282553 -0.456198 2.190993 -2.010683 -0.033410 6.026423 -0.915196 0.757858 -0.156570 0.691256 0.499767 0.715842 -3.337122 2.261250 -10.816745 -2.958837 -0.162566 1.978839 -0.277146 -0.634447 0.021719 0.550111 0.306414 0.506944 11.473438 0.529531 -9.672609 0.867118 -0.299386 13.043264 0.141956 -1.211992 27.429104 5.563430 13.129786 4.750746 -13.919151 17.716015 -11.302094 10.442020 -21.725042 -7.825304 -70.046265 -64.170631 40.751312 61.536026 -51.899170 -40.211170 -0.625531 -0.050168 0.273576 0.544298 0.029618 0.176874 -9.282664 15.843668 -15.935754 73.889618 59.597332 43.284920 -31.042006 66.623177 -25.413580 -0.813509 -0.325952 -0.205116 0.200880 -0.095371 -0.327139 +11.863712 166.463837 3.024435 -2.495398 -47.147263 5.546171 4.835598 -0.621972 0.556280 -3.121597 0.136987 7.777357 -0.902756 0.724637 -0.162514 0.685891 0.477446 0.721941 -4.096847 2.062710 -10.849076 -3.036463 -0.223883 0.992493 -0.287030 -0.588382 0.025372 0.518753 0.268736 0.493044 10.841722 0.522071 -9.321322 0.820394 -0.269371 12.876479 0.374337 -1.066074 26.485256 5.411653 13.156612 5.820654 -13.811643 17.776464 -11.664165 9.143945 -22.260668 -8.141236 -71.421997 -61.269115 38.767235 52.778831 -55.450920 -36.906933 -0.577676 -0.068979 0.317975 0.498814 0.053167 0.167633 -7.361797 16.529169 -15.911528 73.812050 56.629707 39.688011 -17.302402 66.768982 -16.052586 -0.788626 -0.290607 -0.202831 0.191856 -0.097674 -0.338239 +12.401054 166.277664 3.154704 -2.037565 -47.591949 5.415448 4.425879 -0.777078 -0.847201 -4.249456 0.337114 9.440880 -0.870760 0.671123 -0.169189 0.701285 0.482105 0.756035 -4.823535 1.944576 -11.127158 -2.877724 -0.268732 0.464964 -0.312754 -0.533135 0.023128 0.490767 0.208162 0.489862 9.686991 0.588235 -8.906542 0.920222 -0.218365 12.797845 1.038319 -0.995882 25.654694 5.434700 13.081088 7.084601 -14.084243 18.010908 -12.444237 8.137945 -22.453556 -8.675416 -72.790688 -58.218048 36.405453 41.390324 -58.006191 -31.138683 -0.518763 -0.078089 0.357650 0.443880 0.101073 0.159553 -5.290864 17.223194 -15.896435 73.718361 53.580341 35.691223 -4.735802 64.801926 -7.590811 -0.749722 -0.261426 -0.177602 0.170032 -0.120518 -0.346218 +13.009628 165.965729 3.271900 -1.599194 -47.615776 5.253868 3.936767 -1.008868 -2.273592 -5.255167 0.526702 11.173540 -0.851527 0.635296 -0.185302 0.696868 0.462706 0.779299 -5.782530 1.960593 -11.972582 -2.454888 -0.311167 1.149524 -0.338580 -0.489529 0.008743 0.451783 0.151036 0.500010 8.859654 0.416725 -8.360505 0.804848 -0.362835 12.657328 1.248595 -1.040597 24.621264 5.756118 13.107388 8.471386 -14.608809 18.523249 -13.256151 6.587135 -22.331894 -9.380278 -73.134293 -54.735966 33.103741 25.748184 -59.487988 -21.907495 -0.477792 -0.088404 0.405408 0.396669 0.147616 0.136833 -3.620882 17.437044 -15.965688 75.112976 50.245583 32.040432 4.919071 60.777485 -1.837394 -0.716589 -0.226837 -0.157760 0.139049 -0.121866 -0.361084 +13.689462 165.715256 3.357036 -1.525289 -47.352985 5.126395 3.498406 -1.336019 -3.517449 -5.589904 0.605295 12.880898 -0.828691 0.581504 -0.203737 0.686710 0.438279 0.810218 -6.341760 2.069883 -12.976401 -2.222594 -0.323506 2.569576 -0.357989 -0.428830 -0.001878 0.407752 0.076783 0.490936 8.293534 0.167247 -7.535941 0.813224 -0.585301 12.614116 1.447310 -1.184873 23.521425 6.062837 12.816745 10.041477 -15.351942 19.024492 -14.077400 4.619469 -23.113411 -10.017073 -71.529678 -51.379025 28.599667 9.291545 -58.586708 -11.682631 -0.422995 -0.112413 0.456453 0.337794 0.195500 0.105369 -1.405983 18.109829 -15.732746 75.129906 46.434978 26.554586 11.080467 55.365620 0.890533 -0.672955 -0.181828 -0.142557 0.108538 -0.128611 -0.383353 +14.340890 165.404556 3.512200 -1.447079 -46.619080 4.938597 3.089744 -1.707319 -4.562463 -5.856625 0.634827 14.411160 -0.803689 0.507842 -0.225091 0.696737 0.439189 0.852775 -6.788385 2.186548 -14.049139 -2.263346 -0.310509 4.552628 -0.389089 -0.356415 -0.008081 0.373815 -0.013550 0.478248 7.550427 -0.055913 -6.542283 1.055175 -0.835115 12.460199 2.099762 -1.391689 22.169083 6.373212 12.262589 11.831697 -16.036974 19.438776 -15.308483 3.124183 -23.787521 -10.731968 -70.668320 -48.315071 24.936066 -4.240743 -54.479362 -3.715521 -0.347205 -0.138050 0.518078 0.264602 0.260199 0.083844 0.825440 18.053167 -15.458365 73.993095 42.185501 20.460098 15.609978 49.038227 2.242805 -0.627372 -0.135274 -0.121289 0.080248 -0.152339 -0.404946 +14.950378 165.018173 3.797540 -1.462948 -45.454746 4.639722 2.957660 -2.082984 -5.279097 -6.165030 0.662631 15.945303 -0.782841 0.452228 -0.240743 0.694971 0.431214 0.870824 -7.284422 2.383875 -15.323796 -2.195810 -0.283828 7.683669 -0.409062 -0.299442 -0.011424 0.340246 -0.074252 0.466708 7.297747 -0.380790 -5.377279 1.294026 -1.106823 12.253443 2.448102 -1.498439 20.760929 6.308159 12.052160 13.019371 -16.238274 19.555813 -16.028206 0.244249 -25.022518 -10.924192 -68.617348 -45.258114 20.819571 -12.157901 -48.528503 0.207338 -0.290110 -0.160529 0.565281 0.208137 0.304053 0.065211 3.037800 18.043905 -15.088104 71.273048 38.630581 15.268636 18.606468 43.471981 2.859676 -0.591329 -0.092149 -0.105031 0.061955 -0.160574 -0.416139 +15.548557 164.614655 4.060344 -0.822508 -44.121681 3.669883 2.339354 -2.453251 -5.646589 -6.323235 0.658684 17.178185 -0.759197 0.389478 -0.259234 0.707116 0.443091 0.906007 -8.247067 2.518270 -16.659801 -2.202044 -0.232734 11.352078 -0.438053 -0.231460 -0.017038 0.314520 -0.143345 0.456366 6.283695 -0.651374 -4.055777 1.563119 -1.439776 12.040371 3.027382 -1.720565 19.457281 6.342428 11.837945 14.719854 -16.451115 19.658819 -17.063297 -3.105852 -25.975866 -10.878946 -66.261627 -42.296741 17.122465 -15.560457 -41.139008 1.300100 -0.230875 -0.190231 0.612396 0.146476 0.361282 0.046164 5.240134 18.377724 -15.069351 68.336533 35.998730 11.358818 17.344297 35.477619 1.663156 -0.552998 -0.042976 -0.080218 0.050287 -0.176439 -0.426192 +16.258875 164.121841 4.396281 -0.526689 -42.156631 3.096961 2.019501 -2.971795 -6.533850 -6.615857 0.680378 19.104445 -0.717315 0.334283 -0.259876 0.722446 0.454819 0.922395 -9.328238 2.684754 -18.373388 -1.465240 -0.298387 15.719181 -0.465424 -0.184207 -0.020246 0.289746 -0.193480 0.456953 5.969747 -0.987428 -2.639379 1.985360 -1.768169 11.528676 3.659006 -1.982298 17.828646 6.043072 11.164267 15.978730 -16.159763 19.152830 -17.022165 -6.791176 -26.318186 -10.280845 -64.828995 -39.297459 14.182349 -15.830262 -34.086334 0.930048 -0.168277 -0.189893 0.641259 0.093652 0.408390 0.050346 7.056951 18.279985 -14.689896 65.005257 33.120468 7.947034 15.165175 28.456213 0.616273 -0.511617 -0.022493 -0.048137 0.029762 -0.201445 -0.417883 +17.121155 163.674973 4.763916 -0.405854 -39.236660 2.653123 1.838215 -3.724790 -7.803119 -6.759108 0.645287 21.660698 -0.686228 0.278868 -0.257977 0.739851 0.471171 0.930936 -10.780169 2.609465 -19.950228 0.197283 -0.670253 20.128645 -0.483128 -0.129328 -0.012439 0.273504 -0.231067 0.437368 6.007480 -1.486705 -1.083374 2.573779 -2.254842 10.880698 4.430285 -2.424507 16.082211 5.199182 10.519214 17.099606 -15.341762 18.158955 -16.820065 -9.979325 -26.385277 -9.282495 -63.947819 -36.175777 11.363956 -13.223333 -28.615065 -0.279286 -0.102524 -0.205485 0.670263 0.039649 0.441250 0.058172 8.847895 18.030476 -14.134006 61.200119 30.162346 5.056910 12.578066 21.769110 -0.101112 -0.478289 0.007417 -0.027782 0.032450 -0.223496 -0.407672 +17.987257 163.158676 5.165557 -0.280909 -36.441559 2.200913 1.793572 -4.434504 -9.069856 -7.343200 0.723441 24.051542 -0.681959 0.247340 -0.263224 0.749371 0.470826 0.936671 -11.802122 2.483657 -21.586304 1.182879 -1.073035 24.508240 -0.496593 -0.087906 -0.011062 0.262516 -0.263968 0.420173 6.108651 -1.907411 0.472202 3.176996 -2.695463 10.254608 5.211618 -2.795543 14.492119 4.370212 10.061915 17.801533 -14.890090 17.281948 -16.884142 -12.154376 -25.205059 -8.618223 -63.741871 -33.114552 9.065126 -10.763738 -24.465286 -1.145176 -0.049799 -0.226170 0.710272 -0.006741 0.465452 0.059838 9.630290 16.706665 -13.765465 58.390163 27.449877 2.976409 9.903769 16.152252 -0.518547 -0.459651 0.035538 -0.026320 0.036820 -0.233362 -0.410518 +18.817377 162.452118 5.698482 -0.430604 -34.172382 2.031970 2.178449 -4.988667 -10.145332 -8.686339 1.057935 26.239075 -0.649058 0.222042 -0.264935 0.732481 0.443080 0.932907 -12.446044 2.401036 -24.001551 1.969040 -1.600069 29.910732 -0.497606 -0.064112 -0.015886 0.224122 -0.293268 0.423610 6.627773 -2.420562 1.985492 3.635797 -3.087609 9.539906 5.610117 -3.091744 12.832644 3.872123 9.503442 17.847464 -15.232028 16.768122 -16.546968 -14.318172 -23.482506 -8.115184 -62.692909 -30.076515 7.002473 -9.019322 -20.322674 -1.478949 -0.023655 -0.218934 0.717353 -0.033354 0.478306 0.044043 9.636743 14.672241 -13.277026 57.031883 24.705708 1.119607 6.524127 12.321244 -0.924001 -0.427650 0.049968 -0.003955 0.008118 -0.229006 -0.407992 +19.560867 161.792160 6.139999 -0.294029 -32.319698 1.308927 2.233769 -5.468419 -10.732575 -9.758977 1.383542 28.208796 -0.639850 0.192414 -0.275345 0.729107 0.431405 0.932727 -12.930139 2.362654 -26.414808 2.450257 -2.076389 35.690922 -0.501605 -0.029591 -0.020603 0.205311 -0.326625 0.409433 6.761763 -2.790942 3.965942 4.064402 -3.414850 8.906984 5.857875 -3.305818 11.231076 3.319335 9.235732 18.173372 -14.940285 16.087576 -16.600031 -16.075827 -22.279053 -7.568247 -60.280659 -26.863106 4.939161 -7.828651 -16.717510 -1.536998 0.017585 -0.228632 0.744063 -0.073283 0.493246 0.031533 9.730667 13.081980 -12.630844 55.004684 22.089293 -0.635053 3.349969 9.671106 -1.134834 -0.404504 0.074015 0.002507 -0.000893 -0.228049 -0.411501 +20.224602 161.254517 6.599075 -0.332635 -31.351137 0.433412 2.455002 -5.541077 -10.571746 -11.059589 1.861845 29.440784 -0.622424 0.139985 -0.273872 0.751526 0.465420 0.928432 -12.774965 2.737276 -28.874720 2.585881 -2.354895 41.719025 -0.516569 0.016297 -0.012289 0.210724 -0.352087 0.380525 7.165047 -2.848556 6.114282 4.568718 -3.356800 8.417006 6.010482 -3.167976 9.858669 2.086951 9.485168 18.477165 -14.131598 15.180103 -17.124079 -16.677940 -20.562317 -7.400714 -58.572071 -24.247978 3.575681 -6.228309 -13.320272 -1.565023 0.081132 -0.242995 0.767215 -0.122983 0.517194 0.047763 9.835015 10.827761 -12.255850 52.176533 19.710264 -1.849759 1.285018 6.732428 -1.015553 -0.381530 0.097441 0.012278 0.018222 -0.248879 -0.396089 +20.872875 160.901703 7.034765 -0.464211 -30.660666 -0.433510 2.673152 -5.482160 -10.041775 -12.319407 2.337566 30.229118 -0.607982 0.110005 -0.265406 0.757847 0.476723 0.913260 -12.021896 3.301222 -31.189882 2.236186 -2.369417 46.975021 -0.521024 0.044332 -0.001557 0.210049 -0.359058 0.357662 7.702997 -2.979056 8.228499 5.045257 -3.318313 8.036686 6.023520 -3.031139 8.680167 1.071115 9.656452 18.589230 -13.518010 14.430027 -17.097666 -17.382322 -19.095917 -7.240079 -56.243767 -21.826435 2.470163 -4.387517 -9.405055 -1.462072 0.124652 -0.254522 0.780898 -0.153239 0.526482 0.065704 9.550178 8.885822 -11.754519 49.023010 17.470602 -2.685491 -0.111989 4.112675 -0.775527 -0.365014 0.112732 0.012349 0.035185 -0.261608 -0.381423 +21.639994 160.829788 7.481021 -0.622758 -29.786985 -1.884700 2.283099 -5.567119 -8.806602 -12.604412 2.436697 31.018452 -0.603511 0.087460 -0.276855 0.772165 0.482783 0.923314 -10.980488 3.771713 -32.316219 2.067063 -2.423262 50.997051 -0.540236 0.074081 -0.005267 0.198972 -0.389428 0.360868 8.342907 -3.351641 10.840002 5.625210 -3.525408 7.821380 5.869770 -3.069598 7.649729 0.650808 9.776376 19.321848 -13.334396 14.028391 -17.694664 -18.402843 -18.589746 -6.502235 -52.590324 -18.987827 1.140892 -3.023208 -6.905797 -1.348025 0.161266 -0.261033 0.815077 -0.189580 0.555324 0.064392 8.239124 8.055065 -10.758518 46.048599 15.254581 -3.208683 -1.091520 1.592966 -0.432053 -0.351876 0.134838 0.025966 0.029404 -0.265958 -0.382933 +22.424587 160.908325 7.925178 -0.490471 -28.952196 -3.469056 1.336498 -5.674159 -7.503947 -12.487623 2.377238 31.576254 -0.596319 0.073967 -0.277076 0.758839 0.470597 0.898235 -9.953231 4.158872 -33.392475 2.160884 -2.563747 54.342800 -0.536870 0.094891 -0.000763 0.185013 -0.389990 0.347134 9.092764 -3.841287 13.144320 5.987845 -3.720496 7.830401 5.483124 -3.105277 6.963216 -0.112324 9.898744 19.384218 -12.884274 13.345969 -17.692638 -18.561357 -17.824627 -5.743066 -49.085014 -16.278885 0.096327 -2.032188 -5.323343 -1.237794 0.181732 -0.273470 0.825958 -0.209336 0.554862 0.063239 6.876943 7.121930 -9.678952 43.083279 13.109707 -3.523948 -1.373094 -0.261948 -0.142213 -0.341089 0.158238 0.026091 0.039243 -0.254256 -0.373656 +23.068216 160.935287 8.543096 -0.436278 -28.071491 -4.969201 0.564327 -5.590859 -5.618447 -12.296007 2.287382 31.611900 -0.565054 0.050457 -0.265725 0.755624 0.464298 0.898159 -8.714998 4.598945 -34.485455 2.890420 -3.011736 57.040359 -0.541519 0.113503 0.004481 0.163393 -0.405349 0.346940 9.493400 -4.334207 14.952873 6.371686 -4.018046 8.027009 5.421814 -3.286953 6.647909 -0.553955 9.605702 19.111580 -13.468595 12.933849 -17.908739 -18.282885 -16.424681 -5.016461 -46.259041 -13.834525 -0.800706 -0.769497 -4.524465 -1.174586 0.207089 -0.271248 0.826546 -0.228122 0.567549 0.067077 4.821727 5.719222 -8.709655 40.986530 11.095417 -3.899732 -1.788374 -0.786228 -0.011765 -0.316219 0.165213 0.043130 0.029844 -0.264181 -0.363574 +23.712740 160.942703 9.323050 -0.599318 -26.723270 -6.319501 -0.155460 -5.561653 -3.512523 -11.891955 2.065704 31.452616 -0.538269 0.041541 -0.243085 0.716924 0.426200 0.867524 -7.456089 4.688745 -35.087532 3.938494 -3.794292 58.905201 -0.526702 0.127627 0.022362 0.131843 -0.390833 0.330828 10.296645 -5.149209 16.233130 6.656473 -4.409945 8.239621 5.156730 -3.526691 6.387286 -0.570579 9.342257 18.528896 -13.786405 12.824283 -17.583708 -17.849489 -15.090571 -4.014165 -43.565063 -11.130394 -1.708556 0.092901 -5.203298 -1.189002 0.212801 -0.291262 0.820949 -0.228239 0.558396 0.071292 2.206859 4.128012 -7.481816 39.591293 8.789874 -4.320118 -2.130549 -1.229685 0.122741 -0.297240 0.185543 0.034605 0.039052 -0.258056 -0.352514 +24.243956 161.042709 10.138887 -0.562326 -25.331175 -7.786211 -0.613432 -5.551534 -1.416547 -12.094377 2.014982 31.220966 -0.499184 0.023347 -0.223791 0.705707 0.412276 0.854163 -6.194920 4.618425 -34.851822 5.294713 -4.694408 59.146061 -0.520166 0.133804 0.034584 0.107697 -0.391482 0.329902 10.691087 -5.883470 17.202353 6.916006 -4.840452 8.608887 5.060363 -3.826022 6.436947 -0.904841 8.898948 17.676657 -14.208172 12.424594 -17.389872 -17.126730 -13.202976 -3.379419 -41.052414 -8.985575 -2.369873 0.805703 -6.117474 -1.214441 0.228904 -0.273964 0.804441 -0.233990 0.555044 0.081006 -0.019672 2.095010 -6.690527 37.759525 6.905876 -4.687798 -2.427107 -1.176888 0.173994 -0.274443 0.179563 0.050153 0.025607 -0.266645 -0.337505 +24.747442 160.870392 11.179552 -0.578539 -24.154449 -8.219872 -0.936901 -5.625724 -0.386215 -12.527210 2.088716 31.182953 -0.476140 0.074208 -0.178591 0.613041 0.305861 0.767077 -4.966709 4.493724 -35.246143 6.582835 -5.580624 58.713428 -0.466109 0.098409 0.059476 0.054857 -0.307502 0.320888 11.781857 -6.691152 16.796028 6.743843 -4.985833 8.706001 4.526690 -3.830220 6.383439 -0.946302 8.488519 16.003040 -14.010287 12.272089 -15.017850 -15.380864 -10.442210 -3.030805 -39.234646 -7.211109 -2.810589 0.887141 -7.536844 -1.274202 0.177573 -0.277170 0.763268 -0.180613 0.483986 0.085168 -2.506689 -0.986564 -6.003316 36.653732 4.884170 -5.199180 -2.806210 -0.854854 0.191117 -0.273786 0.178352 0.015746 0.033408 -0.222224 -0.319071 +25.213335 160.701965 12.193588 -0.845942 -23.051422 -8.161213 -0.904110 -5.684957 0.332777 -12.910088 2.163808 30.980381 -0.438464 0.122539 -0.125445 0.528355 0.206529 0.692907 -3.388099 4.560627 -35.916801 7.811176 -6.331916 57.676292 -0.407796 0.055356 0.081446 0.005881 -0.220031 0.312005 13.469209 -7.611569 15.729387 6.333099 -4.948132 8.774063 3.580273 -3.743841 6.513893 -0.684379 8.281332 14.177424 -13.361083 12.441552 -12.034737 -13.373982 -7.861249 -2.796458 -37.001450 -5.968611 -2.966073 0.532695 -8.605954 -1.245934 0.122792 -0.260270 0.702529 -0.119410 0.404888 0.091026 -4.601079 -4.041925 -5.429029 34.989899 3.055854 -5.526484 -2.762016 -0.647165 0.180077 -0.265609 0.155190 -0.012598 0.030121 -0.190733 -0.298594 +25.632938 160.749649 13.051257 -0.492865 -21.974169 -8.878628 -1.755484 -5.656342 1.673065 -13.018961 2.060964 30.379522 -0.421478 0.130250 -0.113707 0.496773 0.176204 0.653664 -1.826518 4.584180 -35.582439 8.616173 -6.525876 55.293709 -0.388612 0.034379 0.086310 -0.012125 -0.196096 0.314364 14.121047 -8.179625 15.231941 5.962939 -5.075099 9.090343 2.881322 -3.822383 6.937631 -0.516674 7.900000 13.028169 -13.183979 12.294391 -11.394678 -11.631428 -5.815143 -2.591468 -34.481136 -4.834396 -3.098848 0.822594 -9.827442 -1.268793 0.107955 -0.237085 0.678499 -0.101365 0.378991 0.092074 -6.267289 -6.337465 -4.952190 33.279041 1.446446 -5.851942 -3.306091 -0.368326 0.194454 -0.262062 0.141217 -0.013978 0.016206 -0.175855 -0.287376 +26.104988 160.896362 13.965075 -0.057939 -21.055170 -9.571999 -2.886122 -5.544180 3.153148 -12.934644 1.891727 29.578020 -0.412060 0.138143 -0.101730 0.454554 0.137933 0.606298 -0.317278 4.589125 -34.905312 9.536028 -6.574341 51.857410 -0.360851 0.023379 0.094021 -0.029845 -0.165000 0.298523 14.652732 -8.598117 14.889610 5.710014 -5.161633 9.303292 2.307444 -3.819375 7.148376 -0.597643 7.818739 11.919141 -12.729535 12.113002 -10.746063 -10.211658 -3.756370 -2.287253 -32.548527 -3.450843 -3.383921 1.534482 -12.660777 -1.446682 0.093359 -0.232053 0.657011 -0.086033 0.343812 0.088174 -7.820265 -8.597324 -4.433678 31.078848 -0.233092 -6.131640 -4.103442 0.337223 0.192112 -0.258543 0.141679 -0.028994 0.019398 -0.152918 -0.277645 +26.539045 161.073700 14.935816 0.547250 -20.791794 -10.104798 -4.250825 -5.331938 4.437512 -12.598433 1.676266 28.740479 -0.377824 0.138285 -0.083122 0.451326 0.134770 0.595281 1.284515 4.800222 -34.150448 9.944191 -6.175338 47.906193 -0.350290 0.013477 0.100568 -0.039561 -0.146735 0.306231 14.986228 -8.768910 13.744876 5.339252 -5.169948 9.657063 1.799087 -3.818850 7.960788 -0.735208 7.466435 11.453094 -12.274807 11.689947 -9.908114 -8.972543 -1.668569 -2.024903 -30.922911 -2.089892 -3.690157 2.569504 -16.170771 -1.742185 0.086264 -0.203547 0.623112 -0.073070 0.329006 0.097783 -8.537683 -10.219733 -3.942464 27.958426 -1.691526 -6.028136 -4.649889 1.120939 0.162565 -0.246776 0.121130 -0.011473 0.007524 -0.158651 -0.259085 +26.942667 161.344879 15.896255 1.111168 -20.721712 -10.597591 -5.323337 -5.051171 5.654825 -12.650623 1.602666 27.833784 -0.373337 0.137735 -0.080101 0.450876 0.145043 0.576128 2.927732 5.076637 -33.048817 10.019190 -5.563826 43.482086 -0.343068 -0.006288 0.106813 -0.031474 -0.133714 0.308576 15.360828 -8.868272 12.346582 4.943704 -5.174675 10.111707 1.264514 -3.810249 9.094934 -0.790980 7.210672 11.101158 -12.318106 11.479405 -9.616968 -8.512142 0.020960 -1.910882 -28.919224 -0.699997 -3.910028 4.508354 -19.858299 -2.224001 0.078637 -0.184834 0.602361 -0.058682 0.317163 0.108214 -8.636541 -11.399323 -3.504835 24.468323 -2.963563 -5.644667 -4.946243 2.094256 0.113133 -0.253664 0.103060 -0.007111 0.003796 -0.159320 -0.247979 +27.323874 161.485550 16.822321 1.940500 -20.586254 -11.312677 -6.426261 -4.807467 6.713341 -12.886385 1.595654 27.183458 -0.388482 0.137314 -0.097859 0.474284 0.167181 0.592241 4.363337 5.281616 -31.531485 9.498982 -4.702773 38.913509 -0.354493 -0.015034 0.097754 -0.017952 -0.153497 0.324411 14.890881 -8.579691 11.180299 4.772084 -5.225480 10.589808 1.320994 -3.811161 10.285958 -0.719606 6.772636 10.976127 -12.714890 11.198711 -10.499669 -7.627407 1.131515 -1.896130 -26.921474 0.094818 -3.812617 4.908077 -21.464312 -2.376128 0.080281 -0.166699 0.609572 -0.063852 0.327447 0.103616 -8.907653 -12.397421 -2.952041 21.458557 -4.484044 -5.297880 -5.691669 3.622358 0.060142 -0.265758 0.091516 0.005371 -0.010908 -0.161071 -0.255810 +27.733053 161.661743 17.672020 2.936355 -20.234690 -12.423692 -7.440042 -4.702025 7.723317 -13.639215 1.719158 27.088367 -0.347704 0.095099 -0.102163 0.512793 0.227143 0.597607 5.347136 5.092773 -29.293089 8.973684 -3.921381 33.949802 -0.381797 -0.017672 0.087484 -0.006805 -0.180232 0.351552 14.379848 -8.491043 10.683340 4.562894 -5.332934 11.013088 1.112489 -3.937561 11.036722 -1.037757 6.677705 10.967283 -12.649622 10.835899 -11.103036 -6.987932 1.553965 -1.552788 -24.450628 0.967897 -3.622825 5.621494 -22.384287 -2.451061 0.110502 -0.113252 0.592223 -0.082330 0.360925 0.121900 -8.923377 -12.963563 -2.366295 19.036575 -6.060053 -4.968187 -7.080666 5.788030 -0.049882 -0.244997 0.062701 0.057483 -0.042715 -0.188701 -0.228109 +28.199032 161.831436 18.564884 3.935950 -19.975906 -13.470344 -8.446548 -4.634501 8.534697 -14.544182 1.914137 27.118479 -0.368330 0.102974 -0.109190 0.522461 0.231264 0.610248 6.132268 4.886489 -27.054514 8.707843 -3.309890 29.131111 -0.385830 -0.015570 0.085881 0.002317 -0.186278 0.350654 13.767070 -8.363973 10.410259 4.456423 -5.503448 11.377352 1.066760 -4.043948 11.606845 -1.019220 6.530421 11.126109 -12.893304 10.702193 -11.680414 -6.545040 2.362676 -1.647606 -22.355587 1.570636 -3.376001 6.361985 -23.312319 -2.589114 0.111270 -0.124805 0.607171 -0.086344 0.364403 0.119365 -9.219361 -13.867187 -2.314639 17.515804 -6.807990 -4.825239 -9.570528 8.131412 -0.262355 -0.255550 0.068049 0.049185 -0.034856 -0.188238 -0.238254 +28.541647 161.793762 19.542185 4.836384 -19.584846 -13.983491 -9.181258 -4.602145 8.742255 -15.764236 2.256252 27.317549 -0.364263 0.098973 -0.114080 0.524402 0.241963 0.611414 7.115177 4.784397 -25.051985 8.157728 -2.640811 24.247156 -0.369422 -0.034754 0.080515 0.016462 -0.188609 0.343461 13.577951 -8.360355 9.505466 4.039819 -5.571687 11.464503 0.603761 -4.196056 12.063858 -0.785430 6.469944 11.022763 -12.940493 10.854214 -10.923961 -6.049020 3.724783 -2.050037 -19.880770 1.785222 -2.904534 6.634498 -23.258251 -2.454856 0.101281 -0.099871 0.574187 -0.072231 0.345223 0.112362 -9.214355 -15.139215 -2.807207 16.357065 -6.641982 -4.546820 -12.262469 11.375118 -0.758635 -0.254536 0.038821 0.053301 -0.050882 -0.193054 -0.238351 +28.819849 161.455246 20.582798 5.501999 -18.983150 -14.439883 -9.526916 -4.619923 9.075487 -17.114166 2.643763 27.612015 -0.383382 0.118425 -0.118071 0.527359 0.237103 0.620422 8.220951 4.635503 -22.843214 7.086633 -2.011553 19.550230 -0.373084 -0.041167 0.068217 0.023988 -0.185947 0.347996 13.764063 -8.303839 8.249594 3.652055 -5.576661 11.515009 0.061631 -4.181875 12.611379 -0.784308 6.331825 11.355735 -12.952488 10.665792 -10.932509 -5.263043 4.214811 -2.277065 -18.085043 1.730072 -2.537141 7.269808 -21.614712 -2.338888 0.094018 -0.105807 0.583146 -0.070687 0.344425 0.107690 -9.826147 -15.958713 -2.538904 14.973099 -7.633942 -4.311548 -13.660276 13.513130 -1.072121 -0.261758 0.037211 0.043573 -0.045830 -0.187614 -0.245351 +28.981285 161.012268 21.593531 6.283154 -18.216482 -14.890548 -9.775269 -4.668155 9.329054 -18.781454 3.175642 28.114075 -0.426747 0.158274 -0.117378 0.497460 0.195447 0.604459 8.982586 4.369207 -20.865597 5.802435 -1.512558 15.464101 -0.351822 -0.051487 0.070512 0.026505 -0.155678 0.326259 13.721465 -8.177870 7.020720 3.148574 -5.588692 11.484209 -0.528861 -4.155729 13.007775 -0.489836 6.371715 11.586772 -12.680111 10.763273 -10.295225 -4.610948 4.227846 -2.313578 -15.632827 1.728900 -1.975727 6.438355 -19.454004 -1.931612 0.067972 -0.143481 0.595944 -0.051967 0.313181 0.098198 -10.162242 -16.445547 -2.153110 13.438474 -8.816807 -4.008043 -14.461402 15.041906 -1.281716 -0.284887 0.052048 -0.004271 -0.016334 -0.162379 -0.263070 +29.091745 160.449585 22.696510 7.097708 -17.129730 -15.166535 -10.192272 -4.887434 9.344821 -20.191957 3.651021 29.180933 -0.438641 0.166236 -0.121271 0.502955 0.200876 0.605682 9.208413 3.916777 -19.096424 4.485482 -1.156900 11.882534 -0.351820 -0.058591 0.067507 0.036081 -0.151244 0.327244 13.243532 -7.911162 5.611916 2.762941 -5.614503 11.341988 -0.716813 -4.195790 13.419870 -0.310467 6.105711 11.929506 -12.333774 10.504126 -10.120347 -3.597796 4.366728 -2.416790 -14.227681 1.358350 -1.645980 5.930559 -17.445934 -1.661576 0.062807 -0.143912 0.596843 -0.047547 0.309774 0.098626 -10.614534 -16.990391 -1.703792 11.887816 -10.143188 -3.630639 -14.913715 16.414345 -1.447615 -0.293806 0.047669 -0.008381 -0.012970 -0.161023 -0.264786 +29.207226 159.837723 23.666128 7.712016 -16.004322 -15.367332 -9.978834 -5.258921 9.100378 -22.357061 4.474709 30.670122 -0.439226 0.163222 -0.127360 0.515837 0.220157 0.614076 9.433933 3.647732 -17.869516 2.987871 -0.884409 9.502289 -0.353731 -0.059620 0.066595 0.046321 -0.153594 0.330872 12.700594 -7.501065 4.181870 2.463449 -5.492935 11.347079 -0.698926 -4.101866 14.127007 0.180278 5.501620 12.209055 -11.815372 10.111182 -10.181724 -2.991740 3.895281 -2.436967 -12.062210 0.768945 -1.183762 5.186978 -15.957305 -1.402746 0.056840 -0.137682 0.587971 -0.044301 0.311424 0.096681 -10.285512 -17.062813 -0.946763 9.662179 -12.565763 -3.073917 -15.108890 17.430792 -1.512434 -0.299916 0.043413 0.001689 -0.013754 -0.163810 -0.263355 +29.426058 159.209763 24.614592 7.928586 -15.323689 -15.600723 -9.507494 -5.520351 9.085938 -24.409924 5.326041 31.885763 -0.418748 0.143598 -0.127389 0.544133 0.253459 0.623313 9.687757 3.499894 -16.785881 2.257941 -0.765191 8.231608 -0.366577 -0.068417 0.066878 0.053198 -0.165974 0.348757 12.889355 -7.166479 3.435863 2.314208 -5.161880 11.258159 -0.949478 -3.813627 14.326201 0.423360 4.832512 12.311110 -11.469893 9.620566 -10.045501 -2.816773 3.208280 -2.462684 -9.606656 -0.033824 -0.692229 4.037469 -14.369112 -1.091164 0.071214 -0.102609 0.576917 -0.048082 0.324757 0.111003 -10.229304 -16.947464 -0.260571 8.100140 -14.890740 -2.723325 -16.018366 16.948727 -1.421360 -0.295525 0.017982 0.031033 -0.036709 -0.185050 -0.251271 +29.766174 158.632538 25.475603 7.621066 -15.152352 -15.471346 -8.689743 -5.592311 8.784302 -26.091894 6.167400 32.777973 -0.413294 0.138755 -0.130253 0.537719 0.240441 0.636119 10.162057 3.676581 -16.570953 2.048931 -0.724808 8.049330 -0.360401 -0.073173 0.065454 0.042731 -0.185027 0.350596 13.919428 -6.928784 2.970354 2.330016 -4.719016 11.087609 -1.257635 -3.377333 14.288998 0.737286 3.976812 12.213526 -12.488499 9.621214 -9.735530 -3.279724 2.527533 -2.471359 -7.528010 -0.460287 -0.368102 3.751970 -13.351898 -0.926309 0.069560 -0.097729 0.569748 -0.045310 0.323642 0.098769 -10.915757 -16.559240 0.632193 7.309143 -16.583776 -2.514902 -15.946010 17.225903 -1.356128 -0.289680 0.009369 0.036431 -0.057897 -0.188458 -0.261622 +30.049887 158.162369 26.189802 6.962699 -14.989684 -15.508135 -7.497336 -5.706891 8.641949 -27.402998 6.910899 33.689133 -0.371358 0.115395 -0.110283 0.528690 0.237223 0.632792 10.841223 3.934454 -16.363766 1.802631 -0.675330 8.332833 -0.363488 -0.062381 0.074922 0.023858 -0.188796 0.350292 15.025036 -6.939703 3.109402 2.469576 -4.399085 10.865653 -1.578356 -3.061251 13.812459 1.058936 3.283553 12.595739 -12.710034 9.574748 -8.929901 -3.764917 1.589422 -2.094889 -6.462386 -0.273595 -0.331282 4.513516 -12.293045 -0.873566 0.084254 -0.096655 0.556048 -0.048575 0.336793 0.112239 -11.841180 -15.513090 1.390567 6.818652 -17.584158 -2.514080 -16.155731 15.101115 -0.978127 -0.263828 0.008948 0.051259 -0.065323 -0.207080 -0.245768 +30.248638 157.761292 26.728624 6.491487 -14.829825 -15.835049 -6.552793 -5.816516 8.458082 -28.358418 7.657000 34.973011 -0.372915 0.121387 -0.104146 0.503471 0.201766 0.629694 11.110970 4.290791 -16.501444 1.960814 -0.686886 9.932629 -0.355366 -0.061649 0.072800 0.005496 -0.190679 0.341966 15.290575 -6.979932 4.057720 2.806231 -4.295909 10.784944 -1.417856 -2.904050 13.238360 1.057600 3.013744 12.242680 -13.551327 9.753486 -8.635592 -4.509789 1.248641 -1.870017 -5.954648 0.346884 -0.322251 5.093081 -11.903625 -0.869440 0.083562 -0.109898 0.561624 -0.048579 0.329810 0.102686 -12.391376 -14.856591 1.550921 6.546456 -17.175508 -2.510331 -16.208431 13.476451 -0.717783 -0.255446 0.015310 0.036292 -0.067651 -0.199785 -0.254697 +30.357504 157.565948 27.039022 6.154626 -14.599262 -16.164690 -5.958722 -5.901393 8.157969 -28.582342 8.159281 36.367596 -0.385356 0.134096 -0.104726 0.494068 0.179139 0.632590 10.955996 4.573403 -16.777098 2.467204 -0.752147 11.476562 -0.352358 -0.062766 0.071203 -0.003092 -0.192168 0.342820 15.016627 -6.974363 5.258854 3.107051 -4.267134 10.837863 -1.130919 -2.852273 12.783979 1.048166 3.013133 11.610617 -13.959876 9.839225 -8.953155 -4.933079 1.305092 -1.641796 -5.789730 1.094720 -0.259236 4.756566 -11.887771 -0.829942 0.080110 -0.117927 0.575303 -0.049095 0.325325 0.094611 -12.431162 -14.316791 1.169260 7.166310 -15.805634 -2.762475 -16.535994 11.977156 -0.559312 -0.259227 0.020501 0.024483 -0.069746 -0.191966 -0.266665 +30.399561 157.528366 27.146849 5.956519 -14.886772 -16.370821 -5.440198 -5.703247 7.768578 -28.623344 8.622466 37.349514 -0.410951 0.141939 -0.105330 0.489458 0.171869 0.643956 10.699032 4.937881 -17.269531 3.223947 -0.833589 13.029739 -0.350202 -0.052367 0.074949 0.001684 -0.192338 0.326486 14.411567 -6.811465 6.490636 3.398232 -4.189300 11.032430 -0.706475 -2.769015 12.572057 0.983689 3.052675 10.958662 -14.582217 9.929221 -9.911330 -4.982390 2.009190 -1.749779 -6.529676 1.506366 -0.310794 4.260210 -11.822192 -0.800182 0.076715 -0.151632 0.592214 -0.051779 0.322743 0.086934 -12.734470 -14.029135 0.336070 8.472392 -13.112258 -3.091164 -16.294659 10.798756 -0.490094 -0.269127 0.040172 0.001546 -0.045269 -0.186964 -0.281159 +30.339607 157.476196 27.242664 5.944113 -14.881106 -15.928043 -5.248219 -5.503496 6.842326 -28.397404 8.842651 37.998096 -0.386869 0.138983 -0.101362 0.497581 0.189815 0.641138 10.461244 5.163394 -17.760872 3.605201 -0.835165 13.315157 -0.353035 -0.068152 0.079048 0.004424 -0.189802 0.348745 13.244697 -6.595880 6.948554 3.549035 -4.264536 10.971817 -0.019895 -2.948967 12.360863 1.202444 3.200784 10.330711 -14.881687 10.273718 -9.909054 -4.671034 3.270213 -1.564747 -8.216969 2.574778 -0.524523 3.975395 -13.123779 -0.834314 0.064245 -0.120932 0.565888 -0.036472 0.327934 0.097500 -12.930950 -13.512887 -0.862791 9.544818 -9.209775 -3.201771 -15.541133 8.565932 -0.340103 -0.268386 0.018952 0.025468 -0.063982 -0.195933 -0.268721 +30.199154 157.554657 27.224709 6.295666 -14.709862 -15.478904 -5.393034 -5.279015 5.930209 -28.091183 8.973037 38.481190 -0.383452 0.135332 -0.109572 0.490587 0.191550 0.638214 9.881211 5.181289 -18.090767 3.817168 -0.805951 12.824518 -0.354522 -0.069717 0.073610 0.000104 -0.193546 0.356008 11.499378 -6.062536 7.379834 3.723889 -4.253629 10.827986 0.934491 -2.997172 12.078241 1.451505 3.407788 10.225019 -15.201970 10.712162 -10.262547 -4.238020 4.296362 -1.496332 -10.667542 3.197327 -0.954672 3.816173 -14.553652 -0.948335 0.053289 -0.116241 0.559897 -0.032733 0.331886 0.086478 -13.048090 -13.251823 -1.829619 11.397662 -6.363200 -3.516469 -14.907276 7.384171 -0.305597 -0.267199 0.023045 0.034216 -0.071442 -0.186492 -0.268473 +30.131283 157.867599 27.127083 6.350891 -14.928918 -14.890300 -5.289638 -4.937490 4.974705 -27.805422 9.049233 38.566460 -0.395173 0.131492 -0.104987 0.500339 0.210715 0.627306 9.820393 5.269256 -18.177876 3.643326 -0.692824 11.978544 -0.353413 -0.058997 0.084513 0.018721 -0.179827 0.335639 10.804163 -5.714648 8.023380 3.906886 -4.057765 10.685299 1.375394 -2.820498 11.649542 0.551024 3.947881 10.107016 -14.591199 10.248961 -10.587710 -3.657234 5.385692 -1.954279 -14.252076 2.915236 -1.586665 3.151838 -13.583187 -0.965609 0.064907 -0.135342 0.565787 -0.039512 0.327558 0.101520 -12.736875 -13.191368 -2.810116 12.884055 -3.735859 -3.611952 -13.356699 6.262575 -0.253936 -0.275227 0.034386 0.020984 -0.038396 -0.190057 -0.260301 +30.111605 158.297852 27.080999 6.327734 -14.585902 -14.206551 -5.359306 -4.794890 4.228354 -27.446735 8.884121 38.345341 -0.403796 0.144675 -0.093543 0.486335 0.189070 0.613359 10.063691 5.184845 -18.003691 2.677558 -0.536818 10.488398 -0.347102 -0.037714 0.091176 0.011008 -0.155228 0.316317 10.574171 -5.597697 8.234426 3.888579 -3.978340 10.390518 1.420014 -2.722083 11.111599 -0.030063 4.150172 10.545103 -13.475779 9.625774 -10.296573 -3.357089 5.341727 -1.886962 -17.447842 2.909647 -2.170531 2.385792 -12.101093 -0.976106 0.066998 -0.171386 0.581421 -0.046523 0.316425 0.102556 -12.303658 -12.327489 -3.045515 14.666038 -2.607507 -3.861895 -11.567373 5.306784 -0.176175 -0.276049 0.064763 0.000144 -0.002968 -0.176297 -0.257062 +30.010118 158.602371 27.089525 6.282655 -14.564713 -13.151332 -5.057266 -4.493742 3.361610 -27.331770 8.838996 37.856174 -0.413529 0.153356 -0.086789 0.453945 0.159569 0.570760 10.547114 5.120882 -18.025686 1.767877 -0.429431 8.589332 -0.330096 -0.012344 0.101893 0.001757 -0.124825 0.281967 11.215186 -5.700174 7.833645 3.469628 -3.804246 9.886544 0.704192 -2.530436 10.496570 -1.342581 4.722218 11.383420 -12.442162 8.906964 -9.631481 -2.977246 5.110019 -1.654178 -21.442612 3.115887 -2.945143 2.993537 -9.796471 -1.034400 0.070500 -0.217050 0.591587 -0.054675 0.297216 0.102723 -11.741857 -11.240360 -3.277771 17.235374 -1.572505 -4.281914 -10.480584 4.944125 -0.185634 -0.275471 0.107696 -0.027396 0.043478 -0.148742 -0.246859 +29.898935 158.917343 26.994972 6.213161 -14.444826 -12.582776 -4.839992 -4.117995 3.175196 -27.255589 8.754518 37.051910 -0.472215 0.194381 -0.104352 0.446712 0.125084 0.562555 11.089897 4.981045 -17.551100 0.873825 -0.375243 6.679551 -0.315954 0.003167 0.096090 0.006840 -0.108247 0.260152 11.683347 -5.722230 7.984309 3.210825 -3.657197 9.711916 0.065912 -2.289042 10.172665 -2.822268 5.572945 11.675797 -11.301063 8.050905 -10.012334 -3.549395 5.153346 -2.059089 -24.214298 2.908840 -3.370008 3.081029 -8.124423 -1.090686 0.067837 -0.254246 0.632770 -0.068972 0.271344 0.084088 -9.875575 -10.795519 -3.909389 18.611870 -0.562996 -4.423255 -9.127356 5.554174 -0.269495 -0.299385 0.142715 -0.067743 0.079462 -0.111442 -0.267581 +29.792141 159.108276 26.855881 6.409310 -13.855268 -12.294105 -4.982192 -3.781625 3.255327 -27.215187 8.680679 36.401089 -0.515911 0.209961 -0.111730 0.475191 0.140582 0.584925 11.139560 4.701042 -17.125233 0.073008 -0.352894 5.117799 -0.324100 0.020746 0.090645 0.033808 -0.110041 0.243884 11.655437 -5.774844 7.993254 2.855658 -3.654006 9.720996 -0.471523 -2.266027 10.218013 -4.123295 6.122288 11.581326 -10.851723 7.319858 -11.291009 -5.106292 5.339411 -2.666782 -26.000406 2.945770 -3.682779 2.770024 -7.275377 -1.128248 0.085451 -0.283398 0.668822 -0.091600 0.272537 0.085837 -6.994681 -10.419511 -4.952926 19.434055 0.639557 -4.452319 -8.093126 6.758753 -0.434333 -0.315212 0.159177 -0.091834 0.115774 -0.112343 -0.279957 +29.667559 159.218079 26.644072 6.329707 -13.470401 -12.048507 -4.515739 -3.270645 3.596764 -27.524151 8.762982 35.453831 -0.482355 0.159128 -0.118366 0.513468 0.180934 0.590725 11.479113 4.616019 -16.836380 -0.586822 -0.319920 4.161694 -0.344747 0.046808 0.079332 0.038520 -0.148962 0.242711 11.915384 -5.918492 9.243279 2.744793 -3.463031 9.117044 -1.051242 -2.122634 8.834666 -5.584988 6.756280 12.108064 -9.778239 6.594338 -11.531184 -6.142281 5.580660 -2.667313 -28.813879 3.299719 -4.303535 2.492845 -7.248882 -1.153578 0.151138 -0.242555 0.678934 -0.141883 0.298923 0.099370 -5.830135 -9.849174 -5.400896 21.912331 1.298590 -4.866356 -7.401746 7.767945 -0.556075 -0.282320 0.145909 -0.056910 0.091223 -0.139554 -0.262476 +29.569347 159.172623 26.446882 6.269451 -13.174543 -11.172928 -4.097548 -2.774816 3.139869 -27.923309 8.971105 34.833061 -0.462497 0.123015 -0.113173 0.538420 0.218090 0.573582 11.572903 4.729729 -17.521500 -0.722051 -0.308501 3.688889 -0.351855 0.061679 0.088878 0.052708 -0.153924 0.226940 12.591079 -6.001792 9.605393 2.324220 -3.094104 8.426630 -1.950168 -1.864691 7.694792 -6.730220 7.192993 12.420354 -8.505079 5.825611 -11.389704 -7.119482 5.745963 -2.872986 -31.719219 3.185961 -4.805126 3.304205 -6.259524 -1.127030 0.195245 -0.224212 0.678660 -0.167409 0.305353 0.126740 -4.336369 -8.992954 -6.098037 24.572191 2.225322 -5.245615 -6.866198 7.011560 -0.562297 -0.271229 0.138055 -0.044087 0.097137 -0.160677 -0.240788 +29.477365 159.007706 26.142805 6.223991 -12.498484 -10.298424 -3.738692 -2.387608 2.456785 -28.422720 9.300655 34.640659 -0.471048 0.133093 -0.104764 0.543157 0.204161 0.576009 11.427178 4.886093 -18.521704 -0.923525 -0.307686 3.365987 -0.350125 0.073081 0.088644 0.051002 -0.146948 0.214861 12.750919 -5.924517 9.764084 2.100662 -2.863102 7.873507 -2.296029 -1.662908 6.843264 -7.721919 7.261347 12.530271 -7.858998 5.049589 -11.184621 -8.389657 5.700026 -2.899172 -34.569199 3.367752 -5.315777 2.861494 -6.232089 -1.186186 0.213304 -0.233081 0.695718 -0.182558 0.297153 0.133155 -2.617242 -7.829601 -6.629254 26.567329 3.030761 -5.472888 -5.868387 6.065035 -0.509718 -0.268240 0.143429 -0.058422 0.111732 -0.161724 -0.242175 +29.425888 158.722046 25.732248 6.169494 -11.490079 -9.553868 -3.625664 -2.133241 1.639908 -28.428530 9.564796 35.108116 -0.456315 0.112977 -0.110660 0.556463 0.213259 0.581558 10.931311 5.013136 -19.565132 -0.640476 -0.326723 3.132351 -0.359460 0.081784 0.081901 0.044623 -0.169771 0.221769 12.416652 -5.718983 10.065161 2.071599 -2.686715 7.382537 -2.161041 -1.538011 6.068128 -8.210696 7.058396 12.376423 -7.746030 4.617691 -11.547297 -10.153327 5.422749 -2.495363 -37.313187 4.306108 -6.149563 2.542232 -8.065474 -1.385875 0.238332 -0.209056 0.701367 -0.204217 0.309043 0.132348 -0.960675 -6.334895 -6.846285 28.344519 3.512999 -5.644332 -4.588552 5.497368 -0.463012 -0.254603 0.136931 -0.038455 0.090837 -0.168909 -0.238874 +29.271933 158.354004 25.185377 6.346716 -10.079624 -9.171851 -3.698564 -1.993315 1.098098 -28.446646 9.876289 35.914600 -0.451207 0.100593 -0.122999 0.576708 0.231789 0.586925 10.336311 5.082289 -20.482149 -0.636109 -0.323668 3.094872 -0.370836 0.080858 0.070322 0.048905 -0.189061 0.235718 11.830220 -5.489142 10.382275 1.836290 -2.523545 7.158545 -2.233234 -1.432093 5.679388 -8.465545 7.060418 11.915367 -7.303729 4.333837 -12.238037 -12.344754 4.444545 -2.186519 -38.594967 4.894594 -6.635296 0.700253 -10.057399 -1.546314 0.254377 -0.174870 0.705543 -0.220375 0.318856 0.130861 1.993550 -4.773497 -7.243268 29.595652 3.768939 -5.750490 -3.320504 4.763573 -0.407473 -0.251150 0.122811 -0.018115 0.067870 -0.172662 -0.237253 +29.141037 158.040817 24.586361 6.097801 -8.084673 -8.961074 -3.645773 -2.112123 0.746925 -27.999199 9.978824 37.101139 -0.461625 0.093452 -0.134490 0.584979 0.242272 0.595047 9.974692 5.021971 -20.964664 -0.988532 -0.342287 2.615807 -0.374972 0.097665 0.065072 0.055438 -0.202383 0.229859 11.922394 -5.433435 10.880869 1.674691 -2.309173 6.927113 -2.558054 -1.230235 5.207182 -8.500327 6.316292 11.783564 -6.782297 3.529876 -13.271473 -14.868720 2.971324 -2.428028 -39.410912 4.396306 -6.682635 -0.771670 -10.591772 -1.579446 0.264748 -0.185712 0.718039 -0.237223 0.327397 0.121769 4.568351 -3.170446 -7.274943 31.154720 3.604027 -5.880287 -2.058068 3.598397 -0.301977 -0.251484 0.138456 -0.016976 0.076064 -0.170125 -0.240267 +29.013243 157.729721 24.095802 5.655987 -5.207283 -8.880144 -3.534804 -2.506983 0.745981 -27.057346 9.708907 38.250732 -0.457436 0.065780 -0.130228 0.627910 0.292682 0.609451 9.162701 4.725035 -21.163876 -0.882665 -0.368821 1.779833 -0.391600 0.103372 0.069681 0.084727 -0.219092 0.221234 12.332123 -5.633175 11.093179 1.611233 -2.237217 6.666456 -2.870291 -1.225025 4.803767 -8.673305 5.568934 11.918119 -6.087243 2.604244 -13.612399 -17.395287 1.384362 -2.891054 -40.121067 3.354253 -6.523072 -2.168480 -10.411863 -1.529809 0.302995 -0.169408 0.721786 -0.257535 0.342308 0.150156 7.278218 -1.809242 -7.262040 32.195698 3.394795 -5.820215 -0.176333 2.703054 -0.238702 -0.251986 0.117321 -0.007714 0.080615 -0.205563 -0.231827 +28.812553 157.390747 23.601765 5.071200 -1.310085 -8.979477 -3.462275 -3.336172 0.716446 -25.579695 9.125874 39.875916 -0.492643 0.087285 -0.137740 0.617298 0.272974 0.604863 8.105640 4.269726 -21.185204 -0.702254 -0.442023 0.841704 -0.384840 0.106259 0.069463 0.087386 -0.209265 0.208792 12.515598 -6.103667 11.171701 1.573356 -2.628595 6.241263 -3.018596 -1.586869 4.192698 -8.397943 4.472079 12.649495 -5.669162 1.668499 -13.462651 -19.601292 0.114812 -3.444099 -40.997837 2.215185 -6.293734 -3.315649 -10.089608 -1.519195 0.295370 -0.202706 0.742351 -0.256873 0.332259 0.141809 9.265132 -0.571831 -7.364284 34.286995 3.681692 -5.850706 1.306664 1.601235 -0.169276 -0.269453 0.138047 -0.033514 0.103644 -0.188527 -0.243393 +28.608938 157.042282 22.977921 4.519161 2.013033 -8.804413 -3.394229 -3.978602 0.373990 -23.799622 8.386347 41.092442 -0.514966 0.115132 -0.143671 0.596098 0.245459 0.579663 7.000577 4.003871 -21.745338 -0.159948 -0.485320 0.280459 -0.372178 0.103611 0.066446 0.083532 -0.184906 0.202915 12.647942 -6.286822 11.069590 1.561930 -2.801963 5.771015 -3.063146 -1.741449 3.537047 -8.382360 3.646526 13.512518 -4.685461 0.533655 -12.818738 -21.337523 -0.555319 -4.372241 -42.785118 0.400613 -6.014304 -3.957402 -9.570695 -1.536533 0.278947 -0.221616 0.748259 -0.249836 0.314032 0.134122 11.084444 0.315532 -7.665232 36.468132 4.319850 -5.811065 2.618415 0.804768 -0.126575 -0.282495 0.155875 -0.051592 0.122192 -0.160442 -0.242672 +28.269754 156.747116 22.085966 4.339755 5.296126 -8.639063 -3.617352 -4.591505 -0.341889 -21.957815 7.643816 42.464226 -0.505066 0.107336 -0.159795 0.610407 0.263906 0.591155 5.706355 3.739227 -22.587250 -0.090952 -0.500829 0.227994 -0.385572 0.111254 0.050840 0.083885 -0.204308 0.223617 11.834533 -6.071802 11.287779 1.570490 -2.841987 5.399930 -2.697854 -1.820980 3.000845 -8.001896 2.335232 14.489170 -4.157847 -0.487822 -13.120970 -23.117996 -1.308810 -5.490103 -44.473148 -1.976666 -5.616940 -4.536611 -9.536870 -1.556270 0.281131 -0.208150 0.746406 -0.261006 0.334910 0.123406 12.868900 1.404231 -8.020859 39.191956 5.215048 -5.776736 3.076337 0.101030 -0.083253 -0.276038 0.158793 -0.022358 0.106005 -0.158756 -0.236427 +27.906647 156.365646 20.963110 4.410641 8.778469 -8.338996 -4.177017 -5.352042 -1.658212 -20.224306 6.942038 44.196724 -0.535718 0.119804 -0.180802 0.624613 0.269391 0.609464 3.839717 3.319544 -23.641001 0.223997 -0.524266 0.164661 -0.397049 0.108205 0.042280 0.094038 -0.221937 0.235733 10.139997 -5.523827 11.436276 1.734672 -2.940818 5.203216 -1.683958 -1.921312 2.758838 -7.059371 0.565439 15.375489 -4.164672 -1.303845 -13.411613 -24.844503 -2.740470 -6.342815 -46.644436 -4.423630 -5.258162 -4.806755 -10.321457 -1.675398 0.277285 -0.214437 0.768935 -0.265002 0.348155 0.115994 14.550628 3.274301 -8.091605 41.522835 6.248281 -5.643144 3.137065 -0.153997 -0.054676 -0.296286 0.163144 -0.024494 0.102438 -0.154571 -0.253131 +27.595140 156.091187 19.665060 4.221858 12.222312 -7.969398 -4.574879 -6.088915 -3.173878 -18.257891 6.093777 45.741943 -0.570213 0.118552 -0.205769 0.633910 0.272650 0.639866 1.913334 3.026387 -25.046480 0.575317 -0.519392 0.811232 -0.405243 0.130598 0.030969 0.102196 -0.251892 0.227176 9.002395 -5.115981 11.744984 1.919923 -2.989323 5.034914 -0.848791 -1.953063 2.456093 -6.277222 -1.312865 16.256500 -3.939985 -2.269178 -14.331126 -26.406481 -4.466504 -6.793521 -49.275414 -6.716758 -5.002645 -5.024380 -12.097875 -1.867526 0.285072 -0.248475 0.802474 -0.285292 0.365618 0.092980 15.311470 5.812951 -7.629855 43.943398 7.164374 -5.528250 3.167697 0.660597 -0.068037 -0.305083 0.190886 -0.035135 0.111840 -0.150457 -0.276370 +27.116629 155.906204 18.604557 4.329813 15.240598 -7.697303 -4.911915 -6.451137 -4.112158 -16.486551 5.374850 46.628201 -0.605056 0.123380 -0.212928 0.647117 0.281501 0.666244 0.013548 2.800500 -26.351377 0.832223 -0.486264 2.147160 -0.419245 0.161164 0.023121 0.119243 -0.262878 0.206694 7.971820 -4.710463 11.501247 1.787841 -3.014975 5.102662 -0.466259 -1.969558 2.622693 -6.092480 -2.862349 17.486681 -3.411625 -3.446512 -15.150769 -27.364672 -6.139272 -7.003966 -51.347263 -8.929889 -4.592390 -5.766596 -14.325867 -2.017407 0.300741 -0.300162 0.839764 -0.309215 0.383186 0.089105 16.131170 8.795153 -7.216225 46.506470 8.447229 -5.371361 2.538527 1.778814 -0.133308 -0.312699 0.224473 -0.058877 0.152143 -0.153341 -0.289569 +26.635674 155.817032 17.676298 4.469336 18.438759 -7.554540 -5.331704 -6.904976 -4.792204 -14.642678 4.535426 47.446972 -0.618371 0.113436 -0.214892 0.687401 0.323274 0.695304 -2.268661 2.399260 -27.167358 1.772370 -0.456835 3.508718 -0.437950 0.185195 0.020500 0.147397 -0.273279 0.195719 6.751513 -4.332043 11.024366 1.817539 -3.168061 5.341701 0.210218 -2.161468 3.137522 -6.325934 -3.960777 18.357395 -2.367594 -4.660659 -16.102848 -27.928358 -7.870063 -7.119432 -53.491894 -11.318644 -4.021638 -6.836498 -16.664190 -2.095754 0.327490 -0.317331 0.859239 -0.333751 0.402476 0.102485 17.375175 11.792508 -6.971258 47.440346 10.014883 -4.880489 2.702505 2.605687 -0.191300 -0.316295 0.233355 -0.059265 0.180016 -0.174938 -0.287606 +26.251764 155.855118 16.888285 4.535508 21.535776 -7.519525 -5.677888 -7.207882 -5.377047 -12.677802 3.673854 48.068851 -0.656320 0.115019 -0.226504 0.716271 0.359364 0.704910 -4.807043 2.063550 -27.888044 3.103678 -0.505970 5.918813 -0.447647 0.195726 0.025226 0.181959 -0.272186 0.180820 6.133019 -4.163436 9.891955 1.622010 -3.363647 5.872842 0.427960 -2.368970 4.249702 -6.390102 -4.814962 19.150347 -1.610486 -5.565776 -17.028254 -27.707073 -9.734378 -6.959610 -55.536041 -13.697385 -3.317946 -8.666479 -19.988319 -2.044225 0.337919 -0.347150 0.882842 -0.343954 0.410293 0.113205 17.414997 14.978840 -6.749334 49.280174 11.872175 -4.524707 2.254881 4.816284 -0.423550 -0.340940 0.248493 -0.074888 0.216715 -0.180830 -0.291352 +25.764318 156.128082 15.907289 4.696322 23.829775 -7.570925 -5.907414 -7.131886 -5.943677 -11.098533 3.144655 48.323887 -0.666339 0.097057 -0.239882 0.761246 0.430180 0.699197 -7.295033 1.968094 -28.689085 4.835948 -0.610713 8.912459 -0.461944 0.194954 0.024439 0.226890 -0.271691 0.178677 5.566652 -3.804609 9.249895 1.419187 -3.276936 6.583102 0.480642 -2.359561 5.542003 -6.753961 -5.431414 19.576117 -0.345162 -6.672997 -18.085983 -27.361067 -12.277717 -6.614029 -56.936787 -16.366074 -2.489535 -10.271459 -24.236067 -1.913069 0.353874 -0.331155 0.875917 -0.354175 0.419434 0.133639 17.754854 18.857485 -6.875865 49.469421 14.636652 -3.550971 2.458959 6.047445 -0.543968 -0.357518 0.237408 -0.057832 0.234577 -0.192971 -0.271944 +25.166931 156.644455 14.819669 4.844276 25.722618 -7.818984 -6.154426 -6.876193 -6.353540 -9.450631 2.650651 48.336094 -0.672981 0.080640 -0.254259 0.803702 0.502213 0.693764 -9.802073 2.152521 -29.723602 7.316015 -0.910602 13.033252 -0.474850 0.199401 0.024266 0.269082 -0.266669 0.179246 5.129659 -3.366827 9.029748 1.284563 -3.084219 7.361532 0.465062 -2.239733 6.852462 -7.239060 -6.050381 20.090130 0.949662 -7.809561 -19.400423 -26.716757 -15.319329 -6.205644 -57.701885 -19.241638 -1.414664 -12.323476 -28.820805 -1.485177 0.363551 -0.324045 0.865740 -0.362475 0.431046 0.149655 17.591602 22.878622 -7.020157 48.983776 17.483776 -2.602768 3.094691 8.183731 -0.684511 -0.371071 0.236891 -0.036156 0.257959 -0.200740 -0.247467 +24.512119 157.271927 13.984859 4.441242 27.460194 -8.137640 -5.571211 -6.410706 -6.516873 -8.092252 2.286307 47.531002 -0.675214 0.087608 -0.253799 0.827782 0.543276 0.683586 -11.715779 2.656454 -30.708874 9.936842 -1.456143 17.554523 -0.485444 0.183860 0.019519 0.297041 -0.247476 0.193378 5.164411 -3.186732 8.474540 1.143474 -2.992933 8.102832 0.268836 -2.193507 8.180728 -7.285074 -6.809966 20.031612 1.621186 -8.668216 -19.973759 -25.850964 -17.966930 -5.773623 -58.102531 -22.097084 -0.165981 -14.916681 -33.913589 -0.617247 0.356965 -0.308319 0.850025 -0.354526 0.434312 0.168512 16.538921 25.997391 -7.274403 48.629860 20.112856 -1.926184 3.994140 12.185192 -0.943659 -0.383326 0.222024 -0.022433 0.271206 -0.204431 -0.224937 +23.814491 158.199539 13.294817 3.256044 29.063789 -9.155458 -4.263346 -5.738843 -5.939646 -6.523683 1.809567 45.968437 -0.671084 0.064617 -0.262712 0.855866 0.595954 0.669672 -12.887477 3.567952 -30.921839 13.017015 -2.249657 21.916311 -0.492669 0.184214 0.021121 0.325015 -0.246415 0.191221 5.819688 -3.089695 8.592896 1.310256 -2.822544 8.745311 0.045570 -2.052399 9.162944 -7.495933 -7.501566 20.265594 2.902846 -9.537364 -20.967094 -25.429478 -20.671041 -5.166546 -57.896339 -25.034472 1.128080 -16.931236 -39.738041 0.470246 0.371573 -0.289137 0.837893 -0.362820 0.439639 0.183195 15.678104 28.474581 -7.579505 47.163280 22.666531 -1.377524 5.270758 16.495649 -1.041277 -0.389334 0.213223 -0.003287 0.278387 -0.213085 -0.204013 +23.040192 159.286911 12.727063 2.085419 30.759121 -10.160823 -3.242544 -5.104708 -5.097264 -4.353311 1.037138 44.016834 -0.671207 0.061167 -0.265493 0.869985 0.620600 0.648996 -13.886631 4.521673 -30.881811 16.438240 -3.338301 26.047087 -0.487922 0.175094 0.022171 0.344452 -0.230953 0.186936 6.452976 -3.046989 8.438512 1.410854 -2.733289 9.483829 -0.280487 -1.988145 10.343064 -7.657225 -7.926242 20.310543 4.373731 -10.259583 -21.355604 -24.526140 -23.240887 -4.442122 -57.102985 -28.010933 2.449670 -18.336750 -46.795601 1.761278 0.376816 -0.265207 0.823757 -0.362175 0.426435 0.196084 14.769696 30.711937 -7.982075 45.514183 25.363480 -0.828398 5.838742 20.116573 -1.104372 -0.396609 0.197824 0.001988 0.282951 -0.213551 -0.188292 +22.207411 160.471512 12.184043 1.061291 32.598038 -10.967278 -2.461814 -4.708122 -4.387957 -2.097421 0.138652 41.779812 -0.668624 0.066232 -0.263059 0.890615 0.651212 0.635969 -14.800729 5.151631 -30.539011 19.701668 -4.647790 29.593250 -0.493659 0.152623 0.025192 0.365140 -0.213416 0.201603 6.798256 -3.182018 8.022310 1.412541 -2.873770 10.164309 -0.609947 -2.162307 11.538822 -7.301456 -8.453079 20.477814 5.060830 -10.631055 -21.281103 -23.219326 -26.046133 -4.101646 -55.558712 -30.929806 3.858132 -18.512182 -51.258770 2.607941 0.371746 -0.237674 0.807912 -0.349131 0.424182 0.219410 13.230483 32.914146 -8.366644 44.366531 27.835798 -0.350682 5.837532 23.977058 -1.295515 -0.410005 0.172704 0.013661 0.282058 -0.221510 -0.171468 +21.438578 161.726349 11.673812 -0.040830 34.313217 -11.628920 -1.673478 -4.303185 -3.717794 -0.272738 -0.541548 39.043907 -0.685965 0.086447 -0.266125 0.904197 0.670933 0.625360 -15.100551 5.763575 -30.338890 22.089275 -6.028378 33.239742 -0.490705 0.133836 0.024913 0.388916 -0.189638 0.207924 7.654266 -3.481496 7.124373 1.258029 -3.029691 10.991680 -1.254539 -2.294507 13.125048 -7.143106 -8.871862 19.970989 5.773728 -11.021746 -21.883251 -20.821547 -28.345280 -4.319683 -54.832836 -34.347569 5.611211 -15.797197 -55.249847 1.883756 0.356126 -0.227107 0.797248 -0.335097 0.411352 0.229674 10.472245 34.357101 -9.389892 44.083149 30.640524 0.378157 5.566575 28.412239 -1.608877 -0.430060 0.160694 0.010856 0.295812 -0.215696 -0.162428 +20.723335 163.032257 11.191214 -0.926990 35.945194 -12.042765 -1.089631 -4.046011 -3.182861 1.154779 -1.059013 36.375290 -0.726320 0.131717 -0.266789 0.882876 0.653905 0.585654 -15.328492 6.021835 -29.709166 24.265753 -7.479314 36.149906 -0.466941 0.111024 0.029957 0.404861 -0.137648 0.197424 8.484181 -3.707858 6.060759 1.080041 -3.164773 11.800040 -1.876318 -2.343385 14.762287 -7.194626 -9.298961 19.137547 6.506810 -11.665500 -22.415083 -17.928062 -30.181505 -4.954783 -54.551098 -38.053963 7.641475 -9.352050 -57.531986 -1.280784 0.319570 -0.247312 0.788946 -0.307776 0.372475 0.230132 7.571458 35.000576 -10.470747 43.392273 33.488678 1.136706 5.233444 33.810329 -1.940118 -0.461675 0.169901 -0.022040 0.335063 -0.181301 -0.156481 +19.941734 164.258789 10.768316 -1.523354 37.582172 -12.106589 -0.611570 -3.879785 -2.685056 2.126771 -1.410940 33.377792 -0.733239 0.182211 -0.239170 0.870619 0.641316 0.548350 -15.162399 6.003363 -28.972998 25.431137 -8.677767 38.719017 -0.444807 0.074815 0.037785 0.421033 -0.068291 0.197358 8.695419 -3.708487 4.763141 0.921431 -3.203096 12.574789 -2.140428 -2.400179 16.520481 -6.731329 -9.662606 17.750376 7.522861 -12.259892 -22.043783 -14.683785 -31.439707 -6.016951 -53.927593 -41.983082 9.688093 -0.180859 -57.220863 -6.157604 0.282603 -0.235744 0.753213 -0.268739 0.327572 0.255280 5.366356 34.975170 -11.412416 41.867855 36.594833 2.093506 4.509552 38.822159 -2.274927 -0.481455 0.145630 -0.043949 0.365524 -0.168434 -0.134852 +19.230129 165.376297 10.375430 -1.902600 38.971424 -11.598115 -0.258452 -3.666492 -2.409913 2.587248 -1.527363 30.199461 -0.736054 0.227359 -0.212117 0.860992 0.633863 0.510839 -15.075758 5.809106 -28.478971 26.066092 -9.787413 41.197960 -0.418194 0.027713 0.051263 0.435082 -0.002006 0.202367 8.911913 -3.606342 3.203442 0.729307 -3.134586 13.084082 -2.291216 -2.388950 18.104635 -6.328229 -10.260142 16.036341 7.892051 -13.038393 -21.588837 -10.477677 -31.491276 -7.363132 -54.548618 -45.883717 12.365843 8.642369 -56.008240 -10.829762 0.241057 -0.213507 0.704999 -0.222102 0.277010 0.278385 2.357427 34.070740 -12.345271 41.152473 39.719810 3.448417 2.151344 44.600342 -3.408776 -0.504541 0.110998 -0.054951 0.384940 -0.156536 -0.111522 +18.687124 166.347504 9.974314 -2.310689 40.279587 -11.006674 0.100357 -3.499732 -2.295786 2.487200 -1.474953 27.307718 -0.744386 0.272430 -0.183019 0.840567 0.626667 0.461808 -14.897219 5.382519 -27.718615 26.136374 -10.742693 43.419033 -0.377804 -0.030645 0.068254 0.460318 0.069421 0.190501 9.313206 -3.503044 1.506375 0.548280 -2.994091 13.425483 -2.409700 -2.314191 19.640181 -5.704848 -10.987378 14.186208 7.560336 -13.808394 -20.347181 -6.513134 -31.244968 -8.634365 -54.938385 -49.560467 14.906215 16.944607 -53.622711 -14.881430 0.191178 -0.196107 0.638077 -0.162955 0.210821 0.301725 -0.985180 33.011467 -12.947491 39.825062 42.177673 4.524916 -2.254645 50.302353 -5.802182 -0.532254 0.067030 -0.077917 0.411554 -0.143862 -0.088877 +18.060892 167.234177 9.574602 -2.503239 41.375919 -10.348382 0.313622 -3.236461 -2.151685 2.520932 -1.417373 24.281450 -0.759291 0.314480 -0.153257 0.836363 0.640097 0.422754 -14.572427 5.147749 -26.804932 25.770674 -11.338579 45.355209 -0.348792 -0.076431 0.083798 0.497903 0.142219 0.175041 9.530257 -3.335175 0.092881 0.380000 -2.821460 13.801282 -2.498828 -2.203831 21.189375 -5.234855 -11.602422 12.219041 7.642187 -14.588822 -19.976063 -2.457355 -30.242067 -10.026138 -55.791397 -53.192753 17.921051 23.789381 -52.122158 -18.169596 0.150129 -0.190574 0.582111 -0.114369 0.155109 0.331486 -3.918231 31.523756 -13.670365 38.664120 44.947613 5.792022 -8.619454 54.821968 -9.548865 -0.561699 0.033013 -0.102164 0.457572 -0.137013 -0.062737 +17.522770 167.861908 9.231841 -2.534388 41.928226 -9.327371 0.399138 -2.895864 -2.123811 2.440695 -1.301455 21.389631 -0.742432 0.333099 -0.120285 0.845508 0.682946 0.365261 -14.100406 5.117535 -25.721895 24.800455 -11.346853 46.610592 -0.315162 -0.157269 0.101760 0.545211 0.209812 0.171700 9.921843 -2.921320 -1.544459 0.157356 -2.319041 13.918758 -2.748673 -1.888437 22.535528 -4.519524 -12.665752 10.148438 7.236514 -15.656990 -18.376480 1.733468 -28.637024 -11.167365 -57.143940 -57.041912 22.006670 29.470840 -50.953091 -20.705275 0.114865 -0.121885 0.481518 -0.052253 0.089502 0.378465 -6.999198 29.707127 -14.125741 38.072811 47.070999 7.218060 -16.802546 57.681587 -14.751307 -0.585693 -0.054971 -0.094647 0.464285 -0.147754 -0.017224 +17.038029 168.255035 8.950584 -2.648692 42.096210 -8.263953 0.629836 -2.525081 -2.022045 1.749012 -1.041924 18.632061 -0.732197 0.378130 -0.074694 0.830158 0.691727 0.306290 -13.192470 5.209767 -24.292976 23.231970 -10.726810 46.869068 -0.269955 -0.238711 0.123302 0.580649 0.298648 0.163671 10.110391 -2.472841 -3.038821 -0.014700 -1.840771 13.869283 -2.902485 -1.543239 23.565681 -3.540960 -13.477184 7.882901 6.449614 -16.431211 -16.352365 5.223634 -26.780432 -11.762089 -58.829777 -60.872795 26.695683 35.853588 -49.717781 -23.559652 0.057281 -0.078550 0.380397 0.024739 0.010770 0.419542 -9.650103 27.694958 -14.293766 36.838371 49.284142 8.743846 -25.710646 59.587105 -20.479643 -0.611490 -0.129753 -0.108443 0.487490 -0.146928 0.022273 +16.562016 168.486069 8.716304 -2.360321 42.547981 -6.863999 0.466906 -2.172605 -1.829564 1.126465 -0.839530 15.524995 -0.769601 0.453560 -0.048732 0.807118 0.675704 0.257755 -12.430118 5.072149 -22.558023 21.572147 -9.887450 46.221214 -0.222039 -0.324161 0.142270 0.614630 0.386305 0.158941 9.576869 -2.186552 -4.422950 -0.180364 -1.668776 13.638829 -2.730791 -1.370388 24.293818 -2.587760 -13.965160 5.836884 5.085770 -16.803114 -14.604775 7.846695 -24.405348 -12.159298 -61.781494 -64.193207 32.301254 40.748821 -47.924335 -25.388180 -0.020840 -0.064476 0.311044 0.107970 -0.072615 0.440397 -11.862582 25.530787 -14.400235 35.648048 51.772503 10.497199 -33.838905 59.846287 -25.374178 -0.664033 -0.183772 -0.146645 0.519173 -0.122722 0.034068 +16.009865 168.634048 8.549294 -1.814955 42.953789 -5.568084 0.031287 -1.872860 -1.411179 0.596582 -0.703577 12.976329 -0.777980 0.485012 -0.023631 0.792603 0.676827 0.222472 -11.626057 4.741498 -20.150265 19.584585 -8.669704 44.430088 -0.187022 -0.375358 0.157717 0.641319 0.443979 0.142626 8.949219 -1.913196 -5.546807 -0.470347 -1.443075 13.487349 -2.863154 -1.153778 24.905415 -1.644998 -14.329818 4.590631 4.553100 -17.053093 -13.341921 10.106936 -22.558868 -12.292032 -63.396645 -67.226295 37.006577 44.856899 -45.988918 -26.510292 -0.060908 -0.050900 0.252072 0.159145 -0.128951 0.460674 -13.562342 23.763559 -13.936574 34.601311 53.841854 11.711248 -43.928200 58.926441 -31.312250 -0.686214 -0.225371 -0.169588 0.542338 -0.119236 0.050895 +15.536944 168.705414 8.440519 -1.038251 42.629860 -4.394301 -0.633712 -1.500186 -0.438065 -0.022119 -0.585793 10.348891 -0.752269 0.488227 -0.005131 0.799392 0.688347 0.212396 -10.569515 4.390658 -16.915546 16.835037 -6.841002 41.077587 -0.179123 -0.406784 0.154293 0.650265 0.459344 0.152208 8.221095 -1.580770 -6.471900 -0.710672 -1.146535 13.495934 -3.064167 -0.794146 25.429632 -1.303423 -14.681625 3.763892 4.386237 -17.530979 -12.686896 11.745230 -21.478956 -12.116253 -62.285782 -69.919273 39.350536 48.310139 -44.224766 -27.180784 -0.064499 -0.003519 0.209089 0.175172 -0.146834 0.478663 -14.427497 22.758970 -13.160471 31.205866 55.644516 11.563784 -52.172802 57.433857 -35.489258 -0.676917 -0.272461 -0.154745 0.525079 -0.133517 0.071587 +15.070495 168.574783 8.431156 -0.290038 42.273487 -3.314117 -1.346378 -1.121383 0.574778 -0.007437 -0.550819 7.692607 -0.771068 0.530366 0.009406 0.789224 0.678371 0.178775 -9.502197 3.825621 -12.976598 14.075216 -4.958249 35.806370 -0.152059 -0.453248 0.161913 0.669011 0.512138 0.148402 7.181945 -1.177414 -7.538620 -0.857186 -0.869071 13.623814 -2.982444 -0.418474 26.178905 -0.767168 -14.661461 2.656714 4.355723 -17.809359 -11.948652 13.751911 -19.806362 -12.209868 -61.211620 -72.682259 41.933270 51.195114 -42.515987 -27.577179 -0.099852 0.016591 0.172632 0.214672 -0.197516 0.493878 -14.988359 21.376059 -12.565054 26.983641 57.292175 10.934783 -58.241360 55.737331 -37.933319 -0.702727 -0.306188 -0.176072 0.541285 -0.118596 0.082050 +14.508222 168.289093 8.495703 0.605823 41.100864 -2.069208 -1.978783 -0.650863 1.547334 0.012345 -0.480817 4.796735 -0.765250 0.549686 0.017632 0.776435 0.671852 0.139625 -8.139223 3.516699 -9.253458 10.278966 -2.867769 30.162609 -0.136097 -0.492970 0.163875 0.672279 0.544928 0.159414 5.811234 -0.347855 -8.556785 -0.860641 -0.195246 13.614306 -2.621492 0.313664 26.581839 -0.233719 -14.977542 2.000534 4.382761 -18.226637 -11.305650 15.210334 -18.234890 -12.115201 -60.617699 -75.596184 45.058079 53.098255 -40.487617 -27.222111 -0.122294 0.053563 0.137074 0.242115 -0.227497 0.505975 -15.074025 20.344606 -11.782967 22.344997 58.349854 9.735992 -62.368271 53.936634 -38.846844 -0.712225 -0.337819 -0.172621 0.532582 -0.105669 0.100521 +14.005503 167.818817 8.543565 1.570004 40.213821 -0.763812 -2.444937 -0.305819 1.997408 -0.202848 -0.384317 2.556235 -0.763432 0.599497 0.028844 0.734299 0.617382 0.102421 -7.262449 2.989761 -5.700957 6.758444 -1.382336 24.437973 -0.110707 -0.531431 0.161715 0.649859 0.588326 0.179662 4.196081 0.331002 -9.528341 -0.864063 0.316018 13.452916 -2.092408 0.920868 26.720657 0.351708 -15.286449 1.648702 4.003334 -18.496925 -10.152276 16.044497 -16.629969 -11.759386 -60.653557 -77.979538 48.357933 54.962593 -39.052269 -27.124033 -0.172080 0.071233 0.106281 0.282046 -0.265232 0.498368 -14.951234 19.369461 -10.925515 18.468014 59.050404 8.662132 -65.705521 52.258087 -39.281223 -0.721355 -0.351674 -0.179873 0.522828 -0.070832 0.107448 +13.479224 167.390640 8.594753 2.543075 38.417313 0.188307 -2.849252 0.078763 2.639567 -0.597739 -0.263363 0.481669 -0.782891 0.644232 0.040970 0.683540 0.554225 0.070443 -6.856147 2.406003 -2.312422 3.704601 -0.399372 18.905346 -0.081107 -0.537342 0.166768 0.630584 0.633238 0.163858 2.970963 1.115824 -10.271321 -1.008731 1.037758 13.559465 -2.018279 1.844362 27.053228 0.690664 -15.294487 1.604647 4.228273 -18.658215 -9.583572 16.504675 -15.130298 -11.630474 -58.156033 -79.718330 48.832214 56.228195 -38.777798 -27.207626 -0.209274 0.036202 0.102754 0.306287 -0.303561 0.484513 -14.689356 18.322502 -10.099127 14.392219 59.350132 7.294395 -70.056129 51.601223 -41.053566 -0.731632 -0.328415 -0.218878 0.551784 -0.033565 0.102327 +12.958972 167.067917 8.349648 2.702205 36.701839 0.486348 -2.678700 0.306702 2.864173 -1.107628 -0.172925 -0.808694 -0.828277 0.705107 0.035266 0.654131 0.523373 0.043678 -6.154392 1.836419 0.406537 1.431441 0.115053 13.854359 -0.060211 -0.564655 0.165787 0.639485 0.679597 0.167526 3.005822 1.667304 -10.683477 -1.114153 1.600607 13.901406 -2.317943 2.675538 27.748314 0.799350 -15.130547 0.893629 3.781889 -18.618504 -9.551449 16.266733 -13.564447 -11.777896 -54.775467 -81.217941 47.960983 58.047916 -38.559799 -27.637945 -0.266995 0.008268 0.095511 0.344565 -0.336193 0.472432 -14.631280 17.046846 -9.877468 10.202535 59.665512 5.718135 -74.244888 51.105705 -42.939346 -0.767504 -0.315106 -0.251355 0.584179 0.009071 0.096686 +12.452128 167.009888 8.077014 2.461706 35.263344 0.139519 -2.206611 0.438580 3.187374 -1.335386 -0.128689 -1.583616 -0.816248 0.700272 0.045012 0.634431 0.509062 0.017517 -5.480972 1.246305 2.747751 0.018858 0.324239 9.648031 -0.051052 -0.548562 0.174625 0.628151 0.697241 0.151840 4.024122 2.058709 -10.749973 -1.356176 2.137061 14.453202 -3.210816 3.475378 28.347219 0.293650 -14.566850 0.815414 4.702866 -18.753145 -9.856362 16.209381 -13.630665 -11.716234 -43.786751 -81.348572 38.521572 59.631126 -39.055981 -28.324064 -0.262782 -0.005497 0.093871 0.339756 -0.344698 0.475108 -14.263066 16.940414 -9.636518 5.357641 59.554520 3.299359 -76.598694 50.618366 -43.652618 -0.758523 -0.294897 -0.258568 0.602120 0.019008 0.108223 +11.955856 167.041473 7.815316 2.200115 34.074883 0.206242 -1.639331 0.305574 2.427539 -1.750045 -0.101623 -1.330747 -0.835996 0.736500 0.046488 0.597050 0.454322 -0.014514 -4.746152 0.807878 3.998532 -1.084824 0.383308 6.127007 -0.037535 -0.547111 0.178894 0.603604 0.729274 0.152477 5.311884 2.517585 -10.576951 -1.705931 2.709427 14.624536 -4.301122 4.300492 28.432043 -0.188175 -14.214143 0.843948 5.385569 -19.039980 -10.034118 16.288984 -13.570398 -11.571184 -37.661831 -81.309227 33.572430 61.485229 -39.728085 -29.360188 -0.282154 -0.033810 0.115317 0.347612 -0.361860 0.466673 -13.979778 16.668598 -9.179684 3.202501 59.799908 2.375279 -80.272774 50.243973 -45.521988 -0.768399 -0.263099 -0.284966 0.620532 0.054882 0.105502 +11.463541 167.175400 7.615250 1.644520 33.440304 0.253261 -0.925995 0.126036 1.482330 -1.911165 -0.098357 -0.955948 -0.813821 0.729590 0.060691 0.579135 0.431806 -0.022549 -3.619632 0.554533 4.396863 -2.148628 0.452830 4.018525 -0.033604 -0.539301 0.188081 0.580839 0.732228 0.150398 6.368691 2.689648 -10.363791 -1.849836 3.009660 14.549895 -4.934672 4.726927 28.222124 -0.745950 -13.666760 1.106444 5.366399 -18.867844 -9.584204 16.453615 -13.829520 -10.843252 -34.535763 -80.701866 30.749111 64.715393 -40.373333 -31.275719 -0.278773 -0.037142 0.113378 0.347625 -0.362174 0.468746 -14.035901 16.653095 -8.824483 2.001298 60.208763 1.997700 -82.096458 49.898731 -46.284203 -0.755234 -0.256565 -0.283784 0.615073 0.053241 0.108455 +10.993239 167.237579 7.539951 1.295010 33.481121 0.521082 -0.324293 -0.038454 0.457881 -2.060845 -0.079292 -0.507485 -0.823459 0.768823 0.068638 0.528464 0.364369 -0.034665 -2.861637 0.395406 4.423781 -2.633402 0.431289 2.594620 -0.007050 -0.549561 0.188721 0.551500 0.755267 0.147824 6.933473 2.812271 -10.289229 -1.887934 3.156713 14.240685 -5.206841 5.012040 27.864391 -1.051928 -13.655925 1.466474 4.331422 -18.791845 -8.415689 16.597418 -13.252803 -10.271108 -36.878922 -80.977745 33.450073 67.122765 -40.310059 -32.465187 -0.319352 -0.065203 0.105016 0.374625 -0.389421 0.444431 -14.540864 15.856384 -8.482399 1.997767 60.547745 2.622039 -84.576508 50.054199 -47.953842 -0.757898 -0.240801 -0.308830 0.619544 0.084014 0.095659 +10.492373 167.312592 7.450802 1.196500 33.919628 0.617233 -0.041295 -0.115466 -0.034266 -1.928445 -0.085836 -0.449756 -0.815569 0.776384 0.075136 0.506014 0.325132 -0.026379 -2.398987 0.297562 4.517623 -2.742403 0.401983 1.924661 -0.000041 -0.552527 0.185534 0.525945 0.747547 0.150814 6.901422 2.838551 -10.187568 -1.849278 3.180538 14.128212 -5.088349 5.059543 27.636864 -1.227593 -13.682513 1.796692 3.468035 -18.599436 -7.448743 16.908384 -13.486770 -9.805251 -34.709290 -80.651840 31.541033 68.689369 -40.359444 -33.268707 -0.326670 -0.066251 0.104823 0.379735 -0.394237 0.430956 -14.917236 16.137800 -8.020524 1.573260 60.114002 2.577746 -86.773041 50.163651 -49.522564 -0.747943 -0.242738 -0.313466 0.600900 0.087909 0.082838 +10.042785 167.362900 7.409591 1.103975 33.979431 0.673347 0.195685 -0.075464 -0.116285 -1.825712 -0.088740 -0.806052 -0.795450 0.758017 0.076582 0.511727 0.330893 -0.024579 -2.086533 0.226044 4.401073 -2.553589 0.370667 1.487296 -0.000196 -0.561265 0.183746 0.522715 0.731606 0.154432 6.877834 2.899671 -10.189466 -1.852989 3.277582 14.061892 -5.094145 5.133415 27.595903 -1.399282 -13.522391 2.257778 3.224619 -18.447943 -6.748367 17.225178 -13.233134 -9.625971 -33.884827 -80.705353 30.981220 69.179573 -40.153439 -33.357933 -0.313078 -0.034787 0.092228 0.376603 -0.393029 0.435271 -15.017733 15.959023 -7.926957 1.357403 60.508221 2.697932 -86.840057 49.996147 -49.352970 -0.736011 -0.267721 -0.298900 0.572397 0.073574 0.084829 +9.616451 167.313934 7.383577 1.220538 34.230259 0.622406 0.230571 -0.035240 0.042251 -1.527127 -0.106024 -1.134634 -0.765902 0.743211 0.082363 0.514276 0.332998 -0.027963 -1.871850 0.210533 4.445139 -2.460114 0.367419 1.524452 -0.002708 -0.561681 0.185297 0.510960 0.726979 0.164340 6.260054 2.925602 -10.205591 -1.795749 3.273537 14.131217 -4.743575 5.062759 27.673952 -1.304189 -13.308847 2.781027 3.625407 -18.327415 -6.301701 17.540573 -13.057667 -9.729997 -32.780350 -80.868057 30.153566 68.420479 -40.181412 -32.936153 -0.304163 -0.007525 0.081055 0.373941 -0.388547 0.441484 -14.618386 15.834386 -7.807631 0.826287 60.684471 2.683280 -87.390205 50.462826 -49.997082 -0.721362 -0.280565 -0.279007 0.549863 0.064345 0.094159 +9.303005 167.252426 7.293768 1.232568 34.683178 0.474910 0.197040 0.031295 0.286883 -1.105584 -0.130820 -1.724337 -0.765560 0.739267 0.068986 0.527362 0.341931 -0.025617 -1.684064 0.248492 4.421625 -2.434174 0.372566 1.769688 -0.012652 -0.569362 0.175961 0.510942 0.715045 0.182324 6.066134 3.041371 -10.214946 -1.693856 3.302436 14.209458 -4.501903 4.971045 27.795202 -0.937755 -13.256901 3.121925 4.101356 -18.195124 -6.394556 17.595268 -12.839832 -10.075691 -32.341721 -81.118774 30.098087 66.990913 -40.758858 -32.447964 -0.298262 0.020416 0.088509 0.368076 -0.379789 0.440394 -14.229906 15.612314 -7.828662 1.962926 60.533081 3.365970 -87.789757 51.222736 -51.005302 -0.722772 -0.292685 -0.264332 0.525719 0.064460 0.092659 +8.968754 167.167831 7.146215 1.381949 35.429028 0.456838 0.101620 -0.048881 -0.040603 -0.736985 -0.156048 -1.544584 -0.793290 0.752019 0.058949 0.528688 0.355558 -0.030494 -1.696548 0.294932 4.278858 -2.187216 0.360208 2.102972 -0.005214 -0.580239 0.180581 0.531575 0.727852 0.176124 5.681755 2.900441 -10.148498 -1.625783 3.125547 14.292733 -4.171819 4.772327 27.971828 -0.580064 -13.277518 2.819175 3.827273 -17.951632 -6.656736 17.428659 -12.139396 -10.612112 -33.844524 -81.430832 31.669037 65.749184 -41.053211 -31.974920 -0.320453 0.003271 0.083534 0.384848 -0.390559 0.436263 -14.394090 15.145332 -8.302116 2.260664 60.721401 3.668245 -87.505417 51.913006 -51.477657 -0.746406 -0.287915 -0.276745 0.545493 0.075031 0.088444 +8.621991 167.161285 7.049623 1.227778 35.940018 0.274685 0.277435 -0.104088 -0.343710 -0.576743 -0.170138 -1.399605 -0.782639 0.758410 0.069566 0.529441 0.360471 -0.029341 -1.543954 0.341663 4.001868 -1.694946 0.336475 2.631681 -0.005726 -0.586717 0.179225 0.534760 0.738722 0.181909 5.735066 2.737397 -10.073421 -1.626089 2.980023 14.322968 -4.132045 4.560612 28.067850 -0.313836 -13.435310 2.610354 3.639260 -17.946075 -6.464343 16.964933 -11.933111 -10.706272 -33.992123 -81.388275 31.762932 65.606773 -41.154209 -31.904236 -0.330163 0.008020 0.067724 0.394330 -0.392285 0.441809 -14.477422 15.319427 -8.529713 3.296667 61.269142 4.177522 -86.655357 52.028927 -51.133362 -0.743367 -0.296438 -0.271924 0.548627 0.070916 0.096833 +8.335776 167.162964 7.017150 1.158154 36.069458 0.093816 0.513630 -0.193180 -0.561071 -0.648085 -0.186324 -0.857826 -0.779334 0.772135 0.064984 0.526734 0.352295 -0.048018 -1.332691 0.443916 3.686069 -1.597836 0.357166 3.322105 0.001045 -0.610278 0.169021 0.533197 0.747095 0.197772 5.877307 2.649546 -9.987617 -1.680527 2.935882 14.354516 -4.257368 4.573883 28.132406 -0.442568 -13.521820 2.401300 3.808778 -18.333462 -6.183328 16.780916 -11.715172 -10.835422 -36.299534 -81.285095 33.569817 65.331917 -41.141613 -31.840427 -0.337470 0.045761 0.052242 0.401426 -0.406837 0.441739 -14.366479 15.261948 -8.724748 3.244602 61.631279 4.224452 -86.064445 52.312061 -50.930725 -0.743962 -0.319765 -0.262094 0.527535 0.082389 0.105012 +8.086520 167.129272 6.982969 1.113014 35.763039 -0.015015 0.814213 -0.252904 -0.811763 -0.882264 -0.178316 -0.323731 -0.801724 0.781831 0.061039 0.534687 0.365296 -0.038287 -1.249285 0.510152 3.380480 -1.596195 0.376963 3.619185 0.003416 -0.608723 0.170022 0.551901 0.752567 0.187476 6.077522 2.623214 -9.942127 -1.757048 2.956401 14.379050 -4.439812 4.661711 28.299021 -0.524828 -13.601445 2.232626 3.532584 -18.334280 -6.584974 16.462692 -11.155466 -11.009156 -39.048531 -81.328979 35.997299 65.407547 -41.064457 -31.893126 -0.346292 0.024123 0.053837 0.405845 -0.411118 0.439301 -14.809453 15.152475 -9.095040 4.015037 62.585377 4.619361 -84.772469 51.845974 -49.768559 -0.757174 -0.312478 -0.274791 0.550867 0.084084 0.099831 +7.869051 167.035736 6.990849 1.035165 35.784931 -0.072413 1.169224 -0.303131 -1.179914 -1.241332 -0.151096 0.144948 -0.827531 0.814158 0.063549 0.515023 0.336201 -0.048745 -1.291338 0.467849 3.380780 -1.227285 0.321366 3.479705 0.015436 -0.609704 0.169722 0.550829 0.777534 0.177506 6.103163 2.602976 -9.974830 -1.767186 2.912050 14.291284 -4.404027 4.685915 28.254179 -0.580914 -13.557173 2.167021 3.609180 -18.448467 -6.602057 16.366638 -10.872387 -11.038634 -42.523594 -81.260468 39.032402 65.375038 -41.072159 -31.990337 -0.365088 -0.004118 0.062877 0.415370 -0.429056 0.433127 -14.803628 15.112213 -9.251678 4.461949 63.274105 4.883279 -83.603905 51.586010 -48.733044 -0.769223 -0.295170 -0.303822 0.577611 0.104903 0.093386 +7.659686 167.033066 6.996001 1.019570 35.861710 -0.323491 1.378375 -0.296127 -1.050976 -1.409914 -0.137103 0.309856 -0.849876 0.825475 0.051710 0.497071 0.303940 -0.056004 -1.207573 0.404454 3.636643 -1.188517 0.290747 3.324433 0.014400 -0.585710 0.164942 0.536098 0.777194 0.168158 6.526380 2.624433 -9.908018 -1.922981 2.937468 14.376523 -4.823515 4.865574 28.263691 -0.827681 -13.281828 2.781018 4.499244 -18.501703 -7.196418 16.445639 -11.247074 -10.955324 -42.509098 -80.754425 38.650330 65.633942 -41.618572 -32.495312 -0.358345 -0.034984 0.102318 0.397519 -0.424340 0.420392 -14.914519 15.093378 -9.169952 4.819797 63.196419 5.021386 -83.927582 51.857780 -49.187798 -0.770721 -0.257144 -0.326413 0.593177 0.126563 0.080692 +7.525850 167.044418 7.033552 0.892192 36.112305 -0.709661 1.466823 -0.315579 -0.802789 -1.149170 -0.168846 0.428178 -0.862697 0.831569 0.042041 0.514791 0.319339 -0.053213 -0.961615 0.308838 4.067444 -1.298715 0.294904 3.020282 0.008734 -0.587183 0.163641 0.548243 0.778089 0.175176 6.870462 2.528930 -9.953801 -2.003535 2.856042 14.568444 -5.071709 4.837686 28.592924 -0.905478 -13.178675 2.813828 5.026232 -18.606459 -7.765009 16.548752 -10.892982 -11.240913 -44.721809 -80.758339 40.602085 65.293053 -42.058964 -32.641357 -0.355695 -0.028242 0.111601 0.393568 -0.421192 0.425443 -14.898005 14.609347 -9.376429 5.651835 63.393562 5.647392 -84.616806 52.549801 -50.345825 -0.781149 -0.258240 -0.324040 0.596174 0.127423 0.080947 +7.355191 167.028397 7.109883 1.045829 36.404373 -0.765478 1.356241 -0.303848 -0.610719 -0.870652 -0.185159 0.220932 -0.871081 0.860843 0.043275 0.501896 0.300764 -0.062406 -0.957733 0.327540 4.148426 -1.354308 0.304025 3.120034 0.019672 -0.606451 0.157234 0.547485 0.798355 0.184665 6.597807 2.458812 -10.071966 -1.989085 2.752110 14.623957 -4.922241 4.768068 28.763779 -0.914021 -13.144807 2.635721 4.778679 -18.637754 -7.378561 16.391348 -10.428543 -11.464166 -49.561325 -80.737061 44.902363 64.547562 -42.483311 -32.581692 -0.381163 -0.023364 0.098980 0.412392 -0.437929 0.419943 -14.561620 14.190603 -9.497291 6.366853 63.573101 6.401924 -85.399155 53.637516 -51.821232 -0.787840 -0.265775 -0.331001 0.596187 0.142624 0.082159 +7.155077 167.017242 7.172861 1.389389 36.439602 -0.654162 1.092596 -0.235716 -0.311941 -0.698065 -0.190512 -0.220540 -0.883363 0.865037 0.036902 0.508159 0.307619 -0.059471 -1.263333 0.380055 4.059262 -1.196603 0.290519 3.359639 0.016204 -0.607453 0.155426 0.555536 0.797220 0.186080 6.260530 2.504630 -10.129204 -2.022061 2.785383 14.680104 -4.863013 4.834050 28.861631 -0.962676 -13.147769 2.711264 4.801445 -18.622095 -7.634530 16.361652 -10.223455 -11.741094 -52.711117 -80.662842 47.482277 63.326042 -42.414639 -32.001530 -0.382022 -0.028120 0.106533 0.411631 -0.434609 0.420347 -14.466109 13.873824 -9.583220 7.144923 63.394001 7.011439 -86.213013 54.561375 -53.267361 -0.795329 -0.263296 -0.334569 0.601115 0.143887 0.079192 +7.031621 167.014420 7.198403 1.057742 36.872124 -0.849215 1.523878 -0.208912 -0.391857 -0.722919 -0.182614 -0.286065 -0.873812 0.863877 0.044145 0.496634 0.301524 -0.085036 -0.937315 0.340427 4.041193 -1.041760 0.278305 3.466509 0.027129 -0.615768 0.163659 0.552071 0.811878 0.181179 6.918967 2.404315 -10.114307 -2.097667 2.754581 14.613281 -5.223070 4.845906 28.733524 -1.109023 -13.184677 2.744221 4.970967 -18.905294 -7.277417 16.089365 -10.393722 -12.050610 -55.173679 -80.644966 49.547867 61.083500 -42.415867 -30.813631 -0.384747 -0.020208 0.091057 0.419534 -0.449088 0.427145 -14.075385 13.639119 -9.614275 7.362137 63.367119 7.293767 -85.902428 55.099770 -53.431530 -0.795216 -0.269020 -0.334109 0.601950 0.148890 0.090196 +6.869502 166.981400 7.210660 1.172682 36.980831 -0.748471 1.497608 -0.218089 -0.551707 -0.788285 -0.180495 -0.270307 -0.859250 0.865159 0.053512 0.485923 0.297021 -0.120271 -0.976377 0.337658 3.924813 -0.868291 0.261145 3.467600 0.035086 -0.630295 0.168213 0.547971 0.834601 0.183655 7.011422 2.395876 -10.147407 -2.193405 2.795569 14.540473 -5.430142 4.909186 28.631712 -1.231446 -13.098920 2.779909 5.486808 -19.247047 -6.950037 16.275200 -10.264022 -12.216107 -57.851528 -80.525887 51.688046 59.947651 -42.182903 -30.191647 -0.386563 0.000455 0.073449 0.427834 -0.464141 0.439617 -13.784278 13.369806 -9.735926 7.633672 63.621166 7.532999 -84.590286 55.149101 -52.444565 -0.792893 -0.280839 -0.329248 0.599410 0.155810 0.109428 +6.680131 167.002899 7.217666 1.187125 36.931793 -0.828285 1.584544 -0.211414 -0.574275 -0.874610 -0.168310 -0.137720 -0.853878 0.852943 0.057319 0.481894 0.305317 -0.117365 -0.924843 0.306214 3.943217 -0.710594 0.244724 3.424115 0.036048 -0.617330 0.172972 0.549581 0.834253 0.171210 6.938194 2.424942 -10.129640 -2.162041 2.830045 14.563975 -5.362299 4.945365 28.630226 -1.108801 -13.269798 2.883466 5.393882 -19.189121 -7.077047 16.167507 -10.224322 -12.440940 -58.815575 -80.563515 52.533798 58.769753 -42.223835 -29.591715 -0.386777 -0.020734 0.068889 0.427108 -0.460082 0.436339 -13.920820 13.326815 -9.742256 7.921180 63.209751 7.597058 -84.553902 55.298958 -52.618496 -0.788153 -0.267142 -0.330272 0.613667 0.152480 0.112158 +6.503870 167.006622 7.259048 1.223659 36.710667 -0.789219 1.667362 -0.248274 -0.710682 -0.994127 -0.166245 0.114754 -0.844824 0.857779 0.061901 0.484431 0.299339 -0.114939 -0.919867 0.351613 3.776792 -0.658970 0.249494 3.601349 0.038687 -0.628574 0.170801 0.545470 0.832809 0.179662 6.920116 2.451582 -10.147552 -2.190137 2.873035 14.485276 -5.432727 4.983889 28.563953 -1.250659 -13.474602 3.059166 5.110630 -19.398945 -6.588612 16.064640 -9.891124 -12.523528 -60.746830 -80.527710 54.340054 58.082737 -42.285530 -29.261112 -0.387535 0.000330 0.058164 0.431093 -0.466143 0.438853 -13.849615 13.132182 -9.793068 8.730017 63.434021 8.228467 -84.133987 55.605637 -52.583416 -0.784933 -0.285533 -0.322633 0.597733 0.148686 0.113093 +6.376717 167.041550 7.305188 1.097854 36.949028 -1.073196 1.935652 -0.254477 -0.687994 -1.066603 -0.164356 0.418212 -0.846568 0.833776 0.059838 0.499092 0.324248 -0.098737 -0.653753 0.299158 4.005669 -0.798804 0.268196 3.566319 0.028284 -0.605173 0.180354 0.553496 0.817310 0.166575 6.957397 2.375856 -10.142779 -2.110652 2.777897 14.540224 -5.311823 4.900160 28.637188 -1.358882 -13.677279 3.537927 5.161724 -19.382687 -7.172004 16.039686 -9.890258 -12.559263 -62.288631 -80.590691 55.694286 57.895103 -42.014481 -29.074713 -0.370295 -0.026997 0.073214 0.417207 -0.447181 0.441966 -14.062440 12.942348 -9.874907 9.264707 63.198250 8.559819 -84.200516 56.096909 -53.085690 -0.784523 -0.266521 -0.321773 0.613572 0.133946 0.110358 +6.286732 167.087952 7.310278 0.856923 37.076107 -1.401306 2.204793 -0.269972 -0.682690 -1.208705 -0.157978 0.722451 -0.819156 0.813195 0.075473 0.499385 0.331879 -0.106948 -0.370564 0.220591 4.209398 -0.763063 0.271545 3.486713 0.027777 -0.596422 0.191148 0.547748 0.820315 0.159305 7.602540 2.296217 -10.084869 -2.208013 2.782577 14.598593 -5.738420 4.895529 28.646461 -1.458791 -13.595873 3.768286 5.554889 -19.492493 -6.980786 15.811882 -10.120440 -12.544173 -60.683052 -80.523209 54.150425 57.557728 -42.240051 -28.906698 -0.355791 -0.021915 0.062710 0.412584 -0.444980 0.455440 -13.799865 12.832455 -9.814207 9.383290 63.073311 8.679627 -84.512550 56.422298 -53.589619 -0.770975 -0.269176 -0.312642 0.614160 0.120110 0.123627 +6.115209 167.098450 7.320713 0.915454 36.887005 -1.495124 2.163584 -0.294224 -0.655080 -1.098931 -0.164317 0.883671 -0.822154 0.822404 0.078934 0.479937 0.311945 -0.116933 -0.395738 0.198469 4.286450 -0.770784 0.266390 3.384946 0.033702 -0.591953 0.188015 0.540053 0.830461 0.152296 7.629976 2.325459 -10.029790 -2.260748 2.816364 14.666842 -5.828328 4.940321 28.679174 -1.617284 -13.597672 3.823709 5.571311 -19.589762 -6.911629 15.848895 -10.112772 -12.685377 -58.973038 -80.526443 52.560822 56.984753 -42.154224 -28.534901 -0.362758 -0.038457 0.064263 0.414368 -0.450308 0.449097 -13.486145 12.873084 -9.720198 8.992170 63.030647 8.511137 -85.463753 56.685261 -54.475582 -0.767245 -0.255791 -0.324681 0.625610 0.131663 0.124226 +5.951284 167.082748 7.312221 0.898624 36.792915 -1.566548 2.177181 -0.309065 -0.656299 -0.995318 -0.175929 0.869200 -0.821420 0.834609 0.085102 0.483429 0.312668 -0.119532 -0.231750 0.240905 4.208457 -0.952491 0.301475 3.524331 0.038061 -0.607260 0.189477 0.544582 0.842580 0.159046 7.742310 2.302027 -10.014476 -2.261708 2.819495 14.726674 -5.895653 4.955140 28.775240 -1.700639 -13.496553 3.524153 5.385921 -19.618820 -6.649409 16.105032 -9.935603 -12.813622 -59.379627 -80.614807 52.898712 56.905380 -41.867214 -28.420603 -0.372220 -0.025643 0.051789 0.426045 -0.460759 0.455521 -13.497173 12.731162 -9.910016 8.515057 63.158932 8.275264 -84.925995 56.664631 -54.020771 -0.772165 -0.271268 -0.323466 0.623341 0.130657 0.128387 +5.787125 167.104965 7.328816 1.126751 36.559666 -1.530483 1.942476 -0.329947 -0.553987 -0.672108 -0.202705 0.771892 -0.819245 0.842687 0.087930 0.482253 0.310788 -0.133697 -0.259554 0.278675 4.184200 -1.113613 0.332702 3.575195 0.047463 -0.619326 0.192033 0.546772 0.857767 0.160685 7.666715 2.351444 -10.005503 -2.330774 2.896169 14.843453 -6.022315 5.038610 28.951664 -1.752549 -13.266644 3.246964 5.749434 -19.731901 -6.518391 16.306450 -9.816788 -12.936370 -60.008442 -80.803070 53.505280 56.958443 -41.518337 -28.327360 -0.378644 -0.010050 0.038805 0.434545 -0.476493 0.459767 -13.001019 12.570029 -10.020170 7.993204 63.421856 8.054744 -84.885376 56.727764 -53.963055 -0.775347 -0.282678 -0.322482 0.621164 0.135585 0.135613 +5.713269 167.136322 7.379865 1.089275 36.820839 -1.680030 1.896983 -0.338186 -0.444317 -0.473926 -0.211391 0.864332 -0.836497 0.856064 0.084708 0.464715 0.302566 -0.150371 -0.205178 0.272041 4.247215 -0.895749 0.311699 3.761143 0.059852 -0.619337 0.194467 0.552581 0.876872 0.147437 7.720521 2.269701 -10.036958 -2.314242 2.781862 14.922002 -5.981796 4.932163 29.135073 -1.760437 -13.156147 3.171250 5.786662 -19.680607 -6.652070 16.406183 -9.372772 -13.173079 -62.759819 -80.830498 56.232899 56.567490 -42.057896 -28.402193 -0.397282 -0.035242 0.034899 0.445567 -0.490069 0.452141 -12.765620 12.238463 -10.174098 8.385249 63.879204 8.415292 -84.971672 56.765835 -54.053337 -0.785596 -0.265522 -0.340198 0.645710 0.153637 0.136120 +5.612041 167.109726 7.381964 1.057566 36.839554 -1.708119 1.992047 -0.353471 -0.576395 -0.589557 -0.214589 1.058342 -0.830550 0.836904 0.079233 0.494333 0.339559 -0.128948 -0.151834 0.284356 4.141333 -0.733491 0.300815 3.890992 0.041374 -0.610454 0.193442 0.565054 0.857366 0.155737 7.766678 2.265913 -10.021156 -2.293046 2.781116 14.873036 -5.962947 4.886598 29.127880 -1.726299 -13.386919 3.219218 5.820737 -19.718887 -7.258751 16.647438 -9.126202 -13.258051 -64.780159 -80.926186 58.244099 56.603374 -42.187405 -28.507826 -0.382001 -0.028421 0.040070 0.433274 -0.467185 0.459496 -13.030258 12.015736 -10.095535 9.413108 63.820103 8.994855 -86.126396 56.546379 -54.906349 -0.784324 -0.268824 -0.321024 0.641836 0.135699 0.138764 +5.498546 167.064697 7.439895 1.095821 36.936230 -1.626120 2.081196 -0.376115 -0.797146 -0.753682 -0.202171 1.318451 -0.830802 0.855129 0.078751 0.473904 0.316363 -0.149132 -0.096882 0.295974 4.095630 -0.600843 0.270566 3.950432 0.052518 -0.629416 0.195166 0.553035 0.873600 0.168353 7.622669 2.275712 -10.091393 -2.312842 2.739209 14.712197 -5.903061 4.789038 29.013309 -1.531460 -13.429269 3.188437 5.562817 -19.705956 -6.695267 16.943766 -9.080315 -13.126895 -66.239227 -80.963356 59.685429 56.783913 -41.970383 -28.534273 -0.405423 -0.021944 0.029246 0.452967 -0.480375 0.454158 -12.976559 12.104907 -9.672997 10.847079 63.962929 9.861280 -87.721085 55.954205 -55.755169 -0.790723 -0.271924 -0.321337 0.632243 0.152939 0.141288 +5.396627 167.072586 7.504025 1.060585 36.744377 -1.612108 2.328160 -0.316564 -0.709558 -0.951060 -0.175432 1.123986 -0.825951 0.868628 0.088873 0.462262 0.292059 -0.145241 0.095296 0.348313 4.001882 -0.871837 0.307826 4.099064 0.054479 -0.636562 0.192980 0.539283 0.877314 0.175364 7.630804 2.331413 -10.184217 -2.285271 2.759179 14.583076 -5.893759 4.797372 28.882467 -1.563660 -13.698160 3.390576 4.988390 -19.782946 -6.043611 16.978907 -9.295167 -12.923512 -67.691887 -80.955971 61.014683 56.770271 -41.682426 -28.429176 -0.413190 -0.021347 0.027558 0.460121 -0.484216 0.452626 -13.128291 12.364478 -9.378719 12.004086 63.792343 10.464619 -87.981667 55.823048 -55.968956 -0.786953 -0.277355 -0.324959 0.624839 0.154185 0.137322 +5.330537 167.055405 7.593513 1.084530 36.542492 -1.560997 2.391451 -0.276362 -0.517755 -0.900840 -0.170862 0.852253 -0.850873 0.883273 0.073986 0.460937 0.277907 -0.129016 0.102797 0.402642 3.941768 -1.012981 0.332478 4.281877 0.054240 -0.633409 0.177198 0.541782 0.864085 0.173437 7.529418 2.366551 -10.308225 -2.244161 2.731062 14.495906 -5.788133 4.816861 28.893471 -1.780086 -13.734798 3.643216 4.703999 -19.747282 -6.172123 17.010826 -9.118904 -12.845424 -70.347260 -80.890465 63.501747 56.906372 -41.477272 -28.476862 -0.414377 -0.030452 0.045398 0.452215 -0.482964 0.436135 -13.140022 12.343482 -9.428499 12.651466 64.249504 10.785138 -86.288033 55.231815 -54.155842 -0.790055 -0.271061 -0.338819 0.623980 0.163381 0.119629 +5.289005 167.037720 7.630992 1.070597 36.562958 -1.568699 2.367473 -0.243477 -0.378260 -0.757215 -0.173081 0.530254 -0.875511 0.909284 0.066754 0.455079 0.262711 -0.127630 0.183376 0.430434 3.949102 -1.107244 0.339805 4.372824 0.062129 -0.639185 0.176848 0.543574 0.875643 0.175485 7.617464 2.371757 -10.377048 -2.217575 2.688620 14.498006 -5.797486 4.825945 28.977270 -1.787121 -13.713302 3.565958 4.595257 -19.731100 -6.276907 17.116297 -8.909925 -12.919465 -73.537117 -80.882309 66.541573 56.928295 -41.421242 -28.557047 -0.433093 -0.045721 0.053374 0.462413 -0.493283 0.427257 -13.166192 12.073348 -9.508842 13.134483 64.340355 11.059110 -86.042732 55.085392 -53.870678 -0.805012 -0.261652 -0.353532 0.634293 0.178656 0.110244 +5.250557 167.058228 7.630060 1.050691 36.366405 -1.686339 2.308505 -0.219475 -0.241682 -0.665622 -0.175459 0.381430 -0.864898 0.896839 0.068571 0.454871 0.268891 -0.132367 0.196316 0.410073 4.032111 -1.123985 0.348553 4.327813 0.062662 -0.631083 0.178655 0.543306 0.873466 0.169125 7.852811 2.438426 -10.328544 -2.239943 2.779359 14.602224 -5.973296 4.897834 29.070875 -1.781101 -13.696284 3.615752 4.969555 -19.811272 -6.400131 17.020857 -8.956825 -12.976069 -73.120125 -81.007019 66.391487 56.920227 -41.878071 -28.678911 -0.424972 -0.044541 0.049154 0.456517 -0.491343 0.428979 -12.895415 11.947515 -9.503976 12.969222 64.111511 10.956419 -86.773422 55.403698 -54.676723 -0.797579 -0.259023 -0.349095 0.635405 0.175091 0.115952 +5.184128 167.075302 7.605679 0.857725 36.516743 -1.842267 2.555790 -0.277433 -0.526348 -0.772827 -0.176450 0.846080 -0.853735 0.886909 0.075604 0.456990 0.284103 -0.143938 0.607954 0.418726 4.006513 -1.348587 0.395014 4.454660 0.065181 -0.641743 0.185531 0.549451 0.880516 0.167548 8.026899 2.320533 -10.259238 -2.213379 2.703124 14.615870 -5.970800 4.802303 29.088760 -1.663761 -13.756658 3.296550 4.789773 -19.824558 -6.180539 16.798262 -8.714105 -13.031642 -73.482353 -80.841736 66.679405 57.019016 -42.485992 -28.974310 -0.427150 -0.032243 0.029398 0.465330 -0.497494 0.438275 -12.835209 11.825673 -9.514554 13.026668 64.010742 11.019248 -87.478996 55.434261 -55.282013 -0.799002 -0.272638 -0.341057 0.634503 0.169435 0.126579 +5.100438 167.104965 7.646784 0.909297 36.567875 -1.958430 2.633620 -0.287639 -0.500175 -0.774964 -0.180695 1.045633 -0.844505 0.867536 0.079648 0.466620 0.307101 -0.146916 0.729203 0.416522 4.087817 -1.360196 0.418396 4.595594 0.059764 -0.636714 0.189720 0.559686 0.877513 0.159117 7.900171 2.290816 -10.256913 -2.228443 2.700352 14.701031 -5.944954 4.787866 29.196516 -1.451353 -13.782760 3.302187 5.056968 -19.771875 -6.331472 16.759624 -8.520159 -13.153247 -73.468071 -80.593155 66.478653 56.769646 -43.214493 -29.168270 -0.414012 -0.029168 0.024672 0.459416 -0.491536 0.449283 -13.015759 11.857333 -9.551817 13.687625 63.791054 11.190667 -87.213409 55.267269 -55.100910 -0.795388 -0.276697 -0.336466 0.639808 0.156807 0.134382 +5.008088 167.129333 7.727567 0.949260 36.551426 -2.099984 2.755935 -0.211639 -0.234606 -0.858205 -0.168052 0.749324 -0.821951 0.851078 0.086562 0.470697 0.312558 -0.141774 0.853582 0.384105 4.256401 -1.569275 0.443839 4.469748 0.052056 -0.631911 0.190364 0.550966 0.866567 0.165551 7.737350 2.326644 -10.258555 -2.170702 2.735248 14.777138 -5.840622 4.827994 29.184546 -1.352467 -14.159698 3.434502 5.002151 -19.944111 -6.215186 16.190968 -8.656936 -13.161228 -71.993462 -80.493362 65.159561 56.390408 -44.036282 -29.210642 -0.402254 -0.018424 0.020585 0.452831 -0.479743 0.454033 -12.901986 12.032985 -9.377705 13.275103 62.911510 10.781097 -88.324135 55.850304 -56.473270 -0.782287 -0.282232 -0.320535 0.626352 0.144586 0.140446 +4.963192 167.153793 7.782106 1.156298 36.496826 -2.127665 2.684453 -0.202155 -0.029091 -1.015884 -0.156476 0.745028 -0.816619 0.858987 0.085898 0.466582 0.286126 -0.131894 0.685491 0.372260 4.402023 -1.554614 0.433864 4.465656 0.053300 -0.627919 0.181654 0.532659 0.857004 0.173818 7.523893 2.357582 -10.241952 -2.174749 2.750012 14.820229 -5.793070 4.891691 29.099798 -1.390217 -14.534770 3.597457 5.218561 -20.355474 -6.080217 15.678180 -8.750938 -13.203680 -70.032333 -80.191971 63.259220 55.750103 -45.160484 -29.285482 -0.394580 -0.007406 0.030446 0.442902 -0.479654 0.445604 -12.664586 12.244982 -9.192148 12.718975 62.245361 10.403840 -89.635719 56.598236 -58.100262 -0.770649 -0.283998 -0.318057 0.607676 0.146970 0.133777 +4.980425 167.159668 7.797745 1.068909 36.452381 -2.292628 2.786405 -0.194068 0.088780 -1.040707 -0.159036 0.791008 -0.794324 0.836809 0.085342 0.471809 0.296360 -0.137958 0.690796 0.308528 4.547214 -1.425836 0.417952 4.356831 0.049718 -0.629332 0.177862 0.528284 0.841884 0.177942 7.671723 2.291188 -10.284655 -2.126873 2.697577 14.807689 -5.759335 4.825286 29.017426 -1.689996 -14.738440 3.816248 5.212533 -20.664696 -5.943554 15.470534 -8.747698 -13.173607 -67.873299 -79.820023 60.973171 55.292614 -45.843788 -29.305782 -0.377227 0.020678 0.019434 0.432736 -0.474386 0.448875 -12.643470 12.525416 -9.440774 12.348681 62.323391 10.104821 -86.888382 56.897175 -56.129887 -0.756567 -0.299153 -0.297647 0.585627 0.138824 0.143061 +4.981020 167.187576 7.803658 1.036540 36.473839 -2.403700 2.869146 -0.218954 0.107048 -1.164012 -0.153588 1.022332 -0.810535 0.848083 0.079926 0.480192 0.298212 -0.130302 0.591946 0.283084 4.629778 -1.127481 0.386642 4.424829 0.050783 -0.631893 0.172184 0.539211 0.841630 0.175131 7.591506 2.166855 -10.345649 -2.116177 2.561084 14.849139 -5.657648 4.719121 29.160421 -1.722937 -14.731774 3.772313 5.259337 -20.706451 -6.118005 15.504788 -8.423912 -13.311617 -69.624321 -79.666473 62.410542 55.051956 -45.851707 -29.262722 -0.376854 0.021951 0.024918 0.430339 -0.479272 0.448059 -12.895359 12.491542 -9.791109 12.708981 62.914509 10.320333 -84.744164 56.727249 -54.365055 -0.763020 -0.303410 -0.306532 0.590598 0.139997 0.136727 +5.047082 167.175354 7.848271 0.927761 36.355148 -2.514930 2.989300 -0.208507 0.209768 -1.243284 -0.145459 1.088630 -0.813972 0.846211 0.074915 0.475472 0.287151 -0.127648 0.562768 0.228185 4.751265 -0.937316 0.346548 4.300982 0.048979 -0.621827 0.170499 0.531201 0.833410 0.173062 7.916453 2.212790 -10.395432 -2.127248 2.581004 14.778918 -5.808135 4.749259 29.043978 -1.876827 -14.680673 4.247573 5.418719 -20.692797 -6.174877 15.551222 -8.749429 -13.174081 -69.696617 -79.436378 62.229210 54.839966 -45.956326 -29.232710 -0.370016 0.013319 0.039735 0.421480 -0.473295 0.442541 -13.044841 12.520248 -9.799725 13.724273 62.795391 10.911464 -83.937027 57.317081 -54.302471 -0.759751 -0.291841 -0.310656 0.588823 0.143047 0.130337 +5.073087 167.149094 7.932034 1.019595 36.256138 -2.364868 3.020548 -0.219561 0.056040 -1.336325 -0.133799 1.291663 -0.806025 0.844771 0.078581 0.464329 0.279056 -0.143216 0.384230 0.204050 4.766475 -0.801158 0.316622 4.146415 0.055712 -0.623473 0.177572 0.522809 0.843311 0.171823 7.919977 2.294420 -10.449600 -2.192153 2.649531 14.630041 -5.946094 4.770162 28.854000 -1.825394 -14.622427 4.413842 5.640388 -20.734272 -5.948671 15.440033 -8.603888 -13.137852 -71.107758 -79.295456 63.622021 54.508213 -46.429142 -29.209726 -0.375385 0.013650 0.032447 0.427696 -0.480534 0.443050 -12.644485 12.153852 -9.721261 15.248572 62.817627 12.082417 -84.642303 58.248035 -55.663387 -0.759379 -0.288531 -0.308910 0.588657 0.149302 0.136019 +5.043498 167.106400 7.954643 1.093215 35.983459 -2.139066 3.017900 -0.250176 -0.255423 -1.383556 -0.129376 1.515809 -0.794921 0.823673 0.083695 0.471557 0.297074 -0.132545 0.314686 0.233642 4.578667 -0.858146 0.326619 4.114213 0.048409 -0.611996 0.183948 0.525512 0.833354 0.165164 7.850098 2.343861 -10.441935 -2.204339 2.701849 14.437363 -5.960052 4.738928 28.567453 -1.639070 -14.669295 4.467441 5.509173 -20.516508 -6.020821 14.951685 -8.429297 -12.996246 -70.795593 -78.828667 63.283733 54.822636 -47.833076 -29.893827 -0.366324 0.003588 0.031600 0.423024 -0.468016 0.446955 -12.526380 11.950170 -9.649835 17.124981 62.494274 13.262240 -85.263184 59.198933 -57.114037 -0.753988 -0.284215 -0.302799 0.592748 0.134574 0.137407 +5.095516 167.042786 7.984816 0.903158 35.543045 -1.939275 3.079081 -0.293003 -0.540169 -1.283830 -0.139132 1.667989 -0.795821 0.818165 0.080269 0.471831 0.294149 -0.125795 0.489588 0.330247 4.126373 -1.003137 0.351619 4.303168 0.044581 -0.608511 0.181540 0.522403 0.820994 0.165066 8.181985 2.516271 -10.479298 -2.143429 2.831703 14.074541 -6.034562 4.811388 28.102791 -1.696857 -14.713048 4.768616 5.358076 -20.452990 -5.914348 14.838585 -7.849155 -12.572924 -72.965355 -77.797638 64.954498 56.478954 -50.188789 -31.986877 -0.359510 0.002851 0.039693 0.417068 -0.461019 0.444393 -12.703396 11.240368 -9.529000 20.194355 62.019615 15.377612 -87.118935 60.853245 -60.236732 -0.751565 -0.283514 -0.303227 0.585751 0.131029 0.131054 +5.132122 166.999817 7.991653 1.022229 35.086838 -1.626138 2.948421 -0.322659 -0.831135 -1.264407 -0.140674 1.856723 -0.796688 0.810701 0.082596 0.475948 0.311898 -0.127076 0.412929 0.397859 3.872775 -1.250527 0.384538 4.270426 0.041650 -0.608461 0.189424 0.531868 0.824619 0.161722 8.220167 2.702409 -10.531656 -2.141010 3.001126 13.857776 -6.078801 4.907050 27.848139 -1.641022 -14.649521 4.750578 5.182422 -20.250347 -6.039337 14.636772 -6.951462 -12.545179 -75.166626 -76.673332 66.450600 56.915081 -52.600636 -33.442177 -0.363343 -0.009322 0.035841 0.423196 -0.456404 0.450139 -12.700704 10.473583 -9.627508 23.532307 61.605652 17.570370 -88.667953 62.650448 -63.399887 -0.758002 -0.279826 -0.302796 0.597057 0.125532 0.134841 +5.154690 167.003418 7.984470 1.036968 34.697113 -1.492106 2.995063 -0.297665 -0.923387 -1.468930 -0.119321 1.882283 -0.787942 0.789721 0.080650 0.490478 0.331958 -0.105053 0.234910 0.420462 3.689543 -1.084834 0.359384 4.282561 0.027391 -0.588176 0.189629 0.532239 0.806153 0.161732 8.268809 2.753097 -10.519224 -2.155419 3.042879 13.714745 -6.065427 4.868672 27.539133 -1.832153 -14.313983 4.804371 5.274069 -19.927355 -6.604616 14.134051 -6.738642 -12.510820 -72.773087 -75.162277 63.252644 56.797169 -55.870495 -34.973621 -0.349820 -0.020095 0.046768 0.409172 -0.434152 0.448141 -12.291365 10.540211 -9.847257 25.971272 61.472614 19.155691 -88.934135 64.794701 -65.699059 -0.749635 -0.267912 -0.291611 0.597883 0.112176 0.132933 +5.238012 167.016373 7.983655 0.978339 34.382439 -1.314850 2.958524 -0.296860 -1.043319 -1.372988 -0.126424 1.751303 -0.788802 0.779242 0.081538 0.486128 0.316137 -0.096265 0.256089 0.509649 3.326399 -1.243640 0.371080 4.495334 0.021474 -0.574345 0.195847 0.517525 0.789076 0.156921 8.456328 2.824600 -10.427766 -2.197144 3.090913 13.442000 -6.104652 4.799969 26.881725 -2.025975 -14.078970 4.973618 5.167322 -19.706944 -6.532036 13.719447 -7.396658 -12.326555 -68.442574 -73.521545 58.304405 55.976265 -59.391674 -36.169315 -0.333219 -0.034025 0.071983 0.396430 -0.422454 0.447513 -11.928431 11.437916 -9.687008 28.298519 60.954433 20.578396 -91.278008 67.431305 -70.375175 -0.746105 -0.256012 -0.298774 0.592209 0.105669 0.119822 +5.277890 167.029343 7.983756 0.734260 34.114620 -1.308561 3.067275 -0.290465 -1.089488 -1.144143 -0.142079 1.516601 -0.783965 0.766228 0.082450 0.481462 0.302668 -0.076673 0.502374 0.499101 3.231309 -1.524966 0.390596 4.300476 0.012977 -0.549226 0.192679 0.502417 0.767043 0.150275 8.639610 2.859595 -10.354753 -2.162956 3.098950 13.273678 -6.004428 4.741036 26.379974 -2.116080 -14.129115 5.023512 5.099277 -19.614777 -6.763466 13.084592 -8.266971 -12.069324 -65.687752 -71.994507 54.787903 55.585758 -62.411465 -37.480400 -0.315546 -0.055010 0.094974 0.376949 -0.404220 0.438521 -11.848722 12.670813 -9.602012 29.958427 60.440739 21.379108 -92.888710 69.645279 -74.122681 -0.731303 -0.236541 -0.302483 0.590588 0.098656 0.108570 +5.281264 167.014130 8.023033 0.908277 34.129711 -1.086763 2.783380 -0.339127 -1.196940 -0.761818 -0.176862 1.459013 -0.793272 0.768730 0.078292 0.487429 0.289737 -0.039022 0.292326 0.510687 3.113835 -1.202313 0.324853 4.215816 0.005018 -0.543315 0.190945 0.491474 0.741639 0.157884 8.235631 2.799057 -10.290317 -2.148050 2.984715 13.102726 -5.759658 4.549164 25.860296 -2.044061 -14.232334 4.869754 4.154621 -19.183256 -6.609097 12.373513 -9.045307 -12.040943 -63.317570 -70.749008 52.089851 54.330452 -65.406319 -38.066517 -0.314546 -0.066757 0.115838 0.372678 -0.390868 0.426004 -11.768380 13.679309 -9.734341 31.489487 59.440304 21.969141 -94.808510 72.765526 -79.156494 -0.732769 -0.232882 -0.304400 0.576354 0.090547 0.084381 diff --git a/src/momask-preenc/visualization/Animation.py b/src/momask-preenc/visualization/Animation.py new file mode 100644 index 0000000000000000000000000000000000000000..f1237fdc30a2f0800bd5404190a412936e174ed9 --- /dev/null +++ b/src/momask-preenc/visualization/Animation.py @@ -0,0 +1,442 @@ +import operator + +import numpy as np +import numpy.core.umath_tests as ut + +from visualization.Quaternions import Quaternions + + +class Animation: + """ + Animation is a numpy-like wrapper for animation data + + Animation data consists of several arrays consisting + of F frames and J joints. + + The animation is specified by + + rotations : (F, J) Quaternions | Joint Rotations + positions : (F, J, 3) ndarray | Joint Positions + + The base pose is specified by + + orients : (J) Quaternions | Joint Orientations + offsets : (J, 3) ndarray | Joint Offsets + + And the skeletal structure is specified by + + parents : (J) ndarray | Joint Parents + """ + + def __init__(self, rotations, positions, orients, offsets, parents, names, frametime): + + self.rotations = rotations + self.positions = positions + self.orients = orients + self.offsets = offsets + self.parents = parents + self.names = names + self.frametime = frametime + + def __op__(self, op, other): + return Animation( + op(self.rotations, other.rotations), + op(self.positions, other.positions), + op(self.orients, other.orients), + op(self.offsets, other.offsets), + op(self.parents, other.parents)) + + def __iop__(self, op, other): + self.rotations = op(self.roations, other.rotations) + self.positions = op(self.roations, other.positions) + self.orients = op(self.orients, other.orients) + self.offsets = op(self.offsets, other.offsets) + self.parents = op(self.parents, other.parents) + return self + + def __sop__(self, op): + return Animation( + op(self.rotations), + op(self.positions), + op(self.orients), + op(self.offsets), + op(self.parents)) + + def __add__(self, other): + return self.__op__(operator.add, other) + + def __sub__(self, other): + return self.__op__(operator.sub, other) + + def __mul__(self, other): + return self.__op__(operator.mul, other) + + def __div__(self, other): + return self.__op__(operator.div, other) + + def __abs__(self): + return self.__sop__(operator.abs) + + def __neg__(self): + return self.__sop__(operator.neg) + + def __iadd__(self, other): + return self.__iop__(operator.iadd, other) + + def __isub__(self, other): + return self.__iop__(operator.isub, other) + + def __imul__(self, other): + return self.__iop__(operator.imul, other) + + def __idiv__(self, other): + return self.__iop__(operator.idiv, other) + + def __len__(self): + return len(self.rotations) + + def __getitem__(self, k): + if isinstance(k, tuple): + return Animation( + self.rotations[k], + self.positions[k], + self.orients[k[1:]], + self.offsets[k[1:]], + self.parents[k[1:]], + self.names[k[1:]], + self.frametime[k[1:]]) + else: + return Animation( + self.rotations[k], + self.positions[k], + self.orients, + self.offsets, + self.parents, + self.names, + self.frametime) + + def __setitem__(self, k, v): + if isinstance(k, tuple): + self.rotations.__setitem__(k, v.rotations) + self.positions.__setitem__(k, v.positions) + self.orients.__setitem__(k[1:], v.orients) + self.offsets.__setitem__(k[1:], v.offsets) + self.parents.__setitem__(k[1:], v.parents) + else: + self.rotations.__setitem__(k, v.rotations) + self.positions.__setitem__(k, v.positions) + self.orients.__setitem__(k, v.orients) + self.offsets.__setitem__(k, v.offsets) + self.parents.__setitem__(k, v.parents) + + @property + def shape(self): + return (self.rotations.shape[0], self.rotations.shape[1]) + + def copy(self): + return Animation( + self.rotations.copy(), self.positions.copy(), + self.orients.copy(), self.offsets.copy(), + self.parents.copy(), self.names, + self.frametime) + + def repeat(self, *args, **kw): + return Animation( + self.rotations.repeat(*args, **kw), + self.positions.repeat(*args, **kw), + self.orients, self.offsets, self.parents, self.frametime, self.names) + + def ravel(self): + return np.hstack([ + self.rotations.log().ravel(), + self.positions.ravel(), + self.orients.log().ravel(), + self.offsets.ravel()]) + + @classmethod + def unravel(cls, anim, shape, parents): + nf, nj = shape + rotations = anim[nf * nj * 0:nf * nj * 3] + positions = anim[nf * nj * 3:nf * nj * 6] + orients = anim[nf * nj * 6 + nj * 0:nf * nj * 6 + nj * 3] + offsets = anim[nf * nj * 6 + nj * 3:nf * nj * 6 + nj * 6] + return cls( + Quaternions.exp(rotations), positions, + Quaternions.exp(orients), offsets, + parents.copy()) + + +# local transformation matrices +def transforms_local(anim): + """ + Computes Animation Local Transforms + + As well as a number of other uses this can + be used to compute global joint transforms, + which in turn can be used to compete global + joint positions + + Parameters + ---------- + + anim : Animation + Input animation + + Returns + ------- + + transforms : (F, J, 4, 4) ndarray + + For each frame F, joint local + transforms for each joint J + """ + + transforms = anim.rotations.transforms() + transforms = np.concatenate([transforms, np.zeros(transforms.shape[:2] + (3, 1))], axis=-1) + transforms = np.concatenate([transforms, np.zeros(transforms.shape[:2] + (1, 4))], axis=-2) + # the last column is filled with the joint positions! + transforms[:, :, 0:3, 3] = anim.positions + transforms[:, :, 3:4, 3] = 1.0 + return transforms + + +def transforms_multiply(t0s, t1s): + """ + Transforms Multiply + + Multiplies two arrays of animation transforms + + Parameters + ---------- + + t0s, t1s : (F, J, 4, 4) ndarray + Two arrays of transforms + for each frame F and each + joint J + + Returns + ------- + + transforms : (F, J, 4, 4) ndarray + Array of transforms for each + frame F and joint J multiplied + together + """ + + return ut.matrix_multiply(t0s, t1s) + + +def transforms_inv(ts): + fts = ts.reshape(-1, 4, 4) + fts = np.array(list(map(lambda x: np.linalg.inv(x), fts))) + return fts.reshape(ts.shape) + + +def transforms_blank(anim): + """ + Blank Transforms + + Parameters + ---------- + + anim : Animation + Input animation + + Returns + ------- + + transforms : (F, J, 4, 4) ndarray + Array of identity transforms for + each frame F and joint J + """ + + ts = np.zeros(anim.shape + (4, 4)) + ts[:, :, 0, 0] = 1.0; + ts[:, :, 1, 1] = 1.0; + ts[:, :, 2, 2] = 1.0; + ts[:, :, 3, 3] = 1.0; + return ts + + +# global transformation matrices +def transforms_global(anim): + """ + Global Animation Transforms + + This relies on joint ordering + being incremental. That means a joint + J1 must not be a ancestor of J0 if + J0 appears before J1 in the joint + ordering. + + Parameters + ---------- + + anim : Animation + Input animation + + Returns + ------ + + transforms : (F, J, 4, 4) ndarray + Array of global transforms for + each frame F and joint J + """ + locals = transforms_local(anim) + globals = transforms_blank(anim) + + globals[:, 0] = locals[:, 0] + + for i in range(1, anim.shape[1]): + globals[:, i] = transforms_multiply(globals[:, anim.parents[i]], locals[:, i]) + + return globals + + +# !!! useful! +def positions_global(anim): + """ + Global Joint Positions + + Given an animation compute the global joint + positions at at every frame + + Parameters + ---------- + + anim : Animation + Input animation + + Returns + ------- + + positions : (F, J, 3) ndarray + Positions for every frame F + and joint position J + """ + + # get the last column -- corresponding to the coordinates + positions = transforms_global(anim)[:, :, :, 3] + return positions[:, :, :3] / positions[:, :, 3, np.newaxis] + + +""" Rotations """ + + +def rotations_global(anim): + """ + Global Animation Rotations + + This relies on joint ordering + being incremental. That means a joint + J1 must not be a ancestor of J0 if + J0 appears before J1 in the joint + ordering. + + Parameters + ---------- + + anim : Animation + Input animation + + Returns + ------- + + points : (F, J) Quaternions + global rotations for every frame F + and joint J + """ + + joints = np.arange(anim.shape[1]) + parents = np.arange(anim.shape[1]) + locals = anim.rotations + globals = Quaternions.id(anim.shape) + + globals[:, 0] = locals[:, 0] + + for i in range(1, anim.shape[1]): + globals[:, i] = globals[:, anim.parents[i]] * locals[:, i] + + return globals + + +def rotations_parents_global(anim): + rotations = rotations_global(anim) + rotations = rotations[:, anim.parents] + rotations[:, 0] = Quaternions.id(len(anim)) + return rotations + +""" Offsets & Orients """ + + +def orients_global(anim): + joints = np.arange(anim.shape[1]) + parents = np.arange(anim.shape[1]) + locals = anim.orients + globals = Quaternions.id(anim.shape[1]) + + globals[:, 0] = locals[:, 0] + + for i in range(1, anim.shape[1]): + globals[:, i] = globals[:, anim.parents[i]] * locals[:, i] + + return globals + + +def offsets_transforms_local(anim): + transforms = anim.orients[np.newaxis].transforms() + transforms = np.concatenate([transforms, np.zeros(transforms.shape[:2] + (3, 1))], axis=-1) + transforms = np.concatenate([transforms, np.zeros(transforms.shape[:2] + (1, 4))], axis=-2) + transforms[:, :, 0:3, 3] = anim.offsets[np.newaxis] + transforms[:, :, 3:4, 3] = 1.0 + return transforms + + +def offsets_transforms_global(anim): + joints = np.arange(anim.shape[1]) + parents = np.arange(anim.shape[1]) + locals = offsets_transforms_local(anim) + globals = transforms_blank(anim) + + globals[:, 0] = locals[:, 0] + + for i in range(1, anim.shape[1]): + globals[:, i] = transforms_multiply(globals[:, anim.parents[i]], locals[:, i]) + + return globals + + +def offsets_global(anim): + offsets = offsets_transforms_global(anim)[:, :, :, 3] + return offsets[0, :, :3] / offsets[0, :, 3, np.newaxis] + + +""" Lengths """ + + +def offset_lengths(anim): + return np.sum(anim.offsets[1:] ** 2.0, axis=1) ** 0.5 + + +def position_lengths(anim): + return np.sum(anim.positions[:, 1:] ** 2.0, axis=2) ** 0.5 + + +""" Skinning """ + + +def skin(anim, rest, weights, mesh, maxjoints=4): + full_transforms = transforms_multiply( + transforms_global(anim), + transforms_inv(transforms_global(rest[0:1]))) + + weightids = np.argsort(-weights, axis=1)[:, :maxjoints] + weightvls = np.array(list(map(lambda w, i: w[i], weights, weightids))) + weightvls = weightvls / weightvls.sum(axis=1)[..., np.newaxis] + + verts = np.hstack([mesh, np.ones((len(mesh), 1))]) + verts = verts[np.newaxis, :, np.newaxis, :, np.newaxis] + verts = transforms_multiply(full_transforms[:, weightids], verts) + verts = (verts[:, :, :, :3] / verts[:, :, :, 3:4])[:, :, :, :, 0] + + return np.sum(weightvls[np.newaxis, :, :, np.newaxis] * verts, axis=2) \ No newline at end of file diff --git a/src/momask-preenc/visualization/AnimationStructure.py b/src/momask-preenc/visualization/AnimationStructure.py new file mode 100644 index 0000000000000000000000000000000000000000..4f212768b856ce3c8d6f07050f8cc70cc19a4622 --- /dev/null +++ b/src/momask-preenc/visualization/AnimationStructure.py @@ -0,0 +1,425 @@ +import numpy as np +# import scipy.sparse as sparse +import visualization.Animation as Animation + + +""" Family Functions """ + + +def joints(parents): + """ + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + joints : (J) ndarray + Array of joint indices + """ + return np.arange(len(parents), dtype=int) + + +def joints_list(parents): + """ + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + joints : [ndarray] + List of arrays of joint idices for + each joint + """ + return list(joints(parents)[:, np.newaxis]) + + +def parents_list(parents): + """ + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + parents : [ndarray] + List of arrays of joint idices for + the parents of each joint + """ + return list(parents[:, np.newaxis]) + + +def children_list(parents): + """ + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + children : [ndarray] + List of arrays of joint indices for + the children of each joint + """ + + def joint_children(i): + return [j for j, p in enumerate(parents) if p == i] + + return list(map(lambda j: np.array(joint_children(j)), joints(parents))) + + +def descendants_list(parents): + """ + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + descendants : [ndarray] + List of arrays of joint idices for + the descendants of each joint + """ + + children = children_list(parents) + + def joint_descendants(i): + return sum([joint_descendants(j) for j in children[i]], list(children[i])) + + return list(map(lambda j: np.array(joint_descendants(j)), joints(parents))) + + +def ancestors_list(parents): + """ + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + ancestors : [ndarray] + List of arrays of joint idices for + the ancestors of each joint + """ + + decendants = descendants_list(parents) + + def joint_ancestors(i): + return [j for j in joints(parents) if i in decendants[j]] + + return list(map(lambda j: np.array(joint_ancestors(j)), joints(parents))) + + +""" Mask Functions """ + + +def mask(parents, filter): + """ + Constructs a Mask for a give filter + + A mask is a (J, J) ndarray truth table for a given + condition over J joints. For example there + may be a mask specifying if a joint N is a + child of another joint M. + + This could be constructed into a mask using + `m = mask(parents, children_list)` and the condition + of childhood tested using `m[N, M]`. + + Parameters + ---------- + + parents : (J) ndarray + parents array + + filter : (J) ndarray -> [ndarray] + function that outputs a list of arrays + of joint indices for some condition + + Returns + ------- + + mask : (N, N) ndarray + boolean truth table of given condition + """ + m = np.zeros((len(parents), len(parents))).astype(bool) + jnts = joints(parents) + fltr = filter(parents) + for i, f in enumerate(fltr): m[i, :] = np.any(jnts[:, np.newaxis] == f[np.newaxis, :], axis=1) + return m + + +def joints_mask(parents): return np.eye(len(parents)).astype(bool) + + +def children_mask(parents): return mask(parents, children_list) + + +def parents_mask(parents): return mask(parents, parents_list) + + +def descendants_mask(parents): return mask(parents, descendants_list) + + +def ancestors_mask(parents): return mask(parents, ancestors_list) + + +""" Search Functions """ + + +def joint_chain_ascend(parents, start, end): + chain = [] + while start != end: + chain.append(start) + start = parents[start] + chain.append(end) + return np.array(chain, dtype=int) + + +""" Constraints """ + + +def constraints(anim, **kwargs): + """ + Constraint list for Animation + + This constraint list can be used in the + VerletParticle solver to constrain + a animation global joint positions. + + Parameters + ---------- + + anim : Animation + Input animation + + masses : (F, J) ndarray + Optional list of masses + for joints J across frames F + defaults to weighting by + vertical height + + Returns + ------- + + constraints : [(int, int, (F, J) ndarray, (F, J) ndarray, (F, J) ndarray)] + A list of constraints in the format: + (Joint1, Joint2, Masses1, Masses2, Lengths) + + """ + + masses = kwargs.pop('masses', None) + + children = children_list(anim.parents) + constraints = [] + + points_offsets = Animation.offsets_global(anim) + points = Animation.positions_global(anim) + + if masses is None: + masses = 1.0 / (0.1 + np.absolute(points_offsets[:, 1])) + masses = masses[np.newaxis].repeat(len(anim), axis=0) + + for j in range(anim.shape[1]): + + """ Add constraints between all joints and their children """ + for c0 in children[j]: + + dists = np.sum((points[:, c0] - points[:, j]) ** 2.0, axis=1) ** 0.5 + constraints.append((c0, j, masses[:, c0], masses[:, j], dists)) + + """ Add constraints between all children of joint """ + for c1 in children[j]: + if c0 == c1: continue + + dists = np.sum((points[:, c0] - points[:, c1]) ** 2.0, axis=1) ** 0.5 + constraints.append((c0, c1, masses[:, c0], masses[:, c1], dists)) + + return constraints + + +""" Graph Functions """ + + +def graph(anim): + """ + Generates a weighted adjacency matrix + using local joint distances along + the skeletal structure. + + Joints which are not connected + are assigned the weight `0`. + + Joints which actually have zero distance + between them, but are still connected, are + perturbed by some minimal amount. + + The output of this routine can be used + with the `scipy.sparse.csgraph` + routines for graph analysis. + + Parameters + ---------- + + anim : Animation + input animation + + Returns + ------- + + graph : (N, N) ndarray + weight adjacency matrix using + local distances along the + skeletal structure from joint + N to joint M. If joints are not + directly connected are assigned + the weight `0`. + """ + + graph = np.zeros(anim.shape[1], anim.shape[1]) + lengths = np.sum(anim.offsets ** 2.0, axis=1) ** 0.5 + 0.001 + + for i, p in enumerate(anim.parents): + if p == -1: continue + graph[i, p] = lengths[p] + graph[p, i] = lengths[p] + + return graph + + +def distances(anim): + """ + Generates a distance matrix for + pairwise joint distances along + the skeletal structure + + Parameters + ---------- + + anim : Animation + input animation + + Returns + ------- + + distances : (N, N) ndarray + array of pairwise distances + along skeletal structure + from some joint N to some + joint M + """ + + distances = np.zeros((anim.shape[1], anim.shape[1])) + generated = distances.copy().astype(bool) + + joint_lengths = np.sum(anim.offsets ** 2.0, axis=1) ** 0.5 + joint_children = children_list(anim) + joint_parents = parents_list(anim) + + def find_distance(distances, generated, prev, i, j): + + """ If root, identity, or already generated, return """ + if j == -1: return (0.0, True) + if j == i: return (0.0, True) + if generated[i, j]: return (distances[i, j], True) + + """ Find best distances along parents and children """ + par_dists = [(joint_lengths[j], find_distance(distances, generated, j, i, p)) for p in joint_parents[j] if + p != prev] + out_dists = [(joint_lengths[c], find_distance(distances, generated, j, i, c)) for c in joint_children[j] if + c != prev] + + """ Check valid distance and not dead end """ + par_dists = [a + d for (a, (d, f)) in par_dists if f] + out_dists = [a + d for (a, (d, f)) in out_dists if f] + + """ All dead ends """ + if (out_dists + par_dists) == []: return (0.0, False) + + """ Get minimum path """ + dist = min(out_dists + par_dists) + distances[i, j] = dist; + distances[j, i] = dist + generated[i, j] = True; + generated[j, i] = True + + for i in range(anim.shape[1]): + for j in range(anim.shape[1]): + find_distance(distances, generated, -1, i, j) + + return distances + + +def edges(parents): + """ + Animation structure edges + + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + edges : (M, 2) ndarray + array of pairs where each + pair contains two indices of a joints + which corrisponds to an edge in the + joint structure going from parent to child. + """ + + return np.array(list(zip(parents, joints(parents)))[1:]) + + +def incidence(parents): + """ + Incidence Matrix + + Parameters + ---------- + + parents : (J) ndarray + parents array + + Returns + ------- + + incidence : (N, M) ndarray + + Matrix of N joint positions by + M edges which each entry is either + 1 or -1 and multiplication by the + joint positions returns the an + array of vectors along each edge + of the structure + """ + + es = edges(parents) + + inc = np.zeros((len(parents) - 1, len(parents))).astype(np.int) + for i, e in enumerate(es): + inc[i, e[0]] = 1 + inc[i, e[1]] = -1 + + return inc.T diff --git a/src/momask-preenc/visualization/BVH.py b/src/momask-preenc/visualization/BVH.py new file mode 100644 index 0000000000000000000000000000000000000000..c956ff15edf18523fd381e4fe4b8dc569d8e729a --- /dev/null +++ b/src/momask-preenc/visualization/BVH.py @@ -0,0 +1,273 @@ +import re +import numpy as np +from common.quaternion import * +from visualization.Animation import Animation + +channelmap = { + 'Xrotation': 'x', + 'Yrotation': 'y', + 'Zrotation': 'z' +} + +channelmap_inv = { + 'x': 'Xrotation', + 'y': 'Yrotation', + 'z': 'Zrotation', +} + +ordermap = { + 'x': 0, + 'y': 1, + 'z': 2, +} + +def load(filename, start=None, end=None, world=False, need_quater=True): + """ + Reads a BVH file and constructs an animation + Parameters + ---------- + filename: str + File to be opened + start : int + Optional Starting Frame + end : int + Optional Ending Frame + order : str + Optional Specifier for joint order. + Given as string E.G 'xyz', 'zxy' + world : bool + If set to true euler angles are applied + together in world space rather than local + space + Returns + ------- + (animation, joint_names, frametime) + Tuple of loaded animation and joint names + """ + + f = open(filename, "r") + + i = 0 + active = -1 + end_site = False + + names = [] + orients = Quaterions.id(0) + offsets = np.array([]).reshape((0, 3)) + parents = np.array([], dtype=int) + orders = [] + + for line in f: + + if "HIERARCHY" in line: continue + if "MOTION" in line: continue + + # """ Modified line read to handle mixamo data """ + rmatch = re.match(r"ROOT (\w+)", line) + # rmatch = re.match(r"ROOT (\w+:?\w+)", line) + if rmatch: + names.append(rmatch.group(1)) + offsets = np.append(offsets, np.array([[0, 0, 0]]), axis=0) + orients = np.append(orients, np.array([[1, 0, 0, 0]]), axis=0) + parents = np.append(parents, active) + active = (len(parents) - 1) + continue + + if "{" in line: continue + + if "}" in line: + if end_site: + end_site = False + else: + active = parents[active] + continue + + offmatch = re.match(r"\s*OFFSET\s+([\-\d\.e]+)\s+([\-\d\.e]+)\s+([\-\d\.e]+)", line) + if offmatch: + if not end_site: + offsets[active] = np.array([list(map(float, offmatch.groups()))]) + continue + + chanmatch = re.match(r"\s*CHANNELS\s+(\d+)", line) + if chanmatch: + channels = int(chanmatch.group(1)) + + channelis = 0 if channels == 3 else 3 + channelie = 3 if channels == 3 else 6 + parts = line.split()[2 + channelis:2 + channelie] + if any([p not in channelmap for p in parts]): + continue + order = "".join([channelmap[p] for p in parts]) + orders.append(order) + continue + + # """ Modified line read to handle mixamo data """ + jmatch = re.match("\s*JOINT\s+(\w+)", line) + # jmatch = re.match("\s*JOINT\s+(\w+:?\w+)", line) + if jmatch: + names.append(jmatch.group(1)) + offsets = np.append(offsets, np.array([[0, 0, 0]]), axis=0) + orients = np.append(orients, np.array([[1, 0, 0, 0]]), axis=0) + parents = np.append(parents, active) + active = (len(parents) - 1) + continue + + if "End Site" in line: + end_site = True + continue + + fmatch = re.match("\s*Frames:\s+(\d+)", line) + if fmatch: + if start and end: + fnum = (end - start) - 1 + else: + fnum = int(fmatch.group(1)) + jnum = len(parents) + positions = offsets[np.newaxis].repeat(fnum, axis=0) + rotations = np.zeros((fnum, len(orients), 3)) + continue + + fmatch = re.match("\s*Frame Time:\s+([\d\.]+)", line) + if fmatch: + frametime = float(fmatch.group(1)) + continue + + if (start and end) and (i < start or i >= end - 1): + i += 1 + continue + + # dmatch = line.strip().split(' ') + dmatch = line.strip().split() + if dmatch: + data_block = np.array(list(map(float, dmatch))) + N = len(parents) + fi = i - start if start else i + if channels == 3: + positions[fi, 0:1] = data_block[0:3] + rotations[fi, :] = data_block[3:].reshape(N, 3) + elif channels == 6: + data_block = data_block.reshape(N, 6) + positions[fi, :] = data_block[:, 0:3] + rotations[fi, :] = data_block[:, 3:6] + elif channels == 9: + positions[fi, 0] = data_block[0:3] + data_block = data_block[3:].reshape(N - 1, 9) + rotations[fi, 1:] = data_block[:, 3:6] + positions[fi, 1:] += data_block[:, 0:3] * data_block[:, 6:9] + else: + raise Exception("Too many channels! %i" % channels) + + i += 1 + + f.close() + + all_rotations = [] + canonical_order = 'xyz' + for i, order in enumerate(orders): + rot = rotations[:, i:i + 1] + if need_quater: + quat = euler_to_quat_np(np.radians(rot), order=order, world=world) + all_rotations.append(quat) + continue + elif order != canonical_order: + quat = euler_to_quat_np(np.radians(rot), order=order, world=world) + rot = np.degrees(qeuler_np(quat, order=canonical_order)) + all_rotations.append(rot) + rotations = np.concatenate(all_rotations, axis=1) + + return Animation(rotations, positions, orients, offsets, parents, names, frametime) + +def write_bvh(parent, offset, rotation, rot_position, names, frametime, order, path, endsite=None): + file = open(path, 'w') + frame = rotation.shape[0] + assert rotation.shape[-1] == 3 + joint_num = rotation.shape[1] + order = order.upper() + + file_string = 'HIERARCHY\n' + + seq = [] + + def write_static(idx, prefix): + nonlocal parent, offset, rotation, names, order, endsite, file_string, seq + seq.append(idx) + if idx == 0: + name_label = 'ROOT ' + names[idx] + channel_label = 'CHANNELS 6 Xposition Yposition Zposition {}rotation {}rotation {}rotation'.format( + *order) + else: + name_label = 'JOINT ' + names[idx] + channel_label = 'CHANNELS 3 {}rotation {}rotation {}rotation'.format(*order) + offset_label = 'OFFSET %.6f %.6f %.6f' % (offset[idx][0], offset[idx][1], offset[idx][2]) + + file_string += prefix + name_label + '\n' + file_string += prefix + '{\n' + file_string += prefix + '\t' + offset_label + '\n' + file_string += prefix + '\t' + channel_label + '\n' + + has_child = False + for y in range(idx + 1, rotation.shape[1]): + if parent[y] == idx: + has_child = True + write_static(y, prefix + '\t') + if not has_child: + file_string += prefix + '\t' + 'End Site\n' + file_string += prefix + '\t' + '{\n' + file_string += prefix + '\t\t' + 'OFFSET 0 0 0\n' + file_string += prefix + '\t' + '}\n' + + file_string += prefix + '}\n' + + write_static(0, '') + + file_string += 'MOTION\n' + 'Frames: {}\n'.format(frame) + 'Frame Time: %.8f\n' % frametime + for i in range(frame): + file_string += '%.6f %.6f %.6f ' % (rot_position[i][0], rot_position[i][1], + rot_position[i][2]) + for j in range(joint_num): + idx = seq[j] + file_string += '%.6f %.6f %.6f ' % (rotation[i][idx][0], rotation[i][idx][1], rotation[i][idx][2]) + file_string += '\n' + + file.write(file_string) + return file_string + +class WriterWrapper: + def __init__(self, parents, frametime, offset=None, names=None): + self.parents = parents + self.offset = offset + self.frametime = frametime + self.names = names + + def write(self, filename, rot, r_pos, order, offset=None, names=None, repr='quat'): + """ + Write animation to bvh file + :param filename: + :param rot: Quaternion as (w, x, y, z) + :param pos: + :param offset: + :return: + """ + if repr not in ['euler', 'quat', 'quaternion', 'cont6d']: + raise Exception('Unknown rotation representation') + if offset is None: + offset = self.offset + if not isinstance(offset, torch.Tensor): + offset = torch.tensor(offset) + n_bone = offset.shape[0] + + if repr == 'cont6d': + rot = rot.reshape(rot.shape[0], -1, 6) + rot = cont6d_to_quat_np(rot) + if repr == 'cont6d' or repr == 'quat' or repr == 'quaternion': +# rot = rot.reshape(rot.shape[0], -1, 4) +# rot /= rot.norm(dim=-1, keepdim=True) ** 0.5 + euler = qeuler_np(rot, order=order) + rot = euler + + if names is None: + if self.names is None: + names = ['%02d' % i for i in range(n_bone)] + else: + names = self.names + write_bvh(self.parents, offset, rot, r_pos, names, self.frametime, order, filename) \ No newline at end of file diff --git a/src/momask-preenc/visualization/BVH_mod.py b/src/momask-preenc/visualization/BVH_mod.py new file mode 100644 index 0000000000000000000000000000000000000000..1eee63c35cac3d8e3ff985ae080d980c95432539 --- /dev/null +++ b/src/momask-preenc/visualization/BVH_mod.py @@ -0,0 +1,304 @@ +import re +import numpy as np + +from visualization.Animation import Animation +from visualization.Quaternions import Quaternions + +channelmap = { + 'Xrotation': 'x', + 'Yrotation': 'y', + 'Zrotation': 'z' +} + +channelmap_inv = { + 'x': 'Xrotation', + 'y': 'Yrotation', + 'z': 'Zrotation', +} + +ordermap = { + 'x': 0, + 'y': 1, + 'z': 2, +} + + +def load(filename, start=None, end=None, order=None, world=False, need_quater=True): + """ + Reads a BVH file and constructs an animation + + Parameters + ---------- + filename: str + File to be opened + + start : int + Optional Starting Frame + + end : int + Optional Ending Frame + + order : str + Optional Specifier for joint order. + Given as string E.G 'xyz', 'zxy' + + world : bool + If set to true euler angles are applied + together in world space rather than local + space + + Returns + ------- + + (animation, joint_names, frametime) + Tuple of loaded animation and joint names + """ + + f = open(filename, "r") + + i = 0 + active = -1 + end_site = False + + names = [] + orients = Quaternions.id(0) + offsets = np.array([]).reshape((0, 3)) + parents = np.array([], dtype=int) + + for line in f: + + if "HIERARCHY" in line: continue + if "MOTION" in line: continue + + """ Modified line read to handle mixamo data """ + # rmatch = re.match(r"ROOT (\w+)", line) + rmatch = re.match(r"ROOT (\w+:?\w+)", line) + if rmatch: + names.append(rmatch.group(1)) + offsets = np.append(offsets, np.array([[0, 0, 0]]), axis=0) + orients.qs = np.append(orients.qs, np.array([[1, 0, 0, 0]]), axis=0) + parents = np.append(parents, active) + active = (len(parents) - 1) + continue + + if "{" in line: continue + + if "}" in line: + if end_site: + end_site = False + else: + active = parents[active] + continue + + offmatch = re.match(r"\s*OFFSET\s+([\-\d\.e]+)\s+([\-\d\.e]+)\s+([\-\d\.e]+)", line) + if offmatch: + if not end_site: + offsets[active] = np.array([list(map(float, offmatch.groups()))]) + continue + + chanmatch = re.match(r"\s*CHANNELS\s+(\d+)", line) + if chanmatch: + channels = int(chanmatch.group(1)) + if order is None: + channelis = 0 if channels == 3 else 3 + channelie = 3 if channels == 3 else 6 + parts = line.split()[2 + channelis:2 + channelie] + if any([p not in channelmap for p in parts]): + continue + order = "".join([channelmap[p] for p in parts]) + continue + + """ Modified line read to handle mixamo data """ + # jmatch = re.match("\s*JOINT\s+(\w+)", line) + jmatch = re.match("\s*JOINT\s+(\w+:?\w+)", line) + if jmatch: + names.append(jmatch.group(1)) + offsets = np.append(offsets, np.array([[0, 0, 0]]), axis=0) + orients.qs = np.append(orients.qs, np.array([[1, 0, 0, 0]]), axis=0) + parents = np.append(parents, active) + active = (len(parents) - 1) + continue + + if "End Site" in line: + end_site = True + continue + + fmatch = re.match("\s*Frames:\s+(\d+)", line) + if fmatch: + if start and end: + fnum = (end - start) - 1 + else: + fnum = int(fmatch.group(1)) + jnum = len(parents) + positions = offsets[np.newaxis].repeat(fnum, axis=0) + rotations = np.zeros((fnum, len(orients), 3)) + continue + + fmatch = re.match("\s*Frame Time:\s+([\d\.]+)", line) + if fmatch: + frametime = float(fmatch.group(1)) + continue + + if (start and end) and (i < start or i >= end - 1): + i += 1 + continue + + # dmatch = line.strip().split(' ') + dmatch = line.strip().split() + if dmatch: + data_block = np.array(list(map(float, dmatch))) + N = len(parents) + fi = i - start if start else i + if channels == 3: + positions[fi, 0:1] = data_block[0:3] + rotations[fi, :] = data_block[3:].reshape(N, 3) + elif channels == 6: + data_block = data_block.reshape(N, 6) + positions[fi, :] = data_block[:, 0:3] + rotations[fi, :] = data_block[:, 3:6] + elif channels == 9: + positions[fi, 0] = data_block[0:3] + data_block = data_block[3:].reshape(N - 1, 9) + rotations[fi, 1:] = data_block[:, 3:6] + positions[fi, 1:] += data_block[:, 0:3] * data_block[:, 6:9] + else: + raise Exception("Too many channels! %i" % channels) + + i += 1 + + f.close() + + if need_quater: + rotations = Quaternions.from_euler(np.radians(rotations), order=order, world=world) + elif order != 'xyz': + rotations = Quaternions.from_euler(np.radians(rotations), order=order, world=world) + rotations = np.degrees(rotations.euler()) + + return Animation(rotations, positions, orients, offsets, parents, names, frametime) + + +def save(filename, anim, names=None, frametime=1.0 / 24.0, order='zyx', positions=False, mask=None, quater=False): + """ + Saves an Animation to file as BVH + + Parameters + ---------- + filename: str + File to be saved to + + anim : Animation + Animation to save + + names : [str] + List of joint names + + order : str + Optional Specifier for joint order. + Given as string E.G 'xyz', 'zxy' + + frametime : float + Optional Animation Frame time + + positions : bool + Optional specfier to save bone + positions for each frame + + orients : bool + Multiply joint orients to the rotations + before saving. + + """ + + if names is None: + names = ["joint_" + str(i) for i in range(len(anim.parents))] + + with open(filename, 'w') as f: + + t = "" + f.write("%sHIERARCHY\n" % t) + f.write("%sROOT %s\n" % (t, names[0])) + f.write("%s{\n" % t) + t += '\t' + + f.write("%sOFFSET %f %f %f\n" % (t, anim.offsets[0, 0], anim.offsets[0, 1], anim.offsets[0, 2])) + f.write("%sCHANNELS 6 Xposition Yposition Zposition %s %s %s \n" % + (t, channelmap_inv[order[0]], channelmap_inv[order[1]], channelmap_inv[order[2]])) + + for i in range(anim.shape[1]): + if anim.parents[i] == 0: + t = save_joint(f, anim, names, t, i, order=order, positions=positions) + + t = t[:-1] + f.write("%s}\n" % t) + + f.write("MOTION\n") + f.write("Frames: %i\n" % anim.shape[0]); + f.write("Frame Time: %f\n" % frametime); + + # if orients: + # rots = np.degrees((-anim.orients[np.newaxis] * anim.rotations).euler(order=order[::-1])) + # else: + # rots = np.degrees(anim.rotations.euler(order=order[::-1])) + # rots = np.degrees(anim.rotations.euler(order=order[::-1])) + if quater: + rots = np.degrees(anim.rotations.euler(order=order[::-1])) + else: + rots = anim.rotations + poss = anim.positions + + for i in range(anim.shape[0]): + for j in range(anim.shape[1]): + + if positions or j == 0: + + f.write("%f %f %f %f %f %f " % ( + poss[i, j, 0], poss[i, j, 1], poss[i, j, 2], + rots[i, j, ordermap[order[0]]], rots[i, j, ordermap[order[1]]], rots[i, j, ordermap[order[2]]])) + + else: + if mask == None or mask[j] == 1: + f.write("%f %f %f " % ( + rots[i, j, ordermap[order[0]]], rots[i, j, ordermap[order[1]]], + rots[i, j, ordermap[order[2]]])) + else: + f.write("%f %f %f " % (0, 0, 0)) + + f.write("\n") + + +def save_joint(f, anim, names, t, i, order='zyx', positions=False): + f.write("%sJOINT %s\n" % (t, names[i])) + f.write("%s{\n" % t) + t += '\t' + + f.write("%sOFFSET %f %f %f\n" % (t, anim.offsets[i, 0], anim.offsets[i, 1], anim.offsets[i, 2])) + + if positions: + f.write("%sCHANNELS 6 Xposition Yposition Zposition %s %s %s \n" % (t, + channelmap_inv[order[0]], + channelmap_inv[order[1]], + channelmap_inv[order[2]])) + else: + f.write("%sCHANNELS 3 %s %s %s\n" % (t, + channelmap_inv[order[0]], channelmap_inv[order[1]], + channelmap_inv[order[2]])) + + end_site = True + + for j in range(anim.shape[1]): + if anim.parents[j] == i: + t = save_joint(f, anim, names, t, j, order=order, positions=positions) + end_site = False + + if end_site: + f.write("%sEnd Site\n" % t) + f.write("%s{\n" % t) + t += '\t' + f.write("%sOFFSET %f %f %f\n" % (t, 0.0, 0.0, 0.0)) + t = t[:-1] + f.write("%s}\n" % t) + + t = t[:-1] + f.write("%s}\n" % t) + + return t \ No newline at end of file diff --git a/src/momask-preenc/visualization/InverseKinematics.py b/src/momask-preenc/visualization/InverseKinematics.py new file mode 100644 index 0000000000000000000000000000000000000000..dbb4d5598cc63f5f8a05d3695d6ef8ec40a1af56 --- /dev/null +++ b/src/momask-preenc/visualization/InverseKinematics.py @@ -0,0 +1,633 @@ +import numpy as np +import scipy.linalg as linalg + +from visualization import Animation +from visualization import AnimationStructure + +from visualization.Quaternions import Quaternions + + +class BasicInverseKinematics: + """ + Basic Inverse Kinematics Solver + + This is an extremely simple full body IK + solver. + + It works given the following conditions: + + * All joint targets must be specified + * All joint targets must be in reach + * All joint targets must not differ + extremely from the starting pose + * No bone length constraints can be violated + * The root translation and rotation are + set to good initial values + + It works under the observation that if the + _directions_ the joints are pointing toward + match the _directions_ of the vectors between + the target joints then the pose should match + that of the target pose. + + Therefore it iterates over joints rotating + each joint such that the vectors between it + and it's children match that of the target + positions. + + Parameters + ---------- + + animation : Animation + animation input + + positions : (F, J, 3) ndarray + target positions for each frame F + and each joint J + + iterations : int + Optional number of iterations. + If the above conditions are met + 1 iteration should be enough, + therefore the default is 1 + + silent : bool + Optional if to suppress output + defaults to False + """ + + def __init__(self, animation, positions, iterations=1, silent=True): + + self.animation = animation + self.positions = positions + self.iterations = iterations + self.silent = silent + + def __call__(self): + + children = AnimationStructure.children_list(self.animation.parents) + + for i in range(self.iterations): + + for j in AnimationStructure.joints(self.animation.parents): + + c = np.array(children[j]) + if len(c) == 0: continue + + anim_transforms = Animation.transforms_global(self.animation) + anim_positions = anim_transforms[:, :, :3, 3] + anim_rotations = Quaternions.from_transforms(anim_transforms) + + jdirs = anim_positions[:, c] - anim_positions[:, np.newaxis, j] + ddirs = self.positions[:, c] - anim_positions[:, np.newaxis, j] + + jsums = np.sqrt(np.sum(jdirs ** 2.0, axis=-1)) + 1e-10 + dsums = np.sqrt(np.sum(ddirs ** 2.0, axis=-1)) + 1e-10 + + jdirs = jdirs / jsums[:, :, np.newaxis] + ddirs = ddirs / dsums[:, :, np.newaxis] + + angles = np.arccos(np.sum(jdirs * ddirs, axis=2).clip(-1, 1)) + axises = np.cross(jdirs, ddirs) + axises = -anim_rotations[:, j, np.newaxis] * axises + + rotations = Quaternions.from_angle_axis(angles, axises) + + if rotations.shape[1] == 1: + averages = rotations[:, 0] + else: + averages = Quaternions.exp(rotations.log().mean(axis=-2)) + + self.animation.rotations[:, j] = self.animation.rotations[:, j] * averages + + if not self.silent: + anim_positions = Animation.positions_global(self.animation) + error = np.mean(np.sum((anim_positions - self.positions) ** 2.0, axis=-1) ** 0.5) + print('[BasicInverseKinematics] Iteration %i Error: %f' % (i + 1, error)) + + return self.animation + + +class JacobianInverseKinematics: + """ + Jacobian Based Full Body IK Solver + + This is a full body IK solver which + uses the dampened least squares inverse + jacobian method. + + It should remain fairly stable and effective + even for joint positions which are out of + reach and it can also take any number of targets + to treat as end effectors. + + Parameters + ---------- + + animation : Animation + animation to solve inverse problem on + + targets : {int : (F, 3) ndarray} + Dictionary of target positions for each + frame F, mapping joint index to + a target position + + references : (F, 3) + Optional list of J joint position + references for which the result + should bias toward + + iterations : int + Optional number of iterations to + compute. More iterations results in + better accuracy but takes longer to + compute. Default is 10. + + recalculate : bool + Optional if to recalcuate jacobian + each iteration. Gives better accuracy + but slower to compute. Defaults to True + + damping : float + Optional damping constant. Higher + damping increases stability but + requires more iterations to converge. + Defaults to 5.0 + + secondary : float + Force, or bias toward secondary target. + Defaults to 0.25 + + silent : bool + Optional if to suppress output + defaults to False + """ + + def __init__(self, animation, targets, + references=None, iterations=10, + recalculate=True, damping=2.0, + secondary=0.25, translate=False, + silent=False, weights=None, + weights_translate=None): + + self.animation = animation + self.targets = targets + self.references = references + + self.iterations = iterations + self.recalculate = recalculate + self.damping = damping + self.secondary = secondary + self.translate = translate + self.silent = silent + self.weights = weights + self.weights_translate = weights_translate + + def cross(self, a, b): + o = np.empty(b.shape) + o[..., 0] = a[..., 1] * b[..., 2] - a[..., 2] * b[..., 1] + o[..., 1] = a[..., 2] * b[..., 0] - a[..., 0] * b[..., 2] + o[..., 2] = a[..., 0] * b[..., 1] - a[..., 1] * b[..., 0] + return o + + def jacobian(self, x, fp, fr, ts, dsc, tdsc): + + """ Find parent rotations """ + prs = fr[:, self.animation.parents] + prs[:, 0] = Quaternions.id((1)) + + """ Find global positions of target joints """ + tps = fp[:, np.array(list(ts.keys()))] + + """ Get partial rotations """ + qys = Quaternions.from_angle_axis(x[:, 1:prs.shape[1] * 3:3], np.array([[[0, 1, 0]]])) + qzs = Quaternions.from_angle_axis(x[:, 2:prs.shape[1] * 3:3], np.array([[[0, 0, 1]]])) + + """ Find axis of rotations """ + es = np.empty((len(x), fr.shape[1] * 3, 3)) + es[:, 0::3] = ((prs * qzs) * qys) * np.array([[[1, 0, 0]]]) + es[:, 1::3] = ((prs * qzs) * np.array([[[0, 1, 0]]])) + es[:, 2::3] = ((prs * np.array([[[0, 0, 1]]]))) + + """ Construct Jacobian """ + j = fp.repeat(3, axis=1) + j = dsc[np.newaxis, :, :, np.newaxis] * (tps[:, np.newaxis, :] - j[:, :, np.newaxis]) + j = self.cross(es[:, :, np.newaxis, :], j) + j = np.swapaxes(j.reshape((len(x), fr.shape[1] * 3, len(ts) * 3)), 1, 2) + + if self.translate: + es = np.empty((len(x), fr.shape[1] * 3, 3)) + es[:, 0::3] = prs * np.array([[[1, 0, 0]]]) + es[:, 1::3] = prs * np.array([[[0, 1, 0]]]) + es[:, 2::3] = prs * np.array([[[0, 0, 1]]]) + + jt = tdsc[np.newaxis, :, :, np.newaxis] * es[:, :, np.newaxis, :].repeat(tps.shape[1], axis=2) + jt = np.swapaxes(jt.reshape((len(x), fr.shape[1] * 3, len(ts) * 3)), 1, 2) + + j = np.concatenate([j, jt], axis=-1) + + return j + + # @profile(immediate=True) + def __call__(self, descendants=None, gamma=1.0): + + self.descendants = descendants + + """ Calculate Masses """ + if self.weights is None: + self.weights = np.ones(self.animation.shape[1]) + + if self.weights_translate is None: + self.weights_translate = np.ones(self.animation.shape[1]) + + """ Calculate Descendants """ + if self.descendants is None: + self.descendants = AnimationStructure.descendants_mask(self.animation.parents) + + self.tdescendants = np.eye(self.animation.shape[1]) + self.descendants + + self.first_descendants = self.descendants[:, np.array(list(self.targets.keys()))].repeat(3, axis=0).astype(int) + self.first_tdescendants = self.tdescendants[:, np.array(list(self.targets.keys()))].repeat(3, axis=0).astype( + int) + + """ Calculate End Effectors """ + self.endeff = np.array(list(self.targets.values())) + self.endeff = np.swapaxes(self.endeff, 0, 1) + + if not self.references is None: + self.second_descendants = self.descendants.repeat(3, axis=0).astype(int) + self.second_tdescendants = self.tdescendants.repeat(3, axis=0).astype(int) + self.second_targets = dict([(i, self.references[:, i]) for i in range(self.references.shape[1])]) + + nf = len(self.animation) + nj = self.animation.shape[1] + + if not self.silent: + gp = Animation.positions_global(self.animation) + gp = gp[:, np.array(list(self.targets.keys()))] + error = np.mean(np.sqrt(np.sum((self.endeff - gp) ** 2.0, axis=2))) + print('[JacobianInverseKinematics] Start | Error: %f' % error) + + for i in range(self.iterations): + + """ Get Global Rotations & Positions """ + gt = Animation.transforms_global(self.animation) + gp = gt[:, :, :, 3] + gp = gp[:, :, :3] / gp[:, :, 3, np.newaxis] + gr = Quaternions.from_transforms(gt) + + x = self.animation.rotations.euler().reshape(nf, -1) + w = self.weights.repeat(3) + + if self.translate: + x = np.hstack([x, self.animation.positions.reshape(nf, -1)]) + w = np.hstack([w, self.weights_translate.repeat(3)]) + + """ Generate Jacobian """ + if self.recalculate or i == 0: + j = self.jacobian(x, gp, gr, self.targets, self.first_descendants, self.first_tdescendants) + + """ Update Variables """ + l = self.damping * (1.0 / (w + 0.001)) + d = (l * l) * np.eye(x.shape[1]) + e = gamma * (self.endeff.reshape(nf, -1) - gp[:, np.array(list(self.targets.keys()))].reshape(nf, -1)) + + x += np.array(list(map(lambda jf, ef: + linalg.lu_solve(linalg.lu_factor(jf.T.dot(jf) + d), jf.T.dot(ef)), j, e))) + + """ Generate Secondary Jacobian """ + if self.references is not None: + + ns = np.array(list(map(lambda jf: + np.eye(x.shape[1]) - linalg.solve(jf.T.dot(jf) + d, jf.T.dot(jf)), j))) + + if self.recalculate or i == 0: + j2 = self.jacobian(x, gp, gr, self.second_targets, self.second_descendants, + self.second_tdescendants) + + e2 = self.secondary * (self.references.reshape(nf, -1) - gp.reshape(nf, -1)) + + x += np.array(list(map(lambda nsf, j2f, e2f: + nsf.dot(linalg.lu_solve(linalg.lu_factor(j2f.T.dot(j2f) + d), j2f.T.dot(e2f))), + ns, j2, e2))) + + """ Set Back Rotations / Translations """ + self.animation.rotations = Quaternions.from_euler( + x[:, :nj * 3].reshape((nf, nj, 3)), order='xyz', world=True) + + if self.translate: + self.animation.positions = x[:, nj * 3:].reshape((nf, nj, 3)) + + """ Generate Error """ + + if not self.silent: + gp = Animation.positions_global(self.animation) + gp = gp[:, np.array(list(self.targets.keys()))] + error = np.mean(np.sum((self.endeff - gp) ** 2.0, axis=2) ** 0.5) + print('[JacobianInverseKinematics] Iteration %i | Error: %f' % (i + 1, error)) + return self.animation + + +class BasicJacobianIK: + """ + Same interface as BasicInverseKinematics + but uses the Jacobian IK Solver Instead + """ + + def __init__(self, animation, positions, iterations=10, silent=True, **kw): + targets = dict([(i, positions[:, i]) for i in range(positions.shape[1])]) + self.ik = JacobianInverseKinematics(animation, targets, iterations=iterations, silent=silent, **kw) + + def __call__(self, **kw): + return self.ik(**kw) + + +class ICP: + + def __init__(self, + anim, rest, weights, mesh, goal, + find_closest=True, damping=10, + iterations=10, silent=True, + translate=True, recalculate=True, + weights_translate=None): + + self.animation = anim + self.rest = rest + self.vweights = weights + self.mesh = mesh + self.goal = goal + self.find_closest = find_closest + self.iterations = iterations + self.silent = silent + self.translate = translate + self.damping = damping + self.weights = None + self.weights_translate = weights_translate + self.recalculate = recalculate + + def cross(self, a, b): + o = np.empty(b.shape) + o[..., 0] = a[..., 1] * b[..., 2] - a[..., 2] * b[..., 1] + o[..., 1] = a[..., 2] * b[..., 0] - a[..., 0] * b[..., 2] + o[..., 2] = a[..., 0] * b[..., 1] - a[..., 1] * b[..., 0] + return o + + def jacobian(self, x, fp, fr, goal, weights, des_r, des_t): + + """ Find parent rotations """ + prs = fr[:, self.animation.parents] + prs[:, 0] = Quaternions.id((1)) + + """ Get partial rotations """ + qys = Quaternions.from_angle_axis(x[:, 1:prs.shape[1] * 3:3], np.array([[[0, 1, 0]]])) + qzs = Quaternions.from_angle_axis(x[:, 2:prs.shape[1] * 3:3], np.array([[[0, 0, 1]]])) + + """ Find axis of rotations """ + es = np.empty((len(x), fr.shape[1] * 3, 3)) + es[:, 0::3] = ((prs * qzs) * qys) * np.array([[[1, 0, 0]]]) + es[:, 1::3] = ((prs * qzs) * np.array([[[0, 1, 0]]])) + es[:, 2::3] = ((prs * np.array([[[0, 0, 1]]]))) + + """ Construct Jacobian """ + j = fp.repeat(3, axis=1) + j = des_r[np.newaxis, :, :, :, np.newaxis] * ( + goal[:, np.newaxis, :, np.newaxis] - j[:, :, np.newaxis, np.newaxis]) + j = np.sum(j * weights[np.newaxis, np.newaxis, :, :, np.newaxis], 3) + j = self.cross(es[:, :, np.newaxis, :], j) + j = np.swapaxes(j.reshape((len(x), fr.shape[1] * 3, goal.shape[1] * 3)), 1, 2) + + if self.translate: + es = np.empty((len(x), fr.shape[1] * 3, 3)) + es[:, 0::3] = prs * np.array([[[1, 0, 0]]]) + es[:, 1::3] = prs * np.array([[[0, 1, 0]]]) + es[:, 2::3] = prs * np.array([[[0, 0, 1]]]) + + jt = des_t[np.newaxis, :, :, :, np.newaxis] * es[:, :, np.newaxis, np.newaxis, :].repeat(goal.shape[1], + axis=2) + jt = np.sum(jt * weights[np.newaxis, np.newaxis, :, :, np.newaxis], 3) + jt = np.swapaxes(jt.reshape((len(x), fr.shape[1] * 3, goal.shape[1] * 3)), 1, 2) + + j = np.concatenate([j, jt], axis=-1) + + return j + + # @profile(immediate=True) + def __call__(self, descendants=None, maxjoints=4, gamma=1.0, transpose=False): + + """ Calculate Masses """ + if self.weights is None: + self.weights = np.ones(self.animation.shape[1]) + + if self.weights_translate is None: + self.weights_translate = np.ones(self.animation.shape[1]) + + nf = len(self.animation) + nj = self.animation.shape[1] + nv = self.goal.shape[1] + + weightids = np.argsort(-self.vweights, axis=1)[:, :maxjoints] + weightvls = np.array(list(map(lambda w, i: w[i], self.vweights, weightids))) + weightvls = weightvls / weightvls.sum(axis=1)[..., np.newaxis] + + if descendants is None: + self.descendants = AnimationStructure.descendants_mask(self.animation.parents) + else: + self.descendants = descendants + + des_r = np.eye(nj) + self.descendants + des_r = des_r[:, weightids].repeat(3, axis=0) + + des_t = np.eye(nj) + self.descendants + des_t = des_t[:, weightids].repeat(3, axis=0) + + if not self.silent: + curr = Animation.skin(self.animation, self.rest, self.vweights, self.mesh, maxjoints=maxjoints) + error = np.mean(np.sqrt(np.sum((curr - self.goal) ** 2.0, axis=-1))) + print('[ICP] Start | Error: %f' % error) + + for i in range(self.iterations): + + """ Get Global Rotations & Positions """ + gt = Animation.transforms_global(self.animation) + gp = gt[:, :, :, 3] + gp = gp[:, :, :3] / gp[:, :, 3, np.newaxis] + gr = Quaternions.from_transforms(gt) + + x = self.animation.rotations.euler().reshape(nf, -1) + w = self.weights.repeat(3) + + if self.translate: + x = np.hstack([x, self.animation.positions.reshape(nf, -1)]) + w = np.hstack([w, self.weights_translate.repeat(3)]) + + """ Get Current State """ + curr = Animation.skin(self.animation, self.rest, self.vweights, self.mesh, maxjoints=maxjoints) + + """ Find Cloest Points """ + if self.find_closest: + mapping = np.argmin( + (curr[:, :, np.newaxis] - + self.goal[:, np.newaxis, :]) ** 2.0, axis=2) + e = gamma * (np.array(list(map(lambda g, m: g[m], self.goal, mapping))) - curr).reshape(nf, -1) + else: + e = gamma * (self.goal - curr).reshape(nf, -1) + + """ Generate Jacobian """ + if self.recalculate or i == 0: + j = self.jacobian(x, gp, gr, self.goal, weightvls, des_r, des_t) + + """ Update Variables """ + l = self.damping * (1.0 / (w + 1e-10)) + d = (l * l) * np.eye(x.shape[1]) + + if transpose: + x += np.array(list(map(lambda jf, ef: jf.T.dot(ef), j, e))) + else: + x += np.array(list(map(lambda jf, ef: + linalg.lu_solve(linalg.lu_factor(jf.T.dot(jf) + d), jf.T.dot(ef)), j, e))) + + """ Set Back Rotations / Translations """ + self.animation.rotations = Quaternions.from_euler( + x[:, :nj * 3].reshape((nf, nj, 3)), order='xyz', world=True) + + if self.translate: + self.animation.positions = x[:, nj * 3:].reshape((nf, nj, 3)) + + if not self.silent: + curr = Animation.skin(self.animation, self.rest, self.vweights, self.mesh) + error = np.mean(np.sqrt(np.sum((curr - self.goal) ** 2.0, axis=-1))) + print('[ICP] Iteration %i | Error: %f' % (i + 1, error)) + +import torch +from torch import nn +class InverseKinematics: + def __init__(self, rotations: torch.Tensor, positions: torch.Tensor, offset, parents, constrains): + self.rotations = rotations.cuda() + self.rotations.requires_grad_(True) + self.position = positions.cuda() + self.position.requires_grad_(True) + + self.parents = parents + self.offset = offset.cuda() + self.constrains = constrains.cuda() + # hyper-param to tune + self.optimizer = torch.optim.AdamW([self.position, self.rotations], lr=5e-2, betas=(0.9, 0.999)) + self.crit = nn.MSELoss() + self.weights = torch.ones([1,22,1]).cuda() + self.weights[:, [4, 8]] = 0.8 + self.weights[:, [1, 5]] = 2. + + def step(self): + self.optimizer.zero_grad() + glb = self.forward(self.rotations, self.position, self.offset, order='', quater=True, world=True) + # weighted joint position mse + loss = self.crit(glb*self.weights, self.constrains*self.weights) + # regularization term + loss += 0.5 * self.crit(self.rotations[1:, [3, 7, 12, 16, 20]], self.rotations[:-1, [3, 7, 12, 16, 20]]) + 0.1 * self.crit(self.rotations[1:], self.rotations[:-1]) + loss.backward() + self.optimizer.step() + self.glb = glb + return loss.item() + + def tloss(self, time): + return self.crit(self.glb[time, :], self.constrains[time, :]) + + def all_loss(self): + res = [self.tloss(t).detach().numpy() for t in range(self.constrains.shape[0])] + return np.array(res) + + ''' + rotation should have shape batch_size * Joint_num * (3/4) * Time + position should have shape batch_size * 3 * Time + offset should have shape batch_size * Joint_num * 3 + output have shape batch_size * Time * Joint_num * 3 + ''' + + def forward(self, rotation: torch.Tensor, position: torch.Tensor, offset: torch.Tensor, order='xyz', quater=False, + world=True): + ''' + if not quater and rotation.shape[-2] != 3: raise Exception('Unexpected shape of rotation') + if quater and rotation.shape[-2] != 4: raise Exception('Unexpected shape of rotation') + rotation = rotation.permute(0, 3, 1, 2) + position = position.permute(0, 2, 1) + ''' + result = torch.empty(rotation.shape[:-1] + (3,), device=position.device) + + norm = torch.norm(rotation, dim=-1, keepdim=True) + rotation = rotation / norm + + # if quater: + transform = self.transform_from_quaternion(rotation) + # else: + # transform = self.transform_from_euler(rotation, order) + + offset = offset.reshape((-1, 1, offset.shape[-2], offset.shape[-1], 1)) + + result[..., 0, :] = position + for i, pi in enumerate(self.parents): + if pi == -1: + assert i == 0 + continue + + result[..., i, :] = torch.matmul(transform[..., pi, :, :], offset[..., i, :, :]).squeeze() + transform[..., i, :, :] = torch.matmul(transform[..., pi, :, :].clone(), transform[..., i, :, :].clone()) + if world: result[..., i, :] += result[..., pi, :] + return result + + @staticmethod + def transform_from_axis(euler, axis): + transform = torch.empty(euler.shape[0:3] + (3, 3), device=euler.device) + cos = torch.cos(euler) + sin = torch.sin(euler) + cord = ord(axis) - ord('x') + + transform[..., cord, :] = transform[..., :, cord] = 0 + transform[..., cord, cord] = 1 + + if axis == 'x': + transform[..., 1, 1] = transform[..., 2, 2] = cos + transform[..., 1, 2] = -sin + transform[..., 2, 1] = sin + if axis == 'y': + transform[..., 0, 0] = transform[..., 2, 2] = cos + transform[..., 0, 2] = sin + transform[..., 2, 0] = -sin + if axis == 'z': + transform[..., 0, 0] = transform[..., 1, 1] = cos + transform[..., 0, 1] = -sin + transform[..., 1, 0] = sin + + return transform + + @staticmethod + def transform_from_quaternion(quater: torch.Tensor): + qw = quater[..., 0] + qx = quater[..., 1] + qy = quater[..., 2] + qz = quater[..., 3] + + x2 = qx + qx + y2 = qy + qy + z2 = qz + qz + xx = qx * x2 + yy = qy * y2 + wx = qw * x2 + xy = qx * y2 + yz = qy * z2 + wy = qw * y2 + xz = qx * z2 + zz = qz * z2 + wz = qw * z2 + + m = torch.empty(quater.shape[:-1] + (3, 3), device=quater.device) + m[..., 0, 0] = 1.0 - (yy + zz) + m[..., 0, 1] = xy - wz + m[..., 0, 2] = xz + wy + m[..., 1, 0] = xy + wz + m[..., 1, 1] = 1.0 - (xx + zz) + m[..., 1, 2] = yz - wx + m[..., 2, 0] = xz - wy + m[..., 2, 1] = yz + wx + m[..., 2, 2] = 1.0 - (xx + yy) + + return m \ No newline at end of file diff --git a/src/momask-preenc/visualization/Quaternions.py b/src/momask-preenc/visualization/Quaternions.py new file mode 100644 index 0000000000000000000000000000000000000000..7226326bc496983560ab06a89670609703e2149f --- /dev/null +++ b/src/momask-preenc/visualization/Quaternions.py @@ -0,0 +1,497 @@ +import numpy as np + + +class Quaternions: + """ + Quaternions is a wrapper around a numpy ndarray + that allows it to act as if it were an narray of + a quater data type. + + Therefore addition, subtraction, multiplication, + division, negation, absolute, are all defined + in terms of quater operations such as quater + multiplication. + + This allows for much neater code and many routines + which conceptually do the same thing to be written + in the same way for point data and for rotation data. + + The Quaternions class has been desgined such that it + should support broadcasting and slicing in all of the + usual ways. + """ + + def __init__(self, qs): + if isinstance(qs, np.ndarray): + if len(qs.shape) == 1: qs = np.array([qs]) + self.qs = qs + return + + if isinstance(qs, Quaternions): + self.qs = qs + return + + raise TypeError('Quaternions must be constructed from iterable, numpy array, or Quaternions, not %s' % type(qs)) + + def __str__(self): + return "Quaternions(" + str(self.qs) + ")" + + def __repr__(self): + return "Quaternions(" + repr(self.qs) + ")" + + """ Helper Methods for Broadcasting and Data extraction """ + + @classmethod + def _broadcast(cls, sqs, oqs, scalar=False): + if isinstance(oqs, float): return sqs, oqs * np.ones(sqs.shape[:-1]) + + ss = np.array(sqs.shape) if not scalar else np.array(sqs.shape[:-1]) + os = np.array(oqs.shape) + + if len(ss) != len(os): + raise TypeError('Quaternions cannot broadcast together shapes %s and %s' % (sqs.shape, oqs.shape)) + + if np.all(ss == os): return sqs, oqs + + if not np.all((ss == os) | (os == np.ones(len(os))) | (ss == np.ones(len(ss)))): + raise TypeError('Quaternions cannot broadcast together shapes %s and %s' % (sqs.shape, oqs.shape)) + + sqsn, oqsn = sqs.copy(), oqs.copy() + + for a in np.where(ss == 1)[0]: sqsn = sqsn.repeat(os[a], axis=a) + for a in np.where(os == 1)[0]: oqsn = oqsn.repeat(ss[a], axis=a) + + return sqsn, oqsn + + """ Adding Quaterions is just Defined as Multiplication """ + + def __add__(self, other): + return self * other + + def __sub__(self, other): + return self / other + + """ Quaterion Multiplication """ + + def __mul__(self, other): + """ + Quaternion multiplication has three main methods. + + When multiplying a Quaternions array by Quaternions + normal quater multiplication is performed. + + When multiplying a Quaternions array by a vector + array of the same shape, where the last axis is 3, + it is assumed to be a Quaternion by 3D-Vector + multiplication and the 3D-Vectors are rotated + in space by the Quaternions. + + When multipplying a Quaternions array by a scalar + or vector of different shape it is assumed to be + a Quaternions by Scalars multiplication and the + Quaternions are scaled using Slerp and the identity + quaternions. + """ + + """ If Quaternions type do Quaternions * Quaternions """ + if isinstance(other, Quaternions): + sqs, oqs = Quaternions._broadcast(self.qs, other.qs) + + q0 = sqs[..., 0]; + q1 = sqs[..., 1]; + q2 = sqs[..., 2]; + q3 = sqs[..., 3]; + r0 = oqs[..., 0]; + r1 = oqs[..., 1]; + r2 = oqs[..., 2]; + r3 = oqs[..., 3]; + + qs = np.empty(sqs.shape) + qs[..., 0] = r0 * q0 - r1 * q1 - r2 * q2 - r3 * q3 + qs[..., 1] = r0 * q1 + r1 * q0 - r2 * q3 + r3 * q2 + qs[..., 2] = r0 * q2 + r1 * q3 + r2 * q0 - r3 * q1 + qs[..., 3] = r0 * q3 - r1 * q2 + r2 * q1 + r3 * q0 + + return Quaternions(qs) + + """ If array type do Quaternions * Vectors """ + if isinstance(other, np.ndarray) and other.shape[-1] == 3: + vs = Quaternions(np.concatenate([np.zeros(other.shape[:-1] + (1,)), other], axis=-1)) + + return (self * (vs * -self)).imaginaries + + """ If float do Quaternions * Scalars """ + if isinstance(other, np.ndarray) or isinstance(other, float): + return Quaternions.slerp(Quaternions.id_like(self), self, other) + + raise TypeError('Cannot multiply/add Quaternions with type %s' % str(type(other))) + + def __div__(self, other): + """ + When a Quaternion type is supplied, division is defined + as multiplication by the inverse of that Quaternion. + + When a scalar or vector is supplied it is defined + as multiplicaion of one over the supplied value. + Essentially a scaling. + """ + + if isinstance(other, Quaternions): return self * (-other) + if isinstance(other, np.ndarray): return self * (1.0 / other) + if isinstance(other, float): return self * (1.0 / other) + raise TypeError('Cannot divide/subtract Quaternions with type %s' + str(type(other))) + + def __eq__(self, other): + return self.qs == other.qs + + def __ne__(self, other): + return self.qs != other.qs + + def __neg__(self): + """ Invert Quaternions """ + return Quaternions(self.qs * np.array([[1, -1, -1, -1]])) + + def __abs__(self): + """ Unify Quaternions To Single Pole """ + qabs = self.normalized().copy() + top = np.sum((qabs.qs) * np.array([1, 0, 0, 0]), axis=-1) + bot = np.sum((-qabs.qs) * np.array([1, 0, 0, 0]), axis=-1) + qabs.qs[top < bot] = -qabs.qs[top < bot] + return qabs + + def __iter__(self): + return iter(self.qs) + + def __len__(self): + return len(self.qs) + + def __getitem__(self, k): + return Quaternions(self.qs[k]) + + def __setitem__(self, k, v): + self.qs[k] = v.qs + + @property + def lengths(self): + return np.sum(self.qs ** 2.0, axis=-1) ** 0.5 + + @property + def reals(self): + return self.qs[..., 0] + + @property + def imaginaries(self): + return self.qs[..., 1:4] + + @property + def shape(self): + return self.qs.shape[:-1] + + def repeat(self, n, **kwargs): + return Quaternions(self.qs.repeat(n, **kwargs)) + + def normalized(self): + return Quaternions(self.qs / self.lengths[..., np.newaxis]) + + def log(self): + norm = abs(self.normalized()) + imgs = norm.imaginaries + lens = np.sqrt(np.sum(imgs ** 2, axis=-1)) + lens = np.arctan2(lens, norm.reals) / (lens + 1e-10) + return imgs * lens[..., np.newaxis] + + def constrained(self, axis): + + rl = self.reals + im = np.sum(axis * self.imaginaries, axis=-1) + + t1 = -2 * np.arctan2(rl, im) + np.pi + t2 = -2 * np.arctan2(rl, im) - np.pi + + top = Quaternions.exp(axis[np.newaxis] * (t1[:, np.newaxis] / 2.0)) + bot = Quaternions.exp(axis[np.newaxis] * (t2[:, np.newaxis] / 2.0)) + img = self.dot(top) > self.dot(bot) + + ret = top.copy() + ret[img] = top[img] + ret[~img] = bot[~img] + return ret + + def constrained_x(self): + return self.constrained(np.array([1, 0, 0])) + + def constrained_y(self): + return self.constrained(np.array([0, 1, 0])) + + def constrained_z(self): + return self.constrained(np.array([0, 0, 1])) + + def dot(self, q): + return np.sum(self.qs * q.qs, axis=-1) + + def copy(self): + return Quaternions(np.copy(self.qs)) + + def reshape(self, s): + self.qs.reshape(s) + return self + + def interpolate(self, ws): + return Quaternions.exp(np.average(abs(self).log, axis=0, weights=ws)) + + def euler(self, order='xyz'): # fix the wrong convert, this should convert to world euler by default. + + q = self.normalized().qs + q0 = q[..., 0] + q1 = q[..., 1] + q2 = q[..., 2] + q3 = q[..., 3] + es = np.zeros(self.shape + (3,)) + + if order == 'xyz': + es[..., 0] = np.arctan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + es[..., 1] = np.arcsin((2 * (q0 * q2 - q3 * q1)).clip(-1, 1)) + es[..., 2] = np.arctan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + elif order == 'yzx': + es[..., 0] = np.arctan2(2 * (q1 * q0 - q2 * q3), -q1 * q1 + q2 * q2 - q3 * q3 + q0 * q0) + es[..., 1] = np.arctan2(2 * (q2 * q0 - q1 * q3), q1 * q1 - q2 * q2 - q3 * q3 + q0 * q0) + es[..., 2] = np.arcsin((2 * (q1 * q2 + q3 * q0)).clip(-1, 1)) + else: + raise NotImplementedError('Cannot convert from ordering %s' % order) + + """ + + # These conversion don't appear to work correctly for Maya. + # http://bediyap.com/programming/convert-quaternion-to-euler-rotations/ + + if order == 'xyz': + es[fa + (0,)] = np.arctan2(2 * (q0 * q3 - q1 * q2), q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3) + es[fa + (1,)] = np.arcsin((2 * (q1 * q3 + q0 * q2)).clip(-1,1)) + es[fa + (2,)] = np.arctan2(2 * (q0 * q1 - q2 * q3), q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3) + elif order == 'yzx': + es[fa + (0,)] = np.arctan2(2 * (q0 * q1 - q2 * q3), q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3) + es[fa + (1,)] = np.arcsin((2 * (q1 * q2 + q0 * q3)).clip(-1,1)) + es[fa + (2,)] = np.arctan2(2 * (q0 * q2 - q1 * q3), q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3) + elif order == 'zxy': + es[fa + (0,)] = np.arctan2(2 * (q0 * q2 - q1 * q3), q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3) + es[fa + (1,)] = np.arcsin((2 * (q0 * q1 + q2 * q3)).clip(-1,1)) + es[fa + (2,)] = np.arctan2(2 * (q0 * q3 - q1 * q2), q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3) + elif order == 'xzy': + es[fa + (0,)] = np.arctan2(2 * (q0 * q2 + q1 * q3), q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3) + es[fa + (1,)] = np.arcsin((2 * (q0 * q3 - q1 * q2)).clip(-1,1)) + es[fa + (2,)] = np.arctan2(2 * (q0 * q1 + q2 * q3), q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3) + elif order == 'yxz': + es[fa + (0,)] = np.arctan2(2 * (q1 * q2 + q0 * q3), q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3) + es[fa + (1,)] = np.arcsin((2 * (q0 * q1 - q2 * q3)).clip(-1,1)) + es[fa + (2,)] = np.arctan2(2 * (q1 * q3 + q0 * q2), q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3) + elif order == 'zyx': + es[fa + (0,)] = np.arctan2(2 * (q0 * q1 + q2 * q3), q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3) + es[fa + (1,)] = np.arcsin((2 * (q0 * q2 - q1 * q3)).clip(-1,1)) + es[fa + (2,)] = np.arctan2(2 * (q0 * q3 + q1 * q2), q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3) + else: + raise KeyError('Unknown ordering %s' % order) + + """ + + # https://github.com/ehsan/ogre/blob/master/OgreMain/src/OgreMatrix3.cpp + # Use this class and convert from matrix + + return es + + def average(self): + + if len(self.shape) == 1: + + import numpy.core.umath_tests as ut + system = ut.matrix_multiply(self.qs[:, :, np.newaxis], self.qs[:, np.newaxis, :]).sum(axis=0) + w, v = np.linalg.eigh(system) + qiT_dot_qref = (self.qs[:, :, np.newaxis] * v[np.newaxis, :, :]).sum(axis=1) + return Quaternions(v[:, np.argmin((1. - qiT_dot_qref ** 2).sum(axis=0))]) + + else: + + raise NotImplementedError('Cannot average multi-dimensionsal Quaternions') + + def angle_axis(self): + + norm = self.normalized() + s = np.sqrt(1 - (norm.reals ** 2.0)) + s[s == 0] = 0.001 + + angles = 2.0 * np.arccos(norm.reals) + axis = norm.imaginaries / s[..., np.newaxis] + + return angles, axis + + def transforms(self): + + qw = self.qs[..., 0] + qx = self.qs[..., 1] + qy = self.qs[..., 2] + qz = self.qs[..., 3] + + x2 = qx + qx; + y2 = qy + qy; + z2 = qz + qz; + xx = qx * x2; + yy = qy * y2; + wx = qw * x2; + xy = qx * y2; + yz = qy * z2; + wy = qw * y2; + xz = qx * z2; + zz = qz * z2; + wz = qw * z2; + + m = np.empty(self.shape + (3, 3)) + m[..., 0, 0] = 1.0 - (yy + zz) + m[..., 0, 1] = xy - wz + m[..., 0, 2] = xz + wy + m[..., 1, 0] = xy + wz + m[..., 1, 1] = 1.0 - (xx + zz) + m[..., 1, 2] = yz - wx + m[..., 2, 0] = xz - wy + m[..., 2, 1] = yz + wx + m[..., 2, 2] = 1.0 - (xx + yy) + + return m + + def ravel(self): + return self.qs.ravel() + + @classmethod + def id(cls, n): + + if isinstance(n, tuple): + qs = np.zeros(n + (4,)) + qs[..., 0] = 1.0 + return Quaternions(qs) + + if isinstance(n, int): + qs = np.zeros((n, 4)) + qs[:, 0] = 1.0 + return Quaternions(qs) + + raise TypeError('Cannot Construct Quaternion from %s type' % str(type(n))) + + @classmethod + def id_like(cls, a): + qs = np.zeros(a.shape + (4,)) + qs[..., 0] = 1.0 + return Quaternions(qs) + + @classmethod + def exp(cls, ws): + + ts = np.sum(ws ** 2.0, axis=-1) ** 0.5 + ts[ts == 0] = 0.001 + ls = np.sin(ts) / ts + + qs = np.empty(ws.shape[:-1] + (4,)) + qs[..., 0] = np.cos(ts) + qs[..., 1] = ws[..., 0] * ls + qs[..., 2] = ws[..., 1] * ls + qs[..., 3] = ws[..., 2] * ls + + return Quaternions(qs).normalized() + + @classmethod + def slerp(cls, q0s, q1s, a): + + fst, snd = cls._broadcast(q0s.qs, q1s.qs) + fst, a = cls._broadcast(fst, a, scalar=True) + snd, a = cls._broadcast(snd, a, scalar=True) + + len = np.sum(fst * snd, axis=-1) + + neg = len < 0.0 + len[neg] = -len[neg] + snd[neg] = -snd[neg] + + amount0 = np.zeros(a.shape) + amount1 = np.zeros(a.shape) + + linear = (1.0 - len) < 0.01 + omegas = np.arccos(len[~linear]) + sinoms = np.sin(omegas) + + amount0[linear] = 1.0 - a[linear] + amount1[linear] = a[linear] + amount0[~linear] = np.sin((1.0 - a[~linear]) * omegas) / sinoms + amount1[~linear] = np.sin(a[~linear] * omegas) / sinoms + + return Quaternions( + amount0[..., np.newaxis] * fst + + amount1[..., np.newaxis] * snd) + + @classmethod + def between(cls, v0s, v1s): + a = np.cross(v0s, v1s) + w = np.sqrt((v0s ** 2).sum(axis=-1) * (v1s ** 2).sum(axis=-1)) + (v0s * v1s).sum(axis=-1) + return Quaternions(np.concatenate([w[..., np.newaxis], a], axis=-1)).normalized() + + @classmethod + def from_angle_axis(cls, angles, axis): + axis = axis / (np.sqrt(np.sum(axis ** 2, axis=-1)) + 1e-10)[..., np.newaxis] + sines = np.sin(angles / 2.0)[..., np.newaxis] + cosines = np.cos(angles / 2.0)[..., np.newaxis] + return Quaternions(np.concatenate([cosines, axis * sines], axis=-1)) + + @classmethod + def from_euler(cls, es, order='xyz', world=False): + + axis = { + 'x': np.array([1, 0, 0]), + 'y': np.array([0, 1, 0]), + 'z': np.array([0, 0, 1]), + } + + q0s = Quaternions.from_angle_axis(es[..., 0], axis[order[0]]) + q1s = Quaternions.from_angle_axis(es[..., 1], axis[order[1]]) + q2s = Quaternions.from_angle_axis(es[..., 2], axis[order[2]]) + + return (q2s * (q1s * q0s)) if world else (q0s * (q1s * q2s)) + + @classmethod + def from_transforms(cls, ts): + + d0, d1, d2 = ts[..., 0, 0], ts[..., 1, 1], ts[..., 2, 2] + + q0 = (d0 + d1 + d2 + 1.0) / 4.0 + q1 = (d0 - d1 - d2 + 1.0) / 4.0 + q2 = (-d0 + d1 - d2 + 1.0) / 4.0 + q3 = (-d0 - d1 + d2 + 1.0) / 4.0 + + q0 = np.sqrt(q0.clip(0, None)) + q1 = np.sqrt(q1.clip(0, None)) + q2 = np.sqrt(q2.clip(0, None)) + q3 = np.sqrt(q3.clip(0, None)) + + c0 = (q0 >= q1) & (q0 >= q2) & (q0 >= q3) + c1 = (q1 >= q0) & (q1 >= q2) & (q1 >= q3) + c2 = (q2 >= q0) & (q2 >= q1) & (q2 >= q3) + c3 = (q3 >= q0) & (q3 >= q1) & (q3 >= q2) + + q1[c0] *= np.sign(ts[c0, 2, 1] - ts[c0, 1, 2]) + q2[c0] *= np.sign(ts[c0, 0, 2] - ts[c0, 2, 0]) + q3[c0] *= np.sign(ts[c0, 1, 0] - ts[c0, 0, 1]) + + q0[c1] *= np.sign(ts[c1, 2, 1] - ts[c1, 1, 2]) + q2[c1] *= np.sign(ts[c1, 1, 0] + ts[c1, 0, 1]) + q3[c1] *= np.sign(ts[c1, 0, 2] + ts[c1, 2, 0]) + + q0[c2] *= np.sign(ts[c2, 0, 2] - ts[c2, 2, 0]) + q1[c2] *= np.sign(ts[c2, 1, 0] + ts[c2, 0, 1]) + q3[c2] *= np.sign(ts[c2, 2, 1] + ts[c2, 1, 2]) + + q0[c3] *= np.sign(ts[c3, 1, 0] - ts[c3, 0, 1]) + q1[c3] *= np.sign(ts[c3, 2, 0] + ts[c3, 0, 2]) + q2[c3] *= np.sign(ts[c3, 2, 1] + ts[c3, 1, 2]) + + qs = np.empty(ts.shape[:-2] + (4,)) + qs[..., 0] = q0 + qs[..., 1] = q1 + qs[..., 2] = q2 + qs[..., 3] = q3 + + return cls(qs) \ No newline at end of file diff --git a/src/momask-preenc/visualization/__init__.py b/src/momask-preenc/visualization/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/momask-preenc/visualization/data/gBR_sBM_cAll_d04_mBR0_ch01.pkl b/src/momask-preenc/visualization/data/gBR_sBM_cAll_d04_mBR0_ch01.pkl new file mode 100644 index 0000000000000000000000000000000000000000..2bc25371145f6e89a929fe4aeedd224acfc48bb9 --- /dev/null +++ b/src/momask-preenc/visualization/data/gBR_sBM_cAll_d04_mBR0_ch01.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51768ab001906029b273de1a7c15e8c6574f285663a28f4d8e0ce6dd44926bf3 +size 216300 diff --git a/src/momask-preenc/visualization/data/smpl/smpl/smpl.txt b/src/momask-preenc/visualization/data/smpl/smpl/smpl.txt new file mode 100644 index 0000000000000000000000000000000000000000..5f418a9b417a68ffb8ad6935dab39e2539edad34 --- /dev/null +++ b/src/momask-preenc/visualization/data/smpl/smpl/smpl.txt @@ -0,0 +1,8 @@ +Once you have downloaded the SMPL model, place it here like below. + +data +|_smpl + |_smpl + |_SMPL_FEMALE.pkl + |_SMPL_MALE.pkl + |_SMPL_NEUTRAL.pkl diff --git a/src/momask-preenc/visualization/data/template.bvh b/src/momask-preenc/visualization/data/template.bvh new file mode 100644 index 0000000000000000000000000000000000000000..20c0c65aee60c2ed1ef7d98815a6b5dcb4e0d368 --- /dev/null +++ b/src/momask-preenc/visualization/data/template.bvh @@ -0,0 +1,854 @@ +HIERARCHY +ROOT Hips +{ + OFFSET -0.001795 -0.223333 0.028219 + CHANNELS 6 Xposition Yposition Zposition Zrotation Yrotation Xrotation + JOINT LeftUpLeg + { + OFFSET 0.069520 -0.091406 -0.006815 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT LeftLeg + { + OFFSET 0.034277 -0.375199 -0.004496 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT LeftFoot + { + OFFSET -0.013596 -0.397961 -0.043693 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT LeftToe + { + OFFSET 0.026358 -0.055791 0.119288 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT RightUpLeg + { + OFFSET -0.067670 -0.090522 -0.004320 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT RightLeg + { + OFFSET -0.038290 -0.382569 -0.008850 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT RightFoot + { + OFFSET 0.015774 -0.398415 -0.042312 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT RightToe + { + OFFSET -0.025372 -0.048144 0.123348 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT Spine + { + OFFSET -0.002533 0.108963 -0.026696 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Spine1 + { + OFFSET 0.005487 0.135180 0.001092 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Spine2 + { + OFFSET 0.001457 0.052922 0.025425 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Neck + { + OFFSET -0.002778 0.213870 -0.042857 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT Head + { + OFFSET 0.005152 0.064970 0.051349 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + JOINT LeftShoulder + { + OFFSET 0.078845 0.121749 -0.034090 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT LeftArm + { + OFFSET 0.090977 0.030469 -0.008868 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT LeftForeArm + { + OFFSET 0.259612 -0.012772 -0.027456 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT LeftHand + { + OFFSET 0.249234 0.008986 -0.001171 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + JOINT RightShoulder + { + OFFSET -0.081759 0.118833 -0.038615 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT RightArm + { + OFFSET -0.096012 0.032551 -0.009143 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT RightForeArm + { + OFFSET -0.253742 -0.013329 -0.021401 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT RightHand + { + OFFSET -0.255298 0.007772 -0.005559 + CHANNELS 3 Zrotation Yrotation Xrotation + End Site + { + OFFSET 0.000000 0.000000 0.000000 + } + } + } + } + } + } + } + } +} +MOTION +Frames: 720 +Frame Time: 0.016667 +-0.159536 1.582612 0.030130 -6.548568 2.583855 -18.484306 2.567626 -0.642801 -12.453255 -17.111603 3.336555 16.983561 -0.646515 0.385496 -0.056215 0.325094 -0.032605 0.189901 11.448563 8.871870 6.436031 21.109348 -6.065577 45.020580 -0.174829 0.026075 0.116341 0.072238 0.260225 0.053027 4.465475 2.398752 11.553416 -5.916316 5.109896 9.693657 -10.230002 5.977373 8.161955 -4.592945 0.456784 10.607079 11.999027 -6.871897 -9.583961 0.986580 11.602270 -6.802592 -10.811317 -2.869949 -1.570219 43.446667 -20.007170 -7.731044 0.092445 -0.321820 0.690197 0.794326 -2.761873 -4.701620 6.150688 4.680287 -2.319729 -7.082062 6.923985 -0.347780 -0.400098 0.244321 -0.323698 +-0.161087 1.583428 0.030032 -6.436900 2.553235 -18.466497 2.628736 -0.640951 -12.167108 -17.277838 3.260565 16.452961 -0.623134 0.361270 -0.052679 0.329175 -0.021943 0.188075 11.625759 8.663714 6.621767 20.507597 -5.825788 44.947929 -0.176207 0.037369 0.118593 0.068431 0.250536 0.048086 4.242087 2.434052 12.115721 -6.077591 5.185571 9.527125 -10.338363 5.937043 7.690588 -4.605536 0.197104 10.837864 12.726488 -7.272390 -9.544734 1.642845 11.950652 -6.932811 -11.680576 -4.277152 -1.549070 43.571354 -20.612377 -8.049021 0.109730 -0.311815 0.682838 0.926398 -3.272447 -4.630198 7.445030 3.782560 -2.564028 -8.259988 8.206085 -0.503641 -0.385034 0.241649 -0.309882 +-0.162891 1.584601 0.028981 -6.337712 2.417876 -18.367199 2.387673 -0.769141 -11.783619 -16.808804 2.974704 15.581153 -0.597874 0.341984 -0.045163 0.336606 -0.010386 0.182390 11.895297 8.444583 6.677911 19.618019 -5.451431 44.845573 -0.181456 0.041560 0.120532 0.063814 0.249287 0.050308 4.130446 2.249803 12.813165 -6.341510 5.110845 9.366212 -10.591797 5.717437 7.166194 -4.550250 0.315001 10.694882 13.649382 -7.465281 -9.502808 2.140804 12.233712 -6.924524 -12.244494 -5.059723 -1.525820 43.379272 -21.237177 -8.295979 0.124976 -0.288952 0.674843 1.297063 -3.571788 -4.703934 8.010023 3.486611 -2.652901 -8.476348 8.605403 -0.545584 -0.372898 0.231243 -0.293915 +-0.165646 1.587320 0.027265 -6.002626 2.455181 -17.973370 1.834383 -0.983811 -11.526038 -15.971136 2.528754 14.111326 -0.602751 0.340437 -0.036803 0.336285 -0.008456 0.180600 11.654990 8.101241 6.587115 18.879175 -5.168495 44.240204 -0.184101 0.051312 0.135291 0.064663 0.260571 0.042015 3.051892 2.191581 13.253531 -6.533848 4.771447 9.180534 -10.291628 5.312028 6.718891 -4.273476 0.849475 10.492126 14.207470 -6.976998 -9.746916 2.845061 11.944734 -6.652175 -13.332726 -5.224829 -1.703026 43.879097 -20.990297 -8.364495 0.124505 -0.311719 0.688117 1.603163 -3.485494 -4.864434 8.750508 3.673903 -2.785898 -8.287816 8.146102 -0.511701 -0.381603 0.246283 -0.306233 +-0.167123 1.590612 0.025445 -6.138146 2.120839 -17.193476 1.495634 -1.153967 -11.531704 -14.562866 2.010199 12.596170 -0.564200 0.317475 -0.030186 0.355434 0.019825 0.183202 11.821760 7.832906 6.029297 17.854931 -4.734118 43.749580 -0.192897 0.046537 0.137743 0.063975 0.252156 0.061209 2.591154 2.105130 12.956139 -6.259222 4.452549 8.945457 -9.745981 4.985147 6.536089 -4.571469 1.506478 10.368932 14.273899 -6.712031 -9.471840 3.448703 11.540046 -6.184101 -15.225222 -5.342481 -1.930704 43.757050 -21.041569 -8.442200 0.134142 -0.275313 0.666342 1.627102 -3.484644 -5.032462 9.050708 4.006345 -2.802380 -8.178758 7.832633 -0.502845 -0.366619 0.222956 -0.270694 +-0.167389 1.593951 0.024098 -6.371427 1.715281 -16.212042 1.344112 -1.182214 -11.552453 -13.644547 1.596031 10.760131 -0.553557 0.301520 -0.029561 0.378947 0.055993 0.190589 11.912018 7.518050 5.477684 17.113008 -4.432878 43.021950 -0.200891 0.036620 0.141589 0.080178 0.245286 0.068790 2.655632 1.979555 12.242448 -6.059598 4.245433 8.709062 -9.529772 4.797668 6.568608 -4.468900 1.918368 10.300252 13.968842 -6.223287 -9.409180 3.466537 11.571606 -6.341009 -16.185760 -6.324979 -1.868305 43.140266 -21.341555 -8.512464 0.137919 -0.253948 0.652056 1.538267 -4.164848 -5.698076 9.921809 4.595060 -2.894332 -8.263926 7.278342 -0.511822 -0.369502 0.201231 -0.253245 +-0.167765 1.597480 0.021578 -6.428220 0.974121 -15.499296 0.936812 -1.201844 -11.313258 -12.177716 1.160200 8.771048 -0.541815 0.290366 -0.027408 0.385098 0.072718 0.195796 11.659352 7.261486 5.164932 16.596523 -4.206794 42.218369 -0.209730 0.039482 0.143880 0.082221 0.241970 0.075982 2.573596 1.944514 12.080869 -5.894100 4.092123 8.473337 -9.288622 4.620084 6.356588 -4.217100 2.342363 10.327727 13.891860 -5.639298 -9.494050 3.559528 11.211238 -6.158870 -16.793213 -6.551462 -1.894842 42.277451 -21.691759 -8.545035 0.136256 -0.254222 0.648655 1.508747 -4.268039 -5.966607 10.860933 4.783715 -3.082765 -8.835072 6.579336 -0.500989 -0.366672 0.202077 -0.242371 +-0.167738 1.599857 0.018408 -6.892040 -0.265036 -14.707372 1.328187 -0.964429 -11.259574 -11.177370 0.888995 6.940612 -0.568827 0.312146 -0.017006 0.384319 0.065389 0.219003 11.855839 7.198880 4.539358 16.104712 -3.967600 41.788979 -0.207010 0.039457 0.152789 0.090576 0.252497 0.064945 2.552962 2.114229 11.497072 -5.267292 4.029208 8.392828 -8.548087 4.680492 6.497765 -3.776544 2.099114 10.020322 12.838959 -5.162495 -9.682754 2.628662 11.070118 -6.654572 -17.138351 -7.377963 -1.785861 42.147392 -22.057623 -8.732569 0.117987 -0.294817 0.657766 1.382665 -4.553769 -6.347175 11.398166 5.195314 -3.140609 -8.480102 5.291673 -0.409761 -0.384078 0.213121 -0.268936 +-0.167738 1.602421 0.013853 -7.016428 -1.505329 -14.080323 1.266081 -0.892498 -11.216756 -9.875610 0.647913 5.458475 -0.596244 0.324718 -0.036018 0.380901 0.056116 0.246956 11.449362 7.158514 3.991309 15.985287 -3.963041 41.578953 -0.208718 0.038813 0.142284 0.092089 0.233258 0.069335 2.184994 2.446226 11.041884 -4.768640 4.030961 8.394737 -7.787795 4.783552 6.747200 -2.993406 1.860639 10.339728 11.743679 -4.358018 -9.782350 2.318040 10.238366 -6.903628 -17.624683 -8.450515 -1.814095 41.897972 -21.614748 -8.678004 0.099946 -0.314608 0.672528 0.738849 -4.534195 -6.355844 13.447996 5.103255 -3.444934 -9.040357 4.058734 -0.338981 -0.394386 0.223943 -0.279044 +-0.168093 1.604251 0.009338 -7.032182 -2.290404 -13.168996 0.963916 -0.950240 -11.661660 -8.774489 0.446624 4.215530 -0.591520 0.324756 -0.038110 0.405520 0.077245 0.283295 11.117752 6.917726 3.290086 15.538538 -3.851339 41.050232 -0.220738 0.015278 0.131980 0.102497 0.209776 0.094493 1.436988 2.649358 10.414960 -4.232882 3.861250 8.380134 -6.796241 4.627924 7.040365 -2.038058 1.271019 9.802289 10.280865 -3.758888 -9.653845 1.583092 9.638629 -7.427457 -17.063530 -9.797557 -1.697351 40.920959 -21.239902 -8.413903 0.092666 -0.282492 0.658618 0.736511 -4.848399 -6.580435 14.807322 5.148545 -3.579633 -9.770852 4.246374 -0.421145 -0.396556 0.186414 -0.259444 +-0.167897 1.605926 0.003677 -7.171580 -3.178783 -12.647384 0.967041 -0.922395 -11.908892 -7.793193 0.286271 3.119777 -0.577536 0.297129 -0.039632 0.452639 0.135876 0.330994 10.758710 6.621087 2.877956 15.536983 -3.949389 40.555130 -0.244916 0.003562 0.132633 0.125324 0.175011 0.115623 1.386160 2.668587 9.904191 -3.783525 3.787306 8.664775 -6.183028 4.540397 7.717748 -1.120352 1.032352 9.925644 8.940594 -2.772691 -9.750923 0.745054 8.419509 -7.993518 -16.237057 -11.405189 -1.721316 39.923317 -20.612867 -8.124463 0.100576 -0.256890 0.647661 0.813248 -4.988221 -6.677959 16.553080 5.027795 -3.795870 -11.128160 5.261421 -0.631432 -0.398122 0.151377 -0.228331 +-0.167417 1.607293 -0.003169 -7.558708 -4.539864 -12.112906 1.386975 -0.769382 -12.272948 -6.737583 0.165605 2.225166 -0.576300 0.265689 -0.056850 0.509184 0.216077 0.371496 11.096457 6.453204 2.496656 14.883972 -3.657289 40.090054 -0.270425 -0.000597 0.123822 0.166345 0.140374 0.129843 1.571359 2.641582 9.193312 -3.330585 3.747882 9.214892 -5.608980 4.529363 8.885200 -0.731368 1.462196 9.633437 8.470182 -1.802790 -10.920446 0.051031 7.202787 -8.527828 -15.546686 -12.708365 -1.861073 39.913399 -20.185949 -8.141868 0.112741 -0.227957 0.639310 2.036472 -4.811833 -7.356366 16.969507 5.912110 -3.819465 -11.867729 5.299818 -0.755479 -0.403036 0.124151 -0.197492 +-0.165537 1.607645 -0.010421 -7.925178 -5.998769 -11.598991 1.845736 -0.696072 -12.929962 -5.726211 0.092250 2.030888 -0.569470 0.269086 -0.064483 0.529535 0.244756 0.386711 11.167949 6.396535 1.932726 14.707852 -3.614619 39.896099 -0.281741 -0.023981 0.115069 0.179399 0.131774 0.161120 1.726923 2.839438 8.667390 -2.650086 3.818988 9.649557 -4.748201 4.631983 9.787368 -0.131880 1.360343 9.359412 7.636412 -1.246999 -11.012045 -1.206931 5.552031 -9.087198 -14.850809 -14.288842 -1.986183 40.316353 -20.254745 -8.431984 0.094950 -0.196905 0.620114 3.140409 -4.329516 -7.363596 16.994743 6.043010 -3.810810 -12.448504 6.366045 -0.970701 -0.409567 0.097504 -0.171583 +-0.163521 1.608887 -0.017860 -8.061885 -7.845345 -11.192497 2.414356 -0.553609 -13.384150 -4.966199 0.047758 1.862995 -0.564971 0.259399 -0.069010 0.559372 0.295034 0.402097 10.879979 6.500432 1.349209 14.677989 -3.608514 39.977642 -0.297743 -0.033641 0.114398 0.203599 0.126196 0.178321 2.030623 3.112092 8.190439 -2.180508 4.059436 10.116151 -4.206339 4.850182 10.759787 0.209076 1.335603 9.352204 7.140994 -0.794189 -11.571316 -2.253699 3.974662 -9.873274 -14.183203 -16.453354 -2.139265 40.883957 -20.160650 -8.718738 0.085774 -0.183659 0.604347 4.736768 -3.786916 -7.713704 17.506262 6.563680 -3.926220 -13.609794 7.310733 -1.246494 -0.419190 0.083070 -0.148184 +-0.160862 1.609526 -0.026833 -8.046998 -9.908904 -10.881722 3.178403 -0.502334 -14.330916 -4.741286 0.060714 2.819452 -0.555648 0.238704 -0.085571 0.582981 0.340153 0.427670 10.591507 6.828996 0.462272 14.245204 -3.450773 40.673283 -0.309660 -0.039848 0.105944 0.222041 0.096309 0.195670 2.300500 3.250377 8.068968 -1.867627 4.212889 10.539503 -3.831827 4.921741 11.586883 0.605016 1.225105 9.274499 5.971914 -0.082918 -12.144478 -3.228095 2.257882 -10.338022 -12.876457 -17.771721 -2.434823 41.225170 -19.998362 -8.844715 0.078872 -0.166713 0.585088 5.875173 -2.771969 -7.843284 18.682720 7.382069 -4.064976 -14.685915 9.481850 -1.764936 -0.417760 0.068578 -0.117976 +-0.158197 1.608048 -0.034829 -7.975517 -12.322988 -10.388718 4.410126 -0.496662 -16.022293 -5.157393 0.167969 5.244440 -0.579617 0.243325 -0.095244 0.608477 0.373700 0.450725 10.490107 7.335312 -0.667436 13.604923 -3.189647 41.799717 -0.313874 -0.043234 0.106417 0.251317 0.093546 0.192373 2.630287 3.390921 7.611517 -1.650590 4.381994 10.853812 -3.557493 5.043419 12.445291 0.630615 1.692654 9.087181 5.536309 0.514806 -12.791163 -3.279937 1.171122 -10.690102 -12.859802 -19.157557 -2.569380 41.454315 -19.932009 -9.059175 0.069723 -0.175345 0.584963 6.833838 -1.895792 -8.632036 19.644712 9.359219 -4.074486 -15.135581 9.993315 -2.034602 -0.435857 0.065232 -0.122267 +-0.155255 1.606933 -0.042436 -7.904150 -14.910521 -9.976284 6.132611 -0.396099 -17.974174 -6.482966 0.442776 8.747579 -0.607337 0.263478 -0.093182 0.624604 0.389966 0.463768 10.625152 7.725592 -1.360209 12.235993 -2.568690 42.515491 -0.318295 -0.057561 0.101954 0.279279 0.105677 0.188364 3.059854 3.420854 7.726108 -1.554179 4.566720 10.980680 -3.558352 5.161422 12.777025 0.538786 2.560840 8.562731 5.153638 1.251932 -13.002645 -3.437396 0.448450 -11.197196 -12.642103 -20.749588 -2.599976 41.375114 -19.952688 -9.183331 0.061028 -0.179509 0.588692 8.093701 -1.192280 -9.645938 20.499111 11.572705 -4.045588 -15.529764 10.370626 -2.277901 -0.452976 0.052024 -0.142714 +-0.152083 1.606483 -0.051784 -7.567080 -17.146141 -10.049934 8.152706 -0.344608 -20.190386 -8.707283 1.042604 13.983326 -0.615083 0.277083 -0.103284 0.639628 0.414488 0.466801 10.462480 7.969729 -1.951233 11.097867 -2.149283 43.216347 -0.323782 -0.070184 0.094681 0.297566 0.114381 0.205735 3.036006 3.326841 8.200000 -1.485536 4.555881 11.291413 -3.447955 5.101433 13.248490 0.252534 3.551512 8.317461 5.070338 1.925607 -13.335642 -3.601868 -0.670601 -11.612844 -12.342030 -22.204805 -2.806740 42.235493 -19.971783 -9.538338 0.040605 -0.167086 0.578094 9.817141 -0.125658 -10.633718 20.723526 13.895201 -3.950775 -15.358629 10.303440 -2.375078 -0.464874 0.044683 -0.132438 +-0.148766 1.606644 -0.060721 -7.386243 -19.553471 -10.331503 10.622969 -0.118184 -22.140608 -11.675226 2.077783 19.915577 -0.634292 0.271717 -0.123380 0.676542 0.458746 0.491102 10.640180 8.157366 -2.223415 9.724277 -1.597904 43.703949 -0.343389 -0.068934 0.086461 0.325110 0.094941 0.217119 3.201195 3.166709 9.122756 -1.395641 4.617937 11.632595 -3.419672 5.162120 13.598430 -0.601054 4.760435 8.004275 4.673171 2.721645 -14.529936 -3.788130 -1.876887 -11.856270 -12.363192 -23.442291 -2.995182 43.647419 -21.224220 -10.523670 0.046908 -0.158676 0.591816 11.626849 0.905302 -11.395967 20.860348 15.695547 -3.925965 -15.010798 10.483617 -2.454436 -0.477184 0.041214 -0.122190 +-0.143809 1.608121 -0.069850 -6.752759 -21.915737 -10.967949 12.350435 -0.150520 -23.741671 -14.259523 3.365441 25.961500 -0.678074 0.287212 -0.137323 0.690565 0.467266 0.517168 10.132088 8.252432 -2.336057 8.676771 -1.232475 44.009972 -0.347024 -0.061635 0.087100 0.345248 0.089695 0.206591 2.914943 3.179664 10.192928 -1.256652 4.672759 12.059586 -3.178120 5.233828 13.956268 -0.853625 5.446908 7.955490 4.222835 3.458758 -15.352881 -4.715968 -3.841550 -12.430705 -11.510841 -25.186232 -3.382696 44.712788 -21.933510 -11.247051 0.039736 -0.191908 0.619013 13.512440 2.369993 -11.666486 20.429726 17.129457 -3.930598 -14.336025 11.806147 -2.659317 -0.500018 0.058389 -0.146900 +-0.137896 1.609854 -0.077652 -5.823012 -24.055769 -11.668018 13.779216 -0.294715 -25.182566 -16.967180 4.977308 31.880217 -0.714081 0.310344 -0.143757 0.693127 0.461524 0.529300 9.403065 8.282658 -2.397833 7.210505 -0.694751 44.228523 -0.354469 -0.063269 0.080190 0.356486 0.095099 0.204466 2.438852 3.261651 10.994482 -1.147426 4.692928 12.445843 -2.880855 5.274017 14.316557 -0.927538 6.005843 8.148997 3.969277 4.118996 -15.678823 -5.316980 -5.580879 -12.721301 -11.133784 -26.776617 -3.605953 45.565617 -24.253584 -12.633064 0.031767 -0.214452 0.645872 14.898627 3.831013 -11.785723 20.248457 18.586010 -3.900503 -13.525084 13.505468 -2.873523 -0.516495 0.068957 -0.173095 +-0.130867 1.612166 -0.084851 -4.875965 -25.981440 -12.199566 15.083968 -0.514531 -26.784744 -19.957155 6.923659 37.548882 -0.696912 0.291710 -0.163743 0.726395 0.490140 0.574809 8.477742 8.146724 -2.492680 5.551526 -0.122520 43.949738 -0.380759 -0.072170 0.057762 0.357321 0.044334 0.242526 2.158102 3.111463 11.672981 -1.094743 4.592554 12.783085 -2.704907 5.140908 14.687515 -0.885196 6.413784 8.514328 2.674360 5.196745 -15.926392 -5.635658 -7.048832 -12.588388 -11.202438 -27.804913 -3.808431 46.915981 -27.456287 -14.557017 0.040479 -0.164475 0.645094 15.019759 5.338651 -11.741925 21.237589 20.218506 -3.618650 -12.086660 15.796215 -3.075075 -0.504326 0.037830 -0.132508 +-0.124569 1.615139 -0.091197 -3.793108 -27.912590 -12.866165 16.083836 -0.745651 -27.852245 -22.382816 8.920979 42.601986 -0.718903 0.294819 -0.176465 0.746321 0.501490 0.619812 7.491395 7.949832 -2.409604 3.972824 0.429350 43.304806 -0.394515 -0.062772 0.052734 0.364812 0.020979 0.248542 1.629811 3.106494 12.275188 -1.131571 4.522753 13.153068 -2.561482 5.073355 15.087170 -0.799961 6.805485 8.702858 1.749366 6.156599 -16.791067 -5.698677 -8.449005 -12.665860 -11.313059 -29.085314 -3.926397 47.764103 -31.461718 -16.861189 0.037331 -0.182031 0.668726 15.449378 7.066398 -11.848394 22.377285 22.042166 -3.412206 -10.939917 17.745220 -3.241103 -0.512922 0.047209 -0.136056 +-0.118005 1.619715 -0.097560 -2.591225 -29.314501 -13.581259 16.482523 -1.302634 -28.535030 -24.110374 10.683502 47.065063 -0.736296 0.261939 -0.213807 0.795541 0.563422 0.675948 6.338984 7.540351 -2.273709 2.772543 0.743658 42.251862 -0.422817 -0.045223 0.036012 0.396663 -0.039910 0.254975 0.778419 3.097676 12.655063 -1.149864 4.316111 13.703722 -2.193244 4.838350 15.886477 -0.761904 7.446394 9.015975 0.933794 7.305212 -18.504755 -5.104967 -10.050616 -12.855439 -12.143413 -30.883242 -4.121560 49.404926 -34.883862 -19.457796 0.056960 -0.174758 0.689441 15.945306 8.780711 -12.205355 23.646778 24.080421 -3.216335 -10.003852 20.238850 -3.506859 -0.516217 0.046552 -0.115759 +-0.110987 1.624715 -0.103259 -1.339180 -31.126358 -13.841406 16.718086 -1.643628 -28.929125 -25.513557 12.321860 50.518543 -0.757916 0.253705 -0.245401 0.835283 0.611165 0.711364 5.128810 7.305420 -2.759619 1.290884 1.174620 41.272972 -0.452961 -0.043838 0.024794 0.418304 -0.071846 0.282597 0.033580 3.332775 12.349244 -1.225869 4.260793 14.080084 -1.894949 4.776854 16.723743 -0.553547 7.925304 9.409863 0.367788 8.212152 -20.010220 -3.718606 -11.724162 -12.963178 -13.988247 -33.032402 -3.971232 50.071518 -38.298206 -21.960804 0.056370 -0.167856 0.713036 15.872032 10.391656 -12.292434 25.809473 25.670246 -2.896585 -9.064837 22.811100 -3.769757 -0.532793 0.050022 -0.095163 +-0.104358 1.629916 -0.107108 -0.340732 -33.205326 -13.578669 17.083504 -1.833149 -29.206976 -26.589983 13.897703 53.715229 -0.750196 0.241307 -0.253408 0.863857 0.651652 0.735837 4.311136 7.021362 -3.433456 -0.456643 1.696122 39.838036 -0.473439 -0.051012 0.014963 0.434047 -0.087968 0.303216 -0.223134 3.382552 11.446911 -1.400740 4.257839 14.186185 -1.932330 4.763020 17.431128 -0.462293 8.599119 10.001927 -0.113684 9.099281 -20.279131 -2.714864 -13.559663 -13.001805 -16.253441 -35.308578 -3.677524 50.599213 -40.458481 -23.806383 0.056001 -0.147974 0.707228 16.279284 11.652099 -12.259357 28.209742 26.976212 -2.448616 -7.462887 26.771383 -4.023708 -0.531461 0.033484 -0.071842 +-0.098268 1.635540 -0.109911 0.095756 -34.932892 -12.928908 17.427895 -2.150764 -29.353802 -26.683149 14.960142 56.886841 -0.775600 0.247563 -0.266523 0.883510 0.678218 0.748740 3.784520 6.614614 -4.137233 -1.790574 1.957662 37.979965 -0.477766 -0.066562 0.013452 0.461028 -0.090299 0.304044 -0.407725 3.278637 10.209656 -1.420716 4.060065 14.271961 -1.720481 4.602381 18.262276 -0.373787 9.429996 10.366678 -0.548301 10.009103 -20.323969 -1.789331 -15.031480 -12.958756 -19.087252 -37.659576 -2.932446 52.041370 -43.372192 -26.582546 0.045365 -0.143714 0.707814 16.690390 12.616516 -12.644693 30.147425 28.905918 -1.605877 -4.369041 29.553823 -3.560164 -0.552401 0.020006 -0.078770 +-0.091888 1.641570 -0.112264 0.575041 -36.718918 -12.161089 17.424295 -2.511493 -29.285671 -26.184809 15.767151 60.096672 -0.797658 0.267854 -0.271517 0.892794 0.684860 0.776970 3.201453 6.249115 -5.004308 -2.994241 2.138109 36.112057 -0.481794 -0.083401 0.002949 0.477859 -0.092093 0.310422 -0.648649 3.246926 8.861405 -1.392490 3.866477 14.333423 -1.413709 4.428638 19.104046 -0.103472 9.798611 10.709154 -1.598368 10.882658 -20.192261 -1.001857 -16.252991 -13.005049 -21.506372 -40.416660 -1.777879 51.999561 -46.621296 -28.735558 0.023997 -0.147788 0.705759 16.538864 13.521867 -13.129786 32.457268 31.055237 -0.443250 -1.188440 31.425295 -2.842073 -0.564919 0.006470 -0.089682 +-0.085472 1.647810 -0.114437 1.149869 -38.550419 -11.313907 16.880774 -2.879326 -28.938185 -25.122160 16.001858 62.530167 -0.800713 0.277662 -0.269268 0.916811 0.714510 0.797108 2.501112 5.940675 -6.077391 -4.076771 2.259006 34.245506 -0.493576 -0.108549 0.004034 0.497184 -0.087258 0.332298 -0.720109 3.121574 7.480189 -1.547512 3.663750 14.362247 -1.480661 4.174148 19.906746 0.302679 10.420553 10.867702 -2.370678 11.809701 -20.080130 0.080329 -17.179731 -12.855272 -23.805977 -42.529972 -0.519510 52.495544 -50.011547 -31.235239 0.005652 -0.132177 0.693393 16.178818 14.208493 -13.697104 35.824646 33.236565 1.004251 1.353943 33.600208 -2.300271 -0.579396 -0.019572 -0.080469 +-0.078480 1.653010 -0.116195 1.207361 -40.712685 -9.825318 16.680843 -2.806930 -28.324362 -24.440128 16.056738 63.384495 -0.809462 0.299104 -0.257650 0.937312 0.742363 0.820825 2.239747 5.904922 -7.614280 -4.972218 2.391983 32.895176 -0.493000 -0.150027 0.012597 0.524501 -0.069347 0.347535 -0.265043 2.983308 5.719175 -1.626428 3.519567 14.301897 -1.620521 3.922987 20.849640 0.737091 11.077666 10.400050 -3.793144 12.827089 -19.545074 1.880812 -17.590981 -12.729789 -26.810213 -44.778999 1.364611 51.941055 -52.983013 -32.928169 -0.031328 -0.121367 0.661322 15.189126 14.529465 -14.530971 39.804871 35.688026 3.097610 3.818692 35.366108 -1.687046 -0.603707 -0.059245 -0.080730 +-0.072184 1.657377 -0.118193 1.385782 -42.416286 -8.287569 16.030611 -2.871326 -27.688341 -23.520807 15.715948 63.505116 -0.816973 0.334522 -0.244307 0.918547 0.731033 0.812317 1.770311 5.845553 -9.166382 -5.213834 2.293669 31.509369 -0.465045 -0.197759 0.024919 0.536055 -0.029868 0.349608 -0.226790 2.996415 3.967878 -1.667355 3.354706 14.080020 -1.546612 3.628032 21.509533 1.374760 11.638236 9.989178 -4.807969 13.829537 -18.186932 3.542742 -17.832680 -12.688412 -30.009165 -47.536533 4.054867 49.613194 -55.754639 -33.152542 -0.088418 -0.114964 0.612616 14.385589 14.381516 -15.278356 44.007767 37.964916 5.674764 6.515521 37.070274 -0.834909 -0.626331 -0.091569 -0.096701 +-0.064898 1.661765 -0.120543 1.130265 -44.115372 -6.712142 15.345182 -2.838210 -26.461418 -22.331165 14.909662 62.758747 -0.841119 0.368879 -0.252606 0.925117 0.741987 0.825588 1.790442 5.890166 -10.511384 -5.616301 2.297547 30.119736 -0.455930 -0.249934 0.017280 0.560090 -0.013790 0.371284 0.169494 2.961426 2.498317 -1.640429 3.221840 14.007882 -1.540515 3.396683 22.322811 2.146389 12.141342 9.480089 -5.753473 14.751775 -17.673609 4.438820 -18.124252 -12.933593 -33.573544 -50.742359 7.278052 46.982243 -57.752182 -32.590134 -0.139609 -0.092477 0.581458 13.425660 14.140767 -16.370064 47.970409 40.470715 8.781833 9.949854 38.282684 0.500140 -0.655403 -0.131579 -0.099691 +-0.058692 1.666194 -0.122879 0.943071 -45.379837 -5.602497 14.113273 -2.820513 -24.223135 -20.786242 13.536302 60.696419 -0.859730 0.397450 -0.247367 0.932780 0.759700 0.837800 2.014765 5.937261 -11.284970 -6.085701 2.381442 28.709223 -0.454839 -0.281371 0.015891 0.588520 0.009324 0.379726 0.527073 2.901817 1.245380 -1.638134 3.063291 14.126240 -1.628127 3.101448 23.195272 2.950866 12.442166 9.319098 -6.279268 15.430611 -17.397217 5.542769 -18.514566 -13.119287 -36.356892 -53.352074 10.368772 44.535427 -59.931213 -32.017178 -0.176244 -0.095668 0.560239 11.997142 14.337797 -17.430725 51.889919 42.790203 12.079476 13.062656 39.001709 1.774395 -0.677188 -0.153680 -0.112580 +-0.053305 1.670432 -0.124906 0.990812 -45.974033 -4.750149 12.411217 -2.871249 -21.573986 -18.896820 11.765480 57.618347 -0.887348 0.422795 -0.257062 0.940096 0.778581 0.861149 1.785346 5.759792 -11.596251 -5.834585 2.168309 26.426180 -0.446658 -0.318423 0.009561 0.618595 0.014775 0.388418 0.441593 2.873629 -0.103128 -1.561562 2.784042 14.372162 -1.410620 2.633698 24.328606 3.489204 12.555588 8.856671 -7.603151 16.014280 -17.478388 7.586046 -18.413704 -13.385505 -40.309376 -55.989292 14.399580 42.882065 -62.046642 -31.940090 -0.222067 -0.095247 0.531140 10.866857 14.158597 -18.542252 56.235340 44.844139 15.544897 15.105147 40.132389 2.681415 -0.703506 -0.179786 -0.119619 +-0.048060 1.672174 -0.125240 1.067987 -46.165146 -3.752481 10.301759 -2.922394 -19.107533 -16.376680 9.702046 54.235184 -0.921379 0.473185 -0.256851 0.918703 0.760504 0.852552 1.150216 5.573877 -11.928140 -4.950298 1.803252 24.475002 -0.424977 -0.365920 0.012501 0.632206 0.051694 0.397874 0.642000 2.780384 -1.415163 -1.532778 2.485471 14.412150 -1.429190 2.160666 25.085745 3.981361 12.783957 8.131550 -8.602957 16.508448 -17.115501 9.339681 -18.554905 -13.560049 -44.180595 -58.379166 18.957266 40.880371 -64.374359 -31.448904 -0.286232 -0.103685 0.503654 10.254326 13.675895 -19.172379 60.629196 46.249130 18.838848 15.949635 41.748264 3.152300 -0.739694 -0.196867 -0.143546 +-0.043900 1.670897 -0.125284 1.001006 -45.875393 -2.444858 8.380536 -2.904169 -16.533070 -13.964335 7.628642 49.627232 -0.939751 0.546710 -0.238290 0.874880 0.705128 0.829222 0.590914 5.385997 -12.298265 -3.988642 1.445380 22.669090 -0.396043 -0.415146 0.015164 0.622019 0.114329 0.417053 0.537711 2.648932 -2.827901 -1.372797 2.059048 14.222775 -1.103769 1.555918 25.482716 4.664692 12.824980 7.398415 -9.081342 16.854027 -16.197807 11.205435 -18.278149 -13.618406 -49.798798 -60.747002 25.021957 39.232407 -65.726738 -30.701593 -0.363890 -0.110333 0.471449 9.617601 12.529979 -19.236971 64.963943 47.001232 22.184855 17.124798 45.165901 4.042819 -0.767472 -0.210164 -0.170605 +-0.038835 1.668873 -0.124029 -0.051792 -45.021545 -0.811618 6.972673 -2.898533 -13.583907 -11.232874 5.433945 44.436188 -0.947751 0.593338 -0.225656 0.858661 0.677015 0.822131 0.704947 5.046429 -11.901040 -3.123290 1.088188 20.078775 -0.379908 -0.453130 0.015702 0.619103 0.149058 0.435917 1.769720 2.184735 -4.041565 -1.098175 1.514576 14.195010 -1.159758 0.891981 26.017015 5.077238 12.591658 6.953607 -9.457038 16.804754 -15.542446 12.277021 -18.676941 -13.749967 -55.035603 -62.946720 31.018974 36.727680 -66.060059 -28.745161 -0.408735 -0.099008 0.446163 8.671971 11.541602 -18.997971 68.022797 47.576248 24.943020 17.899282 49.754269 5.004252 -0.784801 -0.233018 -0.180115 +-0.033778 1.665825 -0.122855 -1.644150 -45.003338 1.184331 6.261551 -2.294415 -9.887939 -8.866342 3.690083 37.367271 -0.964685 0.627722 -0.227996 0.859038 0.670105 0.837439 1.428151 4.887099 -11.612030 -2.767780 0.915274 17.491590 -0.377034 -0.487039 0.002939 0.627601 0.157720 0.458584 3.198275 1.851826 -5.349900 -0.718613 1.082784 14.195268 -1.134445 0.412229 26.654737 5.591552 12.342720 6.582157 -10.255214 16.826820 -15.509573 13.337549 -19.134537 -14.107331 -61.931351 -64.535240 37.758808 32.681770 -65.366150 -25.521833 -0.444237 -0.087423 0.430981 6.535807 10.997141 -18.706129 70.987419 48.440365 28.019770 17.424387 54.716484 5.401154 -0.800673 -0.257395 -0.182369 +-0.028408 1.661072 -0.121875 -3.386826 -44.952564 3.472615 5.986441 -1.822455 -6.303314 -6.960638 2.314524 29.584284 -1.021682 0.705801 -0.240431 0.824908 0.614910 0.856751 2.116085 4.837297 -11.882384 -2.382343 0.715351 15.446751 -0.354885 -0.537739 -0.014611 0.628387 0.178956 0.479975 4.597176 1.368080 -6.635199 -0.448872 0.443305 14.086830 -1.067970 -0.256211 27.268509 6.369960 12.367743 5.941165 -12.047565 17.573902 -15.524791 13.117796 -18.458702 -14.757030 -69.187172 -66.160110 45.245892 28.394566 -62.623966 -21.438742 -0.525574 -0.105639 0.423171 5.044918 9.783927 -18.814711 75.794197 49.609234 32.938976 16.483166 57.893078 5.489139 -0.838915 -0.269500 -0.219826 +-0.021600 1.656338 -0.121351 -5.287672 -44.062309 5.598478 5.934884 -1.503548 -3.159291 -4.732643 1.173690 22.743078 -1.046881 0.743444 -0.243968 0.817461 0.603384 0.873714 2.503117 4.763614 -12.120962 -1.031927 0.409366 13.689591 -0.344708 -0.573331 -0.031582 0.643150 0.189425 0.490796 5.780529 0.611710 -7.560449 0.075164 -0.464842 14.042303 -0.558760 -1.223659 27.760399 6.800697 12.390827 5.251103 -12.960823 17.841030 -15.378655 12.954215 -18.894741 -15.182395 -75.067116 -67.311241 51.108837 26.665586 -59.707905 -19.447872 -0.566331 -0.102286 0.404490 3.816491 9.591886 -18.812263 76.916672 51.492241 36.605915 14.393044 61.566483 5.152966 -0.854445 -0.294575 -0.235665 +-0.015629 1.653518 -0.121831 -6.413427 -43.556396 6.810956 5.758468 -1.113977 -0.148297 -2.971282 0.508582 16.795404 -1.093626 0.785855 -0.248032 0.819832 0.594512 0.902399 2.577854 4.773362 -12.325134 0.070174 0.216528 12.493884 -0.339645 -0.594409 -0.032351 0.662205 0.202237 0.492637 5.809247 -0.016117 -8.234126 0.608593 -1.360903 14.243618 0.220945 -2.177500 28.592331 7.149487 12.864558 4.956171 -13.939013 18.381048 -15.768514 13.005028 -19.239588 -15.432404 -79.147278 -68.317902 55.433243 27.881001 -57.690834 -19.729433 -0.602868 -0.130434 0.413066 3.223720 9.842345 -18.926743 77.674423 54.088097 40.439648 8.925491 64.015701 2.446074 -0.885967 -0.297864 -0.267894 +-0.009511 1.652362 -0.122952 -6.929716 -43.515507 7.495130 5.519564 -0.751940 2.094325 -2.186687 0.225381 12.160829 -1.099132 0.797103 -0.248010 0.833374 0.600344 0.919265 2.269024 4.885890 -12.946620 0.674467 0.160533 12.058118 -0.338613 -0.611228 -0.037628 0.672390 0.200799 0.500881 4.820080 -0.626984 -8.584022 1.205361 -2.215324 14.415998 1.435496 -3.089177 29.269243 7.063026 13.389710 5.056177 -14.251827 18.610365 -15.521502 12.593791 -19.622505 -15.151218 -81.647087 -68.300377 57.171257 29.932955 -57.071125 -21.068310 -0.609943 -0.114523 0.404766 3.399432 10.797357 -18.948591 77.225815 57.010139 43.767872 3.393359 65.383881 -0.394404 -0.891226 -0.321322 -0.266715 +-0.003946 1.653317 -0.123815 -6.885468 -44.663975 7.695644 5.187340 -0.291453 3.890344 -2.541987 0.223339 8.532451 -1.117140 0.801245 -0.267242 0.834591 0.594175 0.939182 1.802652 5.030499 -13.570665 0.711658 0.187010 11.936299 -0.346661 -0.600188 -0.049527 0.668507 0.178776 0.506545 3.192840 -0.801445 -8.758616 1.720175 -2.692236 14.665085 2.629276 -3.557991 29.969830 7.070270 13.811339 5.552103 -14.908219 18.893860 -16.259546 11.855654 -20.295658 -14.865569 -83.178001 -67.945152 57.457966 31.336916 -56.571087 -22.084843 -0.612736 -0.128142 0.425917 3.816317 12.269733 -18.680784 76.948586 59.026657 45.520245 -1.865840 65.493958 -3.497915 -0.894533 -0.304211 -0.267270 +0.001761 1.655233 -0.124346 -6.579142 -46.234596 8.046661 4.656163 0.081303 4.554468 -3.113094 0.278055 6.232237 -1.127210 0.823834 -0.263681 0.814377 0.578803 0.926491 1.274173 5.147223 -14.523710 0.477030 0.218763 11.626559 -0.341266 -0.602457 -0.036708 0.660191 0.204042 0.512253 1.746988 -0.730604 -8.866467 2.042861 -2.838937 14.719042 3.544269 -3.740258 30.349012 7.169073 13.989533 5.682276 -15.478142 19.064768 -16.509010 10.911860 -20.253353 -14.677760 -86.460815 -67.311989 59.288643 31.654510 -56.379906 -22.451283 -0.646311 -0.160174 0.423832 4.626831 13.185744 -18.693058 78.480377 60.003563 47.908428 -2.020316 64.956230 -3.200493 -0.911410 -0.279415 -0.275454 +0.009333 1.657620 -0.124338 -6.472995 -47.341961 8.576585 4.205546 0.213702 4.044258 -3.587841 0.330169 5.425428 -1.126349 0.809526 -0.264870 0.823958 0.597954 0.940228 0.849821 5.131092 -15.312308 0.103994 0.243861 11.041361 -0.350120 -0.585546 -0.033320 0.666741 0.193453 0.505179 1.429579 -0.797612 -8.716608 2.139693 -2.915079 14.693138 3.740379 -3.784433 30.401634 7.043937 14.150191 5.797968 -15.883853 19.073729 -17.120924 10.346807 -20.345032 -14.659486 -89.258263 -66.284660 60.292755 31.098484 -57.209187 -22.589682 -0.637520 -0.180510 0.429691 4.761446 13.555538 -18.738310 80.210358 60.019650 49.298573 -1.498041 65.180580 -2.789700 -0.907889 -0.264516 -0.272584 +0.017558 1.660437 -0.124030 -6.268582 -47.881737 8.854125 3.464362 0.107938 3.181649 -3.432943 0.272249 5.332133 -1.106604 0.773785 -0.273964 0.839897 0.616288 0.956771 0.406110 4.787937 -15.489355 -0.344432 0.191002 9.758792 -0.364568 -0.562914 -0.036360 0.660200 0.154695 0.506582 1.649841 -0.911833 -8.468642 2.077375 -2.954264 14.714210 3.544783 -3.753711 30.269840 6.802404 14.052200 6.278881 -16.291964 18.974131 -17.704203 10.014317 -20.816105 -14.630104 -90.282364 -65.453041 59.759747 30.129396 -57.729111 -22.358538 -0.604684 -0.171517 0.439503 4.535153 13.596904 -18.583553 80.765663 59.084404 48.395939 -0.569358 66.139709 -2.427980 -0.887886 -0.259113 -0.248803 +0.024932 1.661747 -0.123666 -5.774625 -48.506908 9.085707 2.614579 -0.050837 2.036926 -3.463555 0.237043 5.522469 -1.063135 0.737336 -0.262337 0.850471 0.632353 0.959339 -0.112639 4.358645 -15.707052 -0.908793 0.130067 8.416176 -0.378207 -0.551583 -0.034225 0.647481 0.134903 0.513983 1.871063 -1.086206 -8.289625 1.702105 -2.926984 14.552122 2.979524 -3.672489 29.695045 6.647815 14.124891 6.812924 -16.372850 19.085279 -17.664579 10.502190 -20.661245 -15.201012 -90.221375 -64.278061 58.313332 25.227022 -58.710171 -19.633062 -0.572811 -0.147708 0.432977 4.751923 12.818569 -18.327557 82.402374 57.111286 47.400349 2.960052 67.184059 -0.406084 -0.858947 -0.269306 -0.219772 +0.031043 1.661386 -0.123611 -5.377493 -49.274864 9.322409 2.131159 -0.111259 1.092507 -3.976084 0.309012 5.863755 -1.025827 0.721481 -0.249544 0.836927 0.618318 0.944057 -0.604539 4.050637 -15.948699 -1.127587 0.053991 7.163304 -0.375311 -0.548874 -0.028757 0.622785 0.134066 0.520451 1.838435 -0.905329 -8.154225 1.573599 -2.645225 14.307020 2.816289 -3.331951 29.011986 6.591502 13.913296 7.036322 -16.348001 19.110130 -17.179478 10.881913 -21.098469 -15.744227 -90.360291 -63.713367 57.684105 20.660542 -58.324493 -16.694958 -0.562860 -0.128252 0.419226 5.057077 12.476528 -17.941404 80.768524 55.652431 44.213364 4.705201 67.917755 0.458741 -0.837151 -0.274073 -0.201588 +0.036447 1.659650 -0.122785 -5.281791 -49.636047 9.618383 1.888535 -0.184299 0.406428 -4.302277 0.337856 6.122027 -0.965617 0.679858 -0.243522 0.837380 0.631183 0.925393 -1.007041 3.752043 -15.998919 -0.935912 -0.043269 5.980521 -0.379512 -0.550163 -0.028129 0.601935 0.117710 0.537046 2.434662 -0.888802 -8.131194 1.270829 -2.427172 14.036299 2.224445 -3.116610 28.279497 6.660919 13.862987 7.469388 -16.024477 19.298777 -16.575005 11.597098 -21.390266 -16.256451 -89.184990 -63.032146 55.885300 15.832952 -58.088898 -13.656969 -0.540590 -0.075053 0.390487 4.910627 12.040683 -17.521587 80.955994 53.802822 41.872486 6.294748 67.669899 0.963872 -0.804616 -0.296598 -0.155846 +0.041660 1.657940 -0.121614 -5.519197 -49.605152 10.036591 1.999714 -0.232633 -0.278105 -4.897634 0.411094 6.522964 -0.919088 0.621024 -0.238613 0.845250 0.649124 0.914100 -1.107759 3.589437 -16.049902 -0.967949 -0.086224 5.304147 -0.391172 -0.526863 -0.020104 0.585343 0.085673 0.531035 3.086859 -0.884777 -7.949316 1.180746 -2.246736 13.757518 1.977015 -2.857955 27.356874 6.458653 13.692559 8.186945 -15.852287 19.265665 -16.475861 11.546116 -21.749334 -16.434526 -88.645180 -61.485912 53.443806 9.938176 -58.401215 -10.271932 -0.486820 -0.052285 0.393372 4.690033 11.603480 -17.109907 79.806252 51.520981 38.171230 10.749758 67.738121 3.542996 -0.770098 -0.298185 -0.126424 +0.046110 1.655880 -0.121511 -5.346190 -49.173733 10.048797 1.917262 -0.353518 -1.104606 -5.477421 0.511152 7.359171 -0.877000 0.594389 -0.218418 0.806916 0.605841 0.877691 -1.339873 3.501498 -16.382124 -1.248385 -0.097400 5.231574 -0.380703 -0.490192 -0.005740 0.540049 0.090139 0.509067 3.116958 -0.870246 -7.545007 1.188169 -2.145591 13.448503 2.106918 -2.618797 26.097023 6.284989 13.591178 8.933543 -15.135174 19.193541 -15.749553 10.937140 -22.790348 -16.320213 -86.314384 -59.476040 48.946125 2.471347 -58.989697 -6.025545 -0.455803 -0.067012 0.401371 4.853712 11.953414 -16.529488 76.978729 49.035892 33.332592 18.638786 67.594078 8.579813 -0.733749 -0.265663 -0.126498 +0.050773 1.653659 -0.121374 -5.391473 -48.710621 10.250090 2.027637 -0.505501 -2.038249 -5.863139 0.586008 8.369407 -0.852626 0.554730 -0.221162 0.795097 0.592508 0.861273 -1.326099 3.550413 -16.915388 -1.715844 -0.076003 5.523638 -0.387742 -0.455855 -0.005836 0.513414 0.062845 0.496346 3.203425 -0.794127 -7.074530 1.232844 -1.989836 13.110909 2.322623 -2.342943 24.812037 6.321569 13.192057 9.625464 -14.632455 18.971157 -15.732099 10.149632 -23.322330 -16.620564 -85.172020 -57.131077 45.054642 -7.118002 -57.804947 -0.524927 -0.409888 -0.070343 0.426631 4.889943 12.002140 -16.083113 75.060051 46.177998 28.621929 24.905453 65.980881 11.947321 -0.704013 -0.241795 -0.117339 +0.055112 1.649976 -0.120476 -5.293961 -47.953358 10.497688 2.154961 -0.692010 -3.131081 -6.283369 0.665802 9.389389 -0.817303 0.533133 -0.208708 0.768745 0.558134 0.836564 -1.495044 3.673358 -17.859495 -2.161002 -0.043866 6.412472 -0.385248 -0.428509 0.003951 0.471933 0.059712 0.490823 3.366324 -0.841835 -6.683656 1.144231 -1.938038 12.597975 2.447562 -2.237129 23.291262 6.324219 12.568447 10.208038 -14.122289 18.686655 -15.177151 9.719419 -22.911745 -16.879511 -84.739273 -54.613197 41.959877 -16.604340 -55.848263 4.634556 -0.385034 -0.075838 0.437635 5.108632 11.309784 -15.649613 74.939606 42.879398 24.665571 29.090019 62.523048 13.160874 -0.676342 -0.216955 -0.108009 +0.059757 1.647180 -0.118633 -5.302130 -46.612427 10.746910 2.308228 -1.000390 -4.335661 -6.614056 0.711387 10.700800 -0.781744 0.506835 -0.202375 0.744644 0.521985 0.822127 -1.789793 3.734812 -18.708181 -2.280045 -0.040708 7.495085 -0.380034 -0.410630 0.005870 0.431718 0.040083 0.487112 3.765532 -0.969738 -6.342091 1.184046 -1.964829 12.088542 2.803968 -2.239013 21.910166 6.255766 11.739151 10.689406 -13.973336 18.508034 -14.365384 8.812634 -22.665823 -16.757832 -85.319992 -52.447044 39.642731 -20.552885 -51.679966 5.998483 -0.357530 -0.064613 0.443843 5.475376 10.360473 -15.217603 74.407814 39.593071 20.598122 31.128378 58.222523 12.645628 -0.645197 -0.209855 -0.095934 +0.065420 1.644949 -0.117154 -5.427540 -44.333920 10.843918 2.756126 -1.444317 -5.672246 -6.777926 0.705462 12.394989 -0.766476 0.478938 -0.202541 0.730849 0.495727 0.827638 -2.056098 3.820168 -19.514698 -2.203588 -0.050312 9.261275 -0.378896 -0.384161 0.010805 0.402850 0.009135 0.473366 4.468591 -1.445414 -5.715921 1.308857 -2.312465 11.729095 3.126073 -2.509551 20.640215 6.035393 11.112825 10.824742 -14.353500 18.398081 -14.218781 7.004889 -23.173594 -16.541067 -84.018723 -50.534496 36.170940 -22.095377 -46.706219 5.857731 -0.326100 -0.075654 0.465094 5.811011 10.063232 -15.150534 72.621315 37.037312 16.759340 31.535904 53.127449 11.101893 -0.622997 -0.192670 -0.095404 +0.072045 1.642078 -0.116980 -4.652223 -40.580994 10.249565 2.977822 -2.213176 -7.686277 -7.158882 0.688755 14.940269 -0.744488 0.439522 -0.197998 0.749786 0.521325 0.835127 -3.285902 3.518858 -20.242908 -1.598179 -0.160115 11.265115 -0.389100 -0.361604 0.016573 0.405462 -0.011673 0.460464 4.526140 -2.320081 -4.996784 1.293780 -3.029412 11.429747 3.473411 -3.203922 19.562258 6.089178 10.789883 10.601437 -13.639040 18.064959 -14.178087 6.084700 -23.231354 -16.491701 -82.813477 -48.533394 32.645943 -22.093161 -41.960434 4.915391 -0.285835 -0.071272 0.472608 5.753143 9.326966 -15.474208 70.718216 35.166328 14.048994 31.147116 48.390144 9.502047 -0.603989 -0.192389 -0.083363 +0.078329 1.639481 -0.115677 -4.039166 -37.380020 9.506545 2.927914 -2.938613 -9.052074 -7.279142 0.624617 17.243574 -0.733843 0.413355 -0.193854 0.753221 0.523080 0.833917 -4.374572 3.232094 -20.898985 -1.082501 -0.312375 13.822042 -0.401555 -0.326908 0.023027 0.394541 -0.027260 0.446990 4.823312 -3.076018 -4.203299 1.283053 -3.649585 11.199993 3.514127 -3.731237 18.540051 5.794246 10.439932 10.872869 -13.158144 17.439377 -14.327139 4.120765 -23.466368 -15.931002 -80.162827 -46.181778 28.302616 -21.938387 -37.609352 4.062568 -0.247865 -0.094603 0.500648 5.583919 9.475564 -15.545424 68.876045 33.652359 11.724177 29.231306 43.623585 7.412969 -0.588198 -0.164948 -0.081871 +0.084605 1.635856 -0.114058 -3.755568 -34.813919 9.017931 3.085687 -3.651858 -10.354903 -7.821445 0.668097 19.724806 -0.724290 0.408701 -0.193456 0.741831 0.501515 0.825046 -5.085648 3.045202 -21.837099 -0.542986 -0.520094 16.834372 -0.401134 -0.315330 0.013051 0.377212 -0.034518 0.445089 5.564223 -3.490164 -3.462853 1.290342 -3.870229 10.969480 3.369160 -3.876795 17.628319 5.523723 9.889712 10.375631 -12.552778 16.659075 -13.887792 1.677854 -23.285875 -15.208591 -77.581581 -43.983147 24.594301 -21.347328 -33.903473 3.281768 -0.231740 -0.091070 0.510287 5.728739 9.141832 -15.529655 66.954773 31.854429 9.537202 27.638260 38.865200 5.758027 -0.572394 -0.157926 -0.079069 +0.090152 1.632178 -0.112394 -3.403262 -32.989090 8.500189 3.090080 -4.113754 -11.104386 -8.442555 0.771487 21.286917 -0.710280 0.403827 -0.193826 0.722182 0.466220 0.810645 -5.685480 2.989309 -23.588095 -0.342014 -0.723596 21.241095 -0.396328 -0.305020 0.010894 0.346616 -0.043217 0.446991 6.037810 -3.588850 -2.669135 1.318733 -3.803905 10.653463 3.278777 -3.718045 16.624069 5.429049 9.262973 10.152700 -12.197408 16.071753 -13.294462 -1.349499 -22.502745 -14.363648 -75.219315 -41.628216 21.271864 -20.064365 -29.805319 2.374411 -0.218976 -0.083991 0.520432 5.536554 8.492969 -15.240474 65.425079 29.779852 7.567086 25.802567 34.194653 4.266063 -0.558312 -0.148548 -0.073258 +0.095481 1.629473 -0.110172 -3.334122 -31.344221 7.811875 3.351379 -4.316428 -11.063261 -9.298347 0.937335 22.033400 -0.689912 0.363937 -0.207350 0.731362 0.468459 0.818316 -5.819951 3.058365 -25.497442 -0.364857 -0.890390 26.363552 -0.405666 -0.279739 -0.000129 0.330689 -0.088644 0.442846 6.311384 -3.578702 -1.601789 1.718378 -3.716057 10.377161 3.749720 -3.616927 15.713515 4.782694 8.640299 10.450081 -12.011909 15.353668 -13.190159 -3.850189 -21.759279 -13.490373 -72.640694 -39.642048 18.165287 -17.126104 -26.735561 1.163237 -0.172690 -0.064552 0.536757 6.209223 8.137712 -15.045162 62.200516 27.879116 5.806174 24.360037 28.679926 3.186207 -0.530866 -0.145853 -0.050635 +0.101856 1.626541 -0.107631 -2.855600 -29.450518 6.683204 2.893708 -4.608005 -10.756348 -9.644609 1.004357 23.003426 -0.678482 0.338515 -0.217568 0.723085 0.447610 0.812042 -6.404965 2.954863 -27.601337 -0.203286 -1.163822 32.067871 -0.415417 -0.234679 -0.001782 0.300252 -0.119911 0.435331 6.261549 -3.621241 -0.182850 2.180018 -3.794796 10.020690 4.288009 -3.625567 14.534997 3.831196 7.921453 11.326707 -11.752654 14.255855 -13.344999 -6.215108 -21.321112 -12.427036 -69.406548 -37.072773 14.570958 -14.190797 -24.220568 0.088817 -0.131624 -0.084574 0.573870 6.855547 8.504256 -14.322910 58.582947 25.681368 3.904279 22.017820 23.576063 2.106881 -0.508782 -0.104326 -0.039798 +0.108980 1.623966 -0.105440 -2.723150 -27.932606 5.635265 2.712929 -4.813019 -10.472246 -10.119644 1.150131 24.116980 -0.673374 0.314505 -0.231421 0.718763 0.445225 0.801680 -6.691819 3.079387 -29.902905 0.070381 -1.444628 37.795067 -0.430214 -0.181526 -0.004979 0.281600 -0.141277 0.426583 6.789803 -3.691722 1.488590 2.592946 -3.780725 9.747213 4.403991 -3.533485 13.484839 2.744977 7.700224 12.089128 -11.140582 13.081986 -14.175436 -8.084806 -20.713964 -11.708460 -66.024620 -34.458389 11.332027 -11.020774 -21.438622 -0.841928 -0.097585 -0.121823 0.611253 7.555381 8.497947 -13.813388 55.422333 23.877342 2.475344 18.792103 18.776834 1.139875 -0.491107 -0.046234 -0.028338 +0.115295 1.621116 -0.102983 -2.495443 -26.280951 4.348070 2.442348 -5.055665 -10.023326 -10.582248 1.317064 25.364876 -0.672470 0.287845 -0.237984 0.715858 0.438845 0.791396 -6.766778 3.206179 -32.194660 0.263626 -1.714481 43.795910 -0.436268 -0.125258 -0.000960 0.266797 -0.157468 0.399156 7.112445 -3.866680 3.392800 2.979767 -3.884837 9.434582 4.469942 -3.548762 12.360051 1.561258 7.796877 12.856572 -10.119952 12.006000 -14.783854 -9.160623 -19.783697 -11.121583 -62.669003 -31.926392 8.742968 -8.672855 -19.054754 -1.357062 -0.052632 -0.162017 0.651091 8.535338 7.598685 -13.142087 52.223011 21.846369 0.988571 16.367065 16.431997 0.643504 -0.472848 0.007767 -0.031653 +0.121650 1.619529 -0.100139 -2.398540 -24.582956 2.902677 2.131619 -5.065949 -8.908701 -10.783195 1.434792 26.044443 -0.682050 0.250719 -0.257115 0.742176 0.457198 0.811764 -6.397417 3.647838 -34.433758 0.370956 -1.873216 49.838406 -0.459638 -0.072150 -0.004570 0.266195 -0.205717 0.383250 7.290061 -3.869615 5.479620 3.580310 -3.928139 9.217341 4.835080 -3.525605 11.416520 0.683580 7.435403 13.507328 -9.651917 10.950624 -16.168123 -9.879373 -18.907215 -10.701279 -59.599251 -29.748726 6.808343 -6.897329 -16.836237 -1.625901 0.007793 -0.188465 0.706273 8.602891 6.605799 -12.287846 49.425083 19.517731 -0.634265 13.037437 15.636235 0.109706 -0.459547 0.046651 -0.026176 +0.127928 1.618436 -0.096939 -2.208760 -23.385796 1.331861 1.790020 -5.037875 -7.601022 -11.237442 1.604962 26.510326 -0.681876 0.204592 -0.274475 0.763898 0.482873 0.828570 -6.042880 4.158489 -36.232037 1.036411 -2.243263 54.902790 -0.485143 -0.021191 -0.008208 0.265067 -0.254825 0.368472 7.415636 -3.840186 7.724665 4.146320 -3.938944 9.068166 5.089520 -3.467563 10.542577 -0.231859 7.442299 14.200356 -9.666759 10.348071 -17.698994 -10.695885 -17.898386 -10.264501 -56.126587 -27.516502 4.990882 -5.431382 -15.129548 -1.759436 0.064350 -0.213054 0.751027 8.596458 5.660647 -11.704353 46.838070 17.569216 -1.648499 9.836167 13.006682 -0.268956 -0.441483 0.084346 -0.014633 +0.134141 1.617359 -0.091877 -2.175047 -22.502855 -0.033394 1.442016 -5.004296 -6.335374 -11.580451 1.757685 27.042522 -0.647801 0.173622 -0.270630 0.772992 0.485825 0.838400 -5.459860 4.745141 -37.654560 1.706883 -2.655010 59.103065 -0.494912 0.001233 -0.009212 0.246123 -0.283816 0.372076 8.114553 -3.976257 9.545574 4.598077 -3.864997 8.910819 5.013246 -3.345956 9.754962 -1.001537 7.293248 14.474712 -9.936454 9.855046 -17.760483 -11.828453 -16.445377 -9.789140 -52.368984 -25.280626 3.461583 -4.625863 -13.554544 -1.701028 0.100089 -0.199133 0.755116 8.290041 4.392107 -11.157803 44.434635 15.724664 -2.269015 7.302358 9.910656 -0.422149 -0.412208 0.086069 0.011751 +0.139429 1.616919 -0.086962 -1.858540 -21.448971 -1.656369 0.888064 -5.126836 -5.047823 -12.242907 1.971118 27.952705 -0.615681 0.139276 -0.264203 0.781038 0.499090 0.826399 -4.752303 5.159188 -38.227467 2.341050 -3.057036 62.024246 -0.504690 0.024116 -0.009551 0.237936 -0.300295 0.366054 8.618409 -4.335685 11.381587 4.874151 -3.995136 8.851495 4.695196 -3.417089 9.072591 -2.195494 7.657135 14.549543 -9.631670 9.209462 -17.948116 -12.417798 -14.865746 -9.102456 -48.489285 -22.627131 1.870270 -3.348772 -12.978039 -1.758532 0.142590 -0.185488 0.757652 8.490059 3.146681 -10.875352 41.980942 14.299168 -2.710303 5.103944 6.871451 -0.438732 -0.384523 0.089374 0.032075 +0.145279 1.616399 -0.080703 -1.987689 -20.319613 -2.985504 0.706570 -5.149181 -3.575767 -12.617609 2.093268 28.402304 -0.621510 0.131086 -0.250697 0.766813 0.484197 0.815888 -3.668618 5.603782 -38.432129 3.418152 -3.815818 64.042374 -0.501132 0.053684 0.006717 0.230114 -0.293987 0.334956 9.512220 -4.957158 12.669002 5.109103 -4.244118 8.977954 4.303888 -3.544610 8.780342 -2.899643 8.002971 14.370511 -9.765591 8.928611 -18.517262 -11.988320 -12.979684 -8.505713 -45.862499 -20.219334 0.759443 -1.738338 -12.751713 -1.887986 0.161790 -0.231011 0.778745 7.048268 1.408308 -10.675583 40.771896 13.135155 -3.063498 3.419028 5.025157 -0.406247 -0.380247 0.124140 0.008445 +0.150405 1.616565 -0.074521 -1.894586 -18.880018 -4.391121 0.481657 -5.295700 -2.164596 -12.952045 2.166445 28.891436 -0.630033 0.142582 -0.253220 0.727329 0.426361 0.797037 -2.630907 5.739707 -37.904804 4.469209 -4.569435 64.450294 -0.483549 0.058387 0.006610 0.199678 -0.295886 0.324848 9.759647 -5.494516 13.911802 5.429357 -4.656223 9.024693 4.294415 -3.798410 8.361103 -3.074886 7.880970 14.327673 -10.304857 8.868049 -18.220480 -12.193139 -11.478036 -7.681106 -42.719383 -17.627207 -0.263942 -0.189310 -12.348225 -1.957202 0.160933 -0.247615 0.794794 5.803906 0.075581 -10.055680 39.129917 11.509327 -3.619625 1.621444 4.144966 -0.371325 -0.374193 0.143016 -0.011654 +0.154832 1.616904 -0.067995 -1.882743 -17.358936 -5.631904 0.137725 -5.501371 -0.916787 -12.694860 2.077723 29.550722 -0.627206 0.155013 -0.244108 0.699355 0.375096 0.788940 -1.516503 5.878325 -37.532955 5.978587 -5.575004 64.459106 -0.469407 0.064039 0.010145 0.170551 -0.292572 0.318183 9.886794 -5.959762 14.860575 5.715011 -5.003253 9.114919 4.414496 -4.008487 8.049731 -3.010254 7.480557 14.010108 -10.442042 8.661354 -17.830647 -11.740071 -9.412351 -7.007250 -40.645203 -15.243233 -1.102214 1.421734 -13.038127 -2.120101 0.162378 -0.254339 0.804854 4.065310 -1.720223 -9.502506 37.865334 9.886753 -4.142363 0.112870 3.768971 -0.336539 -0.365749 0.152017 -0.026651 +0.160417 1.617483 -0.060699 -1.887914 -15.910677 -6.742328 -0.618311 -5.646820 0.535678 -12.046301 1.813194 29.865625 -0.610213 0.168314 -0.226951 0.659603 0.324452 0.757086 -0.585518 5.865366 -37.233700 7.715429 -6.666444 63.780704 -0.452771 0.056697 0.015954 0.136990 -0.270471 0.319443 10.671004 -6.626561 15.513944 5.748904 -5.205064 9.258593 3.959971 -4.088583 7.821506 -2.948819 7.156615 13.324201 -10.562287 8.470918 -17.229403 -11.438228 -7.300696 -6.615018 -38.184170 -13.297992 -1.688035 2.497124 -13.812566 -2.190413 0.151661 -0.250631 0.795968 2.446911 -4.015463 -9.051552 36.803410 8.150711 -4.753599 -1.518933 4.348881 -0.365237 -0.355870 0.155265 -0.033555 +0.165915 1.616960 -0.052456 -1.490190 -14.574328 -7.540933 -1.759423 -5.829533 1.599605 -11.689550 1.616582 30.079950 -0.609239 0.211854 -0.205383 0.590290 0.226915 0.724539 0.065190 5.642805 -36.876362 9.463140 -7.560835 61.792778 -0.415422 0.042000 0.018199 0.091344 -0.233593 0.309348 11.077460 -6.996579 15.539642 5.708070 -5.314978 9.222696 3.738240 -4.055237 7.560711 -2.657047 6.570048 12.704834 -10.919835 8.463791 -15.690054 -10.987993 -5.187271 -6.401853 -36.524437 -11.817648 -2.097512 4.168013 -14.285155 -2.344460 0.118566 -0.264619 0.786008 0.686815 -6.502624 -8.381346 35.541290 6.082051 -5.362917 -2.860470 5.193972 -0.388392 -0.349154 0.162360 -0.068609 +0.171106 1.617882 -0.044561 -1.006073 -13.803840 -8.508443 -2.746237 -5.761288 3.084855 -11.968323 1.649002 29.830801 -0.621846 0.249213 -0.191296 0.527758 0.150228 0.693692 1.059205 5.777504 -36.152599 10.692547 -7.849844 59.134991 -0.378494 0.034080 0.030050 0.059990 -0.198980 0.290624 11.152011 -7.225734 15.588461 5.632852 -5.457507 9.456184 3.526150 -4.056798 7.710233 -2.530942 6.034244 12.079504 -11.756313 8.451816 -14.921094 -11.175639 -3.053476 -6.329702 -34.059891 -10.027780 -2.528913 5.571686 -15.767790 -2.540047 0.081960 -0.300600 0.777732 -0.203889 -8.401016 -8.051851 33.242374 4.668390 -5.617304 -3.848776 5.753705 -0.377522 -0.354285 0.184400 -0.106498 +0.176478 1.620728 -0.036729 -0.406610 -13.206940 -9.828917 -3.926695 -5.543361 5.001095 -11.975647 1.562431 29.236265 -0.605870 0.235404 -0.174646 0.501454 0.138229 0.670391 2.219491 5.904577 -34.555080 11.299890 -7.582111 55.713551 -0.365749 0.038043 0.048153 0.049649 -0.186592 0.270805 11.202026 -7.514512 15.726274 5.375001 -5.591716 9.919951 2.940408 -4.147343 8.114386 -2.081576 5.591244 11.877518 -12.220236 8.634819 -14.657080 -12.036433 -1.674009 -6.001417 -30.690527 -7.703784 -3.032579 7.436668 -18.564142 -2.906068 0.079899 -0.318285 0.762967 -0.570418 -9.385583 -7.559289 31.135132 3.161576 -5.824035 -5.063494 6.330867 -0.398877 -0.347763 0.193552 -0.116251 +0.181585 1.623493 -0.028030 0.276213 -12.243917 -10.925541 -5.044120 -5.461626 6.484826 -12.113650 1.485913 28.846609 -0.622692 0.252239 -0.177419 0.513717 0.135079 0.688628 3.152166 5.742441 -32.748402 11.320073 -7.014176 51.762642 -0.364545 0.028658 0.038032 0.058784 -0.189687 0.273278 11.138654 -7.884581 14.951833 5.003368 -5.947675 10.527719 2.451710 -4.471189 9.198942 -2.240231 5.349474 11.703313 -12.293002 8.299742 -14.648385 -12.094965 -0.320884 -5.883162 -28.073393 -5.768735 -3.212739 8.910892 -19.257002 -3.104298 0.079176 -0.309282 0.767407 0.014648 -10.083215 -7.654359 28.080332 2.456949 -5.655083 -6.328747 5.859103 -0.365277 -0.353820 0.178416 -0.123510 +0.187703 1.625849 -0.019384 0.948997 -11.169830 -12.090234 -6.205921 -5.487468 7.750029 -12.270072 1.400043 28.896019 -0.614251 0.254936 -0.174718 0.524315 0.147737 0.685233 3.936343 5.381242 -30.783531 11.288417 -6.469450 47.540325 -0.366559 0.013733 0.030338 0.066280 -0.185210 0.285442 11.497007 -8.432092 14.508771 4.575527 -6.238729 11.029610 1.642748 -4.743938 9.940915 -2.526060 5.175299 11.113753 -12.130023 7.805564 -14.652235 -12.238344 0.929030 -5.919174 -25.380159 -4.183997 -3.190051 9.866738 -19.473000 -3.134611 0.078861 -0.281435 0.751820 0.236508 -10.990725 -7.711123 25.326334 1.746981 -5.389225 -7.042243 5.636880 -0.329813 -0.351790 0.156201 -0.110504 +0.193065 1.626720 -0.009959 1.516709 -10.182038 -12.921791 -7.064865 -5.638588 8.497404 -12.987692 1.524318 29.409908 -0.598530 0.237255 -0.183489 0.540163 0.167509 0.695151 4.908900 5.088339 -28.563667 11.085308 -5.740803 42.433559 -0.371213 0.007427 0.024585 0.068714 -0.207223 0.298049 11.417262 -8.636563 13.968605 4.485554 -6.467214 11.234585 1.521598 -4.931324 10.365324 -2.464418 4.806523 11.110563 -12.440313 7.651311 -14.648966 -11.645477 1.991255 -5.863386 -24.028017 -3.135989 -3.148629 10.323083 -18.225908 -2.946486 0.087290 -0.250448 0.738480 -0.959873 -11.958897 -7.447312 23.567247 0.935212 -5.259473 -7.842466 5.129245 -0.262309 -0.344164 0.136116 -0.084886 +0.197682 1.624875 -0.001072 1.953781 -9.176653 -13.187037 -7.526330 -5.930067 8.515532 -14.109015 1.814248 30.256285 -0.604168 0.249534 -0.170041 0.532370 0.156245 0.691577 5.666242 4.769866 -26.777435 11.231659 -5.129622 36.885464 -0.357742 -0.007828 0.036477 0.071792 -0.190712 0.287566 11.503110 -8.733062 12.791336 4.297537 -6.545551 11.291996 1.375769 -4.975177 10.847047 -2.383180 4.415726 10.993388 -12.934181 7.620457 -13.793324 -10.655560 2.977595 -5.967607 -22.697716 -2.777072 -2.927337 9.957746 -16.833422 -2.644819 0.076326 -0.257731 0.725798 -2.167334 -13.120697 -7.042492 21.803942 -0.052955 -5.041074 -7.735918 5.238700 -0.248794 -0.352818 0.124083 -0.100952 +0.202215 1.622447 0.008235 2.448682 -8.356561 -13.450181 -7.877079 -6.188453 8.431261 -15.576659 2.252379 31.159008 -0.598571 0.254664 -0.154423 0.539586 0.167877 0.695055 6.516151 4.564859 -24.830172 10.912866 -4.308444 31.196280 -0.354991 -0.026848 0.038192 0.084091 -0.174946 0.286965 11.573364 -8.923255 11.627342 3.975466 -6.685982 11.402855 1.041291 -5.135677 11.418332 -2.181147 4.167827 10.772692 -13.010827 7.578401 -13.137735 -10.077913 4.352905 -6.223819 -21.219194 -2.141149 -2.757571 9.944093 -16.126392 -2.469346 0.069230 -0.247309 0.704824 -2.731207 -14.117768 -7.233391 19.786867 -0.068752 -4.672304 -8.087139 5.048856 -0.261509 -0.354468 0.098691 -0.103191 +0.206801 1.619516 0.016788 2.786683 -7.637924 -13.842036 -8.103809 -6.427369 8.446346 -16.739782 2.635273 32.203377 -0.592900 0.252512 -0.166239 0.553172 0.191362 0.688646 7.454468 4.416574 -22.449331 10.176303 -3.389392 25.191154 -0.353870 -0.053241 0.034468 0.095390 -0.178290 0.306808 11.792910 -9.076713 10.506375 3.685543 -6.803295 11.677050 0.640462 -5.262598 12.224933 -2.152959 4.107105 10.590669 -13.219475 7.525066 -12.941433 -9.822303 5.423920 -6.269403 -19.306263 -1.167899 -2.527622 9.634776 -16.665014 -2.404252 0.056142 -0.206853 0.678734 -2.770318 -14.699391 -7.437585 17.794374 0.024914 -4.264306 -8.372012 5.305501 -0.306069 -0.364081 0.069364 -0.078687 +0.211816 1.615256 0.025531 3.174287 -6.853773 -14.296515 -8.387883 -6.648635 8.555002 -18.129774 3.115965 33.321651 -0.569421 0.241591 -0.161353 0.576049 0.227869 0.694772 8.175173 4.123074 -20.040339 9.147344 -2.592812 19.726526 -0.372583 -0.065819 0.032260 0.104084 -0.181297 0.334243 11.961381 -9.134136 9.740479 3.471229 -6.830770 11.823802 0.264697 -5.294850 12.673656 -1.842391 3.666550 10.645670 -13.441114 7.366487 -13.118397 -9.513453 6.524550 -6.731490 -17.901108 -1.097103 -2.321706 9.492599 -16.394730 -2.287619 0.055952 -0.179758 0.661451 -3.781359 -15.804683 -7.406123 16.705795 -0.257333 -4.038604 -8.600548 6.224546 -0.384813 -0.360754 0.048516 -0.047453 +0.216224 1.608040 0.035131 4.024562 -5.872289 -14.642283 -9.198136 -6.860587 8.581141 -19.530458 3.640507 34.533554 -0.579719 0.253971 -0.155659 0.546840 0.207574 0.676913 8.536102 3.700110 -17.784891 7.390490 -1.835848 14.727482 -0.353685 -0.065003 0.039600 0.103787 -0.159785 0.313112 11.468879 -8.959882 9.120256 3.207470 -6.883799 11.685587 0.094433 -5.330815 12.655455 -1.645102 3.692533 10.653983 -13.556220 7.550326 -12.820971 -8.396857 7.524016 -7.196652 -16.704649 -1.651066 -2.020716 8.377947 -14.339320 -1.900223 0.035184 -0.212803 0.651831 -5.057623 -17.278666 -7.363119 15.874871 -0.451871 -3.816604 -8.187613 7.389155 -0.448485 -0.365736 0.065905 -0.071869 +0.220202 1.600242 0.045119 4.652291 -4.303390 -15.109838 -9.622871 -7.251557 8.833234 -20.994297 4.199568 35.949417 -0.598364 0.258581 -0.167188 0.547445 0.215617 0.683633 8.627649 3.233695 -15.915921 5.674345 -1.375939 11.181055 -0.347103 -0.066404 0.036311 0.117678 -0.159872 0.303920 11.206360 -9.162292 8.149042 2.664571 -7.193390 11.761765 -0.441466 -5.649238 13.152406 -1.220223 3.763769 10.648293 -13.470514 7.756055 -13.140706 -7.481570 8.353357 -7.507329 -14.938253 -1.851918 -1.652692 6.814520 -12.610357 -1.557185 0.021610 -0.222909 0.648065 -5.657560 -18.414675 -7.735792 15.230223 -0.335267 -3.684000 -8.878238 7.703172 -0.504095 -0.376232 0.069974 -0.080859 +0.224374 1.591745 0.054602 5.171485 -3.457431 -15.370790 -9.825744 -7.448458 8.913004 -22.667845 4.944061 37.109230 -0.591631 0.253804 -0.164216 0.557258 0.228446 0.684968 8.518587 2.939024 -14.829436 4.944679 -1.191964 9.281343 -0.343713 -0.077966 0.040118 0.125604 -0.158084 0.305579 11.167620 -9.222609 7.832871 2.365947 -7.227389 11.530937 -0.845358 -5.731473 12.915031 -0.981042 3.773301 10.388954 -13.276467 7.836535 -12.853318 -6.722301 9.333761 -7.985518 -13.801444 -2.412543 -1.430594 6.226957 -11.007538 -1.342433 0.021177 -0.204437 0.634001 -6.706178 -19.608217 -7.942707 14.592486 -0.076018 -3.491260 -9.746717 8.378202 -0.583484 -0.378160 0.050233 -0.074835 +0.228646 1.584113 0.061967 4.831555 -2.748364 -15.783571 -9.225907 -7.776366 8.926030 -24.031298 5.731648 38.716942 -0.597881 0.277068 -0.165818 0.534448 0.198134 0.663393 8.674477 2.893362 -14.287873 5.410257 -1.265435 8.954817 -0.324279 -0.096132 0.043077 0.114325 -0.140422 0.309628 11.981267 -9.557547 8.165059 2.365206 -7.284143 11.348562 -1.261078 -5.744738 12.413712 -1.155864 3.925361 9.609926 -13.480472 7.815515 -12.445586 -6.881211 9.920022 -8.470833 -12.467811 -2.588734 -1.232047 5.971716 -9.312444 -1.180564 -0.004238 -0.194875 0.619768 -7.286872 -20.409159 -7.970345 13.427250 0.127721 -3.174537 -10.771729 9.433916 -0.667027 -0.388629 0.045664 -0.080765 +0.232411 1.577109 0.067838 4.144207 -2.425409 -15.781723 -8.203087 -7.968066 8.519644 -25.089634 6.510585 40.094185 -0.579136 0.307647 -0.131935 0.487959 0.144525 0.630558 8.906473 3.192267 -15.039022 6.293676 -1.476150 10.436006 -0.305540 -0.118252 0.055447 0.083143 -0.092260 0.315156 13.385659 -9.779045 7.938061 2.355916 -7.076808 11.100707 -1.788212 -5.547588 12.016577 -0.932139 3.678276 9.006067 -13.877441 7.967982 -11.015976 -7.067632 9.342567 -8.069016 -10.995346 -2.142030 -1.045620 5.361242 -7.672340 -1.006917 -0.037122 -0.205235 0.597120 -8.266223 -19.996689 -7.042833 12.910398 -0.900626 -3.110002 -12.091113 10.091917 -0.735080 -0.384823 0.044058 -0.095253 +0.236132 1.572569 0.070964 3.597286 -2.611845 -16.187992 -7.489793 -7.887073 8.349902 -25.800768 7.256255 41.346813 -0.531356 0.278513 -0.124628 0.488078 0.154872 0.620352 8.746735 3.552403 -16.098890 7.686231 -1.858089 13.307311 -0.310598 -0.125455 0.055216 0.066379 -0.104139 0.333931 14.335569 -9.991561 8.815681 2.481429 -6.824279 11.091916 -2.123575 -5.359133 11.562819 -0.885094 3.771662 8.164620 -14.169802 8.207080 -10.830535 -7.799534 8.883418 -7.355741 -9.854422 -0.736476 -0.935953 5.340904 -7.290670 -0.889146 -0.027120 -0.160519 0.570353 -8.677763 -19.193880 -6.446342 12.455900 -1.332025 -3.024599 -13.342148 10.396764 -0.788946 -0.361597 0.021108 -0.057897 +0.238442 1.569771 0.073238 3.347018 -2.652537 -16.740406 -7.375207 -7.711689 8.383319 -25.727104 7.586590 42.271820 -0.463973 0.230246 -0.111409 0.505858 0.181223 0.617479 8.021312 3.660187 -16.761732 9.231949 -2.305269 15.797264 -0.325900 -0.115557 0.060151 0.049510 -0.127910 0.352130 14.189692 -9.782053 10.172961 2.975234 -6.529137 10.956674 -1.669143 -5.116862 10.777116 -1.200501 3.797822 8.106646 -14.033078 8.104652 -10.478606 -7.993258 8.264083 -6.661626 -10.299190 0.147855 -1.115474 5.471440 -6.472231 -0.790633 0.010795 -0.111835 0.550053 -9.272883 -18.396490 -5.630602 12.047355 -2.115676 -2.988931 -14.155423 10.398777 -0.760044 -0.324367 -0.001117 -0.007940 +0.239300 1.567968 0.073541 3.232635 -2.714440 -17.350124 -7.334579 -7.424700 8.558422 -25.526226 7.887050 43.080967 -0.447463 0.204414 -0.111069 0.502641 0.172903 0.606165 7.340649 3.785547 -17.041624 10.449183 -2.607938 17.317030 -0.324861 -0.094518 0.060861 0.035556 -0.140497 0.337043 13.701658 -9.486518 12.066614 3.393023 -6.236355 10.768343 -1.294028 -4.821706 9.665657 -1.459673 4.129537 8.364676 -13.016049 7.899854 -10.193143 -7.596145 7.995392 -6.292735 -11.293535 0.554614 -1.373175 5.006302 -4.492879 -0.680459 0.045295 -0.104305 0.563128 -10.157625 -17.852879 -5.125590 12.633853 -2.311388 -3.170700 -14.824760 10.544926 -0.756092 -0.304272 0.005752 -0.005393 +0.238564 1.566532 0.074194 3.325954 -2.423187 -17.376730 -7.334501 -7.138654 8.343206 -25.127584 8.075340 43.822269 -0.447108 0.171137 -0.127983 0.516570 0.187323 0.621114 6.550024 3.865166 -17.312525 11.427946 -2.741930 17.661400 -0.331139 -0.075508 0.056071 0.035816 -0.177751 0.325450 13.008883 -8.993628 12.844796 3.521046 -5.916663 10.562853 -1.005907 -4.542493 9.142510 -1.138466 3.693968 8.605086 -12.772305 7.698024 -10.650091 -7.479589 7.651973 -6.116244 -11.652186 0.886873 -1.537213 3.645853 -1.769328 -0.583025 0.076684 -0.096917 0.578621 -10.745539 -17.122847 -4.673400 13.821847 -2.803336 -3.496293 -15.482805 10.930993 -0.831296 -0.294332 0.009093 0.003584 +0.239153 1.566843 0.075885 3.421980 -2.739570 -16.814859 -7.461777 -6.667479 7.809859 -24.639397 8.146693 43.947014 -0.430532 0.148933 -0.102314 0.533586 0.205458 0.645152 6.055876 4.020766 -17.621496 12.238129 -2.710548 17.189711 -0.336762 -0.067415 0.065153 0.047211 -0.185195 0.305626 12.452289 -8.537021 12.897413 3.652378 -5.638501 10.291553 -0.624201 -4.363271 8.798929 -0.895484 3.114164 8.706623 -13.015443 7.644840 -10.131007 -7.753488 8.381293 -6.008514 -12.298010 1.854503 -1.687602 2.822390 -1.896179 -0.552010 0.108215 -0.106698 0.577784 -11.160137 -16.421246 -4.610118 14.126824 -1.905852 -3.442018 -15.352974 11.317345 -0.952855 -0.276235 -0.006753 -0.006018 +0.239177 1.568809 0.075778 3.635858 -2.996314 -16.444433 -7.990368 -6.281932 7.378393 -23.796600 7.970345 44.079601 -0.443616 0.148955 -0.098127 0.547156 0.214189 0.665587 5.968394 4.145527 -17.386885 12.070896 -2.459974 16.260868 -0.335538 -0.061054 0.062121 0.063255 -0.192392 0.288797 11.827845 -8.069633 12.835941 3.734097 -5.432897 10.364620 -0.277183 -4.170524 9.002407 -1.296627 2.593288 8.650102 -13.169559 7.001642 -10.244490 -8.438615 9.182777 -6.225212 -12.940074 2.511759 -1.765737 2.479276 -3.195770 -0.586702 0.122088 -0.121010 0.583306 -10.258843 -15.881330 -4.890172 13.244956 -0.917805 -3.141329 -14.945401 12.025268 -1.090425 -0.274869 -0.010445 -0.019491 +0.237855 1.571667 0.074308 3.742484 -3.022104 -16.182823 -8.155717 -5.972003 7.115982 -23.271181 7.831366 43.896961 -0.454370 0.166697 -0.093497 0.549135 0.199649 0.676859 6.399158 4.287436 -16.850082 11.069496 -2.047534 14.816210 -0.340110 -0.047780 0.054480 0.059340 -0.188815 0.287366 11.079630 -7.701436 12.968838 3.806796 -5.352726 10.448554 0.070969 -4.042615 9.084357 -1.837973 2.108558 9.006285 -12.976683 6.125064 -10.396426 -8.787158 9.857566 -6.270024 -14.229845 3.270169 -1.998384 3.380275 -4.951536 -0.670378 0.126871 -0.138003 0.599859 -9.521758 -15.276771 -5.001869 12.978760 -0.229275 -3.026392 -14.286368 13.509858 -1.280340 -0.273381 0.003472 -0.028202 +0.237874 1.574979 0.073350 3.916366 -2.999098 -15.497661 -8.379184 -5.687141 6.592358 -22.912998 7.669127 43.419495 -0.474225 0.205595 -0.103315 0.518960 0.159867 0.626114 6.770722 4.265765 -16.439150 9.820209 -1.645097 12.761703 -0.324324 -0.066942 0.048884 0.046597 -0.155477 0.297358 10.853627 -7.473538 12.355332 3.533782 -5.250336 10.355438 -0.090546 -3.914981 9.207302 -2.497175 2.057365 9.405300 -12.175316 5.221722 -9.648104 -9.085279 10.289204 -6.179782 -15.580684 4.047948 -2.249991 5.602591 -7.238420 -0.863319 0.100241 -0.130031 0.599009 -8.066611 -14.656738 -5.179974 12.438390 0.248389 -2.882872 -13.990202 15.914768 -1.600016 -0.292725 0.011596 -0.037084 +0.237441 1.578211 0.070620 3.966943 -2.758923 -14.997231 -8.255903 -5.275952 6.219133 -22.613592 7.577706 42.818169 -0.486116 0.206624 -0.111840 0.507172 0.149262 0.588332 7.219385 4.358348 -16.288055 8.392530 -1.305886 11.431644 -0.322421 -0.045340 0.054456 0.039325 -0.143085 0.286862 11.052332 -7.310450 12.500518 3.238065 -4.955773 10.136659 -0.594737 -3.594270 8.804580 -3.663041 2.154204 9.779023 -11.004403 4.005689 -10.240213 -8.505431 10.448475 -5.773791 -18.117880 4.637877 -2.785499 6.715659 -8.673582 -1.064377 0.112852 -0.150194 0.621550 -7.738446 -13.803526 -4.988966 13.479264 0.211893 -3.157707 -13.342627 17.015072 -1.690594 -0.298428 0.048389 -0.043107 +0.237398 1.579882 0.068655 3.915880 -1.910652 -14.186563 -8.201230 -5.107973 5.733835 -22.151482 7.343387 42.362785 -0.511901 0.222026 -0.109240 0.485651 0.130104 0.557590 7.463756 4.280293 -16.385405 7.268109 -1.066722 9.818549 -0.300969 -0.027601 0.069566 0.044621 -0.111182 0.250634 11.261729 -7.288606 11.584753 2.795177 -4.878383 9.998405 -1.089216 -3.528922 8.968927 -4.448556 2.584807 9.904210 -9.842669 3.384850 -10.298676 -7.812850 10.518723 -5.223654 -20.149229 5.139461 -3.193446 7.856315 -11.169394 -1.391444 0.107171 -0.194572 0.631180 -6.759946 -12.934830 -5.323911 13.938816 1.061456 -3.255354 -12.383081 17.219070 -1.687908 -0.312584 0.083752 -0.078546 +0.236360 1.581114 0.064963 3.929877 -0.941418 -13.533870 -7.996876 -4.990278 5.135885 -21.927469 7.293117 42.274246 -0.549865 0.234974 -0.117861 0.492396 0.136284 0.549065 7.582891 4.309534 -16.800430 6.249775 -0.886080 8.812644 -0.297516 -0.018000 0.073336 0.065061 -0.097271 0.230101 10.937512 -7.263999 11.058602 2.400058 -4.923978 10.019734 -1.322454 -3.577488 9.265025 -5.040269 3.045179 9.654984 -8.846375 2.926775 -11.206724 -7.393446 10.881449 -5.031012 -22.179565 5.405029 -3.609457 8.773015 -13.110270 -1.729870 0.110542 -0.218408 0.653744 -5.507053 -12.225116 -6.204278 14.523633 2.753454 -3.305740 -11.148066 16.988642 -1.627354 -0.333915 0.102853 -0.105414 +0.234845 1.581649 0.060721 3.986720 0.293346 -12.739963 -7.654302 -4.882473 4.416079 -21.998569 7.350576 42.115250 -0.547735 0.250104 -0.097882 0.497172 0.134265 0.534943 7.582975 4.293560 -17.427608 5.116940 -0.724834 7.756304 -0.291911 -0.022962 0.084830 0.069134 -0.063990 0.225600 10.813659 -7.430016 10.891404 1.969849 -4.983264 9.676713 -1.745103 -3.714412 8.829390 -5.708045 3.450609 9.289143 -7.832101 2.426238 -10.875951 -7.104867 11.702751 -5.084884 -23.953802 5.307051 -3.929873 8.978323 -14.319538 -1.925886 0.110809 -0.216004 0.649272 -4.346658 -11.749608 -7.279705 15.521336 4.790210 -3.314195 -9.785967 16.417763 -1.509638 -0.339683 0.096390 -0.114652 +0.233412 1.581572 0.055803 3.775319 1.672165 -11.777369 -7.033292 -4.788127 3.521564 -22.137239 7.445682 41.968452 -0.515993 0.230168 -0.089332 0.507043 0.161869 0.500739 7.698678 4.313052 -18.264874 4.180147 -0.594026 6.658639 -0.287723 -0.032990 0.084378 0.080215 -0.046340 0.222400 11.285539 -7.720548 10.262361 1.398567 -4.948231 9.393126 -2.533347 -3.817032 8.643242 -6.390893 4.103488 8.806616 -6.189029 1.904761 -10.325876 -6.523434 12.216082 -4.812400 -25.931305 5.195932 -4.311809 8.751471 -15.619110 -2.088205 0.126039 -0.166522 0.616119 -3.088890 -11.064935 -8.197205 16.603577 6.510370 -3.252963 -7.919317 15.592102 -1.325857 -0.327689 0.067163 -0.094621 +0.230897 1.580863 0.050187 4.015799 3.678971 -10.785007 -6.931099 -4.929534 2.397871 -21.978741 7.430902 42.452541 -0.477851 0.208516 -0.066912 0.530927 0.204815 0.492551 7.210684 4.170346 -19.322847 3.342558 -0.494656 5.710546 -0.292831 -0.040698 0.091523 0.097800 -0.031054 0.223175 10.415236 -7.448551 9.125325 1.036125 -4.891435 9.295308 -2.451778 -3.881030 9.031610 -6.138915 3.527831 8.738290 -4.978232 1.146277 -9.697126 -6.564608 12.156527 -4.697127 -27.791201 4.649632 -4.682385 8.688181 -17.831499 -2.418213 0.138719 -0.133231 0.580192 -1.508436 -10.180712 -8.818911 17.569128 7.265364 -3.296164 -6.512549 14.376296 -1.200077 -0.317080 0.034944 -0.071596 +0.229337 1.580562 0.044019 4.110227 5.690945 -10.244308 -6.929873 -5.036515 1.840681 -21.676477 7.306552 42.726692 -0.495579 0.220861 -0.066152 0.528701 0.203812 0.481851 6.676253 3.980944 -19.938200 2.722808 -0.462652 4.965367 -0.286320 -0.041199 0.094890 0.107734 -0.015076 0.212900 10.124492 -7.383855 8.667751 0.654095 -4.869855 9.284740 -2.775603 -3.868451 9.219626 -6.245075 2.965687 8.491001 -4.417862 0.373769 -10.003896 -7.289856 11.837891 -4.838820 -28.685011 4.091335 -4.803697 8.299001 -20.205982 -2.751060 0.133615 -0.147711 0.582997 -0.020337 -9.361313 -9.387289 18.991123 7.890006 -3.470946 -5.426448 13.439445 -1.115033 -0.329365 0.042717 -0.086118 +0.227885 1.580740 0.036558 3.989285 7.949725 -9.934842 -7.068533 -5.204543 1.643520 -20.526823 6.693830 42.749378 -0.508891 0.215092 -0.072599 0.543176 0.224990 0.481077 6.195630 3.750312 -20.308958 2.124880 -0.445103 4.174116 -0.292244 -0.030613 0.096160 0.123765 -0.016537 0.204749 10.131637 -7.436130 8.328128 0.316831 -4.869542 9.379216 -3.204801 -3.871868 9.497863 -6.320107 2.476312 8.564158 -3.651485 -0.358465 -10.802533 -8.144701 11.110174 -5.017533 -29.684099 3.367062 -4.971554 8.151765 -21.797413 -3.052512 0.144774 -0.157932 0.594302 1.288811 -8.415938 -9.779671 20.788771 8.305515 -3.690272 -4.315142 12.585699 -1.044921 -0.337616 0.052764 -0.089072 +0.226155 1.581065 0.028907 3.769262 10.142946 -9.510277 -6.915069 -5.322228 1.394679 -19.605961 6.208193 42.629673 -0.510372 0.215335 -0.076032 0.543365 0.226132 0.487787 5.713652 3.548740 -20.770416 1.664305 -0.443494 3.353856 -0.290367 -0.026321 0.090741 0.126217 -0.022510 0.201783 10.316546 -7.432814 8.029937 0.058176 -4.764056 9.331895 -3.617023 -3.772039 9.562066 -6.183808 1.687234 8.672363 -3.677676 -0.877481 -10.900681 -9.766968 10.159907 -5.444710 -30.188738 2.365940 -5.018300 8.369763 -23.435642 -3.397267 0.143089 -0.161792 0.589737 2.599916 -7.522945 -9.998303 22.741796 8.443540 -3.925492 -3.408916 12.107288 -1.021405 -0.335550 0.055184 -0.087100 +0.222817 1.580833 0.020355 3.618756 12.252890 -9.076368 -6.690907 -5.411732 1.122130 -18.549414 5.688759 42.417320 -0.538027 0.242453 -0.073322 0.554020 0.229933 0.479347 4.936792 3.344814 -21.383074 1.699067 -0.449997 2.620759 -0.284977 -0.039939 0.098484 0.144329 0.004372 0.199168 9.816666 -6.962046 7.528543 -0.039398 -4.484248 9.457363 -3.540447 -3.473099 9.998437 -6.029660 0.806877 8.952204 -2.826485 -1.948157 -10.763220 -11.109665 9.095212 -6.498713 -30.926548 0.077262 -4.825849 7.688038 -24.054075 -3.533066 0.132304 -0.169422 0.593304 4.921353 -6.842754 -10.428096 23.844744 8.481438 -4.067387 -2.322381 12.109526 -1.006630 -0.362359 0.050860 -0.103329 +0.219574 1.580364 0.011425 3.550957 14.287050 -8.726614 -6.379864 -5.428999 0.794932 -17.746920 5.337739 42.294090 -0.535887 0.226656 -0.084761 0.580355 0.268597 0.482841 4.350528 3.155591 -21.945658 1.090674 -0.427852 1.924945 -0.299845 -0.040489 0.085117 0.164848 -0.009739 0.206339 9.103741 -6.473783 7.299942 -0.109634 -4.198224 9.543425 -3.346781 -3.215122 10.306419 -5.728807 -0.407918 9.457000 -2.026471 -3.029159 -11.204853 -12.260705 8.086427 -7.409365 -32.157204 -2.181705 -4.767282 6.970241 -24.860491 -3.664497 0.148826 -0.147639 0.590159 6.565689 -5.866500 -10.769029 25.746321 8.863983 -4.256690 -1.788428 11.721493 -1.041462 -0.361173 0.037906 -0.084140 +0.216007 1.578797 0.002593 3.490875 16.290594 -8.369267 -6.123561 -5.512448 0.225715 -16.835335 4.993694 42.538658 -0.529575 0.207246 -0.086186 0.615729 0.312163 0.498897 3.516533 3.003710 -22.705107 0.668865 -0.408122 1.784638 -0.314774 -0.037352 0.088549 0.183948 -0.024658 0.213033 8.206921 -5.884849 7.235759 -0.100704 -3.860188 9.605570 -2.969213 -2.920262 10.506064 -5.384141 -1.912697 9.630924 -1.621377 -4.116765 -11.796526 -13.357919 6.874176 -8.138259 -33.406586 -4.287539 -4.698488 5.737362 -26.136980 -3.716217 0.166870 -0.136341 0.588231 7.898942 -4.715439 -10.719953 27.507015 9.022906 -4.338861 -0.610406 11.896057 -1.024677 -0.364636 0.026022 -0.063349 +0.212224 1.577393 -0.006190 3.340810 18.523157 -8.042706 -5.865916 -5.697076 -0.416960 -15.923670 4.634014 42.836346 -0.536444 0.210563 -0.089110 0.599900 0.297343 0.479028 2.465173 2.803395 -23.360516 0.585940 -0.401643 1.831574 -0.303996 -0.036967 0.085269 0.181694 -0.016078 0.199682 7.528837 -5.509830 7.462965 -0.149009 -3.666417 9.473260 -2.767115 -2.749368 10.227280 -5.084553 -2.815793 9.776386 -0.847751 -4.947966 -11.539871 -14.476995 5.471475 -8.519284 -34.511204 -5.950130 -4.605996 4.380730 -27.435734 -3.686648 0.166957 -0.139515 0.586323 9.410004 -3.304622 -10.528950 29.007563 9.310977 -4.369510 0.753923 12.473527 -0.974835 -0.365232 0.031272 -0.074194 +0.207780 1.576716 -0.015326 3.287005 20.838064 -7.844714 -5.518689 -5.826994 -0.980344 -15.070426 4.300341 42.896290 -0.534537 0.212007 -0.085149 0.596286 0.289448 0.476515 1.264955 2.684575 -24.172754 0.426945 -0.366344 2.753053 -0.300671 -0.028023 0.083905 0.178467 -0.011404 0.191490 6.621900 -5.139517 7.803907 -0.199702 -3.535221 9.445150 -2.494071 -2.652894 10.059346 -4.773354 -3.821144 10.110120 -0.015896 -5.843062 -11.397410 -15.678273 3.577830 -8.493804 -35.572437 -7.095898 -4.682981 3.000078 -29.461643 -3.713570 0.172351 -0.146007 0.587641 11.145553 -1.264125 -10.237552 30.348742 9.749285 -4.419700 1.657949 12.984951 -0.966791 -0.360956 0.037398 -0.078080 +0.202620 1.577025 -0.024810 3.256681 22.984734 -7.872527 -5.162873 -5.859348 -1.408191 -14.382940 4.094215 42.937103 -0.539098 0.207744 -0.082608 0.600674 0.291186 0.468888 -0.207190 2.664389 -25.038120 0.797997 -0.322369 4.699804 -0.302919 -0.010965 0.090315 0.180230 -0.005879 0.179071 5.797762 -4.752203 8.556449 -0.271644 -3.353103 9.426964 -2.341650 -2.505987 9.730827 -4.784332 -4.614678 10.739384 1.244864 -6.861841 -11.686688 -16.594900 1.732789 -8.498295 -36.596138 -8.472041 -4.625274 1.232092 -31.370882 -3.566630 0.189349 -0.161561 0.603688 12.708038 1.014437 -10.021794 31.675770 10.688722 -4.352881 2.392825 12.995306 -0.928877 -0.362566 0.053165 -0.085564 +0.197631 1.578051 -0.033862 2.829273 25.304111 -7.843194 -4.616441 -5.980406 -2.100504 -13.393435 3.729141 42.964241 -0.530055 0.178920 -0.086158 0.605119 0.311920 0.469364 -1.889207 2.667138 -26.108799 1.948417 -0.339328 6.981335 -0.311025 0.009784 0.090043 0.183934 -0.022455 0.166879 5.214069 -4.490573 9.074948 -0.133009 -3.294852 9.350096 -1.899279 -2.502079 9.444696 -4.713366 -5.866538 11.395557 1.495125 -7.722886 -12.131602 -17.307749 0.277800 -8.493655 -38.308933 -10.029378 -4.505558 -0.954443 -33.294331 -3.227742 0.209214 -0.176359 0.606336 13.183927 3.151016 -9.768736 33.386993 11.832898 -4.183924 3.019323 13.261099 -0.913734 -0.352236 0.068232 -0.076462 +0.193223 1.579373 -0.042578 2.484049 27.977200 -7.751638 -4.311097 -6.176940 -2.884927 -12.196054 3.263193 43.070892 -0.541206 0.169968 -0.093550 0.598434 0.308080 0.448574 -3.990055 2.576065 -27.252754 3.420485 -0.471439 9.995322 -0.312175 0.030379 0.093349 0.182591 -0.019568 0.149795 4.723536 -4.344171 9.331675 -0.129103 -3.378669 9.279859 -1.612962 -2.613530 9.213121 -4.821572 -6.535404 12.433414 2.953179 -8.676460 -12.525736 -17.024481 -0.717313 -8.231140 -41.065678 -11.602469 -4.369796 -2.967537 -36.218510 -3.001929 0.227194 -0.198091 0.630069 13.138674 5.245288 -9.554245 35.690285 13.279067 -3.963859 3.592250 13.918047 -0.905734 -0.354573 0.095316 -0.088315 +0.189072 1.581584 -0.049957 1.865449 30.718611 -7.708497 -3.815501 -6.392940 -3.783800 -10.971092 2.815003 43.304989 -0.534970 0.167854 -0.084985 0.606785 0.311432 0.452643 -6.223923 2.558901 -28.502472 5.851733 -0.823917 13.767307 -0.316229 0.043373 0.094435 0.182772 -0.014767 0.144054 4.592986 -4.333395 9.320169 -0.114940 -3.472768 9.247038 -1.439753 -2.778500 9.155622 -4.868971 -7.447747 13.027915 3.870798 -9.664237 -12.613807 -17.200693 -1.608177 -8.112102 -43.106060 -13.259000 -4.006097 -5.770580 -39.520477 -2.308715 0.240749 -0.203619 0.634872 13.289014 7.497856 -9.622794 37.697971 15.197155 -3.475591 4.001468 13.937556 -0.895281 -0.348751 0.100176 -0.087928 +0.183434 1.586262 -0.058541 1.354488 33.492352 -8.010381 -3.657483 -6.613099 -4.373858 -9.373219 2.160142 43.303696 -0.573775 0.160410 -0.114128 0.631004 0.333316 0.470132 -8.697450 2.512557 -29.453897 9.226365 -1.555251 18.160492 -0.334760 0.066750 0.087823 0.200052 -0.042485 0.139982 4.095198 -4.177905 10.162710 0.115392 -3.627291 9.343244 -0.937899 -2.929913 9.061774 -4.925704 -8.555503 13.678267 4.634355 -10.417125 -14.409803 -18.023531 -3.492726 -7.916337 -44.503078 -14.743550 -3.742747 -8.245678 -43.131371 -1.610453 0.262669 -0.227501 0.681649 13.618281 10.377492 -9.356873 38.796154 16.679996 -3.279438 4.152055 15.609466 -0.961879 -0.365449 0.127999 -0.095035 +0.176217 1.592012 -0.068292 0.799060 36.031700 -8.099056 -3.281379 -6.738570 -5.465189 -7.982557 1.680459 43.266087 -0.566937 0.115050 -0.133147 0.660233 0.386010 0.471406 -11.225476 2.588183 -30.847837 13.429811 -2.744313 22.998085 -0.355908 0.096970 0.083642 0.217307 -0.070753 0.133214 3.846922 -3.873697 10.806840 0.361600 -3.546401 9.458077 -0.480839 -2.924969 9.071146 -5.239531 -9.521555 14.326625 6.134569 -11.360838 -16.173449 -17.974445 -5.779720 -7.498515 -46.566113 -16.905218 -3.198153 -9.844667 -46.421879 -1.112694 0.299874 -0.225781 0.696549 13.410293 13.657501 -8.780685 39.728176 17.928946 -3.231884 3.462525 18.221159 -1.250502 -0.358443 0.144400 -0.071750 +0.171716 1.597739 -0.076033 -0.032820 38.894947 -8.414475 -2.958220 -6.839622 -6.135656 -6.211365 0.963992 42.859600 -0.571935 0.092545 -0.145623 0.692347 0.433616 0.478547 -13.706189 2.448046 -31.291513 18.053425 -4.395908 26.954058 -0.385581 0.120470 0.080358 0.237111 -0.084937 0.139118 4.136022 -3.832840 10.867440 0.535374 -3.585797 9.711209 -0.327272 -2.992548 9.469954 -5.224710 -10.536887 14.897994 7.549404 -12.029225 -18.052181 -17.926872 -8.213971 -6.929181 -48.450596 -19.065207 -2.565194 -11.832041 -51.055241 -0.311980 0.324362 -0.234166 0.723374 12.128415 17.020140 -8.116495 40.463005 19.111759 -3.092690 3.265156 21.091084 -1.503549 -0.363474 0.163179 -0.058007 +0.166892 1.606453 -0.082594 -0.986604 41.164921 -9.050812 -2.338379 -6.536524 -6.123587 -4.565276 0.398401 41.492256 -0.598095 0.095629 -0.174320 0.713298 0.455097 0.479037 -15.436587 2.733941 -31.114683 22.152109 -6.075501 30.274235 -0.401053 0.138537 0.068341 0.251989 -0.092328 0.146244 4.486831 -3.650137 10.774572 0.768417 -3.542802 10.123421 -0.219267 -2.918562 10.168700 -5.561408 -11.080263 15.945494 9.239957 -12.714532 -19.686199 -17.813103 -11.346509 -6.293537 -49.703735 -21.218960 -1.877871 -13.144697 -54.774200 0.236067 0.335323 -0.241181 0.755782 11.018990 20.890614 -7.532472 40.089783 20.403116 -3.088251 2.579782 23.512043 -1.844808 -0.375570 0.188226 -0.054556 +0.160669 1.615805 -0.088245 -1.853320 43.062630 -9.441301 -1.339475 -6.037842 -6.332682 -3.387012 0.132577 39.805664 -0.619465 0.109737 -0.177787 0.722688 0.471034 0.472999 -16.483078 3.285605 -30.935383 25.272814 -7.653162 33.403931 -0.400728 0.145437 0.068078 0.273476 -0.072611 0.136654 4.428743 -3.256482 10.213517 0.996265 -3.393944 10.690474 0.089975 -2.768482 11.277493 -5.710121 -11.815079 16.473843 10.322266 -13.455010 -20.496716 -17.237873 -14.124852 -6.098426 -50.826546 -24.112024 -0.599019 -13.688970 -57.544189 0.584880 0.330893 -0.263808 0.761597 9.987198 23.809050 -7.424174 38.840832 21.946421 -3.125399 2.746468 27.756496 -2.139348 -0.388964 0.203511 -0.066864 +0.154318 1.626315 -0.094638 -3.073774 44.850723 -9.905937 -0.344240 -5.578189 -6.716943 -1.911630 -0.279858 37.920002 -0.623508 0.096479 -0.165812 0.744080 0.513826 0.461181 -16.938362 3.848876 -30.790859 28.068054 -9.270862 36.143795 -0.402151 0.150942 0.079236 0.306245 -0.052972 0.110588 5.211053 -3.336648 9.509777 1.031199 -3.293776 11.254478 -0.178179 -2.707068 12.427032 -5.961352 -12.370652 16.709988 11.296601 -14.166090 -21.112555 -16.655561 -16.645897 -5.943945 -51.455486 -26.810942 0.572534 -13.033577 -60.670258 0.385723 0.345693 -0.273928 0.750689 8.647395 26.343460 -7.789784 38.213287 23.906502 -3.027874 2.377561 31.528460 -2.609058 -0.397251 0.200191 -0.074216 +0.148531 1.635633 -0.100803 -3.933380 46.278973 -9.955809 0.413590 -5.102113 -7.086916 -0.932157 -0.491077 35.874622 -0.639863 0.111243 -0.174512 0.760998 0.540621 0.437238 -17.193575 4.362242 -30.709711 30.442806 -10.772586 38.339657 -0.402071 0.133349 0.080059 0.331685 -0.029798 0.119525 6.140442 -3.352044 8.535958 0.901594 -3.103024 11.807942 -0.672497 -2.527911 13.692346 -6.163641 -12.825690 16.548044 12.354906 -14.784432 -21.978983 -15.088415 -18.759619 -6.019587 -52.421284 -29.914448 2.272311 -11.611681 -64.063637 -0.263262 0.338116 -0.257264 0.743823 7.017131 28.010439 -8.476720 38.743263 26.015669 -2.845664 1.119649 35.386250 -3.466334 -0.418539 0.190524 -0.071105 +0.142627 1.644654 -0.106625 -4.394501 47.968857 -9.604960 0.657915 -4.733649 -7.321080 0.089162 -0.752888 33.365192 -0.668674 0.165574 -0.183821 0.742590 0.521443 0.398544 -17.627085 4.568457 -30.288893 32.563927 -12.124274 39.766102 -0.385010 0.102899 0.073843 0.338087 0.019461 0.138895 6.942648 -3.350641 7.566299 0.700247 -2.982768 12.279763 -1.249782 -2.383368 14.820922 -6.096032 -13.441024 15.856439 13.158281 -15.428647 -22.558655 -13.408677 -20.584801 -6.537934 -52.518108 -33.455959 4.535246 -10.482761 -66.780449 -0.520075 0.292532 -0.255472 0.731951 5.890178 28.982708 -9.354383 39.226479 28.550785 -2.334633 -0.334999 38.468678 -4.334949 -0.444521 0.194979 -0.081779 +0.137206 1.653511 -0.112177 -4.691928 49.484642 -9.036269 0.941338 -4.341800 -7.423440 0.383917 -0.763143 30.667219 -0.694495 0.208821 -0.179007 0.735090 0.526543 0.351110 -17.716873 4.716155 -29.748976 33.810562 -13.147319 41.044502 -0.360803 0.067176 0.078932 0.368001 0.079686 0.134477 7.611152 -3.423563 6.156785 0.419732 -2.923985 12.849116 -1.851515 -2.331616 16.350416 -5.897556 -13.818178 14.803720 14.000675 -16.115679 -22.806025 -11.285778 -21.951818 -7.596064 -52.932182 -37.586761 7.357834 -7.134709 -67.640076 -2.259878 0.257978 -0.250388 0.700944 4.518273 29.397842 -10.628153 39.539623 31.923159 -1.339439 -2.295041 41.609447 -5.461801 -0.473009 0.181154 -0.101665 +0.132061 1.661358 -0.116892 -4.721579 50.519264 -8.231894 1.369676 -3.931972 -7.428536 0.069967 -0.589116 27.996649 -0.705249 0.243011 -0.159639 0.734859 0.538727 0.313279 -17.462400 4.917012 -29.297411 34.568932 -14.030864 42.485584 -0.340604 0.034988 0.090503 0.395314 0.141447 0.127457 7.829512 -3.335648 4.849782 0.209402 -2.813303 13.250191 -2.196557 -2.252837 17.614441 -5.549158 -14.082881 13.704345 14.663925 -16.709972 -22.696003 -8.531152 -23.391979 -8.679949 -53.343193 -41.482845 10.101558 -1.912550 -67.067848 -5.372011 0.229854 -0.244411 0.663624 2.932108 29.817005 -11.610174 39.405567 34.995018 -0.163858 -3.843818 44.598351 -6.436661 -0.494800 0.160975 -0.116155 +0.128070 1.668131 -0.121087 -4.765068 51.619850 -7.472770 1.687264 -3.538800 -7.139813 -0.021548 -0.550014 24.713989 -0.711897 0.259648 -0.139709 0.757639 0.578440 0.300162 -16.783701 4.947324 -28.501793 34.548111 -14.707168 43.973442 -0.337574 -0.001493 0.097800 0.436337 0.177332 0.123631 7.923903 -3.287674 3.454765 0.036565 -2.742622 13.537065 -2.399040 -2.254027 18.830299 -4.749619 -14.726138 12.635323 14.308443 -17.039587 -22.261341 -6.170968 -24.408869 -9.756115 -53.373894 -45.434513 12.881877 4.733017 -65.473183 -9.183408 0.214087 -0.222208 0.624443 0.880408 30.138102 -12.370649 39.587921 37.750633 1.172552 -6.238890 47.454464 -7.925097 -0.517609 0.118406 -0.120527 +0.124859 1.673492 -0.124551 -4.546903 52.472927 -6.440916 1.790508 -3.155471 -6.712024 0.006666 -0.538840 21.043997 -0.741445 0.317358 -0.127913 0.740768 0.552199 0.279518 -16.014681 4.871949 -27.506166 34.232586 -15.069905 44.868546 -0.301013 -0.040530 0.099281 0.454912 0.228842 0.111434 8.023895 -3.151315 2.042318 -0.236207 -2.600844 13.690130 -2.729212 -2.113617 19.842817 -4.128011 -15.161515 11.507362 13.993971 -17.594133 -21.337301 -3.516108 -24.910122 -10.827344 -53.465519 -49.066177 15.660485 10.845249 -62.916119 -12.373714 0.171895 -0.221116 0.588836 -0.983713 29.978006 -12.921232 39.739288 40.512497 2.811495 -8.581274 50.315239 -9.412786 -0.540438 0.094500 -0.153488 +0.121854 1.676808 -0.127705 -4.199746 53.300293 -5.104796 2.011855 -2.797463 -6.613676 -0.297071 -0.445910 17.846504 -0.766706 0.393060 -0.121096 0.698258 0.501681 0.214382 -15.122671 4.816261 -26.472750 33.415573 -15.000266 45.211437 -0.256473 -0.096737 0.093961 0.458889 0.304505 0.116285 8.007273 -2.930420 0.612796 -0.493445 -2.432881 13.695381 -2.954969 -1.909390 20.669956 -3.729801 -15.489372 10.222374 14.363081 -18.483309 -20.452068 -0.516053 -24.818974 -11.770927 -55.440075 -52.854946 19.578350 17.035805 -60.294605 -15.535601 0.114273 -0.199549 0.545407 -2.414251 29.132845 -13.523192 40.007385 43.564026 4.947254 -10.685788 52.179882 -10.543545 -0.563612 0.071504 -0.182300 +0.118274 1.679088 -0.130254 -3.258121 54.340790 -3.223927 1.884056 -2.521969 -6.641483 -0.738588 -0.356498 15.033443 -0.786429 0.462044 -0.113364 0.672532 0.466679 0.157387 -14.276792 4.649783 -25.241364 31.972466 -14.392402 44.932030 -0.219025 -0.165812 0.096303 0.466160 0.372005 0.135307 7.085906 -2.563354 -0.670349 -0.628186 -2.313606 13.572267 -2.657947 -1.830939 21.292379 -2.972504 -15.984257 8.863647 14.277975 -19.240900 -19.270519 2.247758 -24.691788 -12.692981 -57.466736 -56.847778 24.138208 21.543144 -57.074776 -17.199856 0.058151 -0.159590 0.499103 -3.120981 28.574865 -13.730799 39.697868 46.499565 6.885114 -13.931258 53.517982 -12.202740 -0.594531 0.029750 -0.197572 +0.115765 1.680051 -0.132402 -2.372653 54.892162 -1.302026 1.798462 -2.161704 -6.592886 -1.374662 -0.240132 12.139935 -0.785975 0.504077 -0.088770 0.659712 0.475048 0.084610 -13.029270 4.599431 -23.689720 29.901279 -12.982606 43.378571 -0.176936 -0.230933 0.113545 0.496891 0.453736 0.130870 6.270736 -2.257029 -2.202848 -0.801386 -2.127399 13.521660 -2.435039 -1.698844 22.225773 -2.369886 -16.387335 7.009543 14.367639 -20.225208 -18.367674 4.681623 -23.712393 -13.480686 -61.294563 -60.470791 29.778421 25.807856 -54.062775 -18.728111 0.013014 -0.118481 0.420013 -3.867907 27.760944 -14.162540 39.734589 49.959095 9.323121 -17.782619 54.002815 -14.106361 -0.620794 -0.021250 -0.204888 +0.112986 1.679949 -0.133680 -0.792905 55.117901 0.992292 1.331171 -1.825020 -6.295365 -2.043552 -0.140157 9.480446 -0.806420 0.542573 -0.069253 0.657416 0.492128 0.048487 -12.006227 4.464552 -21.888779 27.517517 -11.207448 40.990120 -0.151873 -0.275528 0.123679 0.536979 0.516732 0.115415 4.665720 -1.940511 -3.655426 -1.080963 -2.009114 13.416307 -2.087149 -1.627495 23.073221 -1.301061 -16.551044 5.809267 13.975609 -20.398928 -17.605257 7.058963 -22.867157 -14.088727 -64.752594 -63.495991 35.174774 29.102512 -50.911228 -19.560602 -0.026070 -0.111168 0.369820 -5.647641 27.745802 -14.611363 40.926132 53.300507 11.981313 -22.539183 52.508587 -16.325834 -0.650313 -0.053849 -0.229089 +0.110443 1.678638 -0.135065 0.689970 55.309681 3.017497 0.712117 -1.525772 -5.918084 -2.489396 -0.095539 7.264932 -0.796555 0.562162 -0.039260 0.664602 0.518503 -0.000107 -10.791027 4.340140 -19.392477 24.839870 -8.935286 36.903790 -0.134061 -0.318434 0.134922 0.569795 0.577360 0.106810 3.188261 -1.623040 -4.846014 -1.245507 -1.824696 13.449485 -1.734775 -1.503938 23.828091 -0.655398 -16.558241 4.449826 14.372648 -20.930107 -17.078518 9.612616 -22.311209 -14.395437 -66.392403 -65.933136 39.015152 32.935078 -49.109322 -21.000660 -0.040477 -0.070331 0.312961 -6.989347 28.121992 -15.001750 39.929863 56.287239 13.442595 -25.634418 50.352642 -17.219332 -0.663450 -0.102301 -0.232946 +0.106840 1.676070 -0.136416 2.301018 55.495644 5.225068 0.136649 -1.301191 -6.003906 -3.139930 -0.030604 5.361740 -0.791643 0.598247 -0.007455 0.636454 0.498858 -0.056506 -9.415196 4.088541 -16.926962 21.280912 -6.608449 32.432419 -0.101092 -0.366363 0.156036 0.573975 0.645436 0.102147 1.486730 -1.276938 -5.811574 -1.339177 -1.625680 13.308718 -1.164265 -1.270748 24.099091 0.122562 -16.696753 3.312419 13.982677 -21.384287 -15.820205 11.485244 -22.223478 -14.397874 -67.658150 -67.822037 42.112904 35.702618 -47.122803 -21.767176 -0.081452 -0.054435 0.259550 -8.356370 28.885790 -14.853574 37.338409 58.112141 13.393728 -28.892778 48.827816 -18.279493 -0.682336 -0.132696 -0.248042 +0.104332 1.673137 -0.138227 3.085291 55.201031 6.583440 -0.182547 -1.107644 -6.131724 -3.486523 -0.002874 3.804310 -0.774682 0.613866 0.017077 0.615278 0.481965 -0.093948 -7.659652 3.835726 -14.356615 17.591459 -4.572694 27.843292 -0.079045 -0.387056 0.167921 0.568818 0.686795 0.096004 0.669106 -0.811065 -6.553516 -1.355054 -1.195394 13.194625 -0.869005 -0.763251 24.211855 0.569497 -17.043695 2.612498 14.208424 -21.997995 -15.270849 12.650104 -22.158976 -14.445641 -70.607552 -69.651314 46.479816 36.791348 -44.981388 -21.559603 -0.098274 -0.040712 0.222557 -9.119526 28.959354 -14.593018 34.873951 59.328346 13.131479 -30.959402 48.125580 -18.858667 -0.681409 -0.148675 -0.252443 +0.101685 1.669944 -0.139328 3.440435 54.120106 7.253881 -0.327975 -0.966965 -6.204790 -3.845398 0.030914 2.937017 -0.768880 0.620936 0.033052 0.599479 0.476993 -0.131315 -5.748344 3.571602 -11.632558 13.994715 -2.931813 23.635168 -0.055769 -0.409885 0.177687 0.576763 0.718004 0.079172 0.054127 -0.220166 -7.222698 -1.366285 -0.596868 13.257779 -0.665200 -0.087652 24.573917 0.785538 -17.182543 1.930159 14.138578 -22.439123 -14.657471 13.215646 -22.514431 -14.361300 -72.916046 -71.137932 49.822723 38.065071 -42.924686 -21.498182 -0.108553 -0.025506 0.186367 -9.584297 29.608854 -14.482474 32.095570 60.248268 12.352732 -31.489964 47.351395 -18.650467 -0.685298 -0.170123 -0.262035 +0.098765 1.667765 -0.140795 3.705465 52.135876 7.563731 -0.634769 -0.985742 -6.384923 -3.967617 0.028612 2.851323 -0.733407 0.593263 0.055491 0.613572 0.508526 -0.152162 -4.228597 3.184979 -9.141521 10.468566 -1.651037 19.803923 -0.055230 -0.414818 0.191513 0.586018 0.730800 0.069975 -0.178917 0.590098 -7.646791 -1.499009 0.337605 13.456400 -0.790496 0.859650 24.964397 0.559576 -16.949734 1.702214 14.728318 -22.738453 -14.576132 13.943546 -22.919796 -14.628919 -73.628769 -72.062859 51.199928 37.536575 -41.313354 -20.662922 -0.086744 0.005011 0.156555 -9.482147 30.307566 -14.418263 30.040119 61.405636 11.847075 -31.358892 46.619648 -18.184090 -0.672619 -0.195990 -0.244785 +0.095412 1.666003 -0.142819 3.897967 49.956551 7.945073 -0.835268 -0.994800 -6.756844 -4.159813 0.035783 2.472673 -0.761857 0.639733 0.057832 0.585431 0.472841 -0.191228 -3.390173 2.775713 -7.327933 7.811741 -0.870193 16.256784 -0.041512 -0.421091 0.191806 0.583036 0.775388 0.068135 0.157326 1.451674 -7.918721 -1.763887 1.283587 13.637240 -1.321790 1.970589 25.279144 0.132657 -17.040478 1.363859 15.331385 -23.328138 -15.201108 14.069064 -23.202278 -14.966962 -74.900719 -72.624817 52.846272 36.863003 -40.433186 -20.076008 -0.111019 -0.022263 0.165581 -9.620315 30.997015 -14.753606 29.495163 62.514088 11.926205 -30.272646 45.762093 -17.296398 -0.689332 -0.170738 -0.273464 +0.091653 1.665427 -0.145888 4.312086 48.742527 8.651112 -1.267901 -1.120650 -7.363928 -3.927954 -0.017736 2.007799 -0.784652 0.667005 0.053832 0.589126 0.479262 -0.204507 -3.074463 2.334141 -6.427413 6.136187 -0.500483 13.593515 -0.039706 -0.431810 0.183195 0.601509 0.798533 0.070578 0.326973 1.923448 -8.098138 -1.979100 1.878178 13.755208 -1.468070 2.656774 25.650402 -0.320981 -17.012539 0.838655 15.417466 -23.638208 -15.848079 13.990120 -23.491034 -15.341755 -77.930733 -72.656303 55.037014 36.375736 -39.230991 -19.693182 -0.123361 -0.026028 0.163329 -9.793149 31.793833 -15.295434 29.589550 63.675911 12.513328 -28.640936 45.407253 -16.345547 -0.701877 -0.169262 -0.283468 +0.088002 1.665125 -0.149236 4.501782 47.991787 9.502778 -1.567154 -1.301594 -8.329415 -3.535054 -0.081842 1.741989 -0.802597 0.684757 0.039981 0.602603 0.494486 -0.214386 -3.045985 2.127106 -6.651189 5.411744 -0.371149 12.115112 -0.035919 -0.454349 0.175064 0.621735 0.803925 0.082878 0.959851 2.374315 -8.147620 -2.129027 2.486639 13.625222 -1.678009 3.319854 25.686594 -0.743208 -17.362083 0.332323 15.154826 -24.157352 -16.242849 13.197869 -23.827110 -15.367462 -84.174477 -72.335609 59.836182 36.009281 -38.454174 -19.556496 -0.131846 -0.004850 0.152749 -10.089988 32.153591 -16.014200 31.557972 64.344025 14.306068 -25.902817 45.694057 -15.074304 -0.716068 -0.186516 -0.277857 +0.085864 1.664358 -0.152056 4.357199 48.056946 10.202083 -1.541206 -1.458974 -9.371375 -3.338039 -0.145400 1.436439 -0.790205 0.650547 0.035060 0.640863 0.551252 -0.195058 -2.866284 1.915725 -7.251720 5.079064 -0.357461 11.291877 -0.051994 -0.445918 0.171395 0.646115 0.779552 0.081174 2.122202 2.365496 -8.087042 -2.359376 2.746652 13.304601 -2.086706 3.539975 25.337971 -1.233855 -17.532305 0.141490 15.119608 -24.367640 -17.006695 12.299326 -24.492140 -15.525284 -87.916679 -71.367073 61.343941 34.485294 -36.580051 -18.552229 -0.104693 0.010584 0.144377 -10.357691 32.372093 -16.816174 35.862228 64.677437 17.374866 -22.408247 45.315441 -13.420506 -0.707343 -0.200197 -0.252300 +0.083659 1.663486 -0.152875 4.481395 48.717144 11.229159 -1.506186 -1.746563 -10.662601 -3.187374 -0.194939 1.672659 -0.790696 0.653744 0.050814 0.622708 0.528947 -0.202562 -3.029966 1.665542 -8.089219 5.585807 -0.538036 10.837866 -0.044540 -0.434963 0.185036 0.634671 0.792574 0.064563 2.281876 2.203046 -8.005975 -2.511377 2.668709 12.764715 -1.892890 3.375859 24.415306 -1.564923 -17.423315 0.330084 15.106267 -24.453798 -16.821606 11.703501 -25.013308 -15.621318 -90.749596 -69.434044 60.911686 32.497971 -34.802826 -17.526775 -0.104625 -0.021541 0.152061 -9.781490 32.639088 -17.248283 41.267487 64.379097 21.050037 -17.403309 45.503872 -11.094868 -0.706645 -0.182058 -0.271120 +0.081433 1.662611 -0.152316 4.537762 49.026669 11.842216 -1.513544 -1.891543 -11.292871 -2.788465 -0.261638 1.423785 -0.774746 0.612598 0.033162 0.658000 0.571083 -0.164493 -3.255824 1.469867 -8.872176 6.203793 -0.732421 11.028582 -0.070961 -0.409952 0.169279 0.642828 0.742670 0.071686 2.249299 2.036830 -7.920214 -2.575247 2.564997 12.438123 -1.540122 3.139765 23.828650 -2.026118 -17.326401 0.966563 15.329157 -24.199612 -17.587408 10.904853 -25.179010 -15.937105 -92.720840 -67.124458 58.881336 30.363918 -32.735668 -16.416487 -0.068388 -0.006885 0.166931 -9.647424 33.000530 -18.185049 46.914017 63.340549 24.205454 -11.747767 45.353100 -8.513728 -0.685879 -0.183125 -0.241217 +0.079192 1.661821 -0.150866 4.882562 49.088245 12.560188 -1.646205 -1.994519 -11.730253 -2.593798 -0.276948 1.103996 -0.783290 0.629875 0.025744 0.622093 0.511723 -0.169862 -3.661989 1.384174 -9.660918 6.778508 -0.931180 11.547165 -0.064407 -0.396727 0.162346 0.609184 0.738423 0.071848 1.721237 2.052161 -7.859854 -2.630929 2.439674 12.125605 -1.150576 2.843761 22.986265 -2.266062 -17.056347 1.921646 15.527466 -23.977873 -17.125113 10.585032 -25.467415 -16.166025 -92.096764 -64.311882 54.587063 27.116297 -32.591377 -15.272180 -0.074578 -0.027446 0.194861 -8.040195 34.027721 -18.237406 52.058891 60.867493 25.269495 -6.801988 44.892387 -6.477385 -0.679810 -0.155272 -0.259965 +0.077080 1.660764 -0.150194 4.891163 49.298996 12.903920 -1.373117 -2.050375 -12.124472 -2.788312 -0.301026 0.887262 -0.781020 0.581281 -0.000643 0.655208 0.545500 -0.116903 -3.786401 1.322249 -10.318563 7.443825 -1.102855 11.907032 -0.095816 -0.355242 0.154380 0.608799 0.674809 0.073234 1.653304 2.060060 -7.563870 -2.557212 2.350304 11.908047 -0.815841 2.471697 22.056047 -2.351642 -17.028824 3.059626 15.872387 -23.246794 -17.891459 9.994926 -25.295576 -16.630726 -90.056297 -61.521477 49.970879 21.031487 -34.317795 -13.115070 -0.034842 -0.041571 0.239237 -6.797518 34.856380 -19.077749 56.475948 57.286404 24.898460 0.848842 43.729294 -3.297004 -0.665992 -0.133079 -0.240759 +0.075581 1.660223 -0.149290 5.156370 49.299538 13.119983 -1.497503 -2.198920 -12.268657 -2.729464 -0.327182 1.159377 -0.783565 0.555791 -0.023744 0.663726 0.532889 -0.048060 -4.328371 1.219764 -10.495923 8.310390 -1.310449 12.102896 -0.133338 -0.295499 0.140272 0.577394 0.610945 0.086199 1.366414 2.158886 -7.040232 -2.427647 2.258941 11.764637 -0.494538 2.209458 20.906759 -2.444399 -17.329126 4.586859 16.052788 -22.484980 -18.733454 9.007660 -25.980270 -16.963682 -86.752937 -58.920528 45.109226 13.114853 -35.913803 -9.907279 -0.009002 -0.092468 0.312361 -4.655673 36.298157 -18.884190 57.715847 52.779709 21.508251 7.616702 42.152321 -0.713929 -0.646352 -0.076203 -0.233521 +0.074039 1.660145 -0.148566 5.713187 49.824459 13.451518 -1.743251 -2.458213 -12.548515 -2.618566 -0.363211 1.814877 -0.786483 0.525021 -0.054097 0.661560 0.515255 -0.009823 -4.868898 1.036621 -10.419855 9.133850 -1.507971 12.084392 -0.162641 -0.232021 0.127880 0.544656 0.556157 0.089013 1.125299 2.039922 -6.385442 -2.395841 1.977829 11.655608 -0.446087 1.867340 19.737991 -2.823179 -17.366270 6.628657 17.273310 -21.811930 -19.744745 8.735539 -26.703094 -17.844551 -84.353661 -56.155235 40.941517 4.522118 -34.931519 -6.049644 0.025305 -0.138276 0.387438 -1.636153 37.035191 -18.094498 59.075771 48.025200 17.861216 13.302143 39.757851 1.084397 -0.624654 -0.011383 -0.230898 +0.073083 1.659351 -0.146771 6.056174 49.621754 13.558562 -1.633479 -2.515436 -12.523724 -3.137474 -0.346319 2.238423 -0.759760 0.460495 -0.074241 0.667497 0.518837 0.034681 -5.284434 1.105066 -10.308366 9.520355 -1.525271 12.103705 -0.192411 -0.162917 0.120529 0.511170 0.485184 0.083934 1.281461 1.884225 -5.767192 -2.425411 1.804386 11.461668 -0.875435 1.796514 18.503225 -3.681761 -17.133041 8.797185 18.042494 -21.308290 -20.588692 7.917057 -27.224052 -18.161848 -81.689880 -52.850731 36.326008 -3.390332 -32.716526 -2.646130 0.077336 -0.172603 0.441501 0.328119 37.369125 -16.871666 60.195213 43.979336 15.223101 16.415321 36.569405 1.750872 -0.584668 0.040649 -0.207953 +0.072225 1.657910 -0.144242 6.222787 49.329704 13.502449 -1.433889 -2.583524 -12.568765 -3.683424 -0.320416 2.849767 -0.720465 0.402833 -0.080576 0.651156 0.491172 0.055143 -5.537789 1.240691 -10.269406 9.959090 -1.563341 12.347569 -0.216733 -0.099602 0.118456 0.456482 0.427040 0.081281 1.626643 1.603362 -4.958027 -2.575586 1.579837 11.144292 -1.625325 1.762221 17.042660 -4.523530 -16.530920 10.625171 18.984337 -20.977682 -21.005888 5.460007 -28.200312 -17.344046 -77.952995 -49.019753 30.493645 -8.920753 -29.659513 -0.577901 0.128504 -0.197832 0.493621 3.389914 37.707573 -14.546169 60.476727 39.951435 12.292974 17.520931 33.188557 1.663699 -0.540439 0.090417 -0.189045 +0.072579 1.656648 -0.141967 6.068663 48.982750 13.092708 -1.275038 -2.676178 -12.624972 -3.994640 -0.311980 3.708781 -0.688832 0.333421 -0.100070 0.683049 0.515016 0.101976 -5.683858 1.390805 -10.201271 10.577806 -1.652842 12.895468 -0.253211 -0.046870 0.110512 0.435673 0.347642 0.086127 2.665548 1.094023 -4.339436 -2.886705 1.315713 10.892720 -2.841803 1.705405 16.039413 -5.164535 -15.548826 12.096003 19.783546 -20.322725 -21.678541 2.952286 -28.455566 -16.529682 -74.839020 -45.312260 25.573900 -12.479416 -25.392401 0.484022 0.196305 -0.187884 0.541870 5.444046 37.254150 -12.769888 62.033958 36.442944 10.233200 15.985066 29.018864 0.743560 -0.504401 0.107433 -0.153911 +0.072313 1.654972 -0.139609 5.475095 48.362885 12.382147 -0.824226 -2.812631 -13.001430 -3.978670 -0.307449 5.025348 -0.661843 0.300261 -0.109850 0.671723 0.496168 0.119168 -5.375193 1.652507 -10.291723 10.698443 -1.700049 13.704402 -0.273456 -0.010510 0.099592 0.399161 0.302346 0.096335 3.733293 0.557089 -3.720694 -3.145124 1.017859 10.615686 -3.931014 1.646758 15.080782 -5.588854 -14.606967 12.909463 19.854031 -19.796961 -21.773750 -0.130361 -28.346601 -15.149776 -71.731926 -41.652863 20.817795 -13.233912 -21.507406 0.455692 0.224275 -0.194925 0.574062 7.195993 36.783283 -10.976293 62.795464 33.251778 8.260902 13.735017 25.166000 -0.040252 -0.472748 0.135788 -0.134973 +0.071053 1.653111 -0.136131 5.365870 47.606838 11.957332 -0.538040 -3.057651 -13.304878 -4.192593 -0.304740 6.399856 -0.650173 0.252107 -0.115379 0.677482 0.490095 0.172096 -5.172139 1.813432 -10.405328 10.582556 -1.750540 14.726678 -0.299217 0.050152 0.097882 0.372158 0.239246 0.079847 3.885468 0.141295 -2.767048 -3.308509 0.747439 10.234798 -4.435966 1.553199 13.910095 -6.260769 -14.032915 14.104314 19.477415 -19.237778 -22.176252 -3.312828 -27.336796 -13.724944 -69.054184 -37.969772 16.503103 -12.997993 -18.359997 0.165917 0.270593 -0.237211 0.626109 8.999011 36.399685 -9.411306 63.235405 29.776789 6.474898 13.439345 20.425074 -0.066040 -0.444366 0.178019 -0.131684 +0.070421 1.649330 -0.132280 4.824483 46.797722 11.392849 -0.083983 -3.394823 -14.077321 -4.293402 -0.300665 8.456056 -0.634155 0.229818 -0.122591 0.656022 0.450906 0.187335 -4.734184 2.077147 -10.795070 10.579069 -1.847365 15.975374 -0.309027 0.081003 0.093228 0.329289 0.196039 0.084422 4.108383 -0.183911 -1.766162 -3.243842 0.505394 9.733383 -4.532923 1.434235 12.593848 -7.003399 -13.480977 14.350963 18.841665 -19.048658 -22.202625 -6.427839 -25.577593 -11.991044 -67.157104 -34.113861 12.289431 -11.049267 -17.101004 -0.551275 0.293133 -0.251012 0.659670 11.165059 35.918949 -7.724825 62.905212 26.482115 5.093244 12.972432 14.852954 0.108594 -0.419988 0.206679 -0.124221 +0.068262 1.645043 -0.127798 4.175603 45.557297 10.881368 0.448597 -3.728263 -15.026337 -4.297830 -0.260523 10.802460 -0.614247 0.221575 -0.113740 0.599972 0.372359 0.181538 -4.251351 2.433985 -11.365546 10.651768 -1.925857 17.210424 -0.291211 0.104595 0.103873 0.267363 0.181165 0.073371 4.026907 -0.312265 -0.623641 -3.172777 0.416439 9.113387 -4.541625 1.421509 11.086587 -7.507260 -12.729448 14.226683 18.121353 -18.877125 -21.256618 -9.175915 -23.504866 -10.361178 -65.151901 -30.284336 8.537227 -9.121081 -16.351141 -1.149289 0.294063 -0.280362 0.676108 13.987885 34.725685 -5.470861 61.839397 23.133219 3.524296 11.366380 10.243397 0.161910 -0.396158 0.240859 -0.135098 +0.065062 1.640641 -0.122517 3.412129 43.764992 10.115116 0.985803 -4.085879 -16.042143 -4.126146 -0.223476 13.661530 -0.613642 0.220927 -0.121255 0.561487 0.298364 0.202701 -3.609402 2.853647 -11.758275 10.677591 -1.968582 18.319479 -0.297043 0.129127 0.095936 0.211727 0.141164 0.080597 3.531725 -0.253081 0.892367 -3.065955 0.415709 8.368942 -4.364793 1.486223 9.405380 -7.611533 -12.066051 14.440909 17.307844 -18.250181 -20.697237 -11.348995 -20.444183 -9.172819 -63.677010 -26.558044 5.366391 -6.893565 -15.402795 -1.734634 0.302791 -0.301576 0.724223 15.546034 32.418419 -3.771429 61.089897 19.951551 2.112639 10.172945 6.662013 0.296893 -0.378721 0.272346 -0.147324 +0.062703 1.635013 -0.117283 2.547572 41.254810 9.590787 1.434347 -4.510625 -17.496738 -3.671793 -0.182095 17.110561 -0.587604 0.239457 -0.098354 0.486555 0.185531 0.202223 -3.313914 3.312979 -12.456188 11.156573 -2.086648 19.510107 -0.268126 0.131424 0.100042 0.137139 0.139845 0.078573 3.180734 -0.130206 2.323437 -3.089445 0.572474 7.443666 -4.492903 1.658461 7.478240 -7.205336 -11.211704 13.523434 15.947338 -17.675100 -18.471857 -13.653336 -16.838743 -8.284184 -61.181000 -22.719866 2.679110 -5.590855 -13.611327 -1.902488 0.279948 -0.316662 0.723500 17.166412 29.084427 -2.380426 59.493000 16.912361 0.801035 8.886380 3.304665 0.423479 -0.351249 0.285523 -0.167323 +0.059131 1.630016 -0.112290 1.213431 38.326046 8.412236 2.212956 -4.774106 -19.006292 -3.330813 -0.102043 21.463533 -0.549878 0.203116 -0.101125 0.470505 0.157558 0.225149 -2.369908 3.889864 -12.674294 11.299666 -2.080574 20.550905 -0.277710 0.143380 0.098707 0.092169 0.089359 0.094967 3.141000 -0.008211 4.258471 -3.003833 0.843278 6.515022 -4.620874 1.877322 5.577638 -6.824768 -10.422808 13.283290 14.911944 -16.659822 -17.575895 -14.880026 -12.994343 -7.629478 -59.113651 -19.071966 0.607224 -4.753996 -11.675690 -1.889405 0.294586 -0.296074 0.733408 16.979078 25.233715 -2.003001 58.096233 14.364386 -0.510373 7.698509 1.706884 0.453945 -0.324445 0.283107 -0.142486 +0.053975 1.625870 -0.106797 -0.227933 35.157028 6.861727 3.194799 -4.878402 -20.666231 -2.867561 0.027170 26.923565 -0.537782 0.179553 -0.107601 0.476880 0.162012 0.263674 -0.870204 4.567334 -12.544567 11.073423 -1.961666 21.739981 -0.298687 0.157751 0.097679 0.076028 0.051865 0.112071 2.805073 0.195785 6.161027 -2.921648 1.150901 5.961303 -4.623248 2.137849 4.354261 -5.903542 -9.686723 13.038357 14.175903 -15.188299 -17.623960 -15.228307 -9.128397 -7.554036 -56.767712 -16.037092 -0.813273 -4.627177 -9.664286 -1.740720 0.297891 -0.300012 0.754379 15.820862 21.832270 -2.592506 56.321861 12.903458 -1.278687 6.751014 -0.140766 0.521406 -0.316811 0.291446 -0.127856 +0.045673 1.622727 -0.101774 -1.307575 31.504532 5.101419 4.136148 -4.640971 -22.067869 -2.598397 0.350302 32.738289 -0.563362 0.161129 -0.127968 0.494197 0.179267 0.322679 0.685926 5.363585 -12.062779 10.674849 -1.765763 23.466158 -0.328965 0.191945 0.090683 0.080065 0.005377 0.112212 1.624512 0.736497 8.313964 -2.786476 1.541635 5.643032 -4.202678 2.522297 3.509857 -5.044995 -9.162097 13.436290 13.404222 -13.516983 -18.700151 -15.006967 -5.872342 -7.430754 -54.737816 -13.181705 -1.995807 -4.067081 -8.022627 -1.679808 0.306207 -0.344855 0.806030 14.090717 19.669712 -3.132192 53.779202 11.851755 -1.879015 6.290861 -1.316035 0.559270 -0.321668 0.327179 -0.136427 +0.038062 1.621133 -0.098000 -2.539107 28.322392 2.833482 4.872251 -4.300162 -23.150055 -1.660327 0.401590 38.239227 -0.578022 0.133079 -0.154250 0.524875 0.209181 0.383968 2.411171 5.959274 -10.860471 10.297550 -1.562141 24.708605 -0.363893 0.226103 0.082705 0.082651 -0.050679 0.124605 1.081031 1.220703 11.061692 -2.509348 2.084770 5.352878 -3.891179 3.074405 2.609147 -4.580213 -8.891906 14.238051 12.953568 -12.245547 -20.158567 -15.471665 -3.481658 -7.349738 -52.073566 -10.683299 -2.900753 -3.261326 -6.653798 -1.618655 0.323486 -0.370119 0.855304 12.743415 17.718288 -3.151638 49.721561 10.354803 -2.680617 6.189994 -1.063249 0.490560 -0.322229 0.356002 -0.125303 +0.031166 1.619173 -0.094581 -3.576508 25.685055 0.670709 5.226413 -4.126737 -24.746094 -0.384913 0.198002 44.123356 -0.585848 0.104052 -0.175516 0.532001 0.226030 0.414568 3.902846 6.359382 -9.497768 10.259862 -1.487704 25.945204 -0.382850 0.248775 0.077002 0.080979 -0.092923 0.126200 0.738732 1.671333 13.854104 -2.295930 2.724071 5.140554 -3.725916 3.717514 1.736037 -4.080506 -9.088213 14.627869 12.427448 -11.449990 -21.170031 -15.863491 -1.992991 -7.198258 -49.243698 -8.534172 -3.418180 -2.403185 -4.782040 -1.463233 0.332926 -0.390102 0.882469 11.418810 16.064615 -2.736591 45.485100 8.325389 -3.542760 5.982856 0.200104 0.376738 -0.320224 0.379267 -0.118529 +0.025399 1.616560 -0.089990 -4.476938 22.734089 -1.434413 5.619981 -3.726193 -26.316362 0.458103 0.125947 49.857468 -0.585286 0.097488 -0.174620 0.529123 0.229392 0.428094 5.274849 6.652184 -7.818714 10.122679 -1.367846 27.086338 -0.384313 0.257991 0.081860 0.079427 -0.097722 0.123479 0.380052 2.073292 15.931518 -2.079429 3.274668 5.250958 -3.499412 4.270154 1.402892 -3.867792 -8.653831 14.407247 12.065282 -10.680009 -21.544882 -16.196476 0.124349 -7.140453 -46.873825 -6.247642 -4.067607 -1.032439 -3.984376 -1.395412 0.325300 -0.407583 0.885460 10.699325 14.104102 -3.202756 40.436977 7.522338 -3.815850 5.914464 0.539262 0.303880 -0.319828 0.391584 -0.121211 +0.020655 1.613395 -0.084609 -5.093108 20.353559 -3.235485 5.517555 -3.530102 -28.271029 1.613774 -0.235199 55.886833 -0.548762 0.069867 -0.163076 0.533215 0.242867 0.429141 5.972101 6.726998 -6.121060 10.821815 -1.510506 27.929968 -0.387530 0.254599 0.086945 0.072083 -0.106932 0.128263 0.033118 2.417176 17.530741 -1.996534 3.811437 5.452229 -3.413073 4.751803 1.222151 -3.637442 -8.410713 13.970202 12.022425 -10.333411 -21.116890 -15.794313 2.174526 -6.808105 -45.186874 -4.069597 -4.732700 0.800223 -3.966060 -1.338225 0.334250 -0.376853 0.863421 9.464603 12.674188 -3.069733 35.959827 6.309332 -4.051636 6.294337 2.371308 0.220190 -0.304255 0.369474 -0.099351 +0.014828 1.611675 -0.078620 -5.105045 17.429916 -5.118362 5.301467 -3.021235 -29.252670 2.287838 -0.272677 60.713123 -0.526412 0.040705 -0.153377 0.543770 0.266556 0.440963 6.468807 6.813415 -4.084388 10.750420 -1.387013 28.837938 -0.397870 0.267213 0.090966 0.075976 -0.116623 0.121134 -1.099141 3.081818 19.142580 -2.032782 4.302707 5.847382 -3.151303 5.194668 1.248127 -3.378396 -7.691559 13.719065 12.371578 -9.482788 -21.355881 -15.105375 4.480360 -6.642928 -43.629379 -1.998153 -5.356958 2.524998 -4.507165 -1.314576 0.348870 -0.370547 0.859371 8.503178 11.524672 -3.270375 31.654100 5.848723 -4.026677 5.530474 2.325818 0.206212 -0.291550 0.364538 -0.091793 +0.010387 1.609951 -0.072609 -5.345058 14.688125 -6.975748 5.474342 -2.406427 -30.006945 2.088737 0.141902 64.787849 -0.519593 0.028243 -0.154257 0.555017 0.280568 0.453635 6.893890 7.053107 -2.387663 11.187949 -1.449732 30.159697 -0.403435 0.263138 0.089436 0.079694 -0.127255 0.124990 -1.460409 3.397153 20.199087 -2.119491 4.680070 6.417265 -3.262808 5.568897 1.606546 -3.255279 -7.043422 13.304834 12.098211 -8.700166 -21.440773 -14.071699 7.722288 -6.880201 -42.371433 -0.171041 -5.995424 3.715330 -6.530705 -1.455800 0.353388 -0.351580 0.856379 6.268089 10.051180 -3.797478 28.483416 5.984369 -3.853035 4.664458 0.974154 0.201976 -0.288708 0.349797 -0.084637 +0.007854 1.610060 -0.066421 -5.648067 12.173503 -8.847096 5.375130 -1.763657 -30.022617 1.978590 0.499626 67.122322 -0.545612 0.079110 -0.150612 0.511550 0.204792 0.434366 7.434772 7.277781 -0.486197 11.442039 -1.431772 31.150515 -0.382807 0.266754 0.086399 0.052911 -0.094596 0.117976 -1.047283 3.538762 21.477217 -2.243210 5.087854 6.822426 -3.809104 6.064154 1.529290 -3.932249 -5.776592 13.389167 12.846866 -8.462846 -21.006618 -12.809849 10.142777 -6.662536 -41.667118 2.006035 -6.584204 6.149600 -7.207947 -1.508674 0.333018 -0.381019 0.882698 4.741908 8.771924 -3.687470 24.915491 5.407989 -3.852806 4.101911 0.939659 0.237225 -0.292536 0.379015 -0.127357 +0.004693 1.610511 -0.059908 -5.553627 10.545307 -10.150057 4.915453 -1.486096 -30.243385 1.034615 1.266122 67.861649 -0.543040 0.082356 -0.129364 0.478734 0.184843 0.395283 7.701634 7.322996 1.120506 11.417393 -1.347143 31.755268 -0.360893 0.268556 0.106343 0.046299 -0.057175 0.089449 -0.601671 3.804550 21.464237 -2.410040 5.565807 7.625996 -4.264804 6.574021 2.422313 -4.367423 -5.561579 12.944975 13.121475 -8.732081 -20.762899 -11.872951 10.754381 -6.306997 -40.254539 3.484143 -6.836795 8.056922 -7.418377 -1.473992 0.321282 -0.411070 0.866785 4.001138 7.251029 -3.342404 21.593536 4.211805 -3.882658 2.409232 1.797303 0.239636 -0.295353 0.396028 -0.149704 +0.001695 1.612450 -0.052869 -5.373340 9.269474 -11.470525 4.428051 -1.365638 -30.148535 -0.642694 2.402830 67.441689 -0.534814 0.107326 -0.118022 0.450683 0.145472 0.360703 8.120428 7.188668 2.995039 10.812201 -1.088163 31.921980 -0.344101 0.258554 0.111191 0.026410 -0.025023 0.093232 -0.100794 3.927018 21.314911 -2.640380 5.895441 8.416068 -4.807360 6.954647 3.320374 -4.931509 -5.015524 12.786389 13.782091 -9.102973 -20.026529 -10.843379 10.628262 -5.400447 -38.944599 5.289118 -7.127090 9.904167 -8.429241 -1.579623 0.306926 -0.404736 0.857221 3.611411 6.399340 -2.556140 18.077679 2.872836 -3.705589 1.466547 2.345926 0.274155 -0.293713 0.397912 -0.157386 +-0.002533 1.614630 -0.045279 -5.086693 8.736547 -12.279838 3.726744 -1.454920 -30.136715 -2.490851 3.443774 65.184624 -0.528844 0.141864 -0.113646 0.416009 0.100414 0.310043 8.414451 7.136766 4.190736 10.623656 -0.981190 32.101711 -0.320516 0.236213 0.107548 0.007305 0.018829 0.103387 0.150617 4.007604 20.791025 -2.994122 6.005545 9.158159 -5.350822 7.082654 4.278436 -5.295396 -4.060397 11.986820 15.227148 -9.325465 -19.372549 -9.056774 11.164083 -4.787869 -37.750969 6.504941 -7.302257 11.679968 -9.863174 -1.795802 0.283280 -0.378539 0.840487 3.347882 5.020547 -2.222383 15.141552 2.119232 -3.431368 0.960813 2.482885 0.304130 -0.293330 0.391712 -0.164680 +-0.007072 1.618330 -0.037037 -4.574328 8.190018 -13.558673 2.755128 -1.544344 -28.792286 -4.203548 4.239782 61.150776 -0.568483 0.195638 -0.121904 0.369375 0.036844 0.272950 8.547026 7.038483 6.083698 10.264359 -0.804472 32.223774 -0.292347 0.227951 0.105588 -0.006923 0.060853 0.095513 0.115850 4.215330 20.639395 -3.419868 6.087671 10.035092 -5.856781 7.230531 5.247694 -5.462580 -3.812564 11.649525 16.199734 -9.598606 -19.389700 -8.072838 11.716550 -4.692099 -36.073376 7.265125 -7.217174 14.116966 -11.897864 -2.226597 0.248184 -0.409151 0.855543 2.918489 4.261512 -1.706414 12.424563 1.498610 -3.087065 1.254789 1.707770 0.349793 -0.311587 0.422375 -0.206980 +-0.011313 1.622272 -0.029396 -4.255844 7.941957 -14.780095 1.861434 -1.673558 -27.223433 -6.228176 4.854126 55.953262 -0.587504 0.220829 -0.118198 0.356204 0.019289 0.270622 9.028520 6.898214 7.874267 10.045667 -0.652826 32.229458 -0.284912 0.230328 0.105408 -0.005869 0.083497 0.089263 0.510640 4.188280 20.285748 -3.885718 6.199993 11.005700 -6.553563 7.363367 6.472535 -5.153725 -4.140232 11.177868 16.760815 -9.684392 -19.926695 -7.825684 12.028406 -4.898031 -33.660114 7.600220 -6.873980 16.058943 -14.039983 -2.725705 0.229814 -0.434820 0.862424 2.425594 3.497288 -1.279037 10.274022 0.985408 -2.698193 2.102755 0.730417 0.348464 -0.320857 0.439757 -0.229002 +-0.015207 1.626714 -0.020513 -4.133640 7.775108 -16.066874 1.016259 -1.680784 -24.754183 -7.782279 4.954781 49.632782 -0.602724 0.231635 -0.125577 0.334359 -0.002994 0.252413 9.620517 6.863173 9.653393 10.166613 -0.585444 32.524147 -0.275121 0.229829 0.100303 -0.009738 0.090823 0.078906 0.596255 4.280644 20.244202 -4.089829 6.214974 11.609694 -6.775900 7.392162 7.049859 -5.379565 -4.175507 11.369206 16.904623 -9.879606 -19.786856 -7.276313 12.442415 -4.864797 -32.285316 8.225782 -6.806865 19.245926 -15.601656 -3.279148 0.223029 -0.447532 0.868091 1.792449 3.360036 -0.724649 8.254638 0.454911 -2.409374 2.880080 -1.335449 0.300510 -0.323989 0.452285 -0.246231 +-0.018381 1.630005 -0.011702 -3.991011 7.566072 -16.811357 0.015242 -1.759893 -22.646992 -8.783721 4.611768 42.975014 -0.600023 0.228006 -0.119236 0.335753 -0.004177 0.258429 10.054263 7.056480 10.484654 10.304205 -0.518566 33.243122 -0.275476 0.240011 0.098153 -0.008033 0.091124 0.066278 0.856621 4.318690 19.646355 -4.427507 6.256151 12.018683 -7.213134 7.389434 7.654943 -5.540719 -3.978971 11.650670 17.325384 -9.919218 -19.608664 -5.986817 13.069184 -4.650084 -31.265684 8.768179 -6.832482 21.656338 -17.152130 -3.848125 0.233543 -0.453307 0.870992 0.894782 2.747542 -0.364839 7.325491 -0.062510 -2.233165 3.256404 -1.812000 0.276014 -0.316195 0.453849 -0.253969 +-0.020696 1.630636 -0.002398 -4.126831 7.794203 -16.931412 -0.838905 -1.945436 -20.907887 -9.649115 4.012560 36.095867 -0.586681 0.242247 -0.101813 0.333547 -0.021901 0.247374 10.426807 7.294118 10.473509 10.715249 -0.609220 34.109272 -0.272744 0.220915 0.097301 -0.015245 0.106236 0.071910 1.288474 4.161274 18.749071 -4.554429 6.068383 11.918659 -7.490805 7.137002 7.757003 -5.724540 -3.703621 11.876848 17.202044 -10.260029 -18.103973 -4.190076 14.253014 -4.313207 -30.333218 9.290280 -6.741004 22.727171 -18.430447 -4.210660 0.236752 -0.424085 0.858514 -0.457903 1.925927 -0.257216 6.762671 -0.182746 -2.122958 3.273176 -2.112386 0.259466 -0.312003 0.424635 -0.254839 +-0.022875 1.629747 0.006702 -4.472632 8.186842 -17.068024 -1.681443 -2.192682 -19.145027 -10.050715 3.262365 29.829958 -0.580924 0.220266 -0.092879 0.369760 0.015570 0.270284 10.700032 7.579958 10.174514 11.769273 -0.956435 35.226055 -0.285394 0.215500 0.102202 0.004025 0.089943 0.066559 1.851078 3.906550 17.835476 -4.600837 5.890313 11.957416 -7.671165 6.931386 8.162291 -5.633642 -3.869373 11.850266 16.729771 -10.200115 -17.948910 -3.339663 14.925987 -4.434889 -29.188829 9.280815 -6.522336 25.171671 -19.160498 -4.643772 0.260612 -0.400930 0.853417 -1.802044 0.956153 -0.305770 6.092908 -0.285560 -1.983551 3.251094 -2.641173 0.214050 -0.314547 0.392826 -0.245236 +-0.024068 1.626127 0.016058 -5.273454 8.759889 -16.899858 -2.325442 -2.321586 -17.611217 -9.977678 2.435954 23.767332 -0.583020 0.220507 -0.083728 0.361795 0.016042 0.254268 11.224492 7.864279 9.390880 13.273502 -1.518406 36.308239 -0.274971 0.206743 0.115033 0.010522 0.109031 0.050706 3.165966 3.297576 16.746153 -4.833251 5.644050 11.693574 -8.450964 6.624115 8.286426 -5.066832 -3.607091 12.068057 16.789845 -9.951369 -16.948109 -2.176359 15.778897 -4.120201 -27.414852 9.957491 -6.149684 26.460249 -20.542669 -5.067749 0.252733 -0.407751 0.841299 -3.061572 0.003088 -0.553859 5.996947 -0.045110 -1.955649 3.121947 -3.069754 0.191597 -0.323283 0.387458 -0.258793 +-0.025700 1.620046 0.027458 -5.823000 9.023178 -16.107115 -3.114632 -2.334603 -16.552248 -9.486646 1.767136 18.535543 -0.586465 0.239557 -0.066767 0.340895 0.002554 0.236150 11.608273 8.240806 8.167039 14.639769 -2.008888 37.219173 -0.244436 0.195399 0.129728 0.019045 0.144947 0.024487 3.615959 3.252626 14.353859 -4.823358 5.471860 11.435597 -8.546617 6.525540 8.967821 -4.747459 -3.621076 12.051307 16.356836 -10.078753 -15.634142 -1.407556 16.463936 -3.780350 -25.572245 11.023976 -5.787002 27.796854 -22.104076 -5.580411 0.226584 -0.429262 0.807359 -3.407697 -1.064206 -1.018846 4.634058 0.453520 -1.711582 3.157428 -3.292393 0.142838 -0.330055 0.384666 -0.281421 +-0.027019 1.613307 0.038532 -6.460461 9.240113 -15.371279 -3.561190 -2.234961 -15.754445 -9.184750 1.340235 14.598996 -0.591596 0.238616 -0.074665 0.342567 0.025995 0.220906 11.966275 8.574569 6.935697 16.050371 -2.548697 38.008537 -0.231573 0.179489 0.127971 0.042171 0.156777 0.015269 4.535338 3.111742 11.601721 -4.877549 5.408737 11.400077 -8.911553 6.609269 10.182840 -4.239476 -3.753650 12.304109 16.287533 -10.061085 -15.114967 -1.045628 16.588171 -3.591037 -23.517746 11.893268 -5.349704 29.385859 -22.672020 -5.911297 0.210626 -0.420950 0.777305 -3.712678 -2.101429 -1.395728 3.350409 0.689741 -1.434433 3.358288 -3.473799 0.085072 -0.338465 0.371201 -0.279711 +-0.029074 1.606755 0.048024 -6.810372 9.275526 -15.355342 -3.931231 -2.122959 -14.697793 -9.139399 1.159144 12.435735 -0.570536 0.196972 -0.066574 0.386659 0.095302 0.240252 12.099261 8.897943 6.390271 17.576565 -3.165321 39.007683 -0.251564 0.187064 0.139145 0.070132 0.141384 0.011566 4.882299 3.023941 9.901226 -4.852162 5.337343 11.577704 -8.958626 6.600912 11.189610 -4.053915 -3.954886 12.654314 16.261168 -9.924858 -15.537534 -0.587312 16.302937 -3.170566 -22.000633 12.982309 -5.143117 30.010637 -22.280674 -5.793110 0.234604 -0.409866 0.764058 -4.055399 -2.499152 -1.299668 2.119795 0.429654 -1.166324 3.541401 -3.541464 0.042051 -0.336532 0.353557 -0.254124 +-0.031392 1.600388 0.055617 -6.669817 9.652380 -15.728880 -4.499605 -2.291588 -14.128936 -9.495353 1.221258 12.546248 -0.552937 0.164668 -0.059256 0.414982 0.141496 0.263696 11.617004 9.110893 6.263068 19.087206 -3.937845 40.179920 -0.253824 0.197457 0.158306 0.086927 0.129370 0.001806 4.488379 3.002986 9.375340 -4.834395 5.191481 11.796747 -8.757939 6.424351 11.727263 -3.739225 -4.088414 12.754100 15.967181 -9.654363 -15.645126 -0.089609 15.987109 -3.053134 -20.490063 13.025313 -4.758587 30.259727 -21.178267 -5.408865 0.243799 -0.416562 0.747185 -4.446105 -2.732316 -1.197526 1.270329 0.162522 -1.006136 3.400819 -3.779029 0.008734 -0.334872 0.347403 -0.236856 +-0.034283 1.594756 0.061444 -6.032451 9.876884 -16.616261 -4.996894 -2.444383 -13.455304 -10.543872 1.508445 13.736222 -0.513213 0.117958 -0.057877 0.432978 0.185026 0.268405 10.887471 9.295085 6.745805 20.079943 -4.566698 41.559490 -0.268517 0.199890 0.155451 0.092760 0.102950 0.009131 3.859790 2.859071 10.205362 -5.215463 5.088456 12.065938 -8.967978 6.137178 11.686544 -3.472038 -4.360729 12.366304 15.827411 -9.488283 -15.909581 -0.003556 15.518715 -3.015717 -18.173122 13.000220 -4.203537 30.487890 -19.424179 -4.788542 0.264949 -0.383947 0.724507 -4.277845 -2.476399 -0.903966 0.835400 -0.360045 -0.924176 2.730377 -3.356227 0.044024 -0.314029 0.326410 -0.200417 +-0.036823 1.590169 0.065811 -5.551052 9.878587 -17.501078 -4.845501 -2.537252 -13.493332 -11.813136 1.986752 16.000912 -0.492978 0.098405 -0.046346 0.439015 0.189605 0.260722 10.277125 9.390698 7.223122 21.047129 -5.237915 42.820995 -0.277432 0.201850 0.158928 0.086599 0.099001 0.008465 2.762301 2.987737 11.206544 -5.156317 4.976137 12.254649 -8.437346 5.901616 11.419457 -3.573648 -4.205540 12.035791 16.597221 -9.643493 -15.806314 0.703397 14.689911 -2.570893 -17.622530 12.990817 -4.139852 30.650360 -18.257814 -4.419649 0.289771 -0.362214 0.728043 -3.701504 -1.919399 -0.251441 -0.229506 -1.340169 -0.773066 2.409193 -2.807476 0.081000 -0.303515 0.312764 -0.193625 +-0.038940 1.585690 0.069668 -4.929891 9.488955 -18.203884 -4.374753 -2.442448 -13.616536 -13.454579 2.611083 17.959927 -0.514775 0.121368 -0.062201 0.439389 0.175490 0.287939 9.826928 9.542854 7.654323 21.269226 -5.587439 44.119705 -0.279158 0.200912 0.144325 0.084202 0.082448 0.025800 1.578688 3.293712 11.785263 -5.032387 4.914522 12.684107 -7.779404 5.887495 11.745414 -3.241165 -5.044104 11.124470 15.849629 -9.586782 -16.922413 0.453727 14.212224 -2.916010 -16.196539 12.211713 -3.703997 29.969469 -17.242598 -4.093431 0.271847 -0.369436 0.740453 -3.718600 -1.895893 0.084661 -0.592408 -1.914284 -0.630470 2.649701 -2.121696 0.100070 -0.310996 0.321019 -0.194241 +-0.039790 1.582426 0.072811 -4.576007 8.706415 -18.530401 -3.584489 -2.097750 -13.497498 -14.935224 3.097521 18.574690 -0.521081 0.121746 -0.063135 0.434012 0.176286 0.287586 9.717605 9.692623 7.891283 21.109074 -5.654881 45.152569 -0.268262 0.193425 0.145458 0.091038 0.083881 0.015469 0.982511 3.662735 12.186826 -4.826372 5.090731 12.834388 -7.313937 6.037491 11.749137 -3.035353 -4.881558 10.555465 15.230491 -9.235505 -16.684244 0.394961 13.954680 -3.416221 -15.286575 10.527269 -3.318347 29.636141 -16.606667 -3.922671 0.262765 -0.371829 0.727575 -3.584359 -2.293776 0.217537 -0.775149 -2.474589 -0.462050 2.933989 -1.096669 0.106055 -0.314221 0.315177 -0.201086 +-0.040465 1.580509 0.074951 -4.728564 8.062548 -18.326052 -2.658056 -1.862699 -13.731881 -15.715814 3.277472 18.571857 -0.538020 0.158503 -0.057617 0.431562 0.152943 0.296664 10.045768 9.655723 7.644972 20.876585 -5.667818 45.662395 -0.261336 0.184374 0.145326 0.089048 0.103409 0.023173 1.339209 3.571880 12.295890 -4.946685 5.165821 12.674780 -7.660355 6.102020 11.527073 -2.805838 -4.561454 9.957518 15.306567 -8.992541 -16.592108 0.786733 13.993357 -3.709794 -14.286946 8.952341 -2.837391 28.665321 -16.804798 -3.933703 0.243113 -0.377100 0.733552 -3.508577 -2.782237 -0.131474 0.263298 -2.266652 -0.607973 2.883276 -0.491513 0.123234 -0.325678 0.314343 -0.217065 +-0.041404 1.580895 0.074845 -4.895236 7.432902 -17.854683 -2.113874 -1.748330 -13.805694 -15.552965 3.098426 17.744396 -0.499506 0.114727 -0.035493 0.438645 0.184729 0.282994 10.561412 9.551908 7.204821 20.163866 -5.389934 46.087952 -0.255190 0.182641 0.156341 0.101020 0.106092 -0.004834 1.377042 3.508867 12.480667 -4.967859 5.230163 12.347021 -7.737837 5.998957 11.026372 -2.667446 -3.880090 9.767068 15.675796 -8.730340 -15.417990 1.133555 13.875749 -3.730793 -14.355453 7.654456 -2.759485 28.763899 -17.518848 -4.125731 0.269161 -0.352353 0.697577 -2.973618 -2.897520 -0.396360 1.103943 -2.022044 -0.677411 3.001562 -0.240137 0.089109 -0.304632 0.283507 -0.209004 +-0.041670 1.582720 0.073127 -5.474507 7.057204 -17.512535 -1.687398 -1.742356 -13.658428 -14.894259 2.706068 16.541752 -0.495791 0.114264 -0.023061 0.427961 0.171091 0.262201 11.342493 9.234778 6.946210 19.550903 -5.158121 45.869450 -0.249277 0.164995 0.170132 0.093401 0.118133 -0.009661 1.798280 3.362192 13.147634 -4.674337 5.177801 11.889111 -7.586560 5.886666 10.112708 -2.821289 -3.283498 9.898936 15.097484 -8.465652 -14.126748 1.029614 13.545817 -3.816471 -15.260507 6.508913 -2.838840 29.547970 -18.949345 -4.683426 0.270714 -0.341940 0.692529 -2.872077 -3.019885 -0.337296 2.468552 -2.573386 -0.929480 2.518557 0.383905 0.109882 -0.310458 0.267723 -0.217600 +-0.042555 1.585912 0.070807 -5.525690 6.643189 -16.781773 -1.739013 -1.828545 -13.588310 -14.104346 2.258789 14.864264 -0.498152 0.119066 -0.023439 0.428673 0.170815 0.263698 11.382758 8.901643 6.531032 18.890930 -4.876945 45.151787 -0.253825 0.156564 0.166454 0.094393 0.117203 -0.001975 1.698232 3.400842 13.139298 -4.583563 5.124149 11.549253 -7.427307 5.820834 9.700743 -2.909871 -3.053829 10.202699 14.552790 -8.203836 -13.751229 1.219036 13.474152 -4.119719 -16.445009 4.803295 -2.917284 29.472849 -19.894625 -5.070312 0.267972 -0.338880 0.694202 -2.926183 -3.471682 -0.689204 4.793883 -2.590908 -1.346429 2.217576 0.814022 0.112270 -0.311758 0.261684 -0.217550 +-0.042751 1.589143 0.067831 -5.611749 6.028143 -15.916254 -1.954579 -1.867604 -13.460104 -13.062427 1.765702 12.707577 -0.515330 0.148724 -0.025044 0.411756 0.147614 0.271001 11.490089 8.564092 6.122901 17.992548 -4.464954 44.180592 -0.253084 0.158921 0.169666 0.083305 0.128684 0.010883 1.636103 3.406329 13.129486 -4.443459 4.975444 11.189629 -7.216844 5.715500 9.268760 -2.622431 -3.128877 10.111777 13.734401 -7.724998 -14.168811 0.922523 13.521897 -4.463075 -17.292879 3.709733 -2.923253 28.915710 -21.382702 -5.532259 0.233529 -0.374101 0.704379 -3.052137 -3.872083 -1.161016 7.203297 -2.304205 -1.821709 1.787751 1.143558 0.125811 -0.326457 0.289703 -0.226884 +-0.043336 1.592032 0.064253 -5.793404 5.034198 -14.978838 -1.817959 -1.641853 -13.311058 -12.262595 1.359153 10.131037 -0.495148 0.144533 -0.022228 0.428027 0.171063 0.303682 11.463897 8.376217 5.533312 17.434933 -4.198422 43.530918 -0.261829 0.150629 0.174898 0.082494 0.114929 0.040429 0.630329 3.872684 12.953299 -3.687336 4.864581 10.882153 -5.875412 5.628141 8.981506 -1.851942 -3.682354 9.725750 12.149154 -7.123487 -14.332967 -0.194883 13.913610 -5.201725 -18.561829 2.385224 -2.992951 28.892714 -23.348284 -6.170388 0.210860 -0.367843 0.682539 -3.146991 -4.473629 -1.666033 8.737342 -1.890279 -2.024049 1.897110 1.376961 0.097880 -0.326871 0.279169 -0.195067 +-0.043358 1.595042 0.059627 -6.056501 4.317076 -14.044091 -1.841374 -1.586961 -13.457497 -11.196698 0.991095 8.074436 -0.490393 0.146872 -0.026956 0.444629 0.180284 0.342418 11.092835 8.019511 4.849185 17.630259 -4.340019 42.492218 -0.278549 0.143104 0.174461 0.076181 0.091871 0.073083 -0.359603 4.231621 12.956341 -2.881751 4.618248 10.394810 -4.477184 5.408149 8.407340 -1.154337 -3.624262 9.796670 10.514549 -6.032311 -14.355914 -0.925410 13.901865 -5.417738 -20.188593 1.606490 -3.137655 28.223068 -25.602871 -6.777121 0.196185 -0.360462 0.686601 -3.157259 -5.153779 -2.180488 11.304285 -1.971972 -2.651613 -0.129108 2.851939 0.085543 -0.331694 0.271134 -0.174107 +-0.042656 1.597669 0.053460 -6.426638 3.536702 -13.586271 -1.945859 -1.582665 -13.331447 -9.689974 0.632015 6.213453 -0.470395 0.102348 -0.048291 0.466405 0.200744 0.366441 10.910153 7.551595 4.636722 17.629892 -4.397682 41.544319 -0.299257 0.150129 0.157674 0.070936 0.033515 0.084942 -0.534407 4.211211 14.273615 -2.380306 4.423529 9.663254 -3.860014 5.113439 7.002732 -1.014222 -2.874205 10.240171 10.420996 -5.094820 -14.366950 -1.235526 13.494546 -5.240668 -21.792099 0.956805 -3.356978 27.958836 -27.097466 -7.202539 0.233332 -0.313191 0.699692 -2.577214 -5.349192 -2.378464 14.041695 -2.504968 -3.431460 -2.565401 4.379806 0.022432 -0.311519 0.248779 -0.145534 +-0.041985 1.599761 0.046945 -7.111927 2.733611 -12.768071 -1.623541 -1.522498 -13.890051 -8.352998 0.378807 4.952783 -0.450083 0.091897 -0.062484 0.493507 0.225836 0.378559 11.236578 7.084146 4.047431 17.564560 -4.421905 40.534851 -0.321440 0.137019 0.140104 0.070200 0.011470 0.125927 -0.194313 4.178257 14.585880 -1.791273 4.375157 9.218682 -3.322288 5.068130 6.408412 -0.799754 -2.438090 10.195643 10.786695 -4.700784 -14.650027 -1.472904 12.910835 -5.800559 -23.600740 -1.389718 -3.381789 27.297716 -26.758974 -7.163976 0.240964 -0.255909 0.697913 -2.048752 -5.800371 -2.739186 16.061876 -2.447714 -3.813282 -2.833793 4.235734 0.012486 -0.304081 0.220733 -0.106104 +-0.040630 1.600742 0.039197 -7.842191 1.821958 -11.850981 -1.344640 -1.537237 -14.852860 -6.840158 0.192858 4.260090 -0.470127 0.104994 -0.068153 0.518332 0.244448 0.396797 11.346648 6.684801 3.279359 18.139788 -4.707869 39.552475 -0.333094 0.129464 0.131481 0.089450 0.011423 0.135001 0.763873 4.111154 14.052859 -1.389540 4.523220 9.240656 -3.171785 5.271646 6.775806 -0.507326 -2.363046 9.887308 11.086481 -4.533690 -15.255362 -1.711168 11.937687 -6.742143 -24.926035 -4.446634 -3.197478 25.960289 -25.971628 -6.959079 0.241144 -0.246440 0.709604 -1.741394 -6.143349 -3.013689 17.872826 -2.106651 -3.922175 -1.163330 3.032800 0.037642 -0.317028 0.209550 -0.109558 +-0.040021 1.602713 0.029556 -8.507977 1.138346 -11.368317 -1.176508 -1.626343 -15.616118 -5.140998 0.044430 4.068170 -0.492683 0.103531 -0.081990 0.531865 0.244946 0.427342 11.428002 6.171286 2.768709 19.046562 -5.170203 38.563126 -0.349212 0.143883 0.119972 0.093479 -0.014539 0.133957 1.787275 3.758174 14.483984 -1.229457 4.507627 9.122309 -3.388549 5.265185 6.605910 -0.015911 -2.415135 10.400638 11.310843 -4.113503 -15.783969 -2.181336 9.796334 -6.965028 -25.545555 -6.310042 -3.187025 24.959631 -25.215872 -6.821713 0.256305 -0.257824 0.746413 -1.265792 -5.382290 -2.575724 21.292364 -2.632297 -4.571605 -1.560523 3.144281 0.037535 -0.320099 0.219349 -0.121027 +-0.040496 1.604033 0.020721 -8.633756 -1.573110 -11.131506 -0.203922 -1.224436 -15.803123 -4.197039 0.004062 3.513190 -0.502556 0.082074 -0.103136 0.571505 0.289076 0.465337 11.485034 6.254771 2.735065 18.980968 -4.991551 38.182899 -0.375473 0.153498 0.109329 0.114425 -0.051667 0.143695 1.708814 4.016927 14.783199 -1.004399 4.721136 9.165123 -3.098986 5.446383 6.684872 0.168611 -1.713058 11.103239 11.074471 -3.057301 -16.518053 -2.915517 8.498285 -7.275072 -26.412558 -7.560674 -3.246636 24.463438 -24.882555 -6.837063 0.275801 -0.246606 0.768323 -0.038173 -4.175982 -3.132375 23.756567 -1.008345 -4.766864 -2.484317 2.362930 0.049244 -0.322589 0.214022 -0.107409 +-0.039827 1.603822 0.011106 -8.537161 -5.603940 -10.895358 1.388055 -0.640032 -16.175356 -4.060088 0.036970 3.348687 -0.530282 0.083468 -0.127672 0.593581 0.317036 0.492598 11.600969 6.851070 2.496194 18.122404 -4.475215 38.860382 -0.389137 0.151589 0.102064 0.134564 -0.073257 0.155409 1.672062 4.506456 14.977209 -0.909994 5.174288 9.396465 -2.968445 5.891224 7.051129 0.448807 -0.948838 11.272614 10.081798 -1.760068 -17.441475 -4.506136 7.173597 -7.921355 -26.435722 -8.692410 -3.251347 24.333052 -24.820116 -6.956473 0.265957 -0.252267 0.784387 1.465188 -3.019612 -3.733973 25.382353 0.768599 -4.717405 -2.609383 3.173218 -0.046670 -0.340359 0.218296 -0.104868 +-0.038469 1.603450 0.000656 -8.669955 -8.889622 -11.010361 2.918513 -0.311682 -16.804071 -3.715788 0.060996 4.770159 -0.563680 0.084882 -0.158341 0.642437 0.361210 0.553384 11.842121 7.214280 2.396221 17.341831 -4.117503 39.610577 -0.419174 0.146923 0.080880 0.165016 -0.119036 0.180379 1.583976 4.852439 15.092634 -0.438878 5.399742 10.036619 -2.262841 6.173857 8.026983 0.872611 -0.598690 11.179655 8.533089 -0.450847 -18.925381 -6.853514 5.159647 -8.631979 -26.402456 -9.910235 -3.360875 24.437632 -25.717844 -7.433562 0.267544 -0.238903 0.809897 2.978642 -1.577064 -4.083611 25.788862 2.369560 -4.421221 -1.979339 4.469774 -0.160062 -0.357317 0.204773 -0.093568 +-0.037852 1.602558 -0.009399 -8.528865 -11.782388 -11.195033 4.459744 -0.110428 -17.892426 -3.735615 0.167769 7.501095 -0.599703 0.106453 -0.172358 0.657286 0.377027 0.600818 12.099599 7.397387 2.463532 15.885890 -3.528864 40.273319 -0.426225 0.145770 0.070183 0.189493 -0.133071 0.184561 0.915948 5.305832 14.975981 -0.037992 5.541575 10.677609 -1.368023 6.343130 9.082764 1.788709 -0.880840 11.040250 6.904176 0.548386 -19.768591 -9.620966 2.947673 -9.533632 -25.201527 -11.288460 -3.407972 24.132675 -27.396652 -7.948968 0.239935 -0.269987 0.818005 5.349040 0.007910 -4.450488 25.759266 3.802063 -4.170220 -1.572287 6.403039 -0.322354 -0.375529 0.212634 -0.106757 +-0.035572 1.601129 -0.018701 -8.460671 -14.527918 -11.673638 6.337739 0.072293 -19.120441 -4.539550 0.399319 11.629545 -0.622813 0.106341 -0.195881 0.685742 0.414705 0.629621 12.305518 7.433043 2.855242 14.219005 -2.873035 40.789646 -0.441972 0.146645 0.053224 0.217805 -0.153457 0.192429 0.884196 5.316093 15.401406 0.188066 5.599452 11.225707 -1.031792 6.389999 9.863536 1.962904 -0.619630 11.305351 6.481837 1.201231 -20.698587 -12.037810 0.462215 -10.103388 -24.030695 -12.430778 -3.561134 23.659901 -29.257032 -8.453406 0.235837 -0.268050 0.825987 8.291071 1.970936 -4.981664 25.244617 5.533561 -3.994895 -1.858768 8.133864 -0.502231 -0.386510 0.211124 -0.100760 +-0.031967 1.598767 -0.028115 -8.202033 -17.271656 -12.029581 8.168844 0.142976 -20.848936 -5.765432 0.832474 16.946722 -0.678158 0.145943 -0.222460 0.700551 0.408424 0.675796 12.332624 7.529608 2.954453 12.540421 -2.259396 41.437984 -0.448535 0.144590 0.036579 0.232147 -0.167545 0.204412 0.344542 5.466733 15.686317 0.592577 5.489139 11.656077 -0.191052 6.344524 10.536777 1.996294 -0.162407 11.627958 5.226803 2.072626 -21.464582 -13.769635 -2.252175 -10.151012 -23.997086 -13.259304 -3.765440 22.946787 -30.919790 -8.927555 0.211025 -0.295198 0.858036 10.503650 4.041214 -5.526779 24.693262 7.500402 -3.864114 -1.800703 9.561327 -0.632198 -0.411608 0.225655 -0.119966 +-0.027803 1.597802 -0.038296 -7.493930 -20.085546 -12.756677 9.833111 0.131750 -22.539646 -7.500815 1.534848 22.963163 -0.689699 0.155924 -0.238336 0.724115 0.436334 0.693573 11.932456 7.729371 3.050954 10.584814 -1.494938 42.297615 -0.465228 0.136853 0.027093 0.248603 -0.173967 0.228126 -0.365394 5.540658 16.634020 0.781927 5.382965 11.937026 0.315444 6.206819 10.709776 1.702091 0.962741 12.321740 4.547072 3.029237 -21.655489 -15.226779 -4.632668 -10.294576 -23.944445 -14.416365 -3.948618 22.693195 -31.371840 -9.148130 0.198781 -0.288318 0.862737 12.859879 6.237404 -6.419742 24.072592 10.100929 -3.650813 -1.070169 10.362658 -0.666614 -0.422411 0.222532 -0.106768 +-0.024036 1.598670 -0.048295 -6.744398 -22.626949 -13.503515 11.471275 0.112351 -24.025383 -9.662679 2.541649 28.939156 -0.706735 0.150195 -0.262449 0.763716 0.479853 0.726663 11.914480 7.862225 3.132725 8.254448 -0.520064 42.922150 -0.489629 0.133154 0.010901 0.274273 -0.200378 0.245752 -1.220822 5.615343 17.529762 0.933697 5.239964 12.212817 0.846218 6.006251 10.912934 1.484120 2.219348 13.229385 3.987791 4.196107 -22.047091 -15.953197 -6.503157 -10.496484 -24.116835 -15.854611 -4.032582 22.157085 -32.495907 -9.432555 0.204493 -0.271942 0.877351 14.681398 8.250980 -7.425218 24.198839 12.861330 -3.409259 0.455122 11.024898 -0.605893 -0.431157 0.210858 -0.092617 +-0.019578 1.599564 -0.057778 -5.753385 -24.796505 -14.087120 12.781827 -0.207441 -25.675493 -12.218158 3.856990 34.823349 -0.728402 0.145072 -0.285555 0.798853 0.520402 0.758505 11.549994 7.961546 2.747579 5.990807 0.354238 43.553497 -0.509133 0.132643 0.000493 0.298837 -0.223943 0.257642 -1.953511 5.594425 18.223082 0.937189 5.056224 12.397540 1.186916 5.778185 11.090706 1.037798 3.244866 14.073717 3.185899 5.111345 -22.634178 -16.179165 -8.301425 -10.830832 -24.511190 -17.792847 -3.967719 20.699020 -33.894817 -9.485025 0.208119 -0.270920 0.892861 16.211451 10.084715 -8.288543 25.085737 15.262400 -3.263641 1.651075 12.056154 -0.578516 -0.441781 0.208540 -0.083026 +-0.014428 1.601342 -0.066683 -4.659774 -26.503271 -14.570338 13.707999 -0.876459 -27.343254 -14.741407 5.410605 40.615929 -0.769704 0.150191 -0.314337 0.814781 0.543442 0.772671 10.616905 8.038514 1.844983 4.421527 0.827156 44.246857 -0.514995 0.130340 -0.002675 0.324365 -0.238970 0.254222 -2.824683 5.566606 18.798265 0.901086 4.761019 12.483549 1.575875 5.467233 11.194688 0.661860 4.355558 15.046920 2.263628 6.139658 -22.975840 -16.242790 -10.588554 -11.123248 -24.970383 -19.963137 -3.880551 19.440142 -35.328617 -9.593328 0.199534 -0.289451 0.911532 17.808470 12.115895 -9.035743 26.005264 17.621380 -3.116271 2.568244 12.555613 -0.539392 -0.466386 0.218758 -0.094191 +-0.008829 1.603109 -0.074684 -3.951068 -28.314140 -14.658726 14.656464 -1.484501 -28.988861 -16.692184 6.948024 46.013744 -0.781411 0.157537 -0.326287 0.834949 0.561806 0.796363 10.009518 8.156072 0.609379 2.790552 1.355837 44.942593 -0.529109 0.132999 -0.007122 0.334129 -0.246105 0.268468 -3.047845 5.335081 19.334686 0.839016 4.587658 12.353227 1.608082 5.275980 11.017730 0.437865 5.567584 16.024952 1.901066 7.147861 -23.041361 -16.170395 -13.187204 -11.091045 -25.422512 -21.855394 -3.810431 18.075987 -36.958931 -9.666641 0.192161 -0.295266 0.924107 19.069092 14.252347 -9.332437 27.213049 19.503361 -2.955547 3.485200 13.497530 -0.491509 -0.474513 0.224502 -0.088273 +-0.003852 1.607093 -0.080989 -2.896662 -30.115959 -14.805517 15.251166 -2.069932 -29.847027 -18.544859 8.535769 50.239414 -0.805040 0.159552 -0.347084 0.865764 0.586449 0.845685 8.913358 8.079727 -0.280793 1.316384 1.804896 44.753677 -0.552468 0.146162 -0.028084 0.351881 -0.276800 0.277291 -3.832794 5.394170 19.295912 0.814932 4.357676 12.312677 1.997712 5.024978 11.154979 0.011191 6.492095 17.167461 1.177251 8.008206 -23.738403 -15.853295 -15.522545 -11.102896 -26.583313 -23.804476 -3.760355 17.679979 -38.716789 -10.173847 0.199799 -0.308034 0.952064 20.382586 16.483505 -9.621178 28.525106 21.361944 -2.873426 4.053050 14.467405 -0.493729 -0.474997 0.232469 -0.086949 +0.001097 1.612081 -0.085637 -2.009492 -32.103107 -14.571639 15.690452 -2.468781 -30.211660 -20.086716 9.942435 53.228905 -0.824168 0.149686 -0.371978 0.900415 0.627798 0.870592 7.707985 7.885155 -1.140233 0.317813 2.014092 43.834743 -0.568441 0.149165 -0.037252 0.377586 -0.301117 0.284288 -4.087099 5.370061 18.836349 0.673531 4.316521 12.288920 2.009706 4.951563 11.451797 -0.449880 7.678872 17.719826 0.946899 8.769865 -24.558426 -15.501579 -17.728943 -11.281701 -27.603498 -26.205488 -3.452594 16.468843 -40.785332 -10.343193 0.208900 -0.300627 0.965986 22.039856 18.005072 -9.962749 29.935440 23.090492 -2.860291 4.654496 16.845171 -0.536531 -0.484247 0.229993 -0.077167 +0.006153 1.618039 -0.089065 -1.159633 -34.417976 -14.113240 16.254591 -2.486581 -30.078491 -21.829233 11.530076 55.452095 -0.817439 0.111422 -0.398393 0.929744 0.686760 0.888795 6.591913 7.667726 -1.917775 -0.506562 2.177115 42.379234 -0.581796 0.150947 -0.049624 0.403784 -0.337581 0.287185 -4.317830 5.527941 17.547800 0.622589 4.396069 12.401053 2.226631 4.937293 12.249357 -0.603485 8.691172 18.291443 0.333090 9.715027 -25.155951 -14.696858 -19.727465 -11.243314 -29.037321 -28.495146 -3.001236 15.277623 -42.961945 -10.489894 0.218893 -0.277447 0.951106 23.210218 19.423939 -10.020134 31.335407 24.357399 -2.894075 5.340564 20.328924 -0.598119 -0.478576 0.217230 -0.047901 +0.011989 1.624733 -0.092506 -0.508101 -36.275551 -13.372909 16.369020 -2.927111 -29.939592 -22.814600 12.535553 57.173092 -0.836719 0.107558 -0.423427 0.972779 0.732218 0.948996 5.427729 7.206614 -2.720895 -1.176937 2.110198 40.667812 -0.605508 0.140913 -0.063456 0.430563 -0.378063 0.311365 -4.656405 5.472090 15.542945 0.534732 4.162086 12.803163 2.584735 4.643502 13.712276 -0.035264 9.062766 18.888077 -1.375103 10.961511 -26.018171 -12.964817 -21.662720 -11.440739 -30.999987 -31.429777 -2.242731 14.988541 -45.140751 -11.083923 0.209694 -0.266970 0.957691 22.610880 21.099209 -10.295825 33.775581 26.205519 -2.374150 6.621922 22.771980 -0.497026 -0.492275 0.199208 -0.030320 +0.018954 1.632839 -0.095398 -0.188872 -37.987804 -12.384252 16.186266 -3.313287 -29.581469 -23.117594 13.074473 58.509781 -0.859864 0.137657 -0.422318 1.000346 0.754921 0.980029 4.516550 6.785149 -3.590943 -1.777411 2.037611 38.593773 -0.622438 0.119869 -0.074240 0.456210 -0.368956 0.331829 -4.081478 5.046100 13.537821 0.307615 3.955226 13.266047 2.319573 4.426194 15.248762 0.099114 9.324507 18.971975 -2.113749 11.425934 -26.141409 -11.261165 -23.439707 -11.521269 -32.529953 -34.112473 -1.371864 15.120495 -48.673763 -12.116186 0.189029 -0.266114 0.959605 21.793381 22.915958 -10.753973 35.712666 28.473804 -1.489384 8.507584 24.322695 -0.140397 -0.511834 0.180841 -0.034278 +0.025306 1.641383 -0.097301 -0.542251 -39.944088 -10.915195 16.314032 -3.403374 -28.652822 -22.771137 13.174883 59.425407 -0.911298 0.178894 -0.421773 1.002673 0.749986 0.990762 4.396669 6.370944 -4.169369 -2.806166 2.146480 35.777962 -0.615354 0.099170 -0.070744 0.482067 -0.346302 0.320824 -2.882785 4.556510 11.570958 0.197635 3.843090 13.670925 1.922955 4.362372 16.704454 -0.018685 10.005386 18.846231 -3.027206 11.904634 -26.099365 -9.734567 -25.398897 -11.464329 -34.038246 -36.989613 -0.178231 15.993881 -51.362659 -13.309598 0.160318 -0.297221 0.967722 21.165436 24.301682 -11.337437 37.767395 30.888477 -0.584838 9.875473 26.708069 0.148753 -0.547113 0.178486 -0.073544 +0.031304 1.650131 -0.098817 -0.856332 -41.929783 -9.695102 15.919070 -3.492672 -27.085224 -21.717609 12.839348 60.061893 -0.937801 0.192432 -0.437172 1.015883 0.768596 1.021454 4.173833 5.876807 -4.288719 -3.558881 2.115716 32.378529 -0.618884 0.076039 -0.078767 0.503126 -0.359664 0.332117 -2.260154 4.276648 9.761883 0.186860 3.655869 14.210108 1.881805 4.161911 18.277431 0.333169 10.605669 18.321684 -4.968009 12.809434 -26.825466 -8.415435 -26.805695 -11.385502 -35.180901 -39.826572 1.051894 17.880074 -54.470871 -15.113780 0.132578 -0.296201 0.958876 19.697815 25.482771 -12.363465 39.688690 33.755463 0.871723 12.100214 28.769585 0.842052 -0.566970 0.162527 -0.074986 +0.036861 1.658108 -0.100139 -0.708711 -43.809464 -8.467267 14.905660 -3.534812 -25.559381 -20.248421 12.217989 60.160931 -0.946055 0.210920 -0.418664 1.024623 0.787402 1.030497 3.471545 5.498128 -4.822309 -3.885707 1.971624 29.379862 -0.611777 0.046737 -0.062921 0.526348 -0.332026 0.331516 -1.974897 4.220587 7.711865 0.019630 3.570854 14.578968 1.722256 3.962033 19.697908 0.817285 11.011915 17.349674 -5.980451 13.452775 -26.642031 -6.325960 -27.790190 -11.353952 -36.349861 -42.721581 2.795760 19.648014 -57.580349 -16.854179 0.100534 -0.300538 0.929589 18.356791 26.276810 -13.279320 42.114651 36.407654 2.660153 14.139043 30.977058 1.550706 -0.589365 0.137617 -0.085893 +0.042599 1.664144 -0.102071 -0.526642 -45.121262 -7.063622 13.826838 -3.506287 -24.599703 -19.174902 11.631252 59.457645 -0.946995 0.258391 -0.387693 0.999439 0.771575 1.008299 2.826969 5.272092 -5.705747 -3.972290 1.806051 27.176693 -0.582507 -0.008145 -0.044892 0.536935 -0.267804 0.336139 -2.219940 4.336460 5.366789 0.003672 3.388917 14.782374 2.017438 3.591717 21.089649 1.700519 10.786987 16.190712 -6.775830 13.974439 -25.134264 -3.153059 -28.147654 -11.463265 -38.719383 -46.343384 5.620354 23.407269 -59.769814 -19.725792 0.033027 -0.296529 0.870817 16.166775 26.730240 -14.252510 44.815201 38.909500 4.892429 15.825143 33.364933 2.250826 -0.615879 0.101931 -0.105385 +0.048080 1.669042 -0.104226 -0.733068 -46.235039 -5.375851 12.913041 -3.198283 -23.421019 -17.914255 10.767119 57.741364 -0.954308 0.307424 -0.364783 0.986264 0.777217 0.987194 2.533220 5.195895 -6.705918 -4.037186 1.696595 25.221849 -0.553377 -0.077391 -0.025005 0.561223 -0.200391 0.349465 -2.017075 4.387517 3.086557 -0.028125 3.278562 14.960279 2.086468 3.206985 22.626192 2.779102 10.826136 14.578620 -7.635259 14.627603 -23.868572 0.433951 -27.764511 -11.965924 -40.785454 -49.879936 8.719790 27.362999 -60.750969 -22.435328 -0.046996 -0.280404 0.800177 13.817894 26.494278 -15.624992 48.139809 41.790955 7.802432 16.585855 35.660488 2.705543 -0.655214 0.055326 -0.116324 +0.053377 1.672585 -0.106142 -0.671565 -46.814785 -3.893197 11.459826 -2.942939 -22.181154 -16.140398 9.583920 55.547531 -0.950636 0.365005 -0.340331 0.966309 0.764097 0.954548 1.957998 5.182302 -7.797228 -3.645499 1.523312 23.671066 -0.517947 -0.164296 -0.022018 0.578267 -0.131754 0.372793 -1.919564 4.425741 1.148464 -0.076473 3.175823 14.957006 2.065717 2.795013 23.794067 3.826082 10.731641 12.605187 -7.889929 15.008503 -21.867220 3.222129 -27.083439 -12.216269 -42.217484 -53.365868 12.120479 31.694693 -61.845379 -25.287073 -0.122936 -0.224026 0.718904 12.114221 25.818710 -16.546345 51.171307 44.459446 10.872104 16.401535 38.809841 2.942775 -0.682854 -0.019257 -0.122532 +0.059708 1.674683 -0.107227 -0.859234 -46.958382 -2.335909 9.919062 -2.736645 -20.640936 -14.101479 8.071872 52.302254 -0.958169 0.440343 -0.315949 0.939822 0.745111 0.919628 1.410876 5.200613 -8.952253 -2.924253 1.288273 22.457314 -0.481776 -0.251803 -0.021149 0.597846 -0.051501 0.399063 -1.350319 4.238487 -0.561026 -0.121929 2.950678 14.955166 1.860435 2.281338 24.973686 4.827607 10.758275 10.633663 -8.282496 15.194546 -20.152388 6.449837 -25.609381 -12.709257 -43.667767 -56.592579 15.710822 35.943020 -62.011654 -27.848598 -0.213995 -0.185012 0.638861 9.052210 24.649481 -17.605297 55.137161 47.822521 15.320253 15.135632 43.891220 2.928677 -0.717636 -0.082079 -0.135897 +0.065416 1.676155 -0.108555 -0.878984 -46.990540 -1.003827 8.527240 -2.343069 -18.514132 -12.292443 6.673387 47.958683 -0.971574 0.502153 -0.290632 0.947485 0.767150 0.897013 1.071578 5.108507 -9.644040 -2.864466 1.226002 20.680563 -0.453429 -0.340292 -0.010996 0.641907 0.025014 0.420717 -0.767321 4.114294 -2.158368 -0.179680 2.845925 15.011827 1.526419 1.896911 26.267313 5.323076 10.922235 8.268052 -8.490258 14.956399 -18.852190 9.191633 -24.203531 -13.362367 -45.204578 -60.212364 19.946867 39.044483 -61.700741 -29.297483 -0.289116 -0.141418 0.558560 7.379398 23.140976 -18.209124 58.328152 51.342308 20.247238 12.153774 49.311752 2.164521 -0.762205 -0.156868 -0.142680 +0.070576 1.675576 -0.109205 -1.230472 -46.656609 0.442605 7.331985 -1.740466 -16.060001 -10.061866 5.214743 42.836052 -0.997944 0.571828 -0.276640 0.947832 0.780475 0.880163 1.053766 5.037213 -10.068597 -2.993827 1.212883 18.801537 -0.425038 -0.432788 -0.008094 0.684772 0.094772 0.446590 -0.284973 3.882831 -3.749554 -0.072697 2.528199 14.991328 1.398276 1.312439 27.576986 6.027594 11.206347 5.910971 -9.104285 15.137292 -17.829308 11.725971 -22.904642 -13.194918 -47.234917 -64.533775 25.224836 48.677532 -60.326427 -34.716457 -0.376537 -0.100843 0.483832 4.899434 21.511467 -18.576088 61.936188 55.069584 26.199390 4.828767 54.079399 -1.240528 -0.812577 -0.227911 -0.154991 +0.075876 1.673657 -0.109018 -2.077862 -46.110245 2.012757 6.535984 -1.331937 -13.081786 -8.285513 3.906640 36.841415 -1.018823 0.641023 -0.253573 0.927581 0.766131 0.849975 1.363298 4.890635 -10.263627 -2.874372 1.114060 16.737457 -0.388357 -0.516681 -0.005158 0.712771 0.169920 0.458273 0.481760 3.436158 -5.048006 0.158610 2.045128 14.902683 1.410088 0.645872 28.431152 6.507666 11.548370 4.081892 -9.396035 15.291439 -16.265709 13.629256 -22.269430 -12.785307 -47.420818 -67.600021 28.423721 55.280792 -57.893425 -37.501396 -0.455382 -0.070563 0.415153 2.309518 20.545267 -18.556328 63.445854 58.406113 31.174095 -3.587263 57.647339 -5.777683 -0.851452 -0.290484 -0.180625 +0.081399 1.670869 -0.107950 -3.024992 -45.163448 3.657308 5.893311 -1.174371 -10.053085 -6.714139 2.707225 30.537392 -1.019406 0.691615 -0.225973 0.901554 0.746145 0.812211 1.922684 4.651367 -10.529010 -3.311572 1.057028 14.482162 -0.352628 -0.579892 0.002972 0.725711 0.238784 0.462736 1.321715 2.750009 -6.127728 0.409789 1.401359 14.669721 1.591582 -0.009055 28.826303 6.777174 12.019965 2.717205 -9.378774 15.401419 -14.719897 14.439263 -21.786655 -12.179305 -48.106052 -69.398895 30.808195 59.139744 -55.577740 -38.558247 -0.514520 -0.042489 0.351448 -0.302565 19.854856 -17.972563 63.413548 61.707382 35.246841 -15.484043 60.341480 -12.905975 -0.872714 -0.338976 -0.199186 +0.087997 1.667311 -0.107076 -4.209492 -43.682922 5.327074 5.640352 -1.121407 -7.192679 -4.969370 1.564939 24.122175 -1.042845 0.742357 -0.223079 0.920845 0.791623 0.796968 2.511583 4.493289 -10.739907 -3.291160 0.951021 12.801895 -0.332223 -0.665120 0.001257 0.783237 0.295874 0.487380 2.675274 1.955778 -7.170510 0.667585 0.729253 14.539393 1.773978 -0.718704 29.603876 6.918083 12.356170 0.999013 -9.626181 15.236059 -13.834995 15.685409 -19.757973 -12.304187 -52.083424 -71.228249 35.669212 61.458885 -53.491234 -38.906113 -0.587467 0.003552 0.274759 -2.650172 18.035553 -18.101049 64.836891 65.297920 40.881710 -27.158100 60.834400 -19.952339 -0.919769 -0.409900 -0.196231 +0.094787 1.664079 -0.106596 -4.985158 -41.739777 6.478364 5.355981 -1.161506 -4.619622 -3.154108 0.644335 18.145716 -1.090246 0.817315 -0.219817 0.915304 0.789075 0.788350 2.564704 4.277537 -10.861807 -2.881729 0.762308 11.261994 -0.306446 -0.734677 -0.003111 0.822015 0.355988 0.500772 3.502032 1.115947 -7.960092 0.944044 -0.097512 14.434904 2.296673 -1.536874 30.153122 7.272769 12.537025 -0.196136 -10.017186 15.306556 -13.035751 15.669153 -17.467937 -12.309466 -56.735508 -72.494247 40.849648 63.261333 -51.987835 -39.211372 -0.667121 0.012065 0.229978 -4.700796 16.199377 -18.488214 66.628220 68.156883 46.066250 -34.702087 59.956367 -24.123089 -0.970360 -0.451779 -0.225195 +0.101391 1.662085 -0.106556 -5.300417 -40.164059 6.764904 4.916523 -1.123915 -2.158214 -1.728130 0.088607 13.530686 -1.099236 0.839905 -0.209688 0.915599 0.801475 0.780011 2.097042 4.026699 -10.743176 -2.141443 0.577856 10.268116 -0.295503 -0.763969 0.000655 0.844227 0.386985 0.501329 3.746252 0.343584 -8.364570 1.232044 -0.869282 14.649433 2.940700 -2.295182 30.753368 7.235092 12.683440 -0.707292 -10.284906 15.279030 -12.616693 15.196456 -16.014782 -11.866718 -56.073547 -72.118721 40.071522 67.018219 -51.379295 -41.398281 -0.697536 0.014138 0.198975 -6.720199 15.631665 -18.756304 65.503212 70.584396 47.880749 -40.419041 58.486000 -26.962854 -0.987462 -0.472984 -0.233663 +0.106544 1.661798 -0.106456 -4.944256 -39.087788 6.348263 4.325727 -0.970683 0.016181 -1.205743 -0.157807 9.864465 -1.096951 0.822241 -0.219537 0.954418 0.851100 0.799497 1.295098 3.731236 -10.465878 -1.462644 0.427104 9.707247 -0.313712 -0.764381 -0.004805 0.867795 0.368795 0.511673 3.171412 -0.430666 -8.544799 1.389963 -1.645985 15.086342 3.622384 -2.982769 31.504795 6.846983 12.960088 -0.861428 -10.437006 15.113918 -13.143548 13.846340 -14.872466 -11.076325 -54.482483 -70.344421 37.039261 72.295982 -51.172344 -45.048656 -0.682150 0.032925 0.196125 -8.196864 15.559580 -19.170992 64.083588 72.440781 48.616299 -43.497639 57.674503 -28.336992 -0.988700 -0.487447 -0.210443 +0.111254 1.662997 -0.106018 -4.740160 -38.537167 6.115050 4.048481 -0.737400 1.379201 -1.179225 -0.227580 7.158032 -1.084738 0.788376 -0.228655 1.000917 0.920972 0.829529 0.713187 3.411147 -10.135060 -0.925823 0.299939 8.839221 -0.336795 -0.755659 -0.007592 0.898849 0.341237 0.516950 2.366146 -0.958242 -8.728352 1.630340 -2.214990 15.438787 4.476635 -3.578359 32.226089 6.641571 12.948731 -0.745057 -10.782589 14.985612 -13.848970 13.948818 -13.862144 -10.626502 -56.628014 -69.249527 36.820278 75.675552 -49.002544 -46.430412 -0.661248 0.045069 0.186051 -9.989197 15.184614 -19.792603 63.833912 73.167816 49.030106 -44.953426 57.150688 -29.091829 -0.983364 -0.499070 -0.180107 +0.117050 1.664436 -0.105003 -4.902152 -38.577633 6.606191 3.967666 -0.571117 1.688066 -1.402363 -0.226259 5.278137 -1.077761 0.775152 -0.227254 1.014740 0.938797 0.830495 0.492277 3.368220 -10.587141 -0.772997 0.246548 8.689735 -0.344673 -0.747596 -0.001659 0.902613 0.336509 0.516506 2.692729 -1.349458 -8.828351 1.617638 -2.523815 15.354789 4.594627 -3.812340 32.288555 6.288514 13.026314 -0.367314 -10.775361 14.813252 -14.011901 13.776206 -13.612578 -9.788488 -60.582260 -68.036064 37.971722 78.955338 -46.889603 -47.705170 -0.646007 0.045985 0.189765 -11.118945 14.942119 -19.831707 66.460342 73.011261 51.017929 -46.437981 57.026867 -30.156076 -0.980619 -0.496784 -0.170941 +0.122907 1.666118 -0.104573 -4.451474 -38.422558 6.790403 3.186703 -0.593420 1.158560 -1.276390 -0.268725 4.707998 -1.069638 0.768653 -0.232556 1.016225 0.945699 0.824963 0.018032 3.191138 -10.856431 -1.310403 0.235380 8.007919 -0.350006 -0.756330 -0.000957 0.898630 0.330614 0.531174 2.337476 -1.658933 -8.863449 1.543133 -2.792575 15.227049 4.852370 -4.019577 32.291412 6.229304 13.150345 -0.183849 -11.170837 15.021295 -14.089559 13.014682 -13.408588 -8.975149 -65.255104 -67.021538 40.152306 82.305130 -45.638062 -49.411636 -0.647906 0.061677 0.185085 -11.717545 14.692482 -19.848322 69.128975 72.343956 52.539219 -47.315952 57.403542 -31.085566 -0.980848 -0.502920 -0.156300 +0.128755 1.667961 -0.103188 -4.070812 -38.260422 7.089659 2.559883 -0.654498 0.366627 -1.238704 -0.282167 4.543143 -1.077106 0.788649 -0.222730 0.994107 0.917558 0.828116 -0.513203 2.922876 -10.851745 -1.647080 0.162917 6.766772 -0.346808 -0.757777 0.008350 0.884187 0.340838 0.534871 2.385808 -1.728528 -8.986812 1.525151 -2.863063 14.998963 5.042413 -4.071307 32.190971 6.303298 12.619086 0.119050 -12.283116 15.076365 -14.216791 12.455155 -13.078830 -8.884089 -72.097710 -67.240944 45.277969 81.637329 -44.454758 -48.337662 -0.669855 0.028617 0.190516 -11.799401 14.050757 -19.717897 72.974464 71.297256 54.834290 -47.838268 58.205597 -31.992229 -0.988223 -0.485575 -0.170921 +0.133951 1.667378 -0.100825 -4.089847 -38.572506 7.906460 2.023226 -0.771835 -0.614322 -0.956871 -0.310606 4.438101 -1.090999 0.837962 -0.221204 0.939800 0.833757 0.820332 -0.772714 2.743091 -11.101755 -2.010183 0.080789 5.364624 -0.320281 -0.772708 -0.000133 0.844304 0.358260 0.544182 3.062252 -1.634425 -9.226872 1.376643 -2.750168 14.442250 4.875720 -3.944598 31.619038 6.492706 12.150744 0.513427 -13.014243 15.226171 -13.560247 12.360047 -12.960727 -9.066564 -79.192009 -67.515518 50.885387 78.395531 -42.794807 -45.265221 -0.717387 0.013727 0.188676 -11.302478 13.244636 -19.318937 77.865608 69.759842 57.727581 -47.193928 59.089581 -32.161739 -0.993525 -0.474057 -0.192754 +0.138287 1.666525 -0.098410 -4.151379 -39.715862 8.555477 1.746907 -0.754878 -1.088156 -1.389479 -0.252810 4.218377 -1.094460 0.847454 -0.218103 0.918178 0.790864 0.826976 -1.008653 2.547835 -11.201224 -2.324178 0.017737 3.860257 -0.313390 -0.762404 -0.003633 0.820353 0.350867 0.538424 3.126805 -1.284690 -9.438453 1.382890 -2.418868 14.068754 5.008206 -3.604424 31.115501 6.412742 11.882789 1.204330 -13.347988 15.287351 -13.348889 12.705297 -13.583503 -9.407660 -85.446564 -67.152603 54.847454 74.411972 -41.302387 -42.276527 -0.715568 -0.002619 0.206030 -10.225543 13.082952 -19.100153 79.090797 68.281090 57.511650 -43.573631 60.552917 -30.385550 -0.984893 -0.460988 -0.207544 +0.142154 1.664005 -0.096399 -4.677720 -41.686428 9.656706 1.885013 -0.656468 -1.603452 -2.277337 -0.131871 4.024805 -1.096539 0.847049 -0.216312 0.899181 0.765406 0.823466 -0.900262 2.684221 -12.250626 -2.741712 0.018088 3.545446 -0.316231 -0.743360 -0.003258 0.803856 0.347300 0.530707 3.160746 -0.712731 -9.501808 1.436634 -1.890032 13.627561 5.169096 -3.120769 30.388159 6.273380 12.225251 1.860964 -13.435210 15.693666 -13.532401 13.751966 -14.217770 -9.579228 -91.074524 -66.179016 58.107872 71.605705 -41.023403 -41.015305 -0.707246 -0.029610 0.230715 -8.760969 13.039057 -19.083811 80.860359 66.582199 57.432156 -37.243942 61.676510 -26.572687 -0.976292 -0.434797 -0.222670 +0.146416 1.661711 -0.094626 -4.921983 -42.801075 10.401458 1.961649 -0.653288 -2.308728 -2.962060 -0.032566 4.267697 -1.101563 0.853457 -0.224961 0.870326 0.719591 0.826937 -0.979882 2.826349 -13.204652 -3.001142 0.008811 3.600504 -0.311085 -0.731952 -0.012616 0.774296 0.332458 0.530921 3.247879 -0.434707 -9.442404 1.396472 -1.644224 13.281281 5.101701 -2.848711 29.631275 6.132382 12.535857 2.332519 -13.839775 16.173334 -13.591652 14.036519 -14.964469 -10.235558 -94.001587 -65.193275 59.397999 65.991959 -42.356003 -38.854191 -0.711980 -0.044189 0.250843 -6.929202 13.165133 -19.168177 81.738197 65.022469 56.448383 -29.359505 61.857716 -21.390314 -0.967768 -0.414291 -0.232128 +0.149290 1.659856 -0.091518 -5.146772 -44.025570 10.659870 1.861766 -0.618712 -2.457432 -3.627368 0.076044 4.691832 -1.113603 0.862037 -0.234416 0.836180 0.655577 0.837443 -1.104248 2.909253 -13.575015 -3.150526 -0.015004 3.813988 -0.314156 -0.699742 -0.017814 0.729508 0.310522 0.530876 3.055251 -0.057957 -9.364016 1.450817 -1.412310 13.194138 5.110569 -2.577329 29.038452 6.297140 12.702289 3.478209 -14.333034 16.750994 -14.108746 14.413742 -15.568020 -11.278418 -95.429695 -63.821934 59.185909 57.418194 -45.314835 -35.808811 -0.706590 -0.085103 0.302984 -5.280315 13.301097 -19.151182 81.850861 62.609364 53.425987 -20.594717 61.990658 -15.891312 -0.957578 -0.366274 -0.250480 +0.152399 1.658607 -0.088739 -5.101358 -44.078457 10.554264 1.762973 -0.619790 -2.705960 -4.132512 0.163494 5.248610 -1.065822 0.808932 -0.239849 0.811836 0.623993 0.841892 -1.365934 2.949719 -13.787544 -3.244636 -0.017868 4.303505 -0.331706 -0.644221 -0.022773 0.671724 0.259055 0.532400 2.976861 -0.084707 -9.119883 1.366517 -1.515588 13.196385 4.765889 -2.713930 28.262587 6.814708 12.806744 5.025874 -14.482751 17.505720 -14.744325 14.495887 -16.764977 -12.363049 -92.717079 -62.055065 55.235191 46.282558 -50.457123 -31.692688 -0.660865 -0.094262 0.338789 -3.421954 14.127910 -18.576777 82.206139 59.136444 48.684807 -12.521753 61.617619 -11.249223 -0.906939 -0.322045 -0.224770 +0.155542 1.657279 -0.085214 -4.992289 -43.029907 10.302081 1.799044 -0.734454 -3.166370 -4.538305 0.242601 6.367111 -1.036913 0.752425 -0.246099 0.799819 0.595353 0.851504 -1.727636 3.030383 -13.933911 -3.180070 0.005409 5.350820 -0.342926 -0.582150 -0.018190 0.625031 0.202747 0.512445 3.246763 -0.343732 -8.779749 1.318521 -1.792602 13.138346 4.421697 -2.928024 27.262768 7.133666 12.467698 6.503696 -14.343180 17.727160 -15.214037 13.763721 -18.234430 -13.430535 -90.439125 -59.598083 50.590897 32.098812 -54.040592 -24.599171 -0.596401 -0.113991 0.388799 -1.226582 14.862134 -17.865034 81.529343 55.168659 42.481625 -3.667370 60.634468 -6.241711 -0.865408 -0.278168 -0.215349 +0.158491 1.655743 -0.081319 -5.068333 -41.067970 10.106946 2.219613 -0.983507 -3.892625 -4.928264 0.300052 8.002980 -0.974695 0.673846 -0.249245 0.785369 0.561364 0.864256 -1.804403 3.097839 -13.968277 -3.114265 0.019697 6.572827 -0.362699 -0.512554 -0.022638 0.559440 0.124588 0.503094 3.246873 -0.894110 -8.172311 1.569622 -2.382916 12.990288 4.773133 -3.400424 25.807117 7.534362 11.780448 8.253345 -14.297837 18.063457 -15.435966 12.291859 -20.430418 -13.915789 -87.921021 -56.758984 44.783585 17.719345 -55.451141 -16.588863 -0.510555 -0.109447 0.436906 0.317219 15.617240 -17.052387 78.412018 50.447380 34.290943 8.714778 60.411060 0.767698 -0.795650 -0.242457 -0.184958 +0.162926 1.654540 -0.078211 -4.871679 -38.688713 9.761529 2.260157 -1.424712 -5.083307 -4.831028 0.272306 10.155741 -0.929159 0.591818 -0.264899 0.778132 0.545931 0.891141 -2.257285 3.204778 -14.475119 -2.807207 0.011261 8.639344 -0.386443 -0.438901 -0.028916 0.507698 0.036384 0.489523 3.615349 -1.483473 -7.302910 1.715158 -2.932990 12.817417 4.830313 -3.806264 24.267712 7.908114 10.728236 9.849509 -14.754625 18.273989 -16.239548 10.317590 -21.980553 -14.548903 -85.792686 -53.839848 39.431683 2.632618 -54.322548 -7.791092 -0.432590 -0.123592 0.486953 1.359591 15.725340 -16.802837 77.041733 45.500538 26.988073 19.085180 56.334438 5.642725 -0.736002 -0.196466 -0.155901 +0.167670 1.652201 -0.075964 -4.816630 -36.790577 9.367983 2.466438 -1.855611 -6.022723 -5.049363 0.254085 12.265924 -0.890086 0.510714 -0.288790 0.798678 0.555843 0.921003 -2.412832 3.453909 -15.473419 -2.841933 0.052842 11.852003 -0.429361 -0.365020 -0.042164 0.468560 -0.055111 0.493362 4.239603 -1.800911 -6.213076 1.862685 -3.158482 12.595392 4.732828 -3.848646 22.623755 8.044323 9.594744 11.559546 -14.349407 17.979103 -17.310083 8.532695 -23.883814 -15.057103 -83.152710 -51.063713 33.961685 -8.430391 -50.342369 -1.799217 -0.341301 -0.123655 0.553789 2.455341 15.799919 -16.267269 75.115257 40.511330 19.463898 24.019423 50.752930 6.489604 -0.683317 -0.154140 -0.114255 +0.172909 1.649592 -0.074148 -4.478417 -35.145138 8.876101 2.365196 -2.374192 -7.190221 -5.518082 0.285005 14.595009 -0.847710 0.429252 -0.295581 0.817548 0.578810 0.953382 -2.935126 3.624351 -16.941275 -2.514184 0.023516 15.458811 -0.462106 -0.291627 -0.037040 0.440824 -0.127184 0.480081 4.448170 -2.098420 -4.941921 2.011973 -3.327550 12.311473 4.844123 -3.878735 21.023130 7.943216 8.780449 12.722813 -14.475996 17.711874 -18.331877 5.413836 -24.815405 -15.323556 -80.279602 -48.015671 28.767843 -16.461260 -44.307777 1.851089 -0.264389 -0.148040 0.597518 3.838594 15.699075 -15.997826 72.945160 36.886215 14.157047 24.673544 44.276363 5.275273 -0.636407 -0.109438 -0.081147 +0.177853 1.645390 -0.071415 -3.791245 -33.846031 8.387157 1.852908 -2.899937 -8.296381 -6.096842 0.341151 16.631353 -0.808238 0.355307 -0.302025 0.831616 0.598727 0.951845 -3.781037 3.740919 -19.018318 -2.164133 -0.041196 19.654463 -0.487705 -0.232848 -0.030307 0.416189 -0.179527 0.467214 4.306993 -2.352704 -3.638881 2.095264 -3.466448 11.781212 5.023437 -3.875977 19.177557 7.386358 8.591800 13.662288 -13.834954 17.137136 -18.778818 1.960691 -25.163218 -14.632752 -78.016800 -44.202263 23.552284 -19.917215 -38.329239 2.590349 -0.187717 -0.154263 0.635079 5.163298 15.574767 -15.607550 70.591850 33.865841 10.379823 24.017225 37.946579 3.954708 -0.597360 -0.074694 -0.049744 +0.183308 1.641796 -0.068703 -3.681135 -33.151340 8.070025 1.865900 -3.263278 -9.093833 -7.076929 0.525211 18.374027 -0.798733 0.300127 -0.318664 0.838479 0.605428 0.959621 -4.173430 4.119389 -21.660055 -1.905512 -0.082959 24.898504 -0.506839 -0.166358 -0.028408 0.397086 -0.230968 0.442493 4.744067 -2.604010 -2.125001 2.256796 -3.581299 11.288576 5.008955 -3.833755 17.503284 6.419683 8.837600 14.846249 -13.476909 16.512730 -19.515322 -1.287033 -25.412186 -13.747530 -75.364235 -40.273064 18.525545 -19.840181 -32.175537 1.762491 -0.122956 -0.192694 0.686309 6.177608 15.792447 -15.426707 68.357788 31.555937 7.664391 21.241856 31.155571 2.268438 -0.569114 -0.019661 -0.039187 +0.189393 1.637760 -0.065810 -3.720657 -32.206123 7.651282 2.004519 -3.678839 -9.836908 -7.989707 0.724398 20.425817 -0.760992 0.249768 -0.309020 0.846747 0.610231 0.966991 -4.569657 4.494790 -24.502705 -1.122313 -0.321967 30.765654 -0.523824 -0.115091 -0.017938 0.373039 -0.266962 0.427568 5.576309 -2.850151 -0.464693 2.555452 -3.584078 10.752144 4.959300 -3.723801 15.846239 5.325629 8.634088 15.645189 -13.433267 15.707110 -19.426193 -5.470442 -25.574333 -12.463014 -71.813065 -36.774284 14.242193 -18.183001 -26.963381 0.834180 -0.061498 -0.211856 0.711779 7.203215 16.091066 -14.941464 65.143066 29.111261 5.211731 18.671806 25.223808 1.173900 -0.532027 0.009685 -0.019613 +0.194395 1.632803 -0.063588 -3.231553 -30.929041 6.858565 1.773720 -4.101543 -10.373734 -8.927192 0.938995 22.065350 -0.725303 0.186942 -0.318703 0.872240 0.637902 0.986968 -5.462763 4.586460 -27.163103 0.127730 -0.821714 36.262287 -0.552885 -0.064471 -0.024821 0.358027 -0.325464 0.425053 5.291738 -2.864788 1.258097 2.988086 -3.640156 10.240232 5.567379 -3.770025 14.406233 4.510455 8.365150 16.270124 -13.276519 15.029097 -20.173136 -7.593249 -24.577877 -11.412386 -69.818794 -33.859203 11.203640 -15.123612 -23.856007 -0.217358 0.006055 -0.206937 0.740991 7.802942 15.485609 -14.418867 62.464172 26.800749 3.287712 15.403626 20.315866 0.300987 -0.492762 0.030450 0.016900 +0.199468 1.629317 -0.061418 -2.898714 -29.681501 5.870984 1.895730 -4.475026 -10.590205 -10.181825 1.255313 23.522692 -0.724974 0.146599 -0.336209 0.882914 0.638385 1.002475 -6.115812 4.700952 -29.537872 1.648692 -1.540842 41.458977 -0.568589 -0.009576 -0.027956 0.343671 -0.376250 0.405295 4.895731 -2.932024 3.379297 3.563492 -3.887345 9.761519 6.236234 -3.949844 12.988148 3.558750 8.314308 17.141518 -13.135340 14.367659 -21.049139 -9.910426 -23.669518 -10.299650 -66.558167 -30.758142 8.031378 -11.624775 -21.327078 -1.136563 0.063747 -0.232437 0.790183 9.075508 14.934098 -13.808750 59.144989 24.671946 1.479747 11.770635 15.992798 -0.301133 -0.470865 0.071178 0.022373 +0.203855 1.624201 -0.058090 -2.629579 -28.410467 5.047889 1.947702 -4.909387 -10.967044 -11.035223 1.555276 25.477037 -0.688370 0.129967 -0.322121 0.851673 0.598775 0.973703 -6.486128 4.818720 -32.389385 2.907674 -2.365039 47.160591 -0.562033 0.015903 -0.023939 0.302312 -0.378122 0.398145 4.998044 -3.110595 5.404242 4.020192 -4.073726 9.107855 6.576442 -4.041526 11.299379 2.619753 8.141638 17.236959 -12.970862 13.684276 -20.442793 -12.173937 -22.142656 -9.391544 -63.350090 -27.746367 5.657024 -9.421108 -18.544302 -1.481310 0.088213 -0.236741 0.793615 10.041064 13.447751 -13.078409 56.055981 22.263443 0.006051 9.110870 12.424438 -0.542901 -0.438307 0.093594 0.031726 +0.206558 1.620261 -0.054102 -2.579285 -27.030783 3.905214 2.193041 -5.118251 -10.440008 -11.731739 1.839855 26.942944 -0.670667 0.106306 -0.319521 0.839352 0.575707 0.980028 -5.922709 5.223995 -34.627769 3.335677 -2.860260 52.538612 -0.569161 0.054167 -0.021103 0.271084 -0.405383 0.389587 5.081206 -3.273753 7.688556 4.604631 -4.311306 8.630200 6.929250 -4.148957 9.902285 2.230366 7.774840 17.572731 -13.491461 13.308335 -20.964165 -13.982994 -20.404556 -8.745137 -59.872799 -24.946609 3.649870 -7.365471 -16.181147 -1.686979 0.119134 -0.259946 0.819565 9.670031 11.711251 -12.443888 53.719810 20.020018 -1.216445 6.452978 9.831444 -0.684007 -0.413292 0.126729 0.037462 +0.209238 1.617720 -0.049618 -2.448963 -26.234571 2.501436 2.375989 -5.115589 -9.258163 -12.836029 2.252694 27.794682 -0.665110 0.086009 -0.329235 0.833262 0.564884 0.964623 -5.266737 5.865745 -36.718525 4.138410 -3.463048 57.418667 -0.572619 0.075839 -0.026541 0.255885 -0.426751 0.383084 5.098778 -3.299753 10.047618 5.168306 -4.453836 8.310069 7.203218 -4.160669 8.788762 1.265124 7.959083 17.824543 -13.343112 12.685974 -21.318361 -15.072963 -18.624985 -8.199430 -56.492081 -22.251076 1.979178 -5.183663 -14.359780 -1.866831 0.152452 -0.261217 0.841903 9.763039 9.814312 -12.009745 50.379032 18.102114 -2.084780 4.678450 7.296798 -0.614830 -0.396773 0.144943 0.043737 +0.213050 1.616395 -0.044062 -2.477626 -25.583950 1.134860 2.446629 -5.093029 -7.781987 -13.718141 2.549747 28.231613 -0.650031 0.086525 -0.313719 0.812903 0.526092 0.965160 -4.345796 6.413343 -37.727325 5.292819 -4.207455 59.874550 -0.569063 0.094820 -0.020372 0.225577 -0.431553 0.377287 5.368691 -3.518675 12.142909 5.688255 -4.636598 8.160872 7.295374 -4.185848 7.942498 0.932564 7.465970 17.837507 -14.010962 12.280703 -21.185457 -16.195415 -16.694933 -7.628699 -52.625534 -19.637558 0.561332 -3.642333 -13.151987 -1.899352 0.165656 -0.279686 0.853868 8.520665 8.301280 -11.396812 47.538345 16.361395 -2.569279 3.455353 4.880548 -0.454788 -0.378742 0.162765 0.038497 +0.217336 1.616453 -0.038420 -2.286617 -25.117910 -0.636689 1.986293 -5.084488 -5.939081 -14.112706 2.645925 28.494408 -0.632304 0.063293 -0.300490 0.807424 0.519311 0.950874 -3.194491 6.859639 -37.570408 6.066957 -4.599330 60.515621 -0.570016 0.119315 -0.009515 0.213131 -0.435593 0.357969 5.798743 -3.771970 14.191962 6.053557 -4.701538 8.294361 7.031574 -4.094211 7.448591 0.239990 7.740993 17.806854 -13.703785 11.927844 -21.271889 -16.054817 -15.618456 -6.624852 -48.945755 -16.865530 -0.683796 -2.067552 -12.982361 -1.973437 0.199944 -0.290488 0.866414 6.860387 7.078993 -10.348022 44.608337 14.283694 -3.020995 2.963342 3.447149 -0.298268 -0.360637 0.177405 0.035423 +0.221250 1.615319 -0.030837 -2.166203 -24.630690 -1.663722 1.515905 -5.174159 -4.827649 -14.471898 2.769121 29.009676 -0.600593 0.070499 -0.270768 0.743624 0.453749 0.892089 -1.901205 7.162938 -37.692253 6.769125 -4.928093 60.020603 -0.535954 0.111024 0.003509 0.173496 -0.396985 0.339500 6.378611 -4.183243 15.112103 6.172395 -4.737058 8.396427 6.765175 -3.990396 7.125211 0.108338 7.708813 16.786697 -13.546597 11.916632 -19.829775 -15.221964 -13.651916 -5.751749 -46.389057 -14.438077 -1.558282 -0.554936 -13.152649 -2.043138 0.188790 -0.289363 0.838840 4.676977 4.906705 -9.400670 42.898899 12.146390 -3.640697 1.656223 3.159911 -0.287754 -0.340275 0.179447 0.018132 +0.224661 1.615004 -0.023049 -2.055101 -23.829338 -2.975442 1.081498 -5.366776 -3.480710 -14.614173 2.810500 29.752996 -0.580074 0.087083 -0.245907 0.686938 0.390968 0.825781 -0.878860 7.192424 -37.356110 8.201337 -5.672806 58.829304 -0.500118 0.103878 0.024154 0.136142 -0.348393 0.324482 7.110904 -4.645409 16.056213 6.283606 -4.748927 8.607339 6.359359 -3.813424 6.912333 -0.444602 7.587723 15.901487 -12.809057 11.334287 -18.524189 -14.213674 -11.942996 -5.137749 -43.866344 -12.573420 -2.079563 0.714412 -13.109380 -2.073658 0.173702 -0.291662 0.817658 3.064054 2.571803 -8.369623 40.710045 9.655045 -4.404863 0.360695 3.894627 -0.319801 -0.334030 0.190125 0.002431 +0.228723 1.614228 -0.013135 -2.041801 -22.954294 -4.169893 0.394290 -5.555633 -1.919752 -14.591467 2.741154 30.261702 -0.562184 0.104488 -0.218997 0.637668 0.336687 0.781187 0.177427 7.040009 -36.515480 9.750964 -6.347628 56.410931 -0.475205 0.096511 0.041173 0.103359 -0.310694 0.316994 8.046453 -5.338715 16.680611 6.365494 -4.895295 8.906464 5.858542 -3.778972 6.917534 -0.668868 7.227249 14.600461 -13.153727 11.007820 -18.080950 -13.998933 -9.715944 -4.894775 -40.921242 -10.897231 -2.568496 1.856445 -13.603149 -2.119638 0.155882 -0.300594 0.800210 1.558456 0.042937 -7.874634 38.117565 7.941613 -4.851634 -0.943324 4.074091 -0.304717 -0.327695 0.199637 -0.012387 +0.233018 1.613229 -0.002619 -2.056665 -22.119368 -5.023495 -0.362816 -5.720055 -0.578047 -14.546800 2.626470 30.498734 -0.509479 0.104380 -0.184608 0.601993 0.300938 0.747661 1.292220 6.826552 -35.948139 11.114471 -6.784885 53.397564 -0.454093 0.078111 0.056263 0.068971 -0.284203 0.324373 9.215619 -6.142268 16.680567 6.343857 -4.990275 9.155828 5.281582 -3.772311 7.048426 -0.810808 6.742489 13.154643 -13.888503 10.898558 -17.038511 -13.540312 -7.637950 -4.623315 -38.357166 -9.490891 -2.898944 3.393082 -13.749544 -2.143231 0.142634 -0.272378 0.754306 -0.374009 -2.491237 -7.236812 35.854542 6.106411 -5.189278 -1.819005 4.761631 -0.318013 -0.305341 0.178193 0.001749 +0.236862 1.612537 0.007657 -1.725216 -21.339085 -5.937430 -1.456206 -5.890038 0.603888 -14.389922 2.487462 30.867016 -0.467344 0.106356 -0.154289 0.573984 0.274580 0.705853 2.280473 6.587149 -35.320629 11.818334 -6.785094 50.434319 -0.430463 0.055359 0.069255 0.047685 -0.249134 0.325109 10.032748 -6.845631 16.477690 6.122768 -5.138239 9.398839 4.615995 -3.864534 7.240083 -1.097282 6.626784 11.815160 -13.572453 10.636536 -15.706458 -12.353410 -5.602449 -4.248758 -36.042843 -8.030957 -3.102039 4.601740 -14.035872 -2.149399 0.133448 -0.237907 0.710573 -1.906721 -4.765110 -6.783354 33.498581 4.657531 -5.353775 -2.893635 5.280101 -0.335961 -0.289823 0.150717 0.009177 +0.241572 1.611866 0.017851 -1.249826 -20.869225 -6.807131 -2.470140 -6.057405 1.476139 -14.745549 2.538543 31.418257 -0.432540 0.122809 -0.118299 0.539019 0.236929 0.654842 3.155160 6.387020 -34.742477 12.157935 -6.587288 47.521358 -0.401949 0.028409 0.084073 0.027185 -0.198550 0.322055 11.136605 -7.642877 16.154589 5.693991 -5.246580 9.628061 3.579639 -3.931761 7.420284 -1.653527 6.734112 10.493245 -13.025815 10.277324 -13.970187 -10.855429 -3.764762 -3.729257 -33.783527 -6.491786 -3.186473 5.447280 -14.330245 -2.110219 0.118431 -0.211203 0.668036 -3.683405 -6.718032 -6.234053 31.197969 3.397299 -5.334574 -3.333689 6.100046 -0.351692 -0.279308 0.125034 0.004580 +0.245438 1.611745 0.027108 -0.406381 -20.720381 -8.002530 -3.568417 -6.142345 2.381830 -15.562885 2.771184 31.928183 -0.431420 0.139155 -0.105472 0.504654 0.206354 0.612895 3.927871 6.285587 -33.950470 12.257437 -6.179771 44.537949 -0.377832 0.010202 0.097563 0.016162 -0.162029 0.312303 11.388369 -8.015214 16.041689 5.233425 -5.344669 10.024038 2.808575 -3.967666 7.848491 -1.716463 6.841720 9.684943 -12.925175 10.299583 -13.257487 -9.800729 -2.117863 -3.490895 -31.199598 -5.060237 -3.232592 6.552756 -14.953437 -2.155915 0.095794 -0.212339 0.647986 -4.967220 -8.380969 -6.015828 28.897964 2.465482 -5.281107 -4.415234 5.208174 -0.258431 -0.287061 0.123772 -0.011843 +0.249244 1.612171 0.036555 0.191367 -20.605526 -9.026384 -4.248478 -6.148026 3.274610 -16.468519 3.030528 32.124470 -0.422023 0.168055 -0.076619 0.478701 0.179473 0.574375 4.985765 6.271129 -32.759853 12.047461 -5.575088 40.923805 -0.353344 -0.003018 0.115113 0.009624 -0.103811 0.301709 11.800886 -8.365379 15.511666 4.840786 -5.417903 10.482122 2.078977 -3.982810 8.514678 -2.136933 7.185528 9.123150 -11.892690 9.930886 -12.057791 -8.794961 -0.788652 -3.314827 -29.166594 -3.931620 -3.237716 8.134041 -15.434363 -2.293288 0.070375 -0.218305 0.620836 -5.318571 -9.627439 -5.699814 25.206091 1.572420 -4.848063 -4.352842 4.992142 -0.188344 -0.293107 0.122209 -0.029410 +0.251936 1.611677 0.046022 1.085115 -20.448780 -9.963815 -4.886878 -6.181475 3.799244 -17.912523 3.479262 32.480518 -0.424365 0.174109 -0.074736 0.492259 0.198889 0.570425 5.998796 6.188677 -31.345177 11.295822 -4.744587 36.859245 -0.355300 -0.017430 0.108482 0.028617 -0.095045 0.306364 12.166010 -8.641418 14.318472 4.200000 -5.463840 11.083456 1.172160 -4.028099 9.788781 -2.614137 7.395840 8.664772 -11.645167 9.604754 -12.155647 -7.988835 0.250729 -3.292256 -26.588480 -3.090108 -3.088936 8.976839 -15.737493 -2.332803 0.069957 -0.200423 0.609161 -4.957414 -10.655613 -5.491759 21.727760 0.616460 -4.410783 -4.809480 5.624505 -0.204448 -0.296788 0.102599 -0.026947 +0.254568 1.612441 0.054535 1.736750 -20.427681 -11.156069 -5.374030 -6.222365 4.504257 -19.052168 3.874412 33.023182 -0.437924 0.150381 -0.100211 0.518343 0.239356 0.593834 7.190833 6.185464 -29.300119 10.783119 -3.999894 32.469421 -0.371075 -0.006022 0.088833 0.051988 -0.131293 0.303353 12.465596 -8.790054 13.584994 3.781213 -5.458520 11.813186 0.470457 -3.974958 11.109085 -2.747384 7.548503 8.673517 -11.898371 9.585697 -13.587842 -7.373384 0.819262 -3.283963 -24.075962 -2.472735 -2.910372 9.845958 -15.636508 -2.342551 0.087705 -0.194055 0.618596 -5.216070 -11.429153 -5.208989 19.450302 -0.398579 -4.194067 -5.936078 6.376239 -0.240710 -0.294362 0.102938 -0.015351 +0.256984 1.611383 0.064363 2.892162 -20.001850 -12.208860 -6.475965 -6.325407 4.848981 -20.120022 4.218717 33.639622 -0.471859 0.164892 -0.121375 0.539506 0.249544 0.620807 7.586610 5.788868 -27.347414 10.269388 -3.381520 28.162188 -0.379934 -0.012640 0.076778 0.068466 -0.149705 0.314046 11.988592 -8.701845 12.435961 3.351420 -5.639734 12.286113 0.189429 -4.091787 12.314336 -2.659556 7.639043 8.754080 -12.352654 9.730159 -14.466087 -7.064513 1.410851 -3.125251 -21.823694 -1.374560 -2.774240 10.792620 -16.393957 -2.506936 0.083639 -0.192459 0.639503 -5.042308 -11.842555 -5.062421 16.680347 -0.995635 -3.812165 -6.916070 6.431099 -0.238458 -0.312520 0.098612 -0.020152 +0.259105 1.607461 0.075289 3.924113 -19.865732 -12.489672 -7.217910 -6.430526 4.354159 -21.375229 4.735176 34.472313 -0.499915 0.194250 -0.133975 0.542332 0.238445 0.632616 7.996422 5.566041 -26.023098 9.874848 -2.810990 23.790653 -0.369057 -0.045052 0.063140 0.079297 -0.146567 0.323266 12.182547 -8.621762 10.518632 2.661422 -5.556366 12.418596 -0.555461 -4.011299 13.401420 -2.376703 7.685660 8.586832 -12.654561 10.033906 -13.944119 -6.880316 2.327541 -2.986557 -19.112417 -0.204298 -2.457000 11.087448 -18.449564 -2.716679 0.058582 -0.170983 0.632414 -4.668498 -12.376065 -4.947219 13.996045 -1.585193 -3.327476 -7.717884 7.298539 -0.326011 -0.331249 0.070305 -0.030487 +0.260520 1.602736 0.085844 4.806239 -19.632235 -13.064582 -7.715621 -6.342493 4.432799 -22.586929 5.274814 34.970837 -0.489861 0.185404 -0.143962 0.552735 0.251568 0.656764 8.671461 5.407711 -24.186220 8.888281 -2.175031 19.701267 -0.375103 -0.054682 0.048656 0.082436 -0.172786 0.338558 11.768655 -8.262827 9.238684 2.377448 -5.469508 12.582779 -0.662310 -3.947859 14.229674 -1.736867 7.117267 8.668033 -13.515453 10.301500 -14.036817 -6.721479 2.992761 -2.866513 -16.485685 0.725539 -2.119512 11.011719 -19.122166 -2.659690 0.055014 -0.146449 0.618094 -5.208820 -12.966419 -4.296618 11.950583 -2.782593 -2.860738 -7.771271 10.034022 -0.503808 -0.323195 0.049335 -0.010854 +0.261532 1.596785 0.096621 5.672128 -18.970856 -13.546414 -8.245645 -6.402678 4.487336 -23.962164 5.919540 35.867405 -0.500612 0.185703 -0.158949 0.570092 0.266128 0.686847 9.002768 5.130283 -22.726898 7.715869 -1.720452 16.748243 -0.381572 -0.063968 0.036125 0.094156 -0.196960 0.349873 10.852424 -7.770256 7.820620 2.277093 -5.488703 12.662539 -0.247948 -3.966291 15.092892 -1.069332 6.490489 9.018487 -14.107321 10.396463 -14.210186 -6.334041 3.310056 -2.894783 -14.495990 0.994944 -1.739919 10.128114 -18.132761 -2.339853 0.050780 -0.135380 0.618027 -5.528442 -13.431081 -3.641950 9.321138 -4.092422 -2.240047 -7.630692 11.321389 -0.535636 -0.327795 0.033850 -0.002989 +0.262422 1.590564 0.107247 6.239224 -18.439138 -13.832105 -8.276051 -6.393949 4.521906 -25.458183 6.643927 36.547966 -0.496688 0.175647 -0.160750 0.577563 0.277503 0.699962 9.444031 4.985506 -21.522278 6.333249 -1.344602 14.636082 -0.385986 -0.062631 0.034807 0.097818 -0.211049 0.349949 10.432845 -7.430657 6.505866 2.204266 -5.445946 12.615464 -0.008785 -3.937363 15.670188 -0.808022 5.748035 9.652847 -14.600969 10.175768 -14.012423 -6.143517 2.936904 -2.591632 -12.561704 1.405478 -1.361714 8.655087 -15.916533 -1.840423 0.055462 -0.137581 0.613813 -5.586308 -13.156336 -2.825740 7.037210 -5.722049 -1.792325 -8.625985 11.727399 -0.570697 -0.324443 0.029863 0.004498 +0.263990 1.583835 0.115625 6.533475 -17.922400 -14.316073 -7.979004 -6.343099 4.786395 -27.093172 7.461286 37.119217 -0.493312 0.173595 -0.156623 0.559692 0.264990 0.673086 9.796853 4.936187 -20.476849 5.442249 -1.156112 13.837215 -0.376387 -0.056508 0.047114 0.086998 -0.195152 0.339814 10.242302 -7.191998 6.184825 2.204404 -5.354572 12.535324 0.027349 -3.832601 15.604261 -0.881193 5.293744 10.168983 -14.078119 9.615062 -13.474258 -5.599453 2.358453 -2.155710 -10.843760 1.645387 -0.994144 7.265853 -13.519618 -1.419459 0.052831 -0.154183 0.611387 -5.829693 -12.584954 -2.257865 5.677421 -6.869461 -1.663387 -10.191896 10.472950 -0.491181 -0.326507 0.047627 0.001029 +0.265562 1.577186 0.122715 6.380319 -17.821911 -14.912741 -7.214255 -6.308482 5.186727 -28.627035 8.357115 37.895264 -0.502947 0.189029 -0.148456 0.539859 0.231104 0.662457 10.433414 5.125310 -19.600311 4.987060 -1.078429 14.101810 -0.372256 -0.046240 0.052173 0.071082 -0.183588 0.332093 10.780457 -7.219910 6.421147 2.165573 -5.227078 12.534270 -0.395986 -3.628470 15.337234 -0.903387 4.694060 10.529661 -13.867648 9.058832 -13.140133 -5.473867 1.789398 -1.842234 -9.069353 1.955936 -0.692501 6.765570 -11.384302 -1.172269 0.053850 -0.183758 0.631207 -6.667338 -12.042867 -1.616639 5.184549 -7.902985 -1.719086 -11.263196 10.000395 -0.429110 -0.327843 0.070151 -0.018191 +0.267315 1.569778 0.129112 5.749510 -17.947865 -14.876196 -5.851326 -6.331138 5.040051 -29.888397 9.278985 38.921448 -0.474540 0.157612 -0.148240 0.569026 0.268236 0.676936 11.234821 5.722392 -20.142626 4.913271 -1.063747 15.794083 -0.385339 -0.048800 0.049852 0.078833 -0.207793 0.343647 11.758659 -7.348148 6.340791 2.178893 -4.991047 12.479827 -0.749495 -3.448191 15.302140 -0.682128 4.096339 10.429544 -13.748868 8.698037 -13.057429 -5.074018 1.774790 -1.874582 -7.806669 1.625470 -0.471274 5.780463 -9.237125 -0.904145 0.077873 -0.146096 0.616830 -7.607245 -12.092249 -1.168332 4.679462 -8.638221 -1.543763 -11.696060 10.721169 -0.482377 -0.313834 0.042196 0.013536 +0.268910 1.563772 0.133277 5.102214 -18.261744 -14.989128 -4.493482 -6.281982 4.900490 -31.179941 10.266704 39.922405 -0.422486 0.141373 -0.125782 0.568139 0.268646 0.660581 11.452759 6.226135 -20.913805 5.716265 -1.264047 17.816898 -0.393678 -0.046054 0.063594 0.051667 -0.198186 0.366875 12.710560 -7.537663 7.008316 2.244766 -4.738725 12.402573 -1.175083 -3.204752 14.764139 -0.712356 3.531544 10.237663 -13.413303 8.135630 -12.556401 -4.845258 1.259388 -1.474052 -7.046921 1.925379 -0.417065 5.304293 -7.158357 -0.725759 0.087746 -0.122387 0.600189 -8.791560 -11.651553 -0.099968 4.421490 -9.981215 -1.359460 -10.710456 12.106461 -0.460870 -0.293659 0.037225 0.048437 +0.271011 1.560430 0.136949 4.697536 -18.423611 -15.267931 -3.937472 -6.205709 5.060474 -31.456608 10.751298 40.701042 -0.399266 0.143924 -0.117422 0.520904 0.218609 0.623662 10.952353 6.396293 -21.324078 7.208697 -1.647410 19.398800 -0.376667 -0.046153 0.068833 0.013533 -0.184599 0.366184 12.932963 -7.529281 8.156934 2.585635 -4.603326 12.251548 -1.017434 -3.043784 13.895927 -0.493754 3.309174 10.327525 -13.491726 8.260924 -11.463746 -4.908482 0.669472 -1.020941 -7.123051 2.385113 -0.504608 5.168424 -5.807739 -0.632258 0.076307 -0.125171 0.589326 -10.074076 -10.977517 0.428025 4.954909 -10.342515 -1.620351 -11.143819 11.153753 -0.333773 -0.279048 0.050680 0.047705 +0.271943 1.558464 0.139369 4.701903 -18.551880 -15.282547 -4.043174 -6.009355 4.924394 -30.971451 10.876100 41.320034 -0.432705 0.161970 -0.126431 0.499012 0.195372 0.622888 10.194672 6.491040 -21.727839 8.407451 -1.928726 20.240858 -0.370883 -0.039833 0.072352 0.009404 -0.178451 0.355870 12.588210 -7.230810 8.310842 2.648266 -4.500310 12.434989 -0.794833 -2.930981 14.160366 0.025211 3.324046 10.314309 -14.083448 8.724505 -12.161400 -5.362034 0.395737 -0.855348 -6.332723 2.787757 -0.322037 4.268990 -5.250574 -0.593896 0.054698 -0.168896 0.609935 -9.795193 -10.363143 0.388712 4.674984 -9.632312 -1.531737 -10.542274 10.957416 -0.288951 -0.296860 0.082814 0.021042 +0.271350 1.557435 0.141191 4.866178 -18.754177 -14.911173 -4.413141 -5.829868 4.291426 -30.403328 10.966003 42.058308 -0.443076 0.162847 -0.135465 0.496240 0.209208 0.629194 9.746473 6.590886 -21.979713 8.958549 -1.952113 20.073042 -0.368603 -0.040893 0.070331 0.021396 -0.177149 0.351628 11.625760 -6.701251 7.977545 2.728663 -4.390416 12.595148 -0.174122 -2.894235 14.726892 0.475400 3.593171 10.128131 -14.531621 9.306484 -12.766029 -5.640609 0.840139 -0.923499 -6.266956 3.086096 -0.221611 3.600195 -5.750442 -0.585954 0.034334 -0.180985 0.599332 -8.850672 -10.132401 -0.220471 3.726614 -7.886056 -1.196005 -9.602070 9.824903 -0.204288 -0.304721 0.090413 0.018053 +0.270624 1.558976 0.141855 4.702141 -19.053236 -14.384278 -4.415975 -5.643900 3.719175 -29.743181 10.891949 42.371990 -0.467203 0.202572 -0.131737 0.477178 0.180415 0.614331 9.676705 6.627028 -21.723570 9.503357 -1.894399 18.747835 -0.350951 -0.057369 0.070556 0.023243 -0.141812 0.347057 11.220742 -6.430196 7.645423 2.674302 -4.319846 12.615208 -0.026985 -2.858220 14.937925 0.489133 3.992332 10.205354 -13.973082 9.419083 -11.967360 -5.423677 1.658094 -0.831925 -6.988938 3.735090 -0.181672 3.191122 -7.736469 -0.655280 0.002146 -0.193190 0.595066 -8.299221 -9.855960 -1.085185 3.824841 -5.498709 -1.199955 -9.165343 8.670361 -0.180918 -0.323850 0.091876 -0.007959 +0.269922 1.561616 0.140997 4.555770 -19.342144 -14.047582 -4.414412 -5.385990 3.318237 -29.494419 10.859699 42.231865 -0.492666 0.209197 -0.137513 0.494581 0.188470 0.623404 10.090039 6.664544 -21.057207 9.166448 -1.611408 16.985708 -0.349878 -0.065192 0.065160 0.044501 -0.145483 0.336497 10.774750 -6.179006 7.997629 2.765304 -4.189679 12.617057 0.178246 -2.758378 14.784556 0.270554 4.443264 10.026545 -13.477418 9.427879 -11.957512 -5.108586 2.557919 -1.056708 -8.722729 3.730608 -0.403459 3.220789 -9.435929 -0.753071 0.013643 -0.185955 0.608641 -8.267813 -9.953661 -2.072025 5.138704 -3.423807 -1.551119 -10.128530 8.562395 -0.314663 -0.335373 0.075550 -0.025827 +0.269873 1.564601 0.139700 4.490609 -19.488827 -13.573097 -4.599210 -5.061740 2.984394 -28.941542 10.625731 41.845757 -0.471325 0.195291 -0.129447 0.502002 0.202721 0.628204 10.613971 6.722864 -20.567158 8.240331 -1.278735 15.357640 -0.356053 -0.074055 0.072337 0.041762 -0.152517 0.348630 9.903635 -5.862104 8.455859 3.012755 -4.150947 12.518068 0.777431 -2.790006 14.417215 0.442027 4.229431 9.528186 -14.437084 9.750953 -12.091187 -5.485703 3.754303 -1.016181 -10.247355 4.713041 -0.688243 3.366843 -13.604311 -0.925722 0.015632 -0.167266 0.593708 -8.639348 -10.035387 -2.757028 6.858379 -1.634200 -1.842050 -10.581150 9.948848 -0.556240 -0.329964 0.059227 -0.008103 +0.270422 1.567832 0.138066 4.659094 -19.197525 -13.044544 -5.068776 -4.902409 2.437808 -28.315224 10.283175 41.516159 -0.474125 0.171340 -0.140275 0.529055 0.236669 0.654004 10.537061 6.465377 -20.141174 7.708049 -1.064868 13.489205 -0.368797 -0.052746 0.065490 0.060202 -0.180087 0.338810 9.260909 -5.600124 8.508336 2.984706 -4.083634 12.421692 0.997052 -2.794501 14.303719 0.456483 4.345447 9.565057 -14.154104 9.709458 -13.109565 -5.049250 4.453298 -1.191234 -12.520348 4.535635 -1.130031 3.057467 -15.342595 -1.053553 0.040708 -0.168739 0.605905 -8.760953 -10.089581 -3.432847 8.951596 -0.166791 -2.195595 -10.796643 11.474017 -0.817903 -0.323014 0.062987 -0.002441 +0.270709 1.572350 0.135282 4.903712 -18.720329 -12.927723 -5.512418 -4.715675 2.360307 -27.731236 9.908867 41.028164 -0.477246 0.156903 -0.135797 0.543174 0.249506 0.661473 10.562078 6.176329 -19.512178 6.723522 -0.852359 11.850883 -0.373618 -0.028442 0.074022 0.066938 -0.187156 0.320934 8.727835 -5.533699 9.303082 3.017570 -4.114739 12.357384 1.063477 -2.808567 13.785796 -0.230280 4.581351 9.294343 -13.841100 9.295181 -13.909553 -5.128854 4.818499 -1.252134 -15.042760 4.622199 -1.686208 3.063397 -16.986532 -1.240066 0.067187 -0.186711 0.623804 -8.651815 -9.830698 -3.828869 10.705467 0.940320 -2.467958 -10.391334 13.223785 -1.037322 -0.319277 0.078133 -0.009016 +0.269866 1.575906 0.131864 5.012701 -18.067570 -12.930072 -5.372014 -4.466617 2.459729 -27.557915 9.784141 40.590881 -0.471680 0.123901 -0.138377 0.574212 0.291438 0.664764 10.969322 6.010783 -18.855867 5.319505 -0.622480 10.490996 -0.391638 0.001657 0.076048 0.083402 -0.204681 0.308211 8.584237 -5.565907 9.963150 2.858659 -4.056869 12.347676 0.719612 -2.744308 13.410662 -1.246601 4.708414 9.410886 -13.012686 8.383268 -15.060739 -4.918186 5.557430 -1.442591 -17.879261 4.507411 -2.341301 2.711143 -20.059032 -1.497263 0.110704 -0.189878 0.641546 -8.360275 -9.815798 -4.342082 13.306748 1.874758 -2.877626 -9.748920 15.809143 -1.339157 -0.310267 0.090705 0.002475 +0.269067 1.577608 0.128291 4.854756 -17.224089 -12.678609 -4.929375 -4.249716 2.338118 -27.427681 9.810705 40.501656 -0.510225 0.125282 -0.146793 0.588786 0.301252 0.661127 11.230856 5.995492 -18.778353 4.613470 -0.515085 9.511367 -0.387786 0.020918 0.085521 0.104535 -0.200386 0.278312 8.805017 -5.612277 10.296252 2.588215 -3.922820 12.294346 0.189282 -2.574376 13.151801 -2.070658 5.127629 9.181087 -11.833127 7.709471 -16.023748 -4.859659 6.526140 -1.717043 -20.353580 4.569479 -2.956875 1.867328 -24.672789 -1.792726 0.130983 -0.216984 0.673472 -7.566781 -9.982410 -4.962242 15.302258 2.886967 -3.070437 -7.576477 17.814629 -1.349365 -0.329445 0.111982 -0.025851 +0.268151 1.578643 0.124979 4.924721 -16.216825 -12.316346 -4.654912 -4.099193 2.081384 -27.293919 9.813270 40.508087 -0.518692 0.121333 -0.146329 0.612912 0.322181 0.662344 11.254688 5.856118 -18.849113 3.853991 -0.424935 8.387758 -0.391993 0.027134 0.079190 0.125100 -0.199861 0.266143 9.296464 -5.855909 10.270830 2.076872 -3.821786 12.133689 -0.715761 -2.497265 12.911652 -3.107941 5.499163 9.035397 -10.670680 6.946041 -16.242304 -5.356088 7.391653 -2.020617 -22.447056 4.581450 -3.540382 0.937092 -29.087660 -2.009561 0.155863 -0.205404 0.681187 -5.987111 -9.926026 -5.926064 17.180820 4.220630 -3.234891 -5.696939 19.242548 -1.326080 -0.329774 0.102066 -0.029986 +0.266591 1.579432 0.121700 4.859987 -15.116076 -11.892836 -4.337543 -3.943635 1.862045 -26.815838 9.700011 40.556553 -0.550309 0.137075 -0.154518 0.616718 0.314161 0.663701 11.290402 5.702821 -18.866014 3.467953 -0.388343 6.996898 -0.385153 0.036794 0.063159 0.140074 -0.196789 0.244390 9.748339 -5.940992 10.234177 1.713615 -3.667295 11.879894 -1.411407 -2.315864 12.557143 -4.324069 5.610637 8.939877 -9.744225 5.958096 -16.518559 -6.014820 8.367314 -2.558960 -24.833706 4.231818 -4.135959 -1.290569 -33.533619 -1.890175 0.168390 -0.217421 0.698695 -4.295988 -9.792051 -7.065080 19.297012 5.752541 -3.388582 -3.293059 19.013685 -1.064755 -0.333000 0.109641 -0.054212 +0.265153 1.579010 0.117597 4.807269 -13.484087 -11.489164 -4.137255 -3.910171 1.484195 -26.640656 9.700407 40.882957 -0.524699 0.123896 -0.152201 0.611788 0.313108 0.634553 11.033256 5.473466 -19.081562 3.073832 -0.392885 5.774340 -0.383263 0.045491 0.065881 0.128239 -0.191084 0.247199 10.058475 -6.178772 10.699552 1.380789 -3.634420 11.328674 -2.047322 -2.317542 11.489108 -5.245039 5.890705 9.065252 -8.738092 5.379755 -16.304274 -6.554654 9.050294 -2.446669 -27.858294 4.502713 -5.078484 -2.840371 -38.116318 -1.847121 0.183287 -0.197429 0.691635 -3.358305 -9.287728 -7.815396 22.462214 6.949452 -3.673169 -0.902472 17.718649 -0.758431 -0.319374 0.112783 -0.037015 +0.263067 1.577762 0.112671 4.839050 -11.727406 -11.001966 -3.834506 -3.868490 1.047179 -26.601889 9.774189 41.098186 -0.555251 0.145967 -0.167107 0.601194 0.280988 0.630159 10.576476 5.318708 -19.630301 2.764632 -0.406107 4.771560 -0.373656 0.059760 0.056095 0.120614 -0.189217 0.236221 9.857733 -6.068625 10.935959 1.167104 -3.554060 10.888759 -2.255041 -2.191351 10.775484 -6.065399 5.740546 9.245204 -7.850909 4.512421 -16.660528 -7.384904 9.359608 -2.757970 -30.861374 3.993416 -5.845351 -4.789071 -41.530552 -1.607389 0.185243 -0.212717 0.718226 -1.855538 -8.743054 -8.532251 25.217468 7.756401 -3.927855 1.596913 16.263815 -0.455132 -0.326537 0.136692 -0.056528 +0.261143 1.575976 0.107234 4.716276 -9.624189 -10.479853 -3.739584 -4.021657 0.548557 -26.112980 9.656566 41.748707 -0.577937 0.177641 -0.168691 0.592469 0.254534 0.604110 10.067262 5.205142 -20.363268 2.529005 -0.425975 4.069306 -0.367860 0.063679 0.055492 0.114634 -0.160620 0.236597 9.802147 -5.967939 10.979726 1.028962 -3.471475 10.523513 -2.402449 -2.058527 10.217140 -7.130763 5.573710 9.386131 -6.328254 3.203214 -16.783506 -8.484742 8.957127 -3.029775 -33.953762 3.292509 -6.626560 -7.017308 -44.012741 -1.226701 0.182797 -0.223873 0.739750 0.458223 -7.724097 -9.000288 27.013821 8.032151 -4.087436 4.054659 14.477692 -0.181294 -0.339967 0.156815 -0.072456 +0.259165 1.574558 0.101996 4.670084 -7.338297 -10.300797 -3.895435 -4.159964 0.582911 -25.178894 9.282801 42.194668 -0.574634 0.164542 -0.163019 0.595336 0.262054 0.593679 9.369881 4.891112 -20.577894 2.434323 -0.441372 3.148265 -0.371523 0.090557 0.064148 0.115273 -0.154506 0.219829 9.431767 -5.738033 11.215042 0.952251 -3.324126 10.186142 -2.411686 -1.925531 9.619166 -7.584638 5.099226 10.090036 -4.995748 2.242509 -17.106539 -10.570612 7.410359 -3.246912 -36.271412 2.644565 -7.413864 -8.593998 -45.261997 -1.018589 0.203851 -0.247843 0.754265 3.029017 -5.952456 -8.946297 28.792797 7.620810 -4.380876 5.840284 12.691720 -0.065811 -0.335193 0.182003 -0.076656 +0.257453 1.572975 0.096937 4.423495 -4.274629 -10.228219 -3.893450 -4.529612 0.806820 -24.042398 8.784903 42.971752 -0.602301 0.173217 -0.169910 0.604564 0.269073 0.592192 8.490770 4.424596 -20.520472 2.333200 -0.479128 1.894250 -0.373120 0.099132 0.068494 0.129599 -0.148509 0.208769 9.601429 -5.766817 11.069847 0.767838 -3.276084 9.994817 -2.749448 -1.874221 9.415981 -7.590339 4.250040 10.665347 -4.116496 1.322327 -17.491209 -13.358111 5.516834 -4.044376 -37.003029 1.573470 -7.682173 -11.342407 -45.520077 -0.242328 0.208400 -0.270839 0.774051 6.133065 -4.313951 -9.096095 30.607971 7.255584 -4.688371 7.064330 11.090743 -0.062798 -0.352996 0.198008 -0.092206 +0.255317 1.571661 0.091013 4.161376 -0.834290 -10.446733 -3.975892 -4.945456 1.404327 -22.585575 8.050953 43.591694 -0.598067 0.133688 -0.180868 0.637798 0.322711 0.592698 7.473336 3.811609 -20.074999 2.251366 -0.496543 0.502736 -0.388241 0.113412 0.065960 0.156185 -0.169070 0.196699 9.818007 -5.846576 11.486664 0.534102 -3.122881 9.775263 -3.278131 -1.817143 8.961064 -7.373227 3.353601 11.186131 -2.572386 0.401389 -18.192921 -16.107353 3.484877 -5.033530 -36.699684 0.031289 -7.538526 -15.536052 -45.114285 1.264453 0.244420 -0.255367 0.777872 9.469285 -2.864840 -9.128163 32.647564 6.604574 -5.104352 7.752701 10.238572 -0.132748 -0.350924 0.191467 -0.076953 +0.252092 1.568182 0.083869 3.828655 2.023537 -10.117173 -3.468967 -5.236921 1.043330 -21.544348 7.663456 44.343750 -0.570909 0.120236 -0.179599 0.641667 0.328595 0.586454 6.861521 3.596713 -20.530397 1.824625 -0.504063 -0.356226 -0.391018 0.111424 0.060805 0.149690 -0.173360 0.206386 9.599277 -5.563447 11.689716 0.498821 -2.836181 9.123884 -3.280163 -1.643335 7.986537 -6.808116 2.327319 12.055702 -1.516734 -0.287329 -17.221106 -18.193110 1.999612 -5.655128 -37.793228 -1.652143 -7.366753 -18.318998 -44.206226 2.192696 0.253549 -0.227260 0.763649 11.832187 -1.481771 -8.924092 35.450375 6.280396 -5.441105 8.288719 9.165815 -0.190472 -0.337215 0.176245 -0.055525 +0.248471 1.563836 0.075336 3.721751 4.879978 -9.477643 -3.042947 -5.589835 -0.035472 -20.616989 7.408252 45.445644 -0.569450 0.122345 -0.178182 0.636411 0.314559 0.583278 5.886562 3.440506 -21.692240 1.394545 -0.511669 -0.788263 -0.385715 0.113102 0.061480 0.142489 -0.169409 0.200891 8.678166 -5.064479 11.722814 0.517921 -2.636893 8.438732 -2.811278 -1.523808 7.031809 -6.231205 1.407000 12.914324 -0.570672 -0.875652 -16.285509 -19.611526 0.930178 -6.256313 -40.387711 -3.769873 -7.148487 -19.535673 -43.007294 2.421836 0.257133 -0.225797 0.766129 13.758798 -0.240966 -8.900966 38.669701 6.552589 -5.696430 8.528685 8.375411 -0.248222 -0.335611 0.175233 -0.060468 +0.245359 1.559493 0.064334 3.802368 7.748441 -8.602230 -3.077964 -6.018642 -1.701371 -19.535862 7.034848 46.534950 -0.585153 0.133042 -0.183780 0.639225 0.302339 0.601442 4.462458 3.274096 -23.445269 1.319420 -0.507568 -0.766699 -0.391103 0.122348 0.046915 0.143838 -0.178774 0.197510 7.590504 -4.562126 11.586148 0.471536 -2.526878 7.937625 -2.249391 -1.468629 6.394088 -5.641346 0.345929 13.352772 0.160228 -1.450039 -16.353872 -20.509108 0.026955 -6.960819 -43.833282 -6.510883 -6.700148 -19.920439 -41.955315 2.320637 0.264619 -0.233541 0.786740 15.006690 1.179326 -9.170542 42.392532 7.808506 -5.653571 8.531593 7.388583 -0.286677 -0.334315 0.180338 -0.073642 +0.241244 1.555701 0.051790 3.836435 10.442585 -7.864359 -2.965987 -6.365535 -3.638305 -18.362511 6.733033 47.964172 -0.580414 0.108383 -0.186810 0.656527 0.329477 0.615084 3.173679 3.271018 -25.314598 0.993819 -0.473843 -0.018452 -0.403016 0.140582 0.047083 0.152491 -0.197651 0.190691 6.377074 -4.030612 11.631017 0.527748 -2.412762 7.654690 -1.498821 -1.430330 5.981479 -5.577111 -1.031725 13.792198 0.455371 -2.338925 -17.048454 -21.250620 -0.795422 -7.357775 -47.492542 -9.091974 -6.239094 -20.852167 -42.617462 2.610243 0.285258 -0.242645 0.793194 15.980021 3.321923 -9.372711 45.732521 9.482300 -5.338425 8.587959 7.091434 -0.304551 -0.328837 0.188460 -0.063272 +0.237530 1.553459 0.039456 3.863834 14.059731 -7.228943 -3.319113 -6.905756 -5.304638 -16.388081 5.875019 49.268200 -0.583609 0.089593 -0.195664 0.671628 0.358817 0.611225 0.932183 2.946592 -26.931299 1.248913 -0.446963 1.034098 -0.412388 0.143520 0.052484 0.164705 -0.208289 0.192006 5.306148 -3.734197 11.501960 0.565875 -2.536134 7.531897 -0.809094 -1.623996 5.838099 -5.223068 -2.808840 14.069006 0.850660 -3.432649 -17.701313 -22.089006 -2.057857 -7.494957 -50.515770 -11.524740 -5.521890 -23.292805 -43.900520 3.624616 0.296318 -0.244097 0.797204 16.767611 5.999707 -9.231911 48.348701 11.014623 -5.011138 8.688776 8.261131 -0.349238 -0.337626 0.191589 -0.051924 +0.233094 1.552643 0.028268 4.111592 17.674257 -6.881403 -3.913498 -7.288972 -6.164492 -14.497955 4.975121 49.818653 -0.587333 0.066806 -0.206933 0.707021 0.402999 0.615155 -1.893774 2.377265 -27.814182 2.409767 -0.408580 2.047779 -0.431174 0.151502 0.051649 0.186766 -0.222262 0.192969 4.145580 -3.496328 11.304860 0.424542 -2.723857 7.577475 -0.401002 -1.913743 5.976470 -4.913081 -4.037910 14.807783 2.343868 -4.454819 -18.385695 -22.553858 -4.045407 -7.175439 -52.633076 -13.663358 -4.702799 -26.666391 -45.610611 5.192018 0.324264 -0.229451 0.810790 17.999743 9.289962 -8.921168 50.278049 12.624461 -4.646735 8.624006 9.929495 -0.432258 -0.344826 0.185796 -0.038409 +0.227930 1.552100 0.016986 4.493822 20.482740 -6.421607 -4.431934 -7.307833 -7.189582 -12.660108 4.311404 50.303913 -0.582762 0.060059 -0.201322 0.736502 0.447602 0.617016 -4.645497 2.134581 -29.104486 3.654890 -0.372033 4.280870 -0.440022 0.144040 0.054767 0.213628 -0.210173 0.195853 3.239133 -3.146387 10.831362 0.068052 -2.666142 7.790592 -0.441883 -2.004601 6.464919 -4.315325 -5.160226 14.898944 3.344346 -5.289037 -18.472836 -22.831137 -6.664237 -6.995344 -53.339500 -16.099321 -3.346295 -31.606388 -46.503654 7.625729 0.327833 -0.218572 0.795719 18.901545 13.133191 -8.883245 51.624283 15.097320 -3.595460 9.410044 10.908044 -0.404377 -0.352693 0.169015 -0.026174 +0.221537 1.555342 0.004458 4.496091 22.709753 -6.216164 -4.626124 -7.051406 -8.234066 -10.608727 3.632791 50.479397 -0.592794 0.066681 -0.199819 0.755584 0.478782 0.607219 -6.835126 2.310300 -30.303844 4.845688 -0.384654 7.111731 -0.445872 0.146122 0.056126 0.238134 -0.189865 0.193352 2.958538 -2.705926 10.555647 -0.013030 -2.428483 8.196683 -0.412132 -1.842441 7.171907 -4.772450 -5.995138 15.109875 4.325140 -6.467134 -19.196730 -22.196098 -9.665896 -6.501179 -54.681339 -18.796181 -1.929911 -35.664619 -49.075684 10.145767 0.329286 -0.227890 0.792700 18.804504 17.298859 -8.714624 51.821636 17.645992 -2.570530 10.939686 13.409426 -0.257283 -0.364106 0.174324 -0.024961 +0.214375 1.560333 -0.006610 4.388953 25.229528 -6.303065 -4.968287 -6.776238 -8.790914 -8.046519 2.649043 50.264370 -0.620825 0.089464 -0.200700 0.761881 0.493157 0.587970 -9.254323 2.494391 -30.850775 6.880153 -0.524728 10.084287 -0.442769 0.144983 0.056740 0.264186 -0.159252 0.181764 2.615285 -2.370515 10.146715 0.022019 -2.400139 8.804703 -0.219228 -1.864779 8.246807 -5.459122 -6.702700 15.540776 5.175652 -7.626729 -19.747723 -21.068577 -12.517859 -5.891361 -55.731277 -21.532248 -0.432078 -40.251881 -53.597481 13.876031 0.321620 -0.250991 0.794432 18.277132 21.315578 -8.726027 51.008251 20.431128 -1.553502 12.897674 16.670612 0.064321 -0.383831 0.186821 -0.042208 +0.207214 1.568072 -0.015812 3.795110 27.435413 -7.085177 -4.961713 -6.300267 -8.407109 -5.199611 1.480661 49.303040 -0.648547 0.088877 -0.212747 0.788091 0.538566 0.576575 -11.169778 2.999451 -30.760841 9.694053 -0.864509 13.432578 -0.454299 0.155687 0.055076 0.301472 -0.144436 0.170218 3.110669 -2.302642 9.941418 -0.014270 -2.320063 9.602319 -0.633501 -1.807837 9.560841 -5.843490 -7.381454 16.392851 6.797629 -8.557486 -21.156933 -20.214958 -15.906149 -5.384365 -55.917622 -24.649147 1.190591 -43.778782 -58.914532 18.013430 0.332103 -0.269568 0.808841 16.941525 25.085981 -8.888502 50.174759 23.270790 -0.771669 14.531515 21.109221 0.447366 -0.402182 0.203533 -0.049644 +0.200319 1.576621 -0.024001 2.777732 29.538780 -7.823514 -4.448115 -5.747032 -8.073668 -2.505160 0.433191 47.928043 -0.641914 0.066350 -0.202172 0.841373 0.616117 0.589978 -13.172125 3.668555 -30.902479 13.909971 -1.518764 16.762117 -0.471343 0.164712 0.058421 0.349494 -0.137658 0.156724 3.932424 -2.384698 9.243716 0.012733 -2.247405 10.462512 -1.067577 -1.825832 11.188011 -6.011738 -8.375024 16.675428 8.037700 -9.531872 -22.222546 -18.911068 -18.861050 -5.272528 -56.358997 -28.444658 3.424997 -44.977745 -63.592274 21.113293 0.357964 -0.261906 0.793259 14.562156 28.035074 -9.719762 49.200481 26.549614 0.265991 15.455927 25.518578 0.823556 -0.404551 0.186554 -0.036497 +0.194221 1.587089 -0.032717 1.710253 31.497774 -8.516628 -3.840318 -5.346277 -8.012822 -0.299954 -0.397873 46.392822 -0.672334 0.075173 -0.212277 0.864550 0.650575 0.582955 -15.094209 4.347300 -31.262259 18.669193 -2.664842 20.526146 -0.469444 0.159128 0.057306 0.387004 -0.122239 0.144876 4.911663 -2.389993 8.773745 0.135144 -2.136640 11.232418 -1.453451 -1.708559 12.642705 -5.961019 -9.412144 16.473419 9.266899 -10.405655 -23.407852 -17.493361 -21.887951 -5.568738 -56.963165 -32.855019 6.266396 -41.238132 -67.341003 20.685965 0.358680 -0.265110 0.793117 12.068085 29.912214 -10.582129 47.820347 29.429298 0.875161 16.201103 31.620316 1.321605 -0.426427 0.183564 -0.047305 +0.187583 1.598394 -0.039677 0.733870 33.511097 -9.153356 -3.084331 -4.985604 -7.702051 1.610186 -1.105956 44.294090 -0.701760 0.107750 -0.213779 0.861877 0.654081 0.553341 -16.591969 4.855028 -31.064398 23.107437 -4.054433 23.645189 -0.459530 0.139094 0.059155 0.408347 -0.082537 0.142226 5.501267 -2.342492 8.116296 0.326053 -2.138457 11.951130 -1.592406 -1.691216 14.084813 -5.680015 -10.315038 16.221285 10.206091 -11.183959 -23.858860 -15.543792 -24.753969 -6.028838 -57.068516 -37.336067 9.196218 -32.151024 -70.046745 15.756139 0.335588 -0.270035 0.785632 9.700342 31.387445 -11.328193 45.932888 32.372513 1.471487 15.805153 37.733971 1.637959 -0.453894 0.182822 -0.065254 +0.181052 1.610198 -0.046585 -0.169937 35.400925 -9.663845 -2.538609 -4.759207 -7.453774 3.514984 -1.833609 41.955551 -0.707142 0.135180 -0.201232 0.870556 0.666802 0.529003 -17.669367 5.209222 -30.869720 26.962191 -5.698649 26.863974 -0.447113 0.107116 0.069708 0.428832 -0.041499 0.149003 6.245407 -2.487264 7.390812 0.411670 -2.204336 12.628109 -1.923052 -1.790040 15.518140 -5.473561 -10.979053 15.464891 10.703759 -11.930090 -23.739332 -13.374066 -27.076847 -6.589390 -55.996731 -41.723072 11.788804 -19.079777 -72.476227 7.411460 0.314177 -0.249905 0.755919 7.427842 32.449253 -12.272974 44.017368 35.669479 2.383014 13.749253 42.179935 1.301836 -0.475039 0.156267 -0.066811 +0.174225 1.621174 -0.052153 -0.429994 37.429478 -9.535018 -2.518772 -4.729338 -7.216983 4.934760 -2.388943 39.231010 -0.708301 0.151048 -0.192370 0.875117 0.686744 0.502157 -18.544069 5.097215 -30.500792 29.617065 -7.388950 30.038145 -0.436299 0.077574 0.071532 0.452704 -0.007588 0.150338 6.289950 -2.462613 6.344170 0.370640 -2.269462 13.183566 -2.007634 -1.936915 16.980207 -4.944070 -11.884566 14.463154 11.157345 -12.697670 -23.735731 -10.034667 -28.902767 -7.422763 -54.564869 -45.669411 13.694847 -1.036588 -72.294579 -5.575310 0.296647 -0.228568 0.720374 4.418246 33.405659 -12.823284 42.196316 38.273712 2.832731 9.709265 47.540882 -0.230787 -0.487892 0.129683 -0.065812 +0.167535 1.631915 -0.057342 -0.766524 38.922153 -9.221552 -2.264905 -4.517166 -6.918632 5.999410 -2.678671 36.169243 -0.690242 0.170276 -0.167414 0.852778 0.689416 0.432916 -18.749798 5.160038 -30.086773 31.478643 -8.934193 32.906456 -0.400055 0.030926 0.086133 0.467867 0.056473 0.140165 6.812069 -2.283485 4.961699 0.378932 -2.029304 13.650519 -2.150700 -1.810958 18.474911 -4.829890 -12.518760 13.218391 11.477771 -13.902327 -22.622032 -6.377359 -30.391581 -8.104938 -53.222935 -49.543530 15.323508 18.399584 -69.751839 -19.170794 0.265840 -0.195103 0.646876 1.596743 33.932720 -13.299437 39.514057 40.713444 3.202540 4.352972 51.515404 -2.666320 -0.497040 0.091027 -0.065668 +0.162219 1.642211 -0.061930 -0.817226 40.484974 -8.702502 -2.302989 -4.279409 -6.310658 6.788893 -2.818560 32.679237 -0.687663 0.198758 -0.143415 0.851882 0.703400 0.390262 -19.082367 5.061860 -29.382994 33.000816 -10.373069 35.331257 -0.371540 -0.014722 0.101521 0.494755 0.114010 0.134616 6.924529 -2.022293 3.569913 0.515867 -1.854895 14.060697 -1.921576 -1.729836 19.964748 -4.591812 -13.348774 11.752779 11.447014 -15.099760 -21.954708 -2.613687 -31.019751 -9.261097 -52.360462 -53.560795 17.272785 29.927357 -64.910141 -25.544796 0.237261 -0.169460 0.586437 -1.420432 33.781910 -13.922628 36.037041 43.099483 3.385478 -2.334826 54.551388 -6.039674 -0.515655 0.050238 -0.069348 +0.156551 1.651607 -0.066568 -0.932292 41.850872 -8.284892 -2.005469 -4.007881 -5.551103 6.978714 -2.733078 29.034914 -0.707976 0.237623 -0.125828 0.866429 0.720326 0.379021 -18.890686 4.939996 -28.491638 33.571877 -11.709288 38.031689 -0.355075 -0.052512 0.105369 0.531491 0.158752 0.130410 7.370888 -1.884177 2.460661 0.499105 -1.656441 14.480565 -2.089760 -1.582556 21.360121 -3.895012 -14.453313 9.984084 11.453084 -16.089018 -21.944504 0.618517 -31.101831 -10.762492 -50.359234 -58.023094 19.186573 35.760273 -59.815830 -26.961369 0.213829 -0.157674 0.551682 -4.421941 33.097923 -14.526329 32.930218 45.515430 3.559974 -10.676677 57.759983 -10.877616 -0.539267 0.014678 -0.085215 +0.151721 1.659219 -0.071202 -1.228807 42.945683 -7.674042 -1.384421 -3.596232 -5.008263 6.997127 -2.488699 25.135151 -0.744766 0.303388 -0.099993 0.816954 0.676069 0.304685 -18.586819 4.938560 -27.659491 34.164070 -12.909202 40.184898 -0.304439 -0.099671 0.124308 0.547151 0.247971 0.099840 8.399351 -1.856482 1.354432 0.279511 -1.409547 14.653395 -2.761358 -1.334362 22.294418 -3.288990 -14.837470 8.181435 11.494079 -16.975590 -20.952135 3.693878 -31.148304 -11.745128 -47.346420 -61.643314 20.054596 40.707436 -55.649750 -27.901323 0.159934 -0.177911 0.510017 -6.610831 32.223427 -14.741937 30.305374 47.920795 3.772357 -20.391186 58.728012 -16.582783 -0.575876 0.004675 -0.141257 +0.147460 1.665654 -0.075602 -1.498593 43.988770 -6.815135 -0.711396 -3.187897 -4.504516 6.695819 -2.180803 20.696096 -0.768782 0.349091 -0.092746 0.817768 0.699488 0.266654 -17.801920 4.570080 -26.598909 33.292236 -13.723327 42.428619 -0.268520 -0.154498 0.127791 0.593068 0.310591 0.092052 9.363267 -2.038183 -0.176428 -0.023613 -1.320607 14.700050 -3.336374 -1.228303 23.442545 -2.681811 -15.313403 6.131666 10.967842 -17.828402 -20.459042 6.901023 -30.088480 -13.177217 -45.270607 -64.958664 20.804037 42.543510 -49.781395 -26.288889 0.109323 -0.160439 0.441874 -9.692622 30.772814 -15.409515 28.486740 50.483730 4.426569 -29.514660 57.910091 -21.757524 -0.606906 -0.033656 -0.152327 +0.143311 1.671371 -0.078338 -1.018964 44.913437 -5.734782 -0.656269 -2.683207 -3.549790 6.586194 -1.896998 16.325548 -0.788344 0.404743 -0.069504 0.807718 0.690519 0.211853 -17.089457 4.368497 -24.683519 31.823704 -13.856279 44.013763 -0.244250 -0.203064 0.137892 0.617792 0.387344 0.089147 8.927692 -1.869438 -1.513067 -0.241486 -1.261811 14.758851 -3.354580 -1.167326 24.305511 -2.080103 -15.138094 5.291570 11.544012 -18.311682 -19.590296 10.742352 -29.177095 -14.289844 -43.815407 -67.432449 21.324484 43.927773 -44.544197 -24.902868 0.074827 -0.142320 0.407322 -11.811888 29.618423 -15.626767 26.345934 52.538223 4.644286 -35.202942 55.660599 -24.161993 -0.636790 -0.065185 -0.180114 +0.138854 1.675294 -0.080486 -0.482630 45.431965 -4.537291 -0.339754 -2.180312 -2.827226 5.794690 -1.531284 12.804880 -0.764533 0.415231 -0.048522 0.802000 0.703182 0.173800 -15.933917 4.276096 -22.689014 29.678133 -13.277908 44.719940 -0.221824 -0.236136 0.146749 0.630602 0.429216 0.089359 8.744745 -1.738192 -2.640304 -0.559519 -1.083892 14.675805 -3.702135 -0.980965 24.784090 -1.789838 -15.569306 4.680195 11.493908 -19.090755 -18.789513 13.560601 -28.396606 -15.121990 -41.001778 -69.709290 20.738363 43.747368 -39.183022 -22.528307 0.054596 -0.112516 0.347903 -13.853784 29.051785 -15.733978 24.564468 54.460114 4.761767 -39.383476 52.361546 -25.161339 -0.636036 -0.098886 -0.168575 +0.134485 1.676631 -0.082640 0.195717 45.231274 -3.128685 -0.011186 -1.658668 -2.221748 4.826827 -1.168970 9.436467 -0.749783 0.439417 -0.015549 0.787245 0.703784 0.113216 -14.568318 4.369922 -20.656429 26.746553 -11.856483 44.400692 -0.191816 -0.279148 0.165609 0.645942 0.497640 0.078831 8.297199 -1.259358 -3.759178 -0.798297 -0.624896 14.550812 -3.848387 -0.549422 25.172953 -1.183136 -15.715086 3.919689 11.901684 -19.744865 -17.656733 16.391243 -27.028820 -16.111454 -38.907597 -72.513435 21.067381 42.426201 -33.731606 -19.780941 0.029960 -0.082909 0.288493 -14.964015 27.849743 -15.640100 22.269495 56.370136 4.798512 -42.100193 49.376343 -25.172220 -0.647315 -0.137282 -0.177014 +0.130073 1.676374 -0.084541 0.767569 44.928761 -1.782283 0.509134 -1.221781 -1.911390 3.412644 -0.829386 6.636091 -0.758993 0.492438 -0.001979 0.754094 0.659401 0.071364 -12.815981 4.407954 -18.125818 23.272379 -9.826630 42.483952 -0.159064 -0.321423 0.170573 0.637418 0.551604 0.087760 7.943984 -0.852346 -4.734510 -1.020349 -0.285872 14.316947 -4.005085 -0.130775 25.251595 -0.868558 -15.892940 3.365562 11.685101 -20.308231 -16.669403 18.799007 -25.586620 -16.688164 -34.908241 -74.762756 19.751120 41.601349 -29.191996 -17.742386 -0.014654 -0.070588 0.256102 -16.054989 26.912159 -15.420857 19.690828 58.074780 4.447591 -44.031979 46.105930 -24.506008 -0.663059 -0.155037 -0.193317 +0.124205 1.673986 -0.086260 1.967225 43.764427 0.202303 0.504705 -0.859863 -1.929529 1.945452 -0.545212 4.169034 -0.762333 0.543554 0.022784 0.690453 0.590349 0.009558 -11.169040 4.519945 -15.637813 18.981491 -7.193574 39.306675 -0.118138 -0.358126 0.178990 0.616272 0.617879 0.078567 6.847950 -0.120638 -5.636936 -1.336518 0.329786 13.978885 -4.052551 0.560723 25.026461 -0.386074 -15.576569 2.864381 11.446191 -20.448399 -15.114246 20.869890 -24.428535 -17.067520 -29.271109 -76.415794 16.808975 39.941898 -25.100555 -15.637975 -0.064683 -0.073615 0.219950 -16.502871 26.487867 -15.007523 16.682652 59.630512 3.696869 -44.426018 42.656334 -22.918911 -0.672870 -0.161228 -0.226947 +0.117809 1.670723 -0.088805 3.448924 42.885639 2.210522 0.141660 -0.648863 -2.357196 0.520956 -0.344025 2.251959 -0.768953 0.594289 0.045223 0.632013 0.526932 -0.037802 -10.092422 4.117255 -12.452794 14.830821 -4.812202 34.507946 -0.077818 -0.391207 0.184329 0.599858 0.675685 0.068405 5.933909 0.405359 -6.374796 -1.785075 0.850545 13.808910 -4.429502 1.257895 24.924658 -0.013854 -15.575856 1.977893 10.785868 -20.744312 -13.798529 21.957529 -23.667435 -17.448750 -20.105944 -77.514778 10.777072 37.615070 -22.265532 -13.733365 -0.115279 -0.084654 0.182735 -16.886011 26.492393 -14.660309 12.204076 60.558693 1.668747 -44.748600 39.188293 -21.343992 -0.681110 -0.165429 -0.259252 +0.112277 1.666804 -0.090861 4.620787 41.402538 3.698118 -0.286626 -0.442885 -2.379221 -0.296352 -0.241916 0.429926 -0.769058 0.634095 0.057668 0.622495 0.518155 -0.069037 -9.352085 3.693133 -9.311338 11.043532 -2.895259 29.523508 -0.051834 -0.439227 0.185082 0.610616 0.721879 0.081057 4.758600 0.927456 -7.249749 -2.077712 1.348227 13.840073 -4.450324 1.909000 25.318718 0.310471 -15.499961 0.829487 10.410777 -21.069214 -13.001333 23.017033 -22.512407 -17.712187 -14.018231 -77.859108 6.454906 37.030121 -20.466269 -12.947874 -0.153964 -0.050286 0.134281 -17.590157 26.656893 -14.675323 8.037049 61.179928 -0.561792 -45.052948 35.573811 -19.879066 -0.694358 -0.203448 -0.259499 +0.106211 1.664448 -0.093128 5.261193 39.040073 4.449441 -0.352671 -0.188311 -2.051232 -1.078750 -0.167498 -1.218452 -0.777754 0.663959 0.070799 0.616743 0.514688 -0.113247 -8.420516 3.445328 -6.752825 7.082187 -1.279330 25.117249 -0.038604 -0.478872 0.192347 0.624364 0.767513 0.085820 4.282636 1.596659 -7.755801 -2.379991 2.097527 14.099246 -4.830224 2.851779 25.788324 0.202419 -14.896953 0.053566 10.577357 -21.147591 -12.533170 23.910519 -21.962946 -18.070442 -7.380886 -77.556740 1.343654 36.276272 -18.760559 -12.161076 -0.172370 -0.022229 0.111240 -17.678221 26.862728 -14.862659 3.101145 61.723366 -3.145608 -43.651379 33.226028 -18.178875 -0.714337 -0.232760 -0.270911 +0.099505 1.663823 -0.095801 5.455435 37.154781 4.644238 -0.402416 -0.025748 -1.772301 -1.016685 -0.138610 -2.438679 -0.757992 0.662718 0.089419 0.595243 0.508698 -0.146290 -7.426170 3.136102 -4.473663 3.952729 -0.209896 20.902784 -0.025871 -0.481140 0.199171 0.621075 0.794388 0.073606 4.312849 2.315561 -7.894930 -2.497273 2.906760 14.517030 -5.136310 3.777774 26.250202 -0.159372 -14.889859 -0.343930 10.712523 -21.506483 -12.412816 24.332123 -21.721045 -18.506142 -0.129292 -77.292854 -4.122736 34.700958 -17.894260 -11.333456 -0.178325 -0.025789 0.084454 -16.980810 27.381304 -14.754991 -2.094314 61.330296 -6.117772 -42.635696 31.602150 -16.905416 -0.704379 -0.231069 -0.273044 +0.092807 1.663602 -0.098573 5.211547 35.087025 4.684586 -0.184278 -0.044609 -2.079165 -0.858331 -0.142753 -2.841350 -0.777921 0.670625 0.084950 0.605498 0.523687 -0.148342 -6.566237 2.882733 -3.341674 1.942742 0.332822 17.679333 -0.027756 -0.485999 0.198132 0.639198 0.803720 0.068719 5.011559 2.857304 -7.863353 -2.785936 3.625932 14.726908 -5.907342 4.651711 26.532146 -0.373554 -14.466948 -0.621476 10.872719 -21.329311 -12.795491 24.202517 -21.236774 -18.827250 2.790069 -76.905296 -6.039688 33.688625 -18.252241 -11.020083 -0.180736 -0.031376 0.089304 -16.987125 27.242277 -15.192152 -3.880207 61.844578 -7.118716 -41.363770 30.655727 -16.077665 -0.717463 -0.231448 -0.282872 +0.086937 1.663421 -0.100376 4.831928 33.538353 4.941697 0.158729 -0.239598 -3.075771 -0.683784 -0.171888 -2.380670 -0.813354 0.730170 0.081609 0.608570 0.528031 -0.181476 -6.025341 2.779716 -3.324180 1.261428 0.492542 15.758355 -0.013733 -0.534744 0.191867 0.670189 0.856857 0.086009 6.017321 3.364200 -7.929292 -3.029213 4.315345 14.687223 -6.735345 5.502752 26.782696 -0.327290 -14.347259 -1.368294 10.789804 -21.599205 -12.693804 23.901497 -19.977432 -19.416935 2.272611 -78.419380 -5.367332 32.757080 -18.064423 -10.824881 -0.224632 -0.010287 0.064272 -17.001711 26.078747 -15.855872 -3.526985 63.092155 -6.654686 -40.548397 30.509621 -15.823312 -0.753414 -0.257017 -0.296162 +0.081477 1.662569 -0.101236 4.090908 32.946072 5.377330 0.823818 -0.483727 -4.586555 -0.229213 -0.221832 -1.648501 -0.863706 0.782214 0.053037 0.620970 0.541519 -0.194590 -5.338080 2.811177 -4.091404 1.497100 0.430727 14.954982 0.000841 -0.583773 0.183775 0.703402 0.884149 0.111408 7.154171 3.659247 -8.068837 -3.092623 4.718558 14.222916 -7.268971 6.067945 26.617887 -0.193863 -14.446340 -1.762977 10.273693 -21.747290 -12.772013 23.019650 -18.810026 -19.752174 -4.497456 -81.214943 0.289883 32.559399 -17.086882 -10.854053 -0.272812 0.006697 0.048296 -17.606268 24.344473 -16.548855 0.018092 64.941002 -4.002574 -40.092724 30.982365 -16.004272 -0.797053 -0.277354 -0.300430 +0.075631 1.662606 -0.100745 3.460313 32.976471 5.710641 1.651751 -0.598342 -5.862648 -0.220353 -0.229545 -1.193220 -0.924313 0.852111 0.031840 0.608909 0.507222 -0.193184 -4.589757 2.812429 -4.654297 1.586486 0.375017 14.338484 0.012426 -0.597335 0.169291 0.712591 0.912611 0.123434 7.424440 3.845426 -8.311149 -3.011508 4.804329 13.762800 -7.142565 6.292909 26.404932 -0.122025 -14.670962 -1.414737 10.276059 -21.916969 -13.140939 22.433922 -17.528334 -19.910950 -27.151760 -83.391960 20.414181 32.921360 -16.879583 -11.344308 -0.315939 -0.025322 0.070809 -18.030359 22.724833 -16.860800 6.800633 66.340378 0.729718 -40.609013 33.137920 -17.157066 -0.828607 -0.254875 -0.334881 +0.067744 1.663019 -0.100160 2.750137 32.451008 5.964579 2.709828 -0.654018 -7.029812 -0.114215 -0.240247 -0.610304 -0.930584 0.864305 0.032429 0.609857 0.508663 -0.197719 -3.674926 2.945854 -5.614472 1.624561 0.393651 14.123142 0.018196 -0.609623 0.169756 0.719909 0.924489 0.125479 6.925022 4.113745 -8.470967 -2.708726 4.964619 13.365863 -6.311509 6.434574 26.121767 -0.087647 -14.617156 -1.313665 10.179727 -21.897840 -12.920235 21.621241 -16.789473 -19.702494 -55.289963 -83.062332 45.417103 33.694054 -18.238564 -12.221183 -0.328209 -0.018812 0.060631 -17.603447 22.193762 -16.885450 12.234296 67.057144 4.719404 -40.514904 35.660309 -18.112703 -0.837186 -0.264026 -0.337863 +0.060451 1.663239 -0.099180 1.937882 32.343819 5.958369 3.803444 -0.623412 -7.813339 0.243347 -0.258939 -0.337957 -0.931584 0.849311 0.020650 0.625676 0.531819 -0.167987 -2.776719 2.871157 -5.914401 1.981815 0.313143 13.251905 0.004562 -0.600031 0.164373 0.727190 0.900327 0.131984 6.693370 4.130381 -8.602763 -2.492925 4.878021 13.085575 -5.623110 6.248312 25.914974 0.026765 -14.322717 -0.993933 9.866907 -21.264786 -13.101703 20.605280 -16.762232 -19.441797 -69.444542 -81.344215 56.811363 33.558720 -20.169079 -12.845671 -0.327240 -0.026446 0.068682 -16.992315 22.335329 -16.871490 19.327330 67.236977 9.520151 -39.864265 38.640488 -19.115461 -0.836243 -0.259119 -0.327297 +0.052895 1.663245 -0.098062 1.322211 31.782982 6.073307 4.770546 -0.606652 -8.541510 0.440738 -0.270776 0.067088 -0.946148 0.846498 0.018886 0.636753 0.539766 -0.140044 -2.060540 2.844466 -6.400616 2.237840 0.249050 12.528689 -0.009189 -0.584895 0.170410 0.730516 0.888239 0.129532 6.422508 4.134879 -8.697432 -2.410754 4.796368 12.828496 -5.160326 6.120498 25.663195 -0.058329 -14.074247 -0.515942 9.547147 -20.743080 -13.313732 19.289627 -16.371893 -19.119247 -77.490204 -78.407585 61.343708 32.973049 -23.363062 -13.643740 -0.326028 -0.056824 0.093424 -16.234922 22.454899 -16.763935 28.269604 66.825409 15.260168 -39.315926 42.380127 -20.557898 -0.846430 -0.241830 -0.335911 +0.046037 1.662703 -0.096283 0.787367 30.777323 6.156832 5.514717 -0.599568 -8.969502 0.851362 -0.302157 0.421786 -0.949322 0.835268 0.015171 0.670398 0.577169 -0.101702 -1.576798 2.885718 -6.904355 2.616249 0.196066 12.201994 -0.030733 -0.580131 0.166903 0.748952 0.868787 0.138336 6.046391 4.173681 -8.953986 -2.359094 4.779506 12.608792 -4.672663 6.045753 25.626432 -0.169140 -13.511759 -0.112721 9.216455 -20.021311 -13.482525 17.449570 -15.208226 -18.445559 -84.397644 -74.431297 63.724461 32.583523 -28.703791 -15.143194 -0.319589 -0.056320 0.103005 -15.929209 22.354614 -17.222151 39.593220 66.615494 22.832735 -36.562370 45.757362 -20.921675 -0.851164 -0.249906 -0.326012 +0.039986 1.661240 -0.094250 0.268377 29.780293 6.220406 6.298190 -0.564981 -9.349019 0.998647 -0.311890 0.877572 -0.933065 0.800760 0.008394 0.679123 0.579550 -0.065802 -1.058189 2.943848 -7.337451 3.144549 0.100472 12.102241 -0.051450 -0.548698 0.166443 0.728923 0.824585 0.143160 5.764920 4.117283 -9.040600 -2.385677 4.656163 12.352559 -4.369051 5.882736 25.184273 -0.646732 -13.006015 0.784969 9.144421 -19.396803 -13.731958 15.495880 -14.966761 -17.312281 -85.709503 -69.846359 59.936234 31.575283 -34.764702 -16.622219 -0.293988 -0.068191 0.133468 -14.899734 23.063726 -17.113855 49.787735 64.896858 28.465288 -33.056538 49.319580 -20.803890 -0.833715 -0.231214 -0.311077 +0.033978 1.659814 -0.091534 -0.302558 29.064325 6.142828 7.322985 -0.437458 -9.538744 0.848280 -0.305337 1.118544 -0.866625 0.702229 0.007516 0.707805 0.610742 -0.013836 -0.160860 3.001503 -7.586288 3.062507 0.123911 11.990170 -0.100697 -0.482750 0.163399 0.695277 0.734926 0.146518 5.599644 4.083576 -8.875501 -2.442043 4.600804 12.146664 -4.164323 5.635550 24.392145 -1.014126 -12.510187 2.059135 9.851705 -18.615873 -14.412713 13.283307 -15.468011 -16.367182 -83.872742 -65.445190 53.785103 26.602276 -40.988811 -16.044506 -0.213428 -0.055911 0.174528 -12.405194 24.297611 -16.526840 57.423985 61.840282 31.015785 -26.612154 53.179672 -18.892153 -0.779497 -0.214809 -0.261756 +0.028820 1.658024 -0.088926 -0.746657 28.167524 6.127325 8.064070 -0.379529 -9.955431 0.907637 -0.290271 1.757425 -0.863072 0.682274 -0.021868 0.666808 0.526805 0.029060 0.478978 3.230084 -8.036625 3.128987 0.096436 12.437164 -0.114635 -0.420108 0.138320 0.623208 0.658848 0.151542 5.547206 4.232161 -8.374828 -2.461287 4.608712 11.943456 -4.066922 5.601864 23.144876 -1.775282 -12.153822 3.146666 9.957205 -18.016468 -14.850808 11.300803 -17.004930 -15.459740 -80.482262 -60.903999 46.393951 19.054178 -46.859386 -13.795204 -0.182508 -0.096380 0.253326 -9.225326 26.157406 -15.612331 60.147099 57.151772 28.553387 -15.392452 56.765541 -13.648410 -0.738761 -0.149773 -0.266975 +0.024259 1.656469 -0.085762 -1.114040 27.719856 6.093285 8.523989 -0.430282 -10.678864 1.398656 -0.310160 3.087777 -0.846434 0.638121 -0.033779 0.648257 0.451581 0.105528 1.106315 3.339919 -8.165560 3.134204 0.068032 12.561898 -0.143586 -0.330029 0.129613 0.543585 0.565688 0.144133 5.384788 4.208803 -7.622181 -2.479476 4.468927 11.626424 -3.963840 5.386047 21.362310 -2.538534 -11.799301 4.994083 10.342610 -17.223997 -15.281015 9.602264 -18.411757 -14.489587 -77.448097 -55.665230 39.080826 6.912807 -52.168674 -8.421310 -0.118701 -0.149964 0.355887 -6.191836 27.530190 -14.616426 62.100391 51.022358 24.285908 1.487765 58.231964 -4.515537 -0.689516 -0.079265 -0.272603 +0.018929 1.655272 -0.083074 -1.320157 27.438904 6.024343 8.804043 -0.520952 -11.724448 2.009363 -0.351595 5.107023 -0.821493 0.577180 -0.043184 0.633540 0.417549 0.156606 1.545581 3.443554 -8.345448 3.594228 -0.016706 12.732988 -0.175229 -0.243758 0.126685 0.486679 0.488302 0.130215 5.240254 3.885373 -6.604835 -2.608207 4.173019 11.420531 -4.110647 5.116705 19.652153 -3.248586 -11.309921 6.543055 10.628420 -16.363821 -15.987360 6.680974 -19.585842 -13.844151 -74.320900 -50.182953 31.355860 -7.711515 -52.438782 -0.885073 -0.059364 -0.209896 0.435250 -3.225844 29.060011 -13.800301 62.489117 45.105511 18.976837 16.208967 54.689651 3.029758 -0.642904 -0.006721 -0.268939 +0.015033 1.652419 -0.080629 -1.872544 27.256689 5.607562 9.173531 -0.578054 -12.846951 2.860530 -0.454417 7.441465 -0.788694 0.480980 -0.074902 0.689558 0.468411 0.255373 2.273404 3.650125 -8.432840 3.960526 -0.066124 13.463724 -0.241096 -0.160799 0.110128 0.466335 0.363913 0.143251 5.612366 3.288752 -5.623464 -2.656493 3.701338 11.200472 -4.344469 4.696045 18.251329 -3.845389 -10.786163 8.410403 10.468436 -15.161457 -17.444098 3.094943 -19.395794 -13.516047 -73.244728 -45.120861 25.429760 -18.212690 -46.996372 3.674936 0.025590 -0.224607 0.512006 -1.161697 29.294413 -13.281642 64.009697 39.762363 14.683785 22.268076 46.992287 4.549775 -0.596414 0.031837 -0.218076 +0.011640 1.648982 -0.077192 -2.245581 27.119728 5.125892 9.064021 -0.807862 -14.144335 4.062254 -0.661653 10.636581 -0.745959 0.377733 -0.093884 0.720589 0.512561 0.308761 2.603768 3.693428 -8.156476 4.766854 -0.200310 13.924015 -0.292988 -0.075202 0.109002 0.443478 0.266891 0.134219 6.102139 2.769947 -4.489749 -2.817702 3.419485 10.893922 -4.828446 4.471055 16.777538 -4.311166 -10.366948 10.302101 10.827532 -14.326761 -18.647331 -1.315633 -19.761639 -12.828084 -70.823479 -40.584328 19.598974 -21.849625 -39.580322 4.089746 0.109032 -0.251681 0.572904 1.364328 30.279877 -12.183983 64.271088 34.851540 10.480817 21.889658 37.390999 2.871182 -0.549648 0.082061 -0.177757 +0.006436 1.646482 -0.074548 -2.396243 26.319700 4.583327 8.914662 -1.189471 -15.442275 4.765430 -0.898953 14.346115 -0.723408 0.294975 -0.135524 0.743085 0.528034 0.373324 2.980075 3.828263 -8.064270 5.169292 -0.293313 14.740459 -0.342242 0.005466 0.091262 0.408499 0.155941 0.140283 5.703667 2.319776 -2.885660 -2.926263 3.118362 10.440119 -4.921028 4.242048 15.125410 -4.530672 -9.600414 12.492696 11.073767 -13.146041 -19.750673 -6.323945 -20.328955 -11.684490 -67.008247 -35.957207 13.765593 -21.655010 -32.839359 2.890163 0.180359 -0.271922 0.651909 5.002633 31.745455 -10.233080 63.596897 30.567308 6.877375 19.962444 29.748713 1.476035 -0.507224 0.136706 -0.141464 +0.000344 1.642982 -0.073020 -2.904719 24.550039 4.002471 9.285649 -1.613476 -17.397533 4.939266 -1.143864 19.367868 -0.697447 0.217400 -0.168870 0.756723 0.526457 0.423855 3.587287 4.304657 -8.709493 5.652985 -0.400704 16.713232 -0.386285 0.079799 0.077989 0.364376 0.053933 0.145328 5.431520 1.962162 -0.648394 -2.911253 2.992637 9.621492 -4.957923 4.159826 12.917857 -5.287396 -8.375392 14.502936 11.358890 -12.071952 -20.585999 -11.452865 -19.708029 -10.074731 -63.529682 -30.909336 8.358694 -18.492363 -28.223272 1.091566 0.255661 -0.283423 0.731517 10.075599 31.886204 -7.699796 62.630482 26.192200 3.791089 17.663208 23.004074 0.625034 -0.463677 0.185246 -0.110898 +-0.007274 1.638968 -0.072235 -3.008276 22.035337 3.677706 9.522751 -1.967760 -19.711714 4.694295 -1.246534 24.977421 -0.670678 0.151376 -0.195416 0.757548 0.525458 0.467222 3.970089 5.080105 -10.031467 5.631836 -0.377111 19.647587 -0.415510 0.142913 0.068845 0.326898 -0.026727 0.145717 3.924162 2.163312 1.951574 -2.670274 3.175872 8.709508 -4.227693 4.268992 10.655452 -5.574524 -7.478019 15.723668 11.241080 -10.879519 -21.340027 -15.470458 -17.810436 -9.378189 -60.964703 -27.026674 4.770772 -14.935219 -24.731766 -0.247103 0.302369 -0.302749 0.782621 14.839340 30.607428 -5.876314 60.586037 22.582407 1.804074 15.459748 16.683353 0.302390 -0.425095 0.231847 -0.085000 +-0.012767 1.632059 -0.071147 -3.188107 20.125826 3.490277 9.567676 -2.516288 -23.157537 4.592924 -1.440678 32.002728 -0.626222 0.103103 -0.206375 0.751699 0.518213 0.477906 4.004121 5.862217 -11.714152 6.379379 -0.572347 23.018656 -0.430698 0.163487 0.059324 0.290569 -0.077932 0.162258 2.812906 2.184469 4.341192 -2.370742 3.204790 7.776482 -3.547487 4.181605 8.470813 -5.922029 -6.688453 15.734831 10.983440 -10.183174 -21.245098 -17.941589 -14.558348 -9.286791 -59.890591 -23.472286 2.041696 -11.116385 -21.778189 -1.341169 0.333187 -0.271548 0.793085 17.773335 27.986938 -5.341005 58.811947 19.628033 0.867582 13.436264 9.585812 0.273600 -0.388544 0.233265 -0.048803 +-0.017405 1.623264 -0.069625 -3.763556 18.597235 3.088673 9.740908 -3.066433 -27.092962 4.828552 -1.805309 39.742638 -0.596579 0.085221 -0.193604 0.736575 0.486607 0.477354 4.233627 6.701496 -13.441511 7.622811 -0.982310 26.802177 -0.432961 0.173024 0.066673 0.254320 -0.093286 0.166765 2.684459 1.835391 6.730634 -2.192938 3.169391 6.868375 -3.495774 4.099107 6.328510 -6.301057 -5.814495 15.146177 10.791109 -9.730202 -20.768696 -19.510109 -11.365467 -9.245909 -58.665051 -19.894918 -0.162634 -8.531816 -19.381807 -1.890725 0.352819 -0.256297 0.803771 18.986029 24.900455 -5.439965 57.112122 17.176193 0.052519 11.351021 3.933233 0.299241 -0.367915 0.231857 -0.041567 +-0.022472 1.616148 -0.066093 -4.606283 16.783684 2.038433 10.257225 -3.237386 -30.051424 4.860679 -2.070026 46.780174 -0.610522 0.061044 -0.204255 0.718773 0.467486 0.504439 5.313603 7.236397 -13.443831 7.945229 -1.112726 29.058994 -0.441672 0.214755 0.068919 0.236123 -0.130152 0.144288 2.724490 1.566288 9.486620 -2.050978 3.328049 6.083529 -3.622650 4.284473 4.461007 -6.048547 -5.272292 15.347760 10.143270 -8.627272 -21.611727 -21.036156 -8.525801 -9.344939 -56.316929 -16.534935 -1.850828 -6.523263 -16.867512 -2.104004 0.366587 -0.310249 0.846832 18.836288 21.985016 -5.754991 55.359642 15.102925 -0.912700 8.728246 -0.011556 0.353473 -0.360199 0.279839 -0.061794 +-0.028604 1.612718 -0.061543 -5.205863 14.780851 0.184086 10.481403 -3.321495 -31.716125 4.762765 -2.255331 53.005367 -0.608191 0.027894 -0.229788 0.735862 0.478802 0.550138 6.409328 7.461229 -11.889744 8.249804 -1.161624 30.333080 -0.477710 0.252686 0.055904 0.219036 -0.188509 0.163519 2.189550 1.555688 13.131711 -1.949141 3.727525 5.295633 -3.683510 4.680171 2.536283 -5.645040 -5.248861 16.697853 10.199049 -7.850960 -22.905785 -22.588839 -6.642550 -9.222620 -52.489914 -13.294887 -3.059737 -4.999961 -14.308742 -2.081709 0.393287 -0.323604 0.898454 19.141649 19.729973 -5.567057 51.953823 12.876890 -2.060239 6.453767 -2.555665 0.451266 -0.346359 0.311769 -0.041931 +-0.033465 1.611543 -0.057313 -5.288341 12.923439 -2.078186 9.747585 -3.666156 -32.410072 4.921432 -2.548815 58.253490 -0.615517 -0.012988 -0.252891 0.765817 0.502750 0.614105 6.882721 7.336810 -9.424691 8.648570 -1.214429 30.933720 -0.517838 0.305340 0.039539 0.217254 -0.255142 0.161152 1.377738 1.673654 16.938850 -1.885749 4.143285 4.763104 -3.648863 5.081563 0.997109 -5.403621 -5.038651 18.570427 10.438336 -6.968575 -24.290100 -23.327129 -5.456102 -8.691787 -49.202919 -10.225882 -3.913328 -3.029912 -12.153958 -2.069226 0.436552 -0.352176 0.959725 18.800640 18.027386 -5.097826 47.701511 10.585001 -3.161278 4.930471 -3.219490 0.474945 -0.329705 0.346126 -0.035995 +-0.037001 1.610900 -0.053046 -5.459035 11.417397 -4.370905 8.919687 -3.990988 -32.892670 4.719621 -2.631299 62.414093 -0.621527 -0.032382 -0.253748 0.772318 0.510506 0.637159 7.178439 7.141113 -6.887559 9.413719 -1.396781 31.385492 -0.533739 0.338407 0.046544 0.215893 -0.274104 0.146453 1.183635 1.560423 20.112841 -1.946585 4.516106 4.633256 -3.969219 5.446738 0.062529 -5.270811 -4.611331 19.771185 10.590975 -6.358570 -24.764013 -23.337696 -4.727475 -7.933431 -46.059875 -7.455133 -4.352599 -1.121212 -10.099092 -1.953547 0.454304 -0.390862 0.992206 17.932812 16.644169 -4.852449 43.475632 8.879509 -3.809905 3.719316 -3.919387 0.493247 -0.327533 0.376892 -0.046392 +-0.042302 1.610100 -0.049081 -5.391903 9.911004 -6.324331 8.141214 -4.015886 -33.465736 3.902835 -2.138607 65.653336 -0.618434 -0.059633 -0.262143 0.784273 0.531671 0.657152 7.362815 7.137530 -4.857063 10.020396 -1.511466 32.175289 -0.546387 0.353239 0.049146 0.217707 -0.301873 0.146027 0.480422 1.964811 22.227631 -1.941046 4.897775 5.094965 -3.796236 5.802814 0.099601 -5.052799 -4.603489 19.660629 10.209729 -5.799301 -25.733595 -22.133482 -3.793023 -7.513168 -44.155209 -5.861660 -4.444392 1.045169 -7.803169 -1.774016 0.467210 -0.396980 1.004365 15.947800 15.561639 -4.604399 39.730682 7.417494 -4.274111 2.618038 -3.673816 0.461445 -0.324058 0.385768 -0.036964 +-0.046499 1.609824 -0.044563 -4.897097 8.044132 -7.759527 7.129580 -3.701488 -33.950520 2.434736 -0.905148 68.046700 -0.567278 -0.109690 -0.251736 0.791232 0.558504 0.656296 6.894688 7.341344 -3.339985 10.693041 -1.602174 33.169521 -0.550341 0.356923 0.053911 0.209904 -0.321924 0.146254 -0.180039 2.533565 23.303581 -2.283835 5.312343 5.754400 -4.028460 6.098253 0.544943 -4.827488 -4.434423 18.788912 10.298202 -5.464774 -25.856817 -20.136738 -2.228923 -6.826283 -42.542194 -4.035356 -4.797617 2.826261 -7.419703 -1.665038 0.488975 -0.357993 0.975026 13.555342 14.611179 -4.277354 36.701172 6.347998 -4.459073 1.805836 -3.291048 0.420920 -0.296834 0.362327 -0.003108 +-0.051368 1.609805 -0.039089 -4.729520 5.262616 -9.072851 7.009119 -2.416961 -33.923206 0.479808 0.948071 69.028908 -0.538666 -0.111515 -0.231386 0.758328 0.530239 0.627724 7.340661 7.830291 -1.892002 10.257276 -1.192133 34.147629 -0.540927 0.352997 0.060729 0.184976 -0.303629 0.147970 -0.553872 3.476938 23.967199 -2.540746 6.006273 6.481787 -4.276760 6.742264 1.088838 -4.740468 -4.220420 17.433125 10.389961 -5.287320 -25.893085 -17.643950 -0.260914 -6.279697 -41.360966 -2.508306 -5.087936 4.177069 -7.586514 -1.621331 0.480496 -0.350431 0.957908 10.696718 13.640912 -3.638309 33.917938 5.195716 -4.513232 1.852453 -2.401143 0.371252 -0.282587 0.362839 -0.002393 +-0.056731 1.609689 -0.031798 -4.488407 2.199222 -9.961704 6.761600 -0.874082 -33.753017 -1.260345 2.780887 68.746666 -0.499820 -0.121450 -0.192676 0.722658 0.497435 0.586983 7.735133 8.368250 -0.669134 9.878084 -0.718180 34.887722 -0.511474 0.341385 0.082580 0.163110 -0.270551 0.124350 -1.171180 4.802898 23.820547 -2.737865 6.803915 7.112964 -4.354832 7.428541 1.673593 -4.726437 -3.751820 15.659914 10.995532 -5.321371 -24.884024 -14.488888 2.454476 -5.832412 -40.615459 -1.178024 -5.458930 5.070867 -8.539602 -1.633265 0.481976 -0.333029 0.920877 8.172437 12.075585 -3.089619 31.262337 4.172236 -4.510634 1.568522 -1.391018 0.315117 -0.265113 0.341937 -0.013063 +-0.060454 1.611549 -0.024798 -4.345602 0.264955 -11.284180 6.274473 -0.036605 -33.198147 -3.752834 4.673784 67.294670 -0.480361 -0.101782 -0.162420 0.681199 0.447092 0.548282 7.943894 8.597098 1.079643 9.849933 -0.493284 35.296005 -0.489628 0.329359 0.096662 0.134069 -0.230963 0.121538 -1.291891 5.575139 24.090136 -2.811716 7.291533 7.981347 -4.524038 7.883126 2.367414 -4.924322 -3.425659 14.103881 11.398785 -5.455873 -24.535128 -12.019752 4.652412 -5.502891 -39.678032 0.003667 -5.805753 7.218094 -9.860481 -1.791672 0.465212 -0.330656 0.903789 5.731482 10.316743 -2.458726 28.315857 3.008001 -4.513628 1.214985 0.744363 0.264369 -0.259341 0.340508 -0.027417 +-0.063755 1.614694 -0.017752 -4.304479 -0.941565 -12.486661 5.513461 0.377790 -32.600277 -5.867639 5.965476 64.767662 -0.458755 -0.070563 -0.131322 0.624120 0.374667 0.509615 8.318394 8.705842 2.775874 9.894506 -0.329877 35.559410 -0.452123 0.309094 0.104436 0.097279 -0.189909 0.114958 -1.222909 6.178157 24.121780 -2.744253 7.680165 8.791437 -4.580501 8.260159 3.067840 -5.085841 -3.527663 12.588505 11.146073 -5.948100 -23.310976 -10.716431 5.865695 -5.068224 -37.476646 1.250844 -5.898730 9.290425 -11.227266 -1.957080 0.436431 -0.325781 0.868926 4.466258 8.685677 -1.626946 24.942867 1.430896 -4.528524 -0.582997 2.888362 0.218945 -0.247001 0.331940 -0.044248 +-0.066834 1.618305 -0.009935 -4.271409 -1.728187 -13.761124 4.440903 0.464509 -31.423830 -7.689936 6.672837 60.742199 -0.495195 -0.005116 -0.120670 0.554363 0.285538 0.458506 8.833310 8.657389 4.785453 10.033473 -0.234974 35.574581 -0.406920 0.301080 0.104227 0.077810 -0.130853 0.086522 -0.575349 6.261177 23.886868 -2.979573 7.890209 9.879624 -5.202965 8.540730 4.265458 -5.753566 -3.037740 11.241445 11.695488 -6.384079 -23.090385 -9.103849 6.938199 -4.883404 -35.290504 2.090719 -5.796532 11.265144 -12.689768 -2.240234 0.395483 -0.366637 0.867585 3.262946 7.174008 -1.315178 21.187616 1.068536 -4.075763 -0.351786 2.925920 0.261723 -0.258810 0.362569 -0.104326 +-0.070439 1.620988 -0.000493 -4.160469 -1.791052 -14.417738 2.994115 0.122842 -30.840187 -8.887682 6.811105 56.824108 -0.496656 0.027183 -0.106951 0.541792 0.265790 0.420645 8.846130 8.662286 5.966333 10.838997 -0.455921 35.720875 -0.384959 0.265421 0.106791 0.080409 -0.088521 0.089626 -0.084268 6.365775 22.389635 -3.164983 8.041585 10.889608 -5.576904 8.716266 5.974546 -6.069462 -3.125971 10.091981 12.230101 -7.198275 -22.276144 -7.419556 7.690780 -4.718075 -32.664898 2.460795 -5.464011 12.799684 -13.810371 -2.472816 0.376884 -0.336484 0.838519 2.351725 5.616473 -1.170618 17.296295 0.982234 -3.428511 0.276717 1.454743 0.286641 -0.269410 0.332852 -0.112497 +-0.074229 1.623649 0.009182 -4.123700 -2.242906 -15.092424 1.826603 0.074590 -29.423367 -9.619883 6.583418 51.775143 -0.483441 0.033626 -0.083505 0.533490 0.261007 0.391314 8.879706 8.889065 6.860559 11.753366 -0.647050 36.130367 -0.370328 0.257235 0.120622 0.081716 -0.052200 0.076185 0.452950 6.533315 21.246351 -3.406180 8.319160 11.633908 -6.080700 8.961723 7.215721 -6.468230 -2.835513 9.475590 13.120923 -7.689601 -21.768579 -5.713641 8.120588 -4.185177 -30.186108 3.302296 -5.242072 14.473454 -14.910348 -2.715931 0.374842 -0.330612 0.816061 1.718016 4.551305 -0.803679 13.974302 0.513172 -2.942636 0.756237 -0.179769 0.285791 -0.269165 0.322657 -0.119974 +-0.078956 1.624931 0.020909 -4.333530 -2.742626 -15.129280 1.447024 0.330546 -28.100103 -11.089450 6.488171 45.802528 -0.479104 0.038896 -0.068683 0.524312 0.257081 0.363153 9.413212 9.269198 6.943058 12.501180 -0.769285 36.864906 -0.352879 0.242712 0.130685 0.088373 -0.023924 0.060189 1.294305 6.604326 19.510118 -3.770504 8.642481 11.895184 -6.832510 9.248810 8.184788 -6.554145 -2.706801 9.125379 13.703918 -8.081475 -20.992449 -3.931792 8.749782 -3.796303 -27.135714 3.872879 -4.786327 15.746517 -15.616330 -2.856759 0.371702 -0.322755 0.793702 1.016898 3.078273 -0.572713 12.038421 -0.203411 -2.654481 0.782950 -0.493135 0.264350 -0.272291 0.307191 -0.131190 +-0.083256 1.626013 0.032690 -4.537520 -3.553150 -15.281181 1.292840 0.744865 -25.927687 -12.554935 6.178078 38.921799 -0.487318 0.079555 -0.055947 0.468658 0.195079 0.311466 9.913964 9.700968 7.122727 12.962446 -0.762768 37.477596 -0.318319 0.231444 0.139498 0.066270 0.029360 0.043972 2.342352 6.794458 17.749067 -4.053502 9.034330 12.074540 -7.597500 9.693402 8.992167 -6.849308 -2.476460 9.744621 14.074791 -8.685578 -19.323400 -2.267720 8.541321 -3.049881 -24.066637 4.820086 -4.326739 16.908501 -15.207360 -2.838797 0.335593 -0.351225 0.777400 0.295125 2.417596 0.292638 9.725731 -1.509158 -2.288901 1.440996 -0.498258 0.256831 -0.278899 0.327252 -0.161716 +-0.087099 1.625439 0.044543 -4.879022 -3.550818 -15.363842 0.729406 0.667539 -23.566408 -13.148077 5.263333 31.820438 -0.498152 0.114442 -0.056705 0.451587 0.158480 0.297821 10.746673 10.023183 7.140649 13.338786 -0.776102 38.205318 -0.304517 0.210080 0.134912 0.055933 0.049590 0.052829 3.071229 6.932812 15.987280 -4.073936 9.171741 12.167547 -7.862047 9.902498 9.749548 -6.619665 -2.501984 10.385706 14.162013 -8.986056 -17.884083 -1.087291 8.534575 -2.592966 -21.284298 5.593383 -3.912184 18.667006 -15.473011 -3.024328 0.314754 -0.341191 0.773489 -0.518731 1.754865 0.949679 7.635855 -2.551775 -1.919943 2.011223 -0.354104 0.242023 -0.287486 0.316954 -0.173439 +-0.090904 1.622851 0.056495 -5.405794 -3.362160 -14.824477 0.163126 0.396351 -21.957710 -12.847582 4.088204 25.156433 -0.512493 0.122933 -0.067894 0.459526 0.174108 0.284005 11.073026 10.466381 6.261765 14.638362 -1.185547 39.084148 -0.298691 0.192396 0.125199 0.076768 0.058601 0.050769 4.082524 7.049643 13.160181 -4.111020 9.359155 12.337749 -8.149163 10.249475 11.264407 -6.492524 -3.143072 10.836895 14.594754 -9.670050 -17.719236 -0.660843 8.277614 -2.550275 -17.510607 5.862931 -3.222911 20.243835 -16.140551 -3.287871 0.308926 -0.322903 0.758851 -0.527988 0.741014 1.023506 4.499062 -2.922536 -1.327293 2.958824 -1.229639 0.152621 -0.298473 0.299991 -0.173350 +-0.094819 1.619612 0.067493 -5.928102 -2.501269 -14.513174 -0.667793 -0.155260 -20.689739 -11.678638 2.950583 19.980234 -0.546611 0.152325 -0.074074 0.464723 0.172147 0.289092 11.398046 10.681211 5.581599 16.150942 -1.806721 39.871658 -0.294526 0.177528 0.119519 0.095148 0.072382 0.047761 4.497272 6.969127 11.071962 -4.101716 9.174507 12.408237 -8.161904 10.204678 12.322958 -5.981243 -3.629343 11.007959 14.470870 -9.804289 -17.583473 -0.087978 8.411112 -2.557572 -14.237834 6.203336 -2.560209 21.779766 -17.071503 -3.602466 0.293362 -0.329949 0.763684 -1.037800 -0.035908 0.837356 2.260914 -2.695381 -0.929959 3.706935 -2.154623 0.054548 -0.319326 0.294437 -0.194493 +-0.098648 1.615449 0.078939 -6.429725 -0.689891 -14.590741 -1.791793 -0.927324 -19.238655 -10.153143 1.988053 15.987058 -0.560850 0.163427 -0.081149 0.467508 0.173826 0.280844 11.678406 10.444448 5.446476 17.918608 -2.690297 40.274136 -0.285932 0.177088 0.120247 0.106621 0.082785 0.039348 4.902253 6.458735 9.532441 -4.223984 8.674844 12.528913 -8.378658 9.819111 13.155441 -6.139990 -3.543532 11.555869 15.155403 -10.102446 -17.464794 1.106026 8.140964 -2.268770 -11.319903 6.410719 -1.963722 22.542982 -16.883654 -3.589069 0.289758 -0.333608 0.763419 -1.278386 -0.559549 0.782265 0.024249 -2.711612 -0.594961 3.936903 -2.636563 0.006567 -0.328585 0.297146 -0.203621 +-0.102360 1.609267 0.091844 -7.071791 1.453924 -14.736541 -2.764009 -1.457778 -17.713989 -9.014901 1.390483 13.116459 -0.590805 0.172143 -0.094154 0.493037 0.193191 0.307161 12.320220 9.984034 5.581549 19.335611 -3.506281 40.569923 -0.296159 0.176414 0.114903 0.129018 0.071098 0.039683 4.689802 6.005881 7.902266 -4.081151 7.967450 12.642797 -7.943502 9.226802 14.069006 -5.914043 -3.457068 11.850121 14.906630 -9.697120 -17.907877 2.018377 7.953105 -1.862757 -8.093374 7.126615 -1.215654 21.884457 -16.812366 -3.389329 0.293359 -0.338993 0.783288 -1.602516 -1.213488 0.670260 -1.894455 -2.772046 -0.266233 4.040524 -2.370249 -0.003042 -0.344508 0.294356 -0.213830 +-0.105765 1.601894 0.102984 -7.475506 2.554207 -15.058746 -3.038265 -1.506967 -16.541637 -8.988110 1.246997 11.744662 -0.566054 0.077389 -0.095852 0.569936 0.315127 0.363072 12.580375 9.777960 5.806503 20.950594 -4.317551 41.111622 -0.330561 0.204935 0.124383 0.181698 0.011658 0.012631 4.339998 5.832718 6.643101 -3.928652 7.675804 12.793781 -7.478076 8.866470 14.945797 -5.388284 -3.582959 12.486918 14.711348 -8.928375 -18.849380 2.608743 7.828300 -1.661123 -5.340085 7.505740 -0.701340 22.242306 -16.825874 -3.263389 0.355096 -0.331090 0.777423 -2.128025 -1.689717 0.631834 -3.311277 -2.893536 0.072751 4.037404 -1.962477 -0.025643 -0.330064 0.270560 -0.181401 +-0.110325 1.594462 0.111935 -7.607469 3.634754 -15.747669 -3.134311 -1.553056 -15.765891 -9.566685 1.375394 12.152218 -0.535405 0.030291 -0.098619 0.592533 0.347728 0.405280 12.620081 9.516385 6.353779 22.621572 -5.248260 41.567814 -0.351778 0.220795 0.125732 0.177200 -0.034986 0.021091 3.374327 5.782463 6.562540 -3.768897 7.341855 12.736885 -6.838039 8.423208 14.859060 -4.586175 -3.785986 13.274812 13.829673 -8.101556 -18.517960 3.129670 6.874203 -0.997113 -2.948442 8.548265 -0.354932 23.053068 -16.098471 -3.058595 0.376533 -0.325137 0.779378 -2.915638 -1.166665 1.384980 -3.977428 -3.900332 0.220550 4.057785 -1.815060 -0.014403 -0.309928 0.263900 -0.151795 +-0.114779 1.586340 0.120219 -7.294706 3.866702 -16.411154 -2.865041 -1.395903 -15.400959 -10.996572 1.788512 13.340425 -0.535774 0.012436 -0.110394 0.592584 0.359519 0.411562 12.396415 9.513542 6.994771 23.720787 -5.925977 42.378113 -0.360968 0.227914 0.122886 0.177864 -0.053487 0.022422 2.369140 6.021291 6.628178 -3.811535 7.327988 12.753875 -6.479008 8.357909 14.825266 -3.926337 -3.957463 13.469325 13.676326 -7.555861 -18.777166 3.649189 6.354259 -0.838647 -0.453328 8.693585 0.091548 23.335814 -15.458507 -2.870138 0.377976 -0.330938 0.787290 -3.221347 -0.906817 1.711321 -4.653479 -4.566107 0.260133 3.746727 -2.333239 -0.028880 -0.309737 0.272668 -0.146323 +-0.117546 1.578749 0.125662 -6.659654 3.815828 -17.352358 -2.966582 -1.490204 -15.250084 -12.057277 2.244631 15.386659 -0.532942 0.010417 -0.119503 0.575033 0.339235 0.401948 11.586409 9.632736 7.758195 24.762545 -6.661480 43.461388 -0.357823 0.244944 0.119760 0.160645 -0.057218 0.021373 1.668211 6.086178 7.625755 -4.124602 7.338911 12.900241 -6.647751 8.325468 14.473283 -4.114501 -3.687254 13.286473 14.529540 -7.468236 -19.317369 4.519283 5.972566 -0.655293 0.756444 8.910223 0.194656 24.363049 -15.196894 -2.902202 0.377059 -0.338005 0.798529 -3.229116 -0.433697 2.063303 -5.193028 -5.077242 0.235147 3.725788 -2.920979 -0.041102 -0.303371 0.296200 -0.146385 +-0.120041 1.572380 0.129362 -6.305942 3.615783 -18.167765 -2.459479 -1.337810 -15.212354 -13.498231 2.791792 17.171534 -0.489782 -0.050843 -0.094904 0.603037 0.385974 0.406871 11.293916 9.692673 8.308476 25.431528 -7.210978 44.615311 -0.369310 0.265380 0.138930 0.170041 -0.069312 -0.002897 1.127866 5.955515 8.764842 -4.382669 7.334832 12.957771 -6.816120 8.136098 13.948115 -4.419566 -3.153421 13.009773 15.650078 -7.373028 -19.349434 5.438451 5.678382 -0.388690 0.913781 9.065556 0.015867 25.505732 -14.885599 -2.884380 0.430137 -0.323295 0.791334 -3.014028 0.153495 2.275024 -5.376196 -5.154175 0.194067 3.504311 -3.401726 -0.070221 -0.277609 0.279147 -0.132339 +-0.121409 1.566785 0.132315 -6.229176 3.445084 -18.446049 -1.536514 -1.159212 -15.634907 -15.038079 3.294131 18.541788 -0.463389 -0.059730 -0.076676 0.604382 0.388259 0.389530 11.291673 9.667732 8.384093 25.887857 -7.714139 45.613132 -0.368481 0.256638 0.150165 0.161794 -0.054369 0.002377 1.364210 5.486217 9.669513 -4.779380 7.198331 12.780397 -7.464574 7.914199 13.271833 -4.824913 -2.566663 12.457442 16.054541 -7.431819 -18.840149 5.961504 5.381151 -0.254147 1.152591 8.954454 -0.044735 25.942503 -14.216311 -2.751684 0.439331 -0.300730 0.778080 -2.842363 0.548663 2.284291 -5.187572 -4.820549 0.114477 3.618735 -3.787461 -0.104767 -0.269047 0.262371 -0.121411 +-0.121633 1.563252 0.133136 -6.207879 2.716420 -18.530725 -0.798228 -0.952371 -15.733153 -15.976245 3.521087 18.726164 -0.451276 -0.060329 -0.062844 0.566421 0.359079 0.338161 11.524342 9.766999 8.315435 25.639431 -7.772152 46.547638 -0.343655 0.253816 0.164740 0.146837 -0.021867 -0.019739 1.977451 4.988690 10.728998 -5.274837 7.147072 12.504950 -8.386013 7.781594 12.364853 -5.290700 -1.732056 11.745614 16.866001 -7.538753 -18.161772 6.321446 5.139113 -0.095538 0.651253 9.072498 -0.247198 26.910023 -14.317163 -2.854932 0.433777 -0.305133 0.760922 -2.344515 0.992614 2.391790 -4.722337 -4.535479 0.062922 3.664660 -3.335208 -0.064310 -0.264414 0.270255 -0.136835 +-0.121898 1.562045 0.132095 -6.296937 2.237329 -18.538651 -0.196385 -0.842635 -15.620030 -16.648272 3.532489 18.272446 -0.421624 -0.062168 -0.044324 0.548567 0.338759 0.306686 11.848676 9.686393 8.116293 25.149817 -7.674862 47.029305 -0.335757 0.249593 0.175524 0.125016 0.000061 -0.014687 2.419848 4.389591 11.900627 -5.707050 6.949331 12.287120 -9.131953 7.471502 11.475921 -5.680685 -1.111133 10.893270 17.812616 -7.712327 -17.820562 6.519305 4.803987 0.275100 -0.151435 9.524633 -0.458687 27.471832 -15.247224 -3.120506 0.434999 -0.286010 0.748011 -1.653504 1.503774 2.651853 -3.934599 -4.403604 0.036218 3.880179 -2.273012 0.014895 -0.253817 0.264878 -0.129494 +-0.122583 1.563203 0.129728 -6.370316 2.379146 -18.180025 -0.111760 -1.011142 -15.512547 -16.722134 3.250673 17.135126 -0.440092 -0.007641 -0.028148 0.517641 0.298907 0.276611 12.050435 9.344055 7.730395 24.413095 -7.506826 47.093266 -0.309598 0.220128 0.180614 0.122768 0.053540 -0.014729 2.093888 4.088501 12.456456 -5.736309 6.593401 12.289157 -9.027953 7.131604 11.195807 -5.441470 -0.945093 9.397714 17.450848 -7.749553 -17.205772 6.627807 5.445283 -0.556064 -2.006414 7.137973 -0.851998 28.450481 -15.871873 -3.580874 0.388686 -0.293490 0.725561 -1.326600 1.048519 2.015600 -2.466781 -3.484174 -0.133951 3.995342 -2.012242 0.005046 -0.274097 0.260361 -0.156308 +-0.122330 1.566770 0.126004 -6.862566 2.167047 -17.945341 0.107629 -1.063304 -14.915633 -16.067343 2.740838 15.318274 -0.466176 0.045496 -0.023798 0.488294 0.249888 0.274261 12.590283 8.930395 7.613179 23.621336 -7.181594 46.643768 -0.293799 0.218007 0.181075 0.108841 0.084267 -0.009947 2.462157 3.703882 13.238460 -5.646223 6.314587 12.249623 -9.064575 6.913510 10.781544 -5.288212 -1.016388 8.728507 17.213570 -7.698281 -17.416704 6.649496 5.805310 -1.218261 -4.689087 4.937608 -1.356343 29.498144 -17.218878 -4.320535 0.346171 -0.329679 0.732530 -1.481122 0.950674 1.551869 0.289414 -2.788719 -0.583706 3.724111 -2.041247 0.041688 -0.290575 0.286985 -0.182382 +-0.121876 1.570924 0.121349 -7.277102 2.349147 -17.486326 -0.299998 -1.329397 -14.468218 -14.614100 2.097471 13.347012 -0.474041 0.108227 -0.019255 0.420475 0.162894 0.228699 12.924494 8.456316 7.200593 22.933365 -6.960938 46.031380 -0.267872 0.182777 0.172078 0.069147 0.126971 0.012523 2.433203 3.421620 14.182847 -5.411819 5.896744 11.808802 -8.784131 6.479448 9.729136 -4.818884 -1.033386 8.062301 16.318027 -7.672631 -15.897619 6.520482 5.928554 -1.331696 -7.374492 3.514424 -1.666415 29.705997 -19.821272 -5.242815 0.285555 -0.327840 0.716255 -1.659985 1.161210 1.459286 3.382258 -2.585826 -1.051680 3.455165 -1.741092 0.094011 -0.300304 0.291817 -0.200811 +-0.121052 1.575325 0.116321 -7.176392 2.172981 -16.553852 -1.237175 -1.552315 -14.162011 -12.741652 1.438776 10.710757 -0.459499 0.110266 -0.010060 0.422467 0.170392 0.241272 12.404871 8.134282 6.572304 22.403255 -6.671595 44.991665 -0.269803 0.159104 0.171338 0.069817 0.126816 0.029661 1.367676 3.754752 14.370745 -4.876679 5.635292 11.436094 -7.680348 6.152471 9.166446 -3.867156 -1.165315 7.536928 14.857112 -6.968556 -15.042185 6.164510 6.532460 -1.823331 -10.642793 1.309045 -2.002665 29.405722 -22.136473 -6.036434 0.266510 -0.310068 0.691340 -2.195982 0.912099 0.883817 6.705359 -1.676299 -1.420694 3.741755 -1.833966 0.063025 -0.299391 0.265327 -0.188253 +-0.118246 1.580098 0.109927 -7.711839 2.075364 -15.587891 -2.088654 -1.835086 -14.202435 -10.109858 0.801686 8.486234 -0.441670 0.088577 -0.027452 0.479225 0.227037 0.306912 12.040537 7.666810 5.746990 22.462009 -6.724844 43.824299 -0.295205 0.133230 0.165084 0.084466 0.069559 0.081053 0.806512 3.957070 14.487797 -3.805872 5.297740 11.191707 -6.132635 5.824849 8.921922 -2.679579 -1.973135 7.175693 12.479910 -6.068850 -15.259023 4.406346 7.096613 -2.811057 -13.778641 -1.106776 -2.268214 28.906534 -24.795628 -6.924478 0.263654 -0.253814 0.673941 -3.153684 0.288356 0.224831 10.035183 -0.926798 -1.743588 4.105676 -1.873696 0.025924 -0.303234 0.214187 -0.132173 +-0.114862 1.584567 0.101931 -8.740442 1.905554 -14.505961 -2.350240 -1.884379 -14.665668 -7.717851 0.374252 6.604163 -0.439979 0.081357 -0.036211 0.511341 0.261599 0.356569 12.131114 7.159822 4.751263 22.863031 -6.897527 42.459049 -0.318512 0.120248 0.161797 0.093616 0.037566 0.114388 1.206626 3.983779 14.601110 -2.751334 5.130107 10.879861 -5.038743 5.701476 8.615458 -1.284028 -2.591045 7.060310 10.643373 -5.052985 -15.613962 2.561202 7.182442 -3.885128 -16.511860 -3.883932 -2.304093 27.073845 -27.518414 -7.518256 0.250585 -0.238313 0.671737 -4.112470 -0.486091 -0.340489 13.856544 -0.541222 -2.200242 4.130472 -1.385617 0.026595 -0.312973 0.194391 -0.104998 +-0.111653 1.588717 0.092943 -9.580932 1.938409 -13.071809 -2.774422 -1.995113 -15.587181 -5.479844 0.084802 4.950943 -0.450784 0.073900 -0.059684 0.516137 0.270156 0.368477 12.051138 6.629433 3.344998 23.300184 -7.073602 40.853096 -0.325742 0.112034 0.151600 0.096996 0.010127 0.127193 2.367603 3.662552 14.544272 -2.300927 5.032442 10.374562 -4.940774 5.629103 8.166381 -0.456285 -2.840114 7.537911 9.931774 -4.497946 -15.633410 1.278644 6.299837 -4.638807 -18.993738 -6.416201 -2.319404 24.388172 -28.466503 -7.368638 0.246393 -0.226625 0.678114 -4.338342 -1.046778 -0.519125 18.322056 -0.927267 -2.912134 3.519533 0.244504 0.066412 -0.319135 0.188831 -0.095946 +-0.107687 1.591367 0.083690 -10.365875 1.587422 -11.407109 -3.041477 -2.004628 -16.891371 -3.434665 -0.069550 3.456881 -0.468509 0.084028 -0.069495 0.529481 0.272144 0.419691 11.766008 6.263106 1.633495 24.164347 -7.413058 39.434261 -0.344595 0.114909 0.143007 0.096394 -0.017786 0.148005 3.174097 3.375661 14.198696 -1.732412 4.794790 9.791350 -4.461377 5.439648 7.734949 0.695003 -3.263393 7.727342 8.347216 -3.514747 -16.261333 -0.609418 5.460496 -5.295821 -21.369019 -7.883554 -2.388442 21.405855 -29.465984 -7.074156 0.232986 -0.244612 0.700580 -4.472658 -1.269404 -0.997553 22.855288 -0.506443 -3.657374 2.081141 1.298265 0.078064 -0.327344 0.196078 -0.094661 +-0.103623 1.594249 0.075134 -10.676368 -0.541627 -10.126528 -2.962898 -1.659159 -17.407568 -1.695443 -0.096874 1.489791 -0.472091 0.054948 -0.101665 0.572698 0.324096 0.480299 11.640573 6.414000 0.549522 24.135914 -7.255526 38.962532 -0.374231 0.121832 0.122955 0.116367 -0.078071 0.170036 3.389520 3.627431 13.544667 -1.203354 4.916288 9.550274 -3.726349 5.574574 7.882900 1.832137 -2.895388 8.249529 7.252992 -1.913786 -17.259890 -3.327069 4.371879 -6.073265 -23.620604 -8.793082 -2.706412 19.274776 -29.980612 -6.865378 0.242340 -0.222372 0.712701 -3.192371 -1.151574 -1.539329 25.508799 0.351278 -3.907566 1.875103 2.776520 0.017741 -0.325225 0.183665 -0.065521 +-0.100158 1.596338 0.067743 -10.743060 -4.249978 -9.004866 -2.176583 -1.023096 -17.446777 -0.428128 -0.050101 -0.618364 -0.486922 0.037035 -0.126380 0.618947 0.360951 0.545748 11.812025 6.992308 -0.135721 22.769899 -6.445992 39.025208 -0.410490 0.136140 0.103693 0.129657 -0.135156 0.191831 3.887447 3.945993 13.276469 -1.011871 5.296007 9.298170 -3.598031 5.982064 7.785995 1.855152 -1.910181 8.998516 6.085312 -0.431414 -18.625816 -5.510310 3.480265 -6.606335 -26.439394 -9.226962 -3.130168 17.302073 -29.293293 -6.484406 0.265439 -0.214550 0.751546 -1.920061 -1.061195 -1.949684 28.230600 1.015548 -4.318895 2.411154 6.408478 -0.120510 -0.323313 0.180882 -0.048902 +-0.097533 1.597633 0.059465 -10.768269 -7.751304 -8.021132 -1.151258 -0.476258 -17.733234 0.198507 0.003402 -1.863529 -0.481496 0.011635 -0.135894 0.662701 0.404263 0.602277 11.815592 7.464859 -0.753441 21.749920 -5.827280 39.087379 -0.442300 0.152349 0.090666 0.145218 -0.180264 0.205419 3.474221 4.371689 13.129768 -0.515508 5.450000 9.112489 -2.694355 6.131138 7.655249 1.867284 -0.771943 9.392219 5.225754 0.983774 -19.677412 -7.801723 2.592673 -6.890826 -29.759911 -9.232000 -3.716399 16.027205 -28.753725 -6.338119 0.291514 -0.202986 0.771694 0.135106 -0.453572 -2.622035 29.660341 2.229525 -4.469664 2.748702 9.116249 -0.250170 -0.311327 0.171817 -0.030197 +-0.095542 1.597074 0.050804 -10.682375 -11.093835 -7.073360 0.232117 -0.034097 -18.682926 0.234990 0.017817 -1.927449 -0.497061 0.011271 -0.154227 0.695764 0.438507 0.622805 12.035393 7.999822 -1.598497 20.276812 -5.091345 39.508476 -0.456617 0.143508 0.079380 0.168213 -0.197154 0.221194 2.834883 4.844185 12.949556 -0.078207 5.593792 9.071894 -1.730728 6.275786 7.728148 1.451176 0.621287 8.959104 4.835809 1.975133 -20.670458 -9.961541 1.764418 -7.482730 -32.615372 -9.744394 -4.036368 13.958906 -28.009691 -5.955474 0.294939 -0.177878 0.779480 3.292212 0.021180 -3.832868 29.940405 3.884016 -4.385713 3.431431 11.219625 -0.329157 -0.321903 0.155525 -0.019049 +-0.091720 1.595362 0.042873 -10.531297 -13.868399 -6.487523 1.454017 0.080399 -19.953587 0.083305 -0.016876 -0.470651 -0.544859 0.050466 -0.173859 0.709304 0.448273 0.636417 11.873093 8.151453 -1.935811 18.922718 -4.566908 39.686890 -0.458207 0.120636 0.071339 0.193853 -0.189472 0.235707 2.585171 4.929061 12.497750 0.263597 5.477036 9.288976 -0.986578 6.209398 8.301510 1.181025 1.761880 8.599656 3.503222 2.945799 -21.269123 -12.909211 0.250549 -8.175206 -33.912518 -10.129675 -4.193420 10.952181 -27.437540 -5.363461 0.261794 -0.185990 0.787387 6.924839 0.775010 -5.268367 29.368313 5.833721 -4.142728 4.577650 12.763718 -0.318809 -0.355796 0.153093 -0.032387 +-0.087358 1.593021 0.034954 -10.154297 -16.510944 -6.336051 2.687575 0.032264 -21.391552 -0.546176 -0.056879 2.189341 -0.582823 0.086696 -0.183261 0.734651 0.480606 0.666497 11.586700 8.275984 -2.092062 17.515150 -4.091831 40.286354 -0.461133 0.090816 0.060040 0.235942 -0.177562 0.247518 2.311195 4.932173 12.279837 0.499985 5.371855 9.665775 -0.405770 6.070732 9.070761 1.400689 2.949356 7.851189 1.935036 4.203703 -21.539318 -16.289186 -1.296401 -9.335744 -34.191463 -11.115684 -4.075907 7.255441 -26.229082 -4.458590 0.222805 -0.189869 0.773111 10.983436 1.267169 -7.181695 28.194967 8.150480 -3.735981 6.912456 14.313531 -0.148609 -0.384245 0.132853 -0.042660 +-0.082290 1.590908 0.026135 -9.674929 -19.653587 -6.441548 4.778462 0.103319 -23.311642 -2.880351 0.039479 6.514984 -0.613003 0.109717 -0.188663 0.758729 0.502808 0.692191 11.037043 8.567432 -2.312833 16.089779 -3.593109 41.139725 -0.469174 0.095240 0.049079 0.267381 -0.170634 0.242277 2.197282 4.846527 13.150053 0.622613 5.322367 9.724824 -0.215018 6.000103 8.952825 0.588603 4.860611 7.727464 1.822828 5.147485 -22.076241 -18.109533 -2.546503 -10.031176 -35.841206 -12.272231 -3.879541 4.546419 -24.582525 -3.834703 0.216030 -0.207590 0.784267 14.176224 2.165993 -8.892341 28.154507 10.636209 -3.422447 9.278061 15.029361 0.134653 -0.396183 0.136905 -0.059782 +-0.076728 1.589217 0.017525 -9.337086 -22.675936 -6.650127 7.111570 0.265263 -25.584240 -5.432250 0.419341 12.321162 -0.636163 0.111654 -0.204623 0.789197 0.526674 0.726981 10.958919 8.799173 -2.446165 14.123393 -2.879994 41.935795 -0.487384 0.104296 0.040392 0.285007 -0.192338 0.248215 2.081067 4.785146 14.379545 0.974503 5.271582 9.644013 0.256006 5.960065 8.507165 -0.287498 6.491506 8.313399 1.108517 6.137515 -22.766132 -19.582798 -3.797518 -10.279150 -38.393330 -13.199995 -3.839222 2.764426 -24.543068 -3.639683 0.226223 -0.216343 0.810983 16.254305 3.311919 -10.049994 29.119520 12.619970 -3.263388 10.961274 15.305230 0.368482 -0.402988 0.142162 -0.060848 +-0.070639 1.587947 0.009293 -8.588428 -25.256002 -7.034620 9.284584 0.214736 -28.314030 -8.723649 1.278155 19.648899 -0.619495 0.064143 -0.228233 0.837040 0.585594 0.758053 10.341713 8.946970 -2.767771 12.391591 -2.348774 42.892838 -0.521324 0.120074 0.027642 0.298312 -0.245361 0.265464 1.843598 4.651171 15.952848 1.166214 5.239953 9.381445 0.535340 5.878619 7.715352 -1.167545 8.114583 9.229746 0.719982 7.116445 -23.612904 -20.519329 -5.584527 -9.936342 -40.615978 -13.899993 -3.865438 1.144542 -25.576572 -3.512211 0.267486 -0.182611 0.826508 18.022318 4.773543 -10.540502 30.964613 13.816966 -3.302941 11.883787 16.041054 0.493940 -0.387114 0.131579 -0.020390 +-0.064251 1.587862 0.001830 -7.582339 -27.892616 -7.406356 11.398551 0.158419 -30.935560 -12.378336 2.696329 27.031349 -0.615334 0.024362 -0.251280 0.858736 0.620031 0.785345 9.368890 8.993286 -3.085620 10.803086 -1.870944 43.360626 -0.545688 0.151365 0.020230 0.302255 -0.291567 0.264251 1.344945 4.636975 17.044071 1.277169 5.192320 9.088566 0.881750 5.828482 7.038770 -1.838528 9.580663 11.048082 -0.033992 8.218720 -24.259003 -20.974840 -7.602017 -9.410316 -43.056358 -14.798287 -3.768966 -0.274711 -26.678377 -3.435072 0.295781 -0.194723 0.850567 19.080612 6.628206 -10.669480 33.482502 14.985076 -3.254134 12.418055 16.110548 0.547830 -0.373111 0.153378 -0.001379 +-0.057341 1.588561 -0.005188 -6.809907 -30.579470 -7.550349 13.400704 0.121882 -33.016388 -15.408962 4.352577 33.676102 -0.626646 0.023545 -0.263316 0.858298 0.613667 0.795665 8.653202 9.076246 -3.766886 9.173681 -1.362657 43.767143 -0.547694 0.166566 0.016648 0.299375 -0.304079 0.257012 1.180748 4.611382 17.794598 1.416092 5.238131 8.803474 1.131272 5.921054 6.466387 -2.449370 10.721713 12.514604 -0.285077 8.840532 -23.884501 -21.824026 -9.999587 -8.896431 -45.014500 -15.913357 -3.560483 -1.642877 -28.329353 -3.389562 0.301999 -0.213824 0.869005 20.552895 8.372422 -10.289063 34.785896 15.441662 -3.345138 13.876097 18.417870 0.850852 -0.370481 0.171608 -0.008109 +-0.050809 1.591287 -0.012226 -6.123955 -33.404877 -7.895464 15.146324 0.036083 -34.329250 -17.774126 6.158177 39.931210 -0.658255 0.021642 -0.291472 0.870189 0.615126 0.847926 8.029611 9.127069 -4.338978 7.508443 -0.824190 44.040855 -0.566306 0.185212 0.002085 0.301694 -0.349018 0.258370 0.837340 4.727928 18.217047 1.625928 5.275351 8.767420 1.628955 6.021292 6.427030 -2.078348 11.463920 14.774514 -1.915507 10.211136 -24.178553 -22.797016 -12.876400 -8.575180 -46.401260 -17.695297 -3.031675 -3.264457 -29.202883 -3.167481 0.304311 -0.247500 0.908528 21.120480 10.514746 -9.856177 36.316490 16.214890 -3.311450 15.704465 20.593342 1.256162 -0.374275 0.194726 -0.016687 +-0.044784 1.595225 -0.018543 -5.243031 -36.308411 -8.383995 16.863348 0.024552 -35.057407 -20.436405 8.400620 45.672112 -0.705283 0.028226 -0.325621 0.902137 0.633898 0.910241 7.333644 9.236161 -5.073282 5.537334 -0.134703 44.540131 -0.595285 0.202722 -0.012282 0.316869 -0.393063 0.270928 0.219744 5.124094 18.338137 1.784375 5.417981 8.933867 2.215036 6.213049 6.807394 -1.600638 12.038110 16.592712 -3.133415 11.378983 -25.478693 -23.222706 -15.719395 -8.550082 -48.061256 -20.138439 -2.316854 -4.268013 -30.914459 -3.161460 0.305300 -0.280671 0.961503 21.850754 12.503804 -9.593614 37.586441 17.192619 -3.314294 17.168060 23.052763 1.671400 -0.392749 0.219261 -0.023702 +-0.037880 1.601872 -0.024103 -3.944030 -38.643448 -9.156026 17.917011 -0.480206 -35.352627 -23.084803 10.693775 50.365582 -0.760832 0.039299 -0.373129 0.930771 0.653277 0.982446 6.154510 8.923654 -5.498709 3.367103 0.524818 44.249519 -0.627968 0.231209 -0.041062 0.334425 -0.446824 0.285819 -0.361312 5.279794 18.052982 1.663221 5.347169 9.327538 2.453972 6.220126 7.678231 -1.024856 12.227106 18.894524 -4.340035 12.329124 -27.314934 -23.006369 -19.134781 -8.570673 -49.065998 -22.984152 -1.486997 -3.958987 -32.332741 -3.495274 0.298242 -0.329179 1.019500 22.184492 15.048985 -9.186317 39.179314 18.316572 -3.430213 18.396908 26.191151 2.081500 -0.408578 0.261018 -0.029149 +-0.030149 1.611075 -0.028939 -2.329648 -40.833126 -10.386823 18.169176 -1.266523 -34.731030 -25.180538 12.671412 53.777958 -0.806785 0.034349 -0.425188 0.951582 0.682212 1.029198 4.770388 8.366419 -5.484551 1.306127 1.101586 43.291843 -0.648813 0.245138 -0.060089 0.351240 -0.496251 0.298748 -1.128718 5.329763 18.030581 1.481508 5.127775 9.848531 2.584974 6.069211 8.565516 -0.546830 12.558703 20.621790 -5.885605 13.296539 -29.129614 -23.385605 -22.317192 -8.452600 -48.575809 -25.492346 -1.046355 -4.139489 -35.633602 -3.682168 0.286223 -0.359278 1.054532 22.967888 17.741011 -9.044477 39.877590 20.014585 -3.284785 20.479877 28.782412 2.791781 -0.426642 0.292744 -0.023073 +-0.023760 1.619569 -0.032854 -1.326498 -43.010807 -10.709376 18.430225 -1.895622 -34.283737 -26.259142 14.162395 56.798191 -0.819272 0.039760 -0.437249 0.966845 0.698361 1.059230 4.112092 7.786780 -5.768792 -0.637084 1.620485 41.965118 -0.659374 0.240475 -0.067026 0.361953 -0.509176 0.310738 -1.792899 5.393530 17.076418 1.463870 4.935923 10.288431 2.979496 5.876730 9.544247 -0.114180 12.799664 21.578428 -6.735719 14.133934 -29.321909 -22.626268 -25.042858 -8.110881 -48.956902 -28.113268 -0.340618 -3.898420 -39.556431 -4.051702 0.272360 -0.363527 1.058355 23.371780 20.147465 -8.846654 40.778412 21.673870 -2.934761 22.840670 31.196224 3.653859 -0.435051 0.290253 -0.019083 +-0.016223 1.628408 -0.036436 -0.216050 -45.438114 -11.067581 18.018665 -2.597883 -33.349453 -26.379347 15.012912 59.110443 -0.835889 0.056691 -0.438466 0.969832 0.701991 1.067346 3.373744 7.170098 -5.937366 -2.400672 2.029167 40.177803 -0.666412 0.220319 -0.066142 0.371481 -0.500474 0.322498 -2.171825 5.444689 15.962061 1.283122 4.864514 10.808869 3.004338 5.795840 10.635302 0.692456 13.137923 22.173567 -7.396810 15.286156 -29.202721 -21.606020 -27.714966 -7.596881 -48.126549 -30.798569 0.248973 -3.130774 -45.408188 -4.650240 0.251227 -0.364526 1.062479 23.310848 22.688040 -8.672698 42.126072 23.556051 -2.417055 24.519754 33.130379 4.331645 -0.453022 0.280190 -0.029984 +-0.008526 1.638044 -0.039496 0.345234 -47.872005 -10.937167 17.421329 -3.125296 -32.033611 -25.642794 15.282559 61.087753 -0.837751 0.067096 -0.437068 0.974866 0.701410 1.089191 3.166177 6.576193 -5.947394 -4.319799 2.479144 37.531116 -0.657222 0.196616 -0.065618 0.376822 -0.502651 0.327464 -1.956878 5.400740 14.711784 1.194172 4.918184 11.425623 2.904609 5.784266 11.959918 1.117989 13.210009 21.947445 -8.610518 16.099981 -28.826668 -20.874163 -29.544418 -7.399006 -46.854317 -34.086674 1.400307 -2.687394 -50.646118 -4.816702 0.230056 -0.344587 1.039803 23.148514 24.658007 -9.095463 43.398216 26.029205 -1.486876 26.502352 34.626743 5.208508 -0.460241 0.250342 -0.029836 +-0.000935 1.646505 -0.041518 0.539706 -50.054752 -9.855972 16.460606 -3.308074 -30.890961 -23.812643 14.871906 62.651970 -0.886891 0.138802 -0.433379 0.949382 0.664410 1.087481 2.945152 6.139464 -6.565036 -5.846557 2.695843 34.269836 -0.633040 0.144105 -0.075635 0.393932 -0.459723 0.330813 -1.115814 5.348762 11.864999 0.971613 4.946169 12.265228 2.660460 5.698934 14.396877 1.647901 13.167585 20.787241 -9.799139 16.669756 -28.166208 -18.044188 -30.541647 -7.698162 -46.300476 -37.622993 3.030749 -0.091714 -55.815071 -6.255778 0.165026 -0.352996 1.020585 21.673033 26.092312 -10.106341 45.357559 29.047106 -0.123314 27.783638 36.686089 6.012128 -0.495624 0.225790 -0.074628 +0.005256 1.654104 -0.042790 0.180768 -51.755867 -8.524004 15.233724 -3.320123 -29.348419 -20.762964 13.701805 64.384651 -0.922192 0.206464 -0.415517 0.926679 0.639159 1.071826 3.150133 5.716417 -6.779891 -7.098650 2.763778 30.621151 -0.603276 0.075717 -0.060993 0.411713 -0.396930 0.338897 -0.248446 5.369173 8.997069 0.924284 4.954095 13.070316 2.593556 5.510279 16.858480 2.638926 13.059347 19.503614 -11.000761 17.470186 -27.056196 -14.042281 -30.683777 -8.197059 -46.377510 -41.534576 5.418648 4.556721 -60.567123 -9.093345 0.088124 -0.352478 0.981064 18.646257 26.848083 -11.631490 47.801434 32.582085 2.096767 29.180138 39.328918 7.140772 -0.542986 0.187719 -0.111771 +0.011177 1.660779 -0.043640 -0.469235 -53.071259 -6.989410 13.761934 -3.153218 -27.470335 -17.129795 11.876129 65.177322 -0.911274 0.253083 -0.387259 0.916468 0.637943 1.050353 3.287821 5.362221 -6.796794 -7.664825 2.653923 27.192055 -0.570571 -0.010453 -0.049478 0.430593 -0.333544 0.360278 0.547004 5.408997 6.066652 1.050094 4.879773 13.713514 2.748568 5.061334 19.246479 3.534879 12.996459 18.051666 -11.654007 18.193640 -24.736010 -10.033770 -30.943958 -8.249392 -46.187489 -45.406017 7.950586 13.101711 -64.287277 -14.734966 0.016811 -0.296766 0.895948 15.871672 27.807774 -13.028104 49.537968 36.451687 4.874414 29.105736 41.918633 7.908497 -0.569591 0.107595 -0.112899 +0.016387 1.666238 -0.044848 -0.959668 -53.882881 -5.552499 12.213819 -2.928858 -25.481783 -13.724709 9.862381 64.569145 -0.916958 0.324771 -0.356828 0.901538 0.634897 1.014652 3.142250 5.076992 -6.864185 -7.635260 2.412869 24.364468 -0.535911 -0.107094 -0.038566 0.459450 -0.241564 0.385661 1.130234 5.566401 3.170544 1.058378 4.840948 14.234748 2.809404 4.619390 21.631672 4.854272 13.062694 16.165592 -11.430703 18.843885 -22.495291 -5.166532 -30.817669 -8.758216 -46.752029 -49.712818 11.130754 25.075491 -65.071457 -22.712080 -0.075701 -0.247868 0.810599 12.475660 27.929701 -14.499917 51.519993 40.565510 8.342980 28.173979 45.857697 8.624625 -0.613121 0.031345 -0.127145 +0.020830 1.670397 -0.046280 -1.173458 -54.036171 -4.447215 10.211468 -2.619926 -23.342306 -9.943294 7.504820 62.743015 -0.924339 0.395978 -0.316326 0.881915 0.642009 0.967881 2.867887 4.733041 -6.549827 -7.494579 2.181579 21.506014 -0.487309 -0.203339 -0.012636 0.501230 -0.130522 0.391574 1.392416 5.757218 0.467651 1.095656 4.768246 14.747674 2.965233 4.081998 24.094690 6.116565 13.032990 13.736625 -11.123012 19.097061 -20.254526 -0.352057 -30.210875 -9.411083 -46.832886 -54.058926 14.280040 37.173328 -63.409958 -30.079004 -0.177564 -0.218721 0.706202 8.951498 27.810001 -15.535131 52.720387 45.184765 12.208359 22.750887 51.308090 7.374693 -0.663522 -0.039998 -0.151357 +0.024779 1.673042 -0.046942 -1.207814 -53.699409 -3.406551 8.081964 -2.286350 -21.152769 -6.200592 5.203951 59.949688 -0.955523 0.495282 -0.271555 0.843363 0.618496 0.903873 2.424139 4.396047 -6.316773 -7.264716 1.935531 18.867821 -0.429256 -0.303297 0.012807 0.538343 0.002920 0.389868 1.364346 5.850482 -1.809862 1.178314 4.569081 14.985292 3.229892 3.523268 26.012440 6.973453 13.034779 11.015517 -10.673641 18.890011 -17.991638 3.776378 -28.534470 -9.806660 -47.814186 -58.275261 18.333158 47.887138 -61.011257 -35.994171 -0.289825 -0.209766 0.615003 5.595275 26.873817 -16.162714 53.966068 49.995464 16.869511 13.628213 56.403671 3.585502 -0.725472 -0.098484 -0.201196 +0.028205 1.674232 -0.046871 -1.731077 -53.389935 -2.209347 6.634295 -1.896335 -18.054928 -3.255263 3.346537 55.452576 -0.952764 0.580243 -0.230159 0.815210 0.607671 0.854501 2.321575 4.141191 -6.075737 -7.021814 1.742799 16.766270 -0.387872 -0.405575 0.024409 0.563725 0.112042 0.420521 1.612369 5.624309 -3.722794 1.276926 4.217242 15.137303 3.405852 2.949592 27.700352 7.629457 13.192994 8.730769 -10.962315 18.834248 -16.023176 6.578010 -26.134007 -9.956131 -48.455280 -62.111660 22.208340 55.361801 -57.581387 -38.757103 -0.396962 -0.167755 0.511097 1.730402 25.434643 -16.466232 55.496189 55.334835 22.541298 -1.647177 60.404892 -4.847795 -0.765889 -0.171096 -0.211955 +0.032364 1.674111 -0.046728 -2.256626 -52.909401 -1.212368 5.671906 -1.638146 -14.262360 -1.447922 2.107789 49.348183 -0.978126 0.660523 -0.218000 0.799541 0.601928 0.820214 2.373644 3.955387 -5.971650 -6.946975 1.612850 14.967504 -0.349134 -0.499687 0.018829 0.599420 0.192782 0.444575 1.776198 5.200869 -5.293624 1.343317 3.707423 15.260667 3.587335 2.341715 29.165981 7.954035 13.782743 6.735585 -10.919444 18.844135 -14.506988 9.238744 -24.303852 -9.831750 -47.349991 -65.011215 24.013906 62.591080 -52.897907 -40.513161 -0.491916 -0.122490 0.430504 -1.964227 24.323439 -16.556448 55.734577 60.556126 27.633781 -19.343679 61.188793 -15.520700 -0.812115 -0.239581 -0.227336 +0.036628 1.672208 -0.044945 -3.290248 -51.874744 0.218740 5.343167 -1.660143 -10.303707 -0.142126 1.052480 42.519733 -0.991421 0.721342 -0.201778 0.784318 0.588885 0.784218 2.616390 3.734074 -5.848286 -6.675889 1.426349 13.244569 -0.319236 -0.567511 0.019174 0.619432 0.260619 0.460455 2.390364 4.560790 -6.592905 1.469314 3.057482 15.107872 3.782181 1.669818 29.797119 7.957111 14.290574 5.547637 -10.542043 18.747747 -13.086506 11.997070 -22.997919 -9.590491 -46.092548 -66.755424 24.712898 66.278648 -48.393105 -39.981495 -0.555400 -0.086110 0.373948 -5.343866 23.352652 -16.281370 55.876293 64.525116 31.861109 -32.759510 59.920414 -23.383692 -0.843582 -0.289677 -0.241344 +0.040674 1.669608 -0.043613 -3.971669 -49.764397 1.110065 4.906065 -1.693422 -5.860209 1.581229 -0.038105 34.556232 -1.004003 0.768534 -0.182840 0.781436 0.604544 0.758929 2.851780 3.597019 -5.586694 -6.457114 1.328944 12.091945 -0.300859 -0.630621 0.023102 0.653213 0.322256 0.475104 2.864322 3.852616 -7.794526 1.681827 2.299321 15.162473 4.052951 0.829506 30.627407 8.214466 13.888855 4.378451 -10.685382 18.297972 -12.226327 13.817783 -21.144844 -9.592664 -44.480293 -68.980453 25.606787 68.248352 -44.624580 -38.483128 -0.613867 -0.067973 0.316851 -8.763444 21.954578 -16.415827 55.347401 67.717171 34.784950 -42.139133 57.252598 -28.182941 -0.875570 -0.334535 -0.250543 +0.046366 1.665878 -0.042233 -5.266114 -47.395664 2.447992 5.499413 -1.687430 -1.929722 2.888417 -0.734935 26.990812 -1.021686 0.821962 -0.172238 0.789213 0.629818 0.740743 3.344638 3.586419 -5.642381 -5.905100 1.213343 11.412690 -0.281618 -0.706338 0.022509 0.694830 0.380198 0.499937 4.427049 3.121125 -8.798155 1.844641 1.628747 15.129389 3.878113 0.099112 31.315825 8.514285 13.229555 3.092165 -10.868461 17.653017 -11.290122 15.057023 -19.230263 -10.093170 -43.471043 -71.199425 26.536755 67.296043 -40.778664 -35.348030 -0.682056 -0.033064 0.249698 -11.940026 19.959269 -16.712763 55.291599 69.953644 37.190300 -48.890438 54.577919 -31.261019 -0.915902 -0.393446 -0.250274 +0.052584 1.662059 -0.042529 -6.431387 -45.600491 3.536648 6.545576 -1.448728 1.483114 3.318952 -0.881176 20.197004 -1.053736 0.890126 -0.173544 0.781340 0.633095 0.723494 3.656317 3.838358 -6.202827 -5.067804 1.155454 11.784363 -0.254432 -0.782688 0.007056 0.731455 0.436476 0.522428 5.698939 2.602547 -9.497391 2.025046 1.099972 15.120334 3.744249 -0.509495 31.891428 8.952615 12.836171 1.812229 -10.962914 17.272177 -10.331335 16.333370 -17.039124 -10.781209 -41.696667 -73.221825 27.045338 66.291214 -38.236027 -33.038532 -0.764934 -0.000685 0.185126 -14.918709 17.772314 -17.137106 55.093426 71.923866 39.101379 -53.966152 51.682739 -33.063679 -0.957524 -0.446228 -0.260021 +0.059402 1.659711 -0.043697 -6.941912 -43.825195 4.096900 7.384290 -1.291045 3.835479 3.335922 -0.885262 14.936798 -1.070965 0.941834 -0.168678 0.763326 0.608673 0.717506 3.259534 4.009666 -6.897241 -3.953108 0.989223 12.205113 -0.233730 -0.836430 0.000128 0.737230 0.469353 0.544554 6.251256 1.813306 -9.726709 2.104901 0.305617 15.195408 3.689377 -1.289448 32.115398 9.139599 12.732682 0.892009 -11.632235 17.393703 -9.632825 15.845903 -15.424744 -10.881114 -35.908157 -73.655998 23.703051 66.948273 -38.058380 -32.749851 -0.824684 0.018171 0.148919 -17.233620 16.339539 -17.520828 53.774715 73.631668 39.765720 -57.063835 49.789803 -33.938019 -0.982580 -0.481283 -0.269793 +0.065650 1.658256 -0.044277 -6.960798 -42.819855 4.254874 7.894347 -1.021454 5.713054 2.831353 -0.751921 10.657269 -1.093285 0.974740 -0.174080 0.777262 0.629688 0.723006 2.666457 3.954504 -7.205228 -3.366493 0.862160 11.838869 -0.224978 -0.876358 -0.012163 0.769780 0.490264 0.557184 6.221876 1.351170 -9.992504 2.197429 -0.202390 15.383808 3.802520 -1.891260 32.659401 9.215397 12.493174 -0.003385 -11.743753 17.016123 -9.390532 15.405009 -13.737053 -11.154136 -33.295506 -74.476639 22.625280 67.601135 -37.414944 -32.410606 -0.863725 0.039984 0.114554 -18.051785 15.042164 -18.000347 54.186207 75.059509 41.497402 -58.337666 48.361847 -33.912193 -1.007614 -0.516090 -0.269926 +0.070823 1.657103 -0.043917 -6.624625 -42.166958 4.360177 8.257011 -0.711776 6.669240 1.727280 -0.532054 7.685227 -1.131355 1.010287 -0.180984 0.779319 0.629125 0.711936 2.132733 3.850815 -7.505539 -3.429740 0.796503 11.226822 -0.221321 -0.889229 -0.010573 0.786140 0.518447 0.559677 5.580051 0.903072 -10.195440 2.176279 -0.735132 15.361766 4.049510 -2.390837 32.779556 9.361556 12.301540 -0.254739 -11.477374 16.561384 -9.548285 15.325025 -12.597578 -11.071490 -34.168427 -74.630302 23.741774 69.028702 -37.350571 -33.110500 -0.888781 0.022408 0.122476 -18.965796 14.503507 -18.262161 56.813812 75.778625 44.233711 -58.781261 47.249149 -33.698475 -1.039101 -0.507392 -0.288164 +0.077689 1.658636 -0.043071 -6.150938 -41.920200 4.456381 8.277065 -0.478351 6.700149 0.481968 -0.337764 6.213029 -1.131555 1.012600 -0.176054 0.794275 0.646771 0.697315 1.232634 3.713801 -7.990142 -3.224606 0.705244 10.715714 -0.222676 -0.893515 -0.007201 0.799883 0.533038 0.558755 5.059777 0.589834 -10.146471 2.153121 -1.048556 15.340273 4.230238 -2.765184 32.699535 9.375555 11.903297 -0.494516 -10.807954 15.824446 -9.379675 14.942574 -12.093244 -11.114971 -33.925117 -74.529976 23.870192 69.151634 -38.333408 -33.687523 -0.879296 0.033744 0.118045 -18.729731 14.625992 -18.368483 57.384201 76.129707 45.143669 -58.358936 47.403790 -33.485218 -1.044106 -0.516080 -0.284995 +0.085484 1.661927 -0.041732 -5.664074 -42.278553 4.492303 7.746435 -0.331188 6.350278 -0.283085 -0.236999 5.495908 -1.113932 0.962798 -0.181273 0.814125 0.668730 0.716813 0.357089 3.470462 -8.216311 -3.202318 0.606696 9.835293 -0.241930 -0.852172 -0.004854 0.794553 0.488132 0.543959 5.107885 0.546471 -9.911638 2.062612 -1.049525 15.409582 3.960825 -2.791318 32.515560 9.518795 11.310336 -0.036939 -10.851774 15.532160 -10.103300 13.933469 -12.918200 -11.285889 -32.305183 -74.560608 22.812469 67.706062 -39.827080 -33.549690 -0.824694 0.024096 0.146381 -18.389204 15.134132 -18.385303 57.119015 75.494225 44.306969 -57.490253 48.662090 -33.653316 -1.019513 -0.497376 -0.270958 +0.093596 1.664203 -0.040188 -4.980245 -42.585957 4.528403 6.748477 -0.345814 5.401388 -0.612134 -0.229382 5.507876 -1.061504 0.872676 -0.184004 0.860353 0.734717 0.752643 -0.608260 3.066938 -8.290551 -3.396968 0.495681 8.386323 -0.279327 -0.794633 0.002359 0.793846 0.420124 0.535340 4.990063 0.232380 -9.595216 1.811546 -1.217914 15.452978 3.632563 -3.002324 32.208752 9.137323 11.172256 0.456108 -11.087883 15.433730 -11.303026 13.811772 -13.750783 -11.015731 -31.568436 -72.803108 21.177378 68.638733 -41.581448 -35.130375 -0.744773 0.028673 0.165079 -18.155415 15.966803 -18.517729 58.780121 74.756401 45.004471 -56.288155 50.593178 -34.050549 -0.974973 -0.482421 -0.223742 +0.100936 1.665655 -0.037504 -4.851494 -42.918503 4.991039 6.128959 -0.414692 4.447311 -0.730564 -0.226466 5.675186 -1.012589 0.837694 -0.165143 0.824244 0.697142 0.730515 -1.125341 2.800078 -8.398616 -3.701256 0.393578 7.181369 -0.277407 -0.768437 0.018475 0.743861 0.407759 0.529132 5.622285 0.062739 -9.338334 1.646016 -1.260815 15.273209 3.222669 -2.966510 31.482546 8.900829 11.097034 1.196562 -11.634215 15.757787 -11.096888 12.574641 -14.611901 -10.659853 -32.807045 -71.467697 21.783295 67.862419 -44.899872 -36.592525 -0.718117 0.020984 0.170223 -17.496250 16.396448 -18.462267 60.482620 73.606079 45.763588 -53.659897 53.374538 -33.807327 -0.938385 -0.459205 -0.212416 +0.107944 1.666422 -0.035417 -4.596417 -43.395435 5.175663 5.457792 -0.496397 3.517495 -1.078575 -0.196427 6.311500 -0.974749 0.780668 -0.163388 0.820627 0.689769 0.744531 -1.642789 2.546052 -8.427622 -4.049558 0.309586 6.042753 -0.299952 -0.703966 0.026589 0.705866 0.356667 0.517156 6.046828 0.041803 -8.905970 1.527175 -1.197564 15.290967 2.845442 -2.827752 30.899927 8.216281 11.102348 2.039486 -12.221486 15.800844 -12.111193 11.664289 -16.094206 -10.256409 -33.386311 -69.210411 20.947456 67.827560 -48.146358 -38.698151 -0.657422 -0.008357 0.211921 -16.078112 17.573017 -18.489208 60.644829 72.001205 44.495499 -49.511589 56.666138 -32.676971 -0.895810 -0.410989 -0.194314 +0.113973 1.666501 -0.033141 -4.500572 -44.459019 5.589544 4.845727 -0.572288 2.760034 -1.405391 -0.158790 6.873722 -0.938904 0.720062 -0.169756 0.805515 0.658026 0.760777 -1.968096 2.420747 -8.855069 -4.587792 0.254511 5.263743 -0.316734 -0.631423 0.030523 0.650070 0.290673 0.501396 6.165148 0.031671 -8.372957 1.463254 -1.149219 15.194142 2.717439 -2.623543 29.967518 7.220787 11.423241 3.161364 -13.030349 16.043474 -13.118226 11.026108 -17.601217 -9.535933 -35.553368 -65.519913 20.492027 68.550468 -53.134136 -42.831207 -0.589981 -0.037744 0.265702 -14.804384 19.207966 -18.320457 60.737556 69.818146 42.683041 -44.328365 60.766979 -31.053774 -0.846057 -0.354925 -0.178190 +0.119838 1.664188 -0.030562 -4.421982 -45.209560 6.166308 4.473031 -0.678857 1.548273 -1.955051 -0.065309 7.805702 -0.916213 0.691242 -0.171022 0.774650 0.596437 0.775521 -2.267616 2.453084 -9.706220 -4.968254 0.199363 4.946353 -0.326653 -0.575739 0.033555 0.585762 0.241905 0.495994 6.181069 0.107803 -7.738973 1.522928 -1.077061 14.888722 2.838022 -2.415406 28.691483 6.613058 11.705554 4.125902 -14.210561 16.619797 -13.880965 9.641332 -18.575409 -8.817298 -38.789005 -62.281868 21.170906 69.500053 -59.297649 -48.146931 -0.548917 -0.071280 0.320779 -13.292752 20.391663 -18.324484 62.099762 67.012436 41.241535 -34.907124 64.508705 -26.134050 -0.808710 -0.302179 -0.176434 +0.125322 1.661303 -0.028417 -4.377361 -45.672707 6.526807 4.219688 -0.768439 0.590855 -2.410159 0.026082 8.730102 -0.891450 0.652645 -0.179821 0.748705 0.550470 0.795075 -2.341130 2.569870 -10.539226 -5.786746 0.226897 5.222316 -0.341068 -0.518091 0.030929 0.528253 0.186050 0.491540 5.754165 0.033900 -6.946912 1.606812 -1.198418 14.751355 3.033429 -2.419646 27.453598 6.516326 12.231105 5.118654 -15.293788 17.574949 -14.951193 7.721933 -19.823172 -8.838898 -41.099621 -58.811192 20.892488 65.099014 -67.298988 -50.746021 -0.508307 -0.101154 0.372155 -10.801096 21.643499 -18.480904 63.152889 63.530182 38.564259 -18.909105 67.012184 -15.848239 -0.768460 -0.249448 -0.168292 +0.131013 1.657694 -0.026598 -4.453258 -45.942970 6.991978 4.415339 -0.856235 -0.659217 -3.494602 0.243570 10.097691 -0.873301 0.613409 -0.196407 0.726417 0.503780 0.813032 -2.406764 2.942341 -12.055311 -6.285938 0.339976 6.883733 -0.351333 -0.469104 0.020538 0.474887 0.125047 0.486048 5.265535 -0.026331 -6.048739 1.705586 -1.306025 14.418541 3.359947 -2.434633 25.993261 6.661047 12.708971 6.387573 -15.911964 18.513685 -15.605532 5.632679 -21.029112 -8.941526 -44.075436 -55.430077 20.366735 51.416321 -73.424759 -44.198700 -0.463724 -0.115237 0.424151 -7.638421 22.793562 -18.287312 64.739471 59.724045 35.616867 -1.782592 66.147781 -4.215763 -0.729727 -0.210127 -0.160917 +0.136965 1.653489 -0.023974 -4.521633 -45.725830 7.388296 4.483037 -1.057476 -2.085336 -4.176654 0.403314 11.732553 -0.867445 0.592837 -0.208538 0.691294 0.435699 0.832543 -2.533491 3.337996 -13.621043 -6.774370 0.482145 8.947886 -0.359912 -0.411738 0.010253 0.416349 0.072407 0.475403 4.871581 -0.246062 -5.124758 1.836820 -1.582595 14.014394 3.768221 -2.510570 24.460619 6.810654 12.864364 7.930159 -16.746666 19.227747 -16.260281 2.965408 -22.061213 -8.680306 -48.570004 -51.732334 19.659237 27.193115 -76.521805 -26.792507 -0.426237 -0.157376 0.488585 -4.904137 23.625067 -17.895819 66.220039 55.488194 31.908815 12.223148 63.248169 4.490403 -0.693902 -0.152226 -0.170990 +0.143052 1.648896 -0.020363 -4.495141 -44.764992 7.658629 4.488468 -1.379789 -3.798103 -4.596609 0.525367 14.010952 -0.831222 0.531814 -0.217955 0.682929 0.409611 0.856343 -3.078216 3.660815 -15.151029 -6.676285 0.579731 11.220285 -0.382651 -0.351531 0.003074 0.365460 -0.001633 0.469220 4.757620 -0.595176 -3.978148 2.049545 -1.920521 13.467404 4.118104 -2.689900 22.567736 6.930366 12.380527 9.402244 -17.516674 19.528595 -16.929794 -0.012258 -22.851067 -8.408978 -52.526741 -48.008633 18.469044 -7.590754 -76.449936 0.444432 -0.357465 -0.169757 0.540488 -2.011261 23.782238 -17.223866 66.824760 50.381554 26.817139 24.083410 59.091946 10.577999 -0.642315 -0.114108 -0.150107 +0.148862 1.643875 -0.017632 -4.183511 -43.525417 7.595090 4.401174 -1.802899 -5.546171 -5.170064 0.673737 16.674118 -0.789561 0.464006 -0.230393 0.687754 0.401881 0.869909 -3.802325 3.991675 -16.874559 -6.649596 0.738451 14.440981 -0.405543 -0.287675 0.003462 0.321853 -0.069122 0.463111 4.463219 -0.795635 -2.599943 2.312649 -2.114779 12.826352 4.533935 -2.694463 20.484848 6.896309 11.852939 11.126021 -17.182184 19.496807 -17.269096 -2.752407 -23.620628 -7.963122 -55.815571 -44.499950 16.535870 -26.048658 -71.816406 13.034382 -0.282766 -0.171104 0.587890 0.886948 23.275854 -16.631189 65.736572 45.030788 20.954069 33.301323 52.791771 13.676422 -0.595075 -0.076559 -0.119057 +0.154883 1.639500 -0.014347 -3.952111 -42.859989 7.177482 4.217796 -2.165020 -6.750565 -5.872120 0.866282 19.222778 -0.753862 0.359087 -0.255454 0.728589 0.453576 0.912722 -4.427598 4.334466 -18.402655 -6.350749 0.890851 17.821808 -0.450297 -0.204934 -0.004609 0.309768 -0.171708 0.445258 4.493441 -0.795755 -0.803910 2.651134 -2.057292 12.403310 4.741822 -2.486247 18.691319 6.296203 11.196002 12.656752 -17.367382 18.993441 -18.930382 -5.976078 -23.964989 -7.841374 -57.104824 -41.319092 14.021559 -37.124447 -66.126198 18.605885 -0.178738 -0.184126 0.643282 3.962199 22.460783 -16.232822 64.023254 40.227348 15.564224 37.379642 45.102654 12.936171 -0.542611 -0.035657 -0.076470 +0.161944 1.634901 -0.011759 -3.624690 -41.216553 6.610679 3.951601 -2.668632 -8.204784 -6.136802 0.959292 21.872089 -0.759114 0.302059 -0.286162 0.749270 0.468503 0.947720 -5.367487 4.698485 -20.130106 -5.477237 0.915694 21.989759 -0.486524 -0.122276 -0.012147 0.293463 -0.247265 0.428272 4.711639 -1.034817 1.278527 2.975082 -2.259655 11.942585 4.859623 -2.419474 16.898903 5.903854 10.808914 13.883596 -17.309713 18.336639 -21.036810 -9.521943 -23.761175 -7.978493 -58.523380 -37.839813 11.367652 -43.421028 -58.994205 19.311821 -0.106374 -0.233111 0.721655 6.406395 20.762794 -15.469452 62.367306 35.865894 10.767262 36.992363 39.701912 10.647602 -0.516289 0.035127 -0.064840 +0.170064 1.629130 -0.009075 -3.444241 -39.284695 6.231213 3.829916 -3.293027 -9.879519 -6.495755 1.058800 24.725649 -0.754982 0.269786 -0.300205 0.761945 0.459902 0.973735 -6.257490 5.073783 -22.343895 -4.398115 0.820258 26.873705 -0.512405 -0.067296 -0.024008 0.270396 -0.300231 0.423904 5.269894 -1.382351 3.423795 3.371609 -2.480225 11.244256 5.033272 -2.412079 14.893768 5.392836 10.416062 14.909293 -16.869602 17.628906 -21.772068 -13.232208 -23.038097 -7.981762 -59.119865 -34.393570 8.746590 -44.601337 -51.713383 16.603939 -0.047086 -0.256108 0.782542 8.527350 18.771461 -14.726421 60.229092 31.975515 6.909196 34.578453 34.544041 8.062260 -0.488524 0.075146 -0.055864 +0.179023 1.624232 -0.005680 -3.033178 -37.391220 5.512206 3.491205 -3.902393 -11.113439 -7.162653 1.214173 27.127600 -0.736799 0.192764 -0.323251 0.797155 0.504792 0.995987 -7.372683 5.268885 -24.478722 -3.137982 0.572447 31.934090 -0.546745 0.001534 -0.033947 0.269889 -0.373712 0.403724 5.922967 -1.927678 5.699970 3.633477 -2.782386 10.548667 4.868347 -2.539112 13.010868 4.513954 10.171990 16.265821 -16.226355 16.539724 -22.917603 -16.698685 -22.427568 -7.556205 -58.835835 -30.670757 5.690525 -42.173485 -45.785538 12.677499 0.040073 -0.271519 0.830115 9.808117 17.575054 -14.134135 58.379482 28.969801 4.067314 29.634253 29.714815 5.257321 -0.451411 0.113266 -0.026746 +0.187218 1.618683 -0.002267 -2.605163 -34.879635 4.914313 3.046903 -4.656746 -12.478355 -7.420127 1.229704 29.546038 -0.711239 0.147343 -0.340485 0.819170 0.524886 0.997773 -8.520115 5.253216 -26.768766 -1.726469 0.054987 37.355255 -0.565195 0.036468 -0.038888 0.254604 -0.418922 0.410910 6.409304 -2.403704 7.782810 4.125042 -3.133983 9.743608 5.192228 -2.774892 11.148511 3.403871 9.677570 16.816675 -15.659340 15.222878 -23.277140 -19.632877 -21.240931 -7.260473 -58.621105 -27.510284 3.479827 -38.387852 -40.804810 9.153694 0.092385 -0.254987 0.851352 11.254871 16.041977 -13.623103 55.768978 26.235464 1.782423 24.367012 25.221102 3.116332 -0.426772 0.129361 0.013673 +0.194305 1.613997 0.001775 -2.288307 -32.851723 3.967691 2.703844 -5.153720 -12.850134 -7.953547 1.358947 31.270790 -0.698414 0.096963 -0.356549 0.842767 0.552246 1.014011 -9.148337 5.325193 -28.786930 -0.714273 -0.404600 42.586533 -0.586495 0.076122 -0.047146 0.252922 -0.472858 0.400619 6.646039 -2.618747 9.819848 4.734432 -3.355924 9.162924 5.695049 -2.914185 9.745563 2.512045 9.177427 17.574385 -15.744227 14.253150 -24.006432 -22.228968 -19.740435 -7.085320 -57.749424 -24.582052 1.439801 -33.931557 -37.110916 6.299410 0.149845 -0.256800 0.878182 11.863873 14.548391 -13.310349 53.104740 23.895857 0.100879 19.478428 20.854410 1.608147 -0.402387 0.146677 0.036676 +0.201263 1.610118 0.006086 -2.327027 -31.099403 2.870206 2.381796 -5.580511 -12.723948 -7.934176 1.325979 32.989853 -0.682956 0.036722 -0.358770 0.881691 0.605609 1.028350 -9.303290 5.486425 -30.532761 0.284049 -0.945813 47.793709 -0.612889 0.124015 -0.041279 0.267501 -0.512159 0.376640 7.379470 -2.905293 12.060617 5.309377 -3.435803 8.629048 5.778666 -2.915177 8.375629 1.540879 9.073153 18.691069 -15.092113 13.284627 -24.736008 -24.357878 -18.819170 -7.070393 -56.475105 -22.000605 -0.157597 -28.633747 -33.075798 3.665793 0.219429 -0.273426 0.905945 12.367572 13.094316 -12.963645 50.282692 21.702820 -1.278263 14.900525 17.145065 0.587470 -0.380792 0.167063 0.053415 +0.207709 1.604384 0.011014 -2.353167 -29.912111 2.007099 2.284309 -5.963962 -12.845187 -8.616246 1.596230 34.956253 -0.662806 0.018555 -0.351764 0.891663 0.608407 1.029204 -9.486059 5.699275 -32.877155 1.545682 -1.761310 53.238129 -0.618997 0.143367 -0.037511 0.258957 -0.522302 0.372144 8.280876 -3.290240 13.912273 5.570117 -3.449355 8.008027 5.474157 -2.846458 6.984489 0.930497 9.203594 19.336174 -14.435527 12.795671 -24.173891 -25.812794 -17.991150 -6.952791 -55.176247 -19.268736 -1.442510 -22.778328 -28.591728 1.386261 0.250855 -0.270604 0.914900 12.353775 11.632796 -12.436190 48.206047 19.478132 -2.272755 10.966945 13.694363 -0.035486 -0.363277 0.171000 0.063997 +0.212946 1.600902 0.015005 -2.232178 -28.943707 0.841761 2.092714 -6.125780 -12.356762 -9.351002 1.912997 36.142456 -0.640044 0.001634 -0.345737 0.884866 0.605499 1.014645 -9.142975 6.126957 -34.794361 2.505933 -2.422399 58.017353 -0.620042 0.155452 -0.031153 0.244268 -0.522474 0.369844 8.508903 -3.401925 15.757234 5.904156 -3.489964 7.582520 5.495264 -2.837539 5.880509 0.753470 9.200855 19.965719 -14.059690 12.595991 -23.599268 -26.705629 -17.333450 -6.753673 -53.189896 -16.783232 -2.378613 -17.928053 -24.805099 0.007808 0.264654 -0.270058 0.912420 12.203951 10.515841 -11.840201 45.933983 17.428593 -3.132921 6.885266 10.672898 -0.437023 -0.349242 0.179733 0.075674 +0.217617 1.598152 0.018463 -2.422344 -28.266836 -0.213680 2.384688 -6.169274 -11.725047 -10.250439 2.309789 37.179012 -0.627467 -0.005690 -0.338040 0.880146 0.605068 1.003250 -7.957209 6.755866 -36.335049 3.045662 -2.854320 61.451057 -0.617705 0.162732 -0.022512 0.238445 -0.515040 0.364330 8.803827 -3.590994 17.310053 6.248067 -3.532067 7.518818 5.570156 -2.840569 5.360534 0.445384 9.484275 20.050589 -13.868807 12.523541 -23.320898 -26.635658 -16.416365 -6.703548 -51.207039 -14.749820 -3.010349 -13.735137 -22.040749 -0.846930 0.269768 -0.274837 0.907647 11.624216 9.373830 -11.652646 43.596210 16.136440 -3.422815 3.609488 6.572214 -0.483453 -0.343426 0.186547 0.078617 +0.223200 1.596030 0.021819 -2.126665 -27.469275 -1.782652 1.672478 -6.275284 -10.474031 -10.499490 2.396171 37.662640 -0.616860 -0.006900 -0.331650 0.866167 0.589540 0.986558 -6.976762 7.222673 -37.534420 3.723891 -3.344597 64.431877 -0.612402 0.168087 -0.021989 0.226652 -0.508166 0.360377 8.921383 -3.723997 18.985485 6.473265 -3.605864 7.640119 5.492465 -2.842886 5.004388 0.089600 9.669833 19.598154 -13.567339 12.329703 -23.242409 -25.870852 -15.735442 -6.393273 -48.581055 -12.837318 -3.493513 -10.766448 -20.503654 -1.264581 0.274474 -0.274216 0.906299 10.560067 8.299950 -10.998531 41.179836 14.527845 -3.715440 1.601997 4.220675 -0.388568 -0.334070 0.192388 0.077697 +0.228173 1.594655 0.026274 -1.804563 -26.249460 -3.201733 1.116353 -6.438733 -9.327925 -11.025900 2.542485 38.049370 -0.599428 -0.002646 -0.316438 0.835593 0.562387 0.957062 -5.905601 7.413191 -38.674904 4.282881 -3.907092 66.977798 -0.596452 0.164580 -0.011475 0.207418 -0.485009 0.354803 8.979470 -4.108222 19.868603 6.578048 -3.876720 7.998407 5.497869 -3.045623 5.163596 0.085632 9.592309 18.688194 -13.585629 12.303694 -22.891462 -24.372791 -14.470881 -6.077526 -46.156403 -11.102891 -3.884527 -8.626238 -20.160210 -1.482221 0.262829 -0.275212 0.888902 8.526585 6.826194 -10.426429 39.768200 13.140475 -3.864841 0.097821 2.475348 -0.271209 -0.326864 0.197372 0.072966 +0.233035 1.594418 0.032546 -1.679562 -25.187477 -4.569133 0.649584 -6.550749 -7.753493 -11.571621 2.644225 38.114288 -0.592167 0.009912 -0.298127 0.798294 0.518295 0.923493 -4.838246 7.452619 -39.132042 5.525730 -4.913861 67.985703 -0.577268 0.164719 0.003418 0.182496 -0.458970 0.342713 9.485059 -4.720131 20.373091 6.649680 -4.108967 8.430401 5.298298 -3.126735 5.475948 -0.369367 9.422765 17.998899 -13.810413 12.008615 -22.386843 -22.625044 -13.237387 -5.419275 -44.513908 -9.355874 -4.310347 -5.695478 -20.559711 -1.872646 0.254915 -0.291378 0.884264 5.596475 5.260001 -9.416073 38.917995 11.203755 -4.222831 -1.260209 1.850868 -0.182855 -0.323587 0.211240 0.056097 +0.237539 1.594012 0.040973 -1.369306 -23.922575 -5.858514 -0.190446 -6.753480 -6.070091 -11.693400 2.536991 38.169586 -0.557929 0.006513 -0.270935 0.758018 0.478166 0.888748 -3.834711 7.193406 -38.980324 6.743868 -5.844870 67.739456 -0.553247 0.162813 0.015484 0.154361 -0.436303 0.327568 9.717808 -5.259652 20.589069 6.750438 -4.362711 8.765852 5.287862 -3.257515 5.691108 -0.638797 9.074290 16.874151 -13.886122 11.831811 -21.495819 -20.882048 -11.357428 -4.882822 -43.165756 -7.866342 -4.637118 -3.110697 -21.031797 -2.176273 0.252341 -0.285944 0.856838 2.777769 2.966269 -8.525648 37.869495 9.267689 -4.563337 -2.013566 1.638327 -0.114193 -0.302557 0.207712 0.050126 +0.241558 1.593870 0.049883 -1.137395 -22.644058 -7.118357 -1.082106 -6.991593 -4.388474 -11.620667 2.315094 38.246460 -0.532350 0.017920 -0.240523 0.717990 0.433369 0.850833 -2.455350 6.906177 -38.022877 7.700905 -6.476032 66.191360 -0.531317 0.145299 0.032092 0.125703 -0.401843 0.325653 10.066670 -5.855882 20.784899 6.810965 -4.592896 9.141994 5.112583 -3.339120 5.909271 -0.483722 8.501899 15.326027 -14.102504 11.753889 -20.816017 -19.446186 -8.925656 -4.786551 -40.987446 -6.825021 -4.739176 -1.446009 -21.974779 -2.326929 0.237352 -0.275945 0.833284 0.253488 0.020324 -8.014013 36.687878 7.660507 -4.946275 -3.033747 1.922114 -0.093912 -0.294967 0.197615 0.040467 +0.245325 1.594929 0.059176 -0.992732 -21.498859 -8.308155 -1.786819 -7.143144 -2.590635 -11.733212 2.163009 38.019768 -0.519135 0.048771 -0.215020 0.658370 0.361778 0.801031 -0.939768 6.676599 -36.849350 8.720360 -6.980497 63.667435 -0.492477 0.118114 0.043373 0.093474 -0.357561 0.316849 10.578384 -6.652063 20.656233 6.704151 -4.918283 9.545127 4.670345 -3.512694 6.248835 -0.448315 8.141277 13.875668 -14.265206 11.796906 -19.359398 -18.058964 -6.696718 -4.494890 -38.188206 -5.580476 -4.696716 -0.132041 -22.873039 -2.398786 0.206586 -0.267084 0.803434 -1.599140 -2.580541 -7.574400 34.919418 6.328996 -5.193836 -3.674332 2.580867 -0.105720 -0.292031 0.186116 0.016203 +0.249276 1.595459 0.068902 -0.752424 -21.160147 -8.835504 -2.347541 -7.187489 -1.492656 -12.235509 2.264957 37.955757 -0.503667 0.091914 -0.188338 0.594650 0.287194 0.732210 0.554019 6.769032 -36.269821 9.701848 -7.221381 60.671131 -0.444765 0.072507 0.053694 0.061815 -0.293378 0.316138 11.295139 -7.161820 19.812965 6.449951 -4.914819 9.812726 4.141172 -3.409309 6.670527 -0.860671 8.030176 12.236598 -13.923474 11.581095 -17.174906 -16.058844 -4.218153 -4.399998 -36.286671 -4.918536 -4.433996 1.328168 -22.950310 -2.469236 0.162052 -0.240848 0.756723 -2.953982 -5.473418 -7.301291 32.532204 5.066698 -5.341957 -4.687658 3.692283 -0.162840 -0.294537 0.161614 -0.002857 +0.253603 1.595984 0.078533 -0.353159 -20.863052 -9.418110 -3.112488 -7.195996 -0.515826 -13.038367 2.441380 37.689999 -0.484368 0.137768 -0.162546 0.551024 0.227875 0.671411 1.954434 6.754713 -35.222424 10.491559 -7.133895 56.510468 -0.412410 0.024120 0.058850 0.034093 -0.231056 0.333744 12.196878 -7.741111 18.814215 5.980557 -4.902232 10.083558 3.217443 -3.337538 7.153722 -1.428625 8.099026 10.856631 -13.217525 11.193367 -15.086435 -13.838768 -1.959012 -4.134923 -34.329456 -4.112505 -4.201969 3.111566 -23.294819 -2.650537 0.122979 -0.197190 0.715563 -4.444632 -7.952677 -6.987654 30.151312 4.023106 -5.303527 -5.204040 4.299339 -0.168203 -0.299081 0.128436 -0.007568 +0.257439 1.597667 0.087953 0.199103 -20.652004 -10.102246 -3.920231 -7.163254 0.413223 -13.601293 2.549612 37.388134 -0.479359 0.173017 -0.138925 0.506357 0.178985 0.635593 3.299662 6.747756 -33.865356 10.635223 -6.604719 52.185276 -0.377644 -0.004087 0.068466 0.020086 -0.180425 0.324222 12.686689 -8.104976 17.675224 5.507959 -4.951399 10.508345 2.472768 -3.361330 7.983298 -1.240639 8.130158 10.004673 -13.038573 11.434473 -13.516266 -12.176252 -0.193220 -4.035262 -31.750566 -3.487419 -3.874991 4.649142 -23.136652 -2.723243 0.083046 -0.198047 0.680857 -5.660131 -9.944618 -6.737962 27.548159 3.247669 -5.119371 -5.767383 4.830956 -0.187820 -0.303476 0.116337 -0.032524 +0.261253 1.602394 0.096647 0.776359 -20.831135 -11.147813 -4.575734 -6.881484 1.836203 -14.331759 2.726639 36.564987 -0.466982 0.169822 -0.129164 0.507544 0.193566 0.644823 4.656156 6.844425 -31.854317 10.507524 -5.794252 47.216835 -0.376880 -0.006475 0.070464 0.026580 -0.176622 0.324213 12.725271 -8.135523 16.651106 5.237010 -4.970528 11.373977 2.077701 -3.349981 9.513337 -1.168206 7.798651 9.570769 -13.808531 11.459855 -13.832242 -11.750551 0.569963 -4.130961 -28.771826 -3.039447 -3.619078 6.532375 -22.596296 -2.856187 0.070913 -0.202767 0.657517 -5.820331 -10.849893 -6.253922 23.705336 2.202748 -4.659867 -6.019753 5.628711 -0.206974 -0.299128 0.111720 -0.025288 +0.265102 1.605783 0.106312 1.509543 -20.546747 -11.941781 -5.426848 -6.834595 2.596623 -15.080201 2.882154 36.342155 -0.439381 0.155297 -0.110472 0.509255 0.223222 0.627560 5.388550 6.478948 -30.098579 10.345504 -5.109653 42.165100 -0.369353 -0.014280 0.083978 0.039218 -0.152108 0.316187 13.148519 -8.472137 15.162544 4.605397 -5.061192 11.928950 1.169580 -3.510801 10.782343 -1.216235 7.744538 9.140695 -13.484951 11.285516 -13.437781 -10.701100 1.506507 -3.970622 -25.873207 -2.326818 -3.344156 8.325457 -22.733202 -3.012520 0.062421 -0.194426 0.615338 -5.866334 -11.664648 -5.973337 20.448063 1.453238 -4.190457 -6.813042 6.217705 -0.259349 -0.294202 0.098407 -0.013473 +0.267712 1.607775 0.115012 2.507116 -20.461100 -12.670695 -6.273822 -6.805063 2.954646 -15.928895 3.128758 36.399998 -0.441079 0.147544 -0.116088 0.541775 0.265972 0.640284 6.203708 6.307174 -28.441244 9.863848 -4.286054 37.236328 -0.377128 -0.039560 0.084529 0.066705 -0.161141 0.329236 13.001389 -8.391287 13.406409 3.984993 -5.040024 12.439559 0.595321 -3.548923 12.278625 -1.044972 7.466175 9.051798 -13.864154 11.280949 -13.441063 -9.812380 2.114730 -3.989099 -22.634626 -2.013847 -2.904276 9.932492 -21.954315 -3.042250 0.063089 -0.161804 0.598456 -5.675417 -12.203488 -5.743667 17.233034 0.692959 -3.680873 -7.530044 6.283172 -0.283310 -0.306511 0.061624 0.001928 +0.269723 1.608621 0.123833 3.415229 -20.432686 -13.422240 -6.531923 -6.755730 3.241849 -17.213652 3.600445 36.568054 -0.435094 0.140483 -0.127908 0.578140 0.304986 0.676491 7.103052 6.117584 -26.149174 9.459355 -3.466158 31.442125 -0.394230 -0.055242 0.070113 0.084411 -0.186495 0.356628 12.805659 -8.272581 11.670363 3.390185 -5.033550 12.947404 0.031338 -3.579120 13.775165 -0.679220 7.280112 9.481005 -14.451628 11.549043 -13.697821 -8.897223 2.924107 -3.860555 -19.323626 -1.382806 -2.470083 10.623823 -22.644186 -3.106488 0.062249 -0.127346 0.587278 -5.800202 -12.774473 -5.730629 14.982851 0.286638 -3.362186 -8.968638 6.913739 -0.391247 -0.306559 0.030014 0.030572 +0.271582 1.608173 0.132732 4.178040 -20.401508 -13.989384 -6.728358 -6.666316 3.472641 -18.435589 4.057239 36.627659 -0.448988 0.137338 -0.134323 0.594408 0.332478 0.676378 8.150285 5.966251 -24.118416 8.591938 -2.674802 26.335051 -0.393951 -0.066596 0.071292 0.109303 -0.185483 0.349733 13.017832 -8.322638 10.027901 2.739346 -5.033140 13.218043 -0.787431 -3.596462 14.859611 -0.958070 7.543903 9.780329 -14.447697 11.533258 -13.625312 -7.711068 3.614034 -3.627153 -16.468252 -0.666111 -1.985993 10.841960 -22.122223 -2.931691 0.062805 -0.121886 0.579755 -5.805629 -13.148984 -5.854373 12.717903 0.189523 -3.025524 -10.356219 6.965841 -0.462074 -0.319137 0.016402 0.027700 +0.273219 1.608014 0.142551 4.946043 -20.508833 -14.940403 -6.958041 -6.559960 4.086045 -19.648905 4.556996 36.886921 -0.450139 0.123199 -0.135574 0.624946 0.364964 0.705129 9.229939 5.678442 -21.447493 7.385245 -1.915828 21.160921 -0.405331 -0.058375 0.070062 0.129015 -0.203491 0.345481 12.976206 -8.243620 8.728724 2.239534 -5.024657 13.625073 -1.424046 -3.578228 15.948986 -0.981530 7.313973 10.527342 -14.422009 11.311280 -13.748481 -6.871079 3.704405 -3.267263 -13.163970 0.135595 -1.440503 10.389285 -20.049818 -2.452715 0.082419 -0.124207 0.584684 -6.183993 -13.081244 -5.309736 10.162413 -0.671082 -2.564939 -10.699128 7.353082 -0.487681 -0.316043 0.008306 0.032860 +0.274287 1.605311 0.152947 5.703775 -20.256701 -15.519925 -7.196785 -6.545850 4.257950 -20.927525 5.093308 37.295616 -0.500497 0.140539 -0.153777 0.629641 0.370836 0.719907 10.193837 5.346374 -19.318495 5.769405 -1.305561 16.639442 -0.409684 -0.056625 0.063502 0.150821 -0.207580 0.335314 12.797185 -7.907486 6.964044 1.761632 -4.947074 13.856715 -1.827735 -3.432480 17.138826 -0.531857 6.803260 11.213492 -14.633528 11.101587 -14.468023 -6.005608 3.623890 -3.380766 -9.705785 -0.122615 -0.731042 8.637973 -16.405525 -1.742671 0.071445 -0.164527 0.611322 -6.471622 -13.350546 -4.653766 7.661216 -2.127180 -2.048133 -10.403763 7.991581 -0.476066 -0.341601 0.028269 0.006326 +0.274939 1.599870 0.162251 6.505923 -19.816099 -15.792547 -7.225764 -6.594086 4.017480 -22.743587 5.930781 38.025814 -0.524168 0.152893 -0.170459 0.622984 0.364369 0.725636 10.931604 5.140923 -18.166302 4.152296 -0.897252 13.644516 -0.412881 -0.051382 0.050218 0.154105 -0.213325 0.335602 12.312098 -7.396590 5.260131 1.402020 -4.795534 13.713645 -1.886873 -3.237499 17.828917 -0.183519 6.420335 12.238024 -14.572721 10.980402 -14.632392 -4.635122 3.152243 -3.321966 -7.274454 -0.893738 -0.275724 7.121032 -12.048379 -1.200795 0.059367 -0.186750 0.625442 -7.011807 -13.445061 -3.798611 5.645732 -3.947573 -1.640895 -10.607961 8.770006 -0.469666 -0.349905 0.047000 -0.002222 +0.275323 1.593639 0.172135 7.416900 -19.494242 -15.515124 -7.424826 -6.558841 3.373274 -24.341486 6.689623 38.389465 -0.518145 0.139356 -0.193565 0.633673 0.382409 0.753107 11.013094 4.972200 -17.876244 3.351829 -0.731983 11.951494 -0.425001 -0.057061 0.041721 0.149341 -0.245427 0.360881 11.158368 -6.683503 2.925661 1.058700 -4.698024 13.332677 -1.426903 -3.248408 18.659351 1.121216 5.317670 13.745837 -15.512632 11.424509 -14.613899 -3.754623 2.911975 -2.823275 -4.038575 -0.525182 0.325413 4.316759 -9.738640 -0.771512 0.044617 -0.172640 0.617361 -7.524969 -13.032667 -3.001089 3.638146 -5.289234 -1.164997 -10.563555 8.773877 -0.409337 -0.351947 0.042364 0.028888 +0.276952 1.586275 0.181558 7.794327 -19.313000 -15.174962 -7.297858 -6.537753 2.950397 -25.697102 7.403965 38.881237 -0.492120 0.129246 -0.203287 0.633125 0.386721 0.770137 11.229336 5.004048 -17.991112 2.874230 -0.663293 11.619857 -0.424290 -0.073812 0.033037 0.137936 -0.267916 0.386499 11.414920 -6.510054 1.247990 0.610726 -4.569388 12.911345 -1.834156 -3.198718 18.979137 1.936558 4.535670 14.316800 -16.555805 11.890673 -14.008277 -3.470664 2.829899 -2.519805 -0.606102 -0.176974 0.854123 2.670272 -8.343901 -0.529685 0.027446 -0.140962 0.587086 -8.204558 -12.842981 -2.446150 1.981864 -6.081917 -0.724465 -10.856956 9.108917 -0.407645 -0.340807 0.019659 0.062113 +0.279106 1.578729 0.187963 7.579402 -19.323778 -15.490830 -6.361194 -6.463493 3.213246 -27.150126 8.325544 39.662460 -0.443766 0.083952 -0.203008 0.640009 0.397184 0.786582 11.456369 5.230164 -18.043110 3.342711 -0.729393 12.733683 -0.435465 -0.061484 0.028717 0.117925 -0.311334 0.396568 12.139112 -6.629135 1.241002 0.523028 -4.460130 12.709960 -2.277727 -3.122156 18.574244 2.059748 4.103112 14.764845 -17.487783 12.194468 -13.765767 -2.983247 2.301095 -1.975176 1.602722 0.192268 1.049478 1.480643 -6.219151 -0.375063 0.059949 -0.111983 0.576696 -10.012108 -12.408910 -1.667515 1.691757 -6.802887 -0.690436 -11.437198 9.514336 -0.399485 -0.303349 0.006077 0.098906 +0.282560 1.572436 0.192023 6.619047 -19.515514 -16.170013 -5.049762 -6.438457 3.994563 -27.722490 8.970179 40.695061 -0.414075 0.060881 -0.196965 0.645113 0.382013 0.812867 12.207331 5.730344 -17.998344 3.794617 -0.809540 14.557367 -0.448982 -0.036615 0.027127 0.086324 -0.347967 0.407241 13.207967 -6.881624 2.611502 1.062378 -4.369789 12.824994 -2.233368 -2.979116 17.863140 1.805662 3.666406 14.254072 -18.466263 12.003782 -14.364811 -3.470206 1.145984 -1.504568 3.472540 0.628361 1.088927 1.137852 -3.970195 -0.355941 0.093388 -0.105908 0.595226 -11.256709 -11.627702 -0.682971 0.497248 -8.147976 -0.546913 -12.174492 9.683573 -0.324828 -0.273249 0.012949 0.120209 +0.284695 1.567122 0.194768 5.936457 -19.291494 -16.510584 -4.314813 -6.596530 4.166833 -27.716173 9.325768 41.968533 -0.394559 0.036430 -0.196829 0.638981 0.376217 0.808760 12.360656 6.107997 -18.496819 4.488555 -0.965436 16.414574 -0.452255 -0.026597 0.027710 0.070869 -0.368298 0.406355 13.689814 -7.071288 3.664774 1.392390 -4.324204 12.869937 -2.131558 -2.953768 17.327047 1.898479 3.659154 13.519573 -18.857964 12.177397 -14.835176 -3.913601 0.263147 -0.987425 5.348692 1.344064 1.236656 0.650495 -2.797549 -0.337061 0.115479 -0.094630 0.600837 -11.445036 -10.924508 -0.109233 -0.463606 -9.095818 -0.408058 -12.674798 9.739704 -0.280264 -0.255049 0.013882 0.129564 +0.285077 1.563287 0.196082 5.877979 -19.275055 -16.642439 -4.231072 -6.563033 3.977530 -27.651634 9.639736 42.940331 -0.356939 0.009156 -0.193326 0.623640 0.366510 0.792632 11.944232 6.402825 -19.390488 5.223431 -1.148553 18.239754 -0.453429 -0.008864 0.037452 0.041037 -0.377324 0.410700 13.449501 -6.987158 4.385611 1.450511 -4.202438 12.782251 -2.048116 -2.894012 16.811174 2.206767 3.451781 13.570646 -18.901318 12.359043 -14.885515 -4.097636 -0.487771 -0.104574 6.466041 2.751614 1.433196 0.520889 -2.941653 -0.287135 0.128721 -0.085205 0.596147 -11.562263 -9.780145 0.505087 -0.402581 -9.572149 -0.456800 -12.212416 9.738600 -0.208238 -0.232805 0.028218 0.151654 +0.284952 1.560614 0.195924 5.501058 -19.350945 -16.332731 -3.837939 -6.523833 3.333602 -27.364178 9.856051 43.908699 -0.339580 -0.002777 -0.172045 0.606557 0.354069 0.763989 11.635836 6.679457 -20.195469 6.269488 -1.349541 19.030222 -0.451436 0.013829 0.061649 0.020584 -0.352534 0.395421 13.789616 -6.851826 5.068429 1.554950 -3.860307 12.644027 -2.129804 -2.590947 16.209314 1.986827 3.537918 13.261209 -18.228060 12.075634 -15.078617 -3.935500 -1.102296 0.624516 6.667927 3.518052 1.607352 0.009885 -3.920501 -0.230239 0.140701 -0.109313 0.604410 -11.419358 -8.933211 1.035986 -0.023178 -10.230865 -0.564252 -11.882740 10.352825 -0.206273 -0.225986 0.058319 0.145742 +0.285161 1.560395 0.194657 5.674904 -19.822447 -16.197651 -4.145495 -6.207398 2.875183 -27.154366 9.923443 44.033684 -0.346207 -0.009245 -0.169459 0.605458 0.361128 0.730350 11.433462 6.782385 -20.254290 6.450199 -1.295807 18.598076 -0.457899 0.031789 0.079264 0.020780 -0.336233 0.386858 13.316810 -6.445817 5.878270 1.711433 -3.542288 12.712184 -1.883802 -2.277228 15.895347 1.282376 3.780632 12.934625 -17.386822 11.335402 -16.010757 -3.421887 -1.236075 1.136385 5.349965 4.078175 1.609992 -0.275495 -5.253672 -0.200125 0.157189 -0.128348 0.626756 -11.274018 -8.355663 1.170930 0.794309 -9.959766 -0.767251 -11.134212 10.553237 -0.177398 -0.235596 0.088233 0.139320 +0.284191 1.562047 0.192517 5.892371 -19.963974 -15.925244 -4.408271 -5.949177 2.377213 -27.043991 9.973926 43.967609 -0.374413 0.006644 -0.166641 0.606943 0.355931 0.732649 11.376003 6.714146 -19.852692 6.347617 -1.127597 17.053879 -0.450238 0.036726 0.080054 0.035612 -0.323032 0.366030 12.463628 -5.909529 6.296504 1.896662 -3.284564 12.838424 -1.374429 -2.048463 15.925504 0.894400 4.254560 12.223474 -16.760063 11.133621 -16.480106 -3.083818 -0.701103 1.128502 3.556656 3.962779 1.557954 -0.022438 -7.912034 -0.173670 0.155078 -0.149009 0.639582 -10.680950 -8.496921 0.640541 1.857337 -8.790471 -0.998634 -11.055090 10.886378 -0.275493 -0.249577 0.095522 0.111265 +0.283131 1.565357 0.188444 6.165240 -20.005770 -15.635146 -4.529255 -5.598358 1.993390 -27.011898 9.929109 43.251141 -0.386259 0.027305 -0.175337 0.592773 0.337767 0.726744 11.544346 6.617626 -19.253981 5.727003 -0.878350 15.151564 -0.439691 0.025442 0.068230 0.032976 -0.316646 0.370999 10.791121 -5.186068 6.735569 2.329285 -3.194785 13.007287 -0.173148 -1.983963 16.022852 0.677495 4.371609 11.771368 -16.974062 11.088167 -16.466160 -2.745077 0.247081 1.107432 0.963121 4.017067 1.385157 -0.171500 -12.009102 -0.173802 0.132109 -0.144011 0.630670 -10.462401 -8.816373 0.005802 3.416561 -7.173996 -1.271380 -11.018720 12.153153 -0.479636 -0.255963 0.094012 0.107897 +0.283341 1.568121 0.185266 6.289305 -19.746407 -14.884016 -4.902536 -5.495458 1.099663 -26.763027 9.758233 42.975407 -0.415889 0.059626 -0.185210 0.583701 0.324088 0.717177 11.583754 6.413103 -19.225742 5.001235 -0.703977 13.211629 -0.418526 -0.003871 0.055076 0.049219 -0.298876 0.367174 10.197975 -5.057222 6.696467 2.248960 -3.233037 12.986701 0.029809 -2.038419 16.098520 0.279523 4.780741 10.948934 -16.759459 11.051241 -15.972192 -2.211918 2.186041 0.787180 -2.457603 4.425470 0.989875 0.640502 -19.069113 -0.399566 0.102359 -0.130607 0.614572 -10.418701 -9.652276 -1.245412 5.683992 -4.246824 -1.551325 -10.165564 12.994842 -0.655952 -0.275387 0.073272 0.089560 +0.282819 1.571449 0.181685 6.217362 -19.357489 -14.474430 -4.849624 -5.331503 0.930427 -26.812569 9.613960 42.313641 -0.403308 0.078879 -0.146240 0.557345 0.301291 0.677366 12.044024 6.111474 -18.542292 3.879405 -0.524048 11.047929 -0.394174 -0.001332 0.083649 0.044970 -0.240997 0.340116 9.875425 -5.108322 7.570101 2.444498 -3.287029 12.839657 0.196800 -2.030328 15.280421 -0.938392 5.296642 10.237026 -16.154505 10.578448 -14.960071 -1.530023 3.556155 0.491242 -7.524105 4.169093 0.007737 1.661104 -24.897514 -0.924328 0.090254 -0.158742 0.591527 -10.930408 -10.264109 -2.102443 8.866497 -2.155239 -2.066560 -9.462255 14.177317 -0.841838 -0.276961 0.084889 0.064382 +0.281453 1.574790 0.178881 6.438879 -18.983433 -13.634878 -4.996562 -5.069914 0.448505 -26.976662 9.485672 41.312210 -0.422910 0.093854 -0.131487 0.555352 0.289601 0.655290 12.217135 5.817385 -18.419966 2.987233 -0.421200 9.006659 -0.382674 0.009685 0.098585 0.053556 -0.210113 0.311102 9.557613 -4.999937 7.469336 2.257371 -3.230847 12.454625 0.070070 -1.940069 14.706028 -2.111923 5.587919 10.418703 -14.805476 9.686121 -14.442270 -0.763843 4.530457 0.527368 -12.203588 4.299384 -0.972285 1.466293 -30.320681 -1.396747 0.101831 -0.185206 0.606704 -10.523526 -10.248473 -2.707335 11.884771 -0.730212 -2.555654 -8.184539 15.410304 -0.957671 -0.289411 0.099144 0.033561 +0.279876 1.577574 0.175972 6.590900 -18.473894 -13.192081 -4.916700 -4.718124 0.624047 -27.230591 9.335514 40.014912 -0.463780 0.120630 -0.126881 0.559995 0.275832 0.629370 12.542315 5.505054 -17.914700 1.989046 -0.353302 7.205283 -0.378806 0.028358 0.094119 0.070591 -0.179430 0.281900 9.933933 -5.209037 7.816594 1.871777 -3.203335 12.190755 -0.783658 -1.798967 14.023971 -4.328123 6.556165 10.329533 -12.491396 8.176528 -14.687619 0.190274 5.511032 0.480901 -17.630054 4.033924 -2.144210 1.617397 -34.709877 -2.087683 0.127531 -0.214165 0.647752 -9.684559 -10.317213 -3.567543 15.014855 0.938921 -3.019521 -6.052627 15.941678 -0.893611 -0.301818 0.122427 -0.007204 +0.279293 1.579559 0.172873 6.486798 -17.915457 -12.626208 -4.511978 -4.278030 0.804780 -28.024992 9.420947 38.596401 -0.489453 0.129820 -0.129154 0.568080 0.276546 0.608589 12.735289 5.294944 -17.750332 1.437603 -0.335111 5.804255 -0.367318 0.039235 0.085673 0.091633 -0.162829 0.251417 11.098965 -5.663876 8.365790 1.353060 -3.084488 11.893389 -2.159447 -1.653312 13.226781 -6.287505 7.422965 9.465563 -10.485162 6.895879 -15.016730 0.474856 6.809224 0.156094 -21.475296 3.574103 -2.908965 -1.135661 -38.719398 -1.769933 0.151326 -0.214316 0.661112 -8.335995 -10.673432 -4.835954 18.136326 2.821139 -3.338707 -3.690794 15.674169 -0.742449 -0.306081 0.125532 -0.031618 +0.278208 1.580633 0.169153 6.496053 -16.799917 -11.761994 -4.164052 -3.978837 0.356744 -28.888428 9.588257 37.660709 -0.507119 0.134476 -0.129004 0.585881 0.290950 0.600550 12.797791 5.124864 -18.132662 0.542473 -0.328995 4.499585 -0.364432 0.034018 0.084952 0.113231 -0.155069 0.239447 11.851890 -5.916537 8.227574 0.933982 -2.980747 11.454706 -3.032334 -1.553424 12.648370 -7.550700 7.497711 8.998584 -9.774533 5.935246 -15.131180 -0.501927 8.176579 -0.420931 -24.914446 3.240446 -3.683295 -4.279117 -43.584110 -1.103521 0.167474 -0.206179 0.665795 -6.558388 -10.994789 -6.181376 21.090391 4.318823 -3.659433 -1.781320 14.683353 -0.619247 -0.315897 0.113235 -0.041881 +0.276511 1.579899 0.165201 6.606724 -15.515498 -10.761499 -3.912666 -3.663511 -0.209434 -29.450039 9.703647 36.938599 -0.506894 0.146098 -0.118172 0.594446 0.297968 0.570985 12.580979 5.085282 -19.097672 -0.048135 -0.347027 3.694326 -0.359252 0.020107 0.094678 0.123812 -0.125763 0.240416 12.546407 -6.086960 7.963864 0.383093 -2.807762 10.893657 -4.044005 -1.429007 11.900754 -8.525380 7.479922 8.555558 -8.612842 4.936915 -14.725146 -1.606824 9.750141 -0.882209 -28.435911 3.098134 -4.524391 -8.374520 -49.044765 0.252092 0.171887 -0.186432 0.657627 -4.515014 -11.329265 -7.604988 24.580059 5.540813 -4.107621 -0.214454 13.408257 -0.554438 -0.327152 0.098074 -0.043467 +0.275091 1.579299 0.160618 6.846951 -13.412206 -9.996031 -4.205574 -3.688550 -0.661251 -29.383148 9.554474 36.704128 -0.507193 0.167680 -0.100546 0.564406 0.262201 0.536705 11.579796 4.791521 -20.036314 -0.129270 -0.401878 2.908229 -0.329231 0.016390 0.100761 0.116940 -0.087856 0.215536 12.808699 -6.272559 7.860372 0.026687 -2.846469 10.349310 -4.609389 -1.489342 11.069439 -9.777775 7.490836 8.138124 -7.942896 4.006900 -13.645101 -3.247888 10.604901 -1.366510 -31.971022 2.656558 -5.334971 -14.056494 -52.754684 2.650846 0.162624 -0.198499 0.638849 -2.040987 -11.456670 -8.653467 27.142281 6.240992 -4.321498 2.422256 12.260751 -0.365779 -0.323963 0.101538 -0.066962 +0.273588 1.577826 0.154961 6.788787 -11.134368 -9.614805 -4.261551 -3.814380 -0.808450 -29.310335 9.510910 36.974522 -0.521859 0.191249 -0.089561 0.559006 0.239795 0.532668 10.937528 4.572268 -20.635897 -0.337695 -0.445414 2.217181 -0.320929 0.033838 0.105267 0.112757 -0.065382 0.201044 12.753426 -6.405128 8.169694 0.008934 -2.971954 10.075360 -4.622120 -1.569485 10.458385 -11.021444 7.419281 7.895995 -7.173454 2.898945 -13.991714 -5.389252 10.770049 -1.971978 -35.751251 2.154402 -6.323444 -20.101421 -55.027874 5.328976 0.164766 -0.227667 0.653576 0.690645 -10.992711 -9.553598 29.057413 6.800388 -4.482231 4.684982 10.646732 -0.206501 -0.327411 0.125222 -0.086834 +0.272566 1.575711 0.149385 6.907387 -8.808911 -9.017999 -4.747157 -3.956686 -1.112989 -28.830578 9.288108 37.203205 -0.538541 0.209651 -0.081172 0.552664 0.231140 0.507164 9.714401 4.300671 -21.690802 -0.050915 -0.481154 1.758110 -0.307726 0.027059 0.108730 0.124085 -0.035511 0.183618 12.783366 -6.612916 7.836720 -0.255752 -3.141009 9.813004 -4.893421 -1.766727 10.150003 -11.858894 7.526943 7.324223 -6.254012 2.068009 -13.801638 -8.428396 10.003999 -2.483597 -38.703457 2.293346 -7.564543 -24.192644 -55.855354 6.923777 0.164581 -0.233411 0.651674 4.469385 -9.501974 -10.452719 30.442530 7.312328 -4.552038 6.268474 8.732052 -0.183151 -0.337578 0.123945 -0.109508 +0.271278 1.573161 0.142743 6.775599 -6.507912 -8.862823 -5.171206 -4.089110 -0.955636 -27.720991 8.876371 37.626236 -0.534073 0.188696 -0.087676 0.576613 0.266977 0.499557 8.937410 4.127944 -22.383862 -0.121529 -0.483163 1.646141 -0.317544 0.032691 0.104554 0.141972 -0.041325 0.181035 13.116732 -6.870962 8.310552 -0.555759 -3.112181 9.578821 -5.486259 -1.838255 9.563967 -12.046547 7.589824 7.081832 -4.907162 1.466473 -14.496325 -11.639562 8.751147 -3.462270 -40.203728 1.616122 -8.190225 -28.786757 -54.461182 8.540463 0.188206 -0.211507 0.652425 7.835373 -8.014629 -11.214699 32.668186 7.632522 -4.768003 7.094429 6.933567 -0.238031 -0.336093 0.115624 -0.096245 +0.268115 1.570560 0.135892 6.633000 -3.379308 -8.963644 -5.359104 -4.458471 -0.615360 -26.219837 8.311506 38.355980 -0.506872 0.168480 -0.082647 0.590854 0.280681 0.504045 7.685139 3.786134 -22.846666 0.119188 -0.486873 1.514526 -0.322953 0.044360 0.106106 0.138804 -0.051946 0.183437 12.830571 -6.839167 9.189353 -0.610072 -2.988507 9.075729 -5.569285 -1.865801 8.469414 -11.673670 6.729028 7.838302 -3.860596 0.691865 -14.111486 -15.080119 6.766972 -4.574650 -40.491974 0.356427 -8.174877 -32.617580 -51.536537 9.515482 0.209653 -0.193560 0.646073 11.314700 -6.320184 -11.282820 35.187767 6.961077 -5.255075 6.964103 5.145133 -0.332704 -0.320729 0.107729 -0.076074 +0.265066 1.567788 0.128846 6.195649 0.476792 -9.144032 -5.695021 -5.174690 -0.457100 -23.786228 7.350578 39.803192 -0.489150 0.136968 -0.103485 0.598728 0.284289 0.520162 6.428799 3.452326 -23.384386 -0.012477 -0.509746 1.821608 -0.340038 0.060420 0.093679 0.120103 -0.100616 0.200337 12.191336 -6.764834 10.340174 -0.289334 -3.037114 8.305818 -4.977554 -1.994376 6.976995 -10.789354 5.058816 9.340853 -3.860896 0.062813 -14.103300 -18.551046 4.631237 -5.555517 -41.698776 -1.277525 -8.032069 -33.229149 -48.064198 8.790215 0.235023 -0.176267 0.662087 13.340326 -4.712874 -10.690874 38.376675 6.124826 -5.813799 6.899889 3.997362 -0.349236 -0.303472 0.111973 -0.044822 +0.261129 1.565032 0.121690 5.889039 4.027993 -9.381686 -6.177385 -5.733287 -0.360138 -21.145191 6.346475 41.281322 -0.480794 0.095810 -0.136325 0.635769 0.326584 0.544057 4.886581 3.243263 -24.132982 0.126773 -0.492946 3.124017 -0.375925 0.076931 0.074487 0.122696 -0.157869 0.226612 11.215116 -6.394166 11.346626 0.031668 -2.962643 7.721260 -4.228791 -2.005972 5.892842 -9.931376 3.643891 10.932244 -3.249624 -0.614939 -15.026593 -21.152819 3.001294 -6.619433 -43.263359 -3.333680 -7.552732 -34.165466 -44.198189 8.164322 0.272759 -0.146938 0.689683 15.491241 -3.360891 -10.549704 41.642200 5.898207 -6.354410 6.035789 3.544833 -0.377619 -0.293818 0.111690 -0.003321 +0.256824 1.563407 0.114181 5.790192 7.748963 -9.290643 -6.843565 -6.347860 -0.874907 -18.338005 5.277672 42.960579 -0.489328 0.076215 -0.158331 0.639729 0.330039 0.571174 2.649520 2.890831 -25.126398 0.867230 -0.512140 4.613028 -0.392325 0.101840 0.069029 0.113425 -0.197171 0.230841 9.274328 -5.609239 11.931591 0.496533 -2.974296 7.063812 -2.776736 -2.062853 4.870038 -8.351538 1.289216 12.945567 -3.259971 -1.269555 -15.253655 -23.412178 1.997335 -7.498384 -45.566925 -5.403112 -6.880269 -35.154152 -40.903614 7.734395 0.283502 -0.174639 0.719710 16.905842 -1.801016 -10.186190 44.908562 6.075357 -6.669163 5.625559 3.377562 -0.373105 -0.292405 0.140568 0.005154 +0.252674 1.563301 0.104139 5.444503 11.091393 -9.337664 -7.292743 -6.890935 -1.679170 -15.633410 4.239280 44.620853 -0.524525 0.069692 -0.180778 0.666439 0.346769 0.626465 0.377726 2.727043 -26.340738 2.068004 -0.556169 6.900183 -0.418630 0.133603 0.057653 0.124755 -0.241335 0.229123 7.783958 -4.982745 12.536944 1.037389 -3.030974 6.807705 -1.400781 -2.109975 4.427903 -7.269387 -0.934046 14.430367 -3.465406 -2.017185 -16.500044 -25.518169 0.690638 -8.085207 -47.981094 -7.350722 -6.314770 -36.430801 -39.605522 7.813423 0.300733 -0.217047 0.768918 18.112000 0.683629 -9.987900 47.187668 7.177171 -6.534894 5.841741 3.755847 -0.366709 -0.301735 0.171345 -0.001595 +0.247573 1.564624 0.093981 5.140917 14.700566 -9.257553 -7.617283 -7.396221 -2.665056 -12.831518 3.093703 45.989662 -0.561137 0.056750 -0.205102 0.685723 0.363207 0.669600 -2.078820 2.491378 -27.523489 3.325748 -0.667084 9.491775 -0.435423 0.166990 0.052831 0.137159 -0.282085 0.215167 6.187521 -4.564235 12.958233 1.452019 -3.341072 6.580101 -0.106627 -2.414554 4.067213 -6.466203 -3.041080 15.888473 -3.680738 -2.808351 -17.588573 -27.122450 -0.889863 -7.959660 -50.138367 -8.858303 -5.839655 -38.189217 -39.620178 8.375214 0.317559 -0.266440 0.812265 19.045721 4.053458 -9.486546 49.144295 8.513583 -6.285137 6.160067 5.144678 -0.403840 -0.312525 0.207287 -0.012288 +0.242528 1.565489 0.085117 4.674037 17.894131 -9.122764 -7.568373 -7.568077 -3.641251 -10.455710 2.214752 46.878716 -0.568833 0.022832 -0.221989 0.727509 0.419270 0.704310 -4.612614 2.401094 -28.861809 5.347660 -0.924410 12.816666 -0.461351 0.185382 0.046128 0.164893 -0.319433 0.213177 5.360588 -4.290269 12.378952 1.442705 -3.491658 6.765563 0.463507 -2.665859 4.571858 -5.536810 -4.904373 16.657133 -3.049927 -3.569868 -18.673468 -27.262775 -2.064705 -7.615417 -52.433380 -10.924396 -5.001574 -41.596893 -41.422283 10.258605 0.345629 -0.269561 0.830347 18.869480 7.188067 -9.061037 51.782959 10.265279 -6.012962 6.841997 8.344935 -0.568907 -0.315193 0.208405 0.002023 +0.237501 1.568948 0.076573 4.352764 20.701208 -9.514061 -7.624806 -7.507493 -3.916563 -8.307099 1.435458 47.252907 -0.589037 -0.003764 -0.241422 0.780072 0.490548 0.729637 -7.280618 2.358363 -29.561993 7.891869 -1.388176 16.730862 -0.491534 0.211425 0.040546 0.206172 -0.341295 0.207593 4.675524 -3.995425 12.212840 1.493172 -3.606462 7.209406 0.835801 -2.859912 5.356023 -5.429156 -6.063474 17.707420 -1.559872 -4.580997 -20.432966 -27.186787 -4.661180 -7.050848 -54.059475 -13.224689 -4.012879 -44.873283 -43.280090 12.223423 0.376182 -0.283724 0.857334 19.185154 11.218606 -8.611263 52.720711 12.296453 -5.495497 7.627233 11.524870 -0.680140 -0.326706 0.222715 0.012090 +0.230763 1.573960 0.067367 3.902190 23.131449 -9.817772 -7.091005 -7.263295 -4.586116 -6.470473 0.922654 47.406464 -0.599875 -0.023277 -0.252923 0.834138 0.569557 0.739246 -9.796522 2.663103 -30.255285 11.229040 -2.094781 20.610754 -0.515379 0.210846 0.036121 0.254810 -0.345627 0.209716 4.079899 -3.611621 11.961162 1.617828 -3.604820 7.787615 1.232804 -2.995565 6.384168 -5.370366 -7.014481 18.022215 -0.329715 -5.486229 -21.524443 -26.786692 -7.744493 -6.469048 -54.614410 -15.926503 -2.720302 -48.847843 -46.338074 15.293496 0.394347 -0.268519 0.855962 19.520689 15.817826 -8.554372 52.306324 15.267834 -4.242362 8.479193 13.175737 -0.634887 -0.342827 0.207970 0.029750 +0.223425 1.581554 0.057388 3.340364 24.986353 -10.399273 -6.553118 -6.700752 -4.828434 -4.284128 0.304712 46.842049 -0.611254 -0.041784 -0.260557 0.896812 0.650461 0.749104 -11.787798 3.423436 -30.931515 14.524968 -3.007082 24.950720 -0.535138 0.217434 0.034414 0.308262 -0.345590 0.203098 4.307357 -3.246231 11.763131 1.693547 -3.355433 8.567758 1.115697 -2.875676 7.686456 -6.087947 -7.601295 18.446281 1.503665 -6.731266 -22.879425 -25.852041 -11.266815 -5.984095 -54.646667 -19.303923 -1.083377 -51.974373 -50.511169 18.938475 0.426271 -0.253215 0.858091 19.293089 20.227831 -8.606131 51.271729 18.473427 -3.167467 8.610084 15.805938 -0.696701 -0.355118 0.193019 0.043103 +0.214875 1.591180 0.048862 2.574727 26.411364 -11.249447 -5.704976 -5.767097 -4.465809 -2.047333 -0.226933 45.554066 -0.629889 -0.041481 -0.267808 0.928224 0.700160 0.729131 -13.002821 4.720261 -31.158447 17.416796 -3.973168 29.132910 -0.546667 0.215335 0.031523 0.347864 -0.326138 0.198373 4.755208 -2.895724 11.626527 1.745035 -3.077947 9.427836 0.749930 -2.676699 9.038092 -6.702932 -8.187261 18.972996 3.247222 -7.902697 -23.919952 -24.892681 -14.792261 -5.269094 -53.935734 -22.475761 0.428190 -56.237373 -56.129036 24.449215 0.439075 -0.247233 0.860718 18.506235 24.502462 -8.734241 49.908413 21.849981 -2.127067 8.686869 18.662460 -0.728739 -0.373203 0.189986 0.043915 +0.207146 1.602595 0.041104 1.084065 27.862707 -12.237287 -4.531384 -4.959218 -3.949564 0.621185 -1.050939 43.435452 -0.648016 -0.027089 -0.265759 0.939690 0.720619 0.711155 -13.544262 6.035306 -31.078773 20.601147 -5.201355 32.541603 -0.543211 0.211734 0.033525 0.373458 -0.297999 0.187902 6.174717 -2.997992 11.238691 1.889531 -2.923465 10.237421 0.114070 -2.531337 10.361115 -7.205350 -8.818517 19.124388 4.377102 -8.996162 -24.557495 -24.104315 -18.352659 -4.705760 -52.976940 -25.857395 2.054389 -57.892948 -61.063164 28.683056 0.436944 -0.255652 0.855481 16.802036 27.978418 -9.021023 48.240959 24.988777 -1.289507 9.076638 22.529875 -0.701426 -0.388458 0.192115 0.033908 +0.199735 1.612867 0.034670 -0.157658 29.672157 -12.791768 -3.645278 -4.357064 -3.632952 3.092369 -1.792673 41.157894 -0.685380 0.008217 -0.269988 0.936455 0.717409 0.690593 -14.261652 6.967924 -31.090961 23.464724 -6.652688 35.937088 -0.528016 0.192493 0.031125 0.397189 -0.264269 0.176891 7.117581 -3.085521 10.249029 1.881544 -2.924058 11.022483 -0.383868 -2.526937 11.900953 -6.970782 -9.615442 18.835859 5.266111 -9.773144 -24.735203 -22.032505 -21.499079 -4.712995 -52.627575 -29.853632 4.281100 -56.841473 -64.996628 30.823324 0.415342 -0.263186 0.850021 13.979361 30.389048 -9.677240 46.967880 28.108070 -0.523525 8.869577 27.491089 -0.840880 -0.415441 0.188452 0.007703 +0.192704 1.623655 0.029248 -0.737231 31.760529 -12.884562 -3.408679 -4.051496 -3.396710 4.978698 -2.371037 38.835121 -0.706923 0.073935 -0.256831 0.914537 0.678078 0.667553 -15.058596 7.311622 -30.568090 25.421272 -8.025341 38.849129 -0.507950 0.165078 0.029166 0.395852 -0.206473 0.188079 7.443910 -3.043360 9.057798 1.799011 -2.997092 11.672008 -0.711227 -2.571478 13.298458 -6.665573 -10.362669 18.288492 6.055379 -10.549313 -24.359921 -19.468855 -24.336796 -4.853502 -52.497917 -34.061764 6.764423 -51.246044 -68.780975 29.489822 0.370312 -0.269720 0.836988 11.452595 31.989756 -10.172949 45.385487 30.810452 0.092491 8.423731 32.605316 -1.004074 -0.435630 0.186024 -0.016336 +0.184892 1.634738 0.024264 -1.132650 33.618259 -12.843373 -3.003345 -3.686340 -2.951400 6.131579 -2.600552 35.830009 -0.709885 0.099541 -0.249105 0.891214 0.668219 0.617282 -15.390014 7.580908 -29.836866 26.334887 -9.080176 41.527023 -0.483952 0.135351 0.037219 0.401409 -0.156557 0.187774 7.727562 -2.955788 7.902610 1.562106 -2.933486 12.376259 -1.237518 -2.519610 14.772305 -6.146260 -11.046305 17.343742 7.078821 -11.191075 -24.219412 -16.798454 -26.725185 -5.159769 -51.688663 -38.204365 8.997954 -40.547810 -72.454163 23.877092 0.336436 -0.258022 0.802829 9.020132 33.083729 -10.574512 43.823509 33.360817 0.529452 6.874249 38.518837 -1.641460 -0.452358 0.175818 -0.024151 +0.178182 1.645499 0.019871 -1.669462 35.966488 -12.863760 -2.559472 -3.487328 -2.332265 7.178030 -2.834816 32.471252 -0.729256 0.151028 -0.219987 0.872741 0.654954 0.570624 -15.867421 7.378201 -28.716722 27.359146 -10.412948 44.096806 -0.458428 0.106448 0.054889 0.420764 -0.077641 0.173900 8.401584 -3.092587 6.181583 1.264567 -2.992383 13.212544 -1.919180 -2.575034 16.747463 -5.791980 -11.739221 16.280205 8.157859 -12.109204 -24.015450 -13.222481 -28.496101 -6.037446 -50.733482 -42.651997 11.294716 -21.121883 -74.588760 10.186108 0.298478 -0.274024 0.774145 5.780999 33.472885 -11.349483 42.253662 36.111099 1.044659 2.876709 43.645061 -3.439074 -0.480661 0.169581 -0.058964 +0.171189 1.654921 0.015604 -2.363856 37.232601 -12.555926 -1.380674 -3.145419 -2.132905 7.019211 -2.561817 29.061306 -0.742413 0.212739 -0.198082 0.839089 0.621893 0.506912 -15.523519 7.535924 -28.395220 27.470814 -11.503848 47.098637 -0.416069 0.047610 0.066194 0.429589 0.000715 0.174507 9.755501 -3.024456 4.374388 0.919355 -2.623699 13.767676 -2.787028 -2.188471 18.505575 -5.478118 -12.435144 14.685334 8.432644 -13.261312 -22.895044 -9.676352 -29.617075 -6.837114 -50.237061 -46.967857 13.555501 4.105612 -73.626404 -8.817780 0.243427 -0.254196 0.719400 2.239951 33.225170 -11.838243 40.831387 38.575310 1.665223 -2.832540 49.904495 -6.576490 -0.509175 0.137014 -0.081751 +0.164259 1.663350 0.011999 -2.609052 38.426685 -12.076783 -0.686929 -2.750493 -1.495627 7.254966 -2.379292 25.025646 -0.774158 0.270261 -0.177352 0.809937 0.595219 0.464178 -15.145264 7.698559 -27.491161 26.864889 -12.157074 49.959770 -0.376674 0.006841 0.076937 0.449703 0.068978 0.154006 10.270957 -2.727148 2.926963 0.814813 -2.322742 14.248929 -3.079625 -1.842541 20.066139 -5.208372 -13.197989 13.085619 8.233158 -14.254351 -22.296799 -6.165112 -30.107103 -7.931626 -49.386536 -51.513702 15.947107 21.838621 -69.800568 -20.796450 0.196388 -0.268825 0.680208 -1.146971 32.630714 -12.537682 37.888630 41.263901 2.404889 -8.778207 53.905449 -9.855884 -0.538860 0.121953 -0.123116 +0.158235 1.669394 0.009573 -2.458194 39.096638 -11.085819 -0.113667 -2.426255 -1.043060 6.853725 -2.088103 21.353891 -0.770172 0.309080 -0.140322 0.811535 0.612144 0.411920 -14.523732 7.664659 -26.699749 25.181278 -12.337781 53.073620 -0.342226 -0.054531 0.096298 0.486188 0.147364 0.144993 10.486082 -2.210652 1.133899 0.656766 -1.770930 14.519561 -3.172300 -1.319613 21.613180 -4.837639 -13.836258 11.312216 8.424127 -15.531708 -21.024355 -2.186809 -29.764450 -9.434537 -49.840656 -55.719635 18.427782 30.441025 -62.633739 -24.320833 0.162637 -0.231475 0.604523 -4.162244 31.209024 -12.945097 34.833958 43.420773 3.052536 -16.312780 57.293392 -14.431362 -0.562502 0.061849 -0.133599 +0.152634 1.673978 0.007720 -1.931368 39.525993 -9.763933 0.107907 -2.125005 -0.672897 6.383749 -1.817671 18.206617 -0.767250 0.329273 -0.107957 0.810795 0.633394 0.368567 -13.959478 7.614527 -25.785774 23.240271 -12.039417 55.526455 -0.309201 -0.111123 0.111688 0.525504 0.204671 0.123270 10.172791 -1.773887 -0.443471 0.409661 -1.348616 14.542229 -3.182944 -0.971675 22.748981 -4.490136 -14.192956 9.860512 7.893536 -16.344986 -19.524393 1.747664 -28.534069 -10.507598 -50.045864 -59.156509 20.711250 36.987701 -57.076359 -26.331371 0.139308 -0.198371 0.531335 -6.831972 29.629082 -13.198753 32.790993 45.884430 4.096642 -25.357063 58.677620 -19.937016 -0.579806 -0.000013 -0.148199 +0.147527 1.676851 0.005905 -1.855489 39.993675 -8.534652 0.581855 -1.898165 -0.609261 6.072489 -1.618398 15.414845 -0.787126 0.387814 -0.098280 0.805649 0.638670 0.320845 -13.009922 7.475474 -24.452150 21.262867 -11.278568 56.305237 -0.269699 -0.196729 0.111687 0.563239 0.272173 0.132773 10.211312 -1.471810 -2.060840 0.113046 -1.017849 14.419915 -3.395011 -0.697476 23.777367 -3.498134 -14.639064 7.884964 7.236074 -16.955624 -17.916395 5.028893 -26.834433 -11.602651 -50.155472 -62.959286 23.695637 40.778461 -52.011105 -26.312860 0.078547 -0.141134 0.453787 -9.251797 27.824507 -13.586556 31.788395 48.672009 5.606067 -33.552673 58.065155 -24.539715 -0.616679 -0.071504 -0.157200 +0.142485 1.678552 0.003156 -1.287819 40.650135 -7.109170 0.558041 -1.741863 -0.675211 5.791753 -1.464033 12.952365 -0.790623 0.451500 -0.069028 0.776776 0.617841 0.259159 -12.303564 7.058856 -22.429678 18.755112 -9.946091 55.874199 -0.230309 -0.259377 0.123348 0.577013 0.361300 0.138715 9.836038 -1.238977 -3.412211 -0.246978 -0.797325 14.255778 -3.648972 -0.426101 24.427528 -2.777560 -14.911052 6.580720 7.138536 -17.656530 -16.478281 8.136375 -25.788128 -12.451897 -50.526089 -66.041878 26.097467 42.857132 -46.487469 -25.181768 0.015304 -0.119410 0.386420 -11.358751 26.511700 -13.646576 30.249725 50.779602 6.367391 -40.160397 55.919910 -27.509962 -0.642141 -0.108385 -0.173704 +0.137230 1.678872 0.001626 -0.229136 40.975327 -5.397136 0.326516 -1.540542 -0.694824 5.043427 -1.231175 10.463954 -0.812217 0.517534 -0.055132 0.754188 0.581387 0.209459 -11.642634 6.754961 -19.837704 16.044327 -8.091333 53.924271 -0.196655 -0.308766 0.122851 0.586104 0.429061 0.141518 8.833982 -0.679342 -4.589886 -0.478321 -0.393616 14.082074 -3.582697 0.051444 24.868689 -2.445581 -15.071013 5.926495 7.649890 -18.425760 -15.514771 11.560550 -24.841127 -13.458413 -52.238525 -69.530991 29.758286 43.397720 -39.980606 -22.952154 -0.025506 -0.094189 0.352894 -12.530213 25.207895 -13.675694 28.082966 52.878036 6.931263 -42.668774 53.344749 -27.421837 -0.665601 -0.138593 -0.200275 +0.131548 1.677657 -0.000174 0.959566 41.104847 -3.594487 0.155735 -1.279684 -0.811514 4.171115 -0.979924 7.751913 -0.824138 0.572533 -0.040398 0.721922 0.552391 0.146740 -11.233198 6.256358 -17.111258 13.639364 -6.406019 50.908218 -0.154620 -0.365771 0.127401 0.596922 0.499197 0.139764 8.097175 -0.219603 -5.654725 -0.871037 0.053406 13.916703 -3.923025 0.583317 25.213308 -2.116305 -15.147931 4.912374 7.587058 -19.085005 -14.261256 14.231448 -24.117250 -14.527091 -51.549965 -72.897079 31.825752 42.341152 -33.660423 -20.002796 -0.074823 -0.067302 0.297338 -13.124614 24.301594 -13.621152 25.465263 55.125561 7.022866 -44.859642 50.077713 -26.820478 -0.687026 -0.172790 -0.220541 +0.126524 1.674780 -0.001452 1.830665 40.887085 -2.090642 0.203341 -0.954765 -0.745023 3.412243 -0.753820 4.873243 -0.814740 0.600247 -0.016794 0.684655 0.520836 0.093087 -10.378187 5.538208 -13.516997 10.813956 -4.532704 46.161552 -0.120794 -0.398017 0.143334 0.589635 0.552605 0.131268 7.501117 0.185551 -6.643847 -1.183736 0.461419 13.700514 -4.161107 1.097803 25.225357 -2.021372 -15.178529 4.577046 7.414250 -19.561419 -13.088565 16.812534 -23.516056 -15.387744 -48.947865 -75.615837 32.031956 40.235561 -27.932566 -17.082621 -0.107736 -0.059401 0.252675 -13.820351 23.767580 -13.328532 21.956116 56.987392 6.513611 -45.908699 47.053776 -25.580280 -0.694409 -0.188261 -0.233888 +0.121108 1.670923 -0.001388 3.214448 39.995869 -0.400861 -0.172369 -0.706984 -0.704552 2.465333 -0.578901 2.867577 -0.784245 0.603264 0.001498 0.668136 0.519923 0.044827 -9.935522 5.001680 -9.852243 8.032180 -2.723483 40.627617 -0.100701 -0.429270 0.152086 0.587611 0.590374 0.135726 6.053524 0.832766 -7.594070 -1.472706 1.063311 13.561659 -4.107346 1.763380 25.276775 -1.713637 -15.009738 4.171632 7.770448 -19.833454 -12.257958 18.805857 -22.693398 -16.168581 -45.025600 -78.042137 31.089230 37.399231 -23.531763 -14.552328 -0.123626 -0.021353 0.203154 -13.979415 23.608257 -13.260382 17.644209 58.995838 5.293576 -44.641987 43.057518 -22.753746 -0.689299 -0.218243 -0.220942 +0.115414 1.667116 -0.001869 4.041986 38.260788 0.594429 -0.001946 -0.393636 -0.289911 1.297697 -0.416093 1.081805 -0.765974 0.607201 0.024447 0.670154 0.529064 0.026175 -9.254503 4.691311 -6.477743 4.992439 -1.036441 35.051476 -0.097320 -0.446263 0.162433 0.592240 0.618592 0.138083 5.467309 1.606624 -8.325973 -1.702718 1.867656 13.662179 -4.398946 2.648496 25.536352 -1.452954 -14.958820 3.692956 7.889690 -19.984180 -11.892357 19.756786 -22.420794 -16.740669 -36.328949 -79.980850 25.520666 34.929585 -20.203608 -12.623283 -0.128426 -0.004274 0.177889 -14.112598 24.032343 -13.301061 13.245157 60.299522 3.252534 -43.238102 39.019749 -20.197981 -0.689144 -0.238971 -0.216283 +0.108637 1.663505 -0.003737 5.104290 37.222961 1.615566 -0.240683 -0.185450 -0.144335 0.592479 -0.316342 -0.405420 -0.736195 0.618846 0.038954 0.636596 0.503462 -0.030630 -9.081887 4.134128 -3.473577 2.565075 -0.024397 29.616327 -0.081818 -0.457703 0.163048 0.572104 0.659229 0.146194 5.097970 2.293075 -8.704230 -2.106709 2.635574 13.919961 -5.069269 3.550424 25.750603 -1.375894 -14.946222 3.327837 8.987719 -20.545603 -11.755752 20.987288 -22.442354 -17.527714 -22.815420 -81.186272 14.998302 32.264179 -17.207109 -10.897923 -0.142293 0.015493 0.149503 -13.741647 24.259371 -13.205703 8.258407 60.593971 0.634206 -41.903019 36.643791 -18.400705 -0.675251 -0.238598 -0.207686 +0.101412 1.661618 -0.005874 5.852717 36.023449 2.215918 -0.185361 -0.036818 -0.171264 -0.349911 -0.229349 -1.285258 -0.734838 0.602443 0.031015 0.624536 0.507131 -0.056659 -8.748388 3.513398 -0.655237 0.248337 0.668614 24.423582 -0.078985 -0.441205 0.166362 0.570012 0.663036 0.132547 5.001862 2.743685 -8.852294 -2.554771 3.222870 14.288876 -5.795392 4.371886 26.114792 -1.622642 -14.624389 3.388548 9.966020 -20.587978 -12.521220 21.675379 -22.483337 -17.954811 -10.330646 -81.106750 4.553654 31.120750 -15.683968 -10.084130 -0.132992 0.000772 0.155983 -13.817961 24.514492 -13.282081 3.933015 60.883949 -1.739448 -41.091583 34.993103 -17.245577 -0.670386 -0.214035 -0.209511 +0.093694 1.659649 -0.007629 6.131881 35.297848 2.557128 0.140792 -0.076288 -0.700369 -0.945605 -0.195595 -1.348137 -0.735919 0.615639 0.039135 0.623030 0.509823 -0.064835 -8.137462 2.948272 1.566549 -1.656938 1.063582 20.056902 -0.078516 -0.436332 0.170880 0.573877 0.685527 0.132780 5.203964 3.027670 -8.987067 -2.935827 3.644809 14.544716 -6.430330 4.970622 26.468714 -1.715857 -14.595074 3.133125 10.391131 -20.751883 -13.027472 22.307554 -22.069473 -18.394569 -3.464134 -80.831306 -1.070836 30.342783 -14.991481 -9.655028 -0.143049 -0.016428 0.153628 -14.138993 24.599751 -13.440356 1.880020 61.035263 -2.997286 -41.170979 33.948147 -16.881983 -0.673929 -0.200437 -0.213240 +0.085203 1.658314 -0.009493 5.960455 34.002510 3.163736 0.682037 -0.217011 -1.864792 -1.128206 -0.188258 -1.227100 -0.763171 0.674046 0.045236 0.601561 0.487997 -0.111852 -7.494087 2.730364 1.876862 -2.839525 1.258644 17.465479 -0.051700 -0.484481 0.174603 0.586676 0.746890 0.141622 5.676180 3.298579 -9.076401 -3.282069 4.062600 14.392307 -7.085402 5.542564 26.450905 -1.872245 -14.158875 2.274806 10.132704 -20.946558 -12.466346 22.521252 -20.788273 -18.695835 -4.992489 -80.579605 0.703920 29.917797 -15.813098 -9.680202 -0.192998 -0.006835 0.124030 -14.273344 24.135994 -14.065504 1.358220 62.807419 -3.065654 -40.000774 32.790577 -16.121183 -0.705238 -0.218068 -0.234289 +0.077202 1.657614 -0.009918 5.453221 33.028862 3.660711 1.641788 -0.297832 -3.050116 -1.474649 -0.163428 -1.000444 -0.771593 0.711449 0.065923 0.569237 0.444057 -0.147392 -6.791658 2.609566 1.474994 -3.132654 1.263377 16.153952 -0.028051 -0.499574 0.183984 0.575861 0.793300 0.131388 6.246250 3.485019 -9.047722 -3.525821 4.374689 14.036756 -7.661132 6.001658 26.009985 -2.389523 -13.841954 2.069211 10.304131 -21.346611 -11.900013 22.487663 -20.205582 -18.443094 -12.881796 -80.229149 7.255956 30.983335 -17.082664 -10.321006 -0.215359 -0.018506 0.113267 -13.915841 23.607002 -14.039582 3.067813 64.022621 -1.645805 -40.102722 34.100372 -16.643835 -0.713974 -0.215651 -0.262187 +0.069801 1.657736 -0.009577 4.916332 32.620441 4.376898 2.315460 -0.452144 -4.469755 -1.153489 -0.179857 -0.798818 -0.775162 0.750004 0.075509 0.529064 0.385368 -0.186128 -6.208131 2.539699 0.584355 -2.812706 1.134082 15.222023 -0.000596 -0.528919 0.180524 0.555788 0.825924 0.133544 6.671027 3.718239 -9.128987 -3.618779 4.642916 13.447472 -7.950418 6.331552 25.371599 -2.808104 -13.534370 1.966437 10.238871 -21.713171 -10.781826 22.177227 -19.920835 -17.643257 -27.425217 -79.746002 19.012197 33.702026 -19.412605 -11.854951 -0.239858 0.000493 0.096109 -13.289996 22.932802 -13.565120 8.296214 64.747215 1.989123 -41.725578 37.136616 -18.509134 -0.716703 -0.230645 -0.281501 +0.063039 1.658456 -0.008618 4.003965 32.788124 4.840666 3.212996 -0.618104 -6.001636 -0.504762 -0.219728 -0.282488 -0.801564 0.772736 0.073209 0.522865 0.363371 -0.172984 -5.456772 2.489627 -0.343292 -1.937934 0.914417 14.788194 0.009172 -0.538319 0.179718 0.557816 0.824922 0.126989 7.351855 3.833125 -9.183214 -3.492319 4.739820 12.859618 -7.923731 6.443955 24.833860 -2.974798 -13.731130 1.955606 9.426987 -21.815243 -10.321687 21.122181 -19.454792 -16.758776 -44.364414 -79.027069 32.739819 36.405079 -22.399908 -13.767385 -0.252362 -0.011473 0.102143 -13.294688 22.132700 -13.033670 15.881107 64.539932 6.900066 -44.752182 41.038544 -21.676315 -0.730775 -0.234082 -0.303218 +0.055925 1.659370 -0.006387 3.210335 33.209690 5.070128 3.959821 -0.709801 -7.099002 0.274986 -0.267421 0.040806 -0.806341 0.780559 0.075508 0.538505 0.373692 -0.140717 -4.776027 2.418915 -0.944138 -1.029419 0.707528 14.399861 0.009676 -0.557325 0.178543 0.568182 0.814972 0.136537 7.483667 3.717680 -9.406837 -3.278350 4.567672 12.435507 -7.474792 6.227635 24.650534 -3.096117 -13.722536 1.924549 8.107860 -21.527048 -9.606344 19.553572 -18.304516 -15.632386 -59.704826 -77.050789 44.409248 39.375587 -26.958700 -16.423458 -0.267279 -0.001405 0.087542 -13.110203 21.245829 -12.729794 24.303730 64.399689 12.467034 -46.927135 45.180073 -24.919319 -0.739410 -0.260204 -0.298586 +0.048523 1.660086 -0.003551 2.405284 33.847500 4.986825 4.808879 -0.743719 -7.914105 1.202046 -0.333014 0.483440 -0.807180 0.775475 0.071905 0.575853 0.433174 -0.115036 -4.165576 2.212433 -0.919981 0.230435 0.431386 13.634420 -0.003064 -0.576829 0.181055 0.601705 0.811189 0.155496 7.609995 3.478138 -9.731476 -3.102810 4.281628 12.252445 -6.982843 5.896212 24.948536 -2.947755 -13.687493 1.699193 7.137354 -21.073893 -9.711421 17.436028 -16.506262 -14.743447 -72.680977 -74.272087 53.267750 41.411968 -31.998646 -19.207521 -0.285676 0.010030 0.063321 -13.027251 20.394306 -12.891348 34.501976 64.344765 19.099611 -47.908665 49.015976 -27.805302 -0.756503 -0.283991 -0.275118 +0.040955 1.659004 -0.000245 1.769227 33.683697 5.158602 5.985386 -0.606450 -8.480288 1.259977 -0.313284 0.189739 -0.865306 0.817283 0.056830 0.586940 0.437726 -0.076280 -3.764702 2.160793 -1.428794 1.191885 0.218834 13.231978 -0.008952 -0.580450 0.172351 0.627847 0.815678 0.158247 7.201216 3.339205 -10.041555 -2.972286 3.987144 11.928468 -6.350002 5.627696 24.860329 -2.910725 -13.472461 1.538499 6.097837 -20.417250 -10.162145 16.063993 -14.072212 -14.076571 -81.620674 -70.282127 57.399010 42.221367 -37.094517 -21.832954 -0.320447 -0.038487 0.086913 -13.495538 19.350491 -13.298965 45.798290 63.360043 26.231855 -46.811165 53.752232 -30.072666 -0.790140 -0.265427 -0.305028 +0.034388 1.657605 0.003000 1.144738 33.025787 5.307882 7.033484 -0.448961 -8.729427 1.381562 -0.301370 -0.251613 -0.877875 0.818331 0.044097 0.596842 0.448076 -0.057899 -3.291155 2.121921 -1.888854 1.963012 0.078161 12.697372 -0.016969 -0.572665 0.162653 0.636253 0.804818 0.161538 6.976700 3.347194 -10.208448 -2.928607 3.909959 11.683503 -5.986039 5.510717 24.604748 -2.745797 -13.007541 1.366728 6.285728 -19.888689 -10.660829 14.415115 -12.292968 -13.341600 -85.224579 -66.551514 57.041687 41.779133 -42.537186 -23.895697 -0.321497 -0.045966 0.100342 -13.231837 18.825428 -13.634550 54.367344 61.988094 31.261580 -43.298069 57.807617 -30.236252 -0.792365 -0.257303 -0.306645 +0.029314 1.656499 0.005097 0.669527 32.429909 5.372944 7.841229 -0.380284 -9.006553 1.467680 -0.304590 -0.109049 -0.890625 0.816625 0.032260 0.605173 0.445830 -0.034567 -2.892600 2.141472 -2.302336 2.423281 -0.002901 12.440843 -0.029012 -0.555611 0.155990 0.633152 0.785317 0.164586 6.744302 3.348310 -10.215914 -2.882294 3.829966 11.536366 -5.658938 5.414783 24.333467 -2.706018 -12.687343 1.444749 6.532473 -19.482269 -11.222239 13.231344 -11.151945 -12.730559 -86.726524 -63.624542 55.535744 40.800503 -47.029503 -25.299522 -0.311934 -0.059239 0.130391 -12.893551 18.718836 -13.714771 59.558746 60.562210 33.678078 -40.230492 60.605011 -29.822653 -0.792353 -0.241202 -0.310784 +0.022668 1.654605 0.007282 0.092142 31.597691 5.424376 8.836014 -0.350310 -9.512893 1.626200 -0.317067 0.738954 -0.897748 0.795198 0.014435 0.604065 0.421635 0.001174 -2.476802 2.180535 -2.854814 3.073027 -0.122512 12.143336 -0.047730 -0.509152 0.148696 0.605717 0.736376 0.160575 6.412073 3.356744 -9.996611 -2.835008 3.732319 11.412697 -5.244916 5.289596 23.673195 -2.849306 -12.387654 1.799806 6.992700 -18.997723 -12.095221 11.217264 -10.980042 -11.968382 -85.918465 -59.576199 50.509739 36.548660 -52.498924 -25.223112 -0.278501 -0.088753 0.191059 -11.630080 19.760973 -13.522481 63.401157 57.686375 33.489197 -32.438881 64.026749 -26.379099 -0.777157 -0.200458 -0.316274 +0.015816 1.651898 0.009311 -0.346052 30.225321 5.750088 9.531106 -0.300225 -10.131926 2.119071 -0.325227 1.347871 -0.878593 0.754624 0.003394 0.570500 0.358994 0.024517 -2.025930 2.525628 -4.155605 3.312904 -0.146578 12.885932 -0.056367 -0.451923 0.144641 0.543078 0.674624 0.147494 5.965568 3.657798 -9.588206 -2.725786 3.915745 11.112229 -4.736913 5.366370 22.351368 -3.014244 -12.278728 2.694350 7.286094 -18.560572 -12.151581 9.155830 -11.925589 -10.879488 -84.275963 -54.997200 43.980423 28.727808 -57.309170 -22.576441 -0.234277 -0.117662 0.250222 -10.244849 21.932104 -13.108867 65.382286 53.725140 30.628954 -18.825352 65.762871 -18.167976 -0.738716 -0.151958 -0.319804 +0.008760 1.649626 0.012510 -0.999998 29.335575 5.424058 10.527983 -0.171201 -10.518970 2.311136 -0.339245 2.378149 -0.825436 0.665377 -0.006380 0.596336 0.362738 0.100848 -1.173438 2.781909 -4.656137 3.620914 -0.168552 13.683772 -0.110414 -0.373355 0.135275 0.492918 0.564564 0.156979 5.869252 3.727466 -8.864503 -2.668628 3.966125 11.067311 -4.468282 5.249524 21.111616 -3.081929 -12.207443 3.958512 7.653275 -17.707989 -12.922266 5.672904 -13.086706 -10.138650 -80.174736 -50.558403 36.178272 14.291852 -61.110950 -14.655278 -0.146614 -0.120485 0.323428 -7.790674 24.402287 -12.775517 65.683685 49.101234 25.930243 1.063916 64.972542 -5.279998 -0.680986 -0.120330 -0.279121 +0.002342 1.647969 0.015906 -1.545002 28.503132 4.917855 11.255604 -0.112813 -11.187887 2.554923 -0.356537 4.445276 -0.768865 0.547068 -0.029979 0.592443 0.356620 0.158759 -0.336017 2.999358 -4.896440 3.812555 -0.206337 14.648819 -0.159455 -0.259794 0.131750 0.424873 0.443809 0.144621 6.138334 3.888362 -7.623950 -2.718828 4.163181 10.921990 -4.609787 5.295933 19.414034 -3.299735 -12.379153 6.243906 8.549666 -16.876646 -14.212322 2.163591 -14.333405 -9.709208 -75.590454 -45.950649 28.556053 -5.795544 -61.292072 -2.159915 -0.054062 -0.168231 0.410493 -4.063213 26.283182 -11.405672 66.063904 43.012012 19.783836 18.945408 61.808441 5.129745 -0.612648 -0.037668 -0.241363 +-0.004034 1.644409 0.019044 -2.046311 27.653175 4.539516 11.724346 -0.073588 -12.399853 3.162879 -0.415166 7.392632 -0.672674 0.418927 -0.035707 0.608762 0.372285 0.222884 0.397444 3.299001 -5.284660 4.084406 -0.221023 15.640098 -0.218023 -0.160060 0.132093 0.354525 0.324163 0.157174 6.143893 3.934645 -6.121440 -2.699832 4.324343 10.455042 -4.652387 5.300210 17.206573 -3.460623 -12.583629 8.459460 9.184999 -16.207094 -14.927953 -1.505674 -15.215812 -8.888121 -71.796814 -40.839802 21.651861 -23.209408 -57.960960 7.782998 0.042970 -0.176965 0.470766 -0.510126 27.831076 -9.719409 65.360329 37.274128 13.784561 27.870729 55.404690 8.450658 -0.531611 0.012753 -0.169966 +-0.010498 1.640933 0.022349 -2.233043 27.238579 3.961143 11.760059 -0.163287 -13.844517 3.857262 -0.544328 11.236992 -0.609022 0.298193 -0.070127 0.655837 0.422302 0.289971 0.990264 3.529787 -5.217776 4.242348 -0.228390 16.699554 -0.288210 -0.073266 0.122675 0.313232 0.196006 0.182494 5.940618 3.663647 -4.339733 -2.750357 4.217844 9.962990 -4.756522 5.125760 15.130462 -3.696817 -12.523713 10.992363 9.895925 -15.424960 -16.279505 -5.669021 -16.076023 -8.397373 -67.712822 -36.101723 15.293859 -30.137659 -50.419628 9.602019 0.141062 -0.167769 0.544226 3.041803 29.458523 -8.241609 64.120483 32.167873 8.529281 27.684877 45.489082 5.932588 -0.474296 0.054013 -0.093745 +-0.017929 1.637595 0.024738 -2.526578 26.390026 3.281994 11.859721 -0.398713 -15.907858 4.322669 -0.720167 16.379829 -0.576837 0.201797 -0.107915 0.706499 0.483274 0.362983 1.691269 3.903660 -5.586570 4.314372 -0.212810 18.413666 -0.347105 0.000672 0.105034 0.303264 0.083556 0.191757 5.669950 3.361036 -2.416411 -2.743640 4.133983 9.466788 -4.766204 5.008610 13.434272 -3.972103 -12.054435 12.986801 9.888752 -14.380226 -17.601641 -9.669702 -15.824588 -8.754024 -64.464470 -32.356384 10.911187 -30.276041 -40.833458 7.347875 0.219656 -0.172996 0.604624 6.769095 29.729076 -6.881930 63.583786 27.953762 4.900280 24.332163 36.803856 3.119418 -0.431472 0.088738 -0.041413 +-0.025906 1.634918 0.025309 -2.978992 24.742067 2.354896 12.045663 -0.707246 -17.998175 4.633310 -0.932183 22.216169 -0.580952 0.124310 -0.156029 0.754247 0.531115 0.438724 2.318411 4.542555 -6.405538 4.740817 -0.267876 21.177885 -0.401851 0.084192 0.084814 0.300761 -0.022304 0.185894 5.319794 3.151179 0.003651 -2.663121 4.167975 8.904583 -4.675383 5.063518 11.740530 -4.406235 -11.455246 15.146665 10.427155 -13.344041 -19.584890 -13.915477 -14.979415 -8.975922 -61.607368 -28.843891 7.250041 -27.536211 -33.652313 4.740300 0.295767 -0.204325 0.690821 10.796494 29.657585 -5.520434 62.738575 24.077337 2.029039 20.597664 28.916431 1.261694 -0.403661 0.144232 -0.017180 +-0.033604 1.631461 0.026291 -2.938291 23.196104 1.665060 11.743255 -1.365583 -20.472963 4.670496 -1.176808 28.744678 -0.593355 0.094028 -0.184494 0.759990 0.528423 0.452361 2.454143 4.989292 -7.128467 5.086215 -0.372964 23.673584 -0.425461 0.140258 0.071171 0.288516 -0.060632 0.171416 4.127890 3.104728 2.044532 -2.478197 4.114188 8.424778 -4.044780 5.023692 10.357756 -5.493556 -10.132643 16.806961 12.063702 -12.761723 -20.664846 -15.978810 -13.230397 -9.054479 -61.277134 -26.025434 4.431917 -21.489691 -30.057558 1.932083 0.343104 -0.232048 0.758958 14.737449 28.680328 -4.591903 60.852917 20.876347 0.473342 17.325766 20.632584 0.450206 -0.386390 0.195444 -0.025037 +-0.040319 1.625461 0.026921 -3.139272 21.789230 1.088092 11.549229 -2.144103 -23.743189 4.734555 -1.493840 35.868851 -0.587350 0.067222 -0.196489 0.758475 0.518299 0.470893 2.479411 5.563029 -8.446764 6.035028 -0.702205 26.933628 -0.440072 0.178666 0.061357 0.271258 -0.097874 0.161634 2.955367 2.870569 4.298859 -2.124471 3.861637 7.741437 -3.255532 4.744660 8.609985 -6.378093 -9.075284 17.438549 12.287344 -12.162248 -21.043112 -18.055866 -10.573992 -9.369792 -60.906883 -23.154047 1.943765 -16.244444 -26.982914 -0.032990 0.376918 -0.243729 0.795665 17.573069 26.370966 -4.479882 58.671471 18.371773 -0.064664 14.899653 12.588306 0.298212 -0.364035 0.222130 -0.025561 +-0.045310 1.616833 0.028576 -3.721910 20.571373 0.405763 11.584590 -2.809723 -27.204296 4.597153 -1.777532 42.993851 -0.596537 0.064302 -0.204855 0.740473 0.484392 0.472920 2.781845 6.112828 -9.514110 7.276214 -1.195430 30.066996 -0.437875 0.197874 0.062607 0.248340 -0.114336 0.153702 2.887526 2.501115 6.548411 -1.863120 3.751830 6.986165 -3.113288 4.678326 6.820383 -6.980174 -8.374520 17.448805 12.196870 -11.864803 -21.240942 -19.825966 -8.055820 -9.822625 -59.771877 -20.386696 0.043366 -12.204634 -23.521408 -1.211346 0.388413 -0.262002 0.826478 18.780666 23.616423 -4.681273 56.686462 16.278784 -0.600133 12.053510 6.484162 0.243022 -0.358833 0.247507 -0.038983 +-0.050390 1.609850 0.031528 -4.164714 18.779064 -0.571429 11.651412 -3.189358 -29.927025 3.951278 -1.723227 49.565891 -0.585724 0.046345 -0.199193 0.727997 0.464540 0.485919 3.089249 6.575175 -9.795017 8.262147 -1.562730 32.450603 -0.447486 0.230806 0.058465 0.227480 -0.131548 0.140561 2.905967 2.278013 9.153730 -1.862588 3.990889 6.227502 -3.481675 4.923924 5.023766 -7.037124 -7.792000 17.676662 12.762646 -11.455729 -21.567152 -20.872562 -6.144718 -9.970915 -57.116722 -17.528547 -1.568299 -9.404504 -20.669231 -1.741714 0.410909 -0.283389 0.853394 19.181568 20.903532 -4.870619 54.449150 14.406320 -1.301590 9.243716 2.090031 0.278573 -0.337335 0.272931 -0.047898 +-0.057211 1.605782 0.036266 -4.612236 16.427341 -2.135710 11.820450 -3.107033 -31.206917 3.091653 -1.322016 54.947258 -0.626754 0.048919 -0.216443 0.718806 0.443222 0.517402 4.185810 6.984067 -8.841696 8.102322 -1.426917 33.979382 -0.460147 0.266863 0.053371 0.220950 -0.153298 0.122410 2.427021 2.401033 11.749820 -1.927197 4.383028 5.716813 -3.726162 5.376480 3.741900 -6.367495 -7.498810 18.583605 13.039213 -10.518732 -22.383707 -21.309656 -4.651912 -10.035110 -53.589840 -14.920925 -2.754882 -7.078250 -18.959539 -2.059306 0.415850 -0.343465 0.913075 18.751753 18.903433 -4.866766 51.884148 12.727719 -2.065844 6.672866 -0.804184 0.376527 -0.345897 0.323400 -0.083478 +-0.064128 1.603041 0.041122 -4.742250 14.785318 -3.866420 11.541334 -3.234601 -32.209484 2.247242 -0.883049 59.591805 -0.645862 0.057845 -0.233904 0.700061 0.416020 0.543019 5.047765 7.111754 -7.223330 8.218668 -1.401028 34.957157 -0.463283 0.285419 0.046263 0.203705 -0.170998 0.126565 1.404873 2.644516 14.223445 -1.885231 4.638927 5.455352 -3.553349 5.662379 2.828120 -5.478572 -7.589102 19.147963 12.737132 -9.688244 -22.674809 -21.496178 -3.338287 -9.826394 -49.896580 -12.431218 -3.733506 -5.174586 -18.959841 -2.288249 0.397207 -0.381450 0.942090 18.211502 17.283218 -4.631820 48.264683 11.044409 -2.834854 4.661848 -2.397516 0.448268 -0.348293 0.359857 -0.096127 +-0.069281 1.600868 0.045711 -5.080117 13.542512 -5.808462 11.198509 -3.444896 -32.859943 0.999826 -0.218608 63.356174 -0.663429 0.060625 -0.245815 0.696588 0.411216 0.562385 5.840366 7.123978 -5.370850 8.698271 -1.541639 35.842030 -0.474441 0.292967 0.043815 0.198753 -0.183775 0.134869 1.130462 2.583256 16.295437 -1.830120 4.790107 5.639744 -3.595851 5.847186 2.595757 -4.652845 -7.310275 19.085495 12.422848 -8.621764 -23.338688 -20.916506 -2.140730 -9.444902 -46.766697 -10.292544 -4.396543 -3.669480 -19.995323 -2.481628 0.384241 -0.401387 0.966884 16.610487 15.358989 -4.852176 44.734409 10.001855 -3.376023 3.274905 -2.787215 0.446029 -0.358763 0.379680 -0.103430 +-0.074458 1.598766 0.050820 -4.873990 13.022504 -7.250898 10.048257 -3.977962 -33.546955 -0.350746 0.582151 65.759186 -0.655742 0.068646 -0.232701 0.684207 0.395246 0.565436 5.888405 7.001862 -3.791795 9.446332 -1.827027 36.441429 -0.471601 0.287115 0.052007 0.186085 -0.173529 0.141450 0.411803 2.723772 17.395706 -1.855618 4.776449 6.162052 -3.440972 5.829131 2.923939 -4.101944 -7.133761 18.307856 11.991088 -8.035526 -23.165541 -19.417786 -0.824710 -8.871023 -44.519711 -8.417058 -4.978661 -1.524055 -21.865860 -2.850051 0.367466 -0.405771 0.961909 14.722197 13.643157 -4.894085 41.189999 9.011080 -3.776797 2.086179 -2.738231 0.412427 -0.360218 0.379198 -0.106974 +-0.079784 1.597909 0.056354 -4.809546 12.073950 -8.736429 9.394713 -3.925914 -33.527271 -2.189096 1.901391 66.879860 -0.654295 0.069118 -0.219790 0.659468 0.379724 0.552277 6.313759 7.036048 -2.154211 9.629060 -1.800329 36.975513 -0.459036 0.281753 0.066804 0.178455 -0.158759 0.129122 -0.323338 3.194349 18.095259 -1.827985 4.958994 6.899821 -3.158443 6.019390 3.627603 -3.309435 -7.412144 17.305094 11.513452 -7.628661 -23.046267 -17.866680 0.381365 -8.430048 -42.091728 -6.959424 -5.241391 0.621886 -23.314865 -3.173356 0.347769 -0.422449 0.949155 12.663950 12.007515 -4.618950 37.429699 7.834501 -4.095014 1.314404 -1.346673 0.306888 -0.367366 0.384559 -0.120845 +-0.084986 1.598303 0.062329 -4.905817 10.690448 -10.232709 8.813299 -3.516993 -32.624908 -4.000945 3.209200 66.177353 -0.628822 0.058627 -0.204224 0.642016 0.366629 0.535934 7.012474 7.160951 -0.450217 9.502440 -1.554054 37.370792 -0.447925 0.280693 0.073057 0.165153 -0.149896 0.122007 -0.181530 3.576280 18.614855 -1.929441 5.403606 7.652115 -3.457149 6.456235 4.370292 -3.180257 -7.459258 16.531399 11.955357 -7.746142 -22.854734 -16.217678 1.189944 -7.740199 -39.297939 -5.592618 -5.362935 2.573493 -25.246054 -3.504770 0.349338 -0.411427 0.929805 11.004084 10.558630 -3.919111 33.727859 6.368999 -4.323321 0.380682 0.369494 0.223897 -0.353273 0.377183 -0.118240 +-0.090045 1.599456 0.068382 -4.764175 9.472632 -11.389778 8.194818 -3.203891 -32.080097 -6.308816 4.726672 64.876518 -0.594184 0.045811 -0.180859 0.635236 0.366382 0.513613 7.542616 7.199426 1.087874 9.245399 -1.267772 37.488579 -0.435391 0.260886 0.083774 0.159656 -0.134604 0.119195 -0.259709 4.182143 18.623560 -2.098221 5.970319 8.501646 -3.703206 6.969938 5.385630 -2.635448 -7.721590 15.207582 12.445002 -7.977115 -22.183935 -14.880594 1.646604 -7.528221 -35.811028 -5.224490 -5.009884 4.472164 -26.187166 -3.699622 0.350936 -0.371288 0.891654 10.114367 8.734211 -3.147747 30.044931 4.500038 -4.546605 -1.424486 2.797348 0.078395 -0.344060 0.341090 -0.107309 +-0.094643 1.601078 0.073991 -4.638529 8.865036 -12.056458 7.228813 -3.230319 -32.151878 -8.541168 5.885347 62.703785 -0.555931 0.053639 -0.153522 0.609414 0.348818 0.467438 7.763189 7.193855 2.031472 9.502087 -1.262183 37.493080 -0.408380 0.224220 0.093881 0.148360 -0.095332 0.124063 -0.292985 4.645823 18.018602 -2.202692 6.297347 9.379336 -3.796278 7.270170 6.604698 -2.245090 -7.906760 13.372962 12.713310 -8.492113 -21.010517 -13.608711 1.922604 -7.252903 -32.840405 -4.936044 -4.726596 7.798020 -27.078276 -4.277680 0.330077 -0.326625 0.833062 9.330679 7.079579 -2.544061 25.858721 3.136989 -4.277082 -2.185851 3.598872 0.036887 -0.335863 0.301582 -0.096241 +-0.098509 1.604193 0.080551 -4.668190 8.392828 -12.915040 6.143889 -3.214820 -31.367960 -10.638514 6.606496 58.815426 -0.540175 0.060363 -0.146239 0.596673 0.333300 0.454337 8.259864 7.206565 3.228472 9.769401 -1.242452 37.568943 -0.395849 0.203685 0.091858 0.138729 -0.085013 0.131284 0.298186 4.796818 17.381380 -2.475327 6.585726 10.201623 -4.377612 7.573607 7.831286 -1.571793 -8.462477 12.707538 12.794375 -8.827060 -20.202139 -12.766110 1.656136 -6.799743 -29.322397 -4.287319 -4.482095 11.376641 -27.964632 -5.002304 0.317255 -0.298695 0.806718 7.995950 6.170955 -1.583618 22.531973 1.801779 -3.888522 -2.336093 3.534618 0.079791 -0.331641 0.278165 -0.088712 +-0.102589 1.608993 0.087801 -4.515129 8.508290 -14.171170 4.724641 -3.417014 -29.568516 -12.679696 6.892889 53.679901 -0.542896 0.079948 -0.150197 0.576519 0.307418 0.444044 8.547130 6.856709 5.327373 10.324254 -1.367736 36.719761 -0.389933 0.207023 0.087851 0.123648 -0.071947 0.140988 0.205218 5.100698 17.009731 -2.506179 6.642416 11.258969 -4.329958 7.734841 9.163054 -1.460240 -8.582478 12.430688 13.390949 -8.933520 -20.630688 -11.434558 1.256941 -6.365737 -26.768579 -3.896862 -4.375902 15.567303 -28.356167 -5.987316 0.298042 -0.308146 0.810638 6.794379 5.634328 -0.460415 18.499191 0.520377 -3.301985 -1.353282 2.821591 0.201188 -0.332234 0.297272 -0.091726 +-0.106132 1.612353 0.096472 -4.647935 8.156320 -15.108036 3.612535 -3.238226 -27.646391 -14.134160 6.781410 48.175400 -0.587231 0.127416 -0.160943 0.540394 0.254167 0.424194 9.165415 6.904548 6.592752 10.859378 -1.441973 36.782459 -0.369400 0.208376 0.081467 0.115114 -0.043592 0.129077 0.849933 5.252676 16.002842 -2.686818 6.808344 12.135622 -4.747991 8.073049 10.572889 -1.661015 -8.504340 12.417289 14.038247 -9.160443 -20.928003 -10.109330 1.281690 -6.068034 -24.055748 -3.332074 -4.221080 19.610655 -29.577295 -7.185842 0.270424 -0.346844 0.833003 5.606927 4.894911 0.205645 14.801491 -0.173862 -2.729801 -0.228601 1.499159 0.287694 -0.349434 0.331402 -0.133159 +-0.109715 1.614852 0.106168 -4.666320 8.091014 -15.454363 2.215467 -3.202193 -26.107677 -14.568086 6.133189 42.664192 -0.640263 0.188589 -0.171176 0.506537 0.205565 0.380487 9.456243 7.161919 6.923061 11.556711 -1.607391 37.258102 -0.340074 0.188872 0.077757 0.120177 0.004275 0.116288 1.205187 5.488316 14.241652 -2.874127 6.890341 12.829988 -4.989864 8.338240 12.124058 -2.303243 -8.041579 12.304311 14.657230 -9.638011 -20.747490 -8.696290 1.593258 -6.027452 -21.449450 -3.081878 -3.912217 23.158499 -29.773090 -8.086489 0.238096 -0.369093 0.842276 5.142882 3.800783 0.207637 10.800345 -0.143235 -2.115229 0.981255 0.112588 0.285438 -0.377984 0.348321 -0.179623 +-0.112747 1.616625 0.115095 -4.990741 8.164786 -15.865658 1.043461 -3.087590 -24.173313 -14.748280 5.222101 36.373734 -0.683668 0.250060 -0.168607 0.465346 0.141514 0.348504 9.717762 7.497554 6.983899 12.795793 -2.025599 38.039116 -0.318883 0.179148 0.078920 0.107374 0.051464 0.109039 2.012276 5.423952 13.253212 -3.071696 6.888405 13.184701 -5.539055 8.461892 12.861990 -2.746953 -7.700154 12.335080 14.982339 -9.958453 -20.515394 -7.200118 1.981705 -5.887343 -18.871796 -2.684505 -3.586296 26.492111 -28.849470 -8.599340 0.206723 -0.408235 0.863617 4.042210 3.053280 0.576295 8.387979 -0.728333 -1.799165 1.430843 -0.014770 0.295403 -0.399283 0.377449 -0.227601 +-0.115463 1.616859 0.124199 -5.450464 8.495954 -15.980325 -0.082884 -3.123311 -22.469206 -14.564780 4.167786 30.123472 -0.689176 0.276901 -0.158702 0.423207 0.082733 0.319910 10.045534 7.669461 6.689302 14.109858 -2.541101 38.632874 -0.294464 0.182988 0.081005 0.083759 0.081419 0.089145 2.597516 5.272849 12.169952 -3.216062 6.739087 13.135448 -5.925075 8.380306 13.078330 -3.344894 -6.949200 13.024004 15.546537 -10.218468 -19.273079 -5.055687 2.270844 -5.061776 -17.396822 -1.643019 -3.473819 29.611986 -28.293369 -9.116992 0.196602 -0.430118 0.866134 2.710117 2.595574 1.058337 6.394696 -1.610484 -1.632326 1.544837 -1.646039 0.288008 -0.392895 0.396230 -0.258273 +-0.117858 1.614863 0.134055 -6.061451 9.195331 -15.831934 -1.501298 -3.426906 -21.074863 -13.357212 2.985122 24.702532 -0.692994 0.303578 -0.143693 0.389224 0.033678 0.299776 10.340446 7.637849 6.225935 15.497364 -3.190669 39.035683 -0.274082 0.177473 0.089672 0.063842 0.109614 0.076712 2.998128 5.011083 10.540645 -3.275383 6.376997 12.872963 -6.085165 8.089252 13.292309 -3.519217 -6.618376 13.792407 15.296922 -10.437434 -17.670822 -3.321713 2.294897 -4.212504 -15.451892 -0.475142 -3.209919 31.677366 -27.372871 -9.164584 0.180383 -0.451834 0.862879 1.352678 2.111200 1.626733 4.355453 -2.467059 -1.297570 2.130320 -1.259604 0.279247 -0.393655 0.405323 -0.283223 +-0.120513 1.612530 0.144085 -6.603261 9.545199 -15.825659 -2.758981 -3.560180 -19.574232 -11.625344 1.991087 20.069298 -0.665384 0.288755 -0.130584 0.387868 0.038364 0.282512 10.582731 7.690639 5.792287 16.742950 -3.754691 39.623516 -0.274453 0.182917 0.097448 0.055862 0.121235 0.073051 3.591081 4.775169 9.176961 -3.424733 6.216575 12.704245 -6.480902 7.936376 13.571879 -4.004970 -5.928668 14.800937 15.995433 -10.609320 -16.790525 -1.665542 1.946813 -3.410395 -13.143541 0.400385 -2.866153 32.169460 -25.569466 -8.505278 0.191705 -0.443357 0.851276 0.621885 1.823771 1.944118 1.827471 -3.001677 -0.957822 2.640047 -2.206958 0.227907 -0.380538 0.402652 -0.271961 +-0.123220 1.608500 0.153391 -7.189845 9.813557 -15.963759 -3.706390 -3.512677 -18.148531 -9.916778 1.270711 16.204428 -0.637864 0.259861 -0.124064 0.398722 0.075254 0.257444 11.109981 7.739640 5.467600 17.587557 -4.148072 40.342140 -0.276966 0.172983 0.105461 0.068731 0.128764 0.070546 4.055035 4.415062 8.204596 -3.618448 5.985120 12.616246 -6.899271 7.640937 13.838318 -3.975210 -5.029077 15.042229 16.410110 -10.256472 -16.080297 -0.136868 2.209439 -3.057927 -10.736804 0.844927 -2.434971 32.167191 -23.359604 -7.573365 0.201447 -0.413948 0.823907 -0.264165 1.500163 1.611749 -0.304248 -2.315142 -0.683312 3.107346 -3.377892 0.129038 -0.375496 0.380101 -0.252288 +-0.125389 1.603304 0.161551 -7.762503 9.759625 -16.367041 -4.034342 -3.274439 -16.713995 -8.999638 0.903693 13.275191 -0.662607 0.286004 -0.145914 0.390860 0.053399 0.256722 11.935142 7.936140 5.336325 18.010324 -4.393959 41.526081 -0.267515 0.164279 0.089025 0.069417 0.126679 0.077573 4.779641 4.019969 7.819373 -3.762131 5.749017 12.606022 -7.364584 7.474751 13.956902 -4.216215 -4.234599 14.905465 16.374588 -9.882743 -16.095068 1.578741 2.796022 -2.966520 -9.473142 0.768060 -2.114720 32.032555 -21.322016 -6.828822 0.190352 -0.406092 0.834044 -1.883126 1.124859 1.292994 -1.650442 -1.648684 -0.590864 3.239905 -3.963721 0.092462 -0.380052 0.381701 -0.263474 +-0.127692 1.596628 0.169905 -8.287926 9.927526 -16.833183 -4.033185 -3.067184 -15.561388 -8.623568 0.755996 11.709300 -0.673577 0.305737 -0.146311 0.389679 0.038754 0.268602 12.661439 7.976710 5.375806 18.591475 -4.774434 42.587254 -0.262180 0.156926 0.082958 0.070027 0.129305 0.080348 5.197240 3.631244 7.733939 -3.852854 5.487174 12.597133 -7.647515 7.222457 13.924252 -4.091022 -3.659539 14.312510 16.001905 -9.378504 -15.880338 2.847676 3.333412 -2.945452 -7.813217 0.838075 -1.802546 32.203983 -19.784925 -6.276993 0.181334 -0.402622 0.836016 -3.128233 0.662186 1.185500 -2.829223 -1.517295 -0.430593 3.348774 -3.719612 0.078712 -0.382202 0.374753 -0.274060 +-0.130082 1.588887 0.177145 -8.330001 9.957185 -17.164865 -3.891643 -3.021239 -15.265197 -9.403909 0.900846 11.950698 -0.647356 0.275239 -0.131935 0.390185 0.059145 0.270892 12.436865 8.089232 5.304255 19.960138 -5.633677 43.946957 -0.261032 0.171944 0.096977 0.070410 0.127425 0.064011 5.324252 3.333356 7.641685 -4.170708 5.342016 12.541788 -8.132067 6.992322 13.855093 -4.123245 -2.979521 14.180596 15.774145 -8.761547 -15.667060 3.951105 3.313497 -2.394172 -5.163102 1.918368 -1.360538 31.343094 -18.887360 -5.635419 0.187795 -0.414962 0.818552 -3.774750 0.417719 1.397858 -4.096479 -1.912895 -0.166186 3.689137 -3.036293 0.077865 -0.369428 0.379664 -0.265328 +-0.133382 1.582611 0.183124 -7.826780 10.170585 -17.862226 -4.203766 -3.196898 -14.825809 -10.091387 1.055095 12.835079 -0.616163 0.214050 -0.131929 0.444946 0.141572 0.282222 11.478287 8.016389 5.764610 21.524401 -6.641990 44.930347 -0.284557 0.168425 0.106538 0.100806 0.095701 0.067029 4.610313 3.198848 8.023445 -4.533473 5.237597 12.838604 -8.313654 6.720548 14.093591 -4.039423 -2.456700 13.694516 15.934319 -8.169155 -16.077951 4.854856 3.296032 -2.243026 -2.315151 2.106153 -0.906347 29.448811 -17.323748 -4.749540 0.228575 -0.363391 0.802308 -3.731920 0.233858 1.292859 -5.112161 -2.066021 -0.036885 3.336510 -3.255187 0.040207 -0.364527 0.337668 -0.225992 +-0.137231 1.576327 0.187931 -7.121253 10.531985 -18.186544 -4.260695 -3.446183 -15.352843 -11.534386 1.446088 14.706898 -0.570227 0.165423 -0.105773 0.470611 0.198730 0.283171 10.551448 7.893314 5.902022 22.302813 -7.336543 45.840302 -0.297606 0.173449 0.123018 0.116589 0.094797 0.057875 3.073220 3.358293 8.209476 -4.744444 5.136832 12.972291 -7.971725 6.424567 14.194328 -3.737944 -2.164491 13.171371 16.108210 -7.749840 -15.899817 5.731382 3.020430 -1.954063 0.465151 2.154952 -0.428763 27.217068 -16.087132 -3.961681 0.250958 -0.345510 0.771507 -3.211960 0.240280 1.175716 -6.022431 -2.161690 0.025215 3.156392 -4.088842 -0.047712 -0.349228 0.314280 -0.200142 +-0.140306 1.572599 0.191439 -6.592206 10.240909 -19.057102 -3.434460 -3.264237 -15.230490 -13.532403 2.045304 16.499632 -0.551856 0.139127 -0.092752 0.491966 0.235377 0.289152 9.931205 7.788028 6.900056 23.022402 -7.871183 46.414806 -0.307767 0.174311 0.133989 0.129016 0.091692 0.055088 2.064168 3.528348 9.150163 -4.910594 5.235661 13.378220 -7.797083 6.389178 14.276160 -3.419210 -2.299507 12.188269 16.229305 -7.511631 -16.391148 5.789742 3.068403 -2.031269 2.835380 2.154497 -0.023702 26.051004 -16.586554 -3.816801 0.264727 -0.332984 0.760163 -2.497242 0.398254 1.184679 -6.591057 -2.424860 0.055855 3.158596 -4.734885 -0.128560 -0.347283 0.299110 -0.186866 +-0.141716 1.569335 0.195407 -6.353044 9.415371 -19.082039 -2.199905 -2.846102 -15.510859 -15.509788 2.605154 17.334547 -0.538553 0.108959 -0.086098 0.525088 0.280027 0.303491 9.947392 7.863386 7.057430 23.056442 -7.970661 47.010242 -0.319354 0.181068 0.141923 0.149293 0.081143 0.045526 1.735502 3.752327 8.963759 -5.055427 5.500407 13.345960 -7.861662 6.612251 14.374300 -3.254130 -2.108151 12.072378 16.796209 -7.275157 -16.625864 5.668366 2.969278 -2.230520 4.069798 1.680057 0.132304 26.270441 -17.528345 -4.008077 0.289562 -0.316038 0.754805 -1.705533 0.194707 1.183935 -6.843164 -2.626917 0.219491 3.792644 -4.511384 -0.184095 -0.344831 0.281109 -0.175595 +-0.143101 1.568544 0.196418 -6.376348 8.893342 -19.057211 -1.229423 -2.522139 -15.357548 -16.606953 2.785415 17.004843 -0.558100 0.148736 -0.103374 0.491119 0.225618 0.285350 10.435431 7.811507 7.003367 22.413446 -7.748784 47.337887 -0.314780 0.175398 0.123969 0.123129 0.088886 0.068763 1.815699 3.812340 9.163201 -5.085547 5.553216 13.219941 -7.927145 6.780885 14.084849 -3.655902 -2.285224 12.369410 16.903236 -7.623636 -16.768309 5.900065 2.361028 -2.219217 3.477397 0.895341 -0.016064 26.504028 -18.293598 -4.334065 0.266281 -0.324072 0.776435 -1.628961 0.383049 1.647285 -5.465694 -3.566809 0.060792 3.674902 -3.976267 -0.093138 -0.348287 0.304610 -0.185130 +-0.143752 1.569957 0.195626 -6.484953 8.266230 -19.135204 -0.690552 -2.263261 -14.517349 -16.955652 2.631006 15.561074 -0.589233 0.190014 -0.115982 0.459007 0.166414 0.289427 11.040097 7.663756 7.134979 21.777348 -7.467365 47.370899 -0.304290 0.192719 0.107907 0.101133 0.093824 0.067390 2.112092 3.630659 9.536168 -5.167405 5.459273 13.233742 -8.115698 6.837215 13.866920 -4.260360 -2.236377 12.409307 17.142771 -7.847057 -17.424526 6.202000 1.857190 -2.381680 1.555007 -0.287408 -0.432220 26.827141 -18.519663 -4.659024 0.248269 -0.362111 0.807142 -1.685102 0.562694 2.063397 -3.754040 -4.032571 -0.064484 4.200025 -2.719692 0.010411 -0.349034 0.345750 -0.212681 +-0.143985 1.573022 0.192893 -6.793901 7.878791 -19.172327 -0.803406 -2.253219 -13.635481 -15.883826 2.152753 13.820489 -0.614937 0.243773 -0.114223 0.415279 0.103309 0.258889 11.517089 7.314377 7.338673 21.419472 -7.320105 46.954151 -0.270968 0.168336 0.109150 0.085642 0.135478 0.063689 2.311306 3.393768 10.115484 -5.090553 5.254531 13.245630 -8.110356 6.662442 13.521987 -4.201078 -1.637134 11.857196 16.948696 -7.744476 -16.186363 6.481126 1.807885 -2.691044 -1.026267 -1.925356 -0.799904 26.896662 -19.123970 -5.044866 0.207140 -0.373712 0.800068 -1.534479 0.603735 1.959674 -1.537172 -3.777610 -0.342273 3.933936 -2.019085 0.079294 -0.363879 0.351008 -0.247020 +-0.144393 1.576939 0.189546 -6.986670 7.315241 -18.699711 -0.961043 -2.208764 -13.202392 -14.564507 1.686006 11.968073 -0.606289 0.250283 -0.091712 0.400672 0.092039 0.249615 11.614175 7.103593 6.981585 21.224133 -7.227644 46.577984 -0.256939 0.160631 0.123151 0.083043 0.159910 0.049123 2.201218 3.302735 10.348373 -4.909746 5.085827 13.087318 -7.856518 6.429253 13.164340 -3.938548 -1.188530 11.354896 16.469244 -7.364497 -15.220625 6.351259 1.954167 -2.725461 -3.412626 -2.873261 -0.945976 25.997648 -21.183775 -5.495074 0.192430 -0.382679 0.778344 -1.256353 0.563632 1.626116 0.892594 -3.231622 -0.653357 3.608182 -1.686814 0.105301 -0.365417 0.344464 -0.259478 +-0.143659 1.581384 0.186036 -7.495810 6.453617 -17.765280 -0.986510 -2.028461 -12.905587 -12.970312 1.166472 9.457721 -0.602859 0.255636 -0.088477 0.409610 0.092206 0.264427 12.007066 6.980643 6.232749 20.594732 -6.836505 45.949673 -0.262479 0.144549 0.119619 0.081127 0.153874 0.064547 2.632933 3.205266 10.285327 -4.560654 4.972835 12.574561 -7.589255 6.307287 12.560180 -3.681509 -1.032625 11.141140 15.622170 -6.963575 -14.742293 5.639156 1.985555 -2.895957 -6.700336 -4.034534 -1.208667 25.352171 -23.627840 -6.154997 0.188470 -0.361756 0.773928 -1.396793 0.603253 1.190646 3.956604 -2.464126 -1.092180 3.573009 -2.528329 0.078660 -0.366740 0.322445 -0.251896 +-0.143561 1.585771 0.181061 -7.891331 5.616909 -16.707088 -1.038863 -1.802781 -12.918028 -11.334343 0.765626 7.155252 -0.563200 0.216995 -0.084229 0.447742 0.145252 0.285479 12.216041 6.825730 5.474120 20.164080 -6.483178 45.036446 -0.273089 0.111050 0.121525 0.095101 0.124934 0.087404 2.341167 3.530588 10.308640 -3.887582 5.052749 12.077816 -6.654142 6.223885 11.990242 -2.464138 -1.317241 10.427986 14.437721 -6.324741 -13.786943 4.690553 2.173807 -3.396336 -9.275579 -6.174442 -1.186380 22.296011 -25.873808 -6.119763 0.196593 -0.287739 0.729604 -1.544602 0.495562 0.648046 7.137653 -1.726215 -1.438157 3.776860 -4.089069 -0.020733 -0.361225 0.253950 -0.204654 +-0.142153 1.589587 0.175036 -8.382668 5.219317 -15.597998 -1.532654 -1.802671 -13.185382 -9.114792 0.383747 5.110231 -0.550915 0.200093 -0.096390 0.479667 0.183914 0.326947 12.052597 6.470433 4.705566 20.159279 -6.414818 43.695225 -0.290919 0.085088 0.115604 0.107265 0.084800 0.121962 2.162014 3.718744 10.174959 -3.101935 4.942400 11.654117 -5.554317 6.049561 11.634850 -0.930983 -1.712035 10.194112 12.484281 -5.139941 -13.407394 2.641463 1.490197 -4.106717 -11.139167 -7.997139 -1.177489 18.854153 -26.704941 -5.618512 0.187962 -0.247050 0.712372 -1.719518 0.568603 0.357677 10.001715 -1.212972 -1.662145 4.643026 -5.751441 -0.138964 -0.365632 0.212493 -0.169808 +-0.140380 1.593287 0.166995 -9.027204 4.744779 -14.548042 -1.834996 -1.733656 -13.647279 -6.889219 0.114915 3.309836 -0.524321 0.135803 -0.085273 0.553670 0.280203 0.406310 11.977673 6.048143 3.933865 20.365271 -6.431501 42.296783 -0.331244 0.085103 0.126267 0.143234 0.024844 0.131496 1.957164 3.846817 10.438134 -2.151007 4.837667 11.290313 -4.242143 5.805895 11.173327 0.496606 -2.232753 9.864738 10.426703 -3.796636 -13.983381 0.913270 1.353712 -5.223752 -14.701874 -10.597493 -1.279086 15.743221 -26.208647 -4.987829 0.222932 -0.226788 0.704068 -2.448790 -0.074496 -0.085176 14.311878 -1.080026 -2.129186 3.667845 -4.527225 -0.033735 -0.359982 0.167045 -0.132422 +-0.138404 1.596462 0.158957 -9.776383 4.059186 -13.215046 -1.823263 -1.599085 -14.620114 -4.978984 -0.023326 1.825259 -0.529056 0.102689 -0.093614 0.604510 0.347831 0.471339 12.011581 5.687165 2.887980 20.592323 -6.407331 40.697468 -0.358858 0.087499 0.127645 0.175376 -0.020692 0.138435 2.239821 3.759958 10.046341 -1.569953 4.691078 10.848043 -3.491640 5.583406 10.962569 1.769138 -2.739426 9.969313 8.666273 -2.647504 -14.892704 -1.436027 1.036598 -6.581644 -17.266937 -12.685010 -1.299336 12.923602 -25.313492 -4.355545 0.233338 -0.229518 0.706753 -1.956451 -0.521411 -1.048034 18.555513 0.041602 -2.587674 1.968000 -3.485270 0.080998 -0.366786 0.150112 -0.113797 +-0.136592 1.599174 0.151080 -10.123203 2.627091 -12.215950 -1.639940 -1.305538 -15.035771 -3.632050 -0.074025 0.244632 -0.534666 0.068475 -0.135518 0.653835 0.406840 0.544688 11.738663 5.458891 2.501002 20.946465 -6.356446 39.155716 -0.397137 0.095535 0.097983 0.195685 -0.101240 0.171619 1.958084 3.950155 9.993382 -0.962064 4.607348 10.527426 -2.480434 5.447578 10.744049 2.818562 -3.179649 10.169446 6.974784 -1.446680 -16.642561 -3.630328 0.799495 -7.603771 -20.407801 -13.888970 -1.456517 10.679452 -25.084690 -4.031521 0.245982 -0.205878 0.723671 -1.488651 -0.430521 -1.875865 22.543802 1.385357 -2.937092 1.078595 -2.840028 0.137294 -0.361989 0.138753 -0.073214 +-0.135083 1.600857 0.144188 -9.921177 0.429309 -11.025945 -1.522462 -1.031967 -15.446438 -2.604009 -0.066624 -1.350608 -0.555501 0.070501 -0.159216 0.671909 0.421145 0.586737 11.004803 5.515843 1.924380 21.285566 -6.297642 38.132904 -0.417411 0.086992 0.081938 0.203967 -0.137504 0.195586 0.761206 4.727621 9.494501 -0.323004 4.765357 10.057901 -1.034976 5.567124 10.391333 4.051054 -3.483506 10.728874 5.551555 -0.387897 -17.001297 -5.892351 -0.022687 -8.610061 -23.867548 -15.246643 -1.548837 8.653895 -23.296774 -3.633492 0.236323 -0.202818 0.742190 -0.240737 -0.049205 -2.362751 25.758085 2.082410 -3.302260 -0.158863 -2.434607 0.179976 -0.372734 0.132387 -0.065850 +-0.133370 1.601738 0.136224 -9.872581 -1.958033 -10.419094 -0.974630 -0.763192 -15.773066 -2.127169 -0.062394 -2.083020 -0.560238 0.034634 -0.186074 0.720761 0.474156 0.653326 10.591419 5.524019 1.835879 21.385736 -6.156803 37.283363 -0.453897 0.104719 0.068437 0.220656 -0.200710 0.214201 0.246868 5.133430 9.404133 0.160709 4.869890 9.934151 -0.075491 5.603343 10.382166 4.942047 -3.348382 11.450862 4.746633 0.889198 -18.371925 -8.541239 -1.717255 -8.951467 -26.295155 -15.325187 -1.916689 7.033906 -22.497637 -3.423249 0.259060 -0.195746 0.771228 1.956504 1.080357 -2.437992 27.462528 2.755091 -3.295211 1.043740 -0.479981 0.071965 -0.369953 0.129946 -0.040088 +-0.131377 1.600938 0.127307 -9.647944 -4.717923 -9.603690 -0.181527 -0.592949 -16.732410 -1.922405 -0.060226 -2.180478 -0.573406 0.038840 -0.196856 0.735534 0.484681 0.678446 10.065540 5.806950 1.165645 21.006548 -5.907564 37.174519 -0.467924 0.109972 0.061205 0.226874 -0.214063 0.225854 0.004381 5.561260 9.440401 0.346306 5.146581 9.712429 0.378251 5.841915 10.135528 5.383222 -2.770237 11.409024 4.639002 1.752362 -19.222498 -10.953382 -3.305969 -9.397245 -28.514326 -15.637279 -2.164821 5.665021 -21.511124 -3.250450 0.255333 -0.198069 0.789267 4.930441 1.781448 -2.727591 28.419796 3.227601 -3.387752 2.119611 1.880615 -0.043422 -0.377108 0.135304 -0.039138 +-0.128887 1.599503 0.116906 -9.435866 -8.336448 -9.044202 1.072722 -0.350759 -17.867008 -1.701352 -0.055423 -1.565981 -0.570078 0.044278 -0.202251 0.739645 0.484156 0.699613 9.642530 6.390440 0.401400 20.297215 -5.556819 37.873341 -0.471934 0.105642 0.053451 0.223669 -0.227152 0.241272 -0.511208 6.070325 9.962725 0.767912 5.388580 9.476942 1.170743 6.043721 9.625716 5.392399 -2.009586 11.325860 3.590637 2.672496 -19.259977 -13.122442 -4.297865 -9.679485 -31.407284 -15.839343 -2.294109 4.222370 -20.115103 -3.025065 0.243795 -0.190079 0.785190 6.907000 2.738156 -3.273437 29.183681 4.394856 -3.306818 3.386668 3.407023 -0.105924 -0.373941 0.129223 -0.029048 +-0.125459 1.596927 0.107509 -9.579888 -12.482688 -8.710219 3.218583 0.164389 -18.823792 -2.294463 -0.039032 -0.200836 -0.598475 0.079064 -0.198656 0.732407 0.456978 0.723299 9.919378 7.204762 -0.242160 19.012878 -4.946747 39.071743 -0.475799 0.115121 0.048912 0.220032 -0.218750 0.240670 -0.197150 6.413641 10.692559 1.198683 5.700399 9.260411 1.581454 6.399115 9.084744 4.879220 -0.716920 11.851513 2.745705 3.679646 -19.395247 -14.985984 -5.263210 -9.868348 -34.493706 -16.091789 -2.213836 2.355788 -18.341587 -2.734648 0.228040 -0.232483 0.813469 8.582987 3.859685 -4.011241 30.194662 5.973421 -3.219791 5.035597 4.872182 -0.108568 -0.381901 0.153516 -0.057304 +-0.122777 1.593364 0.097888 -9.621915 -16.257168 -8.492223 5.581728 0.548239 -20.448727 -3.441711 0.032108 2.765704 -0.649798 0.130821 -0.215174 0.719918 0.422466 0.749807 10.243298 7.870256 -0.881705 17.446238 -4.341547 40.453072 -0.475809 0.117225 0.036306 0.219003 -0.215250 0.248608 -0.015302 6.352480 11.665519 1.357820 5.650978 9.115265 1.721152 6.421092 8.623117 4.457086 0.846030 12.155046 1.287119 5.082987 -20.030216 -17.033148 -6.029000 -10.108616 -36.442879 -16.019316 -2.198514 0.349033 -17.851665 -2.506887 0.191687 -0.277205 0.846225 10.546683 5.033948 -5.614567 31.639616 8.637599 -3.017914 5.724503 4.252343 -0.080797 -0.403582 0.184758 -0.088853 +-0.119298 1.590476 0.089459 -9.481879 -19.985016 -8.062796 7.796534 0.922420 -22.435055 -4.939568 0.209307 6.174063 -0.666812 0.146424 -0.223765 0.715919 0.420337 0.742581 10.370801 8.495475 -1.841652 15.481376 -3.582494 41.885983 -0.477879 0.133934 0.034691 0.222963 -0.202073 0.244527 0.551531 6.038683 12.324843 1.319908 5.570701 8.872602 1.483746 6.370450 8.112102 2.867787 3.224009 13.106088 1.354752 5.982525 -20.309654 -17.359308 -6.610505 -9.838503 -39.501263 -15.943443 -2.191265 -0.601712 -17.903221 -2.519135 0.184742 -0.308019 0.863673 12.392279 6.264670 -7.094346 34.072922 11.061261 -2.913743 5.914622 3.737904 -0.079236 -0.407806 0.217524 -0.100409 +-0.114489 1.587427 0.081975 -9.274545 -23.175203 -7.785938 10.007998 1.131527 -24.849091 -7.023811 0.599764 11.149457 -0.670079 0.126128 -0.241967 0.755516 0.456824 0.790589 10.364804 8.819472 -2.587156 13.743673 -2.977644 42.937664 -0.504013 0.154947 0.017147 0.238442 -0.243901 0.249530 1.156577 5.539341 13.141547 1.230909 5.455766 8.570706 1.167110 6.250221 7.549374 1.922059 5.131760 14.335105 0.781624 7.218653 -20.829351 -18.412113 -7.918836 -9.608155 -42.011936 -16.222061 -2.262578 -0.726578 -18.261301 -2.653229 0.212447 -0.302836 0.886735 13.953840 7.823244 -8.118277 36.925816 13.004215 -2.746341 5.865743 3.119009 -0.091559 -0.395417 0.217486 -0.086116 +-0.108896 1.585175 0.074137 -8.762495 -25.924629 -7.754950 12.031774 1.131276 -27.485889 -9.645499 1.328093 17.197067 -0.687709 0.119248 -0.266042 0.790041 0.496253 0.813684 9.943075 9.045139 -3.406051 12.187231 -2.537788 44.153786 -0.521947 0.165835 0.006951 0.262374 -0.262313 0.254600 1.589427 5.226251 13.705013 1.158972 5.452733 8.432469 0.979250 6.246717 7.334709 1.036815 6.983210 15.751721 0.984053 8.138221 -21.077276 -19.032856 -10.142715 -9.630461 -44.503723 -17.551111 -1.831762 -1.091477 -17.844158 -2.690248 0.223094 -0.304052 0.905518 16.070225 9.397329 -8.833432 38.891705 14.483012 -2.578414 5.835265 2.930105 -0.111479 -0.401666 0.223817 -0.077578 +-0.102291 1.584762 0.066295 -7.816001 -28.115036 -8.147283 13.419366 0.693598 -29.869659 -12.206682 2.305882 23.625994 -0.696405 0.056317 -0.297852 0.873517 0.614997 0.858728 8.771408 9.046077 -4.187751 11.085727 -2.365952 45.094135 -0.574014 0.196291 -0.001958 0.317981 -0.319456 0.255461 1.554944 5.041385 14.371879 1.189048 5.416692 8.521784 1.147369 6.143015 7.442298 -0.194363 8.499720 17.237143 0.886822 8.808413 -22.982040 -19.039608 -12.887521 -9.880662 -47.570629 -19.674337 -0.998168 -1.062973 -16.635492 -2.707341 0.277885 -0.302164 0.934549 17.732674 11.242092 -9.265613 40.413792 15.682255 -2.383039 6.131542 3.302848 -0.129522 -0.402671 0.227531 -0.042700 +-0.096361 1.585719 0.060169 -6.691835 -30.089706 -8.750011 14.670211 0.031095 -31.673883 -14.979071 3.596771 29.695944 -0.718236 0.024334 -0.335466 0.932299 0.690109 0.911402 7.233939 8.810682 -4.688260 10.272268 -2.388019 45.652504 -0.609610 0.214794 -0.014848 0.356029 -0.372964 0.264123 1.305026 4.891948 14.583576 1.154468 5.291867 8.657742 1.334564 5.993772 7.777369 -0.631232 9.540623 18.960327 0.130144 9.759798 -24.206102 -19.518185 -15.832146 -10.050529 -49.407986 -21.665363 -0.200329 -1.556772 -16.551971 -2.694484 0.300610 -0.307333 0.961227 19.362965 13.120638 -9.314664 41.827682 16.515898 -2.339788 6.624511 4.969577 -0.176897 -0.410893 0.233801 -0.019914 +-0.091084 1.587793 0.055731 -5.477449 -32.075066 -9.677759 15.671294 -0.764595 -32.850010 -17.560083 5.196311 35.689594 -0.738064 0.006293 -0.366415 0.974487 0.741309 0.969742 5.625000 8.470283 -4.934976 9.352080 -2.374818 46.169750 -0.639899 0.225438 -0.028207 0.380821 -0.420701 0.278680 0.932556 4.851438 14.410307 1.086872 5.197838 8.903420 1.533651 5.888756 8.391475 -0.234748 10.003583 20.866310 -1.149614 10.969938 -25.009699 -20.286894 -18.609407 -10.178786 -50.358410 -23.728495 0.546397 -2.814398 -17.875938 -2.616239 0.304100 -0.318012 0.982428 20.621862 14.892151 -9.138578 43.287216 17.228731 -2.406753 7.340977 7.993001 -0.253480 -0.419112 0.238936 -0.002798 +-0.085057 1.592329 0.050931 -4.275481 -34.218761 -10.699747 16.894588 -1.436849 -33.462967 -20.510601 7.126741 40.893337 -0.768753 0.000108 -0.398985 0.997171 0.765775 1.027212 4.422439 8.145576 -5.102117 7.808385 -1.992654 46.386856 -0.658558 0.243981 -0.047508 0.397433 -0.464001 0.280237 0.548574 4.702779 14.729568 0.978264 5.056152 9.099132 1.566480 5.795266 8.751904 0.091444 10.723618 22.479464 -2.354585 12.248425 -26.003216 -21.443880 -21.453941 -10.138045 -50.662258 -25.681345 1.116512 -3.489121 -19.547783 -2.630942 0.300990 -0.345499 1.008927 22.205805 16.651075 -9.074614 43.962494 18.337772 -2.364227 8.833105 11.021660 -0.203839 -0.423237 0.258786 -0.003379 +-0.078346 1.599664 0.046437 -1.882970 -36.433475 -12.618097 16.977129 -2.366022 -33.195255 -23.068577 9.127148 45.066254 -0.826644 0.006783 -0.446866 1.016415 0.779554 1.082392 2.403907 7.729887 -4.978648 5.499464 -1.208755 46.202560 -0.680634 0.256667 -0.071243 0.415049 -0.514808 0.288189 -0.894960 5.008406 14.773674 0.728998 4.814317 9.539832 1.880666 5.625733 9.502871 0.481985 11.132852 24.406157 -3.963163 13.447228 -27.493416 -21.919958 -24.452873 -9.874481 -50.519382 -27.605021 1.394769 -3.481914 -22.680683 -2.919984 0.293171 -0.381413 1.057725 23.551392 19.155375 -8.678759 44.427933 19.475800 -2.534384 10.078039 14.917957 -0.136241 -0.443249 0.286654 -0.014468 +-0.071652 1.607935 0.042837 0.238823 -39.238861 -14.378939 17.246164 -2.741065 -32.197899 -25.600136 11.241257 48.281536 -0.828927 -0.003474 -0.459932 1.046581 0.800791 1.133092 0.858499 7.428174 -4.730891 3.079095 -0.211007 45.367607 -0.697090 0.261287 -0.081477 0.423085 -0.556403 0.300455 -1.830559 5.288857 14.921275 0.611014 4.816435 9.875745 2.063020 5.651507 9.983761 0.213365 11.375553 25.710402 -5.501446 14.038312 -27.795765 -22.714998 -26.952948 -9.265451 -49.609154 -29.469955 1.793366 -5.268327 -26.537363 -2.625034 0.303896 -0.376783 1.066818 24.831026 21.618864 -8.144290 43.932644 20.646214 -2.517233 12.358344 18.527437 0.213746 -0.438089 0.275954 0.001273 +-0.064304 1.616068 0.039404 1.876936 -41.408436 -15.453056 17.315481 -3.309673 -31.762228 -27.458036 13.012508 51.162342 -0.853230 0.017257 -0.470488 1.040103 0.791094 1.137349 -0.158021 6.884166 -4.704592 0.910457 0.515511 44.064404 -0.694193 0.252056 -0.086085 0.427463 -0.553359 0.303073 -2.211656 5.232605 14.399217 0.448939 4.656695 10.410739 2.072017 5.548632 10.922960 0.120679 12.149110 26.049734 -6.363546 14.769971 -28.047478 -21.885748 -28.814566 -8.885612 -49.217857 -31.430677 2.167693 -6.195895 -32.240715 -2.587411 0.283281 -0.386881 1.072084 25.270052 23.226330 -8.199663 44.350948 22.273361 -2.195814 15.428885 21.894342 0.860539 -0.452317 0.280859 -0.011759 +-0.056314 1.624918 0.036065 3.008605 -43.793907 -16.128222 17.358213 -3.807299 -31.181992 -28.127312 14.355082 54.328346 -0.875380 0.030412 -0.478622 1.045152 0.801579 1.140562 -0.503042 6.345408 -4.653802 -1.238565 1.208363 42.467804 -0.696775 0.241634 -0.084501 0.439878 -0.545771 0.308435 -1.805209 4.923957 13.687533 0.194250 4.627897 11.082767 1.639677 5.581228 12.179871 0.086009 13.153048 25.982771 -7.032184 15.516168 -28.798433 -20.668625 -30.623541 -8.528894 -48.476280 -33.652847 2.571884 -6.499969 -39.004627 -2.637658 0.265644 -0.395420 1.076154 25.220594 24.555351 -8.555973 45.347664 24.207422 -1.781312 18.345381 25.557941 1.650612 -0.470212 0.284291 -0.019050 +-0.047591 1.634810 0.032969 4.000474 -46.216972 -16.110279 17.041389 -4.012347 -30.829884 -27.407703 15.105681 57.414116 -0.887821 0.055647 -0.475868 1.036110 0.781297 1.144281 -0.706903 5.986824 -5.174107 -3.264966 1.854724 40.227932 -0.678233 0.208492 -0.083553 0.442425 -0.537517 0.310133 -1.355690 4.766460 12.246209 0.064123 4.615983 11.587502 1.463282 5.535231 13.488696 0.044245 13.203000 25.498465 -8.423624 15.900200 -28.055286 -19.438356 -31.717064 -8.047983 -47.874111 -35.727654 3.130935 -5.793884 -45.148911 -2.987562 0.240502 -0.379545 1.054626 24.315844 26.448877 -8.999475 46.777725 26.329975 -0.899163 20.277107 27.449997 2.255914 -0.482816 0.254171 -0.031246 +-0.039194 1.644537 0.030353 4.618347 -47.894962 -15.853466 15.937125 -4.265170 -30.084673 -25.190874 14.861521 60.253738 -0.912246 0.125652 -0.456237 1.006235 0.737047 1.116181 -0.879146 5.668768 -5.506497 -4.686450 2.204998 37.523163 -0.653045 0.161770 -0.074532 0.440689 -0.471368 0.322588 -0.624978 4.708740 10.677910 0.049026 4.637609 12.178946 1.260018 5.524060 14.939481 0.318657 13.213214 24.626966 -8.532291 16.065853 -26.863483 -17.165804 -32.795708 -7.951488 -47.850529 -38.542503 4.630060 -4.767030 -50.241539 -3.444657 0.179878 -0.383156 1.032963 22.603704 27.744493 -9.898866 47.679058 28.825258 0.351815 22.340576 29.293272 3.080029 -0.514913 0.238386 -0.062805 +-0.031372 1.653947 0.028506 4.788627 -49.274307 -15.089492 14.558990 -4.433570 -29.314163 -22.124289 14.005825 63.133274 -0.924392 0.175187 -0.438430 0.987270 0.716609 1.096602 -0.808694 5.284151 -5.709283 -5.983040 2.418431 33.917595 -0.626072 0.105059 -0.069825 0.452400 -0.421861 0.330248 0.304352 4.579569 8.491406 0.017570 4.591809 12.866518 1.035248 5.328427 16.938099 0.759341 12.989155 23.195707 -9.210006 16.262569 -25.678915 -14.440363 -33.361832 -8.051211 -47.944576 -41.797501 6.582096 -2.172716 -55.054985 -4.706615 0.125628 -0.361458 0.986659 20.547213 28.646639 -11.131923 49.223793 31.833120 1.986602 23.129206 31.748959 3.673123 -0.540090 0.195796 -0.082153 +-0.024065 1.662104 0.027525 4.892838 -50.037384 -14.225322 12.903289 -4.695079 -28.256201 -18.902647 12.606822 65.083183 -0.925088 0.253884 -0.412462 0.926391 0.644968 1.054169 -1.135631 4.860869 -5.757716 -6.393168 2.246193 30.598225 -0.577139 0.020560 -0.068196 0.435293 -0.348041 0.354351 0.982351 4.503106 6.147602 0.095033 4.374615 13.454057 1.047192 4.932051 18.879015 1.807042 12.452356 21.543949 -10.254242 16.826929 -23.443832 -11.566036 -33.395061 -8.345017 -48.071400 -45.383736 9.172027 0.914795 -58.477112 -6.211321 0.032111 -0.325246 0.915370 17.950436 28.770397 -12.194605 50.850979 34.642761 3.826443 24.424410 36.040520 4.733373 -0.563204 0.142196 -0.103941 +-0.017412 1.669361 0.026867 4.567204 -50.538330 -13.126105 11.204014 -4.747783 -26.838512 -15.149994 10.656993 66.579414 -0.955702 0.338249 -0.397941 0.896324 0.602005 1.037689 -1.304852 4.599656 -5.750942 -6.092016 1.940378 27.872324 -0.541907 -0.065016 -0.068236 0.442993 -0.283998 0.381872 1.818287 4.337660 3.753734 0.135362 4.067211 14.070420 0.972161 4.424769 21.120447 2.898300 12.165617 19.755478 -11.424712 17.272381 -22.140577 -7.813501 -32.500191 -9.049336 -48.975452 -48.780499 11.931283 7.332956 -61.042088 -10.123203 -0.059005 -0.298473 0.863049 14.149646 28.324905 -13.783198 53.313660 38.319782 6.839855 24.272905 40.452888 5.504963 -0.606896 0.087924 -0.130276 +-0.011168 1.675229 0.025576 4.297440 -51.116196 -12.040836 9.675473 -4.519208 -24.997295 -11.616341 8.511946 66.435524 -0.962903 0.379689 -0.370564 0.886650 0.604063 1.012242 -1.389569 4.485321 -5.933987 -5.458545 1.680303 25.809126 -0.510909 -0.126777 -0.052937 0.470299 -0.222756 0.380826 2.431949 4.417589 1.790206 0.288639 4.008914 14.463243 1.102686 4.126750 22.880022 3.484895 12.243679 17.819023 -11.681596 17.269367 -21.005154 -4.042046 -31.650074 -9.746116 -50.608727 -51.772160 14.626603 15.499710 -60.727291 -15.139826 -0.112405 -0.276126 0.800831 11.013492 27.429026 -14.641417 54.557671 41.780724 9.835437 22.937544 46.543819 6.112786 -0.636364 0.035755 -0.149238 +-0.005414 1.678984 0.024539 4.361744 -51.434917 -11.054779 7.878354 -3.735228 -23.162697 -7.941105 6.429951 65.177292 -0.949777 0.437757 -0.329240 0.861100 0.597817 0.944796 -1.804626 4.502451 -6.149775 -4.466592 1.429586 23.820765 -0.463412 -0.216011 -0.034420 0.493983 -0.121902 0.390823 2.997385 4.571626 -0.257583 0.370569 4.035855 14.711700 1.023057 3.951723 24.626509 3.914071 12.578932 15.228978 -11.110199 16.875650 -18.752180 -0.743901 -30.664396 -10.028459 -52.518311 -55.049278 18.219839 24.426231 -60.330238 -20.521482 -0.187869 -0.222364 0.699917 8.055830 26.482649 -14.916796 54.994991 46.488121 13.880345 15.687236 53.654606 3.903935 -0.666761 -0.038188 -0.158363 +-0.000172 1.680230 0.024026 3.871042 -52.003544 -9.528176 6.709861 -2.892868 -20.983067 -4.907027 4.673044 62.769791 -0.954610 0.534384 -0.294666 0.822020 0.562186 0.882944 -1.723489 4.555834 -6.583753 -3.497004 1.180878 22.104990 -0.413836 -0.329201 -0.024414 0.506356 -0.010320 0.427512 3.750002 4.468297 -2.291674 0.330457 3.861936 14.705108 0.769654 3.718451 26.160660 4.599025 13.089343 12.731689 -11.231078 17.006748 -16.437872 2.541770 -28.768927 -10.236218 -55.160057 -57.955772 22.532944 33.399292 -59.995354 -26.060850 -0.301763 -0.163693 0.600793 4.048083 25.138454 -15.242782 57.143761 51.430218 19.309547 2.892658 58.712181 -2.700378 -0.714362 -0.116505 -0.171942 +0.005392 1.680276 0.023413 3.245795 -52.347149 -8.080647 5.777129 -2.232229 -18.337067 -2.540280 3.240963 59.102299 -0.965928 0.613875 -0.258828 0.786637 0.532197 0.849030 -1.567415 4.424007 -6.680613 -2.641161 0.928540 19.995281 -0.369216 -0.409351 -0.008863 0.520865 0.082009 0.440413 4.445382 4.289368 -3.820657 0.398321 3.613709 14.689941 0.682775 3.432298 27.302216 4.940606 13.312265 10.404421 -11.891983 17.157036 -14.969582 5.120941 -26.997736 -10.015025 -56.990723 -60.259449 26.320190 43.209087 -60.279366 -32.511528 -0.399214 -0.149394 0.521621 0.246590 24.085421 -15.501101 58.610477 55.349571 24.087618 -9.708085 61.525383 -10.294286 -0.753909 -0.165854 -0.198434 +0.010149 1.678629 0.022622 2.580691 -52.641598 -6.906631 5.184370 -1.621103 -14.734839 -0.888774 2.226668 54.012791 -0.958989 0.669210 -0.238241 0.763504 0.529607 0.816491 -1.240811 4.195116 -6.455062 -2.224697 0.781500 17.749666 -0.338735 -0.486533 -0.007768 0.538846 0.153963 0.468239 5.080504 4.268611 -5.177485 0.521450 3.463481 14.743793 0.583985 3.059003 28.372547 5.678744 13.514594 8.482979 -12.038959 17.624033 -13.800121 7.956075 -25.593958 -9.929939 -56.198639 -63.232788 29.245718 51.822342 -58.840752 -37.121258 -0.487091 -0.106499 0.436747 -2.841308 22.841391 -15.862072 60.078983 58.608681 28.536282 -20.106514 61.781517 -16.742739 -0.780824 -0.222018 -0.197245 +0.015749 1.675964 0.022060 1.446637 -52.762737 -5.367519 5.059177 -1.391165 -10.710621 0.018047 1.433262 47.472149 -0.977717 0.731497 -0.225167 0.720070 0.485519 0.777411 -0.809864 3.966638 -6.352109 -2.113040 0.665520 15.869721 -0.305485 -0.549534 -0.004019 0.538197 0.215648 0.482522 5.767570 3.989911 -6.267773 0.639618 3.058176 14.700214 0.619620 2.579630 28.883720 6.159400 13.960284 7.362110 -12.458116 18.283043 -12.751431 10.052903 -24.351517 -9.480057 -53.699905 -64.759018 29.512980 58.553856 -56.511219 -40.093899 -0.560956 -0.092764 0.394651 -6.371673 21.826117 -16.047449 60.999523 61.296791 32.375477 -28.739771 61.659569 -22.103241 -0.812228 -0.251972 -0.224097 +0.021230 1.672387 0.021870 0.313755 -52.490204 -3.947927 4.938060 -1.299505 -6.705627 0.775312 0.735472 40.713821 -0.969301 0.772447 -0.194572 0.698240 0.467648 0.746544 -0.394179 3.708625 -6.110442 -1.957030 0.565109 14.122602 -0.279853 -0.608436 0.003066 0.544972 0.274963 0.493684 6.583023 3.607448 -7.297063 0.777250 2.633056 14.704673 0.659450 2.071916 29.388580 6.446123 14.108173 6.241909 -12.469319 18.545872 -11.315546 11.498991 -23.173052 -8.540711 -50.360516 -65.460114 28.249987 66.244225 -53.850945 -43.499607 -0.610585 -0.062093 0.339693 -10.072805 20.962786 -16.156094 60.228111 63.554401 34.681648 -37.216831 61.106831 -27.350290 -0.827337 -0.300907 -0.235957 +0.026940 1.669161 0.022387 -1.309960 -50.965702 -2.402592 5.175356 -1.478482 -2.685783 1.809810 -0.111490 33.517467 -0.961846 0.803516 -0.183226 0.676091 0.450051 0.720657 0.021776 3.442335 -5.737654 -1.272760 0.363422 12.778367 -0.264133 -0.651729 0.003701 0.540997 0.309819 0.515863 7.776382 2.774622 -8.128393 0.951592 1.749423 14.789710 0.656776 1.213658 29.835453 6.426330 14.210180 5.425530 -12.987343 18.695934 -10.650862 11.861858 -22.243177 -7.641180 -47.053417 -65.694344 26.514828 71.933510 -51.484486 -45.556492 -0.654173 -0.038133 0.300737 -12.953259 19.873320 -16.167242 58.951290 65.573540 36.233543 -44.506298 60.223156 -31.614584 -0.837967 -0.328028 -0.232760 +0.033442 1.665166 0.022756 -2.831777 -49.371227 -0.856844 5.602200 -1.604262 0.739984 3.104707 -0.801787 26.816574 -0.944391 0.822720 -0.162772 0.665852 0.444867 0.702334 0.268972 3.304372 -5.801988 -0.497117 0.202136 11.966423 -0.246493 -0.682495 0.009563 0.543759 0.344848 0.522821 8.932507 1.857474 -8.854094 1.053901 0.813424 14.744324 0.536229 0.242072 30.082453 6.469250 14.160932 4.716728 -12.887718 18.627659 -9.715234 11.906597 -21.417625 -6.675105 -44.719986 -65.960693 25.528608 77.199326 -49.268978 -47.273605 -0.682575 -0.014174 0.256794 -15.117030 18.801651 -16.190924 58.871418 67.275948 38.253052 -49.385948 58.973614 -34.156399 -0.840701 -0.358036 -0.229551 +0.040883 1.661356 0.022219 -3.789623 -47.718605 0.243229 5.992908 -1.589058 3.621816 3.787888 -1.090564 20.618830 -0.964842 0.858817 -0.154754 0.645432 0.425519 0.680821 0.050851 3.428034 -6.595347 0.510630 0.033225 12.253393 -0.233086 -0.715098 0.009229 0.550480 0.381367 0.525954 9.625408 0.879968 -9.279586 1.091767 -0.226128 14.730681 0.445644 -0.853653 30.219864 6.392773 14.505769 3.931043 -13.087815 18.835524 -9.332656 12.099916 -20.844944 -6.184596 -40.841709 -66.085686 23.457973 80.984131 -47.533329 -48.129200 -0.718396 -0.016723 0.242627 -16.214434 17.959436 -16.351107 59.169277 69.208435 40.529335 -52.380905 57.442654 -35.167660 -0.861407 -0.370403 -0.252081 +0.048134 1.658715 0.021145 -4.114263 -46.526340 0.768420 6.077905 -1.426612 6.019614 4.207882 -1.172302 15.388182 -0.975140 0.885805 -0.149485 0.645791 0.427648 0.698457 -0.542137 3.532210 -7.431653 1.385947 -0.112376 12.560043 -0.226389 -0.739483 0.003196 0.564623 0.395839 0.535510 9.543374 0.233090 -9.648150 1.246564 -0.986023 14.809028 0.725695 -1.763279 30.628012 6.600634 14.256324 3.307508 -13.710839 18.911345 -9.298841 12.732289 -19.973492 -6.519726 -38.631401 -67.696899 23.152399 80.889015 -45.741447 -46.305912 -0.753440 -0.017552 0.219062 -17.137726 16.946499 -16.522482 59.544132 70.997849 42.608353 -55.432217 55.552082 -36.067253 -0.873225 -0.388853 -0.257990 +0.055340 1.657464 0.020759 -4.566462 -45.609764 1.454927 6.405031 -1.199720 7.733717 4.191383 -1.094135 11.088933 -0.992532 0.917020 -0.145568 0.636329 0.416415 0.697439 -0.942615 3.576872 -8.171201 2.072731 -0.253487 12.510178 -0.216528 -0.763465 0.004822 0.570931 0.418819 0.542791 9.632628 -0.336958 -9.938972 1.325083 -1.658846 14.787740 0.885473 -2.586810 30.807547 6.838702 14.095219 2.803681 -14.081438 18.978403 -9.149955 12.765807 -19.520563 -6.676977 -36.691902 -68.672310 22.575163 80.770302 -44.505062 -44.939026 -0.789069 -0.023248 0.205625 -17.390558 16.595470 -16.580105 61.515057 72.139572 45.213779 -56.794827 53.990479 -36.097549 -0.893428 -0.397582 -0.270697 +0.061823 1.657421 0.020226 -4.448292 -45.172607 1.775614 6.603162 -0.842956 8.960481 3.519059 -0.881249 7.358668 -1.002064 0.928626 -0.132967 0.648525 0.432218 0.700545 -1.366270 3.568439 -8.801847 2.040270 -0.265983 12.231169 -0.217740 -0.772941 0.017745 0.587647 0.440070 0.540895 9.359339 -0.615042 -10.195879 1.330779 -1.990932 14.762650 0.993268 -3.045335 30.958542 7.037008 13.999804 2.575595 -13.990031 18.902618 -9.162629 12.861414 -19.338072 -6.997868 -36.704880 -69.690643 23.087234 79.349464 -43.535240 -43.198849 -0.798091 -0.034187 0.201807 -16.809072 16.337109 -16.476202 63.666771 72.694939 47.586052 -57.554092 53.302601 -36.181171 -0.909447 -0.403617 -0.280776 +0.069315 1.658577 0.020420 -4.524076 -45.471512 2.415572 6.684500 -0.525990 9.548419 2.799656 -0.689551 4.551904 -0.998985 0.917826 -0.125861 0.647533 0.435453 0.706568 -1.552945 3.579619 -9.558947 1.619832 -0.219466 11.813200 -0.221203 -0.750366 0.023462 0.587641 0.438556 0.524521 9.622713 -0.744724 -10.239721 1.259315 -2.083407 14.659130 0.779097 -3.142443 30.788919 7.092689 13.957775 2.779118 -13.979992 18.911421 -9.485190 12.599025 -19.564396 -7.049825 -37.936455 -69.937202 23.966663 78.551476 -43.408169 -42.624744 -0.784627 -0.061749 0.212402 -16.565708 16.180525 -16.328308 65.363434 72.428841 48.807285 -58.076004 53.666645 -36.776566 -0.900515 -0.383453 -0.289668 +0.076758 1.661002 0.020701 -4.128090 -45.772118 2.760961 6.582593 -0.288415 9.202554 1.806580 -0.502180 3.280814 -1.007232 0.934264 -0.125298 0.618597 0.400284 0.699762 -1.928900 3.487741 -10.127186 0.726737 -0.150823 10.941847 -0.214101 -0.738840 0.025129 0.568147 0.448070 0.520274 9.418840 -0.749399 -10.224453 1.178980 -2.105778 14.525285 0.775315 -3.132056 30.578533 7.119805 13.919209 2.932585 -14.344238 19.053808 -9.693613 12.580996 -20.104471 -7.008117 -41.190720 -69.969582 25.981901 78.363060 -43.288658 -42.714020 -0.801493 -0.093635 0.223122 -16.251534 16.404156 -16.139996 67.353638 71.347771 49.360287 -58.352673 54.922142 -37.832985 -0.901637 -0.353418 -0.304566 +0.084481 1.663012 0.022346 -4.153297 -46.296391 3.781082 6.706800 -0.174174 8.164332 0.664245 -0.338887 2.763365 -0.968317 0.904292 -0.121538 0.613074 0.398732 0.685733 -2.018538 3.354179 -10.796198 -0.126673 -0.113046 9.494903 -0.217796 -0.735774 0.029467 0.544810 0.431228 0.531432 9.976312 -0.604007 -10.213030 1.122508 -1.857118 14.020645 0.699111 -2.880503 29.795309 6.919830 13.569256 3.437332 -14.687613 19.020651 -9.391164 12.138350 -20.374187 -6.631380 -48.149910 -69.667625 30.390884 77.630547 -43.134418 -42.613262 -0.782190 -0.067446 0.212994 -15.813344 16.263140 -15.958813 70.225433 69.319916 49.998711 -56.459789 57.044991 -37.963970 -0.879355 -0.360009 -0.274940 +0.092828 1.664948 0.023470 -3.928795 -46.267166 4.502756 6.428177 -0.230351 6.592460 0.199388 -0.289583 3.161477 -0.936374 0.874512 -0.119686 0.626233 0.424233 0.686618 -2.211951 3.086046 -11.023399 -1.190971 -0.081117 7.473042 -0.226323 -0.730708 0.036597 0.541421 0.414474 0.540792 10.648317 -0.454686 -10.119455 1.047008 -1.567978 13.704820 0.487235 -2.615505 29.267078 6.617688 13.330579 3.289179 -15.048615 18.882923 -9.547975 11.276918 -20.780516 -6.425837 -53.815285 -69.043030 33.721661 77.028404 -43.968567 -43.241825 -0.766231 -0.046558 0.197844 -14.653196 16.206802 -15.984611 71.905121 67.237083 49.336391 -53.345303 59.163342 -37.195278 -0.865278 -0.367869 -0.244182 +0.099870 1.666099 0.024730 -3.136998 -46.390316 4.714163 5.770554 -0.289849 4.999285 -0.387645 -0.227076 3.891324 -0.933112 0.862783 -0.114195 0.628699 0.422997 0.684465 -2.971613 2.695870 -11.014588 -1.807122 -0.127723 5.261276 -0.230353 -0.710394 0.043340 0.536817 0.410120 0.528214 10.550545 -0.095100 -10.051905 0.981614 -1.129025 13.418004 0.567488 -2.125025 28.658171 6.289466 13.210185 3.521309 -14.803766 18.554222 -9.669437 10.998502 -21.039623 -6.738458 -60.729252 -67.804482 37.449417 73.295395 -45.765530 -42.805649 -0.743066 -0.061895 0.214802 -12.756871 16.009085 -15.728785 72.112259 64.787239 47.309265 -49.490715 62.374615 -36.256721 -0.857743 -0.352462 -0.248829 +0.106090 1.666301 0.026731 -3.135434 -46.986843 5.377173 5.519662 -0.344492 3.658340 -1.161456 -0.143338 4.655225 -0.925148 0.801436 -0.138361 0.680590 0.482693 0.714220 -3.008521 2.466415 -10.979682 -2.571390 -0.128521 3.314441 -0.258659 -0.674429 0.033636 0.555778 0.347898 0.518019 11.077219 0.304370 -9.943113 0.911144 -0.610080 13.158225 0.347211 -1.585290 28.096113 5.962961 13.161081 4.155705 -14.352313 18.135397 -10.577666 10.876793 -20.990904 -7.267356 -67.501236 -66.295486 41.076885 68.054977 -48.515629 -41.867592 -0.674972 -0.044893 0.243331 -11.143422 15.545979 -15.801326 74.072563 62.349815 46.512150 -42.419422 64.815987 -32.580124 -0.838154 -0.351920 -0.220728 +0.112873 1.665753 0.028751 -3.017461 -47.034439 5.605857 5.282553 -0.456198 2.190993 -2.010683 -0.033410 6.026423 -0.915196 0.757858 -0.156570 0.691256 0.499767 0.715842 -3.337122 2.261250 -10.816745 -2.958837 -0.162566 1.978839 -0.277146 -0.634447 0.021719 0.550111 0.306414 0.506944 11.473438 0.529531 -9.672609 0.867118 -0.299386 13.043264 0.141956 -1.211992 27.429104 5.563430 13.129786 4.750746 -13.919151 17.716015 -11.302094 10.442020 -21.725042 -7.825304 -70.046265 -64.170631 40.751312 61.536026 -51.899170 -40.211170 -0.625531 -0.050168 0.273576 -9.282664 15.843668 -15.935754 73.889618 59.597332 43.284920 -31.042006 66.623177 -25.413580 -0.813509 -0.325952 -0.205116 +0.118637 1.664638 0.030244 -2.495398 -47.147263 5.546171 4.835598 -0.621972 0.556280 -3.121597 0.136987 7.777357 -0.902756 0.724637 -0.162514 0.685891 0.477446 0.721941 -4.096847 2.062710 -10.849076 -3.036463 -0.223883 0.992493 -0.287030 -0.588382 0.025372 0.518753 0.268736 0.493044 10.841722 0.522071 -9.321322 0.820394 -0.269371 12.876479 0.374337 -1.066074 26.485256 5.411653 13.156612 5.820654 -13.811643 17.776464 -11.664165 9.143945 -22.260668 -8.141236 -71.421997 -61.269115 38.767235 52.778831 -55.450920 -36.906933 -0.577676 -0.068979 0.317975 -7.361797 16.529169 -15.911528 73.812050 56.629707 39.688011 -17.302402 66.768982 -16.052586 -0.788626 -0.290607 -0.202831 +0.124011 1.662777 0.031547 -2.037565 -47.591949 5.415448 4.425879 -0.777078 -0.847201 -4.249456 0.337114 9.440880 -0.870760 0.671123 -0.169189 0.701285 0.482105 0.756035 -4.823535 1.944576 -11.127158 -2.877724 -0.268732 0.464964 -0.312754 -0.533135 0.023128 0.490767 0.208162 0.489862 9.686991 0.588235 -8.906542 0.920222 -0.218365 12.797845 1.038319 -0.995882 25.654694 5.434700 13.081088 7.084601 -14.084243 18.010908 -12.444237 8.137945 -22.453556 -8.675416 -72.790688 -58.218048 36.405453 41.390324 -58.006191 -31.138683 -0.518763 -0.078089 0.357650 -5.290864 17.223194 -15.896435 73.718361 53.580341 35.691223 -4.735802 64.801926 -7.590811 -0.749722 -0.261426 -0.177602 +0.130096 1.659657 0.032719 -1.599194 -47.615776 5.253868 3.936767 -1.008868 -2.273592 -5.255167 0.526702 11.173540 -0.851527 0.635296 -0.185302 0.696868 0.462706 0.779299 -5.782530 1.960593 -11.972582 -2.454888 -0.311167 1.149524 -0.338580 -0.489529 0.008743 0.451783 0.151036 0.500010 8.859654 0.416725 -8.360505 0.804848 -0.362835 12.657328 1.248595 -1.040597 24.621264 5.756118 13.107388 8.471386 -14.608809 18.523249 -13.256151 6.587135 -22.331894 -9.380278 -73.134293 -54.735966 33.103741 25.748184 -59.487988 -21.907495 -0.477792 -0.088404 0.405408 -3.620882 17.437044 -15.965688 75.112976 50.245583 32.040432 4.919071 60.777485 -1.837394 -0.716589 -0.226837 -0.157760 +0.136895 1.657153 0.033570 -1.525289 -47.352985 5.126395 3.498406 -1.336019 -3.517449 -5.589904 0.605295 12.880898 -0.828691 0.581504 -0.203737 0.686710 0.438279 0.810218 -6.341760 2.069883 -12.976401 -2.222594 -0.323506 2.569576 -0.357989 -0.428830 -0.001878 0.407752 0.076783 0.490936 8.293534 0.167247 -7.535941 0.813224 -0.585301 12.614116 1.447310 -1.184873 23.521425 6.062837 12.816745 10.041477 -15.351942 19.024492 -14.077400 4.619469 -23.113411 -10.017073 -71.529678 -51.379025 28.599667 9.291545 -58.586708 -11.682631 -0.422995 -0.112413 0.456453 -1.405983 18.109829 -15.732746 75.129906 46.434978 26.554586 11.080467 55.365620 0.890533 -0.672955 -0.181828 -0.142557 +0.143409 1.654045 0.035122 -1.447079 -46.619080 4.938597 3.089744 -1.707319 -4.562463 -5.856625 0.634827 14.411160 -0.803689 0.507842 -0.225091 0.696737 0.439189 0.852775 -6.788385 2.186548 -14.049139 -2.263346 -0.310509 4.552628 -0.389089 -0.356415 -0.008081 0.373815 -0.013550 0.478248 7.550427 -0.055913 -6.542283 1.055175 -0.835115 12.460199 2.099762 -1.391689 22.169083 6.373212 12.262589 11.831697 -16.036974 19.438776 -15.308483 3.124183 -23.787521 -10.731968 -70.668320 -48.315071 24.936066 -4.240743 -54.479362 -3.715521 -0.347205 -0.138050 0.518078 0.825440 18.053167 -15.458365 73.993095 42.185501 20.460098 15.609978 49.038227 2.242805 -0.627372 -0.135274 -0.121289 +0.149504 1.650182 0.037975 -1.462948 -45.454746 4.639722 2.957660 -2.082984 -5.279097 -6.165030 0.662631 15.945303 -0.782841 0.452228 -0.240743 0.694971 0.431214 0.870824 -7.284422 2.383875 -15.323796 -2.195810 -0.283828 7.683669 -0.409062 -0.299442 -0.011424 0.340246 -0.074252 0.466708 7.297747 -0.380790 -5.377279 1.294026 -1.106823 12.253443 2.448102 -1.498439 20.760929 6.308159 12.052160 13.019371 -16.238274 19.555813 -16.028206 0.244249 -25.022518 -10.924192 -68.617348 -45.258114 20.819571 -12.157901 -48.528503 0.207338 -0.290110 -0.160529 0.565281 3.037800 18.043905 -15.088104 71.273048 38.630581 15.268636 18.606468 43.471981 2.859676 -0.591329 -0.092149 -0.105031 +0.155486 1.646147 0.040603 -0.822508 -44.121681 3.669883 2.339354 -2.453251 -5.646589 -6.323235 0.658684 17.178185 -0.759197 0.389478 -0.259234 0.707116 0.443091 0.906007 -8.247067 2.518270 -16.659801 -2.202044 -0.232734 11.352078 -0.438053 -0.231460 -0.017038 0.314520 -0.143345 0.456366 6.283695 -0.651374 -4.055777 1.563119 -1.439776 12.040371 3.027382 -1.720565 19.457281 6.342428 11.837945 14.719854 -16.451115 19.658819 -17.063297 -3.105852 -25.975866 -10.878946 -66.261627 -42.296741 17.122465 -15.560457 -41.139008 1.300100 -0.230875 -0.190231 0.612396 5.240134 18.377724 -15.069351 68.336533 35.998730 11.358818 17.344297 35.477619 1.663156 -0.552998 -0.042976 -0.080218 +0.162589 1.641218 0.043963 -0.526689 -42.156631 3.096961 2.019501 -2.971795 -6.533850 -6.615857 0.680378 19.104445 -0.717315 0.334283 -0.259876 0.722446 0.454819 0.922395 -9.328238 2.684754 -18.373388 -1.465240 -0.298387 15.719181 -0.465424 -0.184207 -0.020246 0.289746 -0.193480 0.456953 5.969747 -0.987428 -2.639379 1.985360 -1.768169 11.528676 3.659006 -1.982298 17.828646 6.043072 11.164267 15.978730 -16.159763 19.152830 -17.022165 -6.791176 -26.318186 -10.280845 -64.828995 -39.297459 14.182349 -15.830262 -34.086334 0.930048 -0.168277 -0.189893 0.641259 7.056951 18.279985 -14.689896 65.005257 33.120468 7.947034 15.165175 28.456213 0.616273 -0.511617 -0.022493 -0.048137 +0.171212 1.636750 0.047639 -0.405854 -39.236660 2.653123 1.838215 -3.724790 -7.803119 -6.759108 0.645287 21.660698 -0.686228 0.278868 -0.257977 0.739851 0.471171 0.930936 -10.780169 2.609465 -19.950228 0.197283 -0.670253 20.128645 -0.483128 -0.129328 -0.012439 0.273504 -0.231067 0.437368 6.007480 -1.486705 -1.083374 2.573779 -2.254842 10.880698 4.430285 -2.424507 16.082211 5.199182 10.519214 17.099606 -15.341762 18.158955 -16.820065 -9.979325 -26.385277 -9.282495 -63.947819 -36.175777 11.363956 -13.223333 -28.615065 -0.279286 -0.102524 -0.205485 0.670263 8.847895 18.030476 -14.134006 61.200119 30.162346 5.056910 12.578066 21.769110 -0.101112 -0.478289 0.007417 -0.027782 +0.179873 1.631587 0.051656 -0.280909 -36.441559 2.200913 1.793572 -4.434504 -9.069856 -7.343200 0.723441 24.051542 -0.681959 0.247340 -0.263224 0.749371 0.470826 0.936671 -11.802122 2.483657 -21.586304 1.182879 -1.073035 24.508240 -0.496593 -0.087906 -0.011062 0.262516 -0.263968 0.420173 6.108651 -1.907411 0.472202 3.176996 -2.695463 10.254608 5.211618 -2.795543 14.492119 4.370212 10.061915 17.801533 -14.890090 17.281948 -16.884142 -12.154376 -25.205059 -8.618223 -63.741871 -33.114552 9.065126 -10.763738 -24.465286 -1.145176 -0.049799 -0.226170 0.710272 9.630290 16.706665 -13.765465 58.390163 27.449877 2.976409 9.903769 16.152252 -0.518547 -0.459651 0.035538 -0.026320 +0.188174 1.624521 0.056985 -0.430604 -34.172382 2.031970 2.178449 -4.988667 -10.145332 -8.686339 1.057935 26.239075 -0.649058 0.222042 -0.264935 0.732481 0.443080 0.932907 -12.446044 2.401036 -24.001551 1.969040 -1.600069 29.910732 -0.497606 -0.064112 -0.015886 0.224122 -0.293268 0.423610 6.627773 -2.420562 1.985492 3.635797 -3.087609 9.539906 5.610117 -3.091744 12.832644 3.872123 9.503442 17.847464 -15.232028 16.768122 -16.546968 -14.318172 -23.482506 -8.115184 -62.692909 -30.076515 7.002473 -9.019322 -20.322674 -1.478949 -0.023655 -0.218934 0.717353 9.636743 14.672241 -13.277026 57.031883 24.705708 1.119607 6.524127 12.321244 -0.924001 -0.427650 0.049968 -0.003955 +0.195609 1.617922 0.061400 -0.294029 -32.319698 1.308927 2.233769 -5.468419 -10.732575 -9.758977 1.383542 28.208796 -0.639850 0.192414 -0.275345 0.729107 0.431405 0.932727 -12.930139 2.362654 -26.414808 2.450257 -2.076389 35.690922 -0.501605 -0.029591 -0.020603 0.205311 -0.326625 0.409433 6.761763 -2.790942 3.965942 4.064402 -3.414850 8.906984 5.857875 -3.305818 11.231076 3.319335 9.235732 18.173372 -14.940285 16.087576 -16.600031 -16.075827 -22.279053 -7.568247 -60.280659 -26.863106 4.939161 -7.828651 -16.717510 -1.536998 0.017585 -0.228632 0.744063 9.730667 13.081980 -12.630844 55.004684 22.089293 -0.635053 3.349969 9.671106 -1.134834 -0.404504 0.074015 0.002507 +0.202246 1.612545 0.065991 -0.332635 -31.351137 0.433412 2.455002 -5.541077 -10.571746 -11.059589 1.861845 29.440784 -0.622424 0.139985 -0.273872 0.751526 0.465420 0.928432 -12.774965 2.737276 -28.874720 2.585881 -2.354895 41.719025 -0.516569 0.016297 -0.012289 0.210724 -0.352087 0.380525 7.165047 -2.848556 6.114282 4.568718 -3.356800 8.417006 6.010482 -3.167976 9.858669 2.086951 9.485168 18.477165 -14.131598 15.180103 -17.124079 -16.677940 -20.562317 -7.400714 -58.572071 -24.247978 3.575681 -6.228309 -13.320272 -1.565023 0.081132 -0.242995 0.767215 9.835015 10.827761 -12.255850 52.176533 19.710264 -1.849759 1.285018 6.732428 -1.015553 -0.381530 0.097441 0.012278 +0.208729 1.609017 0.070348 -0.464211 -30.660666 -0.433510 2.673152 -5.482160 -10.041775 -12.319407 2.337566 30.229118 -0.607982 0.110005 -0.265406 0.757847 0.476723 0.913260 -12.021896 3.301222 -31.189882 2.236186 -2.369417 46.975021 -0.521024 0.044332 -0.001557 0.210049 -0.359058 0.357662 7.702997 -2.979056 8.228499 5.045257 -3.318313 8.036686 6.023520 -3.031139 8.680167 1.071115 9.656452 18.589230 -13.518010 14.430027 -17.097666 -17.382322 -19.095917 -7.240079 -56.243767 -21.826435 2.470163 -4.387517 -9.405055 -1.462072 0.124652 -0.254522 0.780898 9.550178 8.885822 -11.754519 49.023010 17.470602 -2.685491 -0.111989 4.112675 -0.775527 -0.365014 0.112732 0.012349 +0.216400 1.608298 0.074810 -0.622758 -29.786985 -1.884700 2.283099 -5.567119 -8.806602 -12.604412 2.436697 31.018452 -0.603511 0.087460 -0.276855 0.772165 0.482783 0.923314 -10.980488 3.771713 -32.316219 2.067063 -2.423262 50.997051 -0.540236 0.074081 -0.005267 0.198972 -0.389428 0.360868 8.342907 -3.351641 10.840002 5.625210 -3.525408 7.821380 5.869770 -3.069598 7.649729 0.650808 9.776376 19.321848 -13.334396 14.028391 -17.694664 -18.402843 -18.589746 -6.502235 -52.590324 -18.987827 1.140892 -3.023208 -6.905797 -1.348025 0.161266 -0.261033 0.815077 8.239124 8.055065 -10.758518 46.048599 15.254581 -3.208683 -1.091520 1.592966 -0.432053 -0.351876 0.134838 0.025966 +0.224246 1.609083 0.079252 -0.490471 -28.952196 -3.469056 1.336498 -5.674159 -7.503947 -12.487623 2.377238 31.576254 -0.596319 0.073967 -0.277076 0.758839 0.470597 0.898235 -9.953231 4.158872 -33.392475 2.160884 -2.563747 54.342800 -0.536870 0.094891 -0.000763 0.185013 -0.389990 0.347134 9.092764 -3.841287 13.144320 5.987845 -3.720496 7.830401 5.483124 -3.105277 6.963216 -0.112324 9.898744 19.384218 -12.884274 13.345969 -17.692638 -18.561357 -17.824627 -5.743066 -49.085014 -16.278885 0.096327 -2.032188 -5.323343 -1.237794 0.181732 -0.273470 0.825958 6.876943 7.121930 -9.678952 43.083279 13.109707 -3.523948 -1.373094 -0.261948 -0.142213 -0.341089 0.158238 0.026091 +0.230682 1.609353 0.085431 -0.436278 -28.071491 -4.969201 0.564327 -5.590859 -5.618447 -12.296007 2.287382 31.611900 -0.565054 0.050457 -0.265725 0.755624 0.464298 0.898159 -8.714998 4.598945 -34.485455 2.890420 -3.011736 57.040359 -0.541519 0.113503 0.004481 0.163393 -0.405349 0.346940 9.493400 -4.334207 14.952873 6.371686 -4.018046 8.027009 5.421814 -3.286953 6.647909 -0.553955 9.605702 19.111580 -13.468595 12.933849 -17.908739 -18.282885 -16.424681 -5.016461 -46.259041 -13.834525 -0.800706 -0.769497 -4.524465 -1.174586 0.207089 -0.271248 0.826546 4.821727 5.719222 -8.709655 40.986530 11.095417 -3.899732 -1.788374 -0.786228 -0.011765 -0.316219 0.165213 0.043130 +0.237127 1.609427 0.093231 -0.599318 -26.723270 -6.319501 -0.155460 -5.561653 -3.512523 -11.891955 2.065704 31.452616 -0.538269 0.041541 -0.243085 0.716924 0.426200 0.867524 -7.456089 4.688745 -35.087532 3.938494 -3.794292 58.905201 -0.526702 0.127627 0.022362 0.131843 -0.390833 0.330828 10.296645 -5.149209 16.233130 6.656473 -4.409945 8.239621 5.156730 -3.526691 6.387286 -0.570579 9.342257 18.528896 -13.786405 12.824283 -17.583708 -17.849489 -15.090571 -4.014165 -43.565063 -11.130394 -1.708556 0.092901 -5.203298 -1.189002 0.212801 -0.291262 0.820949 2.206859 4.128012 -7.481816 39.591293 8.789874 -4.320118 -2.130549 -1.229685 0.122741 -0.297240 0.185543 0.034605 +0.242440 1.610427 0.101389 -0.562326 -25.331175 -7.786211 -0.613432 -5.551534 -1.416547 -12.094377 2.014982 31.220966 -0.499184 0.023347 -0.223791 0.705707 0.412276 0.854163 -6.194920 4.618425 -34.851822 5.294713 -4.694408 59.146061 -0.520166 0.133804 0.034584 0.107697 -0.391482 0.329902 10.691087 -5.883470 17.202353 6.916006 -4.840452 8.608887 5.060363 -3.826022 6.436947 -0.904841 8.898948 17.676657 -14.208172 12.424594 -17.389872 -17.126730 -13.202976 -3.379419 -41.052414 -8.985575 -2.369873 0.805703 -6.117474 -1.214441 0.228904 -0.273964 0.804441 -0.019672 2.095010 -6.690527 37.759525 6.905876 -4.687798 -2.427107 -1.176888 0.173994 -0.274443 0.179563 0.050153 +0.247474 1.608704 0.111796 -0.578539 -24.154449 -8.219872 -0.936901 -5.625724 -0.386215 -12.527210 2.088716 31.182953 -0.476140 0.074208 -0.178591 0.613041 0.305861 0.767077 -4.966709 4.493724 -35.246143 6.582835 -5.580624 58.713428 -0.466109 0.098409 0.059476 0.054857 -0.307502 0.320888 11.781857 -6.691152 16.796028 6.743843 -4.985833 8.706001 4.526690 -3.830220 6.383439 -0.946302 8.488519 16.003040 -14.010287 12.272089 -15.017850 -15.380864 -10.442210 -3.030805 -39.234646 -7.211109 -2.810589 0.887141 -7.536844 -1.274202 0.177573 -0.277170 0.763268 -2.506689 -0.986564 -6.003316 36.653732 4.884170 -5.199180 -2.806210 -0.854854 0.191117 -0.273786 0.178352 0.015746 +0.252133 1.607020 0.121936 -0.845942 -23.051422 -8.161213 -0.904110 -5.684957 0.332777 -12.910088 2.163808 30.980381 -0.438464 0.122539 -0.125445 0.528355 0.206529 0.692907 -3.388099 4.560627 -35.916801 7.811176 -6.331916 57.676292 -0.407796 0.055356 0.081446 0.005881 -0.220031 0.312005 13.469209 -7.611569 15.729387 6.333099 -4.948132 8.774063 3.580273 -3.743841 6.513893 -0.684379 8.281332 14.177424 -13.361083 12.441552 -12.034737 -13.373982 -7.861249 -2.796458 -37.001450 -5.968611 -2.966073 0.532695 -8.605954 -1.245934 0.122792 -0.260270 0.702529 -4.601079 -4.041925 -5.429029 34.989899 3.055854 -5.526484 -2.762016 -0.647165 0.180077 -0.265609 0.155190 -0.012598 +0.256329 1.607496 0.130513 -0.492865 -21.974169 -8.878628 -1.755484 -5.656342 1.673065 -13.018961 2.060964 30.379522 -0.421478 0.130250 -0.113707 0.496773 0.176204 0.653664 -1.826518 4.584180 -35.582439 8.616173 -6.525876 55.293709 -0.388612 0.034379 0.086310 -0.012125 -0.196096 0.314364 14.121047 -8.179625 15.231941 5.962939 -5.075099 9.090343 2.881322 -3.822383 6.937631 -0.516674 7.900000 13.028169 -13.183979 12.294391 -11.394678 -11.631428 -5.815143 -2.591468 -34.481136 -4.834396 -3.098848 0.822594 -9.827442 -1.268793 0.107955 -0.237085 0.678499 -6.267289 -6.337465 -4.952190 33.279041 1.446446 -5.851942 -3.306091 -0.368326 0.194454 -0.262062 0.141217 -0.013978 +0.261050 1.608964 0.139651 -0.057939 -21.055170 -9.571999 -2.886122 -5.544180 3.153148 -12.934644 1.891727 29.578020 -0.412060 0.138143 -0.101730 0.454554 0.137933 0.606298 -0.317278 4.589125 -34.905312 9.536028 -6.574341 51.857410 -0.360851 0.023379 0.094021 -0.029845 -0.165000 0.298523 14.652732 -8.598117 14.889610 5.710014 -5.161633 9.303292 2.307444 -3.819375 7.148376 -0.597643 7.818739 11.919141 -12.729535 12.113002 -10.746063 -10.211658 -3.756370 -2.287253 -32.548527 -3.450843 -3.383921 1.534482 -12.660777 -1.446682 0.093359 -0.232053 0.657011 -7.820265 -8.597324 -4.433678 31.078848 -0.233092 -6.131640 -4.103442 0.337223 0.192112 -0.258543 0.141679 -0.028994 +0.265390 1.610737 0.149358 0.547250 -20.791794 -10.104798 -4.250825 -5.331938 4.437512 -12.598433 1.676266 28.740479 -0.377824 0.138285 -0.083122 0.451326 0.134770 0.595281 1.284515 4.800222 -34.150448 9.944191 -6.175338 47.906193 -0.350290 0.013477 0.100568 -0.039561 -0.146735 0.306231 14.986228 -8.768910 13.744876 5.339252 -5.169948 9.657063 1.799087 -3.818850 7.960788 -0.735208 7.466435 11.453094 -12.274807 11.689947 -9.908114 -8.972543 -1.668569 -2.024903 -30.922911 -2.089892 -3.690157 2.569504 -16.170771 -1.742185 0.086264 -0.203547 0.623112 -8.537683 -10.219733 -3.942464 27.958426 -1.691526 -6.028136 -4.649889 1.120939 0.162565 -0.246776 0.121130 -0.011473 +0.269427 1.613449 0.158963 1.111168 -20.721712 -10.597591 -5.323337 -5.051171 5.654825 -12.650623 1.602666 27.833784 -0.373337 0.137735 -0.080101 0.450876 0.145043 0.576128 2.927732 5.076637 -33.048817 10.019190 -5.563826 43.482086 -0.343068 -0.006288 0.106813 -0.031474 -0.133714 0.308576 15.360828 -8.868272 12.346582 4.943704 -5.174675 10.111707 1.264514 -3.810249 9.094934 -0.790980 7.210672 11.101158 -12.318106 11.479405 -9.616968 -8.512142 0.020960 -1.910882 -28.919224 -0.699997 -3.910028 4.508354 -19.858299 -2.224001 0.078637 -0.184834 0.602361 -8.636541 -11.399323 -3.504835 24.468323 -2.963563 -5.644667 -4.946243 2.094256 0.113133 -0.253664 0.103060 -0.007111 +0.273239 1.614856 0.168223 1.940500 -20.586254 -11.312677 -6.426261 -4.807467 6.713341 -12.886385 1.595654 27.183458 -0.388482 0.137314 -0.097859 0.474284 0.167181 0.592241 4.363337 5.281616 -31.531485 9.498982 -4.702773 38.913509 -0.354493 -0.015034 0.097754 -0.017952 -0.153497 0.324411 14.890881 -8.579691 11.180299 4.772084 -5.225480 10.589808 1.320994 -3.811161 10.285958 -0.719606 6.772636 10.976127 -12.714890 11.198711 -10.499669 -7.627407 1.131515 -1.896130 -26.921474 0.094818 -3.812617 4.908077 -21.464312 -2.376128 0.080281 -0.166699 0.609572 -8.907653 -12.397421 -2.952041 21.458557 -4.484044 -5.297880 -5.691669 3.622358 0.060142 -0.265758 0.091516 0.005371 +0.277331 1.616617 0.176720 2.936355 -20.234690 -12.423692 -7.440042 -4.702025 7.723317 -13.639215 1.719158 27.088367 -0.347704 0.095099 -0.102163 0.512793 0.227143 0.597607 5.347136 5.092773 -29.293089 8.973684 -3.921381 33.949802 -0.381797 -0.017672 0.087484 -0.006805 -0.180232 0.351552 14.379848 -8.491043 10.683340 4.562894 -5.332934 11.013088 1.112489 -3.937561 11.036722 -1.037757 6.677705 10.967283 -12.649622 10.835899 -11.103036 -6.987932 1.553965 -1.552788 -24.450628 0.967897 -3.622825 5.621494 -22.384287 -2.451061 0.110502 -0.113252 0.592223 -8.923377 -12.963563 -2.366295 19.036575 -6.060053 -4.968187 -7.080666 5.788030 -0.049882 -0.244997 0.062701 0.057483 +0.281990 1.618314 0.185649 3.935950 -19.975906 -13.470344 -8.446548 -4.634501 8.534697 -14.544182 1.914137 27.118479 -0.368330 0.102974 -0.109190 0.522461 0.231264 0.610248 6.132268 4.886489 -27.054514 8.707843 -3.309890 29.131111 -0.385830 -0.015570 0.085881 0.002317 -0.186278 0.350654 13.767070 -8.363973 10.410259 4.456423 -5.503448 11.377352 1.066760 -4.043948 11.606845 -1.019220 6.530421 11.126109 -12.893304 10.702193 -11.680414 -6.545040 2.362676 -1.647606 -22.355587 1.570636 -3.376001 6.361985 -23.312319 -2.589114 0.111270 -0.124805 0.607171 -9.219361 -13.867187 -2.314639 17.515804 -6.807990 -4.825239 -9.570528 8.131412 -0.262355 -0.255550 0.068049 0.049185 +0.285416 1.617938 0.195422 4.836384 -19.584846 -13.983491 -9.181258 -4.602145 8.742255 -15.764236 2.256252 27.317549 -0.364263 0.098973 -0.114080 0.524402 0.241963 0.611414 7.115177 4.784397 -25.051985 8.157728 -2.640811 24.247156 -0.369422 -0.034754 0.080515 0.016462 -0.188609 0.343461 13.577951 -8.360355 9.505466 4.039819 -5.571687 11.464503 0.603761 -4.196056 12.063858 -0.785430 6.469944 11.022763 -12.940493 10.854214 -10.923961 -6.049020 3.724783 -2.050037 -19.880770 1.785222 -2.904534 6.634498 -23.258251 -2.454856 0.101281 -0.099871 0.574187 -9.214355 -15.139215 -2.807207 16.357065 -6.641982 -4.546820 -12.262469 11.375118 -0.758635 -0.254536 0.038821 0.053301 +0.288199 1.614552 0.205828 5.501999 -18.983150 -14.439883 -9.526916 -4.619923 9.075487 -17.114166 2.643763 27.612015 -0.383382 0.118425 -0.118071 0.527359 0.237103 0.620422 8.220951 4.635503 -22.843214 7.086633 -2.011553 19.550230 -0.373084 -0.041167 0.068217 0.023988 -0.185947 0.347996 13.764063 -8.303839 8.249594 3.652055 -5.576661 11.515009 0.061631 -4.181875 12.611379 -0.784308 6.331825 11.355735 -12.952488 10.665792 -10.932509 -5.263043 4.214811 -2.277065 -18.085043 1.730072 -2.537141 7.269808 -21.614712 -2.338888 0.094018 -0.105807 0.583146 -9.826147 -15.958713 -2.538904 14.973099 -7.633942 -4.311548 -13.660276 13.513130 -1.072121 -0.261758 0.037211 0.043573 +0.289813 1.610123 0.215935 6.283154 -18.216482 -14.890548 -9.775269 -4.668155 9.329054 -18.781454 3.175642 28.114075 -0.426747 0.158274 -0.117378 0.497460 0.195447 0.604459 8.982586 4.369207 -20.865597 5.802435 -1.512558 15.464101 -0.351822 -0.051487 0.070512 0.026505 -0.155678 0.326259 13.721465 -8.177870 7.020720 3.148574 -5.588692 11.484209 -0.528861 -4.155729 13.007775 -0.489836 6.371715 11.586772 -12.680111 10.763273 -10.295225 -4.610948 4.227846 -2.313578 -15.632827 1.728900 -1.975727 6.438355 -19.454004 -1.931612 0.067972 -0.143481 0.595944 -10.162242 -16.445547 -2.153110 13.438474 -8.816807 -4.008043 -14.461402 15.041906 -1.281716 -0.284887 0.052048 -0.004271 +0.290917 1.604496 0.226965 7.097708 -17.129730 -15.166535 -10.192272 -4.887434 9.344821 -20.191957 3.651021 29.180933 -0.438641 0.166236 -0.121271 0.502955 0.200876 0.605682 9.208413 3.916777 -19.096424 4.485482 -1.156900 11.882534 -0.351820 -0.058591 0.067507 0.036081 -0.151244 0.327244 13.243532 -7.911162 5.611916 2.762941 -5.614503 11.341988 -0.716813 -4.195790 13.419870 -0.310467 6.105711 11.929506 -12.333774 10.504126 -10.120347 -3.597796 4.366728 -2.416790 -14.227681 1.358350 -1.645980 5.930559 -17.445934 -1.661576 0.062807 -0.143912 0.596843 -10.614534 -16.990391 -1.703792 11.887816 -10.143188 -3.630639 -14.913715 16.414345 -1.447615 -0.293806 0.047669 -0.008381 +0.292072 1.598377 0.236661 7.712016 -16.004322 -15.367332 -9.978834 -5.258921 9.100378 -22.357061 4.474709 30.670122 -0.439226 0.163222 -0.127360 0.515837 0.220157 0.614076 9.433933 3.647732 -17.869516 2.987871 -0.884409 9.502289 -0.353731 -0.059620 0.066595 0.046321 -0.153594 0.330872 12.700594 -7.501065 4.181870 2.463449 -5.492935 11.347079 -0.698926 -4.101866 14.127007 0.180278 5.501620 12.209055 -11.815372 10.111182 -10.181724 -2.991740 3.895281 -2.436967 -12.062210 0.768945 -1.183762 5.186978 -15.957305 -1.402746 0.056840 -0.137682 0.587971 -10.285512 -17.062813 -0.946763 9.662179 -12.565763 -3.073917 -15.108890 17.430792 -1.512434 -0.299916 0.043413 0.001689 +0.294261 1.592098 0.246146 7.928586 -15.323689 -15.600723 -9.507494 -5.520351 9.085938 -24.409924 5.326041 31.885763 -0.418748 0.143598 -0.127389 0.544133 0.253459 0.623313 9.687757 3.499894 -16.785881 2.257941 -0.765191 8.231608 -0.366577 -0.068417 0.066878 0.053198 -0.165974 0.348757 12.889355 -7.166479 3.435863 2.314208 -5.161880 11.258159 -0.949478 -3.813627 14.326201 0.423360 4.832512 12.311110 -11.469893 9.620566 -10.045501 -2.816773 3.208280 -2.462684 -9.606656 -0.033824 -0.692229 4.037469 -14.369112 -1.091164 0.071214 -0.102609 0.576917 -10.229304 -16.947464 -0.260571 8.100140 -14.890740 -2.723325 -16.018366 16.948727 -1.421360 -0.295525 0.017982 0.031033 +0.297662 1.586325 0.254756 7.621066 -15.152352 -15.471346 -8.689743 -5.592311 8.784302 -26.091894 6.167400 32.777973 -0.413294 0.138755 -0.130253 0.537719 0.240441 0.636119 10.162057 3.676581 -16.570953 2.048931 -0.724808 8.049330 -0.360401 -0.073173 0.065454 0.042731 -0.185027 0.350596 13.919428 -6.928784 2.970354 2.330016 -4.719016 11.087609 -1.257635 -3.377333 14.288998 0.737286 3.976812 12.213526 -12.488499 9.621214 -9.735530 -3.279724 2.527533 -2.471359 -7.528010 -0.460287 -0.368102 3.751970 -13.351898 -0.926309 0.069560 -0.097729 0.569748 -10.915757 -16.559240 0.632193 7.309143 -16.583776 -2.514902 -15.946010 17.225903 -1.356128 -0.289680 0.009369 0.036431 +0.300499 1.581624 0.261898 6.962699 -14.989684 -15.508135 -7.497336 -5.706891 8.641949 -27.402998 6.910899 33.689133 -0.371358 0.115395 -0.110283 0.528690 0.237223 0.632792 10.841223 3.934454 -16.363766 1.802631 -0.675330 8.332833 -0.363488 -0.062381 0.074922 0.023858 -0.188796 0.350292 15.025036 -6.939703 3.109402 2.469576 -4.399085 10.865653 -1.578356 -3.061251 13.812459 1.058936 3.283553 12.595739 -12.710034 9.574748 -8.929901 -3.764917 1.589422 -2.094889 -6.462386 -0.273595 -0.331282 4.513516 -12.293045 -0.873566 0.084254 -0.096655 0.556048 -11.841180 -15.513090 1.390567 6.818652 -17.584158 -2.514080 -16.155731 15.101115 -0.978127 -0.263828 0.008948 0.051259 +0.302486 1.577613 0.267286 6.491487 -14.829825 -15.835049 -6.552793 -5.816516 8.458082 -28.358418 7.657000 34.973011 -0.372915 0.121387 -0.104146 0.503471 0.201766 0.629694 11.110970 4.290791 -16.501444 1.960814 -0.686886 9.932629 -0.355366 -0.061649 0.072800 0.005496 -0.190679 0.341966 15.290575 -6.979932 4.057720 2.806231 -4.295909 10.784944 -1.417856 -2.904050 13.238360 1.057600 3.013744 12.242680 -13.551327 9.753486 -8.635592 -4.509789 1.248641 -1.870017 -5.954648 0.346884 -0.322251 5.093081 -11.903625 -0.869440 0.083562 -0.109898 0.561624 -12.391376 -14.856591 1.550921 6.546456 -17.175508 -2.510331 -16.208431 13.476451 -0.717783 -0.255446 0.015310 0.036292 +0.303575 1.575660 0.270390 6.154626 -14.599262 -16.164690 -5.958722 -5.901393 8.157969 -28.582342 8.159281 36.367596 -0.385356 0.134096 -0.104726 0.494068 0.179139 0.632590 10.955996 4.573403 -16.777098 2.467204 -0.752147 11.476562 -0.352358 -0.062766 0.071203 -0.003092 -0.192168 0.342820 15.016627 -6.974363 5.258854 3.107051 -4.267134 10.837863 -1.130919 -2.852273 12.783979 1.048166 3.013133 11.610617 -13.959876 9.839225 -8.953155 -4.933079 1.305092 -1.641796 -5.789730 1.094720 -0.259236 4.756566 -11.887771 -0.829942 0.080110 -0.117927 0.575303 -12.431162 -14.316791 1.169260 7.166310 -15.805634 -2.762475 -16.535994 11.977156 -0.559312 -0.259227 0.020501 0.024483 +0.303996 1.575284 0.271468 5.956519 -14.886772 -16.370821 -5.440198 -5.703247 7.768578 -28.623344 8.622466 37.349514 -0.410951 0.141939 -0.105330 0.489458 0.171869 0.643956 10.699032 4.937881 -17.269531 3.223947 -0.833589 13.029739 -0.350202 -0.052367 0.074949 0.001684 -0.192338 0.326486 14.411567 -6.811465 6.490636 3.398232 -4.189300 11.032430 -0.706475 -2.769015 12.572057 0.983689 3.052675 10.958662 -14.582217 9.929221 -9.911330 -4.982390 2.009190 -1.749779 -6.529676 1.506366 -0.310794 4.260210 -11.822192 -0.800182 0.076715 -0.151632 0.592214 -12.734470 -14.029135 0.336070 8.472392 -13.112258 -3.091164 -16.294659 10.798756 -0.490094 -0.269127 0.040172 0.001546 +0.303396 1.574762 0.272427 5.944113 -14.881106 -15.928043 -5.248219 -5.503496 6.842326 -28.397404 8.842651 37.998096 -0.386869 0.138983 -0.101362 0.497581 0.189815 0.641138 10.461244 5.163394 -17.760872 3.605201 -0.835165 13.315157 -0.353035 -0.068152 0.079048 0.004424 -0.189802 0.348745 13.244697 -6.595880 6.948554 3.549035 -4.264536 10.971817 -0.019895 -2.948967 12.360863 1.202444 3.200784 10.330711 -14.881687 10.273718 -9.909054 -4.671034 3.270213 -1.564747 -8.216969 2.574778 -0.524523 3.975395 -13.123779 -0.834314 0.064245 -0.120932 0.565888 -12.930950 -13.512887 -0.862791 9.544818 -9.209775 -3.201771 -15.541133 8.565932 -0.340103 -0.268386 0.018952 0.025468 +0.301992 1.575547 0.272247 6.295666 -14.709862 -15.478904 -5.393034 -5.279015 5.930209 -28.091183 8.973037 38.481190 -0.383452 0.135332 -0.109572 0.490587 0.191550 0.638214 9.881211 5.181289 -18.090767 3.817168 -0.805951 12.824518 -0.354522 -0.069717 0.073610 0.000104 -0.193546 0.356008 11.499378 -6.062536 7.379834 3.723889 -4.253629 10.827986 0.934491 -2.997172 12.078241 1.451505 3.407788 10.225019 -15.201970 10.712162 -10.262547 -4.238020 4.296362 -1.496332 -10.667542 3.197327 -0.954672 3.816173 -14.553652 -0.948335 0.053289 -0.116241 0.559897 -13.048090 -13.251823 -1.829619 11.397662 -6.363200 -3.516469 -14.907276 7.384171 -0.305597 -0.267199 0.023045 0.034216 +0.301313 1.578676 0.271271 6.350891 -14.928918 -14.890300 -5.289638 -4.937490 4.974705 -27.805422 9.049233 38.566460 -0.395173 0.131492 -0.104987 0.500339 0.210715 0.627306 9.820393 5.269256 -18.177876 3.643326 -0.692824 11.978544 -0.353413 -0.058997 0.084513 0.018721 -0.179827 0.335639 10.804163 -5.714648 8.023380 3.906886 -4.057765 10.685299 1.375394 -2.820498 11.649542 0.551024 3.947881 10.107016 -14.591199 10.248961 -10.587710 -3.657234 5.385692 -1.954279 -14.252076 2.915236 -1.586665 3.151838 -13.583187 -0.965609 0.064907 -0.135342 0.565787 -12.736875 -13.191368 -2.810116 12.884055 -3.735859 -3.611952 -13.356699 6.262575 -0.253936 -0.275227 0.034386 0.020984 +0.301116 1.582978 0.270810 6.327734 -14.585902 -14.206551 -5.359306 -4.794890 4.228354 -27.446735 8.884121 38.345341 -0.403796 0.144675 -0.093543 0.486335 0.189070 0.613359 10.063691 5.184845 -18.003691 2.677558 -0.536818 10.488398 -0.347102 -0.037714 0.091176 0.011008 -0.155228 0.316317 10.574171 -5.597697 8.234426 3.888579 -3.978340 10.390518 1.420014 -2.722083 11.111599 -0.030063 4.150172 10.545103 -13.475779 9.625774 -10.296573 -3.357089 5.341727 -1.886962 -17.447842 2.909647 -2.170531 2.385792 -12.101093 -0.976106 0.066998 -0.171386 0.581421 -12.303658 -12.327489 -3.045515 14.666038 -2.607507 -3.861895 -11.567373 5.306784 -0.176175 -0.276049 0.064763 0.000144 +0.300101 1.586024 0.270895 6.282655 -14.564713 -13.151332 -5.057266 -4.493742 3.361610 -27.331770 8.838996 37.856174 -0.413529 0.153356 -0.086789 0.453945 0.159569 0.570760 10.547114 5.120882 -18.025686 1.767877 -0.429431 8.589332 -0.330096 -0.012344 0.101893 0.001757 -0.124825 0.281967 11.215186 -5.700174 7.833645 3.469628 -3.804246 9.886544 0.704192 -2.530436 10.496570 -1.342581 4.722218 11.383420 -12.442162 8.906964 -9.631481 -2.977246 5.110019 -1.654178 -21.442612 3.115887 -2.945143 2.993537 -9.796471 -1.034400 0.070500 -0.217050 0.591587 -11.741857 -11.240360 -3.277771 17.235374 -1.572505 -4.281914 -10.480584 4.944125 -0.185634 -0.275471 0.107696 -0.027396 +0.298989 1.589173 0.269950 6.213161 -14.444826 -12.582776 -4.839992 -4.117995 3.175196 -27.255589 8.754518 37.051910 -0.472215 0.194381 -0.104352 0.446712 0.125084 0.562555 11.089897 4.981045 -17.551100 0.873825 -0.375243 6.679551 -0.315954 0.003167 0.096090 0.006840 -0.108247 0.260152 11.683347 -5.722230 7.984309 3.210825 -3.657197 9.711916 0.065912 -2.289042 10.172665 -2.822268 5.572945 11.675797 -11.301063 8.050905 -10.012334 -3.549395 5.153346 -2.059089 -24.214298 2.908840 -3.370008 3.081029 -8.124423 -1.090686 0.067837 -0.254246 0.632770 -9.875575 -10.795519 -3.909389 18.611870 -0.562996 -4.423255 -9.127356 5.554174 -0.269495 -0.299385 0.142715 -0.067743 +0.297921 1.591083 0.268559 6.409310 -13.855268 -12.294105 -4.982192 -3.781625 3.255327 -27.215187 8.680679 36.401089 -0.515911 0.209961 -0.111730 0.475191 0.140582 0.584925 11.139560 4.701042 -17.125233 0.073008 -0.352894 5.117799 -0.324100 0.020746 0.090645 0.033808 -0.110041 0.243884 11.655437 -5.774844 7.993254 2.855658 -3.654006 9.720996 -0.471523 -2.266027 10.218013 -4.123295 6.122288 11.581326 -10.851723 7.319858 -11.291009 -5.106292 5.339411 -2.666782 -26.000406 2.945770 -3.682779 2.770024 -7.275377 -1.128248 0.085451 -0.283398 0.668822 -6.994681 -10.419511 -4.952926 19.434055 0.639557 -4.452319 -8.093126 6.758753 -0.434333 -0.315212 0.159177 -0.091834 +0.296676 1.592181 0.266441 6.329707 -13.470401 -12.048507 -4.515739 -3.270645 3.596764 -27.524151 8.762982 35.453831 -0.482355 0.159128 -0.118366 0.513468 0.180934 0.590725 11.479113 4.616019 -16.836380 -0.586822 -0.319920 4.161694 -0.344747 0.046808 0.079332 0.038520 -0.148962 0.242711 11.915384 -5.918492 9.243279 2.744793 -3.463031 9.117044 -1.051242 -2.122634 8.834666 -5.584988 6.756280 12.108064 -9.778239 6.594338 -11.531184 -6.142281 5.580660 -2.667313 -28.813879 3.299719 -4.303535 2.492845 -7.248882 -1.153578 0.151138 -0.242555 0.678934 -5.830135 -9.849174 -5.400896 21.912331 1.298590 -4.866356 -7.401746 7.767945 -0.556075 -0.282320 0.145909 -0.056910 +0.295693 1.591726 0.264469 6.269451 -13.174543 -11.172928 -4.097548 -2.774816 3.139869 -27.923309 8.971105 34.833061 -0.462497 0.123015 -0.113173 0.538420 0.218090 0.573582 11.572903 4.729729 -17.521500 -0.722051 -0.308501 3.688889 -0.351855 0.061679 0.088878 0.052708 -0.153924 0.226940 12.591079 -6.001792 9.605393 2.324220 -3.094104 8.426630 -1.950168 -1.864691 7.694792 -6.730220 7.192993 12.420354 -8.505079 5.825611 -11.389704 -7.119482 5.745963 -2.872986 -31.719219 3.185961 -4.805126 3.304205 -6.259524 -1.127030 0.195245 -0.224212 0.678660 -4.336369 -8.992954 -6.098037 24.572191 2.225322 -5.245615 -6.866198 7.011560 -0.562297 -0.271229 0.138055 -0.044087 +0.294774 1.590077 0.261428 6.223991 -12.498484 -10.298424 -3.738692 -2.387608 2.456785 -28.422720 9.300655 34.640659 -0.471048 0.133093 -0.104764 0.543157 0.204161 0.576009 11.427178 4.886093 -18.521704 -0.923525 -0.307686 3.365987 -0.350125 0.073081 0.088644 0.051002 -0.146948 0.214861 12.750919 -5.924517 9.764084 2.100662 -2.863102 7.873507 -2.296029 -1.662908 6.843264 -7.721919 7.261347 12.530271 -7.858998 5.049589 -11.184621 -8.389657 5.700026 -2.899172 -34.569199 3.367752 -5.315777 2.861494 -6.232089 -1.186186 0.213304 -0.233081 0.695718 -2.617242 -7.829601 -6.629254 26.567329 3.030761 -5.472888 -5.868387 6.065035 -0.509718 -0.268240 0.143429 -0.058422 +0.294259 1.587220 0.257322 6.169494 -11.490079 -9.553868 -3.625664 -2.133241 1.639908 -28.428530 9.564796 35.108116 -0.456315 0.112977 -0.110660 0.556463 0.213259 0.581558 10.931311 5.013136 -19.565132 -0.640476 -0.326723 3.132351 -0.359460 0.081784 0.081901 0.044623 -0.169771 0.221769 12.416652 -5.718983 10.065161 2.071599 -2.686715 7.382537 -2.161041 -1.538011 6.068128 -8.210696 7.058396 12.376423 -7.746030 4.617691 -11.547297 -10.153327 5.422749 -2.495363 -37.313187 4.306108 -6.149563 2.542232 -8.065474 -1.385875 0.238332 -0.209056 0.701367 -0.960675 -6.334895 -6.846285 28.344519 3.512999 -5.644332 -4.588552 5.497368 -0.463012 -0.254603 0.136931 -0.038455 +0.292719 1.583540 0.251854 6.346716 -10.079624 -9.171851 -3.698564 -1.993315 1.098098 -28.446646 9.876289 35.914600 -0.451207 0.100593 -0.122999 0.576708 0.231789 0.586925 10.336311 5.082289 -20.482149 -0.636109 -0.323668 3.094872 -0.370836 0.080858 0.070322 0.048905 -0.189061 0.235718 11.830220 -5.489142 10.382275 1.836290 -2.523545 7.158545 -2.233234 -1.432093 5.679388 -8.465545 7.060418 11.915367 -7.303729 4.333837 -12.238037 -12.344754 4.444545 -2.186519 -38.594967 4.894594 -6.635296 0.700253 -10.057399 -1.546314 0.254377 -0.174870 0.705543 1.993550 -4.773497 -7.243268 29.595652 3.768939 -5.750490 -3.320504 4.763573 -0.407473 -0.251150 0.122811 -0.018115 +0.291410 1.580408 0.245864 6.097801 -8.084673 -8.961074 -3.645773 -2.112123 0.746925 -27.999199 9.978824 37.101139 -0.461625 0.093452 -0.134490 0.584979 0.242272 0.595047 9.974692 5.021971 -20.964664 -0.988532 -0.342287 2.615807 -0.374972 0.097665 0.065072 0.055438 -0.202383 0.229859 11.922394 -5.433435 10.880869 1.674691 -2.309173 6.927113 -2.558054 -1.230235 5.207182 -8.500327 6.316292 11.783564 -6.782297 3.529876 -13.271473 -14.868720 2.971324 -2.428028 -39.410912 4.396306 -6.682635 -0.771670 -10.591772 -1.579446 0.264748 -0.185712 0.718039 4.568351 -3.170446 -7.274943 31.154720 3.604027 -5.880287 -2.058068 3.598397 -0.301977 -0.251484 0.138456 -0.016976 +0.290132 1.577297 0.240958 5.655987 -5.207283 -8.880144 -3.534804 -2.506983 0.745981 -27.057346 9.708907 38.250732 -0.457436 0.065780 -0.130228 0.627910 0.292682 0.609451 9.162701 4.725035 -21.163876 -0.882665 -0.368821 1.779833 -0.391600 0.103372 0.069681 0.084727 -0.219092 0.221234 12.332123 -5.633175 11.093179 1.611233 -2.237217 6.666456 -2.870291 -1.225025 4.803767 -8.673305 5.568934 11.918119 -6.087243 2.604244 -13.612399 -17.395287 1.384362 -2.891054 -40.121067 3.354253 -6.523072 -2.168480 -10.411863 -1.529809 0.302995 -0.169408 0.721786 7.278218 -1.809242 -7.262040 32.195698 3.394795 -5.820215 -0.176333 2.703054 -0.238702 -0.251986 0.117321 -0.007714 +0.288126 1.573907 0.236018 5.071200 -1.310085 -8.979477 -3.462275 -3.336172 0.716446 -25.579695 9.125874 39.875916 -0.492643 0.087285 -0.137740 0.617298 0.272974 0.604863 8.105640 4.269726 -21.185204 -0.702254 -0.442023 0.841704 -0.384840 0.106259 0.069463 0.087386 -0.209265 0.208792 12.515598 -6.103667 11.171701 1.573356 -2.628595 6.241263 -3.018596 -1.586869 4.192698 -8.397943 4.472079 12.649495 -5.669162 1.668499 -13.462651 -19.601292 0.114812 -3.444099 -40.997837 2.215185 -6.293734 -3.315649 -10.089608 -1.519195 0.295370 -0.202706 0.742351 9.265132 -0.571831 -7.364284 34.286995 3.681692 -5.850706 1.306664 1.601235 -0.169276 -0.269453 0.138047 -0.033514 +0.286089 1.570423 0.229779 4.519161 2.013033 -8.804413 -3.394229 -3.978602 0.373990 -23.799622 8.386347 41.092442 -0.514966 0.115132 -0.143671 0.596098 0.245459 0.579663 7.000577 4.003871 -21.745338 -0.159948 -0.485320 0.280459 -0.372178 0.103611 0.066446 0.083532 -0.184906 0.202915 12.647942 -6.286822 11.069590 1.561930 -2.801963 5.771015 -3.063146 -1.741449 3.537047 -8.382360 3.646526 13.512518 -4.685461 0.533655 -12.818738 -21.337523 -0.555319 -4.372241 -42.785118 0.400613 -6.014304 -3.957402 -9.570695 -1.536533 0.278947 -0.221616 0.748259 11.084444 0.315532 -7.665232 36.468132 4.319850 -5.811065 2.618415 0.804768 -0.126575 -0.282495 0.155875 -0.051592 +0.282698 1.567471 0.220860 4.339755 5.296126 -8.639063 -3.617352 -4.591505 -0.341889 -21.957815 7.643816 42.464226 -0.505066 0.107336 -0.159795 0.610407 0.263906 0.591155 5.706355 3.739227 -22.587250 -0.090952 -0.500829 0.227994 -0.385572 0.111254 0.050840 0.083885 -0.204308 0.223617 11.834533 -6.071802 11.287779 1.570490 -2.841987 5.399930 -2.697854 -1.820980 3.000845 -8.001896 2.335232 14.489170 -4.157847 -0.487822 -13.120970 -23.117996 -1.308810 -5.490103 -44.473148 -1.976666 -5.616940 -4.536611 -9.536870 -1.556270 0.281131 -0.208150 0.746406 12.868900 1.404231 -8.020859 39.191956 5.215048 -5.776736 3.076337 0.101030 -0.083253 -0.276038 0.158793 -0.022358 +0.279066 1.563656 0.209631 4.410641 8.778469 -8.338996 -4.177017 -5.352042 -1.658212 -20.224306 6.942038 44.196724 -0.535718 0.119804 -0.180802 0.624613 0.269391 0.609464 3.839717 3.319544 -23.641001 0.223997 -0.524266 0.164661 -0.397049 0.108205 0.042280 0.094038 -0.221937 0.235733 10.139997 -5.523827 11.436276 1.734672 -2.940818 5.203216 -1.683958 -1.921312 2.758838 -7.059371 0.565439 15.375489 -4.164672 -1.303845 -13.411613 -24.844503 -2.740470 -6.342815 -46.644436 -4.423630 -5.258162 -4.806755 -10.321457 -1.675398 0.277285 -0.214437 0.768935 14.550628 3.274301 -8.091605 41.522835 6.248281 -5.643144 3.137065 -0.153997 -0.054676 -0.296286 0.163144 -0.024494 +0.275951 1.560912 0.196651 4.221858 12.222312 -7.969398 -4.574879 -6.088915 -3.173878 -18.257891 6.093777 45.741943 -0.570213 0.118552 -0.205769 0.633910 0.272650 0.639866 1.913334 3.026387 -25.046480 0.575317 -0.519392 0.811232 -0.405243 0.130598 0.030969 0.102196 -0.251892 0.227176 9.002395 -5.115981 11.744984 1.919923 -2.989323 5.034914 -0.848791 -1.953063 2.456093 -6.277222 -1.312865 16.256500 -3.939985 -2.269178 -14.331126 -26.406481 -4.466504 -6.793521 -49.275414 -6.716758 -5.002645 -5.024380 -12.097875 -1.867526 0.285072 -0.248475 0.802474 15.311470 5.812951 -7.629855 43.943398 7.164374 -5.528250 3.167697 0.660597 -0.068037 -0.305083 0.190886 -0.035135 +0.271166 1.559062 0.186046 4.329813 15.240598 -7.697303 -4.911915 -6.451137 -4.112158 -16.486551 5.374850 46.628201 -0.605056 0.123380 -0.212928 0.647117 0.281501 0.666244 0.013548 2.800500 -26.351377 0.832223 -0.486264 2.147160 -0.419245 0.161164 0.023121 0.119243 -0.262878 0.206694 7.971820 -4.710463 11.501247 1.787841 -3.014975 5.102662 -0.466259 -1.969558 2.622693 -6.092480 -2.862349 17.486681 -3.411625 -3.446512 -15.150769 -27.364672 -6.139272 -7.003966 -51.347263 -8.929889 -4.592390 -5.766596 -14.325867 -2.017407 0.300741 -0.300162 0.839764 16.131170 8.795153 -7.216225 46.506470 8.447229 -5.371361 2.538527 1.778814 -0.133308 -0.312699 0.224473 -0.058877 +0.266357 1.558170 0.176763 4.469336 18.438759 -7.554540 -5.331704 -6.904976 -4.792204 -14.642678 4.535426 47.446972 -0.618371 0.113436 -0.214892 0.687401 0.323274 0.695304 -2.268661 2.399260 -27.167358 1.772370 -0.456835 3.508718 -0.437950 0.185195 0.020500 0.147397 -0.273279 0.195719 6.751513 -4.332043 11.024366 1.817539 -3.168061 5.341701 0.210218 -2.161468 3.137522 -6.325934 -3.960777 18.357395 -2.367594 -4.660659 -16.102848 -27.928358 -7.870063 -7.119432 -53.491894 -11.318644 -4.021638 -6.836498 -16.664190 -2.095754 0.327490 -0.317331 0.859239 17.375175 11.792508 -6.971258 47.440346 10.014883 -4.880489 2.702505 2.605687 -0.191300 -0.316295 0.233355 -0.059265 +0.262518 1.558551 0.168883 4.535508 21.535776 -7.519525 -5.677888 -7.207882 -5.377047 -12.677802 3.673854 48.068851 -0.656320 0.115019 -0.226504 0.716271 0.359364 0.704910 -4.807043 2.063550 -27.888044 3.103678 -0.505970 5.918813 -0.447647 0.195726 0.025226 0.181959 -0.272186 0.180820 6.133019 -4.163436 9.891955 1.622010 -3.363647 5.872842 0.427960 -2.368970 4.249702 -6.390102 -4.814962 19.150347 -1.610486 -5.565776 -17.028254 -27.707073 -9.734378 -6.959610 -55.536041 -13.697385 -3.317946 -8.666479 -19.988319 -2.044225 0.337919 -0.347150 0.882842 17.414997 14.978840 -6.749334 49.280174 11.872175 -4.524707 2.254881 4.816284 -0.423550 -0.340940 0.248493 -0.074888 +0.257643 1.561281 0.159073 4.696322 23.829775 -7.570925 -5.907414 -7.131886 -5.943677 -11.098533 3.144655 48.323887 -0.666339 0.097057 -0.239882 0.761246 0.430180 0.699197 -7.295033 1.968094 -28.689085 4.835948 -0.610713 8.912459 -0.461944 0.194954 0.024439 0.226890 -0.271691 0.178677 5.566652 -3.804609 9.249895 1.419187 -3.276936 6.583102 0.480642 -2.359561 5.542003 -6.753961 -5.431414 19.576117 -0.345162 -6.672997 -18.085983 -27.361067 -12.277717 -6.614029 -56.936787 -16.366074 -2.489535 -10.271459 -24.236067 -1.913069 0.353874 -0.331155 0.875917 17.754854 18.857485 -6.875865 49.469421 14.636652 -3.550971 2.458959 6.047445 -0.543968 -0.357518 0.237408 -0.057832 +0.251669 1.566445 0.148197 4.844276 25.722618 -7.818984 -6.154426 -6.876193 -6.353540 -9.450631 2.650651 48.336094 -0.672981 0.080640 -0.254259 0.803702 0.502213 0.693764 -9.802073 2.152521 -29.723602 7.316015 -0.910602 13.033252 -0.474850 0.199401 0.024266 0.269082 -0.266669 0.179246 5.129659 -3.366827 9.029748 1.284563 -3.084219 7.361532 0.465062 -2.239733 6.852462 -7.239060 -6.050381 20.090130 0.949662 -7.809561 -19.400423 -26.716757 -15.319329 -6.205644 -57.701885 -19.241638 -1.414664 -12.323476 -28.820805 -1.485177 0.363551 -0.324045 0.865740 17.591602 22.878622 -7.020157 48.983776 17.483776 -2.602768 3.094691 8.183731 -0.684511 -0.371071 0.236891 -0.036156 +0.245121 1.572719 0.139849 4.441242 27.460194 -8.137640 -5.571211 -6.410706 -6.516873 -8.092252 2.286307 47.531002 -0.675214 0.087608 -0.253799 0.827782 0.543276 0.683586 -11.715779 2.656454 -30.708874 9.936842 -1.456143 17.554523 -0.485444 0.183860 0.019519 0.297041 -0.247476 0.193378 5.164411 -3.186732 8.474540 1.143474 -2.992933 8.102832 0.268836 -2.193507 8.180728 -7.285074 -6.809966 20.031612 1.621186 -8.668216 -19.973759 -25.850964 -17.966930 -5.773623 -58.102531 -22.097084 -0.165981 -14.916681 -33.913589 -0.617247 0.356965 -0.308319 0.850025 16.538921 25.997391 -7.274403 48.629860 20.112856 -1.926184 3.994140 12.185192 -0.943659 -0.383326 0.222024 -0.022433 +0.238145 1.581995 0.132948 3.256044 29.063789 -9.155458 -4.263346 -5.738843 -5.939646 -6.523683 1.809567 45.968437 -0.671084 0.064617 -0.262712 0.855866 0.595954 0.669672 -12.887477 3.567952 -30.921839 13.017015 -2.249657 21.916311 -0.492669 0.184214 0.021121 0.325015 -0.246415 0.191221 5.819688 -3.089695 8.592896 1.310256 -2.822544 8.745311 0.045570 -2.052399 9.162944 -7.495933 -7.501566 20.265594 2.902846 -9.537364 -20.967094 -25.429478 -20.671041 -5.166546 -57.896339 -25.034472 1.128080 -16.931236 -39.738041 0.470246 0.371573 -0.289137 0.837893 15.678104 28.474581 -7.579505 47.163280 22.666531 -1.377524 5.270758 16.495649 -1.041277 -0.389334 0.213223 -0.003287 +0.230402 1.592869 0.127271 2.085419 30.759121 -10.160823 -3.242544 -5.104708 -5.097264 -4.353311 1.037138 44.016834 -0.671207 0.061167 -0.265493 0.869985 0.620600 0.648996 -13.886631 4.521673 -30.881811 16.438240 -3.338301 26.047087 -0.487922 0.175094 0.022171 0.344452 -0.230953 0.186936 6.452976 -3.046989 8.438512 1.410854 -2.733289 9.483829 -0.280487 -1.988145 10.343064 -7.657225 -7.926242 20.310543 4.373731 -10.259583 -21.355604 -24.526140 -23.240887 -4.442122 -57.102985 -28.010933 2.449670 -18.336750 -46.795601 1.761278 0.376816 -0.265207 0.823757 14.769696 30.711937 -7.982075 45.514183 25.363480 -0.828398 5.838742 20.116573 -1.104372 -0.396609 0.197824 0.001988 +0.222074 1.604715 0.121840 1.061291 32.598038 -10.967278 -2.461814 -4.708122 -4.387957 -2.097421 0.138652 41.779812 -0.668624 0.066232 -0.263059 0.890615 0.651212 0.635969 -14.800729 5.151631 -30.539011 19.701668 -4.647790 29.593250 -0.493659 0.152623 0.025192 0.365140 -0.213416 0.201603 6.798256 -3.182018 8.022310 1.412541 -2.873770 10.164309 -0.609947 -2.162307 11.538822 -7.301456 -8.453079 20.477814 5.060830 -10.631055 -21.281103 -23.219326 -26.046133 -4.101646 -55.558712 -30.929806 3.858132 -18.512182 -51.258770 2.607941 0.371746 -0.237674 0.807912 13.230483 32.914146 -8.366644 44.366531 27.835798 -0.350682 5.837532 23.977058 -1.295515 -0.410005 0.172704 0.013661 +0.214386 1.617263 0.116738 -0.040830 34.313217 -11.628920 -1.673478 -4.303185 -3.717794 -0.272738 -0.541548 39.043907 -0.685965 0.086447 -0.266125 0.904197 0.670933 0.625360 -15.100551 5.763575 -30.338890 22.089275 -6.028378 33.239742 -0.490705 0.133836 0.024913 0.388916 -0.189638 0.207924 7.654266 -3.481496 7.124373 1.258029 -3.029691 10.991680 -1.254539 -2.294507 13.125048 -7.143106 -8.871862 19.970989 5.773728 -11.021746 -21.883251 -20.821547 -28.345280 -4.319683 -54.832836 -34.347569 5.611211 -15.797197 -55.249847 1.883756 0.356126 -0.227107 0.797248 10.472245 34.357101 -9.389892 44.083149 30.640524 0.378157 5.566575 28.412239 -1.608877 -0.430060 0.160694 0.010856 +0.207233 1.630323 0.111912 -0.926990 35.945194 -12.042765 -1.089631 -4.046011 -3.182861 1.154779 -1.059013 36.375290 -0.726320 0.131717 -0.266789 0.882876 0.653905 0.585654 -15.328492 6.021835 -29.709166 24.265753 -7.479314 36.149906 -0.466941 0.111024 0.029957 0.404861 -0.137648 0.197424 8.484181 -3.707858 6.060759 1.080041 -3.164773 11.800040 -1.876318 -2.343385 14.762287 -7.194626 -9.298961 19.137547 6.506810 -11.665500 -22.415083 -17.928062 -30.181505 -4.954783 -54.551098 -38.053963 7.641475 -9.352050 -57.531986 -1.280784 0.319570 -0.247312 0.788946 7.571458 35.000576 -10.470747 43.392273 33.488678 1.136706 5.233444 33.810329 -1.940118 -0.461675 0.169901 -0.022040 +0.199417 1.642588 0.107683 -1.523354 37.582172 -12.106589 -0.611570 -3.879785 -2.685056 2.126771 -1.410940 33.377792 -0.733239 0.182211 -0.239170 0.870619 0.641316 0.548350 -15.162399 6.003363 -28.972998 25.431137 -8.677767 38.719017 -0.444807 0.074815 0.037785 0.421033 -0.068291 0.197358 8.695419 -3.708487 4.763141 0.921431 -3.203096 12.574789 -2.140428 -2.400179 16.520481 -6.731329 -9.662606 17.750376 7.522861 -12.259892 -22.043783 -14.683785 -31.439707 -6.016951 -53.927593 -41.983082 9.688093 -0.180859 -57.220863 -6.157604 0.282603 -0.235744 0.753213 5.366356 34.975170 -11.412416 41.867855 36.594833 2.093506 4.509552 38.822159 -2.274927 -0.481455 0.145630 -0.043949 +0.192301 1.653763 0.103754 -1.902600 38.971424 -11.598115 -0.258452 -3.666492 -2.409913 2.587248 -1.527363 30.199461 -0.736054 0.227359 -0.212117 0.860992 0.633863 0.510839 -15.075758 5.809106 -28.478971 26.066092 -9.787413 41.197960 -0.418194 0.027713 0.051263 0.435082 -0.002006 0.202367 8.911913 -3.606342 3.203442 0.729307 -3.134586 13.084082 -2.291216 -2.388950 18.104635 -6.328229 -10.260142 16.036341 7.892051 -13.038393 -21.588837 -10.477677 -31.491276 -7.363132 -54.548618 -45.883717 12.365843 8.642369 -56.008240 -10.829762 0.241057 -0.213507 0.704999 2.357427 34.070740 -12.345271 41.152473 39.719810 3.448417 2.151344 44.600342 -3.408776 -0.504541 0.110998 -0.054951 +0.186871 1.663475 0.099743 -2.310689 40.279587 -11.006674 0.100357 -3.499732 -2.295786 2.487200 -1.474953 27.307718 -0.744386 0.272430 -0.183019 0.840567 0.626667 0.461808 -14.897219 5.382519 -27.718615 26.136374 -10.742693 43.419033 -0.377804 -0.030645 0.068254 0.460318 0.069421 0.190501 9.313206 -3.503044 1.506375 0.548280 -2.994091 13.425483 -2.409700 -2.314191 19.640181 -5.704848 -10.987378 14.186208 7.560336 -13.808394 -20.347181 -6.513134 -31.244968 -8.634365 -54.938385 -49.560467 14.906215 16.944607 -53.622711 -14.881430 0.191178 -0.196107 0.638077 -0.985180 33.011467 -12.947491 39.825062 42.177673 4.524916 -2.254645 50.302353 -5.802182 -0.532254 0.067030 -0.077917 +0.180609 1.672342 0.095746 -2.503239 41.375919 -10.348382 0.313622 -3.236461 -2.151685 2.520932 -1.417373 24.281450 -0.759291 0.314480 -0.153257 0.836363 0.640097 0.422754 -14.572427 5.147749 -26.804932 25.770674 -11.338579 45.355209 -0.348792 -0.076431 0.083798 0.497903 0.142219 0.175041 9.530257 -3.335175 0.092881 0.380000 -2.821460 13.801282 -2.498828 -2.203831 21.189375 -5.234855 -11.602422 12.219041 7.642187 -14.588822 -19.976063 -2.457355 -30.242067 -10.026138 -55.791397 -53.192753 17.921051 23.789381 -52.122158 -18.169596 0.150129 -0.190574 0.582111 -3.918231 31.523756 -13.670365 38.664120 44.947613 5.792022 -8.619454 54.821968 -9.548865 -0.561699 0.033013 -0.102164 +0.175228 1.678619 0.092318 -2.534388 41.928226 -9.327371 0.399138 -2.895864 -2.123811 2.440695 -1.301455 21.389631 -0.742432 0.333099 -0.120285 0.845508 0.682946 0.365261 -14.100406 5.117535 -25.721895 24.800455 -11.346853 46.610592 -0.315162 -0.157269 0.101760 0.545211 0.209812 0.171700 9.921843 -2.921320 -1.544459 0.157356 -2.319041 13.918758 -2.748673 -1.888437 22.535528 -4.519524 -12.665752 10.148438 7.236514 -15.656990 -18.376480 1.733468 -28.637024 -11.167365 -57.143940 -57.041912 22.006670 29.470840 -50.953091 -20.705275 0.114865 -0.121885 0.481518 -6.999198 29.707127 -14.125741 38.072811 47.070999 7.218060 -16.802546 57.681587 -14.751307 -0.585693 -0.054971 -0.094647 +0.170380 1.682550 0.089506 -2.648692 42.096210 -8.263953 0.629836 -2.525081 -2.022045 1.749012 -1.041924 18.632061 -0.732197 0.378130 -0.074694 0.830158 0.691727 0.306290 -13.192470 5.209767 -24.292976 23.231970 -10.726810 46.869068 -0.269955 -0.238711 0.123302 0.580649 0.298648 0.163671 10.110391 -2.472841 -3.038821 -0.014700 -1.840771 13.869283 -2.902485 -1.543239 23.565681 -3.540960 -13.477184 7.882901 6.449614 -16.431211 -16.352365 5.223634 -26.780432 -11.762089 -58.829777 -60.872795 26.695683 35.853588 -49.717781 -23.559652 0.057281 -0.078550 0.380397 -9.650103 27.694958 -14.293766 36.838371 49.284142 8.743846 -25.710646 59.587105 -20.479643 -0.611490 -0.129753 -0.108443 +0.165620 1.684861 0.087163 -2.360321 42.547981 -6.863999 0.466906 -2.172605 -1.829564 1.126465 -0.839530 15.524995 -0.769601 0.453560 -0.048732 0.807118 0.675704 0.257755 -12.430118 5.072149 -22.558023 21.572147 -9.887450 46.221214 -0.222039 -0.324161 0.142270 0.614630 0.386305 0.158941 9.576869 -2.186552 -4.422950 -0.180364 -1.668776 13.638829 -2.730791 -1.370388 24.293818 -2.587760 -13.965160 5.836884 5.085770 -16.803114 -14.604775 7.846695 -24.405348 -12.159298 -61.781494 -64.193207 32.301254 40.748821 -47.924335 -25.388180 -0.020840 -0.064476 0.311044 -11.862582 25.530787 -14.400235 35.648048 51.772503 10.497199 -33.838905 59.846287 -25.374178 -0.664033 -0.183772 -0.146645 +0.160099 1.686340 0.085493 -1.814955 42.953789 -5.568084 0.031287 -1.872860 -1.411179 0.596582 -0.703577 12.976329 -0.777980 0.485012 -0.023631 0.792603 0.676827 0.222472 -11.626057 4.741498 -20.150265 19.584585 -8.669704 44.430088 -0.187022 -0.375358 0.157717 0.641319 0.443979 0.142626 8.949219 -1.913196 -5.546807 -0.470347 -1.443075 13.487349 -2.863154 -1.153778 24.905415 -1.644998 -14.329818 4.590631 4.553100 -17.053093 -13.341921 10.106936 -22.558868 -12.292032 -63.396645 -67.226295 37.006577 44.856899 -45.988918 -26.510292 -0.060908 -0.050900 0.252072 -13.562342 23.763559 -13.936574 34.601311 53.841854 11.711248 -43.928200 58.926441 -31.312250 -0.686214 -0.225371 -0.169588 +0.155369 1.687054 0.084405 -1.038251 42.629860 -4.394301 -0.633712 -1.500186 -0.438065 -0.022119 -0.585793 10.348891 -0.752269 0.488227 -0.005131 0.799392 0.688347 0.212396 -10.569515 4.390658 -16.915546 16.835037 -6.841002 41.077587 -0.179123 -0.406784 0.154293 0.650265 0.459344 0.152208 8.221095 -1.580770 -6.471900 -0.710672 -1.146535 13.495934 -3.064167 -0.794146 25.429632 -1.303423 -14.681625 3.763892 4.386237 -17.530979 -12.686896 11.745230 -21.478956 -12.116253 -62.285782 -69.919273 39.350536 48.310139 -44.224766 -27.180784 -0.064499 -0.003519 0.209089 -14.427497 22.758970 -13.160471 31.205866 55.644516 11.563784 -52.172802 57.433857 -35.489258 -0.676917 -0.272461 -0.154745 +0.150705 1.685748 0.084312 -0.290038 42.273487 -3.314117 -1.346378 -1.121383 0.574778 -0.007437 -0.550819 7.692607 -0.771068 0.530366 0.009406 0.789224 0.678371 0.178775 -9.502197 3.825621 -12.976598 14.075216 -4.958249 35.806370 -0.152059 -0.453248 0.161913 0.669011 0.512138 0.148402 7.181945 -1.177414 -7.538620 -0.857186 -0.869071 13.623814 -2.982444 -0.418474 26.178905 -0.767168 -14.661461 2.656714 4.355723 -17.809359 -11.948652 13.751911 -19.806362 -12.209868 -61.211620 -72.682259 41.933270 51.195114 -42.515987 -27.577179 -0.099852 0.016591 0.172632 -14.988359 21.376059 -12.565054 26.983641 57.292175 10.934783 -58.241360 55.737331 -37.933319 -0.702727 -0.306188 -0.176072 +0.145082 1.682891 0.084957 0.605823 41.100864 -2.069208 -1.978783 -0.650863 1.547334 0.012345 -0.480817 4.796735 -0.765250 0.549686 0.017632 0.776435 0.671852 0.139625 -8.139223 3.516699 -9.253458 10.278966 -2.867769 30.162609 -0.136097 -0.492970 0.163875 0.672279 0.544928 0.159414 5.811234 -0.347855 -8.556785 -0.860641 -0.195246 13.614306 -2.621492 0.313664 26.581839 -0.233719 -14.977542 2.000534 4.382761 -18.226637 -11.305650 15.210334 -18.234890 -12.115201 -60.617699 -75.596184 45.058079 53.098255 -40.487617 -27.222111 -0.122294 0.053563 0.137074 -15.074025 20.344606 -11.782967 22.344997 58.349854 9.735992 -62.368271 53.936634 -38.846844 -0.712225 -0.337819 -0.172621 +0.140055 1.678188 0.085436 1.570004 40.213821 -0.763812 -2.444937 -0.305819 1.997408 -0.202848 -0.384317 2.556235 -0.763432 0.599497 0.028844 0.734299 0.617382 0.102421 -7.262449 2.989761 -5.700957 6.758444 -1.382336 24.437973 -0.110707 -0.531431 0.161715 0.649859 0.588326 0.179662 4.196081 0.331002 -9.528341 -0.864063 0.316018 13.452916 -2.092408 0.920868 26.720657 0.351708 -15.286449 1.648702 4.003334 -18.496925 -10.152276 16.044497 -16.629969 -11.759386 -60.653557 -77.979538 48.357933 54.962593 -39.052269 -27.124033 -0.172080 0.071233 0.106281 -14.951234 19.369461 -10.925515 18.468014 59.050404 8.662132 -65.705521 52.258087 -39.281223 -0.721355 -0.351674 -0.179873 +0.134792 1.673906 0.085948 2.543075 38.417313 0.188307 -2.849252 0.078763 2.639567 -0.597739 -0.263363 0.481669 -0.782891 0.644232 0.040970 0.683540 0.554225 0.070443 -6.856147 2.406003 -2.312422 3.704601 -0.399372 18.905346 -0.081107 -0.537342 0.166768 0.630584 0.633238 0.163858 2.970963 1.115824 -10.271321 -1.008731 1.037758 13.559465 -2.018279 1.844362 27.053228 0.690664 -15.294487 1.604647 4.228273 -18.658215 -9.583572 16.504675 -15.130298 -11.630474 -58.156033 -79.718330 48.832214 56.228195 -38.777798 -27.207626 -0.209274 0.036202 0.102754 -14.689356 18.322502 -10.099127 14.392219 59.350132 7.294395 -70.056129 51.601223 -41.053566 -0.731632 -0.328415 -0.218878 +0.129590 1.670679 0.083496 2.702205 36.701839 0.486348 -2.678700 0.306702 2.864173 -1.107628 -0.172925 -0.808694 -0.828277 0.705107 0.035266 0.654131 0.523373 0.043678 -6.154392 1.836419 0.406537 1.431441 0.115053 13.854359 -0.060211 -0.564655 0.165787 0.639485 0.679597 0.167526 3.005822 1.667304 -10.683477 -1.114153 1.600607 13.901406 -2.317943 2.675538 27.748314 0.799350 -15.130547 0.893629 3.781889 -18.618504 -9.551449 16.266733 -13.564447 -11.777896 -54.775467 -81.217941 47.960983 58.047916 -38.559799 -27.637945 -0.266995 0.008268 0.095511 -14.631280 17.046846 -9.877468 10.202535 59.665512 5.718135 -74.244888 51.105705 -42.939346 -0.767504 -0.315106 -0.251355 +0.124521 1.670099 0.080770 2.461706 35.263344 0.139519 -2.206611 0.438580 3.187374 -1.335386 -0.128689 -1.583616 -0.816248 0.700272 0.045012 0.634431 0.509062 0.017517 -5.480972 1.246305 2.747751 0.018858 0.324239 9.648031 -0.051052 -0.548562 0.174625 0.628151 0.697241 0.151840 4.024122 2.058709 -10.749973 -1.356176 2.137061 14.453202 -3.210816 3.475378 28.347219 0.293650 -14.566850 0.815414 4.702866 -18.753145 -9.856362 16.209381 -13.630665 -11.716234 -43.786751 -81.348572 38.521572 59.631126 -39.055981 -28.324064 -0.262782 -0.005497 0.093871 -14.263066 16.940414 -9.636518 5.357641 59.554520 3.299359 -76.598694 50.618366 -43.652618 -0.758523 -0.294897 -0.258568 +0.119559 1.670415 0.078153 2.200115 34.074883 0.206242 -1.639331 0.305574 2.427539 -1.750045 -0.101623 -1.330747 -0.835996 0.736500 0.046488 0.597050 0.454322 -0.014514 -4.746152 0.807878 3.998532 -1.084824 0.383308 6.127007 -0.037535 -0.547111 0.178894 0.603604 0.729274 0.152477 5.311884 2.517585 -10.576951 -1.705931 2.709427 14.624536 -4.301122 4.300492 28.432043 -0.188175 -14.214143 0.843948 5.385569 -19.039980 -10.034118 16.288984 -13.570398 -11.571184 -37.661831 -81.309227 33.572430 61.485229 -39.728085 -29.360188 -0.282154 -0.033810 0.115317 -13.979778 16.668598 -9.179684 3.202501 59.799908 2.375279 -80.272774 50.243973 -45.521988 -0.768399 -0.263099 -0.284966 +0.114635 1.671754 0.076153 1.644520 33.440304 0.253261 -0.925995 0.126036 1.482330 -1.911165 -0.098357 -0.955948 -0.813821 0.729590 0.060691 0.579135 0.431806 -0.022549 -3.619632 0.554533 4.396863 -2.148628 0.452830 4.018525 -0.033604 -0.539301 0.188081 0.580839 0.732228 0.150398 6.368691 2.689648 -10.363791 -1.849836 3.009660 14.549895 -4.934672 4.726927 28.222124 -0.745950 -13.666760 1.106444 5.366399 -18.867844 -9.584204 16.453615 -13.829520 -10.843252 -34.535763 -80.701866 30.749111 64.715393 -40.373333 -31.275719 -0.278773 -0.037142 0.113378 -14.035901 16.653095 -8.824483 2.001298 60.208763 1.997700 -82.096458 49.898731 -46.284203 -0.755234 -0.256565 -0.283784 +0.109932 1.672376 0.075400 1.295010 33.481121 0.521082 -0.324293 -0.038454 0.457881 -2.060845 -0.079292 -0.507485 -0.823459 0.768823 0.068638 0.528464 0.364369 -0.034665 -2.861637 0.395406 4.423781 -2.633402 0.431289 2.594620 -0.007050 -0.549561 0.188721 0.551500 0.755267 0.147824 6.933473 2.812271 -10.289229 -1.887934 3.156713 14.240685 -5.206841 5.012040 27.864391 -1.051928 -13.655925 1.466474 4.331422 -18.791845 -8.415689 16.597418 -13.252803 -10.271108 -36.878922 -80.977745 33.450073 67.122765 -40.310059 -32.465187 -0.319352 -0.065203 0.105016 -14.540864 15.856384 -8.482399 1.997767 60.547745 2.622039 -84.576508 50.054199 -47.953842 -0.757898 -0.240801 -0.308830 +0.104924 1.673126 0.074508 1.196500 33.919628 0.617233 -0.041295 -0.115466 -0.034266 -1.928445 -0.085836 -0.449756 -0.815569 0.776384 0.075136 0.506014 0.325132 -0.026379 -2.398987 0.297562 4.517623 -2.742403 0.401983 1.924661 -0.000041 -0.552527 0.185534 0.525945 0.747547 0.150814 6.901422 2.838551 -10.187568 -1.849278 3.180538 14.128212 -5.088349 5.059543 27.636864 -1.227593 -13.682513 1.796692 3.468035 -18.599436 -7.448743 16.908384 -13.486770 -9.805251 -34.709290 -80.651840 31.541033 68.689369 -40.359444 -33.268707 -0.326670 -0.066251 0.104823 -14.917236 16.137800 -8.020524 1.573260 60.114002 2.577746 -86.773041 50.163651 -49.522564 -0.747943 -0.242738 -0.313466 +0.100428 1.673629 0.074096 1.103975 33.979431 0.673347 0.195685 -0.075464 -0.116285 -1.825712 -0.088740 -0.806052 -0.795450 0.758017 0.076582 0.511727 0.330893 -0.024579 -2.086533 0.226044 4.401073 -2.553589 0.370667 1.487296 -0.000196 -0.561265 0.183746 0.522715 0.731606 0.154432 6.877834 2.899671 -10.189466 -1.852989 3.277582 14.061892 -5.094145 5.133415 27.595903 -1.399282 -13.522391 2.257778 3.224619 -18.447943 -6.748367 17.225178 -13.233134 -9.625971 -33.884827 -80.705353 30.981220 69.179573 -40.153439 -33.357933 -0.313078 -0.034787 0.092228 -15.017733 15.959023 -7.926957 1.357403 60.508221 2.697932 -86.840057 49.996147 -49.352970 -0.736011 -0.267721 -0.298900 +0.096165 1.673139 0.073836 1.220538 34.230259 0.622406 0.230571 -0.035240 0.042251 -1.527127 -0.106024 -1.134634 -0.765902 0.743211 0.082363 0.514276 0.332998 -0.027963 -1.871850 0.210533 4.445139 -2.460114 0.367419 1.524452 -0.002708 -0.561681 0.185297 0.510960 0.726979 0.164340 6.260054 2.925602 -10.205591 -1.795749 3.273537 14.131217 -4.743575 5.062759 27.673952 -1.304189 -13.308847 2.781027 3.625407 -18.327415 -6.301701 17.540573 -13.057667 -9.729997 -32.780350 -80.868057 30.153566 68.420479 -40.181412 -32.936153 -0.304163 -0.007525 0.081055 -14.618386 15.834386 -7.807631 0.826287 60.684471 2.683280 -87.390205 50.462826 -49.997082 -0.721362 -0.280565 -0.279007 +0.093030 1.672524 0.072938 1.232568 34.683178 0.474910 0.197040 0.031295 0.286883 -1.105584 -0.130820 -1.724337 -0.765560 0.739267 0.068986 0.527362 0.341931 -0.025617 -1.684064 0.248492 4.421625 -2.434174 0.372566 1.769688 -0.012652 -0.569362 0.175961 0.510942 0.715045 0.182324 6.066134 3.041371 -10.214946 -1.693856 3.302436 14.209458 -4.501903 4.971045 27.795202 -0.937755 -13.256901 3.121925 4.101356 -18.195124 -6.394556 17.595268 -12.839832 -10.075691 -32.341721 -81.118774 30.098087 66.990913 -40.758858 -32.447964 -0.298262 0.020416 0.088509 -14.229906 15.612314 -7.828662 1.962926 60.533081 3.365970 -87.789757 51.222736 -51.005302 -0.722772 -0.292685 -0.264332 +0.089688 1.671678 0.071462 1.381949 35.429028 0.456838 0.101620 -0.048881 -0.040603 -0.736985 -0.156048 -1.544584 -0.793290 0.752019 0.058949 0.528688 0.355558 -0.030494 -1.696548 0.294932 4.278858 -2.187216 0.360208 2.102972 -0.005214 -0.580239 0.180581 0.531575 0.727852 0.176124 5.681755 2.900441 -10.148498 -1.625783 3.125547 14.292733 -4.171819 4.772327 27.971828 -0.580064 -13.277518 2.819175 3.827273 -17.951632 -6.656736 17.428659 -12.139396 -10.612112 -33.844524 -81.430832 31.669037 65.749184 -41.053211 -31.974920 -0.320453 0.003271 0.083534 -14.394090 15.145332 -8.302116 2.260664 60.721401 3.668245 -87.505417 51.913006 -51.477657 -0.746406 -0.287915 -0.276745 +0.086220 1.671613 0.070496 1.227778 35.940018 0.274685 0.277435 -0.104088 -0.343710 -0.576743 -0.170138 -1.399605 -0.782639 0.758410 0.069566 0.529441 0.360471 -0.029341 -1.543954 0.341663 4.001868 -1.694946 0.336475 2.631681 -0.005726 -0.586717 0.179225 0.534760 0.738722 0.181909 5.735066 2.737397 -10.073421 -1.626089 2.980023 14.322968 -4.132045 4.560612 28.067850 -0.313836 -13.435310 2.610354 3.639260 -17.946075 -6.464343 16.964933 -11.933111 -10.706272 -33.992123 -81.388275 31.762932 65.606773 -41.154209 -31.904236 -0.330163 0.008020 0.067724 -14.477422 15.319427 -8.529713 3.296667 61.269142 4.177522 -86.655357 52.028927 -51.133362 -0.743367 -0.296438 -0.271924 +0.083358 1.671630 0.070172 1.158154 36.069458 0.093816 0.513630 -0.193180 -0.561071 -0.648085 -0.186324 -0.857826 -0.779334 0.772135 0.064984 0.526734 0.352295 -0.048018 -1.332691 0.443916 3.686069 -1.597836 0.357166 3.322105 0.001045 -0.610278 0.169021 0.533197 0.747095 0.197772 5.877307 2.649546 -9.987617 -1.680527 2.935882 14.354516 -4.257368 4.573883 28.132406 -0.442568 -13.521820 2.401300 3.808778 -18.333462 -6.183328 16.780916 -11.715172 -10.835422 -36.299534 -81.285095 33.569817 65.331917 -41.141613 -31.840427 -0.337470 0.045761 0.052242 -14.366479 15.261948 -8.724748 3.244602 61.631279 4.224452 -86.064445 52.312061 -50.930725 -0.743962 -0.319765 -0.262094 +0.080865 1.671293 0.069830 1.113014 35.763039 -0.015015 0.814213 -0.252904 -0.811763 -0.882264 -0.178316 -0.323731 -0.801724 0.781831 0.061039 0.534687 0.365296 -0.038287 -1.249285 0.510152 3.380480 -1.596195 0.376963 3.619185 0.003416 -0.608723 0.170022 0.551901 0.752567 0.187476 6.077522 2.623214 -9.942127 -1.757048 2.956401 14.379050 -4.439812 4.661711 28.299021 -0.524828 -13.601445 2.232626 3.532584 -18.334280 -6.584974 16.462692 -11.155466 -11.009156 -39.048531 -81.328979 35.997299 65.407547 -41.064457 -31.893126 -0.346292 0.024123 0.053837 -14.809453 15.152475 -9.095040 4.015037 62.585377 4.619361 -84.772469 51.845974 -49.768559 -0.757174 -0.312478 -0.274791 +0.078690 1.670357 0.069908 1.035165 35.784931 -0.072413 1.169224 -0.303131 -1.179914 -1.241332 -0.151096 0.144948 -0.827531 0.814158 0.063549 0.515023 0.336201 -0.048745 -1.291338 0.467849 3.380780 -1.227285 0.321366 3.479705 0.015436 -0.609704 0.169722 0.550829 0.777534 0.177506 6.103163 2.602976 -9.974830 -1.767186 2.912050 14.291284 -4.404027 4.685915 28.254179 -0.580914 -13.557173 2.167021 3.609180 -18.448467 -6.602057 16.366638 -10.872387 -11.038634 -42.523594 -81.260468 39.032402 65.375038 -41.072159 -31.990337 -0.365088 -0.004118 0.062877 -14.803628 15.112213 -9.251678 4.461949 63.274105 4.883279 -83.603905 51.586010 -48.733044 -0.769223 -0.295170 -0.303822 +0.076597 1.670331 0.069960 1.019570 35.861710 -0.323491 1.378375 -0.296127 -1.050976 -1.409914 -0.137103 0.309856 -0.849876 0.825475 0.051710 0.497071 0.303940 -0.056004 -1.207573 0.404454 3.636643 -1.188517 0.290747 3.324433 0.014400 -0.585710 0.164942 0.536098 0.777194 0.168158 6.526380 2.624433 -9.908018 -1.922981 2.937468 14.376523 -4.823515 4.865574 28.263691 -0.827681 -13.281828 2.781018 4.499244 -18.501703 -7.196418 16.445639 -11.247074 -10.955324 -42.509098 -80.754425 38.650330 65.633942 -41.618572 -32.495312 -0.358345 -0.034984 0.102318 -14.914519 15.093378 -9.169952 4.819797 63.196419 5.021386 -83.927582 51.857780 -49.187798 -0.770721 -0.257144 -0.326413 +0.075258 1.670444 0.070336 0.892192 36.112305 -0.709661 1.466823 -0.315579 -0.802789 -1.149170 -0.168846 0.428178 -0.862697 0.831569 0.042041 0.514791 0.319339 -0.053213 -0.961615 0.308838 4.067444 -1.298715 0.294904 3.020282 0.008734 -0.587183 0.163641 0.548243 0.778089 0.175176 6.870462 2.528930 -9.953801 -2.003535 2.856042 14.568444 -5.071709 4.837686 28.592924 -0.905478 -13.178675 2.813828 5.026232 -18.606459 -7.765009 16.548752 -10.892982 -11.240913 -44.721809 -80.758339 40.602085 65.293053 -42.058964 -32.641357 -0.355695 -0.028242 0.111601 -14.898005 14.609347 -9.376429 5.651835 63.393562 5.647392 -84.616806 52.549801 -50.345825 -0.781149 -0.258240 -0.324040 +0.073552 1.670284 0.071099 1.045829 36.404373 -0.765478 1.356241 -0.303848 -0.610719 -0.870652 -0.185159 0.220932 -0.871081 0.860843 0.043275 0.501896 0.300764 -0.062406 -0.957733 0.327540 4.148426 -1.354308 0.304025 3.120034 0.019672 -0.606451 0.157234 0.547485 0.798355 0.184665 6.597807 2.458812 -10.071966 -1.989085 2.752110 14.623957 -4.922241 4.768068 28.763779 -0.914021 -13.144807 2.635721 4.778679 -18.637754 -7.378561 16.391348 -10.428543 -11.464166 -49.561325 -80.737061 44.902363 64.547562 -42.483311 -32.581692 -0.381163 -0.023364 0.098980 -14.561620 14.190603 -9.497291 6.366853 63.573101 6.401924 -85.399155 53.637516 -51.821232 -0.787840 -0.265775 -0.331001 +0.071551 1.670172 0.071729 1.389389 36.439602 -0.654162 1.092596 -0.235716 -0.311941 -0.698065 -0.190512 -0.220540 -0.883363 0.865037 0.036902 0.508159 0.307619 -0.059471 -1.263333 0.380055 4.059262 -1.196603 0.290519 3.359639 0.016204 -0.607453 0.155426 0.555536 0.797220 0.186080 6.260530 2.504630 -10.129204 -2.022061 2.785383 14.680104 -4.863013 4.834050 28.861631 -0.962676 -13.147769 2.711264 4.801445 -18.622095 -7.634530 16.361652 -10.223455 -11.741094 -52.711117 -80.662842 47.482277 63.326042 -42.414639 -32.001530 -0.382022 -0.028120 0.106533 -14.466109 13.873824 -9.583220 7.144923 63.394001 7.011439 -86.213013 54.561375 -53.267361 -0.795329 -0.263296 -0.334569 +0.070316 1.670144 0.071984 1.057742 36.872124 -0.849215 1.523878 -0.208912 -0.391857 -0.722919 -0.182614 -0.286065 -0.873812 0.863877 0.044145 0.496634 0.301524 -0.085036 -0.937315 0.340427 4.041193 -1.041760 0.278305 3.466509 0.027129 -0.615768 0.163659 0.552071 0.811878 0.181179 6.918967 2.404315 -10.114307 -2.097667 2.754581 14.613281 -5.223070 4.845906 28.733524 -1.109023 -13.184677 2.744221 4.970967 -18.905294 -7.277417 16.089365 -10.393722 -12.050610 -55.173679 -80.644966 49.547867 61.083500 -42.415867 -30.813631 -0.384747 -0.020208 0.091057 -14.075385 13.639119 -9.614275 7.362137 63.367119 7.293767 -85.902428 55.099770 -53.431530 -0.795216 -0.269020 -0.334109 +0.068695 1.669814 0.072107 1.172682 36.980831 -0.748471 1.497608 -0.218089 -0.551707 -0.788285 -0.180495 -0.270307 -0.859250 0.865159 0.053512 0.485923 0.297021 -0.120271 -0.976377 0.337658 3.924813 -0.868291 0.261145 3.467600 0.035086 -0.630295 0.168213 0.547971 0.834601 0.183655 7.011422 2.395876 -10.147407 -2.193405 2.795569 14.540473 -5.430142 4.909186 28.631712 -1.231446 -13.098920 2.779909 5.486808 -19.247047 -6.950037 16.275200 -10.264022 -12.216107 -57.851528 -80.525887 51.688046 59.947651 -42.182903 -30.191647 -0.386563 0.000455 0.073449 -13.784278 13.369806 -9.735926 7.633672 63.621166 7.532999 -84.590286 55.149101 -52.444565 -0.792893 -0.280839 -0.329248 +0.066801 1.670029 0.072177 1.187125 36.931793 -0.828285 1.584544 -0.211414 -0.574275 -0.874610 -0.168310 -0.137720 -0.853878 0.852943 0.057319 0.481894 0.305317 -0.117365 -0.924843 0.306214 3.943217 -0.710594 0.244724 3.424115 0.036048 -0.617330 0.172972 0.549581 0.834253 0.171210 6.938194 2.424942 -10.129640 -2.162041 2.830045 14.563975 -5.362299 4.945365 28.630226 -1.108801 -13.269798 2.883466 5.393882 -19.189121 -7.077047 16.167507 -10.224322 -12.440940 -58.815575 -80.563515 52.533798 58.769753 -42.223835 -29.591715 -0.386777 -0.020734 0.068889 -13.920820 13.326815 -9.742256 7.921180 63.209751 7.597058 -84.553902 55.298958 -52.618496 -0.788153 -0.267142 -0.330272 +0.065039 1.670066 0.072590 1.223659 36.710667 -0.789219 1.667362 -0.248274 -0.710682 -0.994127 -0.166245 0.114754 -0.844824 0.857779 0.061901 0.484431 0.299339 -0.114939 -0.919867 0.351613 3.776792 -0.658970 0.249494 3.601349 0.038687 -0.628574 0.170801 0.545470 0.832809 0.179662 6.920116 2.451582 -10.147552 -2.190137 2.873035 14.485276 -5.432727 4.983889 28.563953 -1.250659 -13.474602 3.059166 5.110630 -19.398945 -6.588612 16.064640 -9.891124 -12.523528 -60.746830 -80.527710 54.340054 58.082737 -42.285530 -29.261112 -0.387535 0.000330 0.058164 -13.849615 13.132182 -9.793068 8.730017 63.434021 8.228467 -84.133987 55.605637 -52.583416 -0.784933 -0.285533 -0.322633 +0.063767 1.670415 0.073052 1.097854 36.949028 -1.073196 1.935652 -0.254477 -0.687994 -1.066603 -0.164356 0.418212 -0.846568 0.833776 0.059838 0.499092 0.324248 -0.098737 -0.653753 0.299158 4.005669 -0.798804 0.268196 3.566319 0.028284 -0.605173 0.180354 0.553496 0.817310 0.166575 6.957397 2.375856 -10.142779 -2.110652 2.777897 14.540224 -5.311823 4.900160 28.637188 -1.358882 -13.677279 3.537927 5.161724 -19.382687 -7.172004 16.039686 -9.890258 -12.559263 -62.288631 -80.590691 55.694286 57.895103 -42.014481 -29.074713 -0.370295 -0.026997 0.073214 -14.062440 12.942348 -9.874907 9.264707 63.198250 8.559819 -84.200516 56.096909 -53.085690 -0.784523 -0.266521 -0.321773 +0.062867 1.670879 0.073103 0.856923 37.076107 -1.401306 2.204793 -0.269972 -0.682690 -1.208705 -0.157978 0.722451 -0.819156 0.813195 0.075473 0.499385 0.331879 -0.106948 -0.370564 0.220591 4.209398 -0.763063 0.271545 3.486713 0.027777 -0.596422 0.191148 0.547748 0.820315 0.159305 7.602540 2.296217 -10.084869 -2.208013 2.782577 14.598593 -5.738420 4.895529 28.646461 -1.458791 -13.595873 3.768286 5.554889 -19.492493 -6.980786 15.811882 -10.120440 -12.544173 -60.683052 -80.523209 54.150425 57.557728 -42.240051 -28.906698 -0.355791 -0.021915 0.062710 -13.799865 12.832455 -9.814207 9.383290 63.073311 8.679627 -84.512550 56.422298 -53.589619 -0.770975 -0.269176 -0.312642 +0.061152 1.670984 0.073207 0.915454 36.887005 -1.495124 2.163584 -0.294224 -0.655080 -1.098931 -0.164317 0.883671 -0.822154 0.822404 0.078934 0.479937 0.311945 -0.116933 -0.395738 0.198469 4.286450 -0.770784 0.266390 3.384946 0.033702 -0.591953 0.188015 0.540053 0.830461 0.152296 7.629976 2.325459 -10.029790 -2.260748 2.816364 14.666842 -5.828328 4.940321 28.679174 -1.617284 -13.597672 3.823709 5.571311 -19.589762 -6.911629 15.848895 -10.112772 -12.685377 -58.973038 -80.526443 52.560822 56.984753 -42.154224 -28.534901 -0.362758 -0.038457 0.064263 -13.486145 12.873084 -9.720198 8.992170 63.030647 8.511137 -85.463753 56.685261 -54.475582 -0.767245 -0.255791 -0.324681 +0.059513 1.670827 0.073122 0.898624 36.792915 -1.566548 2.177181 -0.309065 -0.656299 -0.995318 -0.175929 0.869200 -0.821420 0.834609 0.085102 0.483429 0.312668 -0.119532 -0.231750 0.240905 4.208457 -0.952491 0.301475 3.524331 0.038061 -0.607260 0.189477 0.544582 0.842580 0.159046 7.742310 2.302027 -10.014476 -2.261708 2.819495 14.726674 -5.895653 4.955140 28.775240 -1.700639 -13.496553 3.524153 5.385921 -19.618820 -6.649409 16.105032 -9.935603 -12.813622 -59.379627 -80.614807 52.898712 56.905380 -41.867214 -28.420603 -0.372220 -0.025643 0.051789 -13.497173 12.731162 -9.910016 8.515057 63.158932 8.275264 -84.925995 56.664631 -54.020771 -0.772165 -0.271268 -0.323466 +0.057871 1.671050 0.073288 1.126751 36.559666 -1.530483 1.942476 -0.329947 -0.553987 -0.672108 -0.202705 0.771892 -0.819245 0.842687 0.087930 0.482253 0.310788 -0.133697 -0.259554 0.278675 4.184200 -1.113613 0.332702 3.575195 0.047463 -0.619326 0.192033 0.546772 0.857767 0.160685 7.666715 2.351444 -10.005503 -2.330774 2.896169 14.843453 -6.022315 5.038610 28.951664 -1.752549 -13.266644 3.246964 5.749434 -19.731901 -6.518391 16.306450 -9.816788 -12.936370 -60.008442 -80.803070 53.505280 56.958443 -41.518337 -28.327360 -0.378644 -0.010050 0.038805 -13.001019 12.570029 -10.020170 7.993204 63.421856 8.054744 -84.885376 56.727764 -53.963055 -0.775347 -0.282678 -0.322482 +0.057133 1.671363 0.073799 1.089275 36.820839 -1.680030 1.896983 -0.338186 -0.444317 -0.473926 -0.211391 0.864332 -0.836497 0.856064 0.084708 0.464715 0.302566 -0.150371 -0.205178 0.272041 4.247215 -0.895749 0.311699 3.761143 0.059852 -0.619337 0.194467 0.552581 0.876872 0.147437 7.720521 2.269701 -10.036958 -2.314242 2.781862 14.922002 -5.981796 4.932163 29.135073 -1.760437 -13.156147 3.171250 5.786662 -19.680607 -6.652070 16.406183 -9.372772 -13.173079 -62.759819 -80.830498 56.232899 56.567490 -42.057896 -28.402193 -0.397282 -0.035242 0.034899 -12.765620 12.238463 -10.174098 8.385249 63.879204 8.415292 -84.971672 56.765835 -54.053337 -0.785596 -0.265522 -0.340198 +0.056120 1.671097 0.073820 1.057566 36.839554 -1.708119 1.992047 -0.353471 -0.576395 -0.589557 -0.214589 1.058342 -0.830550 0.836904 0.079233 0.494333 0.339559 -0.128948 -0.151834 0.284356 4.141333 -0.733491 0.300815 3.890992 0.041374 -0.610454 0.193442 0.565054 0.857366 0.155737 7.766678 2.265913 -10.021156 -2.293046 2.781116 14.873036 -5.962947 4.886598 29.127880 -1.726299 -13.386919 3.219218 5.820737 -19.718887 -7.258751 16.647438 -9.126202 -13.258051 -64.780159 -80.926186 58.244099 56.603374 -42.187405 -28.507826 -0.382001 -0.028421 0.040070 -13.030258 12.015736 -10.095535 9.413108 63.820103 8.994855 -86.126396 56.546379 -54.906349 -0.784324 -0.268824 -0.321024 +0.054985 1.670647 0.074399 1.095821 36.936230 -1.626120 2.081196 -0.376115 -0.797146 -0.753682 -0.202171 1.318451 -0.830802 0.855129 0.078751 0.473904 0.316363 -0.149132 -0.096882 0.295974 4.095630 -0.600843 0.270566 3.950432 0.052518 -0.629416 0.195166 0.553035 0.873600 0.168353 7.622669 2.275712 -10.091393 -2.312842 2.739209 14.712197 -5.903061 4.789038 29.013309 -1.531460 -13.429269 3.188437 5.562817 -19.705956 -6.695267 16.943766 -9.080315 -13.126895 -66.239227 -80.963356 59.685429 56.783913 -41.970383 -28.534273 -0.405423 -0.021944 0.029246 -12.976559 12.104907 -9.672997 10.847079 63.962929 9.861280 -87.721085 55.954205 -55.755169 -0.790723 -0.271924 -0.321337 +0.053966 1.670726 0.075040 1.060585 36.744377 -1.612108 2.328160 -0.316564 -0.709558 -0.951060 -0.175432 1.123986 -0.825951 0.868628 0.088873 0.462262 0.292059 -0.145241 0.095296 0.348313 4.001882 -0.871837 0.307826 4.099064 0.054479 -0.636562 0.192980 0.539283 0.877314 0.175364 7.630804 2.331413 -10.184217 -2.285271 2.759179 14.583076 -5.893759 4.797372 28.882467 -1.563660 -13.698160 3.390576 4.988390 -19.782946 -6.043611 16.978907 -9.295167 -12.923512 -67.691887 -80.955971 61.014683 56.770271 -41.682426 -28.429176 -0.413190 -0.021347 0.027558 -13.128291 12.364478 -9.378719 12.004086 63.792343 10.464619 -87.981667 55.823048 -55.968956 -0.786953 -0.277355 -0.324959 +0.053305 1.670554 0.075935 1.084530 36.542492 -1.560997 2.391451 -0.276362 -0.517755 -0.900840 -0.170862 0.852253 -0.850873 0.883273 0.073986 0.460937 0.277907 -0.129016 0.102797 0.402642 3.941768 -1.012981 0.332478 4.281877 0.054240 -0.633409 0.177198 0.541782 0.864085 0.173437 7.529418 2.366551 -10.308225 -2.244161 2.731062 14.495906 -5.788133 4.816861 28.893471 -1.780086 -13.734798 3.643216 4.703999 -19.747282 -6.172123 17.010826 -9.118904 -12.845424 -70.347260 -80.890465 63.501747 56.906372 -41.477272 -28.476862 -0.414377 -0.030452 0.045398 -13.140022 12.343482 -9.428499 12.651466 64.249504 10.785138 -86.288033 55.231815 -54.155842 -0.790055 -0.271061 -0.338819 +0.052890 1.670377 0.076310 1.070597 36.562958 -1.568699 2.367473 -0.243477 -0.378260 -0.757215 -0.173081 0.530254 -0.875511 0.909284 0.066754 0.455079 0.262711 -0.127630 0.183376 0.430434 3.949102 -1.107244 0.339805 4.372824 0.062129 -0.639185 0.176848 0.543574 0.875643 0.175485 7.617464 2.371757 -10.377048 -2.217575 2.688620 14.498006 -5.797486 4.825945 28.977270 -1.787121 -13.713302 3.565958 4.595257 -19.731100 -6.276907 17.116297 -8.909925 -12.919465 -73.537117 -80.882309 66.541573 56.928295 -41.421242 -28.557047 -0.433093 -0.045721 0.053374 -13.166192 12.073348 -9.508842 13.134483 64.340355 11.059110 -86.042732 55.085392 -53.870678 -0.805012 -0.261652 -0.353532 +0.052506 1.670582 0.076301 1.050691 36.366405 -1.686339 2.308505 -0.219475 -0.241682 -0.665622 -0.175459 0.381430 -0.864898 0.896839 0.068571 0.454871 0.268891 -0.132367 0.196316 0.410073 4.032111 -1.123985 0.348553 4.327813 0.062662 -0.631083 0.178655 0.543306 0.873466 0.169125 7.852811 2.438426 -10.328544 -2.239943 2.779359 14.602224 -5.973296 4.897834 29.070875 -1.781101 -13.696284 3.615752 4.969555 -19.811272 -6.400131 17.020857 -8.956825 -12.976069 -73.120125 -81.007019 66.391487 56.920227 -41.878071 -28.678911 -0.424972 -0.044541 0.049154 -12.895415 11.947515 -9.503976 12.969222 64.111511 10.956419 -86.773422 55.403698 -54.676723 -0.797579 -0.259023 -0.349095 +0.051841 1.670753 0.076057 0.857725 36.516743 -1.842267 2.555790 -0.277433 -0.526348 -0.772827 -0.176450 0.846080 -0.853735 0.886909 0.075604 0.456990 0.284103 -0.143938 0.607954 0.418726 4.006513 -1.348587 0.395014 4.454660 0.065181 -0.641743 0.185531 0.549451 0.880516 0.167548 8.026899 2.320533 -10.259238 -2.213379 2.703124 14.615870 -5.970800 4.802303 29.088760 -1.663761 -13.756658 3.296550 4.789773 -19.824558 -6.180539 16.798262 -8.714105 -13.031642 -73.482353 -80.841736 66.679405 57.019016 -42.485992 -28.974310 -0.427150 -0.032243 0.029398 -12.835209 11.825673 -9.514554 13.026668 64.010742 11.019248 -87.478996 55.434261 -55.282013 -0.799002 -0.272638 -0.341057 +0.051004 1.671050 0.076468 0.909297 36.567875 -1.958430 2.633620 -0.287639 -0.500175 -0.774964 -0.180695 1.045633 -0.844505 0.867536 0.079648 0.466620 0.307101 -0.146916 0.729203 0.416522 4.087817 -1.360196 0.418396 4.595594 0.059764 -0.636714 0.189720 0.559686 0.877513 0.159117 7.900171 2.290816 -10.256913 -2.228443 2.700352 14.701031 -5.944954 4.787866 29.196516 -1.451353 -13.782760 3.302187 5.056968 -19.771875 -6.331472 16.759624 -8.520159 -13.153247 -73.468071 -80.593155 66.478653 56.769646 -43.214493 -29.168270 -0.414012 -0.029168 0.024672 -13.015759 11.857333 -9.551817 13.687625 63.791054 11.190667 -87.213409 55.267269 -55.100910 -0.795388 -0.276697 -0.336466 +0.050081 1.671293 0.077276 0.949260 36.551426 -2.099984 2.755935 -0.211639 -0.234606 -0.858205 -0.168052 0.749324 -0.821951 0.851078 0.086562 0.470697 0.312558 -0.141774 0.853582 0.384105 4.256401 -1.569275 0.443839 4.469748 0.052056 -0.631911 0.190364 0.550966 0.866567 0.165551 7.737350 2.326644 -10.258555 -2.170702 2.735248 14.777138 -5.840622 4.827994 29.184546 -1.352467 -14.159698 3.434502 5.002151 -19.944111 -6.215186 16.190968 -8.656936 -13.161228 -71.993462 -80.493362 65.159561 56.390408 -44.036282 -29.210642 -0.402254 -0.018424 0.020585 -12.901986 12.032985 -9.377705 13.275103 62.911510 10.781097 -88.324135 55.850304 -56.473270 -0.782287 -0.282232 -0.320535 +0.049632 1.671538 0.077821 1.156298 36.496826 -2.127665 2.684453 -0.202155 -0.029091 -1.015884 -0.156476 0.745028 -0.816619 0.858987 0.085898 0.466582 0.286126 -0.131894 0.685491 0.372260 4.402023 -1.554614 0.433864 4.465656 0.053300 -0.627919 0.181654 0.532659 0.857004 0.173818 7.523893 2.357582 -10.241952 -2.174749 2.750012 14.820229 -5.793070 4.891691 29.099798 -1.390217 -14.534770 3.597457 5.218561 -20.355474 -6.080217 15.678180 -8.750938 -13.203680 -70.032333 -80.191971 63.259220 55.750103 -45.160484 -29.285482 -0.394580 -0.007406 0.030446 -12.664586 12.244982 -9.192148 12.718975 62.245361 10.403840 -89.635719 56.598236 -58.100262 -0.770649 -0.283998 -0.318057 +0.049804 1.671597 0.077977 1.068909 36.452381 -2.292628 2.786405 -0.194068 0.088780 -1.040707 -0.159036 0.791008 -0.794324 0.836809 0.085342 0.471809 0.296360 -0.137958 0.690796 0.308528 4.547214 -1.425836 0.417952 4.356831 0.049718 -0.629332 0.177862 0.528284 0.841884 0.177942 7.671723 2.291188 -10.284655 -2.126873 2.697577 14.807689 -5.759335 4.825286 29.017426 -1.689996 -14.738440 3.816248 5.212533 -20.664696 -5.943554 15.470534 -8.747698 -13.173607 -67.873299 -79.820023 60.973171 55.292614 -45.843788 -29.305782 -0.377227 0.020678 0.019434 -12.643470 12.525416 -9.440774 12.348681 62.323391 10.104821 -86.888382 56.897175 -56.129887 -0.756567 -0.299153 -0.297647 +0.049810 1.671876 0.078037 1.036540 36.473839 -2.403700 2.869146 -0.218954 0.107048 -1.164012 -0.153588 1.022332 -0.810535 0.848083 0.079926 0.480192 0.298212 -0.130302 0.591946 0.283084 4.629778 -1.127481 0.386642 4.424829 0.050783 -0.631893 0.172184 0.539211 0.841630 0.175131 7.591506 2.166855 -10.345649 -2.116177 2.561084 14.849139 -5.657648 4.719121 29.160421 -1.722937 -14.731774 3.772313 5.259337 -20.706451 -6.118005 15.504788 -8.423912 -13.311617 -69.624321 -79.666473 62.410542 55.051956 -45.851707 -29.262722 -0.376854 0.021951 0.024918 -12.895359 12.491542 -9.791109 12.708981 62.914509 10.320333 -84.744164 56.727249 -54.365055 -0.763020 -0.303410 -0.306532 +0.050471 1.671754 0.078483 0.927761 36.355148 -2.514930 2.989300 -0.208507 0.209768 -1.243284 -0.145459 1.088630 -0.813972 0.846211 0.074915 0.475472 0.287151 -0.127648 0.562768 0.228185 4.751265 -0.937316 0.346548 4.300982 0.048979 -0.621827 0.170499 0.531201 0.833410 0.173062 7.916453 2.212790 -10.395432 -2.127248 2.581004 14.778918 -5.808135 4.749259 29.043978 -1.876827 -14.680673 4.247573 5.418719 -20.692797 -6.174877 15.551222 -8.749429 -13.174081 -69.696617 -79.436378 62.229210 54.839966 -45.956326 -29.232710 -0.370016 0.013319 0.039735 -13.044841 12.520248 -9.799725 13.724273 62.795391 10.911464 -83.937027 57.317081 -54.302471 -0.759751 -0.291841 -0.310656 +0.050731 1.671491 0.079320 1.019595 36.256138 -2.364868 3.020548 -0.219561 0.056040 -1.336325 -0.133799 1.291663 -0.806025 0.844771 0.078581 0.464329 0.279056 -0.143216 0.384230 0.204050 4.766475 -0.801158 0.316622 4.146415 0.055712 -0.623473 0.177572 0.522809 0.843311 0.171823 7.919977 2.294420 -10.449600 -2.192153 2.649531 14.630041 -5.946094 4.770162 28.854000 -1.825394 -14.622427 4.413842 5.640388 -20.734272 -5.948671 15.440033 -8.603888 -13.137852 -71.107758 -79.295456 63.622021 54.508213 -46.429142 -29.209726 -0.375385 0.013650 0.032447 -12.644485 12.153852 -9.721261 15.248572 62.817627 12.082417 -84.642303 58.248035 -55.663387 -0.759379 -0.288531 -0.308910 +0.050435 1.671064 0.079546 1.093215 35.983459 -2.139066 3.017900 -0.250176 -0.255423 -1.383556 -0.129376 1.515809 -0.794921 0.823673 0.083695 0.471557 0.297074 -0.132545 0.314686 0.233642 4.578667 -0.858146 0.326619 4.114213 0.048409 -0.611996 0.183948 0.525512 0.833354 0.165164 7.850098 2.343861 -10.441935 -2.204339 2.701849 14.437363 -5.960052 4.738928 28.567453 -1.639070 -14.669295 4.467441 5.509173 -20.516508 -6.020821 14.951685 -8.429297 -12.996246 -70.795593 -78.828667 63.283733 54.822636 -47.833076 -29.893827 -0.366324 0.003588 0.031600 -12.526380 11.950170 -9.649835 17.124981 62.494274 13.262240 -85.263184 59.198933 -57.114037 -0.753988 -0.284215 -0.302799 +0.050955 1.670428 0.079848 0.903158 35.543045 -1.939275 3.079081 -0.293003 -0.540169 -1.283830 -0.139132 1.667989 -0.795821 0.818165 0.080269 0.471831 0.294149 -0.125795 0.489588 0.330247 4.126373 -1.003137 0.351619 4.303168 0.044581 -0.608511 0.181540 0.522403 0.820994 0.165066 8.181985 2.516271 -10.479298 -2.143429 2.831703 14.074541 -6.034562 4.811388 28.102791 -1.696857 -14.713048 4.768616 5.358076 -20.452990 -5.914348 14.838585 -7.849155 -12.572924 -72.965355 -77.797638 64.954498 56.478954 -50.188789 -31.986877 -0.359510 0.002851 0.039693 -12.703396 11.240368 -9.529000 20.194355 62.019615 15.377612 -87.118935 60.853245 -60.236732 -0.751565 -0.283514 -0.303227 +0.051321 1.669998 0.079917 1.022229 35.086838 -1.626138 2.948421 -0.322659 -0.831135 -1.264407 -0.140674 1.856723 -0.796688 0.810701 0.082596 0.475948 0.311898 -0.127076 0.412929 0.397859 3.872775 -1.250527 0.384538 4.270426 0.041650 -0.608461 0.189424 0.531868 0.824619 0.161722 8.220167 2.702409 -10.531656 -2.141010 3.001126 13.857776 -6.078801 4.907050 27.848139 -1.641022 -14.649521 4.750578 5.182422 -20.250347 -6.039337 14.636772 -6.951462 -12.545179 -75.166626 -76.673332 66.450600 56.915081 -52.600636 -33.442177 -0.363343 -0.009322 0.035841 -12.700704 10.473583 -9.627508 23.532307 61.605652 17.570370 -88.667953 62.650448 -63.399887 -0.758002 -0.279826 -0.302796 +0.051547 1.670034 0.079845 1.036968 34.697113 -1.492106 2.995063 -0.297665 -0.923387 -1.468930 -0.119321 1.882283 -0.787942 0.789721 0.080650 0.490478 0.331958 -0.105053 0.234910 0.420462 3.689543 -1.084834 0.359384 4.282561 0.027391 -0.588176 0.189629 0.532239 0.806153 0.161732 8.268809 2.753097 -10.519224 -2.155419 3.042879 13.714745 -6.065427 4.868672 27.539133 -1.832153 -14.313983 4.804371 5.274069 -19.927355 -6.604616 14.134051 -6.738642 -12.510820 -72.773087 -75.162277 63.252644 56.797169 -55.870495 -34.973621 -0.349820 -0.020095 0.046768 -12.291365 10.540211 -9.847257 25.971272 61.472614 19.155691 -88.934135 64.794701 -65.699059 -0.749635 -0.267912 -0.291611 +0.052380 1.670164 0.079837 0.978339 34.382439 -1.314850 2.958524 -0.296860 -1.043319 -1.372988 -0.126424 1.751303 -0.788802 0.779242 0.081538 0.486128 0.316137 -0.096265 0.256089 0.509649 3.326399 -1.243640 0.371080 4.495334 0.021474 -0.574345 0.195847 0.517525 0.789076 0.156921 8.456328 2.824600 -10.427766 -2.197144 3.090913 13.442000 -6.104652 4.799969 26.881725 -2.025975 -14.078970 4.973618 5.167322 -19.706944 -6.532036 13.719447 -7.396658 -12.326555 -68.442574 -73.521545 58.304405 55.976265 -59.391674 -36.169315 -0.333219 -0.034025 0.071983 -11.928431 11.437916 -9.687008 28.298519 60.954433 20.578396 -91.278008 67.431305 -70.375175 -0.746105 -0.256012 -0.298774 +0.052779 1.670293 0.079838 0.734260 34.114620 -1.308561 3.067275 -0.290465 -1.089488 -1.144143 -0.142079 1.516601 -0.783965 0.766228 0.082450 0.481462 0.302668 -0.076673 0.502374 0.499101 3.231309 -1.524966 0.390596 4.300476 0.012977 -0.549226 0.192679 0.502417 0.767043 0.150275 8.639610 2.859595 -10.354753 -2.162956 3.098950 13.273678 -6.004428 4.741036 26.379974 -2.116080 -14.129115 5.023512 5.099277 -19.614777 -6.763466 13.084592 -8.266971 -12.069324 -65.687752 -71.994507 54.787903 55.585758 -62.411465 -37.480400 -0.315546 -0.055010 0.094974 -11.848722 12.670813 -9.602012 29.958427 60.440739 21.379108 -92.888710 69.645279 -74.122681 -0.731303 -0.236541 -0.302483 +0.052813 1.670141 0.080230 0.908277 34.129711 -1.086763 2.783380 -0.339127 -1.196940 -0.761818 -0.176862 1.459013 -0.793272 0.768730 0.078292 0.487429 0.289737 -0.039022 0.292326 0.510687 3.113835 -1.202313 0.324853 4.215816 0.005018 -0.543315 0.190945 0.491474 0.741639 0.157884 8.235631 2.799057 -10.290317 -2.148050 2.984715 13.102726 -5.759658 4.549164 25.860296 -2.044061 -14.232334 4.869754 4.154621 -19.183256 -6.609097 12.373513 -9.045307 -12.040943 -63.317570 -70.749008 52.089851 54.330452 -65.406319 -38.066517 -0.314546 -0.066757 0.115838 -11.768380 13.679309 -9.734341 31.489487 59.440304 21.969141 -94.808510 72.765526 -79.156494 -0.732769 -0.232882 -0.304400 diff --git a/src/momask-preenc/visualization/joints2bvh.py b/src/momask-preenc/visualization/joints2bvh.py new file mode 100644 index 0000000000000000000000000000000000000000..f95895565867002cd6e16134f144b8617f82a545 --- /dev/null +++ b/src/momask-preenc/visualization/joints2bvh.py @@ -0,0 +1,139 @@ +import visualization.Animation as Animation + +from visualization.InverseKinematics import BasicInverseKinematics, BasicJacobianIK, InverseKinematics +from visualization.Quaternions import Quaternions +import visualization.BVH_mod as BVH +from visualization.remove_fs import * + +from utils.plot_script import plot_3d_motion +from utils import paramUtil +from common.skeleton import Skeleton +import torch + +from torch import nn +from visualization.utils.quat import ik_rot, between, fk, ik +from tqdm import tqdm + + +def get_grot(glb, parent, offset): + root_quat = np.array([[1.0, 0.0, 0.0, 0.0]]).repeat(glb.shape[0], axis=0)[:, None] + local_pos = glb[:, 1:] - glb[:, parent[1:]] + norm_offset = offset[1:] / np.linalg.norm(offset[1:], axis=-1, keepdims=True) + norm_lpos = local_pos / np.linalg.norm(local_pos, axis=-1, keepdims=True) + grot = between(norm_offset, norm_lpos) + grot = np.concatenate((root_quat, grot), axis=1) + grot /= np.linalg.norm(grot, axis=-1, keepdims=True) + return grot + + +class Joint2BVHConvertor: + def __init__(self): + self.template = BVH.load('./visualization/data/template.bvh', need_quater=True) + self.re_order = [0, 1, 4, 7, 10, 2, 5, 8, 11, 3, 6, 9, 12, 15, 13, 16, 18, 20, 14, 17, 19, 21] + + self.re_order_inv = [0, 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12, 14, 18, 13, 15, 19, 16, 20, 17, 21] + self.end_points = [4, 8, 13, 17, 21] + + self.template_offset = self.template.offsets.copy() + self.parents = [-1, 0, 1, 2, 3, 0, 5, 6, 7, 0, 9, 10, 11, 12, 11, 14, 15, 16, 11, 18, 19, 20] + + def convert(self, positions, filename, iterations=10, foot_ik=True): + ''' + Convert the SMPL joint positions to Mocap BVH + :param positions: (N, 22, 3) + :param filename: Save path for resulting BVH + :param iterations: iterations for optimizing rotations, 10 is usually enough + :param foot_ik: whether to enfore foot inverse kinematics, removing foot slide issue. + :return: + ''' + positions = positions[:, self.re_order] + new_anim = self.template.copy() + new_anim.rotations = Quaternions.id(positions.shape[:-1]) + new_anim.positions = new_anim.positions[0:1].repeat(positions.shape[0], axis=-0) + new_anim.positions[:, 0] = positions[:, 0] + + if foot_ik: + positions = remove_fs(positions, None, fid_l=(3, 4), fid_r=(7, 8), interp_length=5, + force_on_floor=True) + ik_solver = BasicInverseKinematics(new_anim, positions, iterations=iterations, silent=True) + new_anim = ik_solver() + + # BVH.save(filename, new_anim, names=new_anim.names, frametime=1 / 20, order='zyx', quater=True) + glb = Animation.positions_global(new_anim)[:, self.re_order_inv] + if filename is not None: + BVH.save(filename, new_anim, names=new_anim.names, frametime=1 / 20, order='zyx', quater=True) + return new_anim, glb + + def convert_sgd(self, positions, filename, iterations=100, foot_ik=True): + ''' + Convert the SMPL joint positions to Mocap BVH + + :param positions: (N, 22, 3) + :param filename: Save path for resulting BVH + :param iterations: iterations for optimizing rotations, 10 is usually enough + :param foot_ik: whether to enfore foot inverse kinematics, removing foot slide issue. + :return: + ''' + + ## Positional Foot locking ## + glb = positions[:, self.re_order] + + if foot_ik: + glb = remove_fs(glb, None, fid_l=(3, 4), fid_r=(7, 8), interp_length=2, + force_on_floor=True) + + ## Fit BVH ## + new_anim = self.template.copy() + new_anim.rotations = Quaternions.id(glb.shape[:-1]) + new_anim.positions = new_anim.positions[0:1].repeat(glb.shape[0], axis=-0) + new_anim.positions[:, 0] = glb[:, 0] + anim = new_anim.copy() + + rot = torch.tensor(anim.rotations.qs, dtype=torch.float) + pos = torch.tensor(anim.positions[:, 0, :], dtype=torch.float) + offset = torch.tensor(anim.offsets, dtype=torch.float) + + glb = torch.tensor(glb, dtype=torch.float) + ik_solver = InverseKinematics(rot, pos, offset, anim.parents, glb) + print('Fixing foot contact using IK...') + for i in tqdm(range(iterations)): + mse = ik_solver.step() + # print(i, mse) + + rotations = ik_solver.rotations.detach().cpu() + norm = torch.norm(rotations, dim=-1, keepdim=True) + rotations /= norm + + anim.rotations = Quaternions(rotations.numpy()) + anim.rotations[:, self.end_points] = Quaternions.id((anim.rotations.shape[0], len(self.end_points))) + anim.positions[:, 0, :] = ik_solver.position.detach().cpu().numpy() + if filename is not None: + BVH.save(filename, anim, names=new_anim.names, frametime=1 / 20, order='zyx', quater=True) + # BVH.save(filename[:-3] + 'bvh', anim, names=new_anim.names, frametime=1 / 20, order='zyx', quater=True) + glb = Animation.positions_global(anim)[:, self.re_order_inv] + return anim, glb + + + +if __name__ == "__main__": + # file = 'batch0_sample13_repeat0_len196.npy' + # file = 'batch2_sample10_repeat0_len156.npy' + # file = 'batch2_sample13_repeat0_len196.npy' #line #57 new_anim.positions = lpos #new_anim.positions[0:1].repeat(positions.shape[0], axis=-0) #TODO, figure out why it's important + # file = 'batch1_sample12_repeat0_len196.npy' #hard case karate + # file = 'batch1_sample14_repeat0_len180.npy' + # file = 'batch0_sample3_repeat0_len192.npy' + # file = 'batch1_sample4_repeat0_len136.npy' + + # file = 'batch0_sample0_repeat0_len152.npy' + # path = f'/Users/yuxuanmu/project/MaskMIT/demo/cond4_topkr0.9_ts18_tau1.0_s1009/joints/{file}' + # joints = np.load(path) + # converter = Joint2BVHConvertor() + # new_anim = converter.convert(joints, './gen_L196.mp4', foot_ik=True) + + folder = '/Users/yuxuanmu/project/MaskMIT/demo/cond4_topkr0.9_ts18_tau1.0_s1009' + files = os.listdir(os.path.join(folder, 'joints')) + files = [f for f in files if 'repeat' in f] + converter = Joint2BVHConvertor() + for f in tqdm(files): + joints = np.load(os.path.join(folder, 'joints', f)) + converter.convert(joints, os.path.join(folder, 'ik_animations', f'ik_{f}'.replace('npy', 'mp4')), foot_ik=True) \ No newline at end of file diff --git a/src/momask-preenc/visualization/remove_fs.py b/src/momask-preenc/visualization/remove_fs.py new file mode 100644 index 0000000000000000000000000000000000000000..5dc0743a79093f19703c2e1cb86d573271501f48 --- /dev/null +++ b/src/momask-preenc/visualization/remove_fs.py @@ -0,0 +1,329 @@ +import os +import sys +import numpy as np +import torch +import argparse + +from os.path import join as pjoin + + +# from visualization import BVH +from visualization.InverseKinematics import JacobianInverseKinematics, BasicInverseKinematics +# from scripts.motion_process_bvh import * +# from visualization.Animation import * + + +def softmax(x, **kw): + softness = kw.pop("softness", 1.0) + maxi, mini = np.max(x, **kw), np.min(x, **kw) + return maxi + np.log(softness + np.exp(mini - maxi)) + + +def softmin(x, **kw): + return -softmax(-x, **kw) + + +def alpha(t): + return 2.0 * t * t * t - 3.0 * t * t + 1 + + +def lerp(a, l, r): + return (1 - a) * l + a * r + +def remove_fs_old(anim, glb, foot_contact, fid_l=(3, 4), fid_r=(7, 8), interp_length=5, force_on_floor=True): + # glb_height = 2.06820832 Not the case, may be use upper leg length + scale = 1. #glb_height / 1.65 #scale to meter + # fps = 20 # + # velocity_thres = 10. # m/s + height_thres = [0.06, 0.03] #[ankle, toe] meter + if foot_contact is None: + def foot_detect(positions, velfactor, heightfactor): + feet_l_x = (positions[1:, fid_l, 0] - positions[:-1, fid_l, 0]) ** 2 + feet_l_y = (positions[1:, fid_l, 1] - positions[:-1, fid_l, 1]) ** 2 + feet_l_z = (positions[1:, fid_l, 2] - positions[:-1, fid_l, 2]) ** 2 + feet_l_h = positions[:-1, fid_l, 1] + feet_l = (((feet_l_x + feet_l_y + feet_l_z) < velfactor) & (feet_l_h < heightfactor)).astype(np.float) + + feet_r_x = (positions[1:, fid_r, 0] - positions[:-1, fid_r, 0]) ** 2 + feet_r_y = (positions[1:, fid_r, 1] - positions[:-1, fid_r, 1]) ** 2 + feet_r_z = (positions[1:, fid_r, 2] - positions[:-1, fid_r, 2]) ** 2 + feet_r_h = positions[:-1, fid_r, 1] + + feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor) & (feet_r_h < heightfactor)).astype(np.float) + + return feet_l, feet_r + + # feet_thre = 0.002 + # feet_vel_thre = np.array([velocity_thres**2, velocity_thres**2]) * scale**2 / fps**2 + feet_vel_thre = np.array([0.05, 0.2]) + # height_thre = np.array([0.06, 0.04]) * scale + feet_h_thre = np.array(height_thres) * scale + feet_l, feet_r = foot_detect(glb, velfactor=feet_vel_thre, heightfactor=feet_h_thre) + foot = np.concatenate([feet_l, feet_r], axis=-1).transpose(1, 0) # [4, T-1] + foot = np.concatenate([foot, foot[:, -1:]], axis=-1) + else: + foot = foot_contact.transpose(1, 0) + + T = len(glb) + + fid = list(fid_l) + list(fid_r) + fid_l, fid_r = np.array(fid_l), np.array(fid_r) + foot_heights = np.minimum(glb[:, fid_l, 1], + glb[:, fid_r, 1]).min(axis=1) # [T, 2] -> [T] + # print(foot_heights) + # floor_height = softmin(foot_heights, softness=0.03, axis=0) + sort_height = np.sort(foot_heights) + temp_len = len(sort_height) + floor_height = np.mean(sort_height[int(0.25*temp_len):int(0.5*temp_len)]) + if floor_height > 0.5: # for motion like swim + floor_height = 0 + # print(floor_height) + # floor_height = foot_heights.min() + # print(floor_height) + # print(foot) + # print(foot_heights.min()) + # print(floor_height) + glb[:, :, 1] -= floor_height + anim.positions[:, 0, 1] -= floor_height + for i, fidx in enumerate(fid): + fixed = foot[i] # [T] + + """ + for t in range(T): + glb[t, fidx][1] = max(glb[t, fidx][1], 0.25) + """ + + s = 0 + while s < T: + while s < T and fixed[s] == 0: + s += 1 + if s >= T: + break + t = s + avg = glb[t, fidx].copy() + while t + 1 < T and fixed[t + 1] == 1: + t += 1 + avg += glb[t, fidx].copy() + avg /= (t - s + 1) + + if force_on_floor: + avg[1] = 0.0 + + for j in range(s, t + 1): + glb[j, fidx] = avg.copy() + + s = t + 1 + + for s in range(T): + if fixed[s] == 1: + continue + l, r = None, None + consl, consr = False, False + for k in range(interp_length): + if s - k - 1 < 0: + break + if fixed[s - k - 1]: + l = s - k - 1 + consl = True + break + for k in range(interp_length): + if s + k + 1 >= T: + break + if fixed[s + k + 1]: + r = s + k + 1 + consr = True + break + + if not consl and not consr: + continue + if consl and consr: + litp = lerp(alpha(1.0 * (s - l + 1) / (interp_length + 1)), + glb[s, fidx], glb[l, fidx]) + ritp = lerp(alpha(1.0 * (r - s + 1) / (interp_length + 1)), + glb[s, fidx], glb[r, fidx]) + itp = lerp(alpha(1.0 * (s - l + 1) / (r - l + 1)), + ritp, litp) + glb[s, fidx] = itp.copy() + continue + if consl: + litp = lerp(alpha(1.0 * (s - l + 1) / (interp_length + 1)), + glb[s, fidx], glb[l, fidx]) + glb[s, fidx] = litp.copy() + continue + if consr: + ritp = lerp(alpha(1.0 * (r - s + 1) / (interp_length + 1)), + glb[s, fidx], glb[r, fidx]) + glb[s, fidx] = ritp.copy() + + targetmap = {} + for j in range(glb.shape[1]): + targetmap[j] = glb[:, j] + + # ik = BasicInverseKinematics(anim, glb, iterations=5, + # silent=True) + + # slightly larger loss, but better visual + ik = JacobianInverseKinematics(anim, targetmap, iterations=30, damping=5, recalculate=False, silent=True) + + anim = ik() + return anim + + + +def remove_fs(glb, foot_contact, fid_l=(3, 4), fid_r=(7, 8), interp_length=5, force_on_floor=True): + # glb_height = 2.06820832 Not the case, may be use upper leg length + scale = 1. #glb_height / 1.65 #scale to meter + # fps = 20 # + # velocity_thres = 10. # m/s + height_thres = [0.06, 0.03] #[ankle, toe] meter + if foot_contact is None: + def foot_detect(positions, velfactor, heightfactor): + feet_l_x = (positions[1:, fid_l, 0] - positions[:-1, fid_l, 0]) ** 2 + feet_l_y = (positions[1:, fid_l, 1] - positions[:-1, fid_l, 1]) ** 2 + feet_l_z = (positions[1:, fid_l, 2] - positions[:-1, fid_l, 2]) ** 2 + feet_l_h = positions[:-1, fid_l, 1] + feet_l = (((feet_l_x + feet_l_y + feet_l_z) < velfactor) & (feet_l_h < heightfactor)).astype(np.float) + + feet_r_x = (positions[1:, fid_r, 0] - positions[:-1, fid_r, 0]) ** 2 + feet_r_y = (positions[1:, fid_r, 1] - positions[:-1, fid_r, 1]) ** 2 + feet_r_z = (positions[1:, fid_r, 2] - positions[:-1, fid_r, 2]) ** 2 + feet_r_h = positions[:-1, fid_r, 1] + + feet_r = (((feet_r_x + feet_r_y + feet_r_z) < velfactor) & (feet_r_h < heightfactor)).astype(np.float) + + return feet_l, feet_r + + # feet_thre = 0.002 + # feet_vel_thre = np.array([velocity_thres**2, velocity_thres**2]) * scale**2 / fps**2 + feet_vel_thre = np.array([0.05, 0.2]) + # height_thre = np.array([0.06, 0.04]) * scale + feet_h_thre = np.array(height_thres) * scale + feet_l, feet_r = foot_detect(glb, velfactor=feet_vel_thre, heightfactor=feet_h_thre) + foot = np.concatenate([feet_l, feet_r], axis=-1).transpose(1, 0) # [4, T-1] + foot = np.concatenate([foot, foot[:, -1:]], axis=-1) + else: + foot = foot_contact.transpose(1, 0) + + T = len(glb) + + fid = list(fid_l) + list(fid_r) + fid_l, fid_r = np.array(fid_l), np.array(fid_r) + foot_heights = np.minimum(glb[:, fid_l, 1], + glb[:, fid_r, 1]).min(axis=1) # [T, 2] -> [T] + # print(foot_heights) + # floor_height = softmin(foot_heights, softness=0.03, axis=0) + sort_height = np.sort(foot_heights) + temp_len = len(sort_height) + floor_height = np.mean(sort_height[int(0.25*temp_len):int(0.5*temp_len)]) + if floor_height > 0.5: # for motion like swim + floor_height = 0 + # print(floor_height) + # floor_height = foot_heights.min() + # print(floor_height) + # print(foot) + # print(foot_heights.min()) + # print(floor_height) + glb[:, :, 1] -= floor_height + # anim.positions[:, 0, 1] -= floor_height + for i, fidx in enumerate(fid): + fixed = foot[i] # [T] + + """ + for t in range(T): + glb[t, fidx][1] = max(glb[t, fidx][1], 0.25) + """ + + s = 0 + while s < T: + while s < T and fixed[s] == 0: + s += 1 + if s >= T: + break + t = s + avg = glb[t, fidx].copy() + while t + 1 < T and fixed[t + 1] == 1: + t += 1 + avg += glb[t, fidx].copy() + avg /= (t - s + 1) + + if force_on_floor: + avg[1] = 0.0 + + for j in range(s, t + 1): + glb[j, fidx] = avg.copy() + + s = t + 1 + + for s in range(T): + if fixed[s] == 1: + continue + l, r = None, None + consl, consr = False, False + for k in range(interp_length): + if s - k - 1 < 0: + break + if fixed[s - k - 1]: + l = s - k - 1 + consl = True + break + for k in range(interp_length): + if s + k + 1 >= T: + break + if fixed[s + k + 1]: + r = s + k + 1 + consr = True + break + + if not consl and not consr: + continue + if consl and consr: + litp = lerp(alpha(1.0 * (s - l + 1) / (interp_length + 1)), + glb[s, fidx], glb[l, fidx]) + ritp = lerp(alpha(1.0 * (r - s + 1) / (interp_length + 1)), + glb[s, fidx], glb[r, fidx]) + itp = lerp(alpha(1.0 * (s - l + 1) / (r - l + 1)), + ritp, litp) + glb[s, fidx] = itp.copy() + continue + if consl: + litp = lerp(alpha(1.0 * (s - l + 1) / (interp_length + 1)), + glb[s, fidx], glb[l, fidx]) + glb[s, fidx] = litp.copy() + continue + if consr: + ritp = lerp(alpha(1.0 * (r - s + 1) / (interp_length + 1)), + glb[s, fidx], glb[r, fidx]) + glb[s, fidx] = ritp.copy() + + targetmap = {} + for j in range(glb.shape[1]): + targetmap[j] = glb[:, j] + + # ik = BasicInverseKinematics(anim, glb, iterations=5, + # silent=True) + + # slightly larger loss, but better visual + # ik = JacobianInverseKinematics(anim, targetmap, iterations=30, damping=5, recalculate=False, silent=True) + + # anim = ik() + return glb + + +def compute_foot_sliding(foot_data, traj_qpos, offseth): + foot = np.array(foot_data).copy() + offseth = np.mean(foot[:10, 1]) + foot[:, 1] -= offseth # Grounding it + foot_disp = np.linalg.norm(foot[1:, [0, 2]] - foot[:-1, [0, 2]], axis=1) + traj_qpos[:, 1] -= offseth + seq_len = len(traj_qpos) + H = 0.05 + y_threshold = 0.65 # yup system + y = traj_qpos[1:, 1] + + foot_avg = (foot[:-1, 1] + foot[1:, 1]) / 2 + subset = np.logical_and(foot_avg < H, y > y_threshold) + # import pdb; pdb.set_trace() + + sliding_stats = np.abs(foot_disp * (2 - 2 ** (foot_avg / H)))[subset] + sliding = np.sum(sliding_stats) / seq_len * 1000 + return sliding, sliding_stats \ No newline at end of file diff --git a/src/momask-preenc/visualization/smpl2bvh.py b/src/momask-preenc/visualization/smpl2bvh.py new file mode 100644 index 0000000000000000000000000000000000000000..1d582a558454457826518ddf2e89c46891a95a20 --- /dev/null +++ b/src/momask-preenc/visualization/smpl2bvh.py @@ -0,0 +1,205 @@ +import torch +import numpy as np +import argparse +import pickle +import smplx + +from utils import bvh, quat + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--model_path", type=str, default="./visualization/data/smpl/") + parser.add_argument("--model_type", type=str, default="smpl", choices=["smpl", "smplx"]) + parser.add_argument("--gender", type=str, default="MALE", choices=["MALE", "FEMALE", "NEUTRAL"]) + parser.add_argument("--num_betas", type=int, default=10, choices=[10, 300]) + parser.add_argument("--poses", type=str, default="data/gWA_sFM_cAll_d27_mWA5_ch20.pkl") + parser.add_argument("--fps", type=int, default=60) + parser.add_argument("--output", type=str, default="data/gWA_sFM_cAll_d27_mWA5_ch20.bvh") + parser.add_argument("--mirror", action="store_true") + return parser.parse_args() + +def mirror_rot_trans(lrot, trans, names, parents): + joints_mirror = np.array([( + names.index("Left"+n[5:]) if n.startswith("Right") else ( + names.index("Right"+n[4:]) if n.startswith("Left") else + names.index(n))) for n in names]) + + mirror_pos = np.array([-1, 1, 1]) + mirror_rot = np.array([1, 1, -1, -1]) + grot = quat.fk_rot(lrot, parents) + trans_mirror = mirror_pos * trans + grot_mirror = mirror_rot * grot[:,joints_mirror] + + return quat.ik_rot(grot_mirror, parents), trans_mirror + +def smpl2bvh(model_path:str, poses:str, output:str, mirror:bool, + model_type="smpl", gender="MALE", + num_betas=10, fps=60) -> None: + """Save bvh file created by smpl parameters. + + Args: + model_path (str): Path to smpl models. + poses (str): Path to npz or pkl file. + output (str): Where to save bvh. + mirror (bool): Whether save mirror motion or not. + model_type (str, optional): I prepared "smpl" only. Defaults to "smpl". + gender (str, optional): Gender Information. Defaults to "MALE". + num_betas (int, optional): How many pca parameters to use in SMPL. Defaults to 10. + fps (int, optional): Frame per second. Defaults to 30. + """ + + # names = [ + # "Pelvis", + # "Left_hip", + # "Right_hip", + # "Spine1", + # "Left_knee", + # "Right_knee", + # "Spine2", + # "Left_ankle", + # "Right_ankle", + # "Spine3", + # "Left_foot", + # "Right_foot", + # "Neck", + # "Left_collar", + # "Right_collar", + # "Head", + # "Left_shoulder", + # "Right_shoulder", + # "Left_elbow", + # "Right_elbow", + # "Left_wrist", + # "Right_wrist", + # "Left_palm", + # "Right_palm", + # ] + + names = [ + "Hips", + "LeftUpLeg", + "RightUpLeg", + "Spine", + "LeftLeg", + "RightLeg", + "Spine1", + "LeftFoot", + "RightFoot", + "Spine2", + "LeftToe", + "RightToe", + "Neck", + "LeftShoulder", + "RightShoulder", + "Head", + "LeftArm", + "RightArm", + "LeftForeArm", + "RightForeArm", + "LeftHand", + "RightHand", + "LeftThumb", + "RightThumb", + ] + + # I prepared smpl models only, + # but I will release for smplx models recently. + model = smplx.create(model_path=model_path, + model_type=model_type, + gender=gender, + batch_size=1) + + parents = model.parents.detach().cpu().numpy() + + # You can define betas like this.(default betas are 0 at all.) + rest = model( + # betas = torch.randn([1, num_betas], dtype=torch.float32) + ) + rest_pose = rest.joints.detach().cpu().numpy().squeeze()[:24,:] + + root_offset = rest_pose[0] + offsets = rest_pose - rest_pose[parents] + offsets[0] = root_offset + offsets *= 1 + + scaling = None + + # Pose setting. + if poses.endswith(".npz"): + poses = np.load(poses) + rots = np.squeeze(poses["poses"], axis=0) # (N, 24, 3) + trans = np.squeeze(poses["trans"], axis=0) # (N, 3) + + elif poses.endswith(".pkl"): + with open(poses, "rb") as f: + poses = pickle.load(f) + rots = poses["smpl_poses"] # (N, 72) + rots = rots.reshape(rots.shape[0], -1, 3) # (N, 24, 3) + scaling = poses["smpl_scaling"] # (1,) + trans = poses["smpl_trans"] # (N, 3) + + else: + raise Exception("This file type is not supported!") + + if scaling is not None: + trans /= scaling + + # to quaternion + rots = quat.from_axis_angle(rots) + + order = "zyx" + pos = offsets[None].repeat(len(rots), axis=0) + positions = pos.copy() + # positions[:,0] += trans * 10 + positions[:, 0] += trans + rotations = np.degrees(quat.to_euler(rots, order=order)) + + bvh_data ={ + "rotations": rotations[:, :22], + "positions": positions[:, :22], + "offsets": offsets[:22], + "parents": parents[:22], + "names": names[:22], + "order": order, + "frametime": 1 / fps, + } + + if not output.endswith(".bvh"): + output = output + ".bvh" + + bvh.save(output, bvh_data) + + if mirror: + rots_mirror, trans_mirror = mirror_rot_trans( + rots, trans, names, parents) + positions_mirror = pos.copy() + positions_mirror[:,0] += trans_mirror + rotations_mirror = np.degrees( + quat.to_euler(rots_mirror, order=order)) + + bvh_data ={ + "rotations": rotations_mirror, + "positions": positions_mirror, + "offsets": offsets, + "parents": parents, + "names": names, + "order": order, + "frametime": 1 / fps, + } + + output_mirror = output.split(".")[0] + "_mirror.bvh" + bvh.save(output_mirror, bvh_data) + + +def joints2bvh() + +if __name__ == "__main__": + args = parse_args() + + smpl2bvh(model_path=args.model_path, model_type=args.model_type, + mirror = args.mirror, gender=args.gender, + poses=args.poses, num_betas=args.num_betas, + fps=args.fps, output=args.output) + + print("finished!") \ No newline at end of file diff --git a/src/momask-preenc/visualization/utils/bvh.py b/src/momask-preenc/visualization/utils/bvh.py new file mode 100644 index 0000000000000000000000000000000000000000..a36402d9999cbc29eff95c9e9dc2e5fcdee27bda --- /dev/null +++ b/src/momask-preenc/visualization/utils/bvh.py @@ -0,0 +1,242 @@ +import re +import numpy as np + +channelmap = { + 'Xrotation': 'x', + 'Yrotation': 'y', + 'Zrotation': 'z' +} + +channelmap_inv = { + 'x': 'Xrotation', + 'y': 'Yrotation', + 'z': 'Zrotation', +} + +ordermap = { + 'x': 0, + 'y': 1, + 'z': 2, +} + +def load(filename:str, order:str=None) -> dict: + """Loads a BVH file. + + Args: + filename (str): Path to the BVH file. + order (str): The order of the rotation channels. (i.e."xyz") + + Returns: + dict: A dictionary containing the following keys: + * names (list)(jnum): The names of the joints. + * parents (list)(jnum): The parent indices. + * offsets (np.ndarray)(jnum, 3): The offsets of the joints. + * rotations (np.ndarray)(fnum, jnum, 3) : The local coordinates of rotations of the joints. + * positions (np.ndarray)(fnum, jnum, 3) : The positions of the joints. + * order (str): The order of the channels. + * frametime (float): The time between two frames. + """ + + f = open(filename, "r") + + i = 0 + active = -1 + end_site = False + + # Create empty lists for saving parameters + names = [] + offsets = np.array([]).reshape((0, 3)) + parents = np.array([], dtype=int) + + # Parse the file, line by line + for line in f: + + if "HIERARCHY" in line: continue + if "MOTION" in line: continue + + rmatch = re.match(r"ROOT (\w+)", line) + if rmatch: + names.append(rmatch.group(1)) + offsets = np.append(offsets, np.array([[0, 0, 0]]), axis=0) + parents = np.append(parents, active) + active = (len(parents) - 1) + continue + + if "{" in line: continue + + if "}" in line: + if end_site: + end_site = False + else: + active = parents[active] + continue + + offmatch = re.match(r"\s*OFFSET\s+([\-\d\.e]+)\s+([\-\d\.e]+)\s+([\-\d\.e]+)", line) + if offmatch: + if not end_site: + offsets[active] = np.array([list(map(float, offmatch.groups()))]) + continue + + chanmatch = re.match(r"\s*CHANNELS\s+(\d+)", line) + if chanmatch: + channels = int(chanmatch.group(1)) + if order is None: + channelis = 0 if channels == 3 else 3 + channelie = 3 if channels == 3 else 6 + parts = line.split()[2 + channelis:2 + channelie] + if any([p not in channelmap for p in parts]): + continue + order = "".join([channelmap[p] for p in parts]) + continue + + jmatch = re.match("\s*JOINT\s+(\w+)", line) + if jmatch: + names.append(jmatch.group(1)) + offsets = np.append(offsets, np.array([[0, 0, 0]]), axis=0) + parents = np.append(parents, active) + active = (len(parents) - 1) + continue + + if "End Site" in line: + end_site = True + continue + + fmatch = re.match("\s*Frames:\s+(\d+)", line) + if fmatch: + fnum = int(fmatch.group(1)) + positions = offsets[None].repeat(fnum, axis=0) + rotations = np.zeros((fnum, len(offsets), 3)) + continue + + fmatch = re.match("\s*Frame Time:\s+([\d\.]+)", line) + if fmatch: + frametime = float(fmatch.group(1)) + continue + + dmatch = line.strip().split(' ') + if dmatch: + data_block = np.array(list(map(float, dmatch))) + N = len(parents) + fi = i + if channels == 3: + positions[fi, 0:1] = data_block[0:3] + rotations[fi, :] = data_block[3:].reshape(N, 3) + elif channels == 6: + data_block = data_block.reshape(N, 6) + positions[fi, :] = data_block[:, 0:3] + rotations[fi, :] = data_block[:, 3:6] + elif channels == 9: + positions[fi, 0] = data_block[0:3] + data_block = data_block[3:].reshape(N - 1, 9) + rotations[fi, 1:] = data_block[:, 3:6] + positions[fi, 1:] += data_block[:, 0:3] * data_block[:, 6:9] + else: + raise Exception("Too many channels! %i" % channels) + + i += 1 + + f.close() + + return { + 'rotations': rotations, + 'positions': positions, + 'offsets': offsets, + 'parents': parents, + 'names': names, + 'order': order, + 'frametime': frametime + } + + +def save_joint(f, data, t, i, save_order, order='zyx', save_positions=False): + + save_order.append(i) + + f.write("%sJOINT %s\n" % (t, data['names'][i])) + f.write("%s{\n" % t) + t += '\t' + + f.write("%sOFFSET %f %f %f\n" % (t, data['offsets'][i,0], data['offsets'][i,1], data['offsets'][i,2])) + + if save_positions: + f.write("%sCHANNELS 6 Xposition Yposition Zposition %s %s %s \n" % (t, + channelmap_inv[order[0]], channelmap_inv[order[1]], channelmap_inv[order[2]])) + else: + f.write("%sCHANNELS 3 %s %s %s\n" % (t, + channelmap_inv[order[0]], channelmap_inv[order[1]], channelmap_inv[order[2]])) + + end_site = True + + for j in range(len(data['parents'])): + if data['parents'][j] == i: + t = save_joint(f, data, t, j, save_order, order=order, save_positions=save_positions) + end_site = False + + if end_site: + f.write("%sEnd Site\n" % t) + f.write("%s{\n" % t) + t += '\t' + f.write("%sOFFSET %f %f %f\n" % (t, 0.0, 0.0, 0.0)) + t = t[:-1] + f.write("%s}\n" % t) + + t = t[:-1] + f.write("%s}\n" % t) + + return t + + +def save(filename, data, save_positions=False): + """ Save a joint hierarchy to a file. + + Args: + filename (str): The output will save on the bvh file. + data (dict): The data to save.(rotations, positions, offsets, parents, names, order, frametime) + save_positions (bool): Whether to save all of joint positions on MOTION. (False is recommended.) + """ + + order = data['order'] + frametime = data['frametime'] + + with open(filename, 'w') as f: + + t = "" + f.write("%sHIERARCHY\n" % t) + f.write("%sROOT %s\n" % (t, data['names'][0])) + f.write("%s{\n" % t) + t += '\t' + + f.write("%sOFFSET %f %f %f\n" % (t, data['offsets'][0,0], data['offsets'][0,1], data['offsets'][0,2]) ) + f.write("%sCHANNELS 6 Xposition Yposition Zposition %s %s %s \n" % + (t, channelmap_inv[order[0]], channelmap_inv[order[1]], channelmap_inv[order[2]])) + + save_order = [0] + + for i in range(len(data['parents'])): + if data['parents'][i] == 0: + t = save_joint(f, data, t, i, save_order, order=order, save_positions=save_positions) + + t = t[:-1] + f.write("%s}\n" % t) + + rots, poss = data['rotations'], data['positions'] + + f.write("MOTION\n") + f.write("Frames: %i\n" % len(rots)); + f.write("Frame Time: %f\n" % frametime); + + for i in range(rots.shape[0]): + for j in save_order: + + if save_positions or j == 0: + + f.write("%f %f %f %f %f %f " % ( + poss[i,j,0], poss[i,j,1], poss[i,j,2], + rots[i,j,0], rots[i,j,1], rots[i,j,2])) + + else: + + f.write("%f %f %f " % ( + rots[i,j,0], rots[i,j,1], rots[i,j,2])) + + f.write("\n") \ No newline at end of file diff --git a/src/momask-preenc/visualization/utils/quat.py b/src/momask-preenc/visualization/utils/quat.py new file mode 100644 index 0000000000000000000000000000000000000000..451d7b23d5172b6615cff06167824102a1942730 --- /dev/null +++ b/src/momask-preenc/visualization/utils/quat.py @@ -0,0 +1,320 @@ +import numpy as np + +# Calculate cross object of two 3D vectors. +def _fast_cross(a, b): + return np.concatenate([ + a[...,1:2]*b[...,2:3] - a[...,2:3]*b[...,1:2], + a[...,2:3]*b[...,0:1] - a[...,0:1]*b[...,2:3], + a[...,0:1]*b[...,1:2] - a[...,1:2]*b[...,0:1]], axis=-1) + +# Make origin quaternions (No rotations) +def eye(shape, dtype=np.float32): + return np.ones(list(shape) + [4], dtype=dtype) * np.asarray([1, 0, 0, 0], dtype=dtype) + +# Return norm of quaternions +def length(x): + return np.sqrt(np.sum(x * x, axis=-1)) + +# Make unit quaternions +def normalize(x, eps=1e-8): + return x / (length(x)[...,None] + eps) + +def abs(x): + return np.where(x[...,0:1] > 0.0, x, -x) + +# Calculate inverse rotations +def inv(q): + return np.array([1, -1, -1, -1], dtype=np.float32) * q + +# Calculate the dot product of two quaternions +def dot(x, y): + return np.sum(x * y, axis=-1)[...,None] if x.ndim > 1 else np.sum(x * y, axis=-1) + +# Multiply two quaternions (return rotations). +def mul(x, y): + x0, x1, x2, x3 = x[..., 0:1], x[..., 1:2], x[..., 2:3], x[..., 3:4] + y0, y1, y2, y3 = y[..., 0:1], y[..., 1:2], y[..., 2:3], y[..., 3:4] + + return np.concatenate([ + y0 * x0 - y1 * x1 - y2 * x2 - y3 * x3, + y0 * x1 + y1 * x0 - y2 * x3 + y3 * x2, + y0 * x2 + y1 * x3 + y2 * x0 - y3 * x1, + y0 * x3 - y1 * x2 + y2 * x1 + y3 * x0], axis=-1) + +def inv_mul(x, y): + return mul(inv(x), y) + +def mul_inv(x, y): + return mul(x, inv(y)) + +# Multiply quaternions and vectors (return vectors). +def mul_vec(q, x): + t = 2.0 * _fast_cross(q[..., 1:], x) + return x + q[..., 0][..., None] * t + _fast_cross(q[..., 1:], t) + +def inv_mul_vec(q, x): + return mul_vec(inv(q), x) + +def unroll(x): + y = x.copy() + for i in range(1, len(x)): + d0 = np.sum( y[i] * y[i-1], axis=-1) + d1 = np.sum(-y[i] * y[i-1], axis=-1) + y[i][d0 < d1] = -y[i][d0 < d1] + return y + +# Calculate quaternions between two 3D vectors (x to y). +def between(x, y): + return np.concatenate([ + np.sqrt(np.sum(x*x, axis=-1) * np.sum(y*y, axis=-1))[...,None] + + np.sum(x * y, axis=-1)[...,None], + _fast_cross(x, y)], axis=-1) + +def log(x, eps=1e-5): + length = np.sqrt(np.sum(np.square(x[...,1:]), axis=-1))[...,None] + halfangle = np.where(length < eps, np.ones_like(length), np.arctan2(length, x[...,0:1]) / length) + return halfangle * x[...,1:] + +def exp(x, eps=1e-5): + halfangle = np.sqrt(np.sum(np.square(x), axis=-1))[...,None] + c = np.where(halfangle < eps, np.ones_like(halfangle), np.cos(halfangle)) + s = np.where(halfangle < eps, np.ones_like(halfangle), np.sinc(halfangle / np.pi)) + return np.concatenate([c, s * x], axis=-1) + +# Calculate global space rotations and positions from local space. +def fk(lrot, lpos, parents): + + gp, gr = [lpos[...,:1,:]], [lrot[...,:1,:]] + for i in range(1, len(parents)): + gp.append(mul_vec(gr[parents[i]], lpos[...,i:i+1,:]) + gp[parents[i]]) + gr.append(mul (gr[parents[i]], lrot[...,i:i+1,:])) + + return np.concatenate(gr, axis=-2), np.concatenate(gp, axis=-2) + +def fk_rot(lrot, parents): + + gr = [lrot[...,:1,:]] + for i in range(1, len(parents)): + gr.append(mul(gr[parents[i]], lrot[...,i:i+1,:])) + + return np.concatenate(gr, axis=-2) + +# Calculate local space rotations and positions from global space. +def ik(grot, gpos, parents): + + return ( + np.concatenate([ + grot[...,:1,:], + mul(inv(grot[...,parents[1:],:]), grot[...,1:,:]), + ], axis=-2), + np.concatenate([ + gpos[...,:1,:], + mul_vec( + inv(grot[...,parents[1:],:]), + gpos[...,1:,:] - gpos[...,parents[1:],:]), + ], axis=-2)) + +def ik_rot(grot, parents): + + return np.concatenate([grot[...,:1,:], + mul(inv(grot[...,parents[1:],:]), grot[...,1:,:]), + ], axis=-2) + +def fk_vel(lrot, lpos, lvel, lang, parents): + + gp, gr, gv, ga = [lpos[...,:1,:]], [lrot[...,:1,:]], [lvel[...,:1,:]], [lang[...,:1,:]] + for i in range(1, len(parents)): + gp.append(mul_vec(gr[parents[i]], lpos[...,i:i+1,:]) + gp[parents[i]]) + gr.append(mul (gr[parents[i]], lrot[...,i:i+1,:])) + gv.append(mul_vec(gr[parents[i]], lvel[...,i:i+1,:]) + + _fast_cross(ga[parents[i]], mul_vec(gr[parents[i]], lpos[...,i:i+1,:])) + + gv[parents[i]]) + ga.append(mul_vec(gr[parents[i]], lang[...,i:i+1,:]) + ga[parents[i]]) + + return ( + np.concatenate(gr, axis=-2), + np.concatenate(gp, axis=-2), + np.concatenate(gv, axis=-2), + np.concatenate(ga, axis=-2)) + +# Linear Interpolation of two vectors +def lerp(x, y, t): + return (1 - t) * x + t * y + +# LERP of quaternions +def quat_lerp(x, y, t): + return normalize(lerp(x, y, t)) + +# Spherical linear interpolation of quaternions +def slerp(x, y, t): + if t == 0: + return x + elif t == 1: + return y + + if dot(x, y) < 0: + y = - y + ca = dot(x, y) + theta = np.arccos(np.clip(ca, 0, 1)) + + r = normalize(y - x * ca) + + return x * np.cos(theta * t) + r * np.sin(theta * t) + + +################################################### +# Calculate other rotations from other quaternions. +################################################### + +# Calculate euler angles from quaternions. +def to_euler(x, order='zyx'): + + q0 = x[...,0:1] + q1 = x[...,1:2] + q2 = x[...,2:3] + q3 = x[...,3:4] + + if order == 'zyx': + + return np.concatenate([ + np.arctan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)), + np.arcsin((2 * (q0 * q2 - q3 * q1)).clip(-1,1)), + np.arctan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2))], axis=-1) + + elif order == 'yzx': + + return np.concatenate([ + np.arctan2(2 * (q2 * q0 - q1 * q3), q1 * q1 - q2 * q2 - q3 * q3 + q0 * q0), + np.arcsin((2 * (q1 * q2 + q3 * q0)).clip(-1,1)), + np.arctan2(2 * (q1 * q0 - q2 * q3), -q1 * q1 + q2 * q2 - q3 * q3 + q0 * q0)],axis=-1) + + elif order == 'zxy': + + return np.concatenate([ + np.arctan2(2 * (q0 * q3 - q1 * q2), q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3), + np.arcsin((2 * (q0 * q1 + q2 * q3)).clip(-1,1)), + np.arctan2(2 * (q0 * q2 - q1 * q3), q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3)], axis=-1) + + elif order == 'yxz': + + return np.concatenate([ + np.arctan2(2 * (q1 * q3 + q0 * q2), q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3), + np.arcsin((2 * (q0 * q1 - q2 * q3)).clip(-1,1)), + np.arctan2(2 * (q1 * q2 + q0 * q3), q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3)], axis=-1) + + else: + raise NotImplementedError('Cannot convert from ordering %s' % order) + +# Calculate rotation matrix from quaternions. +def to_xform(x): + + qw, qx, qy, qz = x[...,0:1], x[...,1:2], x[...,2:3], x[...,3:4] + + x2, y2, z2 = qx + qx, qy + qy, qz + qz + xx, yy, wx = qx * x2, qy * y2, qw * x2 + xy, yz, wy = qx * y2, qy * z2, qw * y2 + xz, zz, wz = qx * z2, qz * z2, qw * z2 + + return np.concatenate([ + np.concatenate([1.0 - (yy + zz), xy - wz, xz + wy], axis=-1)[...,None,:], + np.concatenate([xy + wz, 1.0 - (xx + zz), yz - wx], axis=-1)[...,None,:], + np.concatenate([xz - wy, yz + wx, 1.0 - (xx + yy)], axis=-1)[...,None,:], + ], axis=-2) + +# Calculate 6d orthogonal rotation representation (ortho6d) from quaternions. +# https://github.com/papagina/RotationContinuity +def to_xform_xy(x): + + qw, qx, qy, qz = x[...,0:1], x[...,1:2], x[...,2:3], x[...,3:4] + + x2, y2, z2 = qx + qx, qy + qy, qz + qz + xx, yy, wx = qx * x2, qy * y2, qw * x2 + xy, yz, wy = qx * y2, qy * z2, qw * y2 + xz, zz, wz = qx * z2, qz * z2, qw * z2 + + return np.concatenate([ + np.concatenate([1.0 - (yy + zz), xy - wz], axis=-1)[...,None,:], + np.concatenate([xy + wz, 1.0 - (xx + zz)], axis=-1)[...,None,:], + np.concatenate([xz - wy, yz + wx], axis=-1)[...,None,:], + ], axis=-2) + +# Calculate scaled angle axis from quaternions. +def to_scaled_angle_axis(x, eps=1e-5): + return 2.0 * log(x, eps) + + +############################################# +# Calculate quaternions from other rotations. +############################################# + +# Calculate quaternions from axis angles. +def from_angle_axis(angle, axis): + c = np.cos(angle / 2.0)[..., None] + s = np.sin(angle / 2.0)[..., None] + q = np.concatenate([c, s * axis], axis=-1) + return q + +# Calculate quaternions from axis-angle. +def from_axis_angle(rots): + angle = np.linalg.norm(rots, axis=-1) + axis = rots / angle[...,None] + return from_angle_axis(angle, axis) + +# Calculate quaternions from euler angles. +def from_euler(e, order='zyx'): + axis = { + 'x': np.asarray([1, 0, 0], dtype=np.float32), + 'y': np.asarray([0, 1, 0], dtype=np.float32), + 'z': np.asarray([0, 0, 1], dtype=np.float32)} + + q0 = from_angle_axis(e[..., 0], axis[order[0]]) + q1 = from_angle_axis(e[..., 1], axis[order[1]]) + q2 = from_angle_axis(e[..., 2], axis[order[2]]) + + return mul(q0, mul(q1, q2)) + +# Calculate quaternions from rotation matrix. +def from_xform(ts): + + return normalize( + np.where((ts[...,2,2] < 0.0)[...,None], + np.where((ts[...,0,0] > ts[...,1,1])[...,None], + np.concatenate([ + (ts[...,2,1]-ts[...,1,2])[...,None], + (1.0 + ts[...,0,0] - ts[...,1,1] - ts[...,2,2])[...,None], + (ts[...,1,0]+ts[...,0,1])[...,None], + (ts[...,0,2]+ts[...,2,0])[...,None]], axis=-1), + np.concatenate([ + (ts[...,0,2]-ts[...,2,0])[...,None], + (ts[...,1,0]+ts[...,0,1])[...,None], + (1.0 - ts[...,0,0] + ts[...,1,1] - ts[...,2,2])[...,None], + (ts[...,2,1]+ts[...,1,2])[...,None]], axis=-1)), + np.where((ts[...,0,0] < -ts[...,1,1])[...,None], + np.concatenate([ + (ts[...,1,0]-ts[...,0,1])[...,None], + (ts[...,0,2]+ts[...,2,0])[...,None], + (ts[...,2,1]+ts[...,1,2])[...,None], + (1.0 - ts[...,0,0] - ts[...,1,1] + ts[...,2,2])[...,None]], axis=-1), + np.concatenate([ + (1.0 + ts[...,0,0] + ts[...,1,1] + ts[...,2,2])[...,None], + (ts[...,2,1]-ts[...,1,2])[...,None], + (ts[...,0,2]-ts[...,2,0])[...,None], + (ts[...,1,0]-ts[...,0,1])[...,None]], axis=-1)))) + +# Calculate quaternions from ortho6d. +def from_xform_xy(x): + + c2 = _fast_cross(x[...,0], x[...,1]) + c2 = c2 / np.sqrt(np.sum(np.square(c2), axis=-1))[...,None] + c1 = _fast_cross(c2, x[...,0]) + c1 = c1 / np.sqrt(np.sum(np.square(c1), axis=-1))[...,None] + c0 = x[...,0] + + return from_xform(np.concatenate([ + c0[...,None], + c1[...,None], + c2[...,None]], axis=-1)) + +# Calculate quaternions from scaled angle axis. +def from_scaled_angle_axis(x, eps=1e-5): + return exp(x / 2.0, eps) \ No newline at end of file diff --git a/src/sata.egg-info/PKG-INFO b/src/sata.egg-info/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..52d9ff254bb6ddd3fd6fa02c52d7cfa01ce799bf --- /dev/null +++ b/src/sata.egg-info/PKG-INFO @@ -0,0 +1,30 @@ +Metadata-Version: 2.4 +Name: sata +Version: 1.0.0 +Summary: SATA motion retargeting and generation demo +Author: Zongye Zhang, Yuzhuo Cui +Author-email: +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Dynamic: author +Dynamic: classifier +Dynamic: description +Dynamic: description-content-type +Dynamic: requires-python +Dynamic: summary + +# Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation + +Official implementation of **Semantic-Aware Motion Encoding for Topology-Agnostic Character Animation**. + +## Install +```shell +conda create -n sata python=3.11 +conda activate sata +pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121 +``` + +### diff --git a/src/sata.egg-info/SOURCES.txt b/src/sata.egg-info/SOURCES.txt new file mode 100644 index 0000000000000000000000000000000000000000..9fbd5848169e11598e790e7da59efda0c2601cad --- /dev/null +++ b/src/sata.egg-info/SOURCES.txt @@ -0,0 +1,58 @@ +README.md +setup.py +src/sata/__init__.py +src/sata/default_veiwer.py +src/sata/distribution.py +src/sata/imgui_viewer.py +src/sata/loss.py +src/sata/metric.py +src/sata/my_gat_conv.py +src/sata/mydataset.py +src/sata/mymodel.py +src/sata/mypath.py +src/sata/sequence_dataset.py +src/sata/skel_pose_graph.py +src/sata/t2m_wrapper.py +src/sata/t2mdataset.py +src/sata/test.py +src/sata/test_vq.py +src/sata/train_vq_sliding_overlap.py +src/sata/train_wEval.py +src/sata/vae_loss.py +src/sata.egg-info/PKG-INFO +src/sata.egg-info/SOURCES.txt +src/sata.egg-info/dependency_links.txt +src/sata.egg-info/top_level.txt +src/sata/conversions/__init__.py +src/sata/conversions/graph_to_motion.py +src/sata/conversions/motion_to_graph.py +src/sata/conversions/same2bvh.py +src/sata/conversions/same_to_evaluator.py +src/sata/preprocess/__init__.py +src/sata/preprocess/check_utils.py +src/sata/preprocess/collect_joint_names.py +src/sata/preprocess/collect_joint_names_from_bvh.py +src/sata/preprocess/convert_same_to_jointpos.py +src/sata/preprocess/preprocess_data.py +src/sata/preprocess/preprocess_encode_posteriors_src.py +src/sata/preprocess/preprocess_recon.py +src/sata/preprocess/skel_list.py +src/sata/utils/__init__.py +src/sata/utils/bvh2joint.py +src/sata/utils/bvh2joint_data.py +src/sata/utils/data_utils.py +src/sata/utils/etc_utils.py +src/sata/utils/file_io.py +src/sata/utils/fixseed.py +src/sata/utils/humanml_paramUtil.py +src/sata/utils/humanml_skeleton.py +src/sata/utils/imgui_utils.py +src/sata/utils/joint2humanml.py +src/sata/utils/model_loading.py +src/sata/utils/motion_data.py +src/sata/utils/motion_utils.py +src/sata/utils/network_utils.py +src/sata/utils/quaternion.py +src/sata/utils/skel_gen_utils.py +src/sata/utils/sliding_decode.py +src/sata/utils/tensor_utils.py \ No newline at end of file diff --git a/src/sata.egg-info/dependency_links.txt b/src/sata.egg-info/dependency_links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/sata.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/sata.egg-info/top_level.txt b/src/sata.egg-info/top_level.txt new file mode 100644 index 0000000000000000000000000000000000000000..1bbd742a37d274777c699be676dbcb040dbfa77a --- /dev/null +++ b/src/sata.egg-info/top_level.txt @@ -0,0 +1 @@ +sata diff --git a/src/sata/__init__.py b/src/sata/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/sata/conversions/__init__.py b/src/sata/conversions/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4f4dca5a0b7fbfc230b6669dce556fe7267b663c --- /dev/null +++ b/src/sata/conversions/__init__.py @@ -0,0 +1,10 @@ +# # Conversion utilities for SAME model +# from sata.conversions.same_to_evaluator import ( +# convert_to_evaluator_input, +# compute_relative_representation, +# ) + +# __all__ = [ +# 'convert_to_evaluator_input', +# 'compute_relative_representation', +# ] diff --git a/src/sata/conversions/graph_to_motion.py b/src/sata/conversions/graph_to_motion.py new file mode 100644 index 0000000000000000000000000000000000000000..1bfa111faab734c67c63a15dab483a767f9a3ff1 --- /dev/null +++ b/src/sata/conversions/graph_to_motion.py @@ -0,0 +1,135 @@ +import torch +from ..utils.tensor_utils import cdn +from fairmotion.ops import conversions +from fairmotion.core import motion as motion_class +from sata.skel_pose_graph import find_feet + +from ..utils.motion_utils import make_motion +from ..utils.tensor_utils import tensor_q2qR +from sata.mymodel import parse_hatD, reshape_dict_consq, accum_root + +def graph_2_skel(graph, batch_num): + lo = graph.lo + qb = graph.qb + batch = graph.batch + edge_index = graph.edge_index + + skel_list = [] + for bi in range(batch_num): + lo_i = lo[batch == bi] + qb_i = qb[batch == bi] + edge_index_i = edge_index[:, batch[edge_index][0, :] == bi] + J = lo_i.shape[0] # including masked joints (will be skipped later in for loop) + if "V_mask" in graph: + mask_i = graph.mask[batch == bi] + use_mask = True + valid_ids = torch.cumsum(~mask_i, 0) - 1 + else: + use_mask = False + valid_ids = torch.arange(J) + + skel = motion_class.Skeleton() + new_joint = motion_class.Joint(dof=6) + skel.add_joint(new_joint, None) + + for j_idx in range(J): + if use_mask and mask_i[j_idx]: + continue + for pid, jid in edge_index_i.transpose(1, 0): + if pid == jid: + continue # exception (dummy for root joint) + if jid == j_idx: + dof = 3 if qb_i[jid] else 0 + new_joint = motion_class.Joint( + dof=dof, xform_from_parent_joint=conversions.p2T(cdn(lo_i[jid])) + ) + + p_valid_id = valid_ids[pid] + new_joint.set_parent_joint(skel.joints[p_valid_id]) + skel.add_joint(new_joint, skel.joints[p_valid_id]) + break + + skel_list.append(skel) + return skel_list + + +def batch_graph_qrc_to_motion( + skel_graph, + q, + r, + c, + consq_n, + cids=None, + first_frame_zero=False, + contact_cleanup=False, +): + """ + skel_graph SkelPoseGraph(batched, may or may not include pose part) + q Tensor [T*sumJ, q_dim(6)] + r Tensor [T*B, r_dim(4)] + c Tensor [T*B, 1] + batch Tensor [0, 0, ... , B*T-1] + """ + + b = skel_graph.batch + if skel_graph.mask.any(): + mask = skel_graph.mask + q = q[~mask] + c = c[~mask] + b = b[~mask] + + qrc = {"q": q, "r": r, "c": c} + qrc = reshape_dict_consq(qrc, consq_n) + qR = cdn(tensor_q2qR(qrc["q"])) # [T, sumJ, 3, 3] + ra_T = cdn(accum_root(qrc["r"], consq_n, apply_height=True)) # [T, B, 4, 4] + c = cdn(qrc["c"]) # [T, sumJ, 1] + + nB = (b.max() + 1) // consq_n + skel_list = graph_2_skel(skel_graph, nB) + if cids is not None: + assert len(cids) == nB * 4 + cids = cdn(cids).reshape(nB, 4) + + motion_list = [] + contact_list = [] + + for si, skel in enumerate(skel_list): + Ji = cdn(torch.argwhere(b == si).flatten()) + if cids is not None: + cid_i = cids[si] + elif (cids is None) and contact_cleanup: + # a bit adhoc; this asserts skel_graph has only one skel.. #TODO:FIX + cid_i = list(find_feet(skel_graph)) + else: + cid_i = None + try: + motion, contact = make_motion( + skel, + qR[:, Ji], + ra_T[:, si], + c[:, Ji], + first_frame_zero, + contact_cleanup, + cid_i, + ) + except: + print("batch_graph_qrc_to_motion failed") + from IPython import embed + + embed() + exit() + motion_list.append(motion) + contact_list.append(contact) + return motion_list, contact_list + + +def gt_recon_motion(graph_batch, consq_n): + return batch_graph_qrc_to_motion( + graph_batch, graph_batch.q, graph_batch.r_nopad, graph_batch.c, consq_n + ) + + +def hatD_recon_motion(hatD, tgt_batch, out_rep_cfg, ms_dict, consq_n): + tgt_root_ids = tgt_batch.ptr[:-1] if hasattr(tgt_batch, "ptr") else [0] + out = parse_hatD(hatD, tgt_root_ids, out_rep_cfg, ms_dict) + return batch_graph_qrc_to_motion(tgt_batch, out["q"], out["r"], out["c"], consq_n) diff --git a/src/sata/conversions/motion_to_graph.py b/src/sata/conversions/motion_to_graph.py new file mode 100644 index 0000000000000000000000000000000000000000..6160509a3ffbd4962f54c32184cb5a36aade50d5 --- /dev/null +++ b/src/sata/conversions/motion_to_graph.py @@ -0,0 +1,183 @@ +import torch +import numpy as np +from fairmotion.ops import conversions +from fairmotion.utils import constants +from fairmotion.data import bvh +from fairmotion.utils.contact_utils import get_all_joint_ground_contact + +from ..utils.motion_utils import motion_normalize_h2s +from sata.skel_pose_graph import SkelPoseGraph +from sata.mydataset import npz_2_data, SkelData +from torch_geometric.data import Batch + + +def skel_2_state(skel): + """ + input: skel + - must be normalized + - tpose height should be applied to skel + output: skel_state + - offset(local, global) + - feet-idx + - cid, qid + """ + offsets = np.array([joint.xform_from_parent_joint[:3, 3] for joint in skel.joints]) + global_offsets = np.array([joint.xform_global[:3, 3] for joint in skel.joints]) + + q_bool = np.array( + [1 if len(j.child_joints) != 0 else 0 for j in skel.joints], "int32" + ) + + root_idx = 0 + depth = 0 + stack = [root_idx] + edges = {root_idx: [root_idx, root_idx, -1]} # dummy edge + ascendant = {root_idx: [root_idx]} + + while len(stack) > 0: + next_level_stack = [] + for parent_idx in stack: + for child in skel.joints[parent_idx].child_joints: + child_idx = skel.get_index_joint(child.name) + edges[child_idx] = [parent_idx, child_idx, depth] + next_level_stack.append(child_idx) + + ascendant[child_idx] = ascendant[parent_idx].copy() + ascendant[child_idx].append(child_idx) + + if len(skel.joints[parent_idx].child_joints) == 0: + for reverse_depth, joint_idx in enumerate( + reversed(ascendant[parent_idx]) + ): + if len(edges[joint_idx]) > 3: + edges[joint_idx][3] = max(reverse_depth, edges[joint_idx][3]) + else: + edges[joint_idx].append(reverse_depth) + + stack = next_level_stack + depth += 1 + + edges_np = np.array([edges[j_idx] for j_idx in edges.keys()], "int32") + edges_np = edges_np[np.argsort(edges_np[:, 1])] # sort by child idx + + # edges_np: [J, 4] : [parent, child, depth, reverse_depth] + # extra features: + # depth: for faster fk compute + # reverse_depth: for masking + + return offsets.astype("float32"), global_offsets.astype("float32"), q_bool, edges_np + + +def motion_2_states(motion, exclude_wov=True): + """ + input: motion + - must be normalized + - tpose height should be applied to skel + - no tpose on the first frame (can use all frames) + output: skel_state, poses_state + (pose's' state: merged state, not a list of [pose_state]) + ** return features joints are not re-ordered. (follows BVH hierarchy order) + """ + rotations = motion.rotations() + global_positions = motion.positions(local=False) + + # skel (static) + skel_state = skel_2_state(motion.skel) + # skel_state : offsets, global_offsets, q_bool, edges + + # poses (dynamic) + F = motion.num_frames() + J = global_positions.shape[1] + + facing_transforms = np.zeros((F, 4, 4)) + for frame in range(F): + facing_transforms[frame] = motion.poses[frame].get_root_facing_transform_byRoot( + use_height=False + ) + + # smooth filter? + # import scipy.signal as signal + # sim_position = signal.savgol_filter(sim_position, 31, 3, axis=0, mode='interp') + + facing_diff = constants.eye_T()[None, ...].repeat(facing_transforms.shape[0], 0) + facing_diff[1:] = np.linalg.inv(facing_transforms[:-1]) @ facing_transforms[1:] + dcos, dsin = facing_diff[..., 0, 0], facing_diff[..., 0, 2] + dx, dz = facing_diff[..., 0, 3], facing_diff[..., 2, 3] + dtheta = np.arctan2(dsin, dcos) + + r_data = np.vstack((dtheta, dx, dz, global_positions[:, 0, 1])).transpose(1, 0) + + rotations[:, 0] = np.linalg.inv(facing_transforms)[..., :3, :3] @ rotations[:, 0] + rotations_Rsix = conversions.R2Rsix(rotations) + + curT_rel_positions = ( + np.linalg.inv(facing_transforms)[:, np.newaxis, ...].repeat(J, 1) + @ conversions.p2T(global_positions) + )[..., :3, 3] + + p_vel = np.zeros((F, J, 3)) + p_vel[1:] = global_positions[1:] - global_positions[:-1] + + curT_rel_p_vel = ( + np.linalg.inv(facing_transforms)[:, np.newaxis, ...].repeat(J, 1) + )[..., :3, :3] @ p_vel[..., np.newaxis] + curT_rel_p_vel = curT_rel_p_vel[..., 0] * 30 # fps + + q_vel = constants.eye_R()[np.newaxis, np.newaxis, ...].repeat(F, 0).repeat(J, 1) + q_vel[1:] = rotations[:-1].swapaxes(-2, -1) @ rotations[1:] + q_vel_Rsix = conversions.R2Rsix(q_vel) + + p_prev = np.copy(global_positions) + p_prev[1:] = global_positions[:-1] + curT_rel_p_prev = ( + np.linalg.inv(facing_transforms)[:, np.newaxis, ...].repeat(J, 1) + @ conversions.p2T(p_prev) + )[..., :3, 3] + + fc_data = get_all_joint_ground_contact(motion) + + # q, p, r, pv, qv, pprev, c + poses_state = ( + rotations_Rsix.astype("float32"), + curT_rel_positions.astype("float32"), + r_data.astype("float32"), + curT_rel_p_vel.astype("float32"), + q_vel_Rsix.astype("float32"), + curT_rel_p_prev.astype("float32"), + fc_data.astype("float32"), + ) + + if exclude_wov: + poses_state = tuple([state[1:] for state in poses_state]) + + return skel_state, poses_state + + +def skel_2_graph(skel, text_feature): + (lo, go, qb, edges) = skel_2_state(skel) + sd = SkelData( + torch.Tensor(lo), + torch.Tensor(go), + torch.BoolTensor(qb), + torch.LongTensor(edges[:, :2]).transpose(1, 0), + torch.LongTensor(edges[:, 2:]), + torch.Tensor(text_feature) + ) + return SkelPoseGraph(sd, None) + + +def motion_2_graph(motion, normalized=False): + if not normalized: + motion, tpose = motion_normalize_h2s(motion, False) # normalize motion + # skel_state, poses_state = motion_2_states + (lo, go, qb, edges), (q, p, r, pv, qv, pprev, c) = motion_2_states(motion) + skel_data, pose_list = npz_2_data(lo, go, qb, edges, q, p, qv, pv, pprev, c, r) + graph_batch = Batch.from_data_list( + [SkelPoseGraph(skel_data, pose_i) for pose_i in pose_list] + ) + return graph_batch + + +def bvh_2_graph(bvh_filepath): + motion = bvh.load(bvh_filepath, ignore_root_skel=True, ee_as_joint=True) + return motion_2_graph(motion) diff --git a/src/sata/conversions/same2bvh.py b/src/sata/conversions/same2bvh.py new file mode 100644 index 0000000000000000000000000000000000000000..2678d6b160e33ee424282fbfd7ea7bca4d7216c3 --- /dev/null +++ b/src/sata/conversions/same2bvh.py @@ -0,0 +1,542 @@ +""" +SAME to BVH Conversion Module + +This module provides functionality to convert SAME format data (stored in .npz files) +to BVH format through the following pipeline: + SAME (.npz) -> SkelPoseGraph -> Fairmotion Motion -> BVH (.bvh) + +The conversion process: +1. Load SAME data from .npz file +2. Convert to SkelPoseGraph format (internal graph representation) +3. Convert SkelPoseGraph to Fairmotion Motion object +4. Save Motion object as BVH file using fairmotion's bvh.save() +""" + +import os +import numpy as np +import torch +from fairmotion.data import bvh +from fairmotion.core import motion as motion_class + +from sata.mydataset import SkelData, PoseData +from sata.skel_pose_graph import SkelPoseGraph + + +def _log(message, verbose=True): + """Helper function to control verbose output""" + if verbose: + print(message) + + +def load_same_from_npz(npz_path, verbose=True, load_tf=True): + """ + Load SAME format data from .npz file + + Args: + npz_path: str, path to the .npz file containing SAME format data + + Returns: + tuple: (SkelPoseGraph, num_frames) + - SkelPoseGraph: The loaded SAME data as a graph object + - num_frames: int, number of frames in the motion + + The .npz file should contain the following arrays: + - lo: local offsets [nJ, 3] + - go: global offsets [nJ, 3] + - qb: quaternion boolean [nJ] + - edges: edge indices [nE, 4] (parent, child, depth, reverse_depth) + - q: joint rotations [nF, nJ, 6] (rotation 6D representation) + - p: joint positions [nF, nJ, 3] + - qv: joint rotation velocities [nF, nJ, 6] + - pv: joint position velocities [nF, nJ, 3] + - pprev: previous joint positions [nF, nJ, 3] + - c: contact labels [nF, nJ, 1] + - r: root motion [nF, 4] (theta, dx, dz, height) + """ + if not os.path.exists(npz_path): + raise FileNotFoundError(f"NPZ file not found: {npz_path}") + + _log(f"Loading SAME data from: {npz_path}", verbose) + data = np.load(npz_path) + + # Extract skeleton data + lo = torch.from_numpy(data['lo']).float() # [nJ, 3] + go = torch.from_numpy(data['go']).float() # [nJ, 3] + qb = torch.from_numpy(data['qb']).bool() # [nJ] + edges = data['edges'] # [nE, 4] + + # Build edge_index [2, nE] + edge_index = torch.from_numpy(edges[:, :2].T).long() + edge_feature = torch.from_numpy(edges[:, 2:]).long() # [nE, 2] (depth, reverse_depth) + + # Extract pose data + q = torch.from_numpy(data['q']).float() # [nF, nJ, 6] + p = torch.from_numpy(data['p']).float() # [nF, nJ, 3] + qv = torch.from_numpy(data['qv']).float() # [nF, nJ, 6] + pv = torch.from_numpy(data['pv']).float() # [nF, nJ, 3] + if 'pprev' in data: + pprev = torch.from_numpy(data['pprev']).float() # [nF, nJ, 3] + pprev_flat = pprev.reshape(-1, pprev.shape[-1]) + else: + pprev = pprev_flat = None + c = torch.from_numpy(data['c']).float() # [nF, nJ, 1] + r = torch.from_numpy(data['r']).float() # [nF, 4] + + nF, nJ = q.shape[0], q.shape[1] + _log(f" Loaded {nF} frames, {nJ} joints", verbose) + + # Flatten temporal dimension: [nF, nJ, D] -> [nF*nJ, D] + q_flat = q.reshape(-1, q.shape[-1]) + p_flat = p.reshape(-1, p.shape[-1]) + qv_flat = qv.reshape(-1, qv.shape[-1]) + pv_flat = pv.reshape(-1, pv.shape[-1]) + c_flat = c.reshape(-1, c.shape[-1]) + + # Create SkelData - check if text features exist + if 'tf' in data: + tf = torch.from_numpy(data['tf']).float() # [nJ, 768] + elif not load_tf: + # _log(f" Warning: 'tf' not found in {npz_path}, using zeros.", verbose) + tf = torch.zeros((nJ, 768), dtype=torch.float32) + else: + # load tf from joint_text_features + # Replace only the last 'processed' directory with 'joint_text_features' + tf_path = npz_path.rsplit('/processed/', 1)[0] + '/joint_text_features/' + npz_path.rsplit('/', 1)[1] + tf = torch.from_numpy(np.load(tf_path)['tf']) + + skel_data = SkelData( + lo=lo, + go=go, + qb=qb, + edge_index=edge_index, + edge_feature=edge_feature, + tf = tf + ) + + pose_data = PoseData( + q=q_flat, + p=p_flat, + qv=qv_flat, + pv=pv_flat, + pprev=pprev_flat, + c=c_flat, + r=r + ) + + # Create SkelPoseGraph + same_graph = SkelPoseGraph(skel_data, pose_data) + same_graph.tf = tf # Add text features directly to graph + + return same_graph, nF + + +def same_graph_to_motion_direct(same_graph, num_frames, first_frame_zero=False, + contact_cleanup=False, cids=None, fps=30, verbose=True): + """ + Directly convert single SAME graph to Fairmotion Motion without batch mechanism. + This is a simplified version that avoids the complexity of batch processing. + + Args: + same_graph: SkelPoseGraph, the SAME format graph data (single motion) + num_frames: int, number of frames in the motion sequence + first_frame_zero: bool, whether to zero out the first frame root position + contact_cleanup: bool, whether to apply contact cleanup + cids: list, contact joint IDs for cleanup (optional, will auto-detect feet) + fps: int, frames per second for the motion (default: 30) + + Returns: + motion: fairmotion.core.Motion object + contact: contact information (if contact_cleanup is True) + """ + from sata.utils.motion_utils import make_motion + from sata.utils.tensor_utils import cdn, tensor_q2qR + from sata.mymodel import accum_root + from fairmotion.ops import conversions + from sata.skel_pose_graph import find_feet + + _log(f"Converting SAME graph to Motion (direct method)...", verbose) + + nJ = same_graph.lo.shape[0] + + # Reshape flattened data back to [nF, nJ, D] + q = same_graph.q.reshape(num_frames, nJ, -1) # [nF, nJ, 6] + c = same_graph.c.reshape(num_frames, nJ, -1) # [nF, nJ, 1] + r = same_graph.r_nopad # [nF, 4] + + # Convert 6D rotation to rotation matrix + qR = cdn(tensor_q2qR(q)) # [nF, nJ, 3, 3] + + # Accumulate root motion + r_expanded = r.unsqueeze(1) # [nF, 1, 4] + ra_T = cdn(accum_root(r_expanded, num_frames, apply_height=True)) # [nF, 1, 4, 4] + ra_T = ra_T.squeeze(1) # [nF, 4, 4] + + # Create skeleton from graph + lo = same_graph.lo + qb = same_graph.qb + edge_index = same_graph.edge_index + + skel = motion_class.Skeleton() + root_joint = motion_class.Joint(dof=6) + skel.add_joint(root_joint, None) + + # Build skeleton hierarchy + for j_idx in range(nJ): + for pid, jid in edge_index.transpose(1, 0): + if pid == jid: # Skip self-loop (root dummy edge) + continue + if jid == j_idx: + dof = 3 if qb[jid] else 0 + new_joint = motion_class.Joint( + dof=dof, + xform_from_parent_joint=conversions.p2T(cdn(lo[jid])) + ) + new_joint.set_parent_joint(skel.joints[pid]) + skel.add_joint(new_joint, skel.joints[pid]) + break + + # Auto-detect contact points if needed + if contact_cleanup and cids is None: + cids = list(find_feet(same_graph)) + + # Create motion + motion, contact = make_motion( + skel=skel, + qR=qR, + ra_T=ra_T, + c=cdn(c), + first_frame_zero=first_frame_zero, + contact_cleanup=contact_cleanup, + cid=cids + ) + + # Set fps + motion.set_fps(fps) + + _log(f" ✓ Motion: {motion.num_frames()} frames, {motion.skel.num_joints()} joints, {motion.fps} fps", verbose) + + return motion, contact + + +def save_motion_as_bvh(motion, output_path, rot_order="XYZ", scale=1.0, + ee_as_joint=True, verbose=True): + """ + Save Fairmotion Motion object as BVH file + + Args: + motion: fairmotion.core.Motion object + output_path: str, path to save the BVH file + rot_order: str, rotation order for BVH (default: "XYZ") + scale: float, scale factor for the motion (default: 1.0) + ee_as_joint: bool, whether to treat end effectors as joints (default: True) + verbose: bool, whether to print progress (default: True) + """ + # Create output directory if it doesn't exist + output_dir = os.path.dirname(output_path) + if output_dir and not os.path.exists(output_dir): + os.makedirs(output_dir) + _log(f"Created output directory: {output_dir}", verbose) + + # Save using fairmotion's bvh.save() + bvh.save( + motion=motion, + filename=output_path, + scale=scale, + rot_order=rot_order, + verbose=verbose, + ee_as_joint=ee_as_joint + ) + + _log(f"✓ BVH file saved to: {output_path}", verbose) + + +def same_npz_to_bvh(npz_path, output_path, rot_order="XYZ", + scale=1.0, first_frame_zero=False, contact_cleanup=False, + cids=None, ee_as_joint=True, verbose=True, fps=30): + """ + Complete pipeline: Convert SAME .npz file to BVH file + + This is the main function that combines all steps: + 1. Load SAME data from .npz + 2. Convert to Motion object using direct method + 3. Save as BVH file + + Args: + npz_path: str, path to input .npz file + output_path: str, path to output .bvh file + rot_order: str, rotation order for BVH (default: "XYZ") + scale: float, scale factor (default: 1.0) + first_frame_zero: bool, zero out first frame root (default: False) + contact_cleanup: bool, apply contact cleanup (default: False) + cids: list, contact joint IDs (optional, auto-detected if not provided) + ee_as_joint: bool, treat end effectors as joints (default: True) + verbose: bool, print progress (default: True) + fps: int, frames per second for the motion (default: 30) + + Returns: + motion: fairmotion.core.Motion object that was saved + + Example: + >>> from sata.conversions.same2bvh import same_npz_to_bvh + >>> motion = same_npz_to_bvh( + ... npz_path="data/motion_001.npz", + ... output_path="output/motion_001.bvh" + ... ) + """ + _log("="*60, verbose) + _log("SAME to BVH Conversion Pipeline", verbose) + _log("="*60, verbose) + + # Step 1: Load SAME data + same_graph, num_frames = load_same_from_npz(npz_path, verbose=verbose) + + # Step 2: Convert to Motion (using direct method) + motion, contact = same_graph_to_motion_direct( + same_graph=same_graph, + num_frames=num_frames, + first_frame_zero=first_frame_zero, + contact_cleanup=contact_cleanup, + cids=cids, + fps=fps, + verbose=verbose + ) + + # Step 3: Save as BVH + save_motion_as_bvh( + motion=motion, + output_path=output_path, + rot_order=rot_order, + scale=scale, + ee_as_joint=ee_as_joint, + verbose=verbose + ) + + _log("="*60, verbose) + _log("Conversion completed successfully!", verbose) + _log("="*60, verbose) + + return motion + + +def batch_convert_directory(input_dir, output_dir, rot_order="XYZ", + scale=1.0, first_frame_zero=False, contact_cleanup=False, + cids=None, ee_as_joint=True, verbose=True, fps=30): + """ + Batch convert all .npz files in a directory to BVH format + + This function recursively finds all .npz files in input_dir and converts + them to BVH format, preserving the directory structure in output_dir. + + Args: + input_dir: str, path to directory containing .npz files + output_dir: str, path to directory where .bvh files will be saved + rot_order: str, rotation order for BVH (default: "XYZ") + scale: float, scale factor (default: 1.0) + first_frame_zero: bool, zero out first frame root (default: False) + contact_cleanup: bool, apply contact cleanup (default: False) + cids: list, contact joint IDs (optional) + ee_as_joint: bool, treat end effectors as joints (default: True) + verbose: bool, print progress (default: True) + fps: int, frames per second for the motion (default: 30) + + Returns: + dict: Statistics dictionary with keys: + - 'total': total number of files processed + - 'success': number of successful conversions + - 'failed': number of failed conversions + - 'failed_files': list of failed file paths + - 'elapsed_time': elapsed time in seconds + + Example: + >>> from sata.conversions.same2bvh import batch_convert_directory + >>> stats = batch_convert_directory( + ... input_dir="data/same_motions", + ... output_dir="output/bvh_motions", + ... fps=60 + ... ) + >>> print(f"Converted {stats['success']}/{stats['total']} files") + """ + import glob + import time + from pathlib import Path + + start_time = time.time() + + # Find all .npz files + input_path = Path(input_dir) + if not input_path.exists(): + raise FileNotFoundError(f"Input directory not found: {input_dir}") + + npz_files = sorted(input_path.rglob("*.npz")) + + if not npz_files: + _log(f"No .npz files found in {input_dir}", verbose) + return { + 'total': 0, + 'success': 0, + 'failed': 0, + 'failed_files': [], + 'elapsed_time': 0 + } + + # Create output directory + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + + _log("="*60, verbose) + _log(f"Batch Converting {len(npz_files)} .npz files", verbose) + _log("="*60, verbose) + _log(f"Input: {input_dir}", verbose) + _log(f"Output: {output_dir}", verbose) + _log("="*60, verbose) + + # Statistics + success_count = 0 + failed_count = 0 + failed_files = [] + + # Process each file + for idx, npz_file in enumerate(npz_files, 1): + try: + # Compute relative path and output path + relative_path = npz_file.relative_to(input_path) + output_file = output_path / relative_path.with_suffix(".bvh") + + # Create output subdirectory + output_file.parent.mkdir(parents=True, exist_ok=True) + + # Print progress + _log(f"\n[{idx}/{len(npz_files)}] Converting: {relative_path}", verbose) + + # Convert + same_npz_to_bvh( + npz_path=str(npz_file), + output_path=str(output_file), + rot_order=rot_order, + scale=scale, + first_frame_zero=first_frame_zero, + contact_cleanup=contact_cleanup, + cids=cids, + ee_as_joint=ee_as_joint, + verbose=verbose, + fps=fps + ) + + success_count += 1 + _log(f"✓ Saved to: {output_file}", verbose) + + except Exception as e: + failed_count += 1 + failed_files.append(str(relative_path)) + _log(f"✗ Failed to convert {relative_path}", verbose) + _log(f" Error: {str(e)}", verbose) + + # Summary + elapsed_time = time.time() - start_time + minutes = int(elapsed_time) // 60 + seconds = int(elapsed_time) % 60 + + _log("\n" + "="*60, verbose) + _log("Batch Conversion Summary", verbose) + _log("="*60, verbose) + _log(f"Total: {len(npz_files)} files", verbose) + _log(f"Success: {success_count} files", verbose) + _log(f"Failed: {failed_count} files", verbose) + _log(f"Time: {minutes}m {seconds}s", verbose) + + if failed_files: + _log(f"\nFailed files:", verbose) + for f in failed_files: + _log(f" - {f}", verbose) + + _log("="*60, verbose) + + return { + 'total': len(npz_files), + 'success': success_count, + 'failed': failed_count, + 'failed_files': failed_files, + 'elapsed_time': elapsed_time + } + + +# Example usage +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser( + description="Convert SAME format (.npz) to BVH format (.bvh)", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Convert single file + python same2bvh.py --input data/motion.npz --output result/motion.bvh + + # With custom rotation order and scale + python same2bvh.py --input data/motion.npz --output result/motion.bvh \\ + --rot_order ZXY --scale 0.01 + + # With contact cleanup + python same2bvh.py --input data/motion.npz --output result/motion.bvh \\ + --contact_cleanup --first_frame_zero + + # Batch convert entire directory + python same2bvh.py --input data/same_motions --output result/bvh_motions --batch + + # Batch convert with custom parameters + python same2bvh.py --input data/ --output output/ --batch \\ + --fps 60 --rot_order ZXY --contact_cleanup + """ + ) + + # Input/output arguments + parser.add_argument("--input", type=str, required=True, help="Input .npz file or directory path") + parser.add_argument("--output", type=str, required=True, help="Output .bvh file or directory path") + + # Conversion options + parser.add_argument("--rot_order", type=str, default="XYZ", + choices=["XYZ", "ZXY", "ZYX"], + help="Rotation order for BVH (default: XYZ)") + parser.add_argument("--scale", type=float, default=1.0, + help="Scale factor for the motion (default: 1.0)") + parser.add_argument("--fps", type=int, default=20, + help="Frames per second for the motion (default: 20)") + parser.add_argument("--first_frame_zero", action="store_true", + help="Zero out the first frame root position") + parser.add_argument("--contact_cleanup", action="store_true", + help="Apply contact cleanup to the motion") + parser.add_argument("--no_ee_as_joint", action="store_true", + help="Don't treat end effectors as joints") + parser.add_argument("--quiet", action="store_true", + help="Suppress verbose output") + parser.add_argument("--batch", action="store_true", + help="Batch convert all .npz files in input directory") + + args = parser.parse_args() + + # Batch conversion mode + if args.batch: + batch_convert_directory( + input_dir=args.input, + output_dir=args.output, + rot_order=args.rot_order, + scale=args.scale, + fps=args.fps, + first_frame_zero=args.first_frame_zero, + contact_cleanup=args.contact_cleanup, + ee_as_joint=not args.no_ee_as_joint, + verbose=not args.quiet + ) + else: + # Single file conversion + same_npz_to_bvh( + npz_path=args.input, + output_path=args.output, + rot_order=args.rot_order, + scale=args.scale, + fps=args.fps, + first_frame_zero=args.first_frame_zero, + contact_cleanup=args.contact_cleanup, + ee_as_joint=not args.no_ee_as_joint, + verbose=not args.quiet + ) diff --git a/src/sata/conversions/same_to_evaluator.py b/src/sata/conversions/same_to_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..e09f6dc80d2d22451eaae708b80ff11468da43d4 --- /dev/null +++ b/src/sata/conversions/same_to_evaluator.py @@ -0,0 +1,114 @@ +""" +Convert SAME reconstructed representations to evaluator input format. + +This module provides functions to convert the output from SAME model's +reconstruction (via out_post_fwd) to the format required by the FID evaluator. + +The evaluator expects: + - x: Joint positions [nFrame, nJ, 3] + - edges: Edge connectivity [nE, 2] containing [parent_idx, child_idx] + +Usage: + from sata.conversions.same_to_evaluator import convert_to_evaluator_input + + # After getting out from out_post_fwd + out, gt = out_post_fwd(...) + + # Convert to evaluator format + result = convert_to_evaluator_input(out, tgt_batch, use_relative_repr=False) + # result contains {'x': x, 'edges': edges} +""" + +import torch +import numpy as np +from typing import Dict, Union +from torch_geometric.data import Batch + + +def compute_relative_representation(p: torch.Tensor) -> torch.Tensor: + """ + Compute relative representation from absolute joint positions. + + This converts absolute joint positions to: + - Root node (index 0): linear velocity (position difference from previous frame) + First frame's root velocity is set to 0 + - Other nodes: position relative to root node + + Args: + p: Absolute joint positions [nFrame, nJ, 3] + + Returns: + x: Relative representation [nFrame, nJ, 3] + """ + nFrame, nJ, _ = p.shape + x = torch.zeros_like(p) + + # Root node: linear velocity + x[0, 0, :] = 0.0 + if nFrame > 1: + x[1:, 0, :] = p[1:, 0, :] - p[:-1, 0, :] + + # Other nodes: position relative to root + root_pos = p[:, 0:1, :] # [nFrame, 1, 3] + x[:, 1:, :] = p[:, 1:, :] - root_pos + + return x + + +def convert_to_evaluator_input( + out: Dict, + tgt_batch: Batch, + use_relative_repr: bool = False, + return_tensor: bool = False, +) -> Dict[str, Union[np.ndarray, torch.Tensor]]: + """ + Convert out_post_fwd output to evaluator input format. + + Args: + out: Output dict from out_post_fwd, must contain 'p' key + tgt_batch: Target skeleton graph batch (for extracting edges) + use_relative_repr: If True, convert to relative representation + return_tensor: If True, return torch.Tensor; otherwise numpy array + + Returns: + Dict containing: + - 'x': Joint positions [nFrame, nJ, 3] + - 'edges': Edge connectivity [nE, 2] + """ + assert 'p' in out, "Output dict must contain 'p' (joint positions)" + + # Get joint positions from out_post_fwd result + p = out['p'] # [nFrame, nJ, 3] or [nFrame, nB, nJ, 3] + + # Handle batched case - take first sample + if p.dim() > 3: + p = p[:, 0, :, :] # [nFrame, nJ, 3] + + # Convert to target format + if use_relative_repr: + x = compute_relative_representation(p) + else: + x = p + + # Extract edges: edge_index is [2, nE], transpose to [nE, 2] + edges = tgt_batch.edge_index.cpu().numpy().T.astype(np.int64) + + # Prepare result + if return_tensor: + result = { + 'x': x, + 'edges': torch.from_numpy(edges).to(x.device), + } + else: + result = { + 'x': x.detach().cpu().numpy().astype(np.float32), + 'edges': edges, + } + + return result + + +__all__ = [ + 'convert_to_evaluator_input', + 'compute_relative_representation', +] diff --git a/src/sata/default_veiwer.py b/src/sata/default_veiwer.py new file mode 100644 index 0000000000000000000000000000000000000000..3edb6e62dec831f2614e37fdd9480654ae0a0c63 --- /dev/null +++ b/src/sata/default_veiwer.py @@ -0,0 +1,257 @@ +from fairmotion.viz.bvh_visualizer import MocapViewer +from fairmotion.utils import utils +import argparse, os +import numpy as np + +from OpenGL.GL import * +from OpenGL.GLU import * +from OpenGL.GLUT import * + +from fairmotion.viz import camera +from fairmotion.data import bvh +from fairmotion.utils.contact_utils import get_all_joint_ground_contact +from fairmotion.viz import gl_render +from .mypath import * + +""" IMGUI """ +from sata.imgui_viewer import Viewer_imgui +from sata.utils.imgui_utils import list_motion_widget +import glfw + + +def valid_key(args, key): + if hasattr(args, key): + return getattr(args, key) is not None + else: + return False + + +def set_default_key(args, key, def_val): + if not hasattr(args, key): + setattr(args, key, def_val) + + +def get_default_viewer(args=argparse.Namespace()): + # copied from args + set_default_key(args, "bvh_files", None) + set_default_key(args, "bvh_dir", None) + set_default_key(args, "retarget_dir", None) + set_default_key(args, "npz_path", None) + set_default_key(args, "lazy", 0) + set_default_key(args, "inc_motion_num", 1) + set_default_key(args, "vis_motion_num", 1) + set_default_key(args, "grid_size", 0.0) + set_default_key(args, "imgui", False) + + set_default_key(args, "one_each", 1) + + cam = camera.Camera( + pos=np.array([2.0, 2.0, 2.0]), + origin=np.array([0.0, 0.0, 0.0]), + vup=utils.str_to_axis("y"), + fov=45.0, + ) + + viewer_class = Viewer_imgui if args.imgui else MocapViewer + + viewer = viewer_class( + motions=[], + joint_scale=4.5, + link_scale=3.0, + bvh_scale=0.01, + render_overlay=True, + hide_origin=False, + title="Motion Viewer", + cam=cam, + size=(2560, 1440), + # size = (1280, 720), + # use_msaa = False, + use_msaa=True, + ) + + viewer.all_motions = [] + viewer.file_names = [] + viewer.file_names = [] + + if valid_key(args, "bvh_dir"): + viewer.file_names = [ + os.path.join(dp, f) + for dp, dn, filenames in os.walk(args.bvh_dir) + for f in filenames + ] + viewer.file_names = list( + filter(lambda x: x.endswith(".bvh"), viewer.file_names) + ) + + if valid_key(args, "bvh_files"): + viewer.file_names += args.bvh_files + + if valid_key(args, "retarget_dir"): + retarget_dir_path = os.path.join(DATA_DIR, args.retarget_dir) + orig_path = os.path.join(retarget_dir_path, "input/") + result_path = os.path.join(retarget_dir_path, "result/") + result_log_path = os.path.join(retarget_dir_path, "result_log.txt") + + # add file_paths in order that retargeted files are listed in a row (consecutive order) + # assume we have same number of retargeted files for each motion (ex: N motions X M variations) + path_a_id_dict = dict() + file_pairs_list = [] + with open(result_log_path, "r") as f: + for line in f: + words = line.rstrip().split(", ") + batch_i, charname_a, basename_a, skel_i, basename_b = words + basename_b = basename_b + ".bvh" + + path_a = os.path.join(orig_path, charname_a, basename_a) + path_b = os.path.join(result_path, basename_b) + if path_a in path_a_id_dict.keys(): + path_a_id = path_a_id_dict[path_a] + file_pairs_list[path_a_id].append(path_b) + else: + path_a_id = len(file_pairs_list) + path_a_id_dict[path_a] = path_a_id + file_pairs_list.append([path_a, path_b]) + for file_pairs in file_pairs_list: + viewer.file_names.extend(file_pairs) + + # print(viewer.file_names) + if valid_key(args, "lazy") and args.lazy: + viewer.all_motions += [None] * len(viewer.file_names) + else: + viewer.all_motions += [bvh.load(file_name) for file_name in viewer.file_names] + + viewer.vis_motion_num = args.vis_motion_num + if args.inc_motion_num < 0: # -1 means visualize all at once + if args.lazy: + viewer.all_motions = [bvh.load(fn) for fn in viewer.file_names] + viewer.update_motions(viewer.all_motions, update_vis_num=False) + + else: + num_motions = len(viewer.all_motions) + viewer.m_ids = list(range(min(args.inc_motion_num, num_motions))) + for m_id in viewer.m_ids: + if viewer.all_motions[m_id] is None: + viewer.all_motions[m_id] = bvh.load(viewer.file_names[m_id]) + print( + m_id, + "\t", + viewer.file_names[m_id], + "\t", + viewer.all_motions[m_id].num_frames() - 1, + ) + viewer.update_motions( + [viewer.all_motions[m_id] for m_id in viewer.m_ids], + grid_size=args.grid_size, + update_vis_num=False, + ) + + def extra_key_callback(key, mode=None): + if (key == b"m") or (key == glfw.KEY_M): + if num_motions - viewer.m_ids[-1] > args.inc_motion_num: + viewer.m_ids = [ + (m_id + args.inc_motion_num) for m_id in viewer.m_ids + ] + elif num_motions - viewer.m_ids[-1] <= args.inc_motion_num: + viewer.m_ids = list( + range(num_motions - args.inc_motion_num, num_motions) + ) + elif num_motions - viewer.m_ids[-1] == 1: + viewer.m_ids = list(range(min(args.inc_motion_num, num_motions))) + elif (key == b"n") or (key == glfw.KEY_N): + if viewer.m_ids[0] == 0: + viewer.m_ids = list( + range(num_motions - args.inc_motion_num, num_motions) + ) + else: + viewer.m_ids = [ + (m_id - args.inc_motion_num) for m_id in viewer.m_ids + ] + else: + return False + + for m_id in viewer.m_ids: + if viewer.all_motions[m_id] is None: + viewer.all_motions[m_id] = bvh.load(viewer.file_names[m_id]) + if not hasattr(viewer.all_motions[m_id], "alljoint_contact"): + viewer.all_motions[m_id].alljoint_contact = ( + get_all_joint_ground_contact(viewer.all_motions[m_id]) + ) + print( + m_id, + "\t", + viewer.file_names[m_id], + "\t", + viewer.all_motions[m_id].num_frames() - 1, + ) + print() + viewer.update_motions( + [viewer.all_motions[m_id] for m_id in viewer.m_ids], + grid_size=args.grid_size, + update_vis_num=False, + ) + return True + + def extra_render_callback(): + pass + + viewer.extra_key_callback = extra_key_callback + viewer.extra_render_callback = extra_render_callback + + def overlay_callback(): # overlay test + + display_text = f"Frame: {viewer.worldStepper.cur_frame}\n" + for m_id in viewer.m_ids: + display_text += f"{viewer.file_names[m_id]}\n" + + w, h = viewer.window_size + display_text = display_text.split("\n") + for i, text in enumerate(display_text): + gl_render.render_text( + text, + pos=[0.02 * w, 0.02 * (i + 1) * h], + font=GLUT_BITMAP_HELVETICA_18, + ) + + if viewer.extra_overlay_callback is not None: + viewer.extra_overlay_callback() + + # img_path = os.path.join(SRC_DIR, f'pca.png') + # if os.path.exists(img_path): + # gl_render.render_img_on_window_from_path(img_path) + + viewer.overlay_callback = overlay_callback + + return viewer + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + # motion sources + parser.add_argument("--bvh_files", type=str, nargs="+", default=None) + parser.add_argument("--bvh_dir", type=str, default=None) + parser.add_argument("--retarget_dir", type=str, default=None) + parser.add_argument("--npz_path", type=str, default=None) + # motion load options + parser.add_argument("--lazy", type=int, default=0) + # visualize options + parser.add_argument("--inc_motion_num", type=int, default=1) + parser.add_argument("--vis_motion_num", type=int, default=1) + parser.add_argument("--grid_size", type=float, default=0.0) + parser.add_argument("--imgui", type=bool, default=False) + args = parser.parse_args() + viewer = get_default_viewer(args) + + # TODO: imgui currently lists only a single motion, should change to multi list + if args.imgui: + + def set_imgui_variables(): + pass + + def ui(): + if viewer.imgui_setup_done: + list_motion_widget(viewer) + + viewer.set_imgui_variables = set_imgui_variables + viewer.ui = ui + + viewer.run() diff --git a/src/sata/distribution.py b/src/sata/distribution.py new file mode 100644 index 0000000000000000000000000000000000000000..3d030fe59882c93731235534c728a1dd314d1623 --- /dev/null +++ b/src/sata/distribution.py @@ -0,0 +1,43 @@ +import torch +import numpy as np + + +class DiagonalGaussianDistribution(object): + def __init__(self, parameters, deterministic=False): + self.parameters = parameters + self.mean, self.logvar = torch.chunk(parameters, 2, dim=2) + self.logvar = torch.clamp(self.logvar, -30.0, 20.0) + self.deterministic = deterministic + self.std = torch.exp(0.5 * self.logvar) + self.var = torch.exp(self.logvar) + if self.deterministic: + self.var = self.std = torch.zeros_like(self.mean).to(device=self.parameters.device) + + def sample(self): + x = self.mean + self.std * torch.randn(self.mean.shape).to(device=self.parameters.device) + return x + + def kl(self, other=None): + if self.deterministic: + return torch.Tensor([0.]) + else: + if other is None: + return 0.5 * torch.sum(torch.pow(self.mean, 2) + + self.var - 1.0 - self.logvar, + dim=[1, 2]) + else: + return 0.5 * torch.sum( + torch.pow(self.mean - other.mean, 2) / other.var + + self.var / other.var - 1.0 - self.logvar + other.logvar, + dim=[1, 2]) + + def nll(self, sample, dims=[1,2]): + if self.deterministic: + return torch.Tensor([0.]) + logtwopi = np.log(2.0 * np.pi) + return 0.5 * torch.sum( + logtwopi + self.logvar + torch.pow(sample - self.mean, 2) / self.var, + dim=dims) + + def mode(self): + return self.mean \ No newline at end of file diff --git a/src/sata/imgui_viewer.py b/src/sata/imgui_viewer.py new file mode 100644 index 0000000000000000000000000000000000000000..6fb0549cdbaff9aa0901b10698572996c8df0ef3 --- /dev/null +++ b/src/sata/imgui_viewer.py @@ -0,0 +1,306 @@ +# Copyright (c) Facebook, Inc. and its affiliates. + +from OpenGL.GL import * +from OpenGL.GLUT import * +from OpenGL.GLU import * +from fairmotion.viz.bvh_visualizer import MocapViewer + +import numpy as np +import glfw +import imgui +from imgui.integrations.glfw import GlfwRenderer as ImguiRenderer +from IPython import embed +from argparse import Namespace + + +class Viewer_imgui(MocapViewer): + def __init__( + self, + motions, + play_speed=1, + joint_scale=1, + link_scale=1, + render_overlay=False, + hide_origin=False, + bvh_scale=1, + trackCamera=False, + **kwargs, + ): + super().__init__( + motions, + play_speed, + joint_scale, + link_scale, + render_overlay, + hide_origin, + bvh_scale, + trackCamera, + **kwargs, + ) + self.init() + self.imgui_setup_done = False + self.ui_variables = Namespace() + self.ui_ftns = [] + + # def assign_ftns(self): + def should_close(self): + glfw.set_window_should_close(self.window, True) + + def set_imgui_variables(self): + pass + + def ui(self): + for ftn in self.ui_ftns: + ftn() + + def init(self): + imgui.create_context() + if not glfw.init(): + return + + self.window = glfw.create_window( + self.window_size[0], self.window_size[1], "title", None, None + ) + if not self.window: + glfw.terminate() + return + + glfw.make_context_current(self.window) + + glutInit() + if self.use_msaa: + glutInitDisplayMode( + GLUT_RGBA + | GLUT_DOUBLE + | GLUT_ALPHA + | GLUT_DEPTH + # | GLUT_MULTISAMPLE + ) + else: + glutInitDisplayMode( + GLUT_RGBA + | GLUT_DOUBLE + | GLUT_ALPHA + | GLUT_DEPTH + | GLUT_MULTISAMPLE # SM) ON for better quality + ) + self._init_GL(*self.window_size) + self.resize_GL(*self.window_size) + + self.impl = ImguiRenderer(self.window, attach_callbacks=False) + + glfw.set_key_callback(self.window, self._on_key) + glfw.set_cursor_pos_callback(self.window, self._on_mouse_move) + glfw.set_mouse_button_callback(self.window, self._on_mouse_button) + glfw.set_window_size_callback(self.window, self._on_resize) + glfw.set_char_callback(self.window, self._on_char) + glfw.set_scroll_callback(self.window, self._on_scroll) + # glfw.set_joystick_callback(self._on_joystick) + + self.time_checker.begin() + + print("init done") + + def run(self): + self.set_imgui_variables() + self.imgui_setup_done = True + + # previous_time = glfw.get_time() + # Loop until the user closes the window + while not glfw.window_should_close(self.window): + self.idle_callback() + glfw.poll_events() + self.impl.process_inputs() + + # current_time = glfw.get_time() + # delta_time = current_time - previous_time + # previous_time = current_time + # self.update(current_time, delta_time) + self.draw_GL(False) + + imgui.new_frame() + self.ui() + imgui.render() + self.impl.render(imgui.get_draw_data()) + glfw.swap_buffers(self.window) + + self.impl.shutdown() + glfw.terminate() + + def prior_key_callback(self, key, mode): + return False + + def on_key(self, key, mode): + if self.prior_key_callback(key, mode): + return True + + if len(self.motions) > 0: + motion = self.motions[self.file_idx] + + if key == glfw.KEY_ESCAPE: + print("Hit ESC key to quit.") + self.impl.shutdown() + glfw.terminate() + elif key == glfw.KEY_E: + embed() + return True + + elif key == glfw.KEY_S: + self.worldStepper.reset() + + return True + + elif key == glfw.KEY_RIGHT_BRACKET: + if len(self.motions) <= 0: + return False + next_frame = min(motion.num_frames() - 1, self.worldStepper.cur_frame + 1) + self.worldStepper.set_time(motion.frame_to_time(next_frame)) + return True + + elif key == glfw.KEY_LEFT_BRACKET: + if len(self.motions) <= 0: + return False + prev_frame = max(0, self.worldStepper.cur_frame - 1) + self.worldStepper.set_time(motion.frame_to_time(prev_frame)) + return True + + elif (key == glfw.KEY_EQUAL) and (mode == glfw.MOD_SHIFT): # + + self.play_speed = min(self.play_speed + 0.2, 5.0) + self.worldStepper.play_speed = self.play_speed + return True + + elif key == glfw.KEY_MINUS: + self.play_speed = max(self.play_speed - 0.2, 0.2) + self.worldStepper.play_speed = self.play_speed + return True + elif key == glfw.KEY_R or key == glfw.KEY_V: + if len(self.motions) <= 0: + return False + self.worldStepper.reset() + # end_time = motion.length() + end_frame = motion.num_frames() + fps = motion.fps + save_path = input("Enter directory/file to store screenshots/video: ") + cnt_screenshot = 0 + dt = 1 / fps + gif_images = [] + while self.worldStepper.cur_frame < end_frame: + # while self.worldStepper.cur_time <= end_time: + print( + f"Recording progress: {self.worldStepper.cur_frame}/{end_frame} ({int(100*self.worldStepper.cur_frame/end_frame)}%) \r", + end="", + ) + if key == b"r": + utils.create_dir_if_absent(save_path) + name = "screenshot_%04d" % (cnt_screenshot) + self.save_screen(dir=save_path, name=name, render=True) + else: + image = self.get_screen(render=True) + gif_images.append(image.convert("P", palette=Image.ADAPTIVE)) + self.worldStepper.incFrame() + # self.worldStepper.set_time(self.worldStepper.cur_time + dt) + + cnt_screenshot += 1 + if key == glfw.KEY_V: + utils.create_dir_if_absent(os.path.dirname(save_path)) + gif_images[0].save( + save_path, + save_all=True, + optimize=False, + append_images=gif_images[1:], + loop=0, + ) + return True + + elif key == glfw.KEY_SPACE: + self.worldStepper.togglePlaying() + return True + + elif self.extra_key_callback(key): # , mode): + return True + else: + return False + + def _on_key(self, window, key, scancode, action, mods): + self.impl.keyboard_callback(window, key, scancode, action, mods) + if not imgui.get_io().want_capture_keyboard: + if (action == glfw.PRESS) or (action == glfw.REPEAT): + self.on_key(key, mods) + + def _on_char(self, window, codepoint): + self.impl.char_callback(window, codepoint) + + def _on_mouse_move(self, window, x, y): + self.impl.mouse_callback(window, x, y) + if self.mouse_last_pos is not None: + self.motion_func(x, y) # Viewer ftn + + def on_mouse_button(self, button, action, mods): + if action == glfw.PRESS: + x, y = glfw.get_cursor_pos(self.window) + self.mouse_last_pos = np.array([x, y]) + if button == glfw.MOUSE_BUTTON_LEFT: + self.pressed_button = 0 + elif button == glfw.MOUSE_BUTTON_RIGHT: + self.pressed_button = 2 + if action == glfw.RELEASE: # and button == glfw.MOUSE_BUTTON_LEFT: + self.mouse_last_pos = None + self.pressed_button = None + + def _on_mouse_button(self, window, button, action, mods): + if not imgui.get_io().want_capture_mouse: + self.on_mouse_button(button, action, mods) + + def on_scroll(self, x, y): + if y > 0: + self.cam_cur.zoom(0.95) + elif y < 0: + self.cam_cur.zoom(1.05) + + def _on_scroll(self, window, xoffset, yoffset): + self.impl.scroll_callback(window, xoffset, yoffset) + if not imgui.get_io().want_capture_mouse: + self.on_scroll(xoffset, yoffset) + + def _on_resize(self, window, width, height): + self.impl.resize_callback(window, width, height) + self.resize_GL(width, height) + + # def _on_joystick(self, jid, event): + # print(f'joysticK :: jid: {jid}\tevent:{event}') + # print(glfw.get_gamepad_name(0), glfw.get_gamepad_state(0)) + + +if __name__ == "__main__": + from fairmotion.viz import camera + from fairmotion.utils import utils + from fairmotion.data import bvh + from .mypath import * + + cam = camera.Camera( + pos=np.array([2.0, 2.0, 2.0]), + origin=np.array([0.0, 0.0, 0.0]), + vup=utils.str_to_axis("y"), + fov=45.0, + ) + + motions = [ + bvh.load( + os.path.join(DATA_DIR, "sample/motion/bvh/lafan1/aiming1_subject1_0.bvh") + ) + ] + + viewer = Viewer_imgui( + motions=motions, + joint_scale=4.5, + link_scale=3.0, + bvh_scale=0.01, + render_overlay=True, + hide_origin=False, + title="Motion Viewer", + cam=cam, + size=(2560, 1440), + # size = (1280, 720), + use_msaa=True, + ) + viewer.run() diff --git a/src/sata/loss.py b/src/sata/loss.py new file mode 100644 index 0000000000000000000000000000000000000000..e7fbe6cb4575d258c1b3e90960caefcf576f1395 --- /dev/null +++ b/src/sata/loss.py @@ -0,0 +1,150 @@ +import torch +from functools import partial +from .utils import tensor_utils + + +def default_mse_loss(loss_key, out, gt): + y_gt, y_out = gt[loss_key], out[loss_key] + + if ("mask" in gt) and (loss_key != "r") and (loss_key != "ra"): + mask = gt["mask"].reshape(-1, y_gt.shape[1])[0] + y_gt, y_out = y_gt[:, ~mask], y_out[:, ~mask] + + if y_gt.dtype == torch.bool: + y_gt = y_gt.float() + if y_out.dtype == torch.bool: + y_out = y_out.float() + + return torch.nn.MSELoss()(y_gt, y_out) + + +def compute_q_loss(out, gt): + qbi = gt["qbi"] + return torch.nn.MSELoss()(gt["qR"][:, qbi], out["qR"][:, qbi]) + + +def compute_cv_loss(out, gt): + gt_c = gt["c"][:, :, 0] + pv_norm = torch.norm(out["pv"], dim=-1) + return torch.mean(gt_c[1:] * pv_norm) + + +def compute_pen_loss(out, gt): + out_pa = out["pa"] + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + out_pa = out_pa[:, ~mask] + return torch.mean(torch.min(out_pa[..., 1], tensor_utils.Tensor([0])) ** 2) + + +def compute_jerk_loss(out, gt, fps=30): + CM2KM = 0.01 * 0.001 + out_pa = out["pa"] + + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + out_pa = out_pa[:, ~mask] + + jerk = (out_pa[3:] - 3 * out_pa[2:-1] + 3 * out_pa[1:-2] - out_pa[:-3]) * (fps**3) + jerk = jerk.norm(dim=-1) * CM2KM + jerk_loss = (jerk**2).mean() + return jerk_loss + + +def compute_slide_loss(out, gt): + H = 3 # 2.5 TODO change it as a parameter + out_pa = out["pa"] + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + out_pa = out_pa[:, ~mask] + + pv = out_pa[1:] - out_pa[:-1] + h = out_pa[1:, :, 1] + # contact = torch.clamp(2- 2**(h/H), 0, 1).unsqueeze(-1) + contact = torch.clamp(1 - h / H, 0, 1).unsqueeze(-1) + slide = (pv * contact).norm(dim=-1) + slide_loss = (slide**2).mean() + return slide_loss + + +def compute_z_loss(out, gt): + z_loss = torch.nn.MSELoss()(out["z"], out["z_tgt"]) + return z_loss + + +# def compute_kernel(x, y): +# x_size = x.size(0) +# y_size = y.size(0) +# dim = x.size(1) +# tiled_x = x.unsqueeze(1).expand(x_size, y_size, dim) +# tiled_y = y.unsqueeze(0).expand(x_size, y_size, dim) +# kernel_input = (tiled_x - tiled_y).pow(2).mean(2)/float(dim) +# return torch.exp(-kernel_input) # (x_size, y_size) + +# def compute_mmd(x, y): +# x_kernel = compute_kernel(x, x) +# y_kernel = compute_kernel(y, y) +# xy_kernel = compute_kernel(x, y) +# mmd = x_kernel.mean() + y_kernel.mean() - 2*xy_kernel.mean() +# return mmd + +# def mmd_loss(z): +# prior_samples = torch.randn_like(z) +# return compute_mmd(z, prior_samples) + + +def compute_z_gauss_loss(out, gt): + z = out["z"] + mu = z.mean(dim=0) + std = z.std(dim=0) + return torch.mean(mu**2 + (std - 1) ** 2) + + +_loss_matching_ = { + "p": partial(default_mse_loss, "p"), + "r": partial(default_mse_loss, "r_n"), + "c": partial(default_mse_loss, "c"), + "pv": partial(default_mse_loss, "pv"), + "z": compute_z_loss, + "q": compute_q_loss, + "cv": compute_cv_loss, + "pen": compute_pen_loss, + "jerk": compute_jerk_loss, + "slide": compute_slide_loss, + "z_gauss": compute_z_gauss_loss, +} + + +def get_loss_function(ltype): + return _loss_matching_[ltype] + + +def get_loss_names(): + return list(_loss_matching_.keys()) + + +def compute_loss(loss_cfg, out, gt): + losses = dict() + loss_sum = 0.0 + for key, weight in loss_cfg.items(): + if weight > 1e-8: + ftn = get_loss_function(key) + try: + loss = ftn(out, gt) + except: + print(key, "error occured") + from IPython import embed + + embed() + exit() + if torch.isnan(loss): + print(key, "NaN occured") + from IPython import embed + + embed() + exit() + weighted_loss = loss * weight + losses[key] = weighted_loss + loss_sum += weighted_loss + losses["total"] = loss_sum + return losses diff --git a/src/sata/metric.py b/src/sata/metric.py new file mode 100644 index 0000000000000000000000000000000000000000..27cf6c2c33c8c2c67baab6e20c9f1bb10517bf34 --- /dev/null +++ b/src/sata/metric.py @@ -0,0 +1,186 @@ +import torch +from torch_scatter import scatter +from .utils import tensor_utils + + +def compute_p_metric(out, gt): + gt_p, out_p = gt["p"], out["p"] + p_dist = torch.linalg.norm((out_p - gt_p), axis=-1) # [T, sumJ] + + sumJ = gt_p.shape[1] + b_single_frame = gt["batch"][:sumJ] + + if "mask" in gt: + mask = gt["mask"].reshape(gt_p.shape[0], -1)[0] + p_dist = p_dist[:, ~mask] + b_single_frame = b_single_frame[~mask] + + mean_p_dist = scatter(torch.mean(p_dist, 0), b_single_frame, reduce="mean") # [B] + mean_p_dist = torch.mean(mean_p_dist) + return mean_p_dist + + +def compute_pa_metric(out, gt): + gt_pa, out_pa = gt["pa"], out["pa"] + pa_diff = (out_pa - gt_pa) ** 2 # [T, sumJ, 3] + pa_dist = torch.sqrt(torch.sum(pa_diff, axis=-1)) # [T, sumJ] + + sumJ = gt_pa.shape[1] + b_single_frame = gt["batch"][:sumJ] + + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + pa_dist = pa_dist[:, ~mask] + b_single_frame = b_single_frame[~mask] + + mean_pa_dist = scatter(torch.mean(pa_dist, 0), b_single_frame, reduce="mean") + mean_pa_dist = torch.mean(mean_pa_dist) + return mean_pa_dist + + +def compute_ra_xz_metric(out, gt): + gt_ra_xz, out_ra_xz = gt["ra"][..., [2, 3]], out["ra"][..., [2, 3]] + ra_xz_dist = torch.linalg.norm((gt_ra_xz - out_ra_xz), axis=-1) + return torch.mean(ra_xz_dist) + + +def compute_ra_theta_metric(out, gt): + gt_ra_dt, out_ra_dt = gt["ra"][..., [0, 1]], out["ra"][..., [0, 1]] + ra_dt_dist = torch.linalg.norm((gt_ra_dt - out_ra_dt), axis=-1) + return torch.mean(ra_dt_dist) + + +def compute_rtheta_metric(out, gt): + gt_r_theta, out_r_theta = gt["r"][..., 0], out["r"][..., 0] + r_theta_diff = torch.abs(gt_r_theta - out_r_theta).mean() + return r_theta_diff + + +def compute_rdx_metric(out, gt): + gt_r_dx, out_r_dx = gt["r"][..., 1], out["r"][..., 1] + r_dx_diff = torch.abs(gt_r_dx - out_r_dx).mean() + return r_dx_diff + + +def compute_rdz_metric(out, gt): + gt_r_dz, out_r_dz = gt["r"][..., 2], out["r"][..., 2] + r_dz_diff = torch.abs(gt_r_dz - out_r_dz).mean() + return r_dz_diff + + +def compute_rh_metric(out, gt): + gt_r_h, out_r_h = gt["r"][..., 3], out["r"][..., 3] + r_h_diff = torch.abs(gt_r_h - out_r_h).mean() + return r_h_diff + + +def compute_pen_metric(out, gt): + out_pa = out["pa"] + + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + out_pa = out_pa[:, ~mask] + + penetration = torch.mean(torch.min(out_pa[..., 1], tensor_utils.Tensor([0]))) + return penetration + + +def compute_jerk_metric(out, gt, fps=30): + """positional jitter (3rd derivative): smootheness of motion. + https://en.wikipedia.org/wiki/Finite_difference_coefficient + https://github.com/Xinyu-Yi/TransPose/blob/main/articulate/evaluator.py#L327 + """ + CM2KM = 0.01 * 0.001 + out_pa = out["pa"] # [T, sumJ, 3] + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + out_pa = out_pa[:, ~mask] + + jerk = (out_pa[3:] - 3 * out_pa[2:-1] + 3 * out_pa[1:-2] - out_pa[:-3]) * (fps**3) + jerk = jerk.norm(dim=-1).mean() * CM2KM + return jerk + + +def compute_slide_metric(out, gt): + """foot skating + Mode-Adaptive Neural Networks for Quadruped Motion Control [https://homepages.inf.ed.ac.uk/tkomura/dog.pdf] + """ + H = 3 # 2.5 TODO change it as a parameter + out_pa = out["pa"] + if "mask" in gt: + mask = gt["mask"].reshape(out_pa.shape[0], -1)[0] + out_pa = out_pa[:, ~mask] + + pv = out_pa[1:] - out_pa[:-1] + h = out_pa[1:, :, 1] + contact = torch.clamp(2 - 2 ** (h / H), 0, 1).unsqueeze(-1) + slide = (pv * contact).norm(dim=-1).mean() + return slide + + +def compute_pa_metric_skel_aware_version(out, gt): + gt_pa, out_pa = gt["pa"], out["pa"] + err = (gt_pa - out_pa) * (gt_pa - out_pa) + err /= (gt["height"] ** 2)[..., None, None] + err = err.mean() * 1000 + return err + + +def compute_p_metric_skel_aware_version(out, gt): + gt_pa, out_pa = gt["p"], out["p"] + err = (gt_pa - out_pa) * (gt_pa - out_pa) + err /= (gt["height"] ** 2)[..., None, None] + err = err.mean() * 1000 + return err + + +def compute_ra_metric_skel_aware_version(out, gt): + gt_ra_xz, out_ra_xz = gt["ra"][..., [2, 3]], out["ra"][..., [2, 3]] + err = (gt_ra_xz - out_ra_xz) * (gt_ra_xz - out_ra_xz) + err /= (gt["height"] ** 2)[..., None] + err = err.mean() * 1000 + return err + + +def compute_qR_metric(out, gt): + gt_qR, out_qR = gt["qR"], out["qR"] + qbi = gt["qbi"] + qR_diff = gt_qR[:, qbi].transpose(2, 3) @ out_qR[:, qbi] + qR_diff_aa = tensor_utils.matrix_to_axis_angle(qR_diff) + qR_diff_aa_norm = torch.linalg.norm(qR_diff_aa, dim=-1) + return qR_diff_aa_norm.mean() + + +_metric_matching_ = { + "p": compute_p_metric, + "pa": compute_pa_metric, + "ra_xz": compute_ra_xz_metric, + "ra_theta": compute_ra_theta_metric, + "r_theta": compute_rtheta_metric, + "r_dx": compute_rdx_metric, + "r_dz": compute_rdz_metric, + "r_h": compute_rh_metric, + "pen": compute_pen_metric, + "jerk": compute_jerk_metric, + "slide": compute_slide_metric, + "pa_skel_aware": compute_pa_metric_skel_aware_version, + "p_skel_aware": compute_p_metric_skel_aware_version, + "ra_skel_aware": compute_ra_metric_skel_aware_version, + "qR": compute_qR_metric, +} + + +def get_metric_function(ltype): + return _metric_matching_[ltype] + + +def get_metric_names(): + return list(_metric_matching_.keys()) + + +def compute_metric(metric_cfg, out, gt): + metrics = dict() + for key in metric_cfg: + ftn = get_metric_function(key) + metrics[key] = ftn(out, gt) + return metrics diff --git a/src/sata/my_gat_conv.py b/src/sata/my_gat_conv.py new file mode 100644 index 0000000000000000000000000000000000000000..607e2be4fc3d66a47cfef26323b0bb47b93502aa --- /dev/null +++ b/src/sata/my_gat_conv.py @@ -0,0 +1,341 @@ +from typing import Optional, Tuple, Union + +import torch +import torch.nn.functional as F +from torch import Tensor +from torch.nn import Parameter +from torch_sparse import SparseTensor, set_diag + +from torch_geometric.nn.conv import MessagePassing +from torch_geometric.nn.dense.linear import Linear +from torch_geometric.typing import ( + Adj, + NoneType, + OptPairTensor, + OptTensor, + Size, +) +from torch_geometric.utils import add_self_loops, remove_self_loops, softmax + +# from ..inits import glorot, zeros +from torch_geometric.nn.inits import glorot, zeros + + +class GATConv(MessagePassing): + r"""The graph attentional operator from the `"Graph Attention Networks" + `_ paper + + .. math:: + \mathbf{x}^{\prime}_i = \alpha_{i,i}\mathbf{\Theta}\mathbf{x}_{i} + + \sum_{j \in \mathcal{N}(i)} \alpha_{i,j}\mathbf{\Theta}\mathbf{x}_{j}, + + where the attention coefficients :math:`\alpha_{i,j}` are computed as + + .. math:: + \alpha_{i,j} = + \frac{ + \exp\left(\mathrm{LeakyReLU}\left(\mathbf{a}^{\top} + [\mathbf{\Theta}\mathbf{x}_i \, \Vert \, \mathbf{\Theta}\mathbf{x}_j] + \right)\right)} + {\sum_{k \in \mathcal{N}(i) \cup \{ i \}} + \exp\left(\mathrm{LeakyReLU}\left(\mathbf{a}^{\top} + [\mathbf{\Theta}\mathbf{x}_i \, \Vert \, \mathbf{\Theta}\mathbf{x}_k] + \right)\right)}. + + If the graph has multi-dimensional edge features :math:`\mathbf{e}_{i,j}`, + the attention coefficients :math:`\alpha_{i,j}` are computed as + + .. math:: + \alpha_{i,j} = + \frac{ + \exp\left(\mathrm{LeakyReLU}\left(\mathbf{a}^{\top} + [\mathbf{\Theta}\mathbf{x}_i \, \Vert \, \mathbf{\Theta}\mathbf{x}_j + \, \Vert \, \mathbf{\Theta}_{e} \mathbf{e}_{i,j}]\right)\right)} + {\sum_{k \in \mathcal{N}(i) \cup \{ i \}} + \exp\left(\mathrm{LeakyReLU}\left(\mathbf{a}^{\top} + [\mathbf{\Theta}\mathbf{x}_i \, \Vert \, \mathbf{\Theta}\mathbf{x}_k + \, \Vert \, \mathbf{\Theta}_{e} \mathbf{e}_{i,k}]\right)\right)}. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + edge_dim (int, optional): Edge feature dimensionality (in case + there are any). (default: :obj:`None`) + fill_value (float or Tensor or str, optional): The way to generate + edge features of self-loops (in case :obj:`edge_dim != None`). + If given as :obj:`float` or :class:`torch.Tensor`, edge features of + self-loops will be directly given by :obj:`fill_value`. + If given as :obj:`str`, edge features of self-loops are computed by + aggregating all features of edges that point to the specific node, + according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`, + :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`"mean"`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`torch_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, H * F_{out})` or + :math:`((|\mathcal{V}_t|, H * F_{out})` if bipartite. + If :obj:`return_attention_weights=True`, then + :math:`((|\mathcal{V}|, H * F_{out}), + ((2, |\mathcal{E}|), (|\mathcal{E}|, H)))` + or :math:`((|\mathcal{V_t}|, H * F_{out}), ((2, |\mathcal{E}|), + (|\mathcal{E}|, H)))` if bipartite + """ + + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + heads: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + dropout: float = 0.0, + add_self_loops: bool = True, + edge_dim: Optional[int] = None, + fill_value: Union[float, Tensor, str] = "mean", + bias: bool = True, + **kwargs, + ): + kwargs.setdefault("aggr", "add") + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + self.add_self_loops = add_self_loops + self.edge_dim = edge_dim + self.fill_value = fill_value + + # In case we are operating in bipartite graphs, we apply separate + # transformations 'lin_src' and 'lin_dst' to source and target nodes: + if isinstance(in_channels, int): + self.lin_src = Linear( + in_channels, + heads * out_channels, + bias=False, + weight_initializer="glorot", + ) + self.lin_dst = self.lin_src + else: + self.lin_src = Linear( + in_channels[0], heads * out_channels, False, weight_initializer="glorot" + ) + self.lin_dst = Linear( + in_channels[1], heads * out_channels, False, weight_initializer="glorot" + ) + + # The learnable parameters to compute attention coefficients: + self.att_src = Parameter(torch.Tensor(1, heads, out_channels)) + self.att_dst = Parameter(torch.Tensor(1, heads, out_channels)) + + if edge_dim is not None: + self.lin_edge = Linear( + edge_dim, heads * out_channels, bias=False, weight_initializer="glorot" + ) + self.att_edge = Parameter(torch.Tensor(1, heads, out_channels)) + else: + self.lin_edge = None + self.register_parameter("att_edge", None) + + if bias and concat: + self.bias = Parameter(torch.Tensor(heads * out_channels)) + elif bias and not concat: + self.bias = Parameter(torch.Tensor(out_channels)) + else: + self.register_parameter("bias", None) + + self.reset_parameters() + + def reset_parameters(self): + self.lin_src.reset_parameters() + self.lin_dst.reset_parameters() + if self.lin_edge is not None: + self.lin_edge.reset_parameters() + glorot(self.att_src) + glorot(self.att_dst) + glorot(self.att_edge) + zeros(self.bias) + + def forward( + self, + x: Union[Tensor, OptPairTensor], + edge_index: Adj, + edge_attr: OptTensor = None, + size: Size = None, + return_attention_weights=None, + ): + # type: (Union[Tensor, OptPairTensor], Tensor, OptTensor, Size, NoneType) -> Tensor # noqa + # type: (Union[Tensor, OptPairTensor], SparseTensor, OptTensor, Size, NoneType) -> Tensor # noqa + # type: (Union[Tensor, OptPairTensor], Tensor, OptTensor, Size, bool) -> Tuple[Tensor, Tuple[Tensor, Tensor]] # noqa + # type: (Union[Tensor, OptPairTensor], SparseTensor, OptTensor, Size, bool) -> Tuple[Tensor, SparseTensor] # noqa + r""" + Args: + return_attention_weights (bool, optional): If set to :obj:`True`, + will additionally return the tuple + :obj:`(edge_index, attention_weights)`, holding the computed + attention weights for each edge. (default: :obj:`None`) + """ + # NOTE: attention weights will be returned whenever + # `return_attention_weights` is set to a value, regardless of its + # actual value (might be `True` or `False`). This is a current somewhat + # hacky workaround to allow for TorchScript support via the + # `torch.jit._overload` decorator, as we can only change the output + # arguments conditioned on type (`None` or `bool`), not based on its + # actual value. + + H, C = self.heads, self.out_channels + + # We first transform the input node features. If a tuple is passed, we + # transform source and target node features via separate weights: + if isinstance(x, Tensor): + assert x.dim() == 2, "Static graphs not supported in 'GATConv'" + x_src = x_dst = self.lin_src(x).view(-1, H, C) + else: # Tuple of source and target node features: + x_src, x_dst = x + assert x_src.dim() == 2, "Static graphs not supported in 'GATConv'" + x_src = self.lin_src(x_src).view(-1, H, C) + if x_dst is not None: + x_dst = self.lin_dst(x_dst).view(-1, H, C) + + x = (x_src, x_dst) + + # Next, we compute node-level attention coefficients, both for source + # and target nodes (if present): + alpha_src = (x_src * self.att_src).sum(dim=-1) + alpha_dst = None if x_dst is None else (x_dst * self.att_dst).sum(-1) + alpha = (alpha_src, alpha_dst) + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + # We only want to add self-loops for nodes that appear both as + # source and target nodes: + num_nodes = x_src.size(0) + if x_dst is not None: + num_nodes = min(num_nodes, x_dst.size(0)) + num_nodes = min(size) if size is not None else num_nodes + edge_index, edge_attr = remove_self_loops(edge_index, edge_attr) + edge_index, edge_attr = add_self_loops( + edge_index, + edge_attr, + fill_value=self.fill_value, + num_nodes=num_nodes, + ) + elif isinstance(edge_index, SparseTensor): + if self.edge_dim is None: + edge_index = set_diag(edge_index) + else: + raise NotImplementedError( + "The usage of 'edge_attr' and 'add_self_loops' " + "simultaneously is currently not yet supported for " + "'edge_index' in a 'SparseTensor' form" + ) + + # edge_updater_type: (alpha: OptPairTensor, edge_attr: OptTensor) + self.alpha_src = alpha_src + self.alpha_dst = alpha_dst + alpha = self.edge_updater(edge_index, alpha=alpha, edge_attr=edge_attr) + + # propagate_type: (x: OptPairTensor, alpha: Tensor) + out = self.propagate(edge_index, x=x, alpha=alpha, size=size) + + """ DEBUG """ + # self.x_src = x_src + # self.edge_index = edge_index + # self.out_mid = out.clone() + ## alpha_0 = alpha[torch.where(edge_index[1] == 0)] + ## x_0_neighbor = edge_index[0, torch.where(edge_index[1] == 0)[0]] + ## x_0_update = (alpha_0.unsqueeze(-1)*x_src[x_0_neighbor]).sum(dim=0) + ## assert torch.isclose(x_0_update, out[0], atol=1e-5).all() + + if self.concat: + out = out.view(-1, self.heads * self.out_channels) + else: + out = out.mean(dim=1) + + if self.bias is not None: + out += self.bias + + if isinstance(return_attention_weights, bool): + if isinstance(edge_index, Tensor): + return out, (edge_index, alpha) + elif isinstance(edge_index, SparseTensor): + return out, edge_index.set_value(alpha, layout="coo") + else: + return out + + def edge_update( + self, + alpha_j: Tensor, + alpha_i: OptTensor, + edge_attr: OptTensor, + index: Tensor, + ptr: OptTensor, + size_i: Optional[int], + ) -> Tensor: + # Given edge-level attention coefficients for source and target nodes, + # we simply need to sum them up to "emulate" concatenation: + + alpha = alpha_j if alpha_i is None else alpha_j + alpha_i + + # SM ) commented out + # if edge_attr is not None and self.lin_edge is not None: + # if edge_attr.dim() == 1: + # edge_attr = edge_attr.view(-1, 1) + # edge_attr = self.lin_edge(edge_attr) + # edge_attr = edge_attr.view(-1, self.heads, self.out_channels) + # alpha_edge = (edge_attr * self.att_edge).sum(dim=-1) + # alpha = alpha + alpha_edge + + alpha = F.leaky_relu(alpha, self.negative_slope) + + if edge_attr is not None: # SM) masking edge_attr + alpha[edge_attr] = -torch.inf + + alpha = softmax(alpha, index, ptr, size_i) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + + return alpha + + """DEBUG""" + # self.alpha_j = alpha_j + # self.alpha_i = alpha_i + # self.alpha_0 = alpha_j if alpha_i is None else alpha_j + alpha_i + # self.alpha_1 = F.leaky_relu(self.alpha_0, self.negative_slope) + # self.alpha_2 = softmax(self.alpha_1, index, ptr, size_i) + # self.alpha_3 = F.dropout(self.alpha_2, p=self.dropout, training=self.training) + # return self.alpha_3 + + def message(self, x_j: Tensor, alpha: Tensor) -> Tensor: + return alpha.unsqueeze(-1) * x_j + + def __repr__(self) -> str: + return ( + f"{self.__class__.__name__}({self.in_channels}, " + f"{self.out_channels}, heads={self.heads})" + ) diff --git a/src/sata/mydataset.py b/src/sata/mydataset.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea313b59f2b4bf64816bb08e4bfea6f69d52936 --- /dev/null +++ b/src/sata/mydataset.py @@ -0,0 +1,398 @@ +import os, torch, random +import numpy as np +from pathlib import Path +from torch.utils.data import Dataset, Sampler, DataLoader +from torch_geometric.data import Batch +from functools import partial +from dataclasses import dataclass +from tqdm import tqdm + +from .mypath import * +from sata.skel_pose_graph import SkelPoseGraph, rnd_mask, find_feet + + +@dataclass +class SkelData: + # [nJ, nDim] + lo: torch.Tensor + go: torch.Tensor + qb: torch.BoolTensor + # [nE, 2] + edge_index: torch.LongTensor + edge_feature: torch.LongTensor + tf: torch.Tensor +@dataclass +class PoseData: + # [nJ, nDim] + q: torch.Tensor + p: torch.Tensor + qv: torch.Tensor + pv: torch.Tensor + pprev: torch.Tensor + c: torch.BoolTensor + # [nDim] + r: torch.Tensor + +INIT_WARNING_PPREV = False +INIT_WARNING_TF = False + +def npz_2_data(lo, go, qb, edges, q, p, qv, pv, pprev, c, r, tf): + global INIT_WARNING_PPREV, INIT_WARNING_TF + + if not (np.arange(edges.shape[0]) == edges[:, 1]).all(): + edges = edges[np.argsort(edges[:, 1])] # sort by child idx - just in case ... + + if tf is None: + tf = np.zeros((lo.shape[0], 768)) + if not INIT_WARNING_TF: + print("!!!!!!!!!!!!!!!!!!!!!!! [Warning] tf is None, initializing with zeros !!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + INIT_WARNING_TF = True + + skel_data = SkelData( + torch.Tensor(lo), + torch.Tensor(go), + torch.BoolTensor(qb), + torch.LongTensor(edges[:, :2]).transpose(1, 0), + torch.LongTensor(edges[:, 2:]), + torch.Tensor(tf) if tf is not None else torch.Tensor([]), + ) + + nF = q.shape[0] + # Initialize pprev as zeros with the same shape as pv if it's None + if pprev is None: + pprev = np.zeros_like(pv) + if not INIT_WARNING_PPREV: + print("!!!!!!!!!!!!!!!!!!!!!!! [Warning] pprev is None, initializing with zeros !!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + INIT_WARNING_PPREV = True + + pose_data_list = [ + PoseData( + torch.Tensor(q[i]), + torch.Tensor(p[i]), + torch.Tensor(qv[i]), + torch.Tensor(pv[i]), + torch.Tensor(pprev[i]), + torch.BoolTensor(c[i]).reshape(-1, 1), + torch.Tensor(r[i]).reshape(1, -1), + ) + for i in range(nF) + ] + return skel_data, pose_data_list + + +class PairedDataset(Dataset): + copy_orig_contact = False + + def __init__(self, min_motion_lens): + # skel + self.skel_list = [] + self.pose_list = [] + + ## file info. + # nFile: number of all npz files loaded, including original and retargeted + self.filepaths = [] + self.frame_cnts = [] + self.start_frames = [] + self.end_frames = [] + + ## motion set related info + self.mi_ri_2_fi = [] + # mi: semantic motion index (same mi means semantically identical motion) + # ri: 0<=ri= mi + if len(self.mi_ri_2_fi) == mi: + # new semantic motion set + self.mi_ri_2_fi.append([]) + else: + # make sure the number of frames is consistent among retargeted dataset + orig_fi = self.mi_ri_2_fi[mi][0] + orig_nFrame = self.frame_cnts[orig_fi] + + assert orig_nFrame == nFrame + if self.copy_orig_contact: + # copy contact from the original motion (optional) + lf, rf = find_feet(sd) + orig_sd = self.skel_list[orig_fi] + orig_start = self.start_frames[orig_fi] + orig_pdl = self.pose_list[orig_start : orig_start + orig_nFrame] + orig_lf, orig_rf = find_feet(orig_sd) + for pdi, orig_pdi in zip(pdl, orig_pdl): + pdi.c[lf] = orig_pdi.c[orig_lf] + pdi.c[rf] = orig_pdi.c[orig_rf] + + self.mi_ri_2_fi[mi].append(fi) + + def add_data_from_npz(self, mi, npz_fp, bvh_fp=None): + data = np.load(npz_fp) + if bvh_fp is None: + bvh_fp = npz_fp # placeholder + if data['q'].shape[0] < self.min_motion_lens: + # print(f"[Warning] Motion in {npz_fp} has less frames ({data['q'].shape[0]}) than min_motion_lens ({self.min_motion_lens}).") + # print("[Info] Skipping this file.") + return + + # Load tf from separate processed_text folder + tf_fp = npz_fp.replace('/processed/', '/joint_text_features/') + try: + tf_data = np.load(tf_fp) + if 'tf' not in tf_data: + raise KeyError(f"'tf' key not found in {tf_fp}") + # Convert to dict and update with tf + data_dict = {key: data[key] for key in data.files} + data_dict['tf'] = tf_data['tf'] + except Exception as e: + print(f"[Warning] Failed to load tf from {tf_fp}: {e}") + print("[Warning] This should succeed! Skipping this file may affect subsequent training.") + print("[Info] Skipping this file.") + return + + self.add_data(**data_dict, filepath=bvh_fp, mi=mi) + + def load_data_dir_pairs(self, data_dir): + pair_path = os.path.join(data_dir, "pair.txt") + assert os.path.exists(pair_path), pair_path + " does not exist" + bvh_prefix = os.path.join(os.path.dirname(data_dir), "bvh") + + src_id_map = {} + with open(pair_path, "r") as pair_file: + print('loading data from', pair_path) + lines = pair_file.readlines() + for line in tqdm(lines, total=len(lines), desc="Loading data"): + if line.strip() == "": + continue + src_rel_path, dst_rel_path = line.strip().split() + + if src_rel_path in src_id_map: + src_id = src_id_map[src_rel_path] + + else: # new source + src_id = len(self.mi_ri_2_fi) + src_id_map[src_rel_path] = src_id + npz_fp = os.path.join(data_dir, src_rel_path) + bvh_fp = os.path.join( + bvh_prefix, Path(src_rel_path).with_suffix("") + ) + self.add_data_from_npz(src_id, npz_fp, bvh_fp) + + if dst_rel_path in src_id_map: + continue + else: + npz_fp = os.path.join(data_dir, dst_rel_path) + bvh_fp = os.path.join( + bvh_prefix, Path(dst_rel_path).with_suffix("") + ) + self.add_data_from_npz(src_id, npz_fp, bvh_fp) + + def get_mi_ri_fi_graph(self, mi, ri, frame): + fi = self.mi_ri_2_fi[mi][ri] + si = self.skel_list[fi] + pi = self.pose_list[self.start_frames[fi] + frame] + return SkelPoseGraph(si, pi) + + def __getitem__(self, idx): + ''' + Get the source and target skeleton pose graphs for a given index. + + :param idx: A tuple (mi, src_ri, tgt_ri, frame) where: + - mi: motion index + - src_ri: source rig index + - tgt_ri: target rig index + - frame: frame index + + :return: A tuple (src_graph, tgt_graph) where: + - src_graph: SkelPoseGraph for the source skeleton + - tgt_graph: SkelPoseGraph for the target skeleton + ''' + mi, src_ri, tgt_ri, frame = idx + src_graph = self.get_mi_ri_fi_graph(mi, src_ri, frame) # get motion index, rig index, frame index + tgt_graph = self.get_mi_ri_fi_graph(mi, tgt_ri, frame) + return src_graph, tgt_graph + + def get_mi_src_tgt_all(self, mi, src_ri, tgt_ri): + ''' + Get all frames for a specific motion and rig pair. + + :param mi: Motion index + :param src_ri: Source rig index + :param tgt_ri: Target rig index + + :return: A tuple (batch, frame_cnt) where: + + - batch: List of tuples (src_graph, tgt_graph) for all frames + - frame_cnt: Total number of frames for the specified motion + ''' + assert src_ri >= 0 and src_ri < len(self.mi_ri_2_fi[mi]) + assert tgt_ri >= 0 and tgt_ri < len(self.mi_ri_2_fi[mi]) + frame_cnt = self.frame_cnts[self.mi_ri_2_fi[mi][0]] + batch = [self[mi, src_ri, tgt_ri, frame] for frame in range(frame_cnt)] # a batch contains: all frames of a motion, each frame is a [src_graph, tgt_graph] pair. + return batch, frame_cnt + + +class PairConsqSampler(Sampler): + def __init__(self, dataset, batch_size, consq_n, shuffle): + self.dataset = dataset + self.batch_size = batch_size + self.consq_n = consq_n + self.shuffle = shuffle + + # valid frames(considering consq_n) + self.valid_mi_frames = np.zeros((0, 2), dtype=int) + for mi in range(len(self.dataset.mi_ri_2_fi)): + nFrame = self.dataset.frame_cnts[self.dataset.mi_ri_2_fi[mi][0]] + valid_nF = nFrame - self.consq_n + 1 + new_mi = np.array([mi] * valid_nF) + new_frames = np.arange(0, valid_nF) + new_mi_frames = np.column_stack((new_mi, new_frames)) + self.valid_mi_frames = np.vstack((self.valid_mi_frames, new_mi_frames)) + + # assign it when you want to specify specific src/tgt ri + self.src_ri = None + self.tgt_ri = None + + def __iter__(self): + # random order of valid motion/frame index pairs + if self.shuffle: + # * Caution: random.shuffle (X) : this ftn shuffles elements independently + np.random.shuffle(self.valid_mi_frames) + + # random src/tgt skeletons (including the original ones) + try: # if all retargeted motions have the same number of frames + R = np.array(self.dataset.mi_ri_2_fi).shape[1] + ris = np.random.randint(0, R, size=(len(self.valid_mi_frames), 2)) + # except: + # ris = [ + # random.sample(range(len(self.dataset.mi_ri_2_fi[mi])), 2) + # for mi in self.valid_mi_frames[:, 0] + # ] + except: + # random.choices supports sampling with replacement, allowing 2 draws even from a list of length 1 + ris = [ + random.choices(range(len(self.dataset.mi_ri_2_fi[mi])), k=2) + for mi in self.valid_mi_frames[:, 0] + ] + + batch = [] + n_iter = 0 + for (mi, fi), (src_ri, tgt_ri) in zip(self.valid_mi_frames, ris): + + # override if src/tgt ri is specified + if self.src_ri is not None: + src_ri = self.src_ri + if self.tgt_ri is not None: + tgt_ri = self.tgt_ri + + batch.append((mi, src_ri, tgt_ri, fi)) + + # when batch is full, yield the batch (with consq_n frames each) + if len(batch) == self.batch_size: + consq_batch = [] + for offset in range(self.consq_n): + for mi, src_ri, tgt_ri, frame in batch: + consq_batch.append((mi, src_ri, tgt_ri, frame + offset)) + yield consq_batch + batch = [] + n_iter += 1 + + if n_iter >= len(self): + break + + def __len__(self): + return len(self.valid_mi_frames) // self.batch_size // self.consq_n + + +def PairedGraph_collate_fn(batch, mask_option=[], consq_n=-1): + ''' + Unpack and collate a batch of paired skeleton pose graphs, with optional random masking. + + :param batch: List of tuples (src_graph, tgt_graph) where each graph is a SkelPoseGraph instance + :param mask_option: List of strings indicating which graphs to apply random masking to (e.g., ['src', 'tgt']) + :param consq_n: Number of consecutive frames to consider for masking (if applicable) + :param device: Device to move the collated graphs to (e.g., 'cpu' or 'cuda') + + :return: A tuple (src_batch, tgt_batch) where: + + - src_batch: Collated Batch of source skeleton pose graphs + - tgt_batch: Collated Batch of target skeleton pose graphs + ''' + + # 'batch' : List[pair(src_graph, tgt_graph)] returned from __getitem__ + src_batch = Batch.from_data_list([item[0] for item in batch]) + tgt_batch = Batch.from_data_list([item[1] for item in batch]) + + # masking can also be done in dataset's __getitem__, but it is efficient to do at once by batch when collating + if "src" in mask_option: + assert consq_n > 0, "to apply mask, must provide consq_n > 0" + src_batch.mask = rnd_mask(src_batch, consq_n=consq_n) + if "tgt" in mask_option: + assert consq_n > 0, "to apply mask, must provide consq_n > 0" + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=consq_n) + + # return src_batch.to(device), tgt_batch.to(device) + return src_batch, tgt_batch + +def get_paired_data_loader(data_dir, batch_size, consq_n, shuffle, mask_option, device, + num_workers=4, pin_memory=True, persistent_workers=True, prefetch_factor=2): + ds = PairedDataset(min_motion_lens=consq_n) + ds.load_data_dir_pairs(data_dir) + sampler = PairConsqSampler( + ds, batch_size=batch_size, consq_n=consq_n, shuffle=shuffle + ) + + dl = DataLoader( + ds, + batch_sampler=sampler, + collate_fn=partial( + PairedGraph_collate_fn, + mask_option=mask_option, + consq_n=consq_n, + ), + # === + num_workers=num_workers, + pin_memory=pin_memory, + persistent_workers=persistent_workers if num_workers > 0 else False, + prefetch_factor=prefetch_factor if num_workers > 0 else None, + # === + ) + return dl + + +def get_mi_src_tgt_all_graph(dataset: PairedDataset, mi, src_ri, tgt_ri, device): + ''' + Get all frames for a specific motion and rig pair, returning collated graphs. + + :param dataset: PairedDataset instance + :param mi: Motion index + :param src_ri: Source rig index + :param tgt_ri: Target rig index + :param device: Device to move the graphs to (e.g., 'cpu' or 'cuda') + + :return: A tuple (batch, consq_n) where: + + - batch: Tuple of collated (src_graph, tgt_graph) for all frames + - consq_n: Total number of frames for the specified motion + + ''' + all_batch_idx, consq_n = dataset.get_mi_src_tgt_all(mi, src_ri, tgt_ri) # mi: motion index, ri: rig index + return PairedGraph_collate_fn(all_batch_idx), consq_n diff --git a/src/sata/mymodel.py b/src/sata/mymodel.py new file mode 100644 index 0000000000000000000000000000000000000000..20bb204d36b47cbf82b5fb8474f8ca5e4d93d9c6 --- /dev/null +++ b/src/sata/mymodel.py @@ -0,0 +1,1483 @@ +import torch, os +from .mypath import RESULT_DIR +from sata.skel_pose_graph import rep_dim +from .utils.file_io import load_model_cfg + +# my_gat_conv: a modified version of `torch_geometric.nn.conv.gat_conv` to enable edge masking +from sata.my_gat_conv import GATConv +from torch_geometric.nn import global_max_pool, global_mean_pool, GINConv, GINEConv, GPSConv, SAGPooling +from torch.nn import Linear, ReLU, Sequential, ModuleList, LayerNorm, BatchNorm1d, GELU +from sata.distribution import DiagonalGaussianDistribution +from torch.nn.init import xavier_uniform_, zeros_ +from torch_geometric.utils import to_dense_batch + +# VQ-VAE related imports +from vector_quantize_pytorch import ResidualVQ, VectorQuantize + +from torch import nn + +class TemporalAttentionPooling(torch.nn.Module): + """ + Attention-weighted pooling over the temporal dimension. + Learns the importance of each timestep, preserving more temporal information than simple max pooling. + """ + def __init__(self, z_dim): + super().__init__() + # attention network: z_dim -> z_dim//4 -> 1 + self.attention = torch.nn.Sequential( + torch.nn.Linear(z_dim, z_dim // 4), + torch.nn.ReLU(), + torch.nn.Linear(z_dim // 4, 1) + ) + + def forward(self, pool_z_x, seq_id): + """ + Args: + pool_z_x: [B*T, z_dim] encoder output features + seq_id: [B*T] sequence index for each vector, in range [0, B-1] + Returns: + z: [B, z_dim] attention-weighted pooled representation per sequence + """ + from torch_scatter import scatter_softmax, scatter_sum + + # compute attention scores + attn_scores = self.attention(pool_z_x) # [B*T, 1] + + # softmax within each sequence to get normalized attention weights + attn_weights = scatter_softmax(attn_scores, seq_id, dim=0) # [B*T, 1] + + # weighted sum: feature at each timestep * attention weight + weighted_features = pool_z_x * attn_weights # [B*T, z_dim] + z = scatter_sum(weighted_features, seq_id, dim=0) # [B, z_dim] + + return z + +class TemporalTransformer(torch.nn.Module): + """Temporal Transformer: LayerNorm → Self-Attention → Residual → LayerNorm → FFN → Residual""" + def __init__(self, hidden_dim, num_heads=4, dropout=0.1, ff_dim_multiplier=2, + use_pos_encoding=True, pos_encoding_type="sinusoidal", max_seq_len=512): + super(TemporalTransformer, self).__init__() + + self.hidden_dim = hidden_dim + self.num_heads = num_heads + self.use_pos_encoding = use_pos_encoding + self.pos_encoding_type = pos_encoding_type + + self.norm1 = nn.LayerNorm(hidden_dim) + self.norm2 = nn.LayerNorm(hidden_dim) + self.self_attn = nn.MultiheadAttention(embed_dim=hidden_dim, num_heads=num_heads, + dropout=dropout, batch_first=True) + + ff_hidden_dim = hidden_dim * ff_dim_multiplier + self.ffn = nn.Sequential( + nn.Linear(hidden_dim, ff_hidden_dim), nn.GELU(), nn.Dropout(dropout), + nn.Linear(ff_hidden_dim, hidden_dim), + ) + self.dropout = nn.Dropout(dropout) + + if self.use_pos_encoding: + if pos_encoding_type == "learnable": + self.pos_embedding = nn.Parameter(torch.randn(1, max_seq_len, hidden_dim) * 0.02) + self.max_seq_len = max_seq_len + elif pos_encoding_type == "sinusoidal": + self.max_seq_len = None + else: + raise ValueError(f"Unknown pos_encoding_type: {pos_encoding_type}") + + self._init_weights() + + def _init_weights(self): + for module in self.ffn: + if isinstance(module, nn.Linear): + nn.init.xavier_uniform_(module.weight) + if module.bias is not None: + nn.init.zeros_(module.bias) + + def _get_sinusoidal_encoding(self, seq_len, d_model, device): + """Generate sinusoidal position encoding -> [1, seq_len, d_model]""" + position = torch.arange(seq_len, dtype=torch.float32, device=device).unsqueeze(1) + div_term = torch.exp(torch.arange(0, d_model, 2, dtype=torch.float32, device=device) * + -(torch.log(torch.tensor(10000.0)) / d_model)) + pos_encoding = torch.zeros(seq_len, d_model, device=device) + pos_encoding[:, 0::2] = torch.sin(position * div_term) + pos_encoding[:, 1::2] = torch.cos(position * div_term) + return pos_encoding.unsqueeze(0) + + def forward(self, x): + """x: [B*V, T, C] -> [B*V, T, C]""" + BV, T, C = x.shape + + if self.use_pos_encoding: + if self.pos_encoding_type == "learnable": + if T > self.max_seq_len: + raise ValueError(f"Sequence length {T} exceeds max_seq_len {self.max_seq_len}") + pos_enc = self.pos_embedding[:, :T, :] + else: + pos_enc = self._get_sinusoidal_encoding(T, C, x.device) + x_with_pos = x + pos_enc + else: + x_with_pos = x + + x_norm = self.norm1(x_with_pos) + attn_out, _ = self.self_attn(x_norm, x_norm, x_norm, need_weights=False) + x = x + self.dropout(attn_out) + + x_norm = self.norm2(x) + ff_out = self.ffn(x_norm) + x = x + self.dropout(ff_out) + + return x + +class SinusoidalEncoder(nn.Module): + def __init__(self, input_dim=6, output_dim=128): + super().__init__() + self.output_dim = output_dim + self.proj = nn.Linear(input_dim, output_dim // 2) + + def forward(self, x): + """x: [N, input_dim] -> [N, output_dim]""" + x_proj = self.proj(x) + return torch.cat([torch.sin(x_proj), torch.cos(x_proj)], dim=-1) + +class NodeWiseMultiSourceFusion(nn.Module): + """Multi-source fusion: Motion + Skeleton + Text using FiLM-style modulation""" + def __init__(self, motion_dim, skel_dim, text_dim, hidden_dim=128): + super().__init__() + + self.skeleton_projector = SinusoidalEncoder(input_dim=skel_dim, output_dim=hidden_dim) + self.text_projector = nn.Linear(text_dim, hidden_dim) + self.motion_projector = nn.Linear(motion_dim, hidden_dim) + + self.condition_fusion = nn.Sequential( + nn.Linear(hidden_dim * 2, hidden_dim), nn.LayerNorm(hidden_dim), nn.SiLU(), + nn.Linear(hidden_dim, hidden_dim), nn.SiLU() + ) + self.style_proj = nn.Linear(hidden_dim, hidden_dim * 2) + self.norm = nn.LayerNorm(hidden_dim) + self.dropout = nn.Dropout(0.1) + self.gate_proj = nn.Linear(hidden_dim, hidden_dim) + + def forward(self, motion_feat, skel_feat, text_feat): + """All inputs: [N, dim] where N = B*T*V""" + proj_skel = self.skeleton_projector(skel_feat) # [N, hidden_dim] + proj_text = self.text_projector(text_feat) # [N, hidden_dim] + proj_motion = self.motion_projector(motion_feat) # [N, hidden_dim] + + residual = proj_motion + cond_input = torch.cat([proj_skel, proj_text], dim=-1) # [N, hidden_dim*2] + condition = self.condition_fusion(cond_input) # [N, hidden_dim] + + style = self.style_proj(condition) # [N, hidden_dim*2] + scale, shift = torch.chunk(style, 2, dim=-1) # [N, hidden_dim], [N, hidden_dim] + + x = self.norm(proj_motion) + x = x * (1 + scale) + shift + + gate = torch.sigmoid(self.gate_proj(condition)) + out = residual + x * gate + + return out + +class GPSEncTemporal(torch.nn.Module): + """GPS Encoder with interleaved Spatial-Temporal layers""" + def __init__(self, rep_cfg, z_dim, enc_cfg): + super(GPSEncTemporal, self).__init__() + + skel_dim = sum([rep_dim[k] for k in rep_cfg["skel"]]) + text_dim = 0 if 'tf' not in rep_cfg["skel"] else rep_dim['tf'] + skel_dim -= text_dim + pose_dim = sum([rep_dim[k] for k in rep_cfg["pose"]]) + + hidden_dim = enc_cfg.get("hidden_dim", 256) + num_layers = enc_cfg.get("num_layers", 3) + heads = enc_cfg.get("heads", 4) + attn_type = enc_cfg.get("attn_type", "multihead") + attn_kwargs = enc_cfg.get("attn_kwargs", {"dropout": 0.5}) + temporal_dropout = enc_cfg.get("temporal_dropout", 0.1) + + self.fusion_module = NodeWiseMultiSourceFusion( + motion_dim=pose_dim, skel_dim=skel_dim, text_dim=text_dim, hidden_dim=hidden_dim + ) + self.edge_proj = Linear(2, hidden_dim) + + self.spatial_convs = ModuleList() + self.temporal_convs = ModuleList() + + for _ in range(num_layers): + nn_module = Sequential(Linear(hidden_dim, hidden_dim), ReLU(), Linear(hidden_dim, hidden_dim)) + spatial_conv = GPSConv(hidden_dim, GINEConv(nn_module), heads=heads, + attn_type=attn_type, attn_kwargs=attn_kwargs, norm="layer_norm") + self.spatial_convs.append(spatial_conv) + + temporal_num_heads = enc_cfg.get("temporal_num_heads", 4) + temporal_ff_dim_multiplier = enc_cfg.get("temporal_ff_dim_multiplier", 2) + use_temporal_pos_encoding = enc_cfg.get("use_temporal_pos_encoding", True) + pos_encoding_type = enc_cfg.get("pos_encoding_type", "sinusoidal") + max_seq_len = enc_cfg.get("max_seq_len", 512) + temporal_layer = TemporalTransformer( + hidden_dim=hidden_dim, num_heads=temporal_num_heads, dropout=temporal_dropout, + ff_dim_multiplier=temporal_ff_dim_multiplier, use_pos_encoding=use_temporal_pos_encoding, + pos_encoding_type=pos_encoding_type, max_seq_len=max_seq_len + ) + self.temporal_convs.append(temporal_layer) + + self.output_proj = Linear(hidden_dim, z_dim) + self.rep_cfg = rep_cfg + self._init_weights() + + def _init_weights(self): + xavier_uniform_(self.edge_proj.weight) + zeros_(self.edge_proj.bias) + for conv in self.spatial_convs: + for layer in conv.mlp: + if isinstance(layer, Linear): + xavier_uniform_(layer.weight) + if layer.bias is not None: + zeros_(layer.bias) + xavier_uniform_(self.output_proj.weight) + zeros_(self.output_proj.bias) + + def forward(self, src_graph, consq_n): + """ + Args: + consq_n: Window size T for temporal grouping + Returns: + pool_z_x: [T*B, z_dim] + """ + edge_index_bi = src_graph.edge_index_bidirection + batch_id = src_graph.batch # [T*B*V], range [0, T*B-1] + + x = self.fusion_module( + motion_feat=src_graph.pose_x, + skel_feat=src_graph.skel_x_no_text, + text_feat=src_graph.text_feature + ) # [T*B*V, hidden_dim] + + edge_attr = src_graph.edge_feature.float() # [nE, 2] + edge_attr_reverse = torch.stack([edge_attr[:, 1], edge_attr[:, 0]], dim=1) + edge_attr_bi = torch.cat([edge_attr, edge_attr_reverse], dim=0) # [2*nE, 2] + edge_attr_bi = self.edge_proj(edge_attr_bi) # [2*nE, hidden_dim] + + num_graphs = batch_id.max().item() + 1 # T*B + + # consq_n is the actual T value: + # - Training: consq_n = 64 (fixed window), B = 32 + # - Evaluation: consq_n = 104 (full sequence), B = 1 + T = consq_n + B = num_graphs // T + assert num_graphs % T == 0, f"num_graphs ({num_graphs}) must be divisible by T ({T})" + + for spatial_conv, temporal_conv in zip(self.spatial_convs, self.temporal_convs): + x = spatial_conv(x, edge_index_bi, batch_id, edge_attr=edge_attr_bi) # [N_total, C] + C = x.shape[-1] + + x_dense, mask = to_dense_batch(x, batch_id) # [T*B, V_max, C] + V_max = x_dense.shape[1] + + # Reshape: [T*B, V_max, C] -> [B*V_max, T, C] + x_reshaped = x_dense.reshape(T, B, V_max, C).permute(1, 2, 0, 3).reshape(B * V_max, T, C) + x_reshaped = temporal_conv(x_reshaped) # [B*V_max, T, C] + # Reshape back: [B*V_max, T, C] -> [T*B, V_max, C] + x_dense = x_reshaped.reshape(B, V_max, T, C).permute(2, 0, 1, 3).reshape(T * B, V_max, C) + x = x_dense[mask] # [N_total, C] + + from torch_geometric.nn import global_max_pool + pool_z_x = global_max_pool(x, batch_id) # [T*B, hidden_dim] + pool_z_x = self.output_proj(pool_z_x) # [T*B, z_dim] + return pool_z_x + +class GPSDecTemporal(torch.nn.Module): + """GPS Decoder with interleaved Spatial-Temporal layers""" + def __init__(self, rep_cfg, z_dim, dec_cfg): + super(GPSDecTemporal, self).__init__() + + skel_dim = sum([rep_dim[k] for k in rep_cfg["skel"]]) + text_dim = 0 if 'tf' not in rep_cfg["skel"] else rep_dim['tf'] + skel_dim -= text_dim + out_dim = sum([rep_dim[k] for k in rep_cfg["out"]]) + + hidden_dim = dec_cfg.get("hidden_dim", 256) + num_layers = dec_cfg.get("num_layers", 3) + heads = dec_cfg.get("heads", 4) + attn_type = dec_cfg.get("attn_type", "multihead") + attn_kwargs = dec_cfg.get("attn_kwargs", {"dropout": 0.5}) + temporal_dropout = dec_cfg.get("temporal_dropout", 0.1) + + self.fusion_module = NodeWiseMultiSourceFusion( + motion_dim=z_dim, skel_dim=skel_dim, text_dim=text_dim, hidden_dim=hidden_dim + ) + self.edge_proj = Linear(2, hidden_dim) + + self.spatial_deconvs = ModuleList() + self.temporal_deconvs = ModuleList() + + for _ in range(num_layers): + nn_module = Sequential(Linear(hidden_dim, hidden_dim), ReLU(), Linear(hidden_dim, hidden_dim)) + spatial_conv = GPSConv(hidden_dim, GINEConv(nn_module), heads=heads, + attn_type=attn_type, attn_kwargs=attn_kwargs, norm="layer_norm") + self.spatial_deconvs.append(spatial_conv) + + temporal_num_heads = dec_cfg.get("temporal_num_heads", 4) + temporal_ff_dim_multiplier = dec_cfg.get("temporal_ff_dim_multiplier", 2) + use_temporal_pos_encoding = dec_cfg.get("use_temporal_pos_encoding", True) + pos_encoding_type = dec_cfg.get("pos_encoding_type", "sinusoidal") + max_seq_len = dec_cfg.get("max_seq_len", 512) + temporal_layer = TemporalTransformer( + hidden_dim=hidden_dim, num_heads=temporal_num_heads, dropout=temporal_dropout, + ff_dim_multiplier=temporal_ff_dim_multiplier, use_pos_encoding=use_temporal_pos_encoding, + pos_encoding_type=pos_encoding_type, max_seq_len=max_seq_len + ) + self.temporal_deconvs.append(temporal_layer) + + self.output_proj = Linear(hidden_dim, out_dim) + self._init_weights() + + def _init_weights(self): + xavier_uniform_(self.edge_proj.weight) + zeros_(self.edge_proj.bias) + for conv in self.spatial_deconvs: + for layer in conv.mlp: + if isinstance(layer, Linear): + xavier_uniform_(layer.weight) + if layer.bias is not None: + zeros_(layer.bias) + xavier_uniform_(self.output_proj.weight) + zeros_(self.output_proj.bias) + + def forward(self, src_z, tgt_graph, consq_n): + """ + Args: + src_z: [T*B, z_dim] + consq_n: Window size T for temporal grouping + Returns: + dec_x: [N_total, out_dim] + """ + edge_index_bi = tgt_graph.edge_index_bidirection + batch_id = tgt_graph.batch # [T*B*V], range [0, T*B-1] + + num_graphs = batch_id.max().item() + 1 # T*B + + # consq_n is the actual T value: + # - Training: consq_n = 64 (fixed window), B = 32 + # - Evaluation: consq_n = 104 (full sequence), B = 1 + T = consq_n + B = num_graphs // T + assert num_graphs % T == 0, f"num_graphs ({num_graphs}) must be divisible by T ({T})" + + dec_x = src_z[batch_id] # [N_total, z_dim] + dec_x = self.fusion_module( + motion_feat=dec_x, + skel_feat=tgt_graph.skel_x_no_text, + text_feat=tgt_graph.text_feature + ) # [T*B*V, hidden_dim] + + edge_attr = tgt_graph.edge_feature.float() # [nE, 2] + edge_attr_reverse = torch.stack([edge_attr[:, 1], edge_attr[:, 0]], dim=1) + edge_attr_bi = torch.cat([edge_attr, edge_attr_reverse], dim=0) # [2*nE, 2] + edge_attr_bi = self.edge_proj(edge_attr_bi) # [2*nE, hidden_dim] + + for spatial_conv, temporal_conv in zip(self.spatial_deconvs, self.temporal_deconvs): + dec_x = spatial_conv(dec_x, edge_index_bi, batch_id, edge_attr=edge_attr_bi) # [N_total, C] + C = dec_x.shape[-1] + + x_dense, mask = to_dense_batch(dec_x, batch_id) # [T*B, V_max, C] + V_max = x_dense.shape[1] + + # Reshape: [T*B, V_max, C] -> [B*V_max, T, C] + x_reshaped = x_dense.reshape(T, B, V_max, C).permute(1, 2, 0, 3).reshape(B * V_max, T, C) + x_reshaped = temporal_conv(x_reshaped) # [B*V_max, T, C] + # Reshape back: [B*V_max, T, C] -> [T*B, V_max, C] + x_dense = x_reshaped.reshape(B, V_max, T, C).permute(2, 0, 1, 3).reshape(T * B, V_max, C) + dec_x = x_dense[mask] # [N_total, C] + + dec_x = self.output_proj(dec_x) # [N_total, out_dim] + return dec_x + + +class GATEnc(torch.nn.Module): + def __init__(self, rep_cfg, z_dim, enc_cfg): + super(GATEnc, self).__init__() + + skel_dim = sum([rep_dim[k] for k in rep_cfg["skel"]]) + text_dim = 0 if 'tf' not in rep_cfg["skel"] else rep_dim['tf'] + skel_dim -= text_dim # exclude text dim from skel_dim + pose_dim = sum([rep_dim[k] for k in rep_cfg["pose"]]) + + hid_lyrs = enc_cfg["hid_lyrs"] + heads_num = enc_cfg["heads_num"] + + print("[Debug] NodeWiseMultiSourceFusion params:", " skel_dim={}, text_dim={}, pose_dim={}, hidden_dim={}".format( + skel_dim, text_dim, pose_dim, hid_lyrs[0] + )) + + self.fusion_module = NodeWiseMultiSourceFusion( + motion_dim=pose_dim, + skel_dim=skel_dim, + text_dim=text_dim, + hidden_dim=hid_lyrs[0] + ) + + e_Fs = hid_lyrs + [z_dim] + self.convs = [] + for i, (fi_prev, fi) in enumerate(zip(e_Fs[:-1], e_Fs[1:])): + if i != 0: + fi_prev *= heads_num + if i != len(e_Fs) - 2: + heads = heads_num + else: + heads = 1 + self.convs.append( + GATConv(fi_prev, fi, heads=heads, add_self_loops=True, fill_value=0) + ) + self.convs = torch.nn.ModuleList(self.convs) + + self.rep_cfg = rep_cfg + + def forward(self, src_graph): + edge_index_bi = src_graph.edge_index_bidirection + edge_mask_bi = src_graph.edge_mask_bidirection + batch_id = src_graph.batch + + x = self.fusion_module( + motion_feat = src_graph.pose_x, + skel_feat = src_graph.skel_x_no_text, + text_feat = src_graph.text_feature + ) + + for i, conv in enumerate(self.convs): + x = conv(x, edge_index_bi, edge_mask_bi) + + if (i + 1) != len(self.convs): + x = torch.nn.ReLU()(x) + + V_mask = src_graph.mask + if V_mask.sum() > 0: + pool_z_x = global_max_pool(x[~V_mask], batch_id[~V_mask]) + else: + pool_z_x = global_max_pool(x, batch_id) + + return pool_z_x + + +class GATEncEvaluator(torch.nn.Module): + def __init__(self, input_dim, hidden_lyrs, output_dim, heads_num=16, ): + super(GATEncEvaluator, self).__init__() + + e_Fs = [input_dim] + hidden_lyrs + [output_dim] + self.convs = [] + for i, (fi_prev, fi) in enumerate(zip(e_Fs[:-1], e_Fs[1:])): + if i != 0: + fi_prev *= heads_num + if i != len(e_Fs) - 2: + heads = heads_num + else: + heads = 1 + self.convs.append( + GATConv(fi_prev, fi, heads=heads, add_self_loops=True, fill_value=0) + ) + self.convs = torch.nn.ModuleList(self.convs) + + + def forward(self, src_graph): + edge_index_bi = src_graph.edge_index_bidirection + batch_id = src_graph.batch + + x = src_graph.x + + for i, conv in enumerate(self.convs): + x = conv(x, edge_index_bi) + + if (i + 1) != len(self.convs): + x = torch.nn.ReLU()(x) + pool_z_x = global_max_pool(x, batch_id) + assert hasattr(src_graph, 'seq_id') and src_graph.seq_id is not None + seq_id = src_graph.seq_id.squeeze(-1) # [total_frames] or [sumJ] + pool_z_x_seq = global_max_pool(pool_z_x, seq_id) # [num_sequences, output_dim] + + return pool_z_x_seq + + + +class JointPosEncOnlyModel(torch.nn.Module): + """ + Encoder-only model for downstream tasks like text-motion alignment. + Only includes encoder without decoder and Gaussian sampling. + """ + def __init__(self, input_dim, hidden_lyrs, output_dim, device): + super(JointPosEncOnlyModel, self).__init__() + + # Dynamically select encoder type (default to GATEnc for backward compatibility) + self.encoder = GATEncEvaluator(input_dim, hidden_lyrs, output_dim) + + print(self) + + def forward(self, src_graph): + """ + Forward pass for encoder-only model. + + Args: + src_graph: input source graph + + Returns: + z: [B, z_dim] encoded latent representation + """ + z = self.encoder(src_graph) + return z + + @property + def device(self): + return next(self.parameters()).device + + def load_params(self, dir, epoch=None, prefix="", freeze=False): + load_model_name = ( + "last_model.pt" if epoch is None else "model_{}.pt".format(epoch) + ) + load_path = os.path.join(RESULT_DIR, dir, load_model_name) + + saved = torch.load(load_path, map_location=self.device) + model_dict = self.state_dict() + + pretrained_dict = { + k: v for k, v in saved["model"].items() if k.startswith(prefix) + } + model_dict.update(pretrained_dict) + self.load_state_dict(model_dict) + + if freeze: + for name, param in self.named_parameters(): + if name in pretrained_dict: + param.requires_grad = False + print("load model from : ", load_path, " DONE") + print("prefix : ", prefix, ", freeze:", freeze, "\n") + +class GPSEnc(torch.nn.Module): + """GPS-based Encoder with NodeWiseMultiSourceFusion and fixed hidden dimensions""" + def __init__(self, rep_cfg, z_dim, enc_cfg): + super(GPSEnc, self).__init__() + + skel_dim = sum([rep_dim[k] for k in rep_cfg["skel"]]) + text_dim = 0 if 'tf' not in rep_cfg["skel"] else rep_dim['tf'] + skel_dim -= text_dim # exclude text dim from skel_dim + pose_dim = sum([rep_dim[k] for k in rep_cfg["pose"]]) + + hidden_dim = enc_cfg.get("hidden_dim", 256) + num_layers = enc_cfg.get("num_layers", 3) + heads = enc_cfg.get("heads", 4) + attn_type = enc_cfg.get("attn_type", "multihead") + attn_kwargs = enc_cfg.get("attn_kwargs", {"dropout": 0.5}) + + print("[Debug] GPSEnc NodeWiseMultiSourceFusion params:", " skel_dim={}, text_dim={}, pose_dim={}, hidden_dim={}".format( + skel_dim, text_dim, pose_dim, hidden_dim + )) + + # Multi-source fusion module + self.fusion_module = NodeWiseMultiSourceFusion( + motion_dim=pose_dim, + skel_dim=skel_dim, + text_dim=text_dim, + hidden_dim=hidden_dim + ) + + # Edge feature projection to hidden dimension + self.edge_proj = Linear(2, hidden_dim) + + # GPS Convolution layers (all with same hidden_dim) + # GPSConv has internal residual connections and normalization (norm1, norm2, norm3) + self.convs = ModuleList() + + for _ in range(num_layers): + nn = Sequential( + Linear(hidden_dim, hidden_dim), + ReLU(), + Linear(hidden_dim, hidden_dim), + ) + conv = GPSConv( + hidden_dim, + GINEConv(nn), + heads=heads, + attn_type=attn_type, + attn_kwargs=attn_kwargs, + norm="layer_norm" # Use LayerNorm + ) + self.convs.append(conv) + + # Output projection to z_dim + self.output_proj = Linear(hidden_dim, z_dim) + + self.rep_cfg = rep_cfg + + # Initialize weights + self._init_weights() + + def _init_weights(self): + """Initialize linear layers with Xavier uniform""" + xavier_uniform_(self.edge_proj.weight) + zeros_(self.edge_proj.bias) + + for conv in self.convs: + # Initialize GIN MLP layers + for layer in conv.mlp: + if isinstance(layer, Linear): + xavier_uniform_(layer.weight) + if layer.bias is not None: + zeros_(layer.bias) + + xavier_uniform_(self.output_proj.weight) + zeros_(self.output_proj.bias) + + def forward(self, src_graph): + edge_index_bi = src_graph.edge_index_bidirection + batch_id = src_graph.batch + + # Multi-source fusion: motion + skeleton + text + x = self.fusion_module( + motion_feat=src_graph.pose_x, + skel_feat=src_graph.skel_x_no_text, + text_feat=src_graph.text_feature + ) + + # Process edge features: [nE, 2] -> [nE, hidden_dim] + edge_attr = src_graph.edge_feature.float() # [nE, 2]: [depth, reverse_depth] + # Create reversed edge features for bidirectional edges + # For reverse edge (child->parent), swap depth and reverse_depth + edge_attr_reverse = torch.stack([edge_attr[:, 1], edge_attr[:, 0]], dim=1) + edge_attr_bi = torch.cat([edge_attr, edge_attr_reverse], dim=0) # [2*nE, 2] + edge_attr_bi = self.edge_proj(edge_attr_bi) # [2*nE, hidden_dim] + + # GPS layers (GPSConv already has internal residual connections and layer norm) + for conv in self.convs: + x = conv(x, edge_index_bi, batch_id, edge_attr=edge_attr_bi) + + # Global pooling + pool_z_x = global_max_pool(x, batch_id) + + # Project to z_dim + pool_z_x = self.output_proj(pool_z_x) + + return pool_z_x + + + +class SAMEStylePosEncOnlyModelTemporal(torch.nn.Module): + """ + SAME-style encoder-only model for downstream tasks using contrastive learning. + Similar to JointPosEncOnlyModel but uses rep_cfg and encoder configuration + for multi-source fusion (motion + skeleton + text). + """ + def __init__(self, model_cfg, rep_cfg, device="cuda"): + super(SAMEStylePosEncOnlyModelTemporal, self).__init__() + + z_dim = model_cfg["z_dim"] + enc_cfg = model_cfg["Encoder"] + + # Dynamically select encoder type (default to GATEnc for backward compatibility) + enc_type = enc_cfg.get("type", "GATEnc") + if enc_type == "GPSEnc": + self.encoder = GPSEnc(rep_cfg, z_dim, enc_cfg) + elif enc_type == "GATEnc": + self.encoder = GATEnc(rep_cfg, z_dim, enc_cfg) + else: + raise ValueError(f"Unknown encoder type: {enc_type}") + + self.rep_cfg = rep_cfg + self.z_dim = z_dim + + # use temporal attention pooling instead of simple max pooling + self.temporal_pooling = TemporalAttentionPooling(z_dim) + + if "load" in model_cfg: + for load_i in model_cfg["load"]: + self.load_params( + load_i["dir"], load_i["epoch"], load_i["prefix"], load_i["freeze"] + ) + + print(self) + + def forward(self, src_graph): + """ + Forward pass for encoder-only model. + + Args: + src_graph: input source graph + + Returns: + z: [num_sequences, z_dim] encoded latent representation after seq_id pooling + """ + # Explanation: + # 1. pool_z_x.shape = [B * T, z_dim = 512], T varies per sample in the batch + # 2. seq_id.shape = [B * T], identifies which sequence each vector belongs to + # 3. after attention pooling, z.shape = [B, z_dim], B is the number of sequences + + pool_z_x = self.encoder(src_graph) # [B * T, z_dim = 512] + + # attention pooling over the temporal dimension + if hasattr(src_graph, 'seq_id') and src_graph.seq_id is not None: + seq_id = src_graph.seq_id.squeeze(-1) # [B * T] + z = self.temporal_pooling(pool_z_x, seq_id) # [B, z_dim] + else: + raise ValueError('seq_id is required for temporal dimension pooling') + + return z + + @property + def device(self): + return next(self.parameters()).device + + def load_params(self, dir, epoch=None, prefix="", freeze=False): + load_model_name = ( + "last_model.pt" if epoch is None else "model_{}.pt".format(epoch) + ) + load_path = os.path.join(RESULT_DIR, dir, load_model_name) + + saved = torch.load(load_path, map_location=self.device) + model_dict = self.state_dict() + + pretrained_dict = { + k: v for k, v in saved["model"].items() if k.startswith(prefix) + } + model_dict.update(pretrained_dict) + self.load_state_dict(model_dict) + + if freeze: + for name, param in self.named_parameters(): + if name in pretrained_dict: + param.requires_grad = False + print("load model from : ", load_path, " DONE") + print("prefix : ", prefix, ", freeze:", freeze, "\n") + +class SAMEStylePosEncOnlyModel(torch.nn.Module): + """ + SAME-style encoder-only model for downstream tasks using contrastive learning. + Similar to JointPosEncOnlyModel but uses rep_cfg and encoder configuration + for multi-source fusion (motion + skeleton + text). + """ + def __init__(self, model_cfg, rep_cfg, device="cuda"): + super(SAMEStylePosEncOnlyModel, self).__init__() + + z_dim = model_cfg["z_dim"] + enc_cfg = model_cfg["Encoder"] + + # Dynamically select encoder type (default to GATEnc for backward compatibility) + enc_type = enc_cfg.get("type", "GATEnc") + if enc_type == "GPSEncTemporal": + self.encoder = GPSEncTemporal(rep_cfg, z_dim, enc_cfg) + elif enc_type == "GATEnc": + self.encoder = GATEnc(rep_cfg, z_dim, enc_cfg) + else: + raise ValueError(f"Unknown encoder type: {enc_type}") + + self.rep_cfg = rep_cfg + self.z_dim = z_dim + + if "load" in model_cfg: + for load_i in model_cfg["load"]: + self.load_params( + load_i["dir"], load_i["epoch"], load_i["prefix"], load_i["freeze"] + ) + + print(self) + + def forward(self, src_graph): + """ + Forward pass for encoder-only model. + + Args: + src_graph: input source graph + + Returns: + z: [num_sequences, z_dim] encoded latent representation after seq_id pooling + """ + + # Explanation: + # 1. pool_z_x.shape = [B * T, z_dim = 512], T varies per sample in the batch + # 2. len(seq_id) = B * T, identifies which sequence each vector belongs to + # 3. after pooling, z.shape = [B, z_dim], B is the number of sequences + # 4. for seq_id, typical B = 8, seq_id in [0,7]; T = self.max_motion_length (padding not implemented here) + + pool_z_x = self.encoder(src_graph) # [B * T, z_dim = 512] + + # Apply seq_id pooling if available + if hasattr(src_graph, 'seq_id') and src_graph.seq_id is not None: + seq_id = src_graph.seq_id.squeeze(-1) # [total_frames] or [B] + z = global_max_pool(pool_z_x, seq_id) # [num_sequences, z_dim] + else: + z = pool_z_x + + # print(f'pool_z_x.shape: {pool_z_x.shape}') # pool_z_x.shape: torch.Size([1052, 512]) + # print(f'len(src_graph.seq_id): {len(src_graph.seq_id)}') # len(src_graph.seq_id): 1052 + # print(f'max(src_graph.seq_id): {max(src_graph.seq_id)}') # max(src_graph.seq_id): 7 + # print(f'min(src_graph.seq_id): {min(src_graph.seq_id)}') # min(src_graph.seq_id): 0 + # print(f'z.shape: {z.shape}') # z.shape: torch.Size([8, 512]) + return z + + @property + def device(self): + return next(self.parameters()).device + + def load_params(self, dir, epoch=None, prefix="", freeze=False): + load_model_name = ( + "last_model.pt" if epoch is None else "model_{}.pt".format(epoch) + ) + load_path = os.path.join(RESULT_DIR, dir, load_model_name) + + saved = torch.load(load_path, map_location=self.device) + model_dict = self.state_dict() + + pretrained_dict = { + k: v for k, v in saved["model"].items() if k.startswith(prefix) + } + model_dict.update(pretrained_dict) + self.load_state_dict(model_dict) + + if freeze: + for name, param in self.named_parameters(): + if name in pretrained_dict: + param.requires_grad = False + print("load model from : ", load_path, " DONE") + print("prefix : ", prefix, ", freeze:", freeze, "\n") + +class Model(torch.nn.Module): + def __init__(self, model_cfg, rep_cfg): + super(Model, self).__init__() + z_dim = model_cfg["z_dim"] + enc_cfg = model_cfg["Encoder"] + + # Dynamically select encoder type (default to GATEnc for backward compatibility) + enc_type = enc_cfg.get("type", "GATEnc") + if enc_type == "GPSEncTemporal": + self.encoder = GPSEncTemporal(rep_cfg, z_dim, enc_cfg) + else: + raise ValueError(f"Unknown encoder type: {enc_type}") + + self.encoder = torch.nn.ModuleList( + [self.encoder] + ) # Legacy, preserved to run pretrained models; + # projecting to Gaussian parameters + self.to_gauss_params = torch.nn.Linear(z_dim, z_dim*2) + + dec_cfg = model_cfg["Decoder"] + + # Dynamically select decoder type (default to GATDec for backward compatibility) + dec_type = dec_cfg.get("type", "GATDec") + if dec_type == "GPSDecTemporal": + self.decoder = GPSDecTemporal(rep_cfg, z_dim, dec_cfg) + else: + raise ValueError(f"Unknown decoder type: {dec_type}") + + self.decoder = torch.nn.ModuleList( + [self.decoder] + ) # Legacy, preserved to run pretrained models; + + self.rep_cfg = rep_cfg + self.z_dim = z_dim + + if "load" in model_cfg: + for load_i in model_cfg["load"]: + self.load_params( + load_i["dir"], load_i["epoch"], load_i["prefix"], load_i["freeze"] + ) + + print(self) + + self.sample_posterior = model_cfg.get("sample_posterior", True) + + def forward(self, src_graph, tgt_graph, consq_n): + """ + Forward pass for VAE model. + + Args: + src_graph: Source graph batch + tgt_graph: Target graph batch + consq_n: Window size for temporal grouping (required) + """ + h = self.encode(src_graph, consq_n) + if self.sample_posterior: + z = h.sample() + else: + z = h.mode() + z = z.squeeze(1) # [T*B, z_dim] + hatD = self.decode(z, tgt_graph, consq_n) + return z, hatD + + def encode(self, src_graph, consq_n): + """ + Encode source graph to a Gaussian distribution (mean and logvar) + + Args: + src_graph: input source graph + consq_n: Window size for temporal grouping (required) + + Returns: + DiagonalGaussianDistribution object + """ + h = self.encoder[0](src_graph, consq_n) + h = self.to_gauss_params(h).unsqueeze(1) # [T*B, 1, z_dim*2] + h = DiagonalGaussianDistribution(h) + return h + + def decode(self, z, tgt_graph, consq_n): + """ + Decode latent codes to output. + + Args: + z: [T*B, z_dim] - latent codes + tgt_graph: Target graph batch + consq_n: Window size for temporal grouping (required) + """ + hatD = self.decoder[0](z, tgt_graph, consq_n) + return hatD + + @property + def device(self): + return next(self.parameters()).device + + def load_params(self, dir, epoch=None, prefix="", freeze=False): + load_model_name = ( + "last_model.pt" if epoch is None else "model_{}.pt".format(epoch) + ) + load_path = os.path.join(RESULT_DIR, dir, load_model_name) + + saved = torch.load(load_path, map_location=self.device) + model_dict = self.state_dict() + + pretrained_dict = { + k: v for k, v in saved["model"].items() if k.startswith(prefix) + } + model_dict.update(pretrained_dict) + self.load_state_dict(model_dict) + + # for key in model_dict.keys(): + # if key not in dict(model.named_parameters()).keys(): + # print(key) + if freeze: + for name, param in self.named_parameters(): + if name in pretrained_dict: + param.requires_grad = False + print("load model from : ", load_path, " DONE") + print("prefix : ", prefix, ", freeze:", freeze, "\n") + + +def make_load_model(model_epoch, device="cuda"): + """ + Load a trained model (VAE or VQ-VAE) from checkpoint. + Automatically detects model type from config. + + :param model_epoch: model path in format "exp_name/model_N" or "exp_name/last_model" + :param device: device to load model on + :return: (model, config) + """ + if (len(model_epoch.split("/")) == 2) and (model_epoch.split("/")[-1].isdigit()): + load_epoch = model_epoch.split("/")[-1] + load_model = model_epoch[: model_epoch.find(load_epoch) - 1] + load_epoch = int(load_epoch) + else: + load_epoch = None + load_model = model_epoch + print(model_epoch) + + print(load_epoch) + print(load_model) + + config = load_model_cfg(load_model) + + # Auto-detect model type: check if VQ config exists + is_vq_model = "VQ" in config["model"] + + if is_vq_model: + from sata.mymodel import VQ_Model + print(f"Loading VQ Model ({config['model']['VQ'].get('type', 'standard').upper()})") + model = VQ_Model(config["model"], config["representation"]).to(device) + else: + print("Loading VAE Model") + model = Model(config["model"], config["representation"]).to(device) + + model.load_params(load_model, load_epoch) + + return model, config + + +######################## model fwd result post-processing functions ######################## +from sata.utils import tensor_utils +from fairmotion.utils import constants + + +# decompose hatD into each element (e.g: r,q,c) +def parse_hatD(hatD, root_ids, out_rep_cfg, ms_dict): + out = {} + k_start = 0 + for k in out_rep_cfg: + k_dim = rep_dim[k] + val = hatD[:, k_start : k_start + k_dim] + if k + "_s" in ms_dict: + device = val.device + out[k + "_n"] = val + out[k] = val * ms_dict[k + "_s"].to(device=device) + ms_dict[k + "_m"].to( + device=device + ) + else: + out[k] = val + + if k == "r": + out[k + "_n"] = out[k + "_n"][root_ids] + out[k] = out[k][root_ids] + k_start += k_dim # increment element start index + return out + + +# helper functions: reshape [nC*nB, ...] -> [nC, nB, ...] +def reshape_consq(v, consq_n): + new_shape = tuple([consq_n, -1] + list(v.shape[1:])) + return v.reshape(*new_shape) + + +def reshape_dict_consq(result_dict, consq_n): + for k, v in result_dict.items(): + result_dict[k] = reshape_consq(v, consq_n) + return result_dict + + +# forward-kinematics (batch by depth) +def FK(lo, qR, r, root_ids, skel_depth, skel_edge_index): + + # lo [sumJ, 3] + # qR [sumJ, 3, 3] + # r [B, 4] + # root_ids [B] + # skel_depth [sumJ] + # skel_edge_index [2, sumJ] + + joint_T = tensor_utils.Tensor(constants.eye_T())[None, ...].repeat( + lo.shape[0], 1, 1 + ) + joint_T[..., :3, :3] = qR + joint_T[..., :3, 3] = lo + joint_T[root_ids, 1, 3] = r[..., 3].flatten() # height? + joint_T[..., 3, 3] = 1 + + for i in range(skel_depth.max() + 1): + depth_i_idx = torch.where(skel_depth == i)[0] + depth_i_edge = skel_edge_index[:, depth_i_idx] + depth_i_parent, depth_i_child = depth_i_edge + joint_T[depth_i_child] = ( + joint_T[depth_i_parent].clone() @ joint_T[depth_i_child].clone() + ) + + return joint_T + + +# accumulate delta root(r=(dtheta, dx, dz, h)) temporally to get a full global root trajectory (except height) +# Using additive accumulation instead of matrix multiplication for better gradient flow in long sequences +def accum_root(r, consq_n, apply_height=False, grad_truncate_k=0): + """ + Accumulate incremental root transforms using additive mode to avoid gradient issues in long sequences. + + Mathematically equivalent to the matrix-multiplication implementation, but uses cumulative addition + for better gradient computation. Expanding T_prev @ T_local: + - Rotation update: angle_new = angle_prev + dtheta (angles add directly) + - Position update: P_new = P_prev + R_prev @ P_local (rotate local displacement then accumulate) + + Args: + r: [T, B, 4], where 4 = [dtheta, dx, dz, h] + dtheta: incremental rotation angle around Y axis (radians) + dx: incremental displacement in X direction (local coordinate frame) + dz: incremental displacement in Z direction (local coordinate frame) + h: root joint height (absolute value) + consq_n: number of consecutive frames T (unused, kept for interface compatibility) + apply_height: whether to apply height to the transform matrix + grad_truncate_k: gradient truncation window. If > 0, only the last K frames retain full + gradients; earlier accumulated results are detached to prevent deep gradient + accumulation instability. 0 means no truncation (default). + + Returns: + rT_accum: [T, B, 4, 4] accumulated transform matrices + """ + device = r.device + dtype = r.dtype + T = r.shape[0] + + dtheta = r[..., 0] # [T, B] + dx = r[..., 1] # [T, B] + dz = r[..., 2] # [T, B] + h = r[..., 3] # [T, B] + + # 1. accumulate angles along the time dimension (dim=0) + total_angle = torch.cumsum(dtheta, dim=0) # [T, B] + + # 2. rotate local displacements into the global coordinate frame + # use the accumulated angle *before* the current frame when rotating local displacements + # prev_angle[i] = sum(dtheta[0:i]), i.e. excludes dtheta[i] + prev_angle = total_angle - dtheta # [T, B] + cos_prev = torch.cos(prev_angle) + sin_prev = torch.sin(prev_angle) + + # from the transform matrix definition: + # global_x = local_x * cos(theta) + local_z * sin(theta) + # global_z = -local_x * sin(theta) + local_z * cos(theta) + global_dx = dx * cos_prev + dz * sin_prev + global_dz = -dx * sin_prev + dz * cos_prev + + # 3. accumulate positions along the time dimension (dim=0) + global_x = torch.cumsum(global_dx, dim=0) # [T, B] + global_z = torch.cumsum(global_dz, dim=0) # [T, B] + + # 4. gradient truncation: only the last K frames retain full gradients, + # preventing deep gradient accumulation from cumsum causing instability + if grad_truncate_k > 0 and T > grad_truncate_k: + K = grad_truncate_k + # detach early frames + total_angle = torch.cat([total_angle[:-K].detach(), total_angle[-K:]], dim=0) + global_x = torch.cat([global_x[:-K].detach(), global_x[-K:]], dim=0) + global_z = torch.cat([global_z[:-K].detach(), global_z[-K:]], dim=0) + + # 5. build the accumulated transform matrix + cos_total = torch.cos(total_angle) + sin_total = torch.sin(total_angle) + + # create transform matrix [T, B, 4, 4] + rT_accum = torch.zeros(*r.shape[:-1], 4, 4, device=device, dtype=dtype) + + # fill rotation part + rT_accum[..., 0, 0] = cos_total + rT_accum[..., 0, 2] = sin_total + rT_accum[..., 2, 0] = -sin_total + rT_accum[..., 2, 2] = cos_total + rT_accum[..., 1, 1] = 1.0 + + # fill translation part + rT_accum[..., 0, 3] = global_x + rT_accum[..., 2, 3] = global_z + + # fill homogeneous coordinate + rT_accum[..., 3, 3] = 1.0 + + if apply_height: + rT_accum[..., 1, 3] = h + + return rT_accum + + +def compute_pa_pv_ra(r, p, consq_n, batch, grad_truncate_k=0): + rT_accum = accum_root( + r, consq_n, apply_height=False, grad_truncate_k=grad_truncate_k + ) # [T, B, 4, 4] # do not apply height here; height is already reflected in positions('p') + rT_accum_sel_reshaped = rT_accum.reshape(-1, 4, 4)[batch].reshape( + consq_n, -1, 4, 4 + ) # [T, sumJ, 4, 4] + Ta = rT_accum_sel_reshaped @ tensor_utils.tensor_p2T(p) # [T, sumJ, 4, 4] + pa = Ta[..., :3, 3] # [consq_n, sumJ, 3] + pv = pa[1:] - pa[:-1] + ra = torch.stack( + ( + rT_accum[..., 0, 0], + rT_accum[..., 0, 2], + rT_accum[..., 0, 3], + rT_accum[..., 2, 3], + ), + dim=-1, + ) + + return pa, pv, ra + + +def out_post_fwd(out, tgt_batch, ms_dict, out_rep_cfg, consq_n): + ''' + Post-process model forward output to get final output and ground truth for metric computation. + + :param out: model forward output, contains 'hatD' (predicted features) and 'z' (latent code) + :param tgt_batch: target graph batch + :param ms_dict: mean and std for normalization + :param out_rep_cfg: output representation configuration + :param consq_n: number of consecutive frames + + :return: out (predicted features), gt (ground truth features) + ''' + ###### OUT ###### + # decompose hatD -> q,r,c + tgt_root_ids = tgt_batch.ptr[:-1] + out.update(parse_hatD(out["hatD"], tgt_root_ids, out_rep_cfg, ms_dict)) + # q (6d representation) -> qR (rotation matrix) + out["qR"] = tensor_utils.tensor_q2qR(out["q"]) + # FK + out["fk_T"] = FK( + tgt_batch.lo, + out["qR"], + out["r"], + tgt_root_ids, + tgt_batch.skel_depth, + tgt_batch.edge_index, + ) + # reshape [nC*nB, ...] -> [nC, nB, ...] + # Save z and z_tgt before reshape (they are [B, z_dim], not [T*B, z_dim]) + z = out.pop("z", None) + z_tgt = out.pop("z_tgt", None) + + reshape_dict_consq(out, consq_n) + + # Restore z and z_tgt (no reshape needed) + if z is not None: + out["z"] = z + if z_tgt is not None: + out["z_tgt"] = z_tgt + + out["p"] = out["fk_T"][..., :3, 3] + # accumulate temporally, compute velocity + out["pa"], out["pv"], out["ra"] = compute_pa_pv_ra( + out["r"], out["p"], consq_n, tgt_batch.batch + ) + + ###### GROUND_TRUTH ###### + gt = {"r": tgt_batch.r_nopad, "p": tgt_batch.p, "c": tgt_batch.c} + gt["qR"] = tensor_utils.tensor_q2qR(tgt_batch.q) + r_m = ms_dict["r_m"].to(device=gt["r"].device) + r_s = ms_dict["r_s"].to(device=gt["r"].device) + gt["r_n"] = (gt["r"] - r_m) / r_s + gt = reshape_dict_consq(gt, consq_n) + gt["pa"], gt["pv"], gt["ra"] = compute_pa_pv_ra( + gt["r"], gt["p"], consq_n, tgt_batch.batch + ) + gt["batch"] = tgt_batch.batch + # qb_single_frame + qbi = tgt_batch.qb + if "mask" in tgt_batch: + qbi = qbi & (~tgt_batch.mask) + if consq_n > 1: + repeat_n = out["q"].shape[0] + gt["qbi"] = qbi.reshape(repeat_n, -1)[0] + + return out, gt + + +class VQ_Model(torch.nn.Module): + """RVQ-VAE using GPSEncTemporal + GPSDecTemporal + ResidualVQ from vector-quantize-pytorch""" + + def __init__(self, model_cfg, rep_cfg): + super().__init__() + + z_dim = model_cfg["z_dim"] + enc_cfg = model_cfg["Encoder"] + dec_cfg = model_cfg["Decoder"] + + enc_type = enc_cfg.get("type", "GPSEncTemporal") + if enc_type != "GPSEncTemporal": + raise ValueError(f"VQ_Model_v2 only supports GPSEncTemporal, got: {enc_type}") + self.encoder = GPSEncTemporal(rep_cfg, z_dim, enc_cfg) + + dec_type = dec_cfg.get("type", "GPSDecTemporal") + if dec_type != "GPSDecTemporal": + raise ValueError(f"VQ_Model_v2 only supports GPSDecTemporal, got: {dec_type}") + self.decoder = GPSDecTemporal(rep_cfg, z_dim, dec_cfg) + + vq_cfg = model_cfg["VQ"] + vq_type = vq_cfg.get("type", "RVQ").upper() + if vq_type != "RVQ": + raise ValueError(f"VQ_Model_v2 only supports RVQ, got: {vq_type}") + + nb_code = vq_cfg["nb_code"] + mu = vq_cfg.get("mu", 0.99) + num_quantizers = vq_cfg.get("num_quantizers", 4) + use_cosine_sim = vq_cfg.get("use_cosine_sim", False) + kmeans_init = vq_cfg.get("kmeans_init", True) + threshold_ema_dead_code = vq_cfg.get("threshold_ema_dead_code", 2) + codebook_dim = vq_cfg.get("codebook_dim", None) + + self.quantizer = ResidualVQ( + dim=z_dim, codebook_size=nb_code, num_quantizers=num_quantizers, + decay=mu, kmeans_init=kmeans_init, threshold_ema_dead_code=threshold_ema_dead_code, + use_cosine_sim=use_cosine_sim, codebook_dim=codebook_dim, commitment_weight=1.0, + ) + + print(f"[VQ_Model_v2] Initialized:") + print(f" - Encoder/Decoder: GPSEncTemporal/GPSDecTemporal") + print(f" - RVQ num_quantizers: {num_quantizers}, codebook_size: {nb_code}, dim: {z_dim}") + print(f" - decay: {mu}, use_cosine_sim: {use_cosine_sim}, kmeans_init: {kmeans_init}") + + def forward(self, src_graph, tgt_graph, consq_n): + """Full forward: encode -> quantize -> decode + Returns: z_q [T*B, z_dim], hatD, commit_loss (scalar), perplexity (scalar) + """ + z_q, commit_loss, perplexity = self.encode(src_graph, consq_n) + hatD = self.decode(z_q, tgt_graph, consq_n) + return z_q, hatD, commit_loss, perplexity + + def encode(self, src_graph, consq_n): + """Encode + quantize + Returns: z_q [T*B, z_dim], commit_loss (scalar), perplexity (scalar) + + Args: + consq_n: Actual T value (sequence length) + - Training: consq_n = 64 (fixed window), B = 32 + - Evaluation: consq_n = 104 (full sequence), B = 1 + """ + h = self.encoder(src_graph, consq_n) # [T*B, z_dim] + T_B, z_dim = h.shape + + # consq_n is the actual T value passed from caller + T = consq_n + B = T_B // T + assert T_B % T == 0, f"T*B ({T_B}) must be divisible by T ({T})" + + # print(f"T: {T}, B: {B}, T_B: {T_B}, z_dim: {z_dim}") + + h_3d = h.reshape(T, B, z_dim).permute(1, 0, 2) # [T*B, z_dim] -> [B, T, z_dim] + quantized, indices, commit_losses = self.quantizer(h_3d) # quantized: [B, T, z_dim], indices: [B, T, num_q] + z_q = quantized.permute(1, 0, 2).reshape(T_B, z_dim) # [B, T, z_dim] -> [T*B, z_dim] + + if isinstance(commit_losses, torch.Tensor): + commit_loss = commit_losses.mean() + else: + commit_loss = torch.tensor(commit_losses, device=h.device) + + indices_2d = indices.permute(1, 0, 2).reshape(T_B, -1) # [B, T, num_q] -> [T*B, num_q] + perplexity = self._compute_perplexity(indices_2d) + + return z_q, commit_loss, perplexity + + def decode(self, z, tgt_graph, consq_n): + """Decode: z [T*B, z_dim] -> reconstructed output""" + return self.decoder(z, tgt_graph, consq_n) + + def decode_from_codes(self, code_idx, tgt_graph, consq_n): + """Reconstruct z_q from discrete indices and decode (used to recover from saved codes). + + Args: + code_idx: [T, Q] - discrete indices, dtype=torch.long + tgt_graph: target graph batch + consq_n: sequence length T + + Returns: + hatD: decoded output + z_q: [T, z_dim] - reconstructed quantized vector (for debugging) + + Note: this method assumes batch_size=1 + """ + T, Q = code_idx.shape + assert T == consq_n, f"code_idx length {T} != consq_n {consq_n}" + + # look up embeddings from each codebook layer + all_codes_list = [] + for layer_idx, vq_layer in enumerate(self.quantizer.layers): + # extract indices for layer layer_idx: [T] + layer_indices = code_idx[:, layer_idx] # [T] + + # fetch embeddings from codebook: [codebook_size, codebook_dim] -> [T, codebook_dim] + layer_codes = vq_layer.codebook[layer_indices] # [T, codebook_dim] + all_codes_list.append(layer_codes) + + # Stack: [Q, T, D] -> [T, Q, D] + all_codes = torch.stack(all_codes_list, dim=1) # [T, Q, D] + + # RVQ accumulation: z_q = sum over Q dimension + z_q = all_codes.sum(dim=1) # [T, Q, D] -> [T, D] + + # Reshape for decoder: [T, D] -> [T*1, D] (batch_size=1) + z_q_batched = z_q.view(T, -1) # [T, z_dim] + + # Decode + hatD = self.decoder(z_q_batched, tgt_graph, consq_n) + + return hatD, z_q + + def encode_with_codes(self, src_graph, consq_n): + """Encode + quantize, returning indices and per-layer codes (used for preprocessing). + + Returns: + code_idx: [T, Q] - discrete indices, dtype=torch.long + all_codes: [T, Q, D] - quantized embeddings per layer (before accumulation) + z_q: [T, z_dim] - final accumulated quantized result + + Args: + consq_n: Actual T value (sequence length) + src_graph: source graph batch + + Note: this method assumes batch_size=1 (used for preprocessing a single sequence) + """ + h = self.encoder(src_graph, consq_n) # [T*1, z_dim] = [T, z_dim] + T_B, z_dim = h.shape + + # For preprocessing, we expect batch_size=1 + T = consq_n + B = T_B // T + assert B == 1, f"encode_with_codes expects batch_size=1, got B={B}" + assert T_B % T == 0, f"T*B ({T_B}) must be divisible by T ({T})" + + h_3d = h.reshape(T, B, z_dim).permute(1, 0, 2) # [T, z_dim] -> [1, T, z_dim] + + # Quantize and get indices + quantized, indices, commit_losses = self.quantizer(h_3d) + # quantized: [1, T, z_dim] - accumulated result + # indices: [1, T, num_q] - discrete indices per layer + + # get per-layer individual codes (before accumulation) + all_codes_list = [] + for layer_idx, vq_layer in enumerate(self.quantizer.layers): + # indices: [1, T, num_q], extract indices for layer layer_idx + layer_indices = indices[:, :, layer_idx:layer_idx+1] # [1, T, 1] + + # fetch embeddings from codebook + # vq_layer.codebook shape: [codebook_size, codebook_dim] + # layer_indices values in range: [0, codebook_size) + layer_codes = vq_layer.codebook[layer_indices.squeeze(-1)] # [1, T, codebook_dim] + all_codes_list.append(layer_codes) + + # Stack all layers: [num_q, 1, T, D] -> [1, T, num_q, D] + all_codes_4d = torch.stack(all_codes_list, dim=2) # [1, T, num_q, D] + + # Remove batch dimension and convert to [T, Q, D] + code_idx = indices.squeeze(0) # [1, T, num_q] -> [T, num_q] + all_codes = all_codes_4d.squeeze(0) # [1, T, num_q, D] -> [T, num_q, D] + z_q = quantized.squeeze(0) # [1, T, z_dim] -> [T, z_dim] + + return code_idx, all_codes, z_q + + @torch.no_grad() + def _compute_perplexity(self, indices): + """Compute perplexity = exp(entropy) for codebook usage + Args: indices [T*B, num_quantizers] + Returns: perplexity (scalar) + """ + if indices.numel() == 0: + return torch.tensor(1.0, device=indices.device) + + first_layer_indices = indices[:, 0] # [T*B] + codebook_size = self.quantizer.layers[0].codebook_size + + code_counts = torch.bincount(first_layer_indices.flatten(), minlength=codebook_size).float() + total_count = code_counts.sum() + if total_count == 0: + return torch.tensor(1.0, device=indices.device) + + probs = code_counts / total_count + mask = probs > 1e-10 + entropy = -torch.sum(probs[mask] * torch.log(probs[mask])) + perplexity = torch.exp(entropy) + + return perplexity + + @property + def device(self): + return next(self.parameters()).device + + def load_params(self, dir, epoch=None, prefix="", freeze=False): + load_model_name = ( + "last_model.pt" if epoch is None else "model_{}.pt".format(epoch) + ) + load_path = os.path.join(RESULT_DIR, dir, load_model_name) + + saved = torch.load(load_path, map_location=self.device) + model_dict = self.state_dict() + + pretrained_dict = { + k: v for k, v in saved["model"].items() if k.startswith(prefix) + } + model_dict.update(pretrained_dict) + self.load_state_dict(model_dict) + + # for key in model_dict.keys(): + # if key not in dict(model.named_parameters()).keys(): + # print(key) + if freeze: + for name, param in self.named_parameters(): + if name in pretrained_dict: + param.requires_grad = False + print("load model from : ", load_path, " DONE") + print("prefix : ", prefix, ", freeze:", freeze, "\n") \ No newline at end of file diff --git a/src/sata/mypath.py b/src/sata/mypath.py new file mode 100644 index 0000000000000000000000000000000000000000..f2e335d902a4456dfaa672c9290c102dc62baa3a --- /dev/null +++ b/src/sata/mypath.py @@ -0,0 +1,7 @@ +import os + +SRC_DIR = os.path.dirname(os.path.abspath(__file__)) +PRJ_DIR = os.path.join(SRC_DIR, "../..") +DATA_DIR = os.path.join(PRJ_DIR, "data") +CFG_DIR = os.path.join(PRJ_DIR, "config") +RESULT_DIR = os.path.join(PRJ_DIR, "result") diff --git a/src/sata/sequence_dataset.py b/src/sata/sequence_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..9c8496adef0a853a9b35872a298dcccd686c6202 --- /dev/null +++ b/src/sata/sequence_dataset.py @@ -0,0 +1,526 @@ +import os, torch, random +import numpy as np +from pathlib import Path +from torch.utils.data import Dataset, Sampler, DataLoader +from functools import partial +from typing import List, Dict, Tuple, Optional, Union +from torch_geometric.data import Data, Batch + +from mydataset import npz_2_data +from skel_pose_graph import SkelPoseGraph, find_feet + +class SequenceDataset(Dataset): + """ + Dataset that loads complete motion sequences with text descriptions. + + Each item is a complete motion sequence rather than a single frame. + """ + + copy_orig_contact = False + + def __init__(self, text_dir: Optional[str] = None, seq_length: Optional[int] = None): + """ + Initialize the sequence dataset. + + Args: + text_dir: Directory containing text description files (.txt) + seq_length: Fixed sequence length. If None, load full sequences. + If specified, sequences will be truncated or padded to this length. + """ + # Skeleton and pose data + self.skel_list = [] + self.pose_list = [] + + # File information + self.filepaths = [] + self.frame_cnts = [] + self.start_frames = [] + self.end_frames = [] + + # Motion set related info + self.mi_ri_2_fi = [] + # mi: semantic motion index (same mi means semantically identical motion) + # ri: 0<=ri list of text descriptions for this motion + + # Sequence length configuration + self.seq_length = seq_length + + def add_data(self, lo, go, qb, edges, q, p, qv, pv, pprev, c, r, filepath, mi, tf, text=None): + """Add motion data to the dataset.""" + # Convert to SkelData and PoseData + sd, pdl = npz_2_data(lo, go, qb, edges, q, p, qv, pv, pprev, c, r, tf) + + self.skel_list.append(sd) + self.pose_list.extend(pdl) + + # Update file info + fi = len(self.filepaths) + nFrame = q.shape[0] + start = sum(self.frame_cnts) + end = start + nFrame + self.filepaths.append(filepath) + self.frame_cnts.append(nFrame) + self.start_frames.append(start) + self.end_frames.append(end) + + # Update motion set info + assert len(self.mi_ri_2_fi) >= mi + if len(self.mi_ri_2_fi) == mi: + # New semantic motion set + self.mi_ri_2_fi.append([]) + # Add text for new motion (only once per motion index) + self.mi_2_text.append(text if text is not None else []) + else: + # Ensure consistent frame count among retargeted dataset + orig_fi = self.mi_ri_2_fi[mi][0] + orig_nFrame = self.frame_cnts[orig_fi] + + assert orig_nFrame == nFrame, f"Frame count mismatch: {orig_nFrame} vs {nFrame}" + + if self.copy_orig_contact: + # Copy contact from the original motion (optional) + lf, rf = find_feet(sd) + orig_sd = self.skel_list[orig_fi] + orig_start = self.start_frames[orig_fi] + orig_pdl = self.pose_list[orig_start : orig_start + orig_nFrame] + orig_lf, orig_rf = find_feet(orig_sd) + for pdi, orig_pdi in zip(pdl, orig_pdl): + pdi.c[lf] = orig_pdi.c[orig_lf] + pdi.c[rf] = orig_pdi.c[orig_rf] + + self.mi_ri_2_fi[mi].append(fi) + + def add_data_from_npz(self, mi, npz_fp, bvh_fp=None, text=None): + """Load data from an NPZ file.""" + data = np.load(npz_fp) + if bvh_fp is None: + bvh_fp = npz_fp # placeholder + self.add_data(**data, filepath=bvh_fp, mi=mi, text=text) + + def load_data_dir_pairs(self, data_dir): + """ + Load paired motion data from a directory. + + The directory should contain: + - pair.txt: List of (source, target) motion pairs + - *.npz files: Motion data files + """ + pair_path = os.path.join(data_dir, "pair.txt") + assert os.path.exists(pair_path), f"{pair_path} does not exist" + bvh_prefix = os.path.join(os.path.dirname(data_dir), "bvh") + + src_id_map = {} + with open(pair_path, "r") as pair_file: + for line in pair_file: + if line.strip() == "": + continue + src_rel_path, dst_rel_path = line.strip().split() + + if src_rel_path in src_id_map: + src_id = src_id_map[src_rel_path] + else: # New source + src_id = len(self.mi_ri_2_fi) + src_id_map[src_rel_path] = src_id + npz_fp = os.path.join(data_dir, src_rel_path) + bvh_fp = os.path.join(bvh_prefix, Path(src_rel_path).with_suffix("")) + # Load text if text_dir is provided + text = self._load_text_for_file(src_rel_path) + self.add_data_from_npz(src_id, npz_fp, bvh_fp, text=text) + + if dst_rel_path in src_id_map: + continue + else: + npz_fp = os.path.join(data_dir, dst_rel_path) + bvh_fp = os.path.join(bvh_prefix, Path(dst_rel_path).with_suffix("")) + # No text for retargeted motions (they share text with source) + self.add_data_from_npz(src_id, npz_fp, bvh_fp, text=None) + + def _load_text_for_file(self, file_rel_path): + """ + Load text descriptions for a motion file. + + Text files are stored in self.text_dir with the same name as motion file but .txt extension. + Each line in the text file contains one text description in the format: + caption#tokens#start_time#end_time + + Args: + file_rel_path: Relative path to the motion file (e.g., 'test/006888.bvh.npz') + + Returns: + List of text description dictionaries, or empty list if no text file found + """ + if self.text_dir is None: + return [] + + # Extract filename without extensions + basename = os.path.basename(file_rel_path) # '006888.bvh.npz' + filename = Path(basename).stem # '006888.bvh' + if filename.endswith('.bvh'): + filename = filename[:-4] # '006888' + + text_file_path = os.path.join(self.text_dir, filename + '.txt') + + if not os.path.exists(text_file_path): + return [] + + text_list = [] + try: + with open(text_file_path, 'r', encoding='utf-8') as f: + for line_num, line in enumerate(f.readlines(), 1): + line = line.strip() + if not line: + continue + + # Parse format: caption#tokens#start_time#end_time + parts = line.split('#') + if len(parts) < 4: + print(f"Warning: Malformed line {line_num} in {text_file_path}: expected 4 parts, got {len(parts)}") + continue + + try: + text_dict = { + 'caption': parts[0].strip(), + 'tokens': parts[1].strip().split(' ') if parts[1].strip() else [], + 'start_time': float(parts[2].strip()) if parts[2].strip() else 0.0, + 'end_time': float(parts[3].strip()) if parts[3].strip() else 0.0, + } + text_list.append(text_dict) + except ValueError as e: + print(f"Warning: Failed to parse line {line_num} in {text_file_path}: {e}") + continue + + except Exception as e: + print(f"Warning: Failed to load text from {text_file_path}: {e}") + return [] + + return text_list + + def get_mi_ri_fi_graph(self, mi, ri, frame): + """Get skeleton pose graph for a specific motion, rig, and frame.""" + fi = self.mi_ri_2_fi[mi][ri] + si = self.skel_list[fi] + pi = self.pose_list[self.start_frames[fi] + frame] + return SkelPoseGraph(si, pi) + + def get_sequence_graphs(self, mi, ri, start_frame=0, length=None): + """ + Get a sequence of graphs for a specific motion and rig. + + Args: + mi: Motion index + ri: Rig index + start_frame: Starting frame index + length: Number of frames to load. If None, load all remaining frames. + + Returns: + List of SkelPoseGraph objects + """ + fi = self.mi_ri_2_fi[mi][ri] + frame_cnt = self.frame_cnts[fi] + + if length is None: + length = frame_cnt - start_frame + + end_frame = min(start_frame + length, frame_cnt) + + graphs = [] + for frame in range(start_frame, end_frame): + graphs.append(self.get_mi_ri_fi_graph(mi, ri, frame)) + + return graphs, end_frame - start_frame + + def __getitem__(self, idx): + """ + Get a complete motion sequence with text. + + Args: + idx: Tuple (mi, src_ri, tgt_ri) where: + - mi: motion index + - src_ri: source rig index + - tgt_ri: target rig index + + Returns: + Tuple (src_graphs, tgt_graphs, text, m_lens) where: + - src_graphs: List of source skeleton pose graphs + - tgt_graphs: List of target skeleton pose graphs + - text: List of text descriptions for this motion + - m_lens: Length of the motion sequence (number of frames) + """ + mi, src_ri, tgt_ri = idx + + # Get frame count for this motion + fi = self.mi_ri_2_fi[mi][src_ri] + frame_cnt = self.frame_cnts[fi] + + # Handle sequence length + if self.seq_length is not None: + # Use specified sequence length + actual_length = min(self.seq_length, frame_cnt) + start_frame = 0 + else: + # Use full sequence + actual_length = frame_cnt + start_frame = 0 + + # Get sequence of graphs + src_graphs, _ = self.get_sequence_graphs(mi, src_ri, start_frame, actual_length) + tgt_graphs, _ = self.get_sequence_graphs(mi, tgt_ri, start_frame, actual_length) + + # Get text descriptions + text = self.mi_2_text[mi] if mi < len(self.mi_2_text) else [] + + # Actual sequence length + m_lens = len(src_graphs) + + return src_graphs, tgt_graphs, text, m_lens + + def __len__(self): + """Return the number of motion sequences in the dataset.""" + return len(self.mi_ri_2_fi) + + +class SequenceSampler(Sampler): + """ + Sampler that yields motion sequence indices. + + Unlike frame-based samplers, this sampler yields complete motion sequences. + """ + + def __init__(self, dataset, batch_size, shuffle=True): + """ + Initialize the sequence sampler. + + Args: + dataset: SequenceDataset instance + batch_size: Number of sequences per batch + shuffle: Whether to shuffle motion indices + """ + self.dataset = dataset + self.batch_size = batch_size + self.shuffle = shuffle + + # Motion indices + self.motion_indices = list(range(len(self.dataset.mi_ri_2_fi))) + + # For specifying fixed src/tgt rig indices + self.src_ri = None + self.tgt_ri = None + + def __iter__(self): + # Shuffle motion indices if required + indices = self.motion_indices.copy() + if self.shuffle: + random.shuffle(indices) + + batch = [] + for mi in indices: + # Random src/tgt skeletons (including the original ones) + R = len(self.dataset.mi_ri_2_fi[mi]) + + if R >= 2: + src_ri, tgt_ri = random.sample(range(R), 2) + else: + # Only one rig available + src_ri = tgt_ri = 0 + + # Override if src/tgt ri is specified + if self.src_ri is not None: + src_ri = self.src_ri + if self.tgt_ri is not None: + tgt_ri = self.tgt_ri + + batch.append((mi, src_ri, tgt_ri)) + + # Yield batch when full + if len(batch) == self.batch_size: + yield batch + batch = [] + + # Yield remaining items + if len(batch) > 0: + yield batch + + def __len__(self): + """Return the number of batches.""" + return (len(self.motion_indices) + self.batch_size - 1) // self.batch_size + + +def sequence_collate_fn(batch, mask_option=[], device="cpu", pad_to_max=False, return_list=False): + """ + Collate function for sequence-based batches. + + Args: + batch: List of tuples (src_graphs, tgt_graphs, text, m_lens) from __getitem__ + mask_option: List of strings indicating which graphs to apply random masking to + device: Device to move tensors to + pad_to_max: Default false. If True, pad all sequences to the maximum length in the batch + return_list: If False (default), return aggregated Batch objects. + If True, return list of Batch objects (one per sequence). + + Returns: + If return_list=False (default): + Tuple (src_batch, tgt_batch, text_list, m_lens, masks, batch_info) where: + - src_batch: Single aggregated Batch containing all sequences + - tgt_batch: Single aggregated Batch containing all sequences + - text_list: List of text descriptions + - m_lens: Numpy array of sequence lengths [T_0, T_1, ..., T_{B-1}] + - masks: Tensor of shape (batch_size, max_len) indicating valid frames (if pad_to_max) + - batch_info: Dict with keys: + - 'cumsum_lens': Cumulative sum of lengths for splitting [0, T_0, T_0+T_1, ...] + - 'num_sequences': Number of sequences in batch (batch_size) + - 'total_frames': Total number of frames across all sequences + + If return_list=True: + Tuple (src_batch_list, tgt_batch_list, text_list, m_lens, masks, batch_info) where: + - src_batch_list: List of batched source graphs (one per sequence) + - tgt_batch_list: List of batched target graphs (one per sequence) + - text_list: List of text descriptions + - m_lens: Numpy array of sequence lengths + - masks: Tensor of shape (batch_size, max_len) indicating valid frames (if pad_to_max) + - batch_info: Dict with metadata + """ + # Unpack batch + src_graphs_list = [item[0] for item in batch] + tgt_graphs_list = [item[1] for item in batch] + text_list = [item[2] for item in batch] + m_lens = [item[3] for item in batch] + + if pad_to_max and len(set(m_lens)) > 1: + # Sequences have different lengths, need to pad + max_len = max(m_lens) + + # Create masks (True for valid frames, False for padding) + masks = [] + padded_src_graphs_list = [] + padded_tgt_graphs_list = [] + + for src_graphs, tgt_graphs, seq_len in zip(src_graphs_list, tgt_graphs_list, m_lens): + # Create mask for this sequence + mask = [True] * seq_len + [False] * (max_len - seq_len) + masks.append(mask) + + # Pad sequences by repeating the last frame + if seq_len < max_len: + padding_needed = max_len - seq_len + # Repeat last frame for padding + src_graphs_padded = src_graphs + [src_graphs[-1]] * padding_needed + tgt_graphs_padded = tgt_graphs + [tgt_graphs[-1]] * padding_needed + else: + src_graphs_padded = src_graphs + tgt_graphs_padded = tgt_graphs + + padded_src_graphs_list.append(src_graphs_padded) + padded_tgt_graphs_list.append(tgt_graphs_padded) + + src_graphs_list = padded_src_graphs_list + tgt_graphs_list = padded_tgt_graphs_list + m_lens = [max_len] * len(m_lens) + masks = torch.BoolTensor(masks).to(device) + else: + # All sequences have the same length, no padding needed + masks = None + + # Batch graphs for each sequence + src_batch_list = [] + tgt_batch_list = [] + + for src_graphs, tgt_graphs in zip(src_graphs_list, tgt_graphs_list): + src_batch = Batch.from_data_list(src_graphs).to(device) + tgt_batch = Batch.from_data_list(tgt_graphs).to(device) + + # Apply masking if requested + if "src" in mask_option: + src_batch.mask = rnd_mask(src_batch, consq_n=len(src_graphs)) + if "tgt" in mask_option: + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=len(tgt_graphs)) + + src_batch_list.append(src_batch) + tgt_batch_list.append(tgt_batch) + + # Random select one text for each sequence if multiple texts are available + for i, texts in enumerate(text_list): + text_list[i] = random.choice(texts) if texts else {} + + # Create batch info for splitting later + cumsum_lens = np.concatenate([[0], np.cumsum(m_lens)]) + batch_info = { + 'cumsum_lens': cumsum_lens, # [0, T_0, T_0+T_1, ..., sum(T_i)] + 'num_sequences': len(m_lens), # Batch size + 'total_frames': int(np.sum(m_lens)), # Total frames + } + + # Return list format if requested + if return_list: + return src_batch_list, tgt_batch_list, text_list, m_lens, masks, batch_info + + # Aggregate all sequences into a single Batch (default behavior) + # Flatten all graphs from all sequences + all_src_graphs = [graph for graphs in src_graphs_list for graph in graphs] + all_tgt_graphs = [graph for graphs in tgt_graphs_list for graph in graphs] + + # Create single aggregated batch + src_batch = Batch.from_data_list(all_src_graphs).to(device) + tgt_batch = Batch.from_data_list(all_tgt_graphs).to(device) + + # Apply masking if requested (on the aggregated batch) + if "src" in mask_option: + src_batch.mask = rnd_mask(src_batch, consq_n=sum(m_lens)) + if "tgt" in mask_option: + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=sum(m_lens)) + + + return src_batch, tgt_batch, text_list, m_lens, masks, batch_info + + +def get_sequence_data_loader( + data_dir, + batch_size, + shuffle=True, + mask_option=[], + device="cpu", + text_dir=None, + seq_length=None, + pad_to_max=True, + return_list=False +): + """ + Create a DataLoader for sequence-based motion data. + + Args: + data_dir: Directory containing motion data + batch_size: Number of sequences per batch + shuffle: Whether to shuffle the data + mask_option: List of strings for masking ('src', 'tgt') + device: Device to load data to + text_dir: Directory containing text descriptions + seq_length: Fixed sequence length (None for variable length) + pad_to_max: Whether to pad sequences to max length in batch + return_list: If False (default), return aggregated Batch objects. + If True, return list of Batch objects (one per sequence). + + Returns: + DataLoader instance + """ + ds = SequenceDataset(text_dir=text_dir, seq_length=seq_length) + ds.load_data_dir_pairs(data_dir) + + sampler = SequenceSampler(ds, batch_size=batch_size, shuffle=shuffle) + + dl = DataLoader( + ds, + batch_sampler=sampler, + collate_fn=partial( + sequence_collate_fn, + mask_option=mask_option, + device=device, + pad_to_max=pad_to_max, + return_list=return_list, + ), + pin_memory=True, + ) + return dl diff --git a/src/sata/skel_pose_graph.py b/src/sata/skel_pose_graph.py new file mode 100644 index 0000000000000000000000000000000000000000..88105f438557f4cd90fd88af9a9a4d10789c5082 --- /dev/null +++ b/src/sata/skel_pose_graph.py @@ -0,0 +1,194 @@ +import torch +import torch_geometric + +rep_dim = { + "lo": 3, + "go": 3, + "q": 6, + "r": 4, + "c": 1, + "p": 3, + "pprev": 3, + "pv": 3, + "qv": 6, + "tf": 768, +} + + +class SkelPoseGraph(torch_geometric.data.Data): + # class variable : should be set right after loading cfg, before using any of the data ... + skel_cfg = [] + pose_cfg = [] + ms_dict = {} + + def __init__(self, skel_data, pose_data): + super(SkelPoseGraph, self).__init__() + # skel + if skel_data is not None: + self.lo = skel_data.lo + self.go = skel_data.go + self.edge_index = skel_data.edge_index + + # extra + self.edge_feature = skel_data.edge_feature + self.qb = skel_data.qb + + # Text features + self.tf = skel_data.tf + + # pose + if pose_data is not None: + self.q = pose_data.q + self.p = pose_data.p + self.qv = pose_data.qv + self.pv = pose_data.pv + self.pprev = pose_data.pprev + self.c = pose_data.c + self.r_nopad = pose_data.r # [1,rDim=4] -> r:[nJ, rDim=4] zeropad + + def normalize_x(self, key): + val = getattr(self, key) + if key + "_m" in self.ms_dict: + m = self.ms_dict[key + "_m"].to(device=val.device) + s = self.ms_dict[key + "_s"].to(device=val.device) + val = (val - m) / s + return val + + @property + def skel_x(self): + assert len(self.skel_cfg) > 0, "skel_cfg is not set" + return torch.hstack([self.normalize_x(var) for var in self.skel_cfg]) + + @property + def skel_x_no_text(self): + assert len(self.skel_cfg) > 0, "skel_cfg is not set" + skel_vars = [var for var in self.skel_cfg if var != "tf"] + return torch.hstack([self.normalize_x(var) for var in skel_vars]) + + @property + def edge_index_bidirection(self): + return torch.hstack((self.edge_index, self.edge_index[[1, 0]])) + + @property + def r(self): + r_ = ( + self.ms_dict["r_m"] + .repeat(self.q.shape[0], 1) + .to(dtype=self.r_nopad.dtype, device=self.r_nopad.device) + ) + if hasattr(self, "ptr"): + # batched graph + # r_: [sum(nJ), rDim] + # self.r_nopad: [nB, rDim] + r_[self.ptr[:-1]] = self.r_nopad + else: + # single graph + # r_: [nJ, rDim] + # self.r_nopad: [1, rDim] + r_[0] = self.r_nopad + return r_ + + @property + def pose_x(self): + return torch.hstack([self.normalize_x(var) for var in self.pose_cfg]) + + @property + def src_x(self): + return torch.hstack((self.skel_x, self.pose_x)) + + @property + def tgt_x(self): + return self.skel_x + + @property + def mask(self): + if hasattr(self, "V_mask"): + return self.V_mask + else: + nV, dtype, device = self.lo.shape[0], torch.bool, self.lo.device + return torch.zeros(nV, dtype=dtype, device=device) + + @mask.setter + def mask(self, mask): + self.V_mask = mask + + @property + def edge_mask_bidirection(self): + # assume E_i = [parent_i, child_i] (except [0,0] for the root), thus nV == nE + edge_mask_bidirection_ = self.mask.repeat(2) + # first edge of a graph is [0,0] (typically edge=[parent,child], but root has no parent so self-edge is created) + # self-edge will be added for all nodes inside GATConv layer, so rather mask one here to avoid redundant edges + ptr = self.ptr[:-1] if hasattr(self, "ptr") else [0] + edge_mask_bidirection_[ptr] = True + edge_mask_bidirection_[self.edge_index.shape[1] + ptr] = True + return edge_mask_bidirection_ + + @property + def skel_depth(self): + return self.edge_feature[:, 0] + + @property + def text_feature(self): + return self.tf + + +def rnd_mask(B_skel, consq_n, mask_prob=0.5, edge_thres=4, demo=None): + # mask single frame and repeat (to avoid flickering masks for the same joints among consecutive frames) + device = B_skel.lo.device + nV_sf = int(B_skel.lo.shape[0] / consq_n) + mask_sf = torch.zeros((nV_sf,), device=device, dtype=torch.bool) + + if demo == "no_mask": + return mask_sf.repeat(consq_n) + + nB = B_skel.batch.max() + 1 + nB_sf = int(nB / consq_n) + edge_batch = B_skel.batch[B_skel.edge_index[0]] + edge_index_sf = B_skel.edge_index[:, edge_batch < nB_sf] + + # find end-effector + ee = find_ee(B_skel) + n_limb = 5 + assert len(ee) == n_limb * nB + ee_sf = ee[: nB_sf * n_limb].reshape(nB_sf, n_limb) + + # randomly select to mask or not + do_mask = torch.rand(nB_sf) < mask_prob # 50 % + + # randomly select one limb per skeleton (and the corresponding end-effectors) + rnd_ith_limb = torch.randint(0, n_limb - 1, (nB_sf, 1)).to(device=device) + rnd_ee_sf = torch.gather(ee_sf, 1, rnd_ith_limb).flatten() + + # randomly select mask depth + # e.g.) 0: just end-effector, 1: end-effector and its parent, 2: end-effector, parent, and grandparent, ... + mask_ee_reach = torch.randint(0, edge_thres, (len(rnd_ee_sf),)) + + # find all joints to be masked + mask_joints = [] + ee_ascend = rnd_ee_sf + for i in range(max(mask_ee_reach) + 1): + mask_joints.append(ee_ascend[do_mask & (i <= mask_ee_reach)]) + ee_ascend = edge_index_sf[0, ee_ascend] # ee-> up to parent + mask_joints = torch.concat(mask_joints) + mask_sf[mask_joints] = True + return mask_sf.repeat(consq_n) + + +def find_ee(skel_graph): + edge_feature, edge_index = skel_graph.edge_feature, skel_graph.edge_index + return edge_index[1, edge_feature[:, 1] == 0] + + +def find_feet(skel_graph): + # CAUTION; this function assumes a single skel + ee = find_ee(skel_graph) + go = skel_graph.go + left_foot, right_foot = None, None + for foot in ee[torch.argsort(go[ee, 1])[:2]]: + if go[foot, 0] > 0: + left_foot = foot + else: + right_foot = foot + assert left_foot != right_foot + assert (left_foot is not None) and (right_foot is not None) + return left_foot, right_foot diff --git a/src/sata/t2m_wrapper.py b/src/sata/t2m_wrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..6175598f584cd99b789f30ab5694e34d9ac0743d --- /dev/null +++ b/src/sata/t2m_wrapper.py @@ -0,0 +1,96 @@ +from torch_geometric.data import Batch +from .conversions.graph_to_motion import hatD_recon_motion +from fairmotion.data import bvh +from fairmotion.ops import motion as motion_ops +from .conversions.motion_to_graph import skel_2_graph, motion_2_graph +from .utils.motion_utils import motion_normalize_h2s +from .utils.bvh2joint import motion_to_joint_positions, JointTextProcessor, TextEncoder +from .utils.joint2humanml import JointToHumanML3D +import numpy as np +from os.path import join as pjoin + +import torch +# TODO: fill path to reference_skeleton +def get_t2m_eval_wrapper(enc_model, enc_cfg, batch_size, ms_dict, reference_skeleton='./t2m_reference.bvh', evaluator_meta_dir=''): + try: + motion = bvh.load(reference_skeleton, ignore_root_skel=True, ee_as_joint=True) + except Exception as e: + print(f"Error loading {reference_skeleton}: {e}") + + motion, _ = motion_normalize_h2s(motion, False) + skel = motion.skel + + mean = np.load(pjoin(evaluator_meta_dir, 'mean.npy')) + std = np.load(pjoin(evaluator_meta_dir, 'std.npy')) + + text_features = [] + text_processor = JointTextProcessor() + text_encoder = TextEncoder() + + # Extract joint names + joint_names = [joint.name for joint in motion.skel.joints] + text_features = [] + for name in joint_names: + name = text_processor.get_text(name, mode='descriptive') + text_features.append(text_encoder.encode(name, reduce_mean=True)) + + text_features = torch.cat(text_features, dim=0) + skel_graph = skel_2_graph(skel, text_features) + + return T2MEvalWrapper(enc_model, skel_graph, batch_size, enc_cfg, ms_dict, mean, std) + + +class T2MEvalWrapper: + def __init__(self, enc_model, ref_skel_graph, batch_size, enc_cfg, ms_dict, mean, std): + self.enc_model = enc_model + self.ref_skel_graph = ref_skel_graph.to(enc_model.device) + self.batch_size = batch_size + self.output_repr = enc_cfg["representation"]["out"] + self.ms_dict = ms_dict + self.mean = mean + self.std = std + + self.enc_model.eval() + self.converter = JointToHumanML3D(example_id="000021", data_dir='./HumanML3D/joints') + # TODO: fill data_dir + + + def decode(self, latent, valid_frames): + B, T, C = latent.shape + # build batched skel graph + sliced_out_motion = [] + for i in range(B): + skel_graph_batch = Batch.from_data_list([self.ref_skel_graph] * T) + # Phase 1. Decode latent to fairmotion Motion + hatD = self.enc_model.decode(latent[i], skel_graph_batch) + + # note that fairmotion will move motion to CPU + out_motion_list, out_contact_list = hatD_recon_motion( + hatD, skel_graph_batch, self.output_repr, self.ms_dict, T + ) + out_motion = out_motion_list[0] # Hardcode for T2M + out_motion.set_fps(20) + sliced_out_motion.append(out_motion) + + # Phase 2. Convert to joint positions + joints_humanml3d_list = [] + for i in range(B): + joints_position = motion_to_joint_positions(sliced_out_motion[i]) + # Phase 3. Convert to HumanML3D format + joints_humanml3d = self.converter.convert(joints_position, valid_frames[i]) + joints_humanml3d_list.append(joints_humanml3d) + + joints_humanml3d = np.stack(joints_humanml3d_list, axis=0) # (B, T, 3) + + # from IPython import embed; embed() + # Phase 4. Normalize using HumanML3D mean and std + joints_humanml3d = (joints_humanml3d - self.mean) / self.std + + # Phase 5. From numpy to torch tensor + joints_humanml3d = torch.tensor(joints_humanml3d, device=self.enc_model.device).float() + + return joints_humanml3d + + def __getattr__(self, name): + # Forward other attributes/methods to the encoder model. + return getattr(self.enc_model, name) \ No newline at end of file diff --git a/src/sata/t2mdataset.py b/src/sata/t2mdataset.py new file mode 100644 index 0000000000000000000000000000000000000000..fd09897c02335ce37e9480e82e394156237b4e1e --- /dev/null +++ b/src/sata/t2mdataset.py @@ -0,0 +1,817 @@ +""" +Text-to-Motion Dataset: Load motion sequences with text descriptions. +This dataset loads complete motion sequences instead of individual frames. +""" + +import os, torch, random +import numpy as np +from pathlib import Path +from torch.utils.data import Dataset, Sampler, DataLoader +from torch_geometric.data import Batch +from functools import partial +from dataclasses import dataclass +from typing import List, Dict, Tuple, Optional +from tqdm import tqdm + +from .mypath import * +from sata.skel_pose_graph import SkelPoseGraph, rnd_mask, find_feet + + +@dataclass +class SkelData: + # [nJ, nDim] + lo: torch.Tensor + go: torch.Tensor + qb: torch.BoolTensor + # [nE, 2] + edge_index: torch.LongTensor + edge_feature: torch.LongTensor + tf: torch.Tensor + + +@dataclass +class PoseData: + # [nJ, nDim] + q: torch.Tensor + p: torch.Tensor + qv: torch.Tensor + pv: torch.Tensor + pprev: torch.Tensor + c: torch.BoolTensor + # [nDim] + r: torch.Tensor + + +def npz_2_data(lo, go, qb, edges, q, p, qv, pv, pprev, c, r, tf): + """Convert npz data to SkelData and list of PoseData.""" + if not (np.arange(edges.shape[0]) == edges[:, 1]).all(): + edges = edges[np.argsort(edges[:, 1])] # sort by child idx - just in case ... + + skel_data = SkelData( + torch.Tensor(lo), + torch.Tensor(go), + torch.BoolTensor(qb), + torch.LongTensor(edges[:, :2]).transpose(1, 0), + torch.LongTensor(edges[:, 2:]), + torch.Tensor(tf), + ) + + nF = q.shape[0] + pose_data_list = [ + PoseData( + torch.Tensor(q[i]), + torch.Tensor(p[i]), + torch.Tensor(qv[i]), + torch.Tensor(pv[i]), + torch.Tensor(pprev[i]), + torch.BoolTensor(c[i]).reshape(-1, 1), + torch.Tensor(r[i]).reshape(1, -1), + ) + for i in range(nF) + ] + return skel_data, pose_data_list + + +class SequenceDataset(Dataset): + """ + Dataset that loads complete motion sequences with text descriptions. + + Each item is a complete motion sequence rather than a single frame. + """ + + copy_orig_contact = False + + def __init__(self, text_dir: Optional[str] = None, seq_length: Optional[int] = None): + """ + Initialize the sequence dataset. + + Args: + text_dir: Directory containing text description files (.txt) + seq_length: Fixed sequence length. If None, load full sequences. + If specified, sequences will be truncated or padded to this length. + """ + # Skeleton and pose data + self.skel_list = [] + self.pose_list = [] + + # File information + self.filepaths = [] + self.frame_cnts = [] + self.start_frames = [] + self.end_frames = [] + + # Motion set related info + self.mi_ri_2_fi = [] + # mi: semantic motion index (same mi means semantically identical motion) + # ri: 0<=ri list of text descriptions for this motion + + # Sequence length configuration + self.seq_length = seq_length + + def add_data(self, lo, go, qb, edges, q, p, qv, pv, pprev, c, r, filepath, mi, tf, text=None): + """Add motion data to the dataset.""" + # Convert to SkelData and PoseData + sd, pdl = npz_2_data(lo, go, qb, edges, q, p, qv, pv, pprev, c, r, tf) + + self.skel_list.append(sd) + self.pose_list.extend(pdl) + + # Update file info + fi = len(self.filepaths) + nFrame = q.shape[0] + start = sum(self.frame_cnts) + end = start + nFrame + self.filepaths.append(filepath) + self.frame_cnts.append(nFrame) + self.start_frames.append(start) + self.end_frames.append(end) + + # Update motion set info + assert len(self.mi_ri_2_fi) >= mi + if len(self.mi_ri_2_fi) == mi: + # New semantic motion set + self.mi_ri_2_fi.append([]) + # Add text for new motion (only once per motion index) + self.mi_2_text.append(text if text is not None else []) + else: + # Ensure consistent frame count among retargeted dataset + orig_fi = self.mi_ri_2_fi[mi][0] + orig_nFrame = self.frame_cnts[orig_fi] + + assert orig_nFrame == nFrame, f"Frame count mismatch: {orig_nFrame} vs {nFrame}" + + if self.copy_orig_contact: + # Copy contact from the original motion (optional) + lf, rf = find_feet(sd) + orig_sd = self.skel_list[orig_fi] + orig_start = self.start_frames[orig_fi] + orig_pdl = self.pose_list[orig_start : orig_start + orig_nFrame] + orig_lf, orig_rf = find_feet(orig_sd) + for pdi, orig_pdi in zip(pdl, orig_pdl): + pdi.c[lf] = orig_pdi.c[orig_lf] + pdi.c[rf] = orig_pdi.c[orig_rf] + + self.mi_ri_2_fi[mi].append(fi) + + def add_data_from_npz(self, mi, npz_fp, bvh_fp=None, text=None): + """Load data from an NPZ file.""" + data = np.load(npz_fp) + if bvh_fp is None: + bvh_fp = npz_fp # placeholder + # Load tf from separate processed_text folder + tf_fp = npz_fp.replace('/processed/', '/joint_text_features/') + tf_data = np.load(tf_fp) + if 'tf' not in tf_data: + raise KeyError(f"'tf' key not found in {tf_fp}") + # Convert to dict and update with tf + data_dict = {key: data[key] for key in data.files} + data_dict['tf'] = tf_data['tf'] + self.add_data(**data_dict, filepath=bvh_fp, mi=mi, text=text) + + def load_data_dir_pairs(self, data_dir): + """ + Load paired motion data from a directory. + + The directory should contain: + - pair.txt: List of (source, target) motion pairs + - *.npz files: Motion data files + """ + pair_path = os.path.join(data_dir, "pair.txt") + assert os.path.exists(pair_path), f"{pair_path} does not exist" + bvh_prefix = os.path.join(os.path.dirname(data_dir), "bvh") + + # First pass: count total lines for progress bar + with open(pair_path, "r") as pair_file: + total_lines = sum(1 for line in pair_file if line.strip() != "") + + src_id_map = {} + with open(pair_path, "r") as pair_file: + pbar = tqdm(pair_file, total=total_lines, desc="Loading motion data", unit="pair") + for line in pbar: + if line.strip() == "": + continue + src_rel_path, dst_rel_path = line.strip().split() + + if src_rel_path in src_id_map: + src_id = src_id_map[src_rel_path] + else: # New source + src_id = len(self.mi_ri_2_fi) + src_id_map[src_rel_path] = src_id + npz_fp = os.path.join(data_dir, src_rel_path) + bvh_fp = os.path.join(bvh_prefix, Path(src_rel_path).with_suffix("")) + # Load text if text_dir is provided + text = self._load_text_for_file(src_rel_path) + self.add_data_from_npz(src_id, npz_fp, bvh_fp, text=text) + + if dst_rel_path in src_id_map: + continue + else: + npz_fp = os.path.join(data_dir, dst_rel_path) + bvh_fp = os.path.join(bvh_prefix, Path(dst_rel_path).with_suffix("")) + # No text for retargeted motions (they share text with source) + self.add_data_from_npz(src_id, npz_fp, bvh_fp, text=None) + pbar.close() + + def _load_text_for_file(self, file_rel_path): + """ + Load text descriptions for a motion file. + + Text files are stored in self.text_dir with the same name as motion file but .txt extension. + Each line in the text file contains one text description in the format: + caption#tokens#start_time#end_time + + Args: + file_rel_path: Relative path to the motion file (e.g., 'test/006888.bvh.npz') + + Returns: + List of text description dictionaries, or empty list if no text file found + """ + if self.text_dir is None: + return [] + + # Extract filename without extensions + basename = os.path.basename(file_rel_path) # '006888.bvh.npz' + filename = Path(basename).stem # '006888.bvh' + if filename.endswith('.bvh'): + filename = filename[:-4] # '006888' + + text_file_path = os.path.join(self.text_dir, filename + '.txt') + + if not os.path.exists(text_file_path): + return [] + + text_list = [] + try: + with open(text_file_path, 'r', encoding='utf-8') as f: + for line_num, line in enumerate(f.readlines(), 1): + line = line.strip() + if not line: + continue + + # Parse format: caption#tokens#start_time#end_time + parts = line.split('#') + if len(parts) < 4: + print(f"Warning: Malformed line {line_num} in {text_file_path}: expected 4 parts, got {len(parts)}") + continue + + try: + text_dict = { + 'caption': parts[0].strip(), + 'tokens': parts[1].strip().split(' ') if parts[1].strip() else [], + 'start_time': float(parts[2].strip()) if parts[2].strip() else 0.0, + 'end_time': float(parts[3].strip()) if parts[3].strip() else 0.0, + } + text_list.append(text_dict) + except ValueError as e: + print(f"Warning: Failed to parse line {line_num} in {text_file_path}: {e}") + continue + + except Exception as e: + print(f"Warning: Failed to load text from {text_file_path}: {e}") + return [] + + return text_list + + def get_mi_ri_fi_graph(self, mi, ri, frame): + """Get skeleton pose graph for a specific motion, rig, and frame.""" + fi = self.mi_ri_2_fi[mi][ri] + si = self.skel_list[fi] + pi = self.pose_list[self.start_frames[fi] + frame] + return SkelPoseGraph(si, pi) + + def get_sequence_graphs(self, mi, ri, start_frame=0, length=None): + """ + Get a sequence of graphs for a specific motion and rig. + + Args: + mi: Motion index + ri: Rig index + start_frame: Starting frame index + length: Number of frames to load. If None, load all remaining frames. + + Returns: + List of SkelPoseGraph objects + """ + fi = self.mi_ri_2_fi[mi][ri] + frame_cnt = self.frame_cnts[fi] + + if length is None: + length = frame_cnt - start_frame + + end_frame = min(start_frame + length, frame_cnt) + + graphs = [] + for frame in range(start_frame, end_frame): + graphs.append(self.get_mi_ri_fi_graph(mi, ri, frame)) + + return graphs, end_frame - start_frame + + def __getitem__(self, idx): + """ + Get a complete motion sequence with text. + + Args: + idx: Tuple (mi, src_ri, tgt_ri) where: + - mi: motion index + - src_ri: source rig index + - tgt_ri: target rig index + + Returns: + Tuple (src_graphs, tgt_graphs, text, m_lens) where: + - src_graphs: List of source skeleton pose graphs + - tgt_graphs: List of target skeleton pose graphs + - text: List of text descriptions for this motion + - m_lens: Length of the motion sequence (number of frames) + """ + mi, src_ri, tgt_ri = idx + + # Get frame count for this motion + fi = self.mi_ri_2_fi[mi][src_ri] + frame_cnt = self.frame_cnts[fi] + + # Handle sequence length + if self.seq_length is not None: + # Use specified sequence length + actual_length = min(self.seq_length, frame_cnt) + start_frame = 0 + else: + # Use full sequence + actual_length = frame_cnt + start_frame = 0 + + # Get sequence of graphs + src_graphs, _ = self.get_sequence_graphs(mi, src_ri, start_frame, actual_length) + tgt_graphs, _ = self.get_sequence_graphs(mi, tgt_ri, start_frame, actual_length) + + # Get text descriptions + text = self.mi_2_text[mi] if mi < len(self.mi_2_text) else [] + + # Actual sequence length + m_lens = len(src_graphs) + + return src_graphs, tgt_graphs, text, m_lens + + def __len__(self): + """Return the number of motion sequences in the dataset.""" + return len(self.mi_ri_2_fi) + + +class SequenceSampler(Sampler): + """ + Sampler that yields motion sequence indices. + + Unlike frame-based samplers, this sampler yields complete motion sequences. + """ + + def __init__(self, dataset, batch_size, shuffle=True): + """ + Initialize the sequence sampler. + + Args: + dataset: SequenceDataset instance + batch_size: Number of sequences per batch + shuffle: Whether to shuffle motion indices + """ + self.dataset = dataset + self.batch_size = batch_size + self.shuffle = shuffle + + # Motion indices + self.motion_indices = list(range(len(self.dataset.mi_ri_2_fi))) + + # For specifying fixed src/tgt rig indices + self.src_ri = None + self.tgt_ri = None + + def __iter__(self): + # Shuffle motion indices if required + indices = self.motion_indices.copy() + if self.shuffle: + random.shuffle(indices) + + batch = [] + for mi in indices: + # Random src/tgt skeletons (including the original ones) + R = len(self.dataset.mi_ri_2_fi[mi]) + + if R >= 2: + src_ri, tgt_ri = random.sample(range(R), 2) + else: + # Only one rig available + src_ri = tgt_ri = 0 + + # Override if src/tgt ri is specified + if self.src_ri is not None: + src_ri = self.src_ri + if self.tgt_ri is not None: + tgt_ri = self.tgt_ri + + batch.append((mi, src_ri, tgt_ri)) + + # Yield batch when full + if len(batch) == self.batch_size: + yield batch + batch = [] + + # Yield remaining items + if len(batch) > 0: + yield batch + + def __len__(self): + """Return the number of batches.""" + return (len(self.motion_indices) + self.batch_size - 1) // self.batch_size + + +def sequence_collate_fn(batch, mask_option=[], device="cpu", pad_to_max=False, return_list=False): + """ + Collate function for sequence-based batches. + + Args: + batch: List of tuples (src_graphs, tgt_graphs, text, m_lens) from __getitem__ + mask_option: List of strings indicating which graphs to apply random masking to + device: Device to move tensors to + pad_to_max: Default false. If True, pad all sequences to the maximum length in the batch + return_list: If False (default), return aggregated Batch objects. + If True, return list of Batch objects (one per sequence). + + Returns: + If return_list=False (default): + Tuple (src_batch, tgt_batch, text_list, m_lens, masks, batch_info) where: + - src_batch: Single aggregated Batch containing all sequences + - tgt_batch: Single aggregated Batch containing all sequences + - text_list: List of text descriptions + - m_lens: Numpy array of sequence lengths [T_0, T_1, ..., T_{B-1}] + - masks: Tensor of shape (batch_size, max_len) indicating valid frames (if pad_to_max) + - batch_info: Dict with keys: + - 'cumsum_lens': Cumulative sum of lengths for splitting [0, T_0, T_0+T_1, ...] + - 'num_sequences': Number of sequences in batch (batch_size) + - 'total_frames': Total number of frames across all sequences + + If return_list=True: + Tuple (src_batch_list, tgt_batch_list, text_list, m_lens, masks, batch_info) where: + - src_batch_list: List of batched source graphs (one per sequence) + - tgt_batch_list: List of batched target graphs (one per sequence) + - text_list: List of text descriptions + - m_lens: Numpy array of sequence lengths + - masks: Tensor of shape (batch_size, max_len) indicating valid frames (if pad_to_max) + - batch_info: Dict with metadata + """ + # Unpack batch + src_graphs_list = [item[0] for item in batch] + tgt_graphs_list = [item[1] for item in batch] + text_list = [item[2] for item in batch] + m_lens = [item[3] for item in batch] + + if pad_to_max and len(set(m_lens)) > 1: + # Sequences have different lengths, need to pad + max_len = max(m_lens) + + # Create masks (True for valid frames, False for padding) + masks = [] + padded_src_graphs_list = [] + padded_tgt_graphs_list = [] + + for src_graphs, tgt_graphs, seq_len in zip(src_graphs_list, tgt_graphs_list, m_lens): + # Create mask for this sequence + mask = [True] * seq_len + [False] * (max_len - seq_len) + masks.append(mask) + + # Pad sequences by repeating the last frame + if seq_len < max_len: + padding_needed = max_len - seq_len + # Repeat last frame for padding + src_graphs_padded = src_graphs + [src_graphs[-1]] * padding_needed + tgt_graphs_padded = tgt_graphs + [tgt_graphs[-1]] * padding_needed + else: + src_graphs_padded = src_graphs + tgt_graphs_padded = tgt_graphs + + padded_src_graphs_list.append(src_graphs_padded) + padded_tgt_graphs_list.append(tgt_graphs_padded) + + src_graphs_list = padded_src_graphs_list + tgt_graphs_list = padded_tgt_graphs_list + m_lens = [max_len] * len(m_lens) + masks = torch.BoolTensor(masks).to(device) + else: + # All sequences have the same length, no padding needed + masks = None + + # Batch graphs for each sequence + src_batch_list = [] + tgt_batch_list = [] + + for src_graphs, tgt_graphs in zip(src_graphs_list, tgt_graphs_list): + src_batch = Batch.from_data_list(src_graphs).to(device) + tgt_batch = Batch.from_data_list(tgt_graphs).to(device) + + # Apply masking if requested + if "src" in mask_option: + src_batch.mask = rnd_mask(src_batch, consq_n=len(src_graphs)) + if "tgt" in mask_option: + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=len(tgt_graphs)) + + src_batch_list.append(src_batch) + tgt_batch_list.append(tgt_batch) + + # Random select one text for each sequence if multiple texts are available + for i, texts in enumerate(text_list): + text_list[i] = random.choice(texts) if texts else {} + + # Create batch info for splitting later + cumsum_lens = np.concatenate([[0], np.cumsum(m_lens)]) + batch_info = { + 'cumsum_lens': cumsum_lens, # [0, T_0, T_0+T_1, ..., sum(T_i)] + 'num_sequences': len(m_lens), # Batch size + 'total_frames': int(np.sum(m_lens)), # Total frames + } + + # Return list format if requested + if return_list: + return src_batch_list, tgt_batch_list, text_list, m_lens, masks, batch_info + + # Aggregate all sequences into a single Batch (default behavior) + # Flatten all graphs from all sequences + all_src_graphs = [graph for graphs in src_graphs_list for graph in graphs] + all_tgt_graphs = [graph for graphs in tgt_graphs_list for graph in graphs] + + # Create single aggregated batch + src_batch = Batch.from_data_list(all_src_graphs).to(device) + tgt_batch = Batch.from_data_list(all_tgt_graphs).to(device) + + # Apply masking if requested (on the aggregated batch) + if "src" in mask_option: + src_batch.mask = rnd_mask(src_batch, consq_n=sum(m_lens)) + if "tgt" in mask_option: + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=sum(m_lens)) + + + return src_batch, tgt_batch, text_list, m_lens, masks, batch_info + + +def get_sequence_data_loader( + data_dir, + batch_size, + shuffle=True, + mask_option=[], + device="cpu", + text_dir=None, + seq_length=None, + pad_to_max=True, + return_list=False +): + """ + Create a DataLoader for sequence-based motion data. + + Args: + data_dir: Directory containing motion data + batch_size: Number of sequences per batch + shuffle: Whether to shuffle the data + mask_option: List of strings for masking ('src', 'tgt') + device: Device to load data to + text_dir: Directory containing text descriptions + seq_length: Fixed sequence length (None for variable length) + pad_to_max: Whether to pad sequences to max length in batch + return_list: If False (default), return aggregated Batch objects. + If True, return list of Batch objects (one per sequence). + + Returns: + DataLoader instance + """ + ds = SequenceDataset(text_dir=text_dir, seq_length=seq_length) + ds.load_data_dir_pairs(data_dir) + + sampler = SequenceSampler(ds, batch_size=batch_size, shuffle=shuffle) + + dl = DataLoader( + ds, + batch_sampler=sampler, + collate_fn=partial( + sequence_collate_fn, + mask_option=mask_option, + device=device, + pad_to_max=pad_to_max, + return_list=return_list, + ), + pin_memory=True, + ) + return dl + + +def split_aggregated_output(output, batch_info, remove_padding=True): + """ + Split aggregated encoder output back into individual sequences. + + This function is designed to split the output from an encoder that processes + the aggregated batch returned by sequence_collate_fn with return_list=False. + + Args: + output: Tensor of shape (total_frames, C) or (total_frames, 1, C) + The aggregated output from encoder processing all sequences + batch_info: Dict containing: + - 'cumsum_lens': Cumulative sum of lengths [0, T_0, T_0+T_1, ...] + - 'num_sequences': Number of sequences in batch + - 'total_frames': Total number of frames + remove_padding: If True and output has shape (T, 1, C), squeeze the middle dim + + Returns: + List of tensors, where output_list[i] has shape (T_i, C) for the i-th sequence + + Example: + >>> # Encoder processing + >>> src_batch, tgt_batch, text_list, m_lens, masks, batch_info = next(iter(dataloader)) + >>> # src_batch contains all frames: T_0 + T_1 + ... + T_{B-1} frames + >>> encoder_output = encoder(src_batch) # Shape: (sum(T_i), C) or (sum(T_i), 1, C) + >>> + >>> # Split back to individual sequences + >>> output_list = split_aggregated_output(encoder_output, batch_info) + >>> # output_list[0].shape = (T_0, C) + >>> # output_list[1].shape = (T_1, C) + >>> # ... + >>> # output_list[B-1].shape = (T_{B-1}, C) + """ + # Handle different input shapes + if output.dim() == 3 and output.shape[1] == 1: + # Shape: (T, 1, C) + if remove_padding: + # Squeeze to (T, C) + output = output.squeeze(1) + # else: keep (T, 1, C) shape + elif output.dim() == 2: + # Shape: (T, C) - already correct + pass + else: + raise ValueError(f"Expected output shape (T, C) or (T, 1, C), got {output.shape}") + + # Verify total frames match + expected_frames = batch_info['total_frames'] + actual_frames = output.shape[0] + if expected_frames != actual_frames: + raise ValueError( + f"Frame count mismatch: batch_info indicates {expected_frames} frames, " + f"but output has {actual_frames} frames" + ) + + # Split the output tensor + cumsum_lens = batch_info['cumsum_lens'] + output_list = [] + + for i in range(batch_info['num_sequences']): + start_idx = cumsum_lens[i] + end_idx = cumsum_lens[i + 1] + sequence_output = output[start_idx:end_idx] # Shape: (T_i, C) or (T_i, 1, C) + output_list.append(sequence_output) + + return output_list + + +def pad_sequence_list(output_list, pad_value=0.0, device=None, return_mask=True): + """ + Pad a list of variable-length sequences to the maximum length and stack into (B, T, C) tensor. + + This function takes the output from split_aggregated_output and pads all sequences + to the same length, creating a batched tensor suitable for models that expect + fixed-length inputs. + + Args: + output_list: List of tensors [tensor_0, tensor_1, ..., tensor_{B-1}] + where tensor_i has shape (T_i, C) + pad_value: Value to use for padding (default: 0.0) + device: Device to place the output tensor + return_mask: If True, also return a mask indicating valid positions + + Returns: + If return_mask=True: + Tuple (padded_tensor, mask, m_lens) where: + - padded_tensor: Tensor of shape (B, T_max, C) + - mask: BoolTensor of shape (B, T_max), True for valid positions + - m_lens: Numpy array of original sequence lengths [T_0, T_1, ..., T_{B-1}] + + If return_mask=False: + Tuple (padded_tensor, m_lens) where: + - padded_tensor: Tensor of shape (B, T_max, C) + - m_lens: Numpy array of original sequence lengths + + Example: + >>> # After splitting encoder output + >>> output_list = split_aggregated_output(encoder_output, batch_info) + >>> # output_list[0].shape = (60, 256) + >>> # output_list[1].shape = (70, 256) + >>> # output_list[2].shape = (50, 256) + >>> + >>> # Pad to maximum length + >>> padded_tensor, mask, m_lens = pad_sequence_list(output_list) + >>> # padded_tensor.shape = (3, 70, 256) # B=3, T_max=70, C=256 + >>> # mask.shape = (3, 70) + >>> # mask[0] = [True]*60 + [False]*10 + >>> # mask[1] = [True]*70 + >>> # mask[2] = [True]*50 + [False]*20 + >>> + >>> # Use in model + >>> model_output = model(padded_tensor, mask=mask) + """ + if device is None: + device = output_list[0].device + if not output_list: + raise ValueError("output_list cannot be empty") + + # Get dimensions + B = len(output_list) # Batch size + m_lens = np.array([tensor.shape[0] for tensor in output_list], dtype=np.int32) + T_max = int(m_lens.max()) # Maximum sequence length + C = output_list[0].shape[1] # Feature dimension + + # Initialize padded tensor + padded_tensor = torch.full((B, T_max, C), pad_value, dtype=output_list[0].dtype, device=device) + + # Fill in the actual values + for i, (tensor, length) in enumerate(zip(output_list, m_lens)): + padded_tensor[i, :length, :] = tensor.to(device) + + if return_mask: + # Create mask: True for valid positions, False for padding + mask = torch.zeros((B, T_max), dtype=torch.bool, device=device) + for i, length in enumerate(m_lens): + mask[i, :length] = True + return padded_tensor, mask, m_lens + else: + return padded_tensor, m_lens + + +def merge_sequence_outputs(output_list, device="cpu"): + """ + Merge a list of per-sequence outputs back into a single aggregated tensor. + + This is the inverse operation of split_aggregated_output, useful when you want + to aggregate results after per-sequence processing. + + Args: + output_list: List of tensors [tensor_0, tensor_1, ..., tensor_{B-1}] + where tensor_i has shape (T_i, C) + device: Device to place the output tensor + + Returns: + Tuple (aggregated_output, batch_info) where: + - aggregated_output: Tensor of shape (sum(T_i), C) + - batch_info: Dict with cumsum_lens, num_sequences, total_frames + + Example: + >>> # Process sequences individually + >>> output_list = [] + >>> for i, seq_input in enumerate(input_list): + >>> seq_output = process_sequence(seq_input) # Shape: (T_i, C) + >>> output_list.append(seq_output) + >>> + >>> # Merge back for batch processing + >>> aggregated_output, batch_info = merge_sequence_outputs(output_list) + >>> # aggregated_output.shape = (T_0 + T_1 + ... + T_{B-1}, C) + """ + if not output_list: + raise ValueError("output_list cannot be empty") + + # Get sequence lengths + m_lens = np.array([tensor.shape[0] for tensor in output_list], dtype=np.int32) + + # Create batch info + cumsum_lens = np.concatenate([[0], np.cumsum(m_lens)]) + batch_info = { + 'cumsum_lens': cumsum_lens, + 'num_sequences': len(output_list), + 'total_frames': int(np.sum(m_lens)), + } + + # Concatenate all outputs + aggregated_output = torch.cat(output_list, dim=0).to(device) + + return aggregated_output, batch_info + + +def get_single_sequence(dataset: SequenceDataset, mi, src_ri, tgt_ri, device="cpu"): + """ + Get a single complete motion sequence. + + Args: + dataset: SequenceDataset instance + mi: Motion index + src_ri: Source rig index + tgt_ri: Target rig index + device: Device to move data to + + Returns: + Tuple (src_batch, tgt_batch, text, m_lens) where: + - src_batch: Batched source graphs for all frames + - tgt_batch: Batched target graphs for all frames + - text: Text descriptions for this motion + - m_lens: Length of the sequence + """ + src_graphs, tgt_graphs, text, m_lens = dataset[mi, src_ri, tgt_ri] + + src_batch = Batch.from_data_list(src_graphs).to(device) + tgt_batch = Batch.from_data_list(tgt_graphs).to(device) + + return src_batch, tgt_batch, text, m_lens diff --git a/src/sata/test.py b/src/sata/test.py new file mode 100644 index 0000000000000000000000000000000000000000..ce903dc436607032c64a99d2513facdae84b2b27 --- /dev/null +++ b/src/sata/test.py @@ -0,0 +1,186 @@ +import argparse +from sata.utils import tensor_utils +import numpy as np +import torch +from sata.mypath import * +from sata.mymodel import make_load_model +from sata.mydataset import PairedDataset, get_mi_src_tgt_all_graph +from sata.skel_pose_graph import SkelPoseGraph, rnd_mask +from sata.utils.skel_gen_utils import create_random_skel +from sata.conversions.graph_to_motion import graph_2_skel +from fairmotion.core import motion as motion_class + + +def prepare_model_test(model_epoch, device): + # device, printoptions + tensor_utils.set_device(device) + np.set_printoptions(precision=5, suppress=True) + torch.set_printoptions(precision=5, sci_mode=False) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + # Model + model, cfg = make_load_model(model_epoch, device) + model.eval() + + load_dir = os.path.join(RESULT_DIR, model_epoch.split("/")[0]) + ms_dict = torch.load(os.path.join(load_dir, "ms_dict.pt")) + + # set SkelPoseGraph class variables + SkelPoseGraph.skel_cfg = cfg["representation"]["skel"] + SkelPoseGraph.pose_cfg = cfg["representation"]["pose"] + SkelPoseGraph.ms_dict = ms_dict + + return model, cfg, ms_dict + + +""" ================= basic functions commonly needed for tasks ================= """ +from sata.conversions.graph_to_motion import gt_recon_motion, hatD_recon_motion +from sata.conversions.motion_to_graph import bvh_2_graph, skel_2_graph +from torch_geometric.data import Batch + + +def retarget(model, src_batch, tgt_batch, ms_dict, out_rep_cfg, consq_n): + # src ground truth + src_motion_list, src_contact_list = gt_recon_motion(src_batch, consq_n) + # predicted result + z, hatD = model(src_batch, tgt_batch) + out_motion_list, out_contact_list = hatD_recon_motion( + hatD, tgt_batch, out_rep_cfg, ms_dict, consq_n + ) + + # when tgt ground-truth motion is available + if hasattr(tgt_batch, "q"): + tgt_motion_list, tgt_contact_list = gt_recon_motion(tgt_batch, consq_n) + return src_motion_list[0], tgt_motion_list[0], out_motion_list[0] + else: + tgt_skel = graph_2_skel(tgt_batch, 1)[0] + tgt_motion = motion_class.Motion(skel=tgt_skel) + tpose = np.eye(4)[None, ...].repeat(tgt_skel.num_joints(), 0) + tpose[0, 1, 3] = tgt_batch.go[0, 1] # root height + tgt_motion.add_one_frame(tpose) + + return src_motion_list[0], tgt_motion, out_motion_list[0] + + +##### motion to z ##### +def bvh_2_graph_z(model, bvh_filepath): + graph_batch = bvh_2_graph(bvh_filepath).to(device=model.device) + z = model.encoder[0](graph_batch) + motion_list, contact_list = gt_recon_motion(graph_batch, len(z)) + return motion_list[0], graph_batch, z + + +##### z to motion ##### +def decode_z_skel(model, z, skel, ms_dict): + return decode_z_skelgraph(model, z, skel_2_graph(skel), ms_dict) + + +def decode_z_skelgraph(model, z, skel_graph, ms_dict): + B_skel_graph = Batch.from_data_list([skel_graph] * len(z)).to(device=model.device) + hatD = model.decoder[0](z, B_skel_graph) + out_motion_list, out_contact_list = hatD_recon_motion( + hatD, B_skel_graph, model.rep_cfg["out"], ms_dict, len(z) + ) + return out_motion_list[0], out_contact_list[0] + + +##### convert all bvh to z and save as npy ##### +def list_bvh_files(directory): + bvh_files = [] + for root, dirs, files in os.walk(directory): + if not dirs: # leaf directory + relative_path = os.path.relpath(root, directory) + for file in files: + if file.endswith(".bvh"): + bvh_files.append(os.path.join(relative_path, file)) + return bvh_files + + +import tqdm, gc + + +def save_bvh_z(model_epoch, bvh_dir, npy_dir): + model, cfg, ms_dict = prepare_model_test(model_epoch, "cuda:0") + bvh_files = list_bvh_files(bvh_dir) + for bvh_rel_fn in tqdm.tqdm(bvh_files): + bvh_fp = os.path.join(bvh_dir, bvh_rel_fn) + npy_fp = os.path.join(npy_dir, bvh_rel_fn[:-4] + ".npy") + if not os.path.exists(os.path.dirname(npy_fp)): + os.makedirs(os.path.dirname(npy_fp)) + motion, graph_batch, z = bvh_2_graph_z(model, bvh_fp) + # print(bvh_fp, npy_fp) + np.save(npy_fp, z.cpu().detach().numpy()) + del motion, graph_batch, z + # gc.collect() + # torch.cuda.empty_cache() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--model_epoch", type=str, default="ckpt0") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--data_dir", type=str, default="test/motion/processed/") + parser.add_argument("--rnd_tgt", type=int, default=0) + parser.add_argument("--src_mask", type=int, default=0) + parser.add_argument("--tgt_mask", type=int, default=0) + + args = parser.parse_args() + + model, cfg, ms_dict = prepare_model_test(args.model_epoch, args.device) + + # Dataset + ds = PairedDataset() + data_dir = os.path.join(DATA_DIR, args.data_dir) + ds.load_data_dir_pairs(data_dir) + + from sata.default_veiwer import get_default_viewer + + viewer = get_default_viewer(argparse.Namespace(imgui=False)) + + def retarget_mi(mi): + R = len(ds.mi_ri_2_fi[mi]) + src_ri, tgt_ri = np.random.randint(0, R, size=2) + (src_batch, tgt_batch), consq_n = get_mi_src_tgt_all_graph( + dataset=ds, mi=mi, src_ri=src_ri, tgt_ri=tgt_ri, device=args.device + ) + # option 1) test with data tgt skeleton + # option 2) test with random skeleton + if args.rnd_tgt: + rnd_tgt_skel = create_random_skel() + rnd_tgt_skel_graph = skel_2_graph(rnd_tgt_skel) + rnd_tgt_batch = Batch.from_data_list([rnd_tgt_skel_graph] * consq_n).to( + device=model.device + ) + tgt_batch = rnd_tgt_batch + + if args.src_mask: + src_batch.mask = rnd_mask(src_batch, consq_n=consq_n) + + if args.tgt_mask: + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=consq_n) + + src_motion, tgt_motion, out_motion = retarget( + model, + src_batch, + tgt_batch, + ms_dict, + out_rep_cfg=cfg["representation"]["out"], + consq_n=consq_n, + ) + + # update viewer + viewer.update_motions([src_motion, tgt_motion, out_motion], 150, linear=True) + viewer.mi = mi + + retarget_mi(0) + + def extra_key_callback(key): + if key == b"m": + next_mi = (viewer.mi + 1) % len(ds.mi_ri_2_fi) + retarget_mi(next_mi) + return True + return False + + viewer.extra_key_callback = extra_key_callback + viewer.run() diff --git a/src/sata/test_vq.py b/src/sata/test_vq.py new file mode 100644 index 0000000000000000000000000000000000000000..ef63c0da715c5880a104f2f9276f499faa53568f --- /dev/null +++ b/src/sata/test_vq.py @@ -0,0 +1,212 @@ +import argparse +from sata.utils import tensor_utils +import numpy as np +import torch +from sata.mypath import * +from sata.mymodel import make_load_model +from sata.mydataset import PairedDataset, get_mi_src_tgt_all_graph +from sata.skel_pose_graph import SkelPoseGraph, rnd_mask +from sata.utils.skel_gen_utils import create_random_skel +from sata.conversions.graph_to_motion import graph_2_skel +from fairmotion.core import motion as motion_class + + +def prepare_model_test(model_epoch, device): + # device, printoptions + tensor_utils.set_device(device) + np.set_printoptions(precision=5, suppress=True) + torch.set_printoptions(precision=5, sci_mode=False) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + # Model + model, cfg = make_load_model(model_epoch, device) + model.eval() + + load_dir = os.path.join(RESULT_DIR, model_epoch.split("/")[0]) + ms_dict = torch.load(os.path.join(load_dir, "ms_dict.pt")) + + # set SkelPoseGraph class variables + SkelPoseGraph.skel_cfg = cfg["representation"]["skel"] + SkelPoseGraph.pose_cfg = cfg["representation"]["pose"] + SkelPoseGraph.ms_dict = ms_dict + + return model, cfg, ms_dict + + +""" ================= basic functions commonly needed for tasks ================= """ +from sata.conversions.graph_to_motion import gt_recon_motion, hatD_recon_motion +from sata.conversions.motion_to_graph import bvh_2_graph, skel_2_graph +from torch_geometric.data import Batch + + +def retarget(model, src_batch, tgt_batch, ms_dict, out_rep_cfg, consq_n): + # src ground truth + src_motion_list, src_contact_list = gt_recon_motion(src_batch, consq_n) + # predicted result (VQ model returns 4 values: z, hatD, commit_loss, perplexity) + z, hatD, _, _ = model(src_batch, tgt_batch, consq_n) + out_motion_list, out_contact_list = hatD_recon_motion( + hatD, tgt_batch, out_rep_cfg, ms_dict, consq_n + ) + + # when tgt ground-truth motion is available + if hasattr(tgt_batch, "q"): + tgt_motion_list, tgt_contact_list = gt_recon_motion(tgt_batch, consq_n) + return src_motion_list[0], tgt_motion_list[0], out_motion_list[0] + else: + tgt_skel = graph_2_skel(tgt_batch, 1)[0] + tgt_motion = motion_class.Motion(skel=tgt_skel) + tpose = np.eye(4)[None, ...].repeat(tgt_skel.num_joints(), 0) + tpose[0, 1, 3] = tgt_batch.go[0, 1] # root height + tgt_motion.add_one_frame(tpose) + + return src_motion_list[0], tgt_motion, out_motion_list[0] + + +##### motion to z ##### +def bvh_2_graph_z(model, bvh_filepath): + graph_batch = bvh_2_graph(bvh_filepath).to(device=model.device) + z = model.encoder[0](graph_batch) + motion_list, contact_list = gt_recon_motion(graph_batch, len(z)) + return motion_list[0], graph_batch, z + + +##### z to motion ##### +def decode_z_skel(model, z, skel, ms_dict): + return decode_z_skelgraph(model, z, skel_2_graph(skel), ms_dict) + + +def decode_z_skelgraph(model, z, skel_graph, ms_dict): + B_skel_graph = Batch.from_data_list([skel_graph] * len(z)).to(device=model.device) + hatD = model.decoder[0](z, B_skel_graph) + out_motion_list, out_contact_list = hatD_recon_motion( + hatD, B_skel_graph, model.rep_cfg["out"], ms_dict, len(z) + ) + return out_motion_list[0], out_contact_list[0] + + +##### convert all bvh to z and save as npy ##### +def list_bvh_files(directory): + bvh_files = [] + for root, dirs, files in os.walk(directory): + if not dirs: # leaf directory + relative_path = os.path.relpath(root, directory) + for file in files: + if file.endswith(".bvh"): + bvh_files.append(os.path.join(relative_path, file)) + return bvh_files + + +import tqdm, gc + + +def save_bvh_z(model_epoch, bvh_dir, npy_dir): + model, cfg, ms_dict = prepare_model_test(model_epoch, "cuda:0") + bvh_files = list_bvh_files(bvh_dir) + for bvh_rel_fn in tqdm.tqdm(bvh_files): + bvh_fp = os.path.join(bvh_dir, bvh_rel_fn) + npy_fp = os.path.join(npy_dir, bvh_rel_fn[:-4] + ".npy") + if not os.path.exists(os.path.dirname(npy_fp)): + os.makedirs(os.path.dirname(npy_fp)) + motion, graph_batch, z = bvh_2_graph_z(model, bvh_fp) + # print(bvh_fp, npy_fp) + np.save(npy_fp, z.cpu().detach().numpy()) + del motion, graph_batch, z + # gc.collect() + # torch.cuda.empty_cache() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--model_epoch", type=str, default="ckpt0") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--data_dir", type=str, default="sample/motion/processed/") + parser.add_argument("--sample_num", type=int, default=-1, + help="Number of samples to test (-1 for all)") + parser.add_argument("--rnd_tgt", type=int, default=0) + parser.add_argument("--src_mask", type=int, default=0) + parser.add_argument("--tgt_mask", type=int, default=0) + + args = parser.parse_args() + + model, cfg, ms_dict = prepare_model_test(args.model_epoch, args.device) + + # Dataset + consq_n = 8 # Default consq_n for test + ds = PairedDataset(min_motion_lens=consq_n) + data_dir = os.path.join(DATA_DIR, args.data_dir) + ds.load_data_dir_pairs(data_dir) + + # Determine test range based on sample_num + total_samples = len(ds.mi_ri_2_fi) + if args.sample_num > 0 and args.sample_num < total_samples: + test_range = list(range(args.sample_num)) + print(f"Testing on first {args.sample_num}/{total_samples} samples") + else: + test_range = list(range(total_samples)) + print(f"Testing on all {total_samples} samples") + + from sata.default_veiwer import get_default_viewer + + viewer = get_default_viewer(argparse.Namespace(imgui=False)) + + def retarget_mi(mi): + # Check if mi is in test range + if mi not in test_range: + print(f"Warning: motion index {mi} is outside test range") + return None + + R = len(ds.mi_ri_2_fi[mi]) + src_ri, tgt_ri = np.random.randint(0, R, size=2) + (src_batch, tgt_batch), consq_n_batch = get_mi_src_tgt_all_graph( + dataset=ds, mi=mi, src_ri=src_ri, tgt_ri=tgt_ri, device=args.device + ) + # option 1) test with data tgt skeleton + # option 2) test with random skeleton + if args.rnd_tgt: + rnd_tgt_skel = create_random_skel() + rnd_tgt_skel_graph = skel_2_graph(rnd_tgt_skel) + rnd_tgt_batch = Batch.from_data_list([rnd_tgt_skel_graph] * consq_n_batch).to( + device=model.device + ) + tgt_batch = rnd_tgt_batch + + if args.src_mask: + src_batch.mask = rnd_mask(src_batch, consq_n=consq_n_batch) + + if args.tgt_mask: + tgt_batch.mask = rnd_mask(tgt_batch, consq_n=consq_n_batch) + + src_motion, tgt_motion, out_motion = retarget( + model, + src_batch, + tgt_batch, + ms_dict, + out_rep_cfg=cfg["representation"]["out"], + consq_n=consq_n_batch, + ) + + # update viewer + viewer.update_motions([src_motion, tgt_motion, out_motion], 150, linear=True) + viewer.mi = mi + + return src_motion, tgt_motion, out_motion + + # Start with first sample in test range + retarget_mi(test_range[0]) + + def extra_key_callback(key): + if key == b"m": + # Find current position in test_range + try: + current_idx = test_range.index(viewer.mi) + next_idx = (current_idx + 1) % len(test_range) + next_mi = test_range[next_idx] + except ValueError: + next_mi = test_range[0] + retarget_mi(next_mi) + return True + return False + + viewer.extra_key_callback = extra_key_callback + viewer.run() diff --git a/src/sata/train_vq_sliding_overlap.py b/src/sata/train_vq_sliding_overlap.py new file mode 100644 index 0000000000000000000000000000000000000000..37e27105261ef5d763f1c4029c8b9db8d3de0a37 --- /dev/null +++ b/src/sata/train_vq_sliding_overlap.py @@ -0,0 +1,359 @@ +""" +Training script for VQ-VAE and RVQ-VAE models +Adapted from train.py to support vector quantization models +""" +import argparse, sys, yaml, gc, shutil +from tqdm import tqdm +import numpy as np +from functools import partial +from IPython import embed + +from sata.mypath import * +from sata.utils import file_io, tensor_utils, network_utils +# Added get_mi_src_tgt_all_graph for evaluation +from sata.mydataset import PairedDataset, get_paired_data_loader, get_mi_src_tgt_all_graph +from sata.mymodel import out_post_fwd +from sata.mymodel import VQ_Model +from sata.skel_pose_graph import SkelPoseGraph +from sata.loss import compute_loss +from sata.metric import compute_metric +import time +from task.evaluation.table1_vq_sliding_overlap import process_with_sliding_window + + +def load_trainer(load_cfg, model, optimizer, scheduler, device, log_path): + """Load checkpoint to resume training""" + if (load_cfg is None) or (load_cfg["dir"] is None): + return 0 + + load_dir, load_epoch = load_cfg["dir"], load_cfg["epoch"] + load_model_name = ( + "last_model.pt" if load_epoch is None else "model_{}.pt".format(load_epoch) + ) + load_abs_dir = os.path.join(RESULT_DIR, load_dir) + load_path = os.path.join(load_abs_dir, load_model_name) + + saved = torch.load(load_path, map_location=device) + + model.load_state_dict(saved["model"]) + optimizer.load_state_dict(saved["optimizer"]) + if "scheduler" in saved and scheduler: + scheduler.load_state_dict(saved["scheduler"]) + epoch_cnt = saved["epoch"] + + prev_log_path = os.path.join(load_abs_dir, "logs") + if not os.path.samefile(prev_log_path, log_path): + shutil.rmtree(log_path) + shutil.copytree(prev_log_path, log_path) + print("continue training from epoch {} at {}".format(epoch_cnt, prev_log_path)) + return epoch_cnt + 1 + + +def run_test_evaluation(model, test_ds, device, cfg, ms_dict, sample_num, writer, epoch_cnt, + window_size=64, overlap=16): + """ + Run evaluation on a subset of the test dataset for VQ model using sliding window. + Uses process_with_sliding_window from table1_vq_sliding_overlap.py + + Args: + model: VQ model + test_ds: test dataset + device: torch device + cfg: config dict + ms_dict: motion statistics dict + sample_num: number of samples to evaluate + writer: tensorboard writer + epoch_cnt: current epoch + window_size: sliding window size (default: 64) + overlap: overlap between consecutive windows (default: 16) + """ + print(f"\n[Evaluation] Running evaluation on {sample_num} test samples with sliding window...") + print(f" Window size: {window_size}, Overlap: {overlap}, Stride: {window_size - overlap}") + model.eval() + + # Metric keys from table1.py + metric_key = ["qR", "ra_xz", "pa", "slide", "pen"] + metric = {key: 0.0 for key in metric_key} + + # Determine number of samples to test + N = len(test_ds.mi_ri_2_fi) + if sample_num > 0 and sample_num < N: + test_range = range(sample_num) + N_eval = sample_num + else: + test_range = range(N) + N_eval = N + + with torch.no_grad(): + for mi in tqdm(test_range, desc="Eval"): + # Get total frames for this motion + fi = test_ds.mi_ri_2_fi[mi][0] # Use first rig to get frame count + total_frames = test_ds.frame_cnts[fi] + + # Use sliding window processing (enable debug for first sample) + z, hatD, tgt_batch = process_with_sliding_window( + model, test_ds, mi, 0, 0, total_frames, window_size, overlap, device, + ) + consq_n = total_frames + + # Compute output and GT using out_post_fwd + out, gt = out_post_fwd( + {"hatD": hatD, "z": z}, + tgt_batch, + ms_dict, + cfg["representation"]["out"], + consq_n, + ) + + # Compute metrics + mi_metric = compute_metric(metric_key, out, gt) + for key in metric_key: + metric[key] += mi_metric[key].detach().item() + + # Clean up per iteration + del tgt_batch, z, hatD, out, gt, mi_metric + + # Log metrics + print(f"Epoch {epoch_cnt} Test Metrics (Sliding Window):") + for key in metric_key: + avg_val = metric[key] / N_eval + print(f"{key}: {avg_val:.4f}", end="\t") + if writer: + writer.add_scalar(f"test_metric/{key}", avg_val, epoch_cnt) + print("\n") + + model.train() # Switch back to train mode + torch.cuda.empty_cache() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--exp", type=str, required=True, help="Experiment name") + parser.add_argument("--cfg", type=str, default="mycfg_vq_standard", + help="Config name (mycfg_vq_standard or mycfg_rvq)") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--seed", type=int, default=0) + args = parser.parse_args() + + cfg = file_io.load_cfg(args.cfg) + + ## Seed, device, print options + import torch + + torch.manual_seed(args.seed) + np.random.seed(args.seed) + tensor_utils.set_device(args.device) + np.set_printoptions(precision=5, suppress=True) + torch.set_printoptions(precision=5, sci_mode=False) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + train_cfg = cfg["train"] + if "copy_orig_contact" in cfg["train"]: + PairedDataset.copy_orig_contact = cfg["train"]["copy_orig_contact"] + + ## Dataset (Training) + data_dir = os.path.join(DATA_DIR, cfg["train_data"]["dir"]) + dl = get_paired_data_loader( + data_dir, + train_cfg["batch_size"], + train_cfg["consq_n"], + shuffle=True, + mask_option=cfg["train_data"]["mask"], + device=args.device, + num_workers=train_cfg.get("num_workers", 0), + ) + + ## Dataset (Testing) - Prepared here but used inside loop + test_ds = None + test_sample_num = -1 + test_window_size = 64 # Default window size for sliding window evaluation + test_overlap = 16 # Default overlap for sliding window evaluation + if "test_data" in cfg: + print("Loading Test Dataset for evaluation...") + # Consistent with table1.py + test_ds = PairedDataset(min_motion_lens=train_cfg["consq_n"]) + test_data_path = os.path.join(DATA_DIR, cfg["test_data"]["dir"]) + test_ds.load_data_dir_pairs(test_data_path) + test_sample_num = cfg["test_data"].get("sample_num", 50) + # Get sliding window parameters from config if available + test_window_size = cfg["test_data"].get("window_size", 64) + test_overlap = cfg["test_data"].get("overlap", 16) + print(f"Test Dataset Loaded. Will evaluate on first {test_sample_num} samples.") + print(f"Sliding window: size={test_window_size}, overlap={test_overlap}, stride={test_window_size - test_overlap}") + + ## Model + model = VQ_Model(cfg["model"], cfg["representation"]).to(device=args.device) + nb_code = cfg["model"]["VQ"]["nb_code"] + vq_type = cfg["model"]["VQ"].get("type", "VQ").upper() + num_q = cfg["model"]["VQ"].get("num_quantizers", 1) + + print(f"\n{'='*50}") + if vq_type == "RVQ": + print(f"RVQ Model: {num_q} layers × {nb_code} codes/layer, z_dim={cfg['model']['z_dim']}") + print(f"Total codebook capacity: {nb_code}^{num_q} = {nb_code**num_q:,} combinations") + else: + print(f"VQ Model: codebook_size={nb_code}, z_dim={cfg['model']['z_dim']}") + print(f"Total parameters: {sum(p.numel() for p in model.parameters()):,}") + print(f"{'='*50}\n") + + ## Optimizer & Scheduler + weight_decay = train_cfg.get("weight_decay", 0.0) + optimizer = torch.optim.Adam( + model.parameters(), + lr=train_cfg["learning_rate"], + weight_decay=weight_decay + ) + scheduler = network_utils.get_scheduler( + optimizer, train_cfg["lr_schedule"], train_cfg["epoch_num"] + ) + + ## Log setup + from torch.utils.tensorboard import SummaryWriter + from datetime import datetime + + save_dir = os.path.join(RESULT_DIR, args.exp) + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_path = os.path.join(save_dir, "logs", timestamp) + writer = SummaryWriter(log_path) + + # Save para.txt and config.yaml to timestamped log directory + with open(os.path.join(log_path, "para.txt"), "w") as para_file: + # add current time + para_file.write("time: {}\n".format(time.asctime())) + # Record command line arguments + para_file.write(" ".join(sys.argv)) + # Record running conda name and pwd + para_file.write("\n") + conda_name = os.environ.get("CONDA_DEFAULT_ENV", "N/A") + para_file.write("conda: {}\n".format(conda_name)) + para_file.write("pwd: {}\n".format(os.getcwd())) + para_file.write("git hash: {}\n".format(os.popen("git rev-parse HEAD").read().strip())) + + # Save config to timestamped log directory + with open(os.path.join(log_path, "config.yaml"), "w") as f: + yaml.dump(cfg, f) + print("SAVE DIR:", save_dir) + print("LOG DIR:", log_path) + + # Copy ms_dict + shutil.copyfile( + os.path.join(data_dir, "ms_dict.pt"), os.path.join(save_dir, "ms_dict.pt") + ) + ms_dict = torch.load(os.path.join(data_dir, "ms_dict.pt")) + + # Set SkelPoseGraph + SkelPoseGraph.skel_cfg = cfg["representation"]["skel"] + SkelPoseGraph.pose_cfg = cfg["representation"]["pose"] + SkelPoseGraph.ms_dict = ms_dict + + # Resume training + epoch_init = 0 + if "load" in train_cfg: + epoch_init = load_trainer( + train_cfg["load"], model, optimizer, scheduler, args.device, log_path + ) + + # VQ training params + commit_weight = train_cfg.get("commit_weight") + weight_decay = train_cfg.get("weight_decay", 0.0) + print(f"Commit weight: {commit_weight}") + print(f"Weight decay: {weight_decay}\n") + print("="*50) + print("START TRAINING") + print("="*50) + + ## Train Loop + model.train() + for epoch_cnt in tqdm(range(epoch_init, train_cfg["epoch_num"])): + epoch_loss = {k: 0 for k in list(train_cfg["loss"].keys()) + ["total", "commit", "perplexity"]} + epoch_metric = {k: 0 for k in train_cfg["metric"]} + + for bi, (src_batch, tgt_batch) in enumerate(dl): + optimizer.zero_grad() + src_batch = src_batch.to(args.device, non_blocking=True) + tgt_batch = tgt_batch.to(args.device, non_blocking=True) + + ## Forward + z, hatD, commit_loss, perplexity = model( + src_batch, tgt_batch, consq_n=train_cfg["consq_n"] + ) + + # Also encode the target for Z loss. + # z_tgt, _, commit_loss_tgt, perplexity_tgt = model.encode(tgt_batch, return_codes=True) + + # out = {"hatD": hatD, "z": z, "z_tgt": z_tgt} + out = {"hatD": hatD, "z": z} + + # Post-process + out, gt = out_post_fwd( + out, tgt_batch, ms_dict, + cfg["representation"]["out"], + train_cfg["consq_n"], + ) + + # Compute loss + loss = compute_loss(train_cfg["loss"], out, gt) + metric = compute_metric(train_cfg["metric"], out, gt) + + # VQ losses + # loss["commit"] = commit_loss + commit_loss_tgt + # loss["perplexity"] = (perplexity + perplexity_tgt) / 2 + loss["commit"] = commit_loss + loss["perplexity"] = perplexity + loss["total"] = loss["total"] + commit_weight * loss["commit"] + + ## Backward + loss["total"].backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), train_cfg["grad_max_norm"]) + optimizer.step() + + ## Accumulate + for k, v in loss.items(): + epoch_loss[k] += tensor_utils.cdn(v) + for k, v in metric.items(): + epoch_metric[k] += tensor_utils.cdn(v) + + ## Log + for k, v in epoch_loss.items(): + writer.add_scalar("loss/" + k, v / len(dl), epoch_cnt) + for k, v in epoch_metric.items(): + writer.add_scalar("metric/" + k, v / len(dl), epoch_cnt) + writer.add_scalar("lr", optimizer.param_groups[0]["lr"], epoch_cnt) + + # Print + if epoch_cnt % 10 == 0 or epoch_cnt < 5: + print(f"\nEpoch {epoch_cnt}: Loss={epoch_loss['total']/len(dl):.4f}, " + f"Commit={epoch_loss['commit']/len(dl):.4f}, " + f"Perp={epoch_loss['perplexity']/len(dl):.2f}") + + ## Save + if (epoch_cnt % train_cfg["save_per"] == 0) or (epoch_cnt + 1 == train_cfg["epoch_num"]): + save_state = { + "epoch": epoch_cnt, + "model": model.state_dict(), + "optimizer": optimizer.state_dict(), + "scheduler": scheduler.state_dict(), + "nb_code": nb_code, + } + torch.save(save_state, os.path.join(save_dir, f"model_{epoch_cnt}.pt")) + torch.save(save_state, os.path.join(save_dir, "last_model.pt")) + print("save done: ", epoch_cnt) + + # --- EVALUATION HOOK --- + if test_ds is not None: + run_test_evaluation( + model, test_ds, args.device, cfg, ms_dict, + test_sample_num, writer, epoch_cnt, + window_size=test_window_size, overlap=test_overlap + ) + # ----------------------- + + if scheduler: + scheduler.step() + # gc.collect() + # torch.cuda.empty_cache() + + print("\n" + "="*50) + print(f"Training completed! Saved to: {save_dir}") + print("="*50) diff --git a/src/sata/train_wEval.py b/src/sata/train_wEval.py new file mode 100644 index 0000000000000000000000000000000000000000..3eb48dd59bcf3527728e96ae42286b08c0782b8c --- /dev/null +++ b/src/sata/train_wEval.py @@ -0,0 +1,348 @@ +import argparse, sys, yaml, gc, shutil +from tqdm import tqdm +import numpy as np +from functools import partial +from IPython import embed +import time + +from sata.mypath import * +from sata.utils import file_io, tensor_utils, network_utils +# Added get_mi_src_tgt_all_graph for evaluation +from sata.mydataset import PairedDataset, get_paired_data_loader, get_mi_src_tgt_all_graph +from sata.mymodel import Model, out_post_fwd +from sata.skel_pose_graph import SkelPoseGraph +from sata.loss import compute_loss +from sata.metric import compute_metric +from sata.vae_loss import KL_Loss + +def load_trainer(load_cfg, model, optimizer, scheduler, device, log_path): + if (load_cfg is None) or (load_cfg["dir"] is None): + return 0 + + load_dir, load_epoch = load_cfg["dir"], load_cfg["epoch"] + load_model_name = ( + "last_model.pt" if load_epoch is None else "model_{}.pt".format(load_epoch) + ) + load_abs_dir = os.path.join(RESULT_DIR, load_dir) + load_path = os.path.join(load_abs_dir, load_model_name) + + saved = torch.load(load_path, map_location=device) + + model.load_state_dict(saved["model"]) + optimizer.load_state_dict(saved["optimizer"]) + if "scheduler" in saved and scheduler: + scheduler.load_state_dict(saved["scheduler"]) + epoch_cnt = saved["epoch"] + + prev_log_path = os.path.join(load_abs_dir, "logs") + if not os.path.samefile(prev_log_path, log_path): + import shutil + + shutil.rmtree(log_path) + shutil.copytree(prev_log_path, log_path) + print("continue training from epoch {} at {}".format(epoch_cnt, prev_log_path)) + # Return epoch_cnt + 1 to continue from next epoch + return epoch_cnt + 1 + +def run_test_evaluation(model, test_ds, device, cfg, ms_dict, sample_num, writer, epoch_cnt): + """ + Run evaluation on a subset of the test dataset. + Matches the logic in src/task/evaluation/table1.py + """ + print(f"\n[Evaluation] Running evaluation on {sample_num} test samples...") + model.eval() + + # Metric keys from table1.py + metric_key = ["qR", "ra_xz", "pa", "slide", "pen"] + metric = {key: 0.0 for key in metric_key} + + # Determine number of samples to test + N = len(test_ds.mi_ri_2_fi) + if sample_num > 0 and sample_num < N: + test_range = range(sample_num) + N_eval = sample_num + else: + test_range = range(N) + N_eval = N + + with torch.no_grad(): + for mi in tqdm(test_range, desc="Eval"): + # Using get_mi_src_tgt_all_graph as in table1.py + (src_batch, tgt_batch), consq_n = get_mi_src_tgt_all_graph( + test_ds, mi, 0, 0, device + ) + + # If graph generation failed or empty (though unlikely with processed data), skip + if src_batch is None or tgt_batch is None: + continue + + src_batch = src_batch.to(device) + tgt_batch = tgt_batch.to(device) + + z, hatD = model(src_batch, tgt_batch, consq_n=consq_n) + + out, gt = out_post_fwd( + {"hatD": hatD, "z": z}, + tgt_batch, + ms_dict, + cfg["representation"]["out"], + consq_n, + ) + + mi_metric = compute_metric(metric_key, out, gt) + for key in metric_key: + metric[key] += mi_metric[key].detach().item() + + # Clean up per iteration + del src_batch, tgt_batch, z, hatD, out, gt, mi_metric + + # Log metrics + print(f"Epoch {epoch_cnt} Test Metrics:") + for key in metric_key: + avg_val = metric[key] / N_eval + print(f"{key}: {avg_val:.4f}", end="\t") + if writer: + writer.add_scalar(f"test_metric/{key}", avg_val, epoch_cnt) + print("\n") + + model.train() # Switch back to train mode + torch.cuda.empty_cache() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--exp", type=str, required=True) + parser.add_argument("--cfg", type=str, default="mycfg") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--seed", type=int, default=0) + + args = parser.parse_args() + cfg = file_io.load_cfg(args.cfg) + + ## seed, device, printoptions + import torch + + torch.manual_seed(args.seed) + np.random.seed(args.seed) + tensor_utils.set_device(args.device) + np.set_printoptions(precision=5, suppress=True) + torch.set_printoptions(precision=5, sci_mode=False) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + train_cfg = cfg["train"] + if "copy_orig_contact" in cfg["train"]: + PairedDataset.copy_orig_contact = cfg["train"]["copy_orig_contact"] + + ## Dataset (Training) + data_dir = os.path.join(DATA_DIR, cfg["train_data"]["dir"]) + dl = get_paired_data_loader( + data_dir, + train_cfg["batch_size"], + train_cfg["consq_n"], + shuffle=True, + mask_option=cfg["train_data"]["mask"], + device=args.device, + num_workers=train_cfg.get("num_workers", 0), + ) + + ## Dataset (Testing) - Prepared here but used inside loop + test_ds = None + test_sample_num = -1 + if "test_data" in cfg: + print("Loading Test Dataset for evaluation...") + # Consistent with table1.py + test_ds = PairedDataset(min_motion_lens=8) + test_data_path = os.path.join(DATA_DIR, cfg["test_data"]["dir"]) + test_ds.load_data_dir_pairs(test_data_path) + test_sample_num = cfg["test_data"].get("sample_num", 50) + print(f"Test Dataset Loaded. Will evaluate on first {test_sample_num} samples.") + + ## Model, Optimizer, Scheduler + model = Model(cfg["model"], cfg["representation"]).to(device=args.device) + optimizer = torch.optim.Adam(model.parameters(), lr=train_cfg["learning_rate"]) + scheduler = network_utils.get_scheduler( + optimizer, train_cfg["lr_schedule"], train_cfg["epoch_num"] + ) + + ## Log setup + from torch.utils.tensorboard import SummaryWriter + from datetime import datetime + + save_dir = os.path.join(RESULT_DIR, args.exp) + # add timestamp subfolder under logs to avoid overwriting across multiple runs + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_path = os.path.join(save_dir, "logs", timestamp) + writer = SummaryWriter(log_path) + + with open(os.path.join(log_path, "para.txt"), "w") as para_file: + # add current time + para_file.write("time: {}\n".format(time.asctime())) + # Record command line arguments + para_file.write(" ".join(sys.argv)) + # Record running conda name and pwd + para_file.write("\n") + conda_name = os.environ.get("CONDA_DEFAULT_ENV", "N/A") + para_file.write("conda: {}\n".format(conda_name)) + + para_file.write("pwd: {}\n".format(os.getcwd())) + para_file.write("git hash: {}\n".format(os.popen("git rev-parse HEAD").read().strip())) + + # Save config to timestamped log directory + with open(os.path.join(log_path, "config.yaml"), "w") as f: + yaml.dump(cfg, f) + print("SAVE DIR:", save_dir) + print("LOG DIR:", log_path) + + # copy training ms_dict to model directory (so that it loads correctly during test time) + shutil.copyfile( + os.path.join(data_dir, "ms_dict.pt"), os.path.join(save_dir, "ms_dict.pt") + ) + ms_dict = torch.load(os.path.join(data_dir, "ms_dict.pt")) + + # set SkelPoseGraph class variables + SkelPoseGraph.skel_cfg = cfg["representation"]["skel"] + SkelPoseGraph.pose_cfg = cfg["representation"]["pose"] + SkelPoseGraph.ms_dict = ms_dict + + epoch_init = 0 + if "load" in train_cfg: + epoch_init = load_trainer( + train_cfg["load"], model, optimizer, scheduler, args.device, log_path + ) + + ## debugging + # torch.autograd.set_detect_anomaly(True) + + # Load KL Loss + if "vae_kl" in train_cfg and train_cfg["vae_kl"]["kl_weight"] > 0: + vae_kl_cfg = train_cfg["vae_kl"] + kl_criterion = KL_Loss( + kl_weight=vae_kl_cfg["kl_weight"], + nll_loss_type=vae_kl_cfg["nll_loss_type"], + ).to(device=args.device) + + print("======================= READY TO TRAIN ===================== ") + print(f"Starting from epoch {epoch_init}, training until epoch {train_cfg['epoch_num']}") + ## Train Loop + model.train() # set train mode + for epoch_cnt in tqdm(range(epoch_init, train_cfg["epoch_num"])): + epoch_loss = {loss: 0 for loss in list(train_cfg["loss"].keys()) + ["total"]} + epoch_metric = {metric: 0 for metric in train_cfg["metric"]} + for bi, (src_batch, tgt_batch) in enumerate(dl): + optimizer.zero_grad() + src_batch = src_batch.to(args.device, non_blocking=True) + tgt_batch = tgt_batch.to(args.device, non_blocking=True) + + try: + ## forward + z, hatD = model(src_batch, tgt_batch, consq_n=train_cfg["consq_n"]) + z_posterior = model.encode(tgt_batch, consq_n=train_cfg["consq_n"]) + z_tgt = z_posterior.sample().squeeze(1) + out = {"hatD": hatD, "z": z, "z_tgt": z_tgt} + + out, gt = out_post_fwd( + out, + tgt_batch, + ms_dict, + cfg["representation"]["out"], + train_cfg["consq_n"], + ) + loss = compute_loss(train_cfg["loss"], out, gt) + metric = compute_metric(train_cfg["metric"], out, gt) + + # Add VAE KL Loss + if "vae_kl" in train_cfg: + kl_loss, kl_log = kl_criterion( + inputs=None, + reconstructions=None, + posteriors=z_posterior, + split="train", + ) + loss["total"] += kl_loss + for k, v in kl_log.items(): + loss[k] = v + if k not in epoch_loss: + epoch_loss[k] = 0 + + ## backward + loss["total"].backward() + torch.nn.utils.clip_grad_norm_( + model.parameters(), train_cfg["grad_max_norm"] + ) + optimizer.step() + + ## sanity check / debugging + # for name, param in model.named_parameters(): + # if not param.requires_grad: continue + # elif torch.isnan(param).any() or not torch.isfinite(param).any(): + # print(name, param); embed() + # else: + # grad_norm = param.grad.norm() + # if torch.isnan(grad_norm).any() or not torch.isfinite(grad_norm).any(): + # print(name, param); embed() + + ## log + for k, v in loss.items(): + epoch_loss[k] += tensor_utils.cdn(v) + for k, v in metric.items(): + epoch_metric[k] += tensor_utils.cdn(v) + + del src_batch, tgt_batch, out, loss, metric + except RuntimeError as e: + if "out of memory" in str(e): + print(f"\n[WARNING] CUDA OOM at batch {bi} epoch {epoch_cnt}, skipping this batch...") + print(f"Batch size might be too large for current sequence lengths") + # Clean up + if 'src_batch' in locals(): del src_batch + if 'tgt_batch' in locals(): del tgt_batch + if 'out' in locals(): del out + if 'gt' in locals(): del gt + if 'loss' in locals(): del loss + if 'metric' in locals(): del metric + if 'z' in locals(): del z + if 'hatD' in locals(): del hatD + if 'z_posterior' in locals(): del z_posterior + if 'z_tgt' in locals(): del z_tgt + torch.cuda.empty_cache() + optimizer.zero_grad() + continue + else: + raise e + + ## Write Log + for k, v in epoch_loss.items(): + writer.add_scalar("loss/" + k, v / len(dl), epoch_cnt) + for k, v in epoch_metric.items(): + writer.add_scalar("metric/" + k, v / len(dl), epoch_cnt) + writer.add_scalar("lr", optimizer.param_groups[0]["lr"], epoch_cnt) + + ## Save + if (epoch_cnt % train_cfg["save_per"] == 0) or ( + epoch_cnt + 1 == train_cfg["epoch_num"] + ): + save_state = { + "epoch": epoch_cnt, + "model": model.state_dict(), + "optimizer": optimizer.state_dict(), + "scheduler": scheduler.state_dict(), + } + torch.save( + save_state, os.path.join(save_dir, "model_{}.pt".format(epoch_cnt)) + ) + torch.save(save_state, os.path.join(save_dir, "last_model.pt")) + print("save done: ", epoch_cnt) + + # --- EVALUATION HOOK --- + if test_ds is not None: + run_test_evaluation( + model, test_ds, args.device, cfg, ms_dict, + test_sample_num, writer, epoch_cnt + ) + # ----------------------- + + if scheduler is not None: + scheduler.step() + # gc.collect() + # torch.cuda.empty_cache() + diff --git a/src/sata/utils/__init__.py b/src/sata/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/sata/utils/bvh2joint.py b/src/sata/utils/bvh2joint.py new file mode 100644 index 0000000000000000000000000000000000000000..3ce4bb5d499e96cae926dd311a2ee688363ad09b --- /dev/null +++ b/src/sata/utils/bvh2joint.py @@ -0,0 +1,594 @@ +from fairmotion.data import bvh +from fairmotion.ops import motion as motion_ops +from transformers import T5Tokenizer, T5EncoderModel +import torch +from .bvh2joint_data import joint_map_dict_animo_v1 +import re + +# Mapping indices from BVH joints to SMPL format. +# This index list defines which joints to extract from the BVH skeleton and their order. +bvh2smpl_joint_indices = [0, 1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14, 17, 22, 15, 18, 23, 19, 24, 20, 25] + +def motion_to_joint_positions(motion, joint_indices=None, verbose=False, resample_fps=None): + """ + Extract joint positions from a fairmotion Motion object in the specified index order. + + Args: + motion: fairmotion.core.motion.Motion object + joint_indices: list of int, joint indices to extract; defaults to bvh2smpl_joint_indices + verbose: bool, whether to print detailed information + + Returns: + numpy.ndarray: joint position array with shape (T, J, 3) + T = frame count, J = len(joint_indices), 3 = (x, y, z) + """ + if joint_indices is None: + joint_indices = bvh2smpl_joint_indices + + if resample_fps is not None: + assert type(resample_fps) == int, "resample_fps must be integer" + motion = motion_ops.resample(motion, resample_fps) + + # Get global positions for all joints: (T, num_joints, 3). + all_positions = motion.positions(local=False) + + if verbose: + print(f"Original BVH joint count: {all_positions.shape[1]}") + print("BVH joint names:") + for i, joint in enumerate(motion.skel.joints): + print(f" [{i:2d}] {joint.name}") + + # Extract joint positions in the specified index order. + sampled_positions = all_positions[:, joint_indices, :] + + if verbose: + print(f"\nSampled joint count: {sampled_positions.shape[1]}") + print(f"Output shape: {sampled_positions.shape} (T, J, 3)") + print("\nSampled joint indices and names:") + for i, idx in enumerate(joint_indices): + joint_name = motion.skel.joints[idx].name if idx < len(motion.skel.joints) else "INVALID" + print(f" SMPL[{i:2d}] <- BVH[{idx:2d}] {joint_name}") + + return sampled_positions + + +class TextEncoder: + def __init__(self): + self.tokenizer = T5Tokenizer.from_pretrained("t5-base") + self.encoder = T5EncoderModel.from_pretrained("t5-base") + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.encoder.to(self.device) + self.encoder.eval() + + def encode(self, text, reduce_mean=True): + '''Encode the input text into embeddings. + ''' + inputs = self.tokenizer(text, return_tensors="pt").to(self.device) + with torch.no_grad(): + outputs = self.encoder(**inputs) + if reduce_mean: + return outputs.last_hidden_state.mean(dim=1) + return outputs.last_hidden_state + + +class JointTextProcessor: + def __init__(self): + # ========================================== + # 1. Mode: Clean (tokenize only, remove underscores, keep the original logic) + # ========================================== + self.map_clean = { + "Hips": "Hips", "LowerBack": "Lower Back", + "Spine": "Spine", "Spine1": "Spine 1", "Spine2": "Spine 2", "Spine3": "Spine 3", "Spine4": "Spine 4", + "Neck": "Neck", "Neck1": "Neck 1", + "Head": "Head", "Head_End": "Head End", + + # Left Upper Body + "LeftDummyShoulder": "Left Dummy Shoulder", "LeftShoulder": "Left Shoulder", + "LeftArm": "Left Arm", "LeftForeArm": "Left Fore Arm", + "LeftHand": "Left Hand", "LeftHand_End": "Left Hand End", + + # Left Lower Body + "LeftHipJoint": "Left Hip Joint", "LeftUpLeg": "Left Up Leg", "LeftLeg": "Left Leg", + "LeftFoot": "Left Foot", "LeftToeBase": "Left Toe Base", "LeftToeBase_End": "Left Toe Base End", + "LeftToe": "Left Toe", "LeftToe_End": "Left Toe End", + + # Right Upper Body + "RightDummyShoulder": "Right Dummy Shoulder", "RightShoulder": "Right Shoulder", + "RightArm": "Right Arm", "RightForeArm": "Right Fore Arm", + "RightHand": "Right Hand", "RightHand_End": "Right Hand End", + + # Right Lower Body + "RightHipJoint": "Right Hip Joint", "RightUpLeg": "Right Up Leg", "RightLeg": "Right Leg", + "RightFoot": "Right Foot", "RightToeBase": "Right Toe Base", "RightToeBase_End": "Right Toe Base End", + "RightToe": "Right Toe", "RightToe_End": "Right Toe End" + } + + # ========================================== + # 2. Mode: Anatomical (anatomical semantics for CLIP) + # Core strategy: UpLeg -> Thigh, Leg -> Calf, Shoulder -> Clavicle. + # ========================================== + # self.map_anatomical = # Removed, as it is not modified as descriptive one. + # { + # "Hips": "Pelvis", "LowerBack": "Lower Back", + # "Spine": "Lumbar Spine", "Spine1": "Lower Thoracic Spine", + # "Spine2": "Middle Thoracic Spine", "Spine3": "Upper Thoracic Spine", "Spine4": "Upper Chest", + # "Neck": "Neck Base", "Neck1": "Upper Neck", + # "Head": "Head", "Head_End": "Head Crown", + + # # Left Upper Body + # "LeftDummyShoulder": "Left Scapula", # Treat Dummy as the scapula or an auxiliary root. + # "LeftShoulder": "Left Clavicle", # Shoulder in 3D skeletons is usually the clavicle. + # "LeftArm": "Left Upper Arm", + # "LeftForeArm": "Left Forearm", + # "LeftHand": "Left Hand", "LeftHand_End": "Left Fingers", + + # # Left Lower Body + # "LeftHipJoint": "Left Hip Joint", + # "LeftUpLeg": "Left Thigh", # Key semantic correction. + # "LeftLeg": "Left Calf", # Key semantic correction: Leg means lower leg here. + # "LeftFoot": "Left Foot", + # "LeftToeBase": "Left Toes", # ToeBase usually refers to the entire toe region. + # "LeftToeBase_End": "Left Toe Tip", + # "LeftToe": "Left Big Toe", # A standalone Toe usually means the big toe or toe bone. + # "LeftToe_End": "Left Big Toe Tip", + + # # Right Upper Body + # "RightDummyShoulder": "Right Scapula", + # "RightShoulder": "Right Clavicle", + # "RightArm": "Right Upper Arm", + # "RightForeArm": "Right Forearm", + # "RightHand": "Right Hand", "RightHand_End": "Right Fingers", + + # # Right Lower Body + # "RightHipJoint": "Right Hip Joint", + # "RightUpLeg": "Right Thigh", + # "RightLeg": "Right Calf", + # "RightFoot": "Right Foot", + # "RightToeBase": "Right Toes", + # "RightToeBase_End": "Right Toe Tip", + # "RightToe": "Right Big Toe", + # "RightToe_End": "Right Big Toe Tip" + # } + + # ========================================== + # 3. Mode: Descriptive (structural descriptions recommended for T5/LLM) + # Core strategy: add definite articles and functional descriptions for more context. + # ========================================== + self.map_descriptive = { + # --- Torso Core --- + # Hips is the root node; emphasize that it anchors the pelvis region. + "Hips": "the pelvis and hip root anchor", + + # Separately defined lower back, if present. + "LowerBack": "a lower back bone segment", + + # De-index spine names: regardless of segment index, T5 sees "a spine bone segment". + "Spine": "a spine bone segment", + "Spine1": "a spine bone segment", + "Spine2": "a spine bone segment", + "Spine3": "a spine bone segment", + "Spine4": "a spine bone segment", + + # De-index neck names. + "Neck": "a neck bone segment", + "Neck1": "a neck bone segment", + + # Head. + "Head": "the head", + "Head_End": "the head crown tip", + + # --- Left Upper Body --- + "LeftDummyShoulder": "the left shoulder anchor helper", + + "LeftShoulder": "the left shoulder clavicle bone", + "LeftArm": "the left upper arm bone", + "LeftForeArm": "the left lower arm forearm bone", + "LeftHand": "the left hand", + "LeftHand_End": "the left hand finger tips", + + # --- Left Lower Body --- + # Hip joint connection point. + "LeftHipJoint": "the left hip joint connection", + + "LeftUpLeg": "the left upper leg thigh bone", + "LeftLeg": "the left lower leg calf bone", + "LeftFoot": "the left foot", + + "LeftToeBase": "the left toes base joint", + "LeftToeBase_End": "the left toes tip", + "LeftToe": "the left big toe bone", + "LeftToe_End": "the left big toe tip", + + # --- Right Upper Body --- + "RightDummyShoulder": "the right shoulder anchor helper", + "RightShoulder": "the right shoulder clavicle bone", + "RightArm": "the right upper arm bone", + "RightForeArm": "the right lower arm forearm bone", + "RightHand": "the right hand", + "RightHand_End": "the right hand finger tips", + + # --- Right Lower Body --- + "RightHipJoint": "the right hip joint connection", + "RightUpLeg": "the right upper leg thigh bone", + "RightLeg": "the right lower leg calf bone", + "RightFoot": "the right foot", + + "RightToeBase": "the right toes base joint", + "RightToeBase_End": "the right toes tip", + "RightToe": "the right big toe bone", + "RightToe_End": "the right big toe tip" + } + + def get_text(self, joint_name: str, mode: str = 'anatomical') -> str: + """ + Get the text representation of a joint for the specified mode. + + Args: + joint_name (str): original joint name, e.g. 'LeftUpLeg' + mode (str): 'clean', 'anatomical', or 'descriptive' + + Returns: + str: processed text + + Raises: + KeyError: if the joint mapping is missing in the specified mode + """ + # 1. Select the mapping table. + mapping = None + if mode == 'clean': + mapping = self.map_clean + elif mode == 'anatomical': + mapping = self.map_anatomical + elif mode == 'descriptive': + mapping = self.map_descriptive + else: + raise ValueError("Mode must be one of: 'clean', 'anatomical', 'descriptive'") + + # 2. Get text; if a mode-specific mapping is missing, fail early. + if joint_name in mapping: + return mapping[joint_name] + else: + # Fallback strategy: for unknown joints, try simple underscore removal. + raise KeyError(f"Joint '{joint_name}' not found in {mode} mode mapping") + +class AnimalJointProcessor: + def __init__(self): + # Base component mappings; keys are core terms after removing prefix, suffix, and side markers. + + # 1. Clean Mode Map (keep original naming logic and remove underscores) + self.base_map_clean = { + "root_joint": "Root", "anus_joint": "Anus", "hips_joint": "Hips", + "spine1_joint": "Spine 1", "spine2_joint": "Spine 2", + "spine3_joint": "Spine 3", "spine_2_joint": "Spine 2 Extra", + "chest_joint": "Chest", + "neck0_joint": "Neck 0", "neck1_joint": "Neck 1", "neck2_joint": "Neck 2", + "neck3_joint": "Neck 3", "neck4_joint": "Neck 4", + "head_joint": "Head", "jaw_joint": "Jaw", + "tail1_joint": "Tail 1", "tail2_joint": "Tail 2", + "clavicle_joint": "Clavicle", "eye_joint": "Eye", + + # Forelimbs + "frontLegUpr_joint": "Front Leg Upper", + "frontLegUprAllTwist_joint": "Front Leg Upper Twist", + "frontLegLwr_joint": "Front Leg Lower", + "frontLegLwrAllTwist_joint": "Front Leg Lower Twist", + "frontHorselink_joint": "Front Horselink", + "frontFoot_joint": "Front Foot", + + # Hindlimbs + "rearLegUpr_joint": "Rear Leg Upper", + "rearLegUprAllTwist_joint": "Rear Leg Upper Twist", + "rearLegLwr_joint": "Rear Leg Lower", + "rearLegLwrAllTwist_joint": "Rear Leg Lower Twist", + "rearHorselink_joint": "Rear Horselink", + "rearFoot_joint": "Rear Foot" + } + + # 2. Anatomical Mode Map (convert to anatomical/medical terms, CLIP-friendly) + self.base_map_anatomical = { + "root_joint": "Body Center", "anus_joint": "Tail Base Underside", + "hips_joint": "Pelvis", + "spine1_joint": "Lumbar Spine", "spine2_joint": "Thoracic Spine", + "spine3_joint": "Ribcage Spine", "spine_2_joint": "Upper Thoracic Spine", + "chest_joint": "Sternum", + "neck0_joint": "Neck Base", "neck1_joint": "Lower Neck", "neck2_joint": "Middle Neck", + "neck3_joint": "Upper Neck", "neck4_joint": "Head Base", + "head_joint": "Skull", "jaw_joint": "Mandible", + "tail1_joint": "Tail Root", "tail2_joint": "Tail Middle", + "clavicle_joint": "Scapula", "eye_joint": "Eyeball", + + # Forelimb + "frontLegUpr_joint": "Upper Foreleg", + "frontLegUprAllTwist_joint": "Upper Foreleg Muscles", + "frontLegLwr_joint": "Forearm", + "frontLegLwrAllTwist_joint": "Forearm Muscles", + "frontHorselink_joint": "Front Pastern", # Pastern for quadrupeds. + "frontFoot_joint": "Front Hoof", + + # Hindlimb + "rearLegUpr_joint": "Thigh", + "rearLegUprAllTwist_joint": "Thigh Muscles", + "rearLegLwr_joint": "Shin", # or Tibia + "rearLegLwrAllTwist_joint": "Calf Muscles", + "rearHorselink_joint": "Rear Pastern", + "rearFoot_joint": "Rear Hoof" + } + + # 3. Descriptive Mode Map (natural-language sentences, T5-friendly) + self.base_map_descriptive = { + "root_joint": "The center of gravity of the body", + "anus_joint": "The area beneath the tail base", + "hips_joint": "The hip and pelvic girdle", + "spine1_joint": "The lower back spine", + "spine2_joint": "The middle spine section", + "spine3_joint": "The upper spine near the ribs", + "spine_2_joint": "The connection between chest and neck", + "chest_joint": "The chest bone", + "neck0_joint": "The base of the neck", + "neck1_joint": "The lower section of the neck", + "neck2_joint": "The middle section of the neck", + "neck3_joint": "The upper section of the neck", + "neck4_joint": "The top of the neck connecting to the head", + "head_joint": "The head", + "jaw_joint": "The lower jaw", + "tail1_joint": "The start of the tail", + "tail2_joint": "The middle section of the tail", + "clavicle_joint": "The shoulder blade", + "eye_joint": "The eye", + + # Forelimbs + "frontLegUpr_joint": "The upper bone of the front leg", + "frontLegUprAllTwist_joint": "The twisting muscles of the front upper leg", + "frontLegLwr_joint": "The lower bone of the front leg", + "frontLegLwrAllTwist_joint": "The twisting muscles of the front lower leg", + "frontHorselink_joint": "The ankle joint of the front leg", + "frontFoot_joint": "The front foot", + + # Hindlimbs + "rearLegUpr_joint": "The rear thigh bone", + "rearLegUprAllTwist_joint": "The twisting muscles of the rear thigh", + "rearLegLwr_joint": "The rear shin bone", + "rearLegLwrAllTwist_joint": "The twisting muscles of the rear shin", + "rearHorselink_joint": "The ankle joint of the rear leg", + "rearFoot_joint": "The rear foot" + } + + def get_text(self, raw_name: str, mode: str = 'descriptive') -> str: + """ + Process bone names with .L/.R and _End suffixes; supports three modes. + Parsing order: + 1. Detect and remove _End, setting is_end. + 2. Detect and remove .L/.R, setting side. + 3. Remove the def_c_ or def_ prefix. + 4. Look up the mapping. + 5. Reassemble text, adjusting word order based on is_end and side. + """ + is_end = False + side_text = "" + core_name = raw_name.strip() + + # 1. Handle the _End suffix. + if core_name.endswith("_End"): + is_end = True + core_name = core_name[:-4] # Remove "_End" + + # 2. Handle side suffixes (.L / .R). + if core_name.endswith(".L"): + side_text = "Left" + core_name = core_name[:-2] + elif core_name.endswith(".R"): + side_text = "Right" + core_name = core_name[:-2] + + # 3. Handle prefixes; def_c_ takes precedence over def_. + if core_name.startswith("def_c_"): + core_name = core_name[6:] + elif core_name.startswith("def_"): + core_name = core_name[4:] + + # 4. Get the base mapping. + mapped_text = "" + if mode == 'clean': + if core_name not in self.base_map_clean: + raise KeyError(f"Joint '{core_name}' not found in clean mode mapping") + mapped_text = self.base_map_clean.get(core_name, core_name) + elif mode == 'anatomical': + if core_name not in self.base_map_anatomical: + raise KeyError(f"Joint '{core_name}' not found in anatomical mode mapping") + mapped_text = self.base_map_anatomical.get(core_name, core_name) + elif mode == 'descriptive': + if core_name not in self.base_map_descriptive: + raise KeyError(f"Joint '{core_name}' not found in descriptive mode mapping") + mapped_text = self.base_map_descriptive.get(core_name, f"The {core_name}") + else: + raise ValueError("Mode must be 'clean', 'anatomical', or 'descriptive'") + + # 5. Final assembly, adjusted by mode and flags. + final_text = mapped_text + + # --- Clean Mode --- + if mode == 'clean': + # Format: "Left Front Foot End" + if side_text: + final_text = f"{side_text} {final_text}" + if is_end: + final_text = f"{final_text} End" + + # --- Anatomical Mode (CLIP) --- + elif mode == 'anatomical': + # Format: "Left Front Hoof Tip"; Tip is more natural than End. + if side_text: + final_text = f"{side_text} {final_text}" + if is_end: + final_text = f"{final_text} Tip" + + # --- Descriptive Mode (T5) --- + elif mode == 'descriptive': + # Format: "The tip of the left front foot" + # Remove the leading "The " from mapped_text for sentence reconstruction. + content_text = mapped_text + if content_text.lower().startswith("the "): + content_text = content_text[4:] + + # Build components. + prefix_part = "The" + if is_end: + prefix_part = "The tip of the" + elif mapped_text.lower().startswith("the "): + prefix_part = "The" # Keep as-is. + + # Combine side. + if side_text: + final_text = f"{prefix_part} {side_text.lower()} {content_text}" + else: + # If there is no side but there is an End marker, e.g. "The tip of the tail". + if is_end: + final_text = f"{prefix_part} {content_text}" + else: + final_text = mapped_text # Keep the original dictionary description. + + return final_text + + +class AnimalJointProcessorSimple: + def __init__(self): + # Precompile regex rules; order matters, with more specific rules first. + self.rules = [ + # 1. Torso core with de-indexing strategy. + (r"spine\d*", "Spine Segment"), # Treat spine1, spine2, etc. as Spine Segment. + (r"neck\d*", "Neck Segment"), # Treat neck0 through neck6 as Neck Segment. + (r"tail\d*", "Tail Segment"), # Treat tail1, etc. as Tail Segment. + + # 2. Key body-part mappings. + (r"hips", "Hips Pelvis"), + (r"root", "Root Joint"), + (r"chest", "Chest Ribcage"), + (r"clavicle", "Shoulder Clavicle"), + (r"anus", "Tail Root"), # Topologically, anus usually corresponds to the tail root. + (r"jaw", "Jaw"), + (r"head", "Head"), + (r"eye", "Eye"), + + # 3. Limb handling, distinguishing front/rear and upper/lower. + # Twist bone handling: keep Twist semantics and indicate it is an auxiliary bone. + (r"front.*Twist", "Front Leg Twist Bone"), + (r"rear.*Twist", "Rear Leg Twist Bone"), + + # Horselink handling: generalize as a leg linkage joint. + (r"horselink", "Leg Linkage Joint"), + + # Standard limbs. + (r"frontLegUpr", "Front Upper Leg"), # Front upper leg / humerus. + (r"frontLegLwr", "Front Lower Leg"), # Front lower leg / radius. + (r"frontFoot", "Front Foot"), + + (r"rearLegUpr", "Rear Upper Leg"), # Rear upper leg / femur. + (r"rearLegLwr", "Rear Lower Leg"), # Rear lower leg / tibia. + (r"rearFoot", "Rear Foot"), + ] + self.has_raised_mode_warning = False + + def get_text(self, raw_name: str, mode = None) -> str: + """ + Convert raw_name, e.g. 'def_c_spine1_joint', to a natural-language description. + """ + if not self.has_raised_mode_warning and mode is not None: + print("Warning: AnimalJointProcessorSimple does not support 'mode' parameter. Ignoring it.") + self.has_raised_mode_warning = True + + # 1. Basic cleanup: remove def_c_ and def_ prefixes and _joint and _End suffixes. + clean_name = raw_name.replace("def_c_", "").replace("def_", "") + clean_name = clean_name.replace("_joint", "").replace("_End", " Tip") + + # 2. Extract left/right side markers (.L / .R). + side_prefix = "" + if ".L" in clean_name: + side_prefix = "Left " + clean_name = clean_name.replace(".L", "") + elif ".R" in clean_name: + side_prefix = "Right " + clean_name = clean_name.replace(".R", "") + + # 3. Regex-based semantic matching. + semantic_name = clean_name # Keep the original name by default. + for pattern, replacement in self.rules: + if re.search(pattern, clean_name, re.IGNORECASE): + semantic_name = replacement + break + + # 4. Compose the final description. + # If this is a Tip (End node), append it at the end. + is_tip = "Tip" in clean_name + final_text = f"{side_prefix}{semantic_name}" + + if is_tip and "Tip" not in final_text: + final_text += " Tip" + + # 5. To lower case and add 'The' + final_text = f"The {final_text.lower()}" + + return final_text + +class AnimalJointProcessorSimpleFast: + """ + Fast animal joint name processor that directly looks up a predefined mapping dictionary. + Faster than AnimalJointProcessorSimple because it avoids regex matching. + """ + + def __init__(self): + # Use the predefined mapping dictionary directly. + self.joint_map = joint_map_dict_animo_v1 + self.has_raised_mode_warning = False + + def get_text(self, raw_name: str, mode = None) -> str: + """ + Convert the raw joint name to a natural-language description. + + Args: + raw_name: original joint name, e.g. 'def_c_spine1_joint' + + Returns: + str: natural-language description, e.g. 'The spine segment' + + Raises: + KeyError: if the joint name is not in the mapping dictionary + """ + if not self.has_raised_mode_warning and mode is not None: + print("Warning: AnimalJointProcessorSimpleFast does not support 'mode' parameter. Ignoring it.") + self.has_raised_mode_warning = True + + if raw_name not in self.joint_map: + raise KeyError(f"Joint '{raw_name}' not found in joint_map_dict_animo_v1") + + mapped_text = self.joint_map[raw_name] + # Convert to lowercase and add the 'The' prefix to match AnimalJointProcessorSimple. + return f"The {mapped_text.lower()}" + + def process_safe(self, raw_name: str, default: str = "Unknown Joint") -> str: + """ + Safe process variant that returns the default value when no mapping is found. + + Args: + raw_name: original joint name + default: value returned when no mapping is found + + Returns: + str: natural-language description or default value + """ + if raw_name in self.joint_map: + return f"The {self.joint_map[raw_name].lower()}" + return f"The {default.lower()}" + + def get_raw_mapping(self, raw_name: str) -> str: + """ + Get the raw mapping value without adding the 'The' prefix or lowercasing. + + Args: + raw_name: original joint name + + Returns: + str: raw value from the mapping dictionary + """ + if raw_name not in self.joint_map: + raise KeyError(f"Joint '{raw_name}' not found in joint_map_dict_animo_v1") + return self.joint_map[raw_name] \ No newline at end of file diff --git a/src/sata/utils/bvh2joint_data.py b/src/sata/utils/bvh2joint_data.py new file mode 100644 index 0000000000000000000000000000000000000000..9c57a338241ce7f5e643d69be88474afab080053 --- /dev/null +++ b/src/sata/utils/bvh2joint_data.py @@ -0,0 +1,89 @@ +joint_list_animo_v1 = [ + "def_c_anus_joint", "def_c_anus_joint_End", "def_c_chest_joint", "def_c_head_joint", + "def_c_hips_joint", "def_c_jaw_joint", "def_c_jaw_joint_End", "def_c_neck0_joint", + "def_c_neck1_joint", "def_c_neck2_joint", "def_c_neck3_joint", "def_c_neck4_joint", + "def_c_neck5_joint", "def_c_neck6_joint", "def_c_root_joint", "def_c_spine1_joint", + "def_c_spine2_joint", "def_c_spine3_joint", "def_c_spine4_joint", "def_c_spine5_joint", + "def_c_spine6_joint", "def_c_spine8_joint", "def_c_spine_2_joint", "def_c_tail1_joint", + "def_c_tail2_joint", "def_c_tail2_joint_End", "def_clavicle_joint.L", "def_clavicle_joint.R", + "def_eye_joint.L", "def_eye_joint.L_End", "def_eye_joint.R", "def_eye_joint.R_End", + "def_frontFoot_joint.L", "def_frontFoot_joint.L_End", "def_frontFoot_joint.R", "def_frontFoot_joint.R_End", + "def_frontHorselink_joint.L", "def_frontHorselink_joint.R", "def_frontLegLwrAllTwist_joint.L", + "def_frontLegLwrAllTwist_joint.L_End", "def_frontLegLwrAllTwist_joint.R", "def_frontLegLwrAllTwist_joint.R_End", + "def_frontLegLwr_joint.L", "def_frontLegLwr_joint.R", "def_frontLegUpr_joint.L", "def_frontLegUpr_joint.R", + "def_rearFoot_joint.L", "def_rearFoot_joint.L_End", "def_rearFoot_joint.R", "def_rearFoot_joint.R_End", + "def_rearHorselink_joint.L", "def_rearHorselink_joint.R", "def_rearLegLwrAllTwist_joint.L", + "def_rearLegLwrAllTwist_joint.L_End", "def_rearLegLwrAllTwist_joint.R", "def_rearLegLwrAllTwist_joint.R_End", + "def_rearLegLwr_joint.L", "def_rearLegLwr_joint.R", "def_rearLegUprAllTwist_joint.L", + "def_rearLegUprAllTwist_joint.L_End", "def_rearLegUprAllTwist_joint.R", "def_rearLegUprAllTwist_joint.R_End", + "def_rearLegUpr_joint.L", "def_rearLegUpr_joint.R", "def_rearhorselink_joint.L", "def_rearhorselink_joint.R" +] + +joint_map_dict_animo_v1 = { +'def_c_anus_joint': 'Tail Root', +'def_c_anus_joint_End': 'Tail Root Tip', +'def_c_chest_joint': 'Chest Ribcage', +'def_c_head_joint': 'Head', +'def_c_hips_joint': 'Hips Pelvis', +'def_c_jaw_joint': 'Jaw', +'def_c_jaw_joint_End': 'Jaw Tip', +'def_c_neck0_joint': 'Neck Segment', +'def_c_neck1_joint': 'Neck Segment', +'def_c_neck2_joint': 'Neck Segment', +'def_c_neck3_joint': 'Neck Segment', +'def_c_neck4_joint': 'Neck Segment', +'def_c_neck5_joint': 'Neck Segment', +'def_c_neck6_joint': 'Neck Segment', +'def_c_root_joint': 'Root Joint', +'def_c_spine1_joint': 'Spine Segment', +'def_c_spine2_joint': 'Spine Segment', +'def_c_spine3_joint': 'Spine Segment', +'def_c_spine4_joint': 'Spine Segment', +'def_c_spine5_joint': 'Spine Segment', +'def_c_spine6_joint': 'Spine Segment', +'def_c_spine8_joint': 'Spine Segment', +'def_c_spine_2_joint': 'Spine Segment', +'def_c_tail1_joint': 'Tail Segment', +'def_c_tail2_joint': 'Tail Segment', +'def_c_tail2_joint_End': 'Tail Segment Tip', +'def_clavicle_joint.L': 'Left Shoulder Clavicle', +'def_clavicle_joint.R': 'Right Shoulder Clavicle', +'def_eye_joint.L': 'Left Eye', +'def_eye_joint.L_End': 'Left Eye Tip', +'def_eye_joint.R': 'Right Eye', +'def_eye_joint.R_End': 'Right Eye Tip', +'def_frontFoot_joint.L': 'Left Front Foot', +'def_frontFoot_joint.L_End': 'Left Front Foot Tip', +'def_frontFoot_joint.R': 'Right Front Foot', +'def_frontFoot_joint.R_End': 'Right Front Foot Tip', +'def_frontHorselink_joint.L': 'Left Leg Linkage Joint', +'def_frontHorselink_joint.R': 'Right Leg Linkage Joint', +'def_frontLegLwrAllTwist_joint.L': 'Left Front Leg Twist Bone', +'def_frontLegLwrAllTwist_joint.L_End': 'Left Front Leg Twist Bone Tip', +'def_frontLegLwrAllTwist_joint.R': 'Right Front Leg Twist Bone', +'def_frontLegLwrAllTwist_joint.R_End': 'Right Front Leg Twist Bone Tip', +'def_frontLegLwr_joint.L': 'Left Front Lower Leg', +'def_frontLegLwr_joint.R': 'Right Front Lower Leg', +'def_frontLegUpr_joint.L': 'Left Front Upper Leg', +'def_frontLegUpr_joint.R': 'Right Front Upper Leg', +'def_rearFoot_joint.L': 'Left Rear Foot', +'def_rearFoot_joint.L_End': 'Left Rear Foot Tip', +'def_rearFoot_joint.R': 'Right Rear Foot', +'def_rearFoot_joint.R_End': 'Right Rear Foot Tip', +'def_rearHorselink_joint.L': 'Left Leg Linkage Joint', +'def_rearHorselink_joint.R': 'Right Leg Linkage Joint', +'def_rearLegLwrAllTwist_joint.L': 'Left Rear Leg Twist Bone', +'def_rearLegLwrAllTwist_joint.L_End': 'Left Rear Leg Twist Bone Tip', +'def_rearLegLwrAllTwist_joint.R': 'Right Rear Leg Twist Bone', +'def_rearLegLwrAllTwist_joint.R_End': 'Right Rear Leg Twist Bone Tip', +'def_rearLegLwr_joint.L': 'Left Rear Lower Leg', +'def_rearLegLwr_joint.R': 'Right Rear Lower Leg', +'def_rearLegUprAllTwist_joint.L': 'Left Rear Leg Twist Bone', +'def_rearLegUprAllTwist_joint.L_End': 'Left Rear Leg Twist Bone Tip', +'def_rearLegUprAllTwist_joint.R': 'Right Rear Leg Twist Bone', +'def_rearLegUprAllTwist_joint.R_End': 'Right Rear Leg Twist Bone Tip', +'def_rearLegUpr_joint.L': 'Left Rear Upper Leg', +'def_rearLegUpr_joint.R': 'Right Rear Upper Leg', +'def_rearhorselink_joint.L': 'Left Leg Linkage Joint', +'def_rearhorselink_joint.R': 'Right Leg Linkage Joint' +} \ No newline at end of file diff --git a/src/sata/utils/data_utils.py b/src/sata/utils/data_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..095c4b763c33c3e0385245a13e498dc21f450dc4 --- /dev/null +++ b/src/sata/utils/data_utils.py @@ -0,0 +1,72 @@ +import copy +import numpy as np + + +def safe_normalize_to_one(np_vec, eps=1e-4): + vec_norm = np.linalg.norm(np_vec) + if vec_norm > eps: + return np_vec / vec_norm + else: + return np_vec + + +def safe_normalize(data, axis=0, ignore_std=1e-4): + mean, std = data.mean(axis=axis), data.std(axis=axis) + for i in range(len(std)): + if std[i] < ignore_std: + std[i] = 1.0 + return (data - mean) / std, (mean, std) + + +def safe_normalize_pre_stat(data, mean, std, ignore_std=1e-4): + for i in range(len(std)): + if std[i] < ignore_std: + std[i] = 1.0 + return (data - mean) / std + + +def gather_safe_normalize(data, axis=-1, ignore_std=1e-4, real=None): + """ + safe normalize data of shape [A, B, C, D, E] (for example) with axis = 2 + it means, to squeeze all axis execpt 2, get safe_mean_std, and then reshape data back to its original data + real must have shape of [A,B,D,E] in this case. + """ + + data_gathered_by_axis = copy.deepcopy(data) + dim = data.shape[axis] + + # (if axis != -1) : before flattening except target axis, first transpose target axis with the last axis + if axis != -1: + transpose_order = list(range(len(data.shape))) + transpose_order[-1] = axis + transpose_order[axis] = -1 + data_gathered_by_axis = np.transpose(data_gathered_by_axis, transpose_order) + + data_reordered_dim = data_gathered_by_axis.shape + data_gathered_by_axis = data_gathered_by_axis.reshape(-1, dim) + + # filter real only if needed + if real is not None: + assert data_reordered_dim[:-1] == real.shape + real_flatten = real.flatten() + data_gathered_by_axis_real_only = data_gathered_by_axis[real_flatten] + else: + data_gathered_by_axis_real_only = data_gathered_by_axis + + # get mean,std using flattened, filtered data + mean, std = data_gathered_by_axis_real_only.mean( + axis=0 + ), data_gathered_by_axis_real_only.std(axis=0) + for i in range(len(std)): + if std[i] < ignore_std: + std[i] = 1.0 + + # normalize flattened (not filtered: in order to preserve the shape when reshaping back) data + data_gathered_by_axis = (data_gathered_by_axis - mean) / std + + # reshape back + data_reshape_back = data_gathered_by_axis.reshape(data_reordered_dim) + if axis != -1: + data_reshape_back = np.transpose(data_reshape_back, transpose_order) + + return data_reshape_back, (mean, std) diff --git a/src/sata/utils/etc_utils.py b/src/sata/utils/etc_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..0e5b62c7d4593f345c752d0a8b11c59a5d7a0394 --- /dev/null +++ b/src/sata/utils/etc_utils.py @@ -0,0 +1,108 @@ +import numpy as np +import torch + + +def argmin_nd(a): + return np.unravel_index(np.argmin(a, axis=None), a.shape) + + +def argmax_nd(a): + return np.unravel_index(np.argmax(a, axis=None), a.shape) + + +def argsort_nd(x): + return np.unravel_index(np.argsort(x, axis=None), x.shape) + + +""" recursive dict """ + + +def is_valid_rec_keys(recursive_dict, keys): + if recursive_dict is None: + return False + + dict_i = recursive_dict + for key in keys: + if key in dict_i.keys(): + dict_i = dict_i[key] + else: + return False + return True # dict_i + + +def get_recursive_keys_value(recursive_dict, keys): + dict_i = recursive_dict + try: + for key in keys: + dict_i = dict_i[key] + except: + assert False, f"Error in get_recursive_keys_value: {keys}" + return dict_i + + +def add_rec_key_value(recursive_dict, keys, value): + dict_i = recursive_dict + for key in keys[:-1]: + if key not in dict_i.keys(): + dict_i[key] = dict() + dict_i = dict_i[key] + dict_i[keys[-1]] = value + + +def recursive_print_dict(data, indent=0): + for k, v in data.items(): + if torch.is_tensor(v): + print(" " * (indent), k, "\t", v.shape, "\t", v.device) + elif isinstance(v, np.ndarray): + print(" " * (indent), k, "\t", v.shape) + elif isinstance(v, dict): + print( + " " * indent, + k, + "\t", + ) + recursive_print_dict(v, indent + 1) + else: + print(" " * (indent), k, "\t", v) + + +def set_default_if_absent(dict_i, key, default_value): + if key not in dict_i: + dict_i[key] = default_value + + +# compute instance size +import sys + + +def get_tensor_size(tensor): + return tensor.element_size() * tensor.numel() + + +# dataclass +def get_dataclass_size(dc): + total_size = sys.getsizeof(dc) # Basic size of the dataclass instance + for field in dc.__dataclass_fields__.values(): + attr = getattr(dc, field.name) + if isinstance(attr, torch.Tensor): + total_size += get_tensor_size(attr) + else: + total_size += sys.getsizeof(attr) + return total_size + + +def get_torch_geometric_data_size(data): + # Estimate the size of the Data object + # # Example data + # from torch_geometric.data import Data + # x = torch.randn(10, 3) # 10 nodes with 3 features each + # edge_index = torch.randint(0, 10, (2, 30)) # 30 edges + # data = Data(x=x, edge_index=edge_index) + + # Basic object overhead + data_size = sys.getsizeof(data) + # Adding up sizes of all attributes stored as tensors + for key, item in data: + if torch.is_tensor(item): + data_size += get_tensor_size(item) # Add the size of each tensor + return data_size diff --git a/src/sata/utils/file_io.py b/src/sata/utils/file_io.py new file mode 100644 index 0000000000000000000000000000000000000000..464b56f7ec48e6e4b3c37165fec96dce52f2cad1 --- /dev/null +++ b/src/sata/utils/file_io.py @@ -0,0 +1,241 @@ +"""File input / output.""" + +import os +import yaml +from typing import Dict +from sata.mypath import * + + +def get_config_path(cfg_name): + return os.path.join(CFG_DIR, cfg_name + ".yml") + + +def load_yaml_file(path) -> Dict: + with open(path) as f: + d = yaml.load(f, Loader=yaml.SafeLoader) + return d + + +def is_valid_cfg(cfg, key_list): + cur_cfg = cfg + for key in key_list: + if key in cur_cfg: + cur_cfg = cur_cfg[key] + else: + return False + return True + + +def fillin_default_value(obj, var_name, var_default): + if not hasattr(obj, var_name): + setattr(obj, var_name, var_default) + + +def filllin_missing_value(cfg, key_list, default_val): + if is_valid_cfg(cfg, key_list): + return + + cur_cfg = cfg + for i, key in enumerate(key_list): + if key in cfg: + cur_cfg = cur_cfg[key] + elif i + 1 == len(key_list): + cur_cfg[key] = default_val + else: + cur_cfg[key] = dict() + cur_cfg = cur_cfg[key] + + +def nested_fillin_missing(cfg, default_cfg): + """Updates a nested dictionary `cfg` with new values `default_cfg` if the key is missing""" + for k, v in default_cfg.items(): + if isinstance(v, dict): + cfg[k] = nested_fillin_missing(cfg.get(k, {}), v) + elif k not in cfg: + cfg[k] = v + return cfg + + +def update_yaml_None(config_dict): + for key in config_dict: + if config_dict[key] == "None": + config_dict[key] = None + if type(config_dict[key]) is dict: + update_yaml_None(config_dict[key]) + + +def load_cfg(cfg_name): + config = load_yaml_file(get_config_path(cfg_name)) + update_yaml_None(config) + return config + +def load_cfg_abs(cfg_path): + config = load_yaml_file(cfg_path) + update_yaml_None(config) + return config + + +def fillin_default(cfg): + def_cfg = load_cfg("superset_default") + nested_fillin_missing(cfg, def_cfg) + return cfg + + +def get_cfg(cfg, key_list): + if not is_valid_cfg(cfg, key_list): + return None + + cur_cfg = cfg + for key in key_list: + cur_cfg = cur_cfg[key] + return cur_cfg + + +def set_cfg_recursive(cfg, key_list, val): + if len(key_list) == 0: + return + key = key_list.pop(0) + if len(key_list) == 0: + cfg[key] = val + else: + set_cfg_recursive(cfg.get(key, {}), key_list, val) + + +def load_model_cfg(load_model): + model_dir = os.path.join(RESULT_DIR, load_model) + config_path = os.path.join(model_dir, "config.yaml") + with open(config_path) as f: + config = yaml.load(f, Loader=yaml.SafeLoader) + update_yaml_None(config) + return config + + +def create_dir_if_not_exists(file_path): + dir = os.path.dirname(file_path) + if not os.path.exists(dir): + os.makedirs(dir) + + +def uniquify_log_dir(log_dir_in) -> str: + log_dir_out = log_dir_in + if os.path.exists(log_dir_out): + counter = 0 + while os.path.exists(log_dir_out): + log_dir_out = log_dir_in + "_" + str(counter) + counter += 1 + print( + f"FileIO: since folder {log_dir_in} already exist, changed to {log_dir_out}." + ) + return log_dir_out + + +def get_unique_filepath(folder, postfix): + """create filename based on what files already exist in folder (don't overwrite).""" + name = os.path.join(folder, "{:02d}_" + postfix) + counter = 0 + while os.path.isfile(name.format(counter)): + counter += 1 + return name.format(counter) + + +def get_filepath(folder, postfix, counter=0): + return os.path.join(folder, "{:02d}_" + postfix).format(counter) + + +def get_all_files(directory, ending: str): + """Returns list of all file paths with specific ending e.g. glb. also in subdirectories.""" + all_files = [] + for root, subdirs, files in os.walk(directory): + files.sort() + for name in files: + if name.endswith(ending): + all_files.append(os.path.join(root, name)) + + if len(all_files) == 0: + raise ValueError(f"No files in directory: {directory}") + return all_files + + +def override_by_args(config, args): + args_cfg = {key: val for key, val in vars(args).items() if val is not None} + config.update(args_cfg) + + +# def parser_add_def_args(parser): +# def_cfg = load_cfg('superset_default') +# parser_recursive_def_args(parser, def_cfg, '') +# def parser_recursive_def_args(parser, cfg, prefix): +# for key, val in cfg.items(): +# if isinstance(val, dict): +# parser_recursive_def_args(parser, val, prefix+key+"/") +# else: +# from IPython import embed; embed() +# parser.add_argument('--'+prefix+key, type=type(val), default='1') +# cfg[key] = val + + +# (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. +# import json +# import pickle +# import logging +# from pathlib import Path + +# def load_config(cfg_name): +# """Creates a single config dictionary, possibly composed of multiple yaml files.""" +# cfg_path = get_config_path(cfg_name) +# cfg = load_yaml_file(cfg_path) +# cfg_expanded = copy.deepcopy(cfg) +# expand_yaml_string_with_dict(cfg, cfg_expanded) +# cfg_out = update_nested_dict(cfg_expanded, cfg) +# remove_yaml_key(cfg_out) +# return cfg_out + +# def expand_yaml_string_with_dict(cfg, cfg_expanded): +# """ +# Searches for strings that end in .yaml and replaces that +# key with a dictionary generated from the yaml file. +# """ +# for key, value in cfg.items(): +# if isinstance(value, str): +# if value.endswith(".yaml"): +# cfg_yaml = load_yaml_file(get_config_path(f"partials/{value}")) # set dictionary as just the yaml file. +# cfg_expanded.update(cfg_yaml) + +# if isinstance(value, dict): +# expand_yaml_string_with_dict(cfg[key], cfg_expanded[key]) + +# def update_nested_dict(d, u): +# """Updates a nested dictionary d with new values u.""" +# for k, v in u.items(): +# if isinstance(v, dict): +# d[k] = update_nested_dict(d.get(k, {}), v) +# else: +# d[k] = v +# return d + +# def remove_yaml_key(d): +# for k, v in d.items(): +# if k == "_default": +# del d[k] + +# def load_training_cfg(trial_folder): +# """Loads config that has already been used to train a policy.""" +# cfg_path = os.path.join(trial_folder, "config.pkl") +# with open(cfg_path, "rb") as f: +# cfg = pickle.load(f) +# logging.debug(f"Config:\n {json.dumps(cfg, indent=4)}") +# return cfg + +# def get_latest_model_path(trial_folder, iteration=None): +# try: +# latest_model = [x for x in sorted(os.listdir(trial_folder)) if x.startswith("model")][-1] +# except IndexError: +# logging.error(f"No pytorch model saved in dir {trial_folder}.") +# raise +# model = latest_model if iteration is None else "model_{:06d}.pt".format(iteration) +# path = trial_folder + "/" + model +# return path + +# def get_full_paths(trial_folder, motion_clips, type): +# """type is either "sim" or "ref" """ +# return [trial_folder + "log_" + clip + "_" + type + ".mmo" for clip in motion_clips] diff --git a/src/sata/utils/fixseed.py b/src/sata/utils/fixseed.py new file mode 100644 index 0000000000000000000000000000000000000000..8b7ce63270961a0d19da1ca8c28d10ad0774b442 --- /dev/null +++ b/src/sata/utils/fixseed.py @@ -0,0 +1,19 @@ +import numpy as np +import torch +import random + + +def fixseed(seed): + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + +# SEED = 10 +# EVALSEED = 0 +# # Provoc warning: not fully functionnal yet +# # torch.set_deterministic(True) +# torch.backends.cudnn.benchmark = False +# fixseed(SEED) diff --git a/src/sata/utils/humanml_paramUtil.py b/src/sata/utils/humanml_paramUtil.py new file mode 100644 index 0000000000000000000000000000000000000000..7433b6a91dee79ca2aa3b9f8d73eabb99a9a0216 --- /dev/null +++ b/src/sata/utils/humanml_paramUtil.py @@ -0,0 +1,83 @@ +import numpy as np + +# Define a kinematic tree for the skeletal struture +kit_kinematic_chain = [[0, 11, 12, 13, 14, 15], [0, 16, 17, 18, 19, 20], [0, 1, 2, 3, 4], [3, 5, 6, 7], [3, 8, 9, 10]] + +kit_raw_offsets = np.array( + [ + [0, 0, 0], + [0, 1, 0], + [0, 1, 0], + [0, 1, 0], + [0, 1, 0], + [1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [-1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [0, 0, 1], + [0, 0, 1], + [-1, 0, 0], + [0, -1, 0], + [0, -1, 0], + [0, 0, 1], + [0, 0, 1] + ] +) + +t2m_raw_offsets = np.array([[0,0,0], + [1,0,0], + [-1,0,0], + [0,1,0], + [0,-1,0], + [0,-1,0],#5 + [0,1,0], + [0,-1,0], + [0,-1,0], + [0,1,0], + [0,0,1],#10 + [0,0,1], + [0,1,0], + [1,0,0], + [-1,0,0], + [0,0,1],#15 + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0], + [0,-1,0],#20 + [0,-1,0]]) + +t2m_kinematic_chain = [[0, 2, 5, 8, 11], [0, 1, 4, 7, 10], [0, 3, 6, 9, 12, 15], [9, 14, 17, 19, 21], [9, 13, 16, 18, 20]] +t2m_left_hand_chain = [[20, 22, 23, 24], [20, 34, 35, 36], [20, 25, 26, 27], [20, 31, 32, 33], [20, 28, 29, 30]] +t2m_right_hand_chain = [[21, 43, 44, 45], [21, 46, 47, 48], [21, 40, 41, 42], [21, 37, 38, 39], [21, 49, 50, 51]] + + +kit_tgt_skel_id = '03950' + +t2m_tgt_skel_id = '000021' + + +h36m_kinematic_chain = [[0, 1, 2, 3], [0, 4, 5, 6], [0, 7, 8, 9, 10], [8, 14, 15, 16], [8, 11, 12, 13]] + +h36m_raw_offsets = np.array([[0,0,0], + [-1,0,0], + [0,-1,0], + [0,-1,0], + [1,0,0], + [0,-1,0],#5 + [0,-1,0], + [0,1,0], + [0,1,0], + [0,1,0], + [0,1,0],#10 + [1,0,0], + [1,0,0], + [1,0,0], + [-1,0,0], + [-1,0,0],#15 + [-1,0,0]]) \ No newline at end of file diff --git a/src/sata/utils/humanml_skeleton.py b/src/sata/utils/humanml_skeleton.py new file mode 100644 index 0000000000000000000000000000000000000000..23acff74100e4d764e7121ac3e5b9423bf3470ae --- /dev/null +++ b/src/sata/utils/humanml_skeleton.py @@ -0,0 +1,195 @@ +from .quaternion import * +import scipy.ndimage.filters as filters + +class Skeleton(object): + def __init__(self, offset, kinematic_tree, device): + self.device = device + self._raw_offset_np = offset.numpy() + self._raw_offset = offset.clone().detach().to(device).float() + self._kinematic_tree = kinematic_tree + self._offset = None + self._parents = [0] * len(self._raw_offset) + self._parents[0] = -1 + for chain in self._kinematic_tree: + for j in range(1, len(chain)): + self._parents[chain[j]] = chain[j-1] + + def njoints(self): + return len(self._raw_offset) + + def offset(self): + return self._offset + + def set_offset(self, offsets): + self._offset = offsets.clone().detach().to(self.device).float() + + def kinematic_tree(self): + return self._kinematic_tree + + def parents(self): + return self._parents + + # joints (batch_size, joints_num, 3) + def get_offsets_joints_batch(self, joints): + assert len(joints.shape) == 3 + _offsets = self._raw_offset.expand(joints.shape[0], -1, -1).clone() + for i in range(1, self._raw_offset.shape[0]): + _offsets[:, i] = torch.norm(joints[:, i] - joints[:, self._parents[i]], p=2, dim=1)[:, None] * _offsets[:, i] + + self._offset = _offsets.detach() + return _offsets + + # joints (joints_num, 3) + def get_offsets_joints(self, joints): + assert len(joints.shape) == 2 + _offsets = self._raw_offset.clone() + for i in range(1, self._raw_offset.shape[0]): + # print(joints.shape) + _offsets[i] = torch.norm(joints[i] - joints[self._parents[i]], p=2, dim=0) * _offsets[i] + + self._offset = _offsets.detach() + return _offsets + + # face_joint_idx should follow the order of right hip, left hip, right shoulder, left shoulder + # joints (batch_size, joints_num, 3) + def inverse_kinematics_np(self, joints, face_joint_idx, smooth_forward=False): + assert len(face_joint_idx) == 4 + '''Get Forward Direction''' + l_hip, r_hip, sdr_r, sdr_l = face_joint_idx + across1 = joints[:, r_hip] - joints[:, l_hip] + across2 = joints[:, sdr_r] - joints[:, sdr_l] + across = across1 + across2 + across = across / np.sqrt((across**2).sum(axis=-1))[:, np.newaxis] + # print(across1.shape, across2.shape) + + # forward (batch_size, 3) + forward = np.cross(np.array([[0, 1, 0]]), across, axis=-1) + if smooth_forward: + forward = filters.gaussian_filter1d(forward, 20, axis=0, mode='nearest') + # forward (batch_size, 3) + forward = forward / np.sqrt((forward**2).sum(axis=-1))[..., np.newaxis] + + '''Get Root Rotation''' + target = np.array([[0,0,1]]).repeat(len(forward), axis=0) + root_quat = qbetween_np(forward, target) + + '''Inverse Kinematics''' + # quat_params (batch_size, joints_num, 4) + # print(joints.shape[:-1]) + quat_params = np.zeros(joints.shape[:-1] + (4,)) + # print(quat_params.shape) + root_quat[0] = np.array([[1.0, 0.0, 0.0, 0.0]]) + quat_params[:, 0] = root_quat + # quat_params[0, 0] = np.array([[1.0, 0.0, 0.0, 0.0]]) + for chain in self._kinematic_tree: + R = root_quat + for j in range(len(chain) - 1): + # (batch, 3) + u = self._raw_offset_np[chain[j+1]][np.newaxis,...].repeat(len(joints), axis=0) + # print(u.shape) + # (batch, 3) + v = joints[:, chain[j+1]] - joints[:, chain[j]] + v = v / np.sqrt((v**2).sum(axis=-1))[:, np.newaxis] + # print(u.shape, v.shape) + rot_u_v = qbetween_np(u, v) + + R_loc = qmul_np(qinv_np(R), rot_u_v) + + quat_params[:,chain[j + 1], :] = R_loc + R = qmul_np(R, R_loc) + + return quat_params + + # Be sure root joint is at the beginning of kinematic chains + def forward_kinematics(self, quat_params, root_pos, skel_joints=None, do_root_R=True): + # quat_params (batch_size, joints_num, 4) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(quat_params.shape[0], -1, -1) + joints = torch.zeros(quat_params.shape[:-1] + (3,)).to(self.device) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + R = quat_params[:, 0] + else: + R = torch.tensor([[1.0, 0.0, 0.0, 0.0]]).expand(len(quat_params), -1).detach().to(self.device) + for i in range(1, len(chain)): + R = qmul(R, quat_params[:, chain[i]]) + offset_vec = offsets[:, chain[i]] + joints[:, chain[i]] = qrot(R, offset_vec) + joints[:, chain[i-1]] + return joints + + # Be sure root joint is at the beginning of kinematic chains + def forward_kinematics_np(self, quat_params, root_pos, skel_joints=None, do_root_R=True): + # quat_params (batch_size, joints_num, 4) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(quat_params.shape[0], -1, -1) + offsets = offsets.numpy() + joints = np.zeros(quat_params.shape[:-1] + (3,)) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + R = quat_params[:, 0] + else: + R = np.array([[1.0, 0.0, 0.0, 0.0]]).repeat(len(quat_params), axis=0) + for i in range(1, len(chain)): + R = qmul_np(R, quat_params[:, chain[i]]) + offset_vec = offsets[:, chain[i]] + joints[:, chain[i]] = qrot_np(R, offset_vec) + joints[:, chain[i - 1]] + return joints + + def forward_kinematics_cont6d_np(self, cont6d_params, root_pos, skel_joints=None, do_root_R=True): + # cont6d_params (batch_size, joints_num, 6) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(cont6d_params.shape[0], -1, -1) + offsets = offsets.numpy() + joints = np.zeros(cont6d_params.shape[:-1] + (3,)) + joints[:, 0] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + matR = cont6d_to_matrix_np(cont6d_params[:, 0]) + else: + matR = np.eye(3)[np.newaxis, :].repeat(len(cont6d_params), axis=0) + for i in range(1, len(chain)): + matR = np.matmul(matR, cont6d_to_matrix_np(cont6d_params[:, chain[i]])) + offset_vec = offsets[:, chain[i]][..., np.newaxis] + # print(matR.shape, offset_vec.shape) + joints[:, chain[i]] = np.matmul(matR, offset_vec).squeeze(-1) + joints[:, chain[i-1]] + return joints + + def forward_kinematics_cont6d(self, cont6d_params, root_pos, skel_joints=None, do_root_R=True): + # cont6d_params (batch_size, joints_num, 6) + # joints (batch_size, joints_num, 3) + # root_pos (batch_size, 3) + if skel_joints is not None: + # skel_joints = torch.from_numpy(skel_joints) + offsets = self.get_offsets_joints_batch(skel_joints) + if len(self._offset.shape) == 2: + offsets = self._offset.expand(cont6d_params.shape[0], -1, -1) + joints = torch.zeros(cont6d_params.shape[:-1] + (3,)).to(cont6d_params.device) + joints[..., 0, :] = root_pos + for chain in self._kinematic_tree: + if do_root_R: + matR = cont6d_to_matrix(cont6d_params[:, 0]) + else: + matR = torch.eye(3).expand((len(cont6d_params), -1, -1)).detach().to(cont6d_params.device) + for i in range(1, len(chain)): + matR = torch.matmul(matR, cont6d_to_matrix(cont6d_params[:, chain[i]])) + offset_vec = offsets[:, chain[i]].unsqueeze(-1) + # print(matR.shape, offset_vec.shape) + joints[:, chain[i]] = torch.matmul(matR, offset_vec).squeeze(-1) + joints[:, chain[i-1]] + return joints + diff --git a/src/sata/utils/imgui_utils.py b/src/sata/utils/imgui_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..6e91dc22047dd49fa21ee0f0b0f0cabed89a6b80 --- /dev/null +++ b/src/sata/utils/imgui_utils.py @@ -0,0 +1,139 @@ +from collections import defaultdict +from email.policy import default +import imgui, os +from fairmotion.data import bvh +from IPython import embed + + +# TODO: list multiple motions (currently, temp fix; viewer.m_id = viewer.m_ids[0]) +def update_motion_by_mid(viewer, mid, ignore_root_skel, ee_as_joint): + viewer.m_id = viewer.m_ids[0] + if mid != viewer.m_id: + viewer.m_id = mid + viewer.worldStepper.reset() + if viewer.all_motions[viewer.m_id] is None: + viewer.all_motions[viewer.m_id] = bvh.load( + viewer.file_names[viewer.m_id], + ignore_root_skel=ignore_root_skel, + ee_as_joint=ee_as_joint, + ) + new_motion = viewer.all_motions[viewer.m_id] + viewer.update_motions([new_motion]) + print(viewer.file_names[viewer.m_id][:-4], "\t", new_motion.num_frames() - 1) + + +def list_motion_widget(viewer, ignore_root_skel, ee_as_joint): + # motion list + viewer.m_id = viewer.m_ids[0] + if imgui.button(" < "): + new_mid = (viewer.m_id + 1) % len(viewer.all_motions) + update_motion_by_mid(viewer, new_mid, ignore_root_skel, ee_as_joint) + + imgui.same_line() + + _, new_mid = imgui.combo("", viewer.m_id, viewer.file_names) + update_motion_by_mid(viewer, new_mid, ignore_root_skel, ee_as_joint) + + imgui.same_line() + imgui.text(f"{viewer.m_id}/{len(viewer.file_names)}") + imgui.same_line() + + if imgui.button(" > "): + new_mid = (viewer.m_id + 1) % len(viewer.all_motions) + update_motion_by_mid(viewer, new_mid, ignore_root_skel, ee_as_joint) + + +def check_setup(viewer, save_dir="", loaded_check=None): + viewer.all_check_button_check = True + if loaded_check is None: + viewer.checkbox_enabled = [False] * len(viewer.file_names) + else: + assert len(loaded_check) == len(viewer.file_names) + viewer.checkbox_enabled = loaded_check + + viewer.save_dir = save_dir + + +def check_widget(viewer, ee_as_joint): + # select / deselect all (contact solved) + if viewer.all_check_button_check: + if imgui.button("select"): + viewer.all_check_button_check = False + for i in range(len(viewer.checkbox_enabled)): + viewer.checkbox_enabled[i] = True + else: + if imgui.button("deselect"): + viewer.all_check_button_check = True + for i in range(len(viewer.checkbox_enabled)): + viewer.checkbox_enabled[i] = False + + # check if contact ok (solved) + for i, fn_i in enumerate(viewer.file_names): + _, viewer.checkbox_enabled[i] = imgui.checkbox( + os.path.basename(fn_i), viewer.checkbox_enabled[i] + ) + + changed, text_val = imgui.input_text("save dir", viewer.save_dir, 60) + if changed: + viewer.save_dir = text_val + + if imgui.button(" save motions "): + if not os.path.exists(viewer.save_dir): + os.makedirs(viewer.save_dir) + try: + for m_id in range(len(viewer.all_motions)): + if viewer.checkbox_enabled[m_id] and ( + viewer.all_motions[m_id] is not None + ): + file_path = os.path.join(viewer.save_dir, viewer.file_names[m_id]) + bvh.save( + viewer.all_motions[m_id], + file_path, + rot_order="ZXY", + verbose=True, + ee_as_joint=ee_as_joint, + ) + except: + print("Err while saving") + embed() + + +def tag_setup(viewer, save_dir): + viewer.save_dir = save_dir + viewer.cur_tag = "" + viewer.tag_dicts = defaultdict(set) + + +def tag_widget(viewer): + _, viewer.cur_tag = imgui.input_text("tag", viewer.cur_tag, 60) + viewer.m_id = viewer.m_ids[0] + if imgui.button("mark tag"): + viewer.tag_dicts[viewer.cur_tag].add(viewer.file_names[viewer.m_id]) + + if imgui.button("remove tag"): + viewer.tag_dicts[viewer.cur_tag].remove(viewer.file_names[viewer.m_id]) + + imgui.separator() + + _, viewer.save_dir = imgui.input_text("save dir", viewer.save_dir, 60) + if imgui.button(" save tags "): + if not os.path.exists(viewer.save_dir): + os.makedirs(viewer.save_dir) + try: + for tag_key in viewer.tag_dicts: + file_path = os.path.join(viewer.save_dir, tag_key + ".txt") + print(file_path) + with open(file_path, "w") as file: + for item in viewer.tag_dicts[tag_key]: + file.write(item + "\n") + except: + print("Err while saving") + embed() + + imgui.separator() + + for tag_key in viewer.tag_dicts: + if imgui.tree_node(tag_key, imgui.TREE_NODE_DEFAULT_OPEN): + for elem in viewer.tag_dicts[tag_key]: + imgui.text(os.path.basename(elem)) + imgui.tree_pop() diff --git a/src/sata/utils/joint2humanml.py b/src/sata/utils/joint2humanml.py new file mode 100644 index 0000000000000000000000000000000000000000..4c24b5095b68e2581b2b4bb7c5de72158b353a7d --- /dev/null +++ b/src/sata/utils/joint2humanml.py @@ -0,0 +1,335 @@ +""" +Joint to HumanML3D Representation Converter + +This module provides a class to convert joint positions (shape: [T, 22, 3]) +to HumanML3D representation format (shape: [T, 263]). +""" + +import numpy as np +import torch +from os.path import join as pjoin +from .humanml_skeleton import Skeleton +from .quaternion import * +from .humanml_paramUtil import t2m_raw_offsets, t2m_kinematic_chain + + +class JointToHumanML3D: + """ + Convert joint positions to HumanML3D representation format. + + The output format is a 263-dimensional feature vector containing: + - Root rotation velocity (1D): rotation velocity along y-axis + - Root linear velocity (2D): linear velocity on xz plane + - Root height (1D): y-coordinate of root joint + - Joint rotation invariant positions (63D): local positions of 21 joints + - Joint rotations (126D): continuous 6D rotation representation for 21 joints + - Joint velocities (66D): local velocities of 22 joints + - Foot contacts (4D): contact labels for left/right foot + + Total: 1 + 2 + 1 + 63 + 126 + 66 + 4 = 263 + """ + + def __init__(self, example_id="000021", data_dir='./joints/'): + """ + Initialize the converter with pre-loaded target skeleton. + + Args: + example_id (str): The example motion ID to extract target skeleton offsets + data_dir (str): Directory containing the example motion data + """ + # Lower legs indices for scale calculation + self.l_idx1, self.l_idx2 = 5, 8 + + # Right/Left foot indices for foot contact detection + self.fid_r, self.fid_l = [8, 11], [7, 10] + + # Face direction joints: r_hip, l_hip, sdr_r, sdr_l + self.face_joint_indx = [2, 1, 17, 16] + + # Hip indices + self.r_hip, self.l_hip = 2, 1 + + # Number of joints + self.joints_num = 22 + + # Load kinematic chain and raw offsets + self.n_raw_offsets = torch.from_numpy(t2m_raw_offsets) + self.kinematic_chain = t2m_kinematic_chain + + # Get target skeleton offsets from example + example_data = np.load(pjoin(data_dir, example_id + '.npy')) + example_data = example_data.reshape(len(example_data), -1, 3) + example_data = torch.from_numpy(example_data) + + tgt_skel = Skeleton(self.n_raw_offsets, self.kinematic_chain, 'cpu') + self.tgt_offsets = tgt_skel.get_offsets_joints(example_data[0]) + + print(f"JointToHumanML3D initialized with target skeleton from {example_id}") + + def uniform_skeleton(self, positions, target_offset): + """ + Normalize skeleton to target proportions using leg length scaling. + + Args: + positions (np.ndarray): Joint positions, shape [T, joints_num, 3] + target_offset (torch.Tensor): Target skeleton offsets + + Returns: + np.ndarray: Normalized joint positions + """ + src_skel = Skeleton(self.n_raw_offsets, self.kinematic_chain, 'cpu') + src_offset = src_skel.get_offsets_joints(torch.from_numpy(positions[0])) + src_offset = src_offset.numpy() + tgt_offset = target_offset.numpy() + + # Calculate scale ratio based on leg lengths + src_leg_len = np.abs(src_offset[self.l_idx1]).max() + np.abs(src_offset[self.l_idx2]).max() + tgt_leg_len = np.abs(tgt_offset[self.l_idx1]).max() + np.abs(tgt_offset[self.l_idx2]).max() + + scale_rt = tgt_leg_len / src_leg_len + + src_root_pos = positions[:, 0] + tgt_root_pos = src_root_pos * scale_rt + + # Inverse Kinematics + quat_params = src_skel.inverse_kinematics_np(positions, self.face_joint_indx) + + # Forward Kinematics with target skeleton + src_skel.set_offset(target_offset) + new_joints = src_skel.forward_kinematics_np(quat_params, tgt_root_pos) + + return new_joints + + def process_joints(self, positions, feet_thre=0.002): + """ + Process joint positions and convert to HumanML3D representation. + + Args: + positions (np.ndarray): Joint positions, shape [T, joints_num, 3] + feet_thre (float): Threshold for foot contact detection + + Returns: + np.ndarray: HumanML3D representation, shape [T-1, 263] + """ + # Uniform skeleton normalization + positions = self.uniform_skeleton(positions, self.tgt_offsets) + + # Put on floor + floor_height = positions.min(axis=0).min(axis=0)[1] + positions[:, :, 1] -= floor_height + + # Center XZ at origin + root_pos_init = positions[0] + root_pose_init_xz = root_pos_init[0] * np.array([1, 0, 1]) + positions = positions - root_pose_init_xz + + # Align all poses to initially face Z+ + r_hip, l_hip, sdr_r, sdr_l = self.face_joint_indx + across1 = root_pos_init[r_hip] - root_pos_init[l_hip] + across2 = root_pos_init[sdr_r] - root_pos_init[sdr_l] + across = across1 + across2 + across = across / np.sqrt((across ** 2).sum(axis=-1))[..., np.newaxis] + + # Calculate forward direction (rotate around y-axis) + forward_init = np.cross(np.array([[0, 1, 0]]), across, axis=-1) + forward_init = forward_init / np.sqrt((forward_init ** 2).sum(axis=-1))[..., np.newaxis] + + # Rotate to face Z+ + target = np.array([[0, 0, 1]]) + root_quat_init = qbetween_np(forward_init, target) + root_quat_init = np.ones(positions.shape[:-1] + (4,)) * root_quat_init + + positions = qrot_np(root_quat_init, positions) + + # Store global positions + global_positions = positions.copy() + + # Detect foot contacts + feet_l, feet_r = self._foot_detect(positions, feet_thre) + + # Get continuous 6D representation + cont_6d_params, r_velocity, velocity, r_rot = self._get_cont6d_params(positions) + + # Get rotation invariant position representation + positions = self._get_rifke(positions, r_rot) + + # Root height + root_y = positions[:, 0, 1:2] + + # Root rotation and linear velocity + r_velocity = np.arcsin(r_velocity[:, 2:3]) # (T-1, 1) + l_velocity = velocity[:, [0, 2]] # (T-1, 2) + root_data = np.concatenate([r_velocity, l_velocity, root_y[:-1]], axis=-1) # (T-1, 4) + + # Joint rotation representation + rot_data = cont_6d_params[:, 1:].reshape(len(cont_6d_params), -1) # (T, 126) + + # Joint rotation invariant position representation + ric_data = positions[:, 1:].reshape(len(positions), -1) # (T, 63) + + # Joint velocity representation + local_vel = qrot_np( + np.repeat(r_rot[:-1, None], global_positions.shape[1], axis=1), + global_positions[1:] - global_positions[:-1] + ) + local_vel = local_vel.reshape(len(local_vel), -1) # (T-1, 66) + + # Concatenate all features + data = root_data # (T-1, 4) + data = np.concatenate([data, ric_data[:-1]], axis=-1) # (T-1, 4+63) + data = np.concatenate([data, rot_data[:-1]], axis=-1) # (T-1, 4+63+126) + data = np.concatenate([data, local_vel], axis=-1) # (T-1, 4+63+126+66) + data = np.concatenate([data, feet_l, feet_r], axis=-1) # (T-1, 263) + + return data + + def _foot_detect(self, positions, thres): + """ + Detect foot contacts based on velocity threshold. + + Args: + positions (np.ndarray): Joint positions + thres (float): Velocity threshold + + Returns: + tuple: (feet_l, feet_r) contact labels for left and right feet + """ + velfactor = np.array([thres, thres]) + + # Left foot + feet_l_x = (positions[1:, self.fid_l, 0] - positions[:-1, self.fid_l, 0]) ** 2 + feet_l_y = (positions[1:, self.fid_l, 1] - positions[:-1, self.fid_l, 1]) ** 2 + feet_l_z = (positions[1:, self.fid_l, 2] - positions[:-1, self.fid_l, 2]) ** 2 + feet_l = ((feet_l_x + feet_l_y + feet_l_z) < velfactor).astype(np.float32) + + # Right foot + feet_r_x = (positions[1:, self.fid_r, 0] - positions[:-1, self.fid_r, 0]) ** 2 + feet_r_y = (positions[1:, self.fid_r, 1] - positions[:-1, self.fid_r, 1]) ** 2 + feet_r_z = (positions[1:, self.fid_r, 2] - positions[:-1, self.fid_r, 2]) ** 2 + feet_r = ((feet_r_x + feet_r_y + feet_r_z) < velfactor).astype(np.float32) + + return feet_l, feet_r + + def _get_cont6d_params(self, positions): + """ + Get continuous 6D rotation parameters. + + Args: + positions (np.ndarray): Joint positions + + Returns: + tuple: (cont_6d_params, r_velocity, velocity, r_rot) + """ + skel = Skeleton(self.n_raw_offsets, self.kinematic_chain, "cpu") + quat_params = skel.inverse_kinematics_np(positions, self.face_joint_indx, smooth_forward=True) + + # Quaternion to continuous 6D + cont_6d_params = quaternion_to_cont6d_np(quat_params) + + # Root rotation + r_rot = quat_params[:, 0].copy() + + # Root linear velocity + velocity = (positions[1:, 0] - positions[:-1, 0]).copy() + velocity = qrot_np(r_rot[1:], velocity) + + # Root angular velocity + r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) + + return cont_6d_params, r_velocity, velocity, r_rot + + def _get_rifke(self, positions, r_rot): + """ + Get rotation invariant position representation. + + Args: + positions (np.ndarray): Joint positions + r_rot (np.ndarray): Root rotations + + Returns: + np.ndarray: Rotation invariant positions + """ + # Local pose (relative to root XZ) + positions[..., 0] -= positions[:, 0:1, 0] + positions[..., 2] -= positions[:, 0:1, 2] + + # All poses face Z+ + positions = qrot_np(np.repeat(r_rot[:, None], positions.shape[1], axis=1), positions) + + return positions + + def convert(self, joint_positions, valid_frames): + """ + Convert joint positions to HumanML3D representation. + + Args: + joint_positions (np.ndarray or torch.Tensor): Joint positions with shape [T, 22, 3] + valid_frames (int): Number of valid frames to use. If provided and less than T, + only the first valid_frames will be processed, and the output + will be padded to match the expected length [T-1, 263]. + If None, all frames are processed. + + Returns: + np.ndarray: HumanML3D representation with shape [T-1, 263] + """ + # Convert to numpy if input is torch tensor + if isinstance(joint_positions, torch.Tensor): + joint_positions = joint_positions.cpu().numpy() + + # Validate input shape + if len(joint_positions.shape) != 3: + raise ValueError(f"Expected 3D input with shape [T, 22, 3], got shape {joint_positions.shape}") + + if joint_positions.shape[1] != 22 or joint_positions.shape[2] != 3: + raise ValueError(f"Expected shape [T, 22, 3], got {joint_positions.shape}") + + original_length = joint_positions.shape[0] + + # Truncate to valid frames if specified + if valid_frames is not None and valid_frames < original_length: + joint_positions = joint_positions[:valid_frames, ...] + else: + valid_frames = original_length + + # Process joints (this will reduce length by 1 due to velocity calculation) + humanml3d_repr = self.process_joints(joint_positions, feet_thre=0.002) + # humanml3d_repr shape: [valid_frames-1, 263] + + # Padding to match expected output length [original_length-1, 263] + # if frames were truncated + if valid_frames < original_length: + target_length = original_length - 1 + current_length = humanml3d_repr.shape[0] # valid_frames - 1 + + if current_length < target_length: + # Pad with the last valid frame + pad_length = target_length - current_length + last_frame = humanml3d_repr[-1:, :] # [1, 263] + padding = np.repeat(last_frame, pad_length, axis=0) # [pad_length, 263] + humanml3d_repr = np.concatenate([humanml3d_repr, padding], axis=0) + + return humanml3d_repr + + +if __name__ == "__main__": + # Example usage + converter = JointToHumanML3D(example_id="000021", data_dir='./joints/') + + # Load example joint data + example_joints = np.load('./joints/000021.npy')[:, :22, :] + example_joints = example_joints.reshape(-1, 22, 3) + + print(f"Input shape: {example_joints.shape}") + + # Test 1: Convert without truncation + humanml3d_data = converter.convert(example_joints, valid_frames=None) + print(f"Output shape (no truncation): {humanml3d_data.shape}") + print(f"Expected output shape: [{example_joints.shape[0]-1}, 263]") + + # Test 2: Convert with truncation and padding + if example_joints.shape[0] > 50: + valid_frames = 50 + humanml3d_data_truncated = converter.convert(example_joints, valid_frames=valid_frames) + print(f"\nOutput shape (truncated to {valid_frames} frames): {humanml3d_data_truncated.shape}") + print(f"Expected shape: [{example_joints.shape[0]-1}, 263]") + print(f"Frames processed: {valid_frames-1}, Frames padded: {example_joints.shape[0]-1-(valid_frames-1)}") diff --git a/src/sata/utils/model_loading.py b/src/sata/utils/model_loading.py new file mode 100644 index 0000000000000000000000000000000000000000..5f6413f66fab899039fc0cee7e24d76c8a2ad5d7 --- /dev/null +++ b/src/sata/utils/model_loading.py @@ -0,0 +1,16 @@ +"""Model loading helpers for SATA inference.""" + + +def load_model_by_type(model_type, model_epoch, device): + """Load a VAE or RVQ checkpoint by model type.""" + if model_type == "vae": + from sata.test import prepare_model_test + print(f"[Model] Loading VAE model from: {model_epoch}") + elif model_type == "rvq": + from sata.test_vq import prepare_model_test + print(f"[Model] Loading RVQ model from: {model_epoch}") + else: + raise ValueError(f"Unknown model_type: {model_type}. Must be 'vae' or 'rvq'") + + model, cfg, ms_dict = prepare_model_test(model_epoch, device) + return model, cfg, ms_dict diff --git a/src/sata/utils/motion_data.py b/src/sata/utils/motion_data.py new file mode 100644 index 0000000000000000000000000000000000000000..1eefb42f285efdbed0dd4b45642781c5fafcb03f --- /dev/null +++ b/src/sata/utils/motion_data.py @@ -0,0 +1,469 @@ +"""Motion-data helpers for skeleton loading, graph creation, reconstruction, and serialization.""" + +import os +import torch +import numpy as np +from os.path import join as pjoin + +from sata.mydataset import SkelData +from sata.skel_pose_graph import SkelPoseGraph + + +def load_skeleton_from_npz(npz_path): + """ + Load skeleton data from an npz file without text features. + + Args: + npz_path: motion npz path containing skeleton data + + Returns: + skel_data: SkelData object with tf set to None + """ + # Load skeleton data. + data = np.load(npz_path) + + # Extract intrinsic skeleton data. + lo = data['lo'] # [nJ, 3] + go = data['go'] # [nJ, 3] + qb = data['qb'] # [nJ] + edges = data['edges'] # [nE, 4] + + # Sort edges by child index. + if not (np.arange(edges.shape[0]) == edges[:, 1]).all(): + edges = edges[np.argsort(edges[:, 1])] + + # Create SkelData with tf set to None. + skel_data = SkelData( + torch.Tensor(lo), + torch.Tensor(go), + torch.BoolTensor(qb), + torch.LongTensor(edges[:, :2]).transpose(1, 0), # [2, nE] + torch.LongTensor(edges[:, 2:]), # [nE, 2] + None, # tf is None + ) + + return skel_data + + +def load_skeleton_and_tf_from_npz(npz_path, tf_npz_path): + """ + Load skeleton data and text features from npz files. + + Args: + npz_path: motion npz path containing skeleton data + tf_npz_path: text-feature npz path containing tf + + Returns: + skel_data: SkelData object containing tf + """ + # Load skeleton data without tf. + skel_data = load_skeleton_from_npz(npz_path) + + # Load text features. + try: + tf_data = np.load(tf_npz_path) + if 'tf' not in tf_data: + raise KeyError(f"'tf' key not found in {tf_npz_path}") + tf = tf_data['tf'] # [nJ, 768] + except Exception as e: + print(f"[Warning] Failed to load tf from {tf_npz_path}: {e}") + print(f"[Warning] Using zero tf instead") + nJ = skel_data.lo.shape[0] + tf = np.zeros((nJ, 768), dtype=np.float32) + + # Attach tf to SkelData. + skel_data.tf = torch.Tensor(tf) + + return skel_data + + +def create_graph_list_from_skeleton(skel_data, seq_length): + """ + Create a graph list of the requested length from skeleton data. + + Args: + skel_data: SkelData object + seq_length: sequence length in frames + + Returns: + graphs: list of SkelPoseGraph + """ + # Create one graph per frame with skeleton data only. + graphs = [SkelPoseGraph(skel_data, None) for _ in range(seq_length)] + return graphs + + +def create_graph_list_from_single_graph(skel_graph, seq_length): + """ + Create a graph list of the requested length from one SkelPoseGraph. + + Args: + skel_graph: SkelPoseGraph object containing skeleton data only + seq_length: sequence length in frames + + Returns: + graphs: list of SkelPoseGraph + """ + # Extract SkelData to avoid repeated conversion. + skel_data = SkelData( + lo=skel_graph.lo, + go=skel_graph.go, + qb=skel_graph.qb, + edge_index=skel_graph.edge_index, + edge_feature=skel_graph.edge_feature, + tf=skel_graph.tf if hasattr(skel_graph, 'tf') else torch.zeros(skel_graph.lo.shape[0], 768) + ) + + # Create the graph list. + graphs = [SkelPoseGraph(skel_data, None) for _ in range(seq_length)] + return graphs + + +def process_hatD_to_qrc(hatD_full, src_batch_full, actual_frames, num_nodes_per_frame, + out_rep_cfg, ms_dict): + """ + Convert hatD into q, r, and c. + + Args: + hatD_full: [T*num_nodes, D] decoded features + src_batch_full: complete source batch used for post-processing + actual_frames: actual frame count + num_nodes_per_frame: nodes per frame + out_rep_cfg: output representation config + ms_dict: mean/std dictionary + + Returns: + q: [T, nJ, 6] - quaternion (6D representation) + r: [T, 1, 4] - root transform + c: [T, nJ, 1] - contact + """ + from sata.mymodel import parse_hatD + + # Extract q, r, and c directly with parse_hatD. + root_ids = src_batch_full.ptr[:-1] + out = parse_hatD(hatD_full, root_ids, out_rep_cfg, ms_dict) + + # Extract q, r, and c according to the config. + q = out.get('q', None) # quaternion [T*nJ, 6] + r = out.get('r', None) # root position [T, 4] + c = out.get('c', None) # contact [T*nJ, 1] + + # Reshape q, r, c to [T, nJ, ...] format + if q is not None: + q = q.view(actual_frames, num_nodes_per_frame, -1) # [T, nJ, 6] + if r is not None: + # r is already [T, 4] because parse_hatD handles root_ids. + r = r.unsqueeze(1) # [T, 1, 4] for downstream consistency + if c is not None: + c = c.view(actual_frames, num_nodes_per_frame, -1) # [T, nJ, 1] + + return q, r, c + + +def compute_qv_from_qR(qR): + """ + Compute angular velocity from a rotation-matrix sequence. + qR: [T, nJ, 3, 3] rotation matrices + Returns qv: [T, nJ, 6] angular velocity in 6D representation + + Based on motion_to_graph.py: + q_vel[1:] = rotations[:-1].swapaxes(-2, -1) @ rotations[1:] + """ + T, nJ = qR.shape[0], qR.shape[1] + + # Initialize as identity matrices. + q_vel_R = torch.eye(3, device=qR.device, dtype=qR.dtype)[None, None, ...].repeat(T, nJ, 1, 1) + + # Compute relative rotation: R[t-1].T @ R[t]. + if T > 1: + q_vel_R[1:] = qR[:-1].transpose(-2, -1) @ qR[1:] + + # Convert to 6D representation. + q_vel_flat = q_vel_R.reshape(-1, 3, 3) # [T*nJ, 3, 3] + # Use the first two columns as the 6D representation. + qv_flat = torch.cat([q_vel_flat[:, :, 0], q_vel_flat[:, :, 1]], dim=-1) # [T*nJ, 6] + qv = qv_flat.reshape(T, nJ, 6) + + return qv + + +def reconstruct_p_pv_qv_from_qrc(q, r, c, src_batch, consq_n, device): + """ + Reconstruct p, pv, and qv from q, r, and c. + Mirrors the implementation in reconstruction_qrc_2_same.py. + + Args: + q: [T, nJ, 6] - quaternion (6D representation) + r: [T, 1, 4] - root transform + c: [T, nJ, 1] - contact + src_batch: Batch object containing skeleton info + consq_n: T, sequence length + device: torch device + + Returns: + p: [T-1, nJ, 3] - joint positions (excluding frame 1) + pv: [T-1, nJ, 3] - joint velocities (excluding frame 1) + qv: [T-1, nJ, 6] - joint angular velocities (excluding frame 1) + q_out: [T-1, nJ, 6] - joint rotations (excluding frame 1) + r_out: [T-1, 4] - root transform (excluding frame 1) + c_out: [T-1, nJ, 1] - contact (excluding frame 1) + + Note: every output drops the first frame to keep temporal dimensions consistent. + """ + from sata.mymodel import FK, accum_root + from sata.utils import tensor_utils + + nJ = q.shape[1] + + # 1. Convert q from 6D representation to rotation matrices qR. + q_flat = q.reshape(-1, 6) # [T*nJ, 6] + qR_flat = tensor_utils.tensor_q2qR(q_flat) # [T*nJ, 3, 3] + qR = qR_flat.reshape(consq_n, nJ, 3, 3) # [T, nJ, 3, 3] + + # 2. Run forward kinematics. + r_squeezed = r.squeeze(1) # [T, 1, 4] -> [T, 4] + fk_T_flat = FK( + lo=src_batch.lo, # [T*nJ, 3] + qR=qR_flat, # [T*nJ, 3, 3] + r=r_squeezed, # [T, 4] + root_ids=src_batch.ptr[:-1], # [T] + skel_depth=src_batch.skel_depth, # [T*nJ] + skel_edge_index=src_batch.edge_index, # [2, T*nE] + ) # [T*nJ, 4, 4] + + # Extract positions. + p_flat = fk_T_flat[..., :3, 3] # [T*nJ, 3] + p_full = p_flat.reshape(consq_n, nJ, 3) # [T, nJ, 3] + + # 3. Compute angular velocity qv. + qv_full = compute_qv_from_qR(qR) # [T, nJ, 6] + + # 4. Compute positional velocity pv. + # Accumulate root transforms. + r_for_accum = r # [T, 1, 4] + rT_accum = accum_root(r_for_accum, consq_n, apply_height=False, grad_truncate_k=0) # [T, 1, 4, 4] + facing_transforms = rT_accum[:, 0, :, :] # [T, 4, 4] + + # Convert p to global coordinates. + p_T = tensor_utils.tensor_p2T(p_full.reshape(-1, 3)) # [T*nJ, 4, 4] + p_T = p_T.reshape(consq_n, nJ, 4, 4) # [T, nJ, 4, 4] + + facing_T_expanded = facing_transforms.unsqueeze(1) # [T, 1, 4, 4] + global_p_T = facing_T_expanded @ p_T # [T, nJ, 4, 4] + global_p = global_p_T[..., :3, 3] # [T, nJ, 3] + + # Compute global position differences. + global_p_vel = torch.zeros_like(global_p) + if consq_n > 1: + global_p_vel[1:] = global_p[1:] - global_p[:-1] + + # Convert back to the facing frame. + facing_inv_rot = torch.inverse(facing_transforms)[:, :3, :3] # [T, 3, 3] + facing_inv_rot = facing_inv_rot.unsqueeze(1) # [T, 1, 3, 3] + local_p_vel = (facing_inv_rot @ global_p_vel.unsqueeze(-1)).squeeze(-1) # [T, nJ, 3] + + # Multiply by FPS (30). + pv_full = local_p_vel * 30.0 + + # 5. Drop the first frame for every feature to keep dimensions consistent. + # pv and qv need the previous frame, so their first frame is undefined. + # Drop the first frame from every feature for consistency. + if consq_n > 1: + p = p_full[1:] # [T-1, nJ, 3] + pv = pv_full[1:] # [T-1, nJ, 3] + qv = qv_full[1:] # [T-1, nJ, 6] + q_out = q[1:] # [T-1, nJ, 6] + r_out = r_squeezed[1:] # [T-1, 4] + c_out = c[1:] # [T-1, nJ, 1] + else: + # Single-frame fallback; this should not happen in normal inputs. + p = p_full + pv = pv_full + qv = qv_full + q_out = q + r_out = r_squeezed + c_out = c + + return p, pv, qv, q_out, r_out, c_out + + +def save_processed_with_tf_and_meta(data_dict, output_dir, filename): + """ + Save processed data, joint_text_features, and metadata. + Args: + data_dict: skeleton data, motion features, tf, text, m_len, and related metadata + output_dir: output root directory + filename: file stem without extension + """ + import json + + # Create subdirectories. + processed_dir = pjoin(output_dir, 'processed') + tf_dir = pjoin(output_dir, 'joint_text_features') + os.makedirs(processed_dir, exist_ok=True) + os.makedirs(tf_dir, exist_ok=True) + + # 1. Save the npz file to processed/ with skeleton and motion data, excluding tf. + npz_dict = {} + for key, value in data_dict.items(): + # Skip tf and metadata fields. + if key in ['tf', 'text', 'src_filename', 'is_segment', 'segment_info']: + continue + if isinstance(value, torch.Tensor): + npz_dict[key] = value.cpu().numpy() + else: + npz_dict[key] = value + + npz_path = pjoin(processed_dir, f'{filename}.npz') + np.savez(npz_path, **npz_dict) + + # 2. Save tf to joint_text_features/. + if 'tf' in data_dict: + tf_path = pjoin(tf_dir, f'{filename}.npz') + tf_value = data_dict['tf'] + if isinstance(tf_value, torch.Tensor): + tf_value = tf_value.cpu().numpy() + np.savez(tf_path, tf=tf_value) + + # 3. Save metadata to meta/ for segments and text records. + if data_dict.get('is_segment', False) or 'text' in data_dict: + meta_dir = pjoin(output_dir, 'meta') + os.makedirs(meta_dir, exist_ok=True) + meta_path = pjoin(meta_dir, f'{filename}.json') + + meta_dict = {} + if 'text' in data_dict: + meta_dict['text'] = data_dict['text'] + if data_dict.get('is_segment', False): + meta_dict['is_segment'] = True + meta_dict['segment_info'] = data_dict.get('segment_info', {}) + meta_dict['src_filename'] = data_dict.get('src_filename', filename) + meta_dict['m_len'] = data_dict.get('m_len', 0) + + with open(meta_path, 'w') as f: + json.dump(meta_dict, f, indent=2) + + +def bvh_2_SkelPoseGraph(bvh_path): + """ + Load a skeleton from BVH and convert it to SkelPoseGraph without tf. + + Args: + bvh_path: BVH file path + + Returns: + skel_graph: skeleton graph object (SkelPoseGraph) + + Note: + This path has no text features, so decoding uses zero tf. + """ + from fairmotion.data import bvh + from sata.conversions.motion_to_graph import skel_2_graph + + print(f"Loading skeleton from BVH: {bvh_path}") + motion = bvh.load(bvh_path, ignore_root_skel=True, ee_as_joint=True) + + # The skeleton must be normalized before graph conversion. + from sata.utils.motion_utils import motion_normalize_h2s + motion, tpose = motion_normalize_h2s(motion, False) + + skel = motion.skel + text_feature = np.zeros((skel.num_joints(), 768), dtype=np.float32) + skel_graph = skel_2_graph(skel, text_feature) + print(f" Skeleton joints: {skel.num_joints()}") + print(" [Warning] BVH has no text features; decoding will use zero tf") + + return skel_graph + + +def fix_skeleton_coordinate_system(motion): + """ + Convert a motion from Z-up to Y-up coordinates with local-axis retargeting. + + Converts the entire motion from Z-up to Y-up, including: + 1. Skeleton OFFSET conversion + 2. Root position conversion for every frame + 3. Local rotation retargeting for every joint in every frame + + Key idea: + - When OFFSET changes, local rotations must be adjusted to preserve the visual pose. + - Local rotation conversion: R_new = R_fix @ R_old @ R_fix^T + + Observations: + - Original OFFSET: (0, 0.184, 0) -> Y-up + - Current OFFSET: (0, 0, -0.184) -> Z-down + - Requires a -90 or 90 degree rotation around the X axis + + Args: + motion: fairmotion Motion object in Z-up coordinates + + Returns: + motion: converted Motion object in Y-up coordinates + """ + from fairmotion.ops import conversions + from fairmotion.ops import motion as motion_ops + + import copy + + # Create a deep copy. + motion_copy = copy.deepcopy(motion) + + # Define the coordinate conversion rotation matrix. + # (0, 0, -0.184) -> (0, 0.184, 0) + # This uses a 90 degree rotation around the X axis. + axis_angle = np.array([np.pi / 2, 0.0, 0.0]) + R_fix = conversions.A2R(axis_angle) + R_fix_T = R_fix.T # transpose; for rotation matrices, transpose equals inverse + + # Step 1: convert skeleton OFFSET values. + for joint in motion_copy.skel.joints: + old_offset = joint.xform_from_parent_joint[:3, 3].copy() + # Apply rotation to the offset vector. + new_offset = np.dot(R_fix, old_offset) + joint.xform_from_parent_joint[:3, 3] = new_offset + + # Keep the transform rotation part as identity. + joint.xform_from_parent_joint[:3, :3] = np.eye(3) + + # Step 2: convert each frame. + for frame_idx in range(motion_copy.num_frames()): + pose = motion_copy.get_pose_by_frame(frame_idx) + + for joint_idx, joint in enumerate(motion_copy.skel.joints): + # Read the current joint local transform matrix (4x4). + T_old = pose.data[joint_idx].copy() + + # Split rotation (3x3) and translation (3,). + R_old = T_old[:3, :3] + p_old = T_old[:3, 3] + + # Root joints need global position conversion. + if joint.parent_joint is None: + # Root joint: convert global position. + p_new = np.dot(R_fix, p_old) + # Convert root rotation too. + R_new = np.dot(np.dot(R_fix, R_old), R_fix_T) + else: + # Non-root joint: retarget the local coordinate frame. + # R_new = R_fix @ R_old @ R_fix^T + R_new = np.dot(np.dot(R_fix, R_old), R_fix_T) + # Local translation is usually defined by OFFSET; keep it consistent here. + p_new = np.dot(R_fix, p_old) + + # Build the new transform matrix. + T_new = np.eye(4) + T_new[:3, :3] = R_new + T_new[:3, 3] = p_new + + # Update pose data. + pose.data[joint_idx] = T_new + + # Step 3: apply an extra global rotation fix. + # Apply a -90 degree rotation around X to the entire motion sequence. + # This independent global transform adjusts the final motion direction. + rx = conversions.A2R(np.array([-np.pi / 2, 0.0, 0.0])) + motion_final = motion_ops.rotate(motion_copy, rx) + + return motion_final + + \ No newline at end of file diff --git a/src/sata/utils/motion_utils.py b/src/sata/utils/motion_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..8bd961f0e839cf831aca839910bb595dcceb8304 --- /dev/null +++ b/src/sata/utils/motion_utils.py @@ -0,0 +1,429 @@ +from fairmotion.ops import conversions +import numpy as np +from IPython import embed + +from fairmotion.core import motion as motion_class +from fairmotion.ops import motion as fm_motion_util +from fairmotion.utils import constants +import copy + +from fairmotion.ops.motion import transform_poses + +""" ====================== STITCHING METHODS ======================= """ + + +def simple_stitch(cur_pose, next_poses, align_id=0): + next_pose = next_poses[align_id] + nextT = next_pose.get_root_facing_transform_byRoot(use_height=False) + curT = cur_pose.get_root_facing_transform_byRoot(use_height=False) + alignT = curT @ np.linalg.inv(nextT) + fm_motion_util.transform_poses(next_poses, alignT, local=False) + return next_poses + + +def overlap_blend(from_poses, to_poses, skel_preserve=False): + # CAUTION: assert already aligned + assert len(from_poses) == len(to_poses) + + F = len(from_poses) + ratios = [0.5 - 0.5 * np.cos(i / (F - 1) * np.pi) for i in range(F)] + for i in range(F): + to_poses[i] = fm_motion_util.blend( + from_poses[i], to_poses[i], ratios[i], skel_preserve + ) + + return to_poses, ratios + + +""" ====================== NORMALIZE/DENORMALIZE MOTION =======================""" + + +## HERE WE MEAN "NORMALIZE" == make every joint xform from parent joint to be identity matrix +## adjust height according to tpose contacts +def motion_normalize(motion, tpose=None): + if tpose is None: + tpose = motion.poses[0] + recon_motion = motion_class.Motion(skel=copy.deepcopy(motion.skel)) + recon_motion.set_fps(motion.fps) + + for i, joint in enumerate(recon_motion.skel.joints): + if joint.parent_joint is not None: + joint.xform_from_parent_joint = constants.eye_T() + joint.xform_global = constants.eye_T() + + for i, joint in enumerate(recon_motion.skel.joints): + jidx = recon_motion.skel.get_index_joint(joint) + jpos = tpose.get_transform(jidx, local=False)[0:3, 3] + if joint.parent_joint is not None: + pidx = recon_motion.skel.get_index_joint(joint.parent_joint) + ppos = tpose.get_transform(pidx, local=False)[0:3, 3] + else: + ppos = jpos + + T_new = constants.eye_T() + T_new[0:3, 3] = jpos - ppos + + joint.xform_from_parent_joint = T_new + if joint.parent_joint is not None: + joint.xform_global = np.dot( + joint.parent_joint.xform_global, + joint.xform_from_parent_joint, + ) + else: + joint.xform_global = joint.xform_from_parent_joint + + for el in joint.extra_links: + elpos = np.dot( + tpose.get_transform(jidx, local=False), joint.extra_links[el] + )[0:3, 3] + joint.extra_links[el] = constants.eye_T() + joint.extra_links[el][0:3, 3] = elpos - jpos + + num_frames = len(motion.poses) + T_relative = np.zeros((num_frames, motion.skel.num_joints(), 4, 4)) + T_relative[...] = constants.eye_T() + for i in range(num_frames): + recon_motion.add_one_frame(T_relative[i]) + + motion_local = motion.to_matrix(local=True) # [F, J, 4, 4] + motion_global = motion.to_matrix(local=False) + + for j, (joint, recon_joint) in enumerate( + zip(motion.skel.joints, recon_motion.skel.joints) + ): + if joint.parent_joint is None: + try: + # broadcast ok : [F, 3, 3] @ [3, 3] = [F, 3, 3] + T_relative[:, j, :3, :3] = motion_local[:, j, :3, :3] @ np.linalg.inv( + tpose.data[j][:3, :3] + ) + T_relative[:, j, :3, 3] = motion_local[:, j, :3, 3] + except: + embed() + else: + pidx = motion.skel.get_index_joint(joint.parent_joint) + jidx = motion.skel.get_index_joint(joint) + assert j == jidx + + gp = motion_global[:, pidx, :3, :3] + gj = motion_global[:, jidx, :3, :3] + p2j = joint.xform_from_parent_joint[:3, :3] + + delta_global = constants.eye_R() + delta_global = gj @ np.linalg.inv(gp @ p2j @ tpose.data[j][:3, :3]) + + new_gp = recon_motion.get_joint_transforms(joint, local=False)[:, :3, :3] + new_p2j = recon_joint.xform_from_parent_joint[:3, :3] + new_pg_p2j = new_gp @ new_p2j + + delta_local = constants.eye_R() + delta_local = np.linalg.inv(new_pg_p2j) @ delta_global @ new_pg_p2j + + T_relative[:, j, :3, :3] = delta_local + + return recon_motion + + +# TH) +def copy_normalized_joint(norm_motion, out_motion, joint_name): + # assume that parent joint's name is identical + # and skeleton hierarchy is the same other than missing joints + norm_joint = norm_motion.skel.get_joint(joint_name) + norm_parent_joint = norm_joint.parent_joint + out_parent_joint = out_motion.skel.get_joint(norm_parent_joint.name) + + # multiply output parent joint's xform inverse + # and multiply input parent joint's xform inverse + I = constants.eye_T() + xform_bw_skel = ( + np.linalg.inv(out_parent_joint.xform_global) @ norm_parent_joint.xform_global + ) + orig_xform = norm_joint.xform_from_parent_joint + out_xform = xform_bw_skel @ orig_xform + + out_new_joint = motion_class.Joint( + joint_name, xform_from_parent_joint=out_xform, parent_joint=out_parent_joint + ) + out_motion.skel.add_joint(out_new_joint, out_parent_joint) + for pose in out_motion.poses: + assert pose.skel is out_motion.skel + # add tpose xform for fingers which should be zero in input motion + data = pose.data + pose.data = np.concatenate( + (pose.data, np.expand_dims(out_xform, axis=0)), axis=0 + ) + + +# TH) +def motion_denormalize(norm_motion, tpose_motion, add_missing_joints=False): + # Resize tpose_motion's transform + norm_bvh_joints = list(map(lambda x: x.name, norm_motion.skel.joints)) + tpose_bvh_joints = list(map(lambda x: x.name, tpose_motion.skel.joints)) + + parent_names = set( + map( + lambda x: x.parent_joint.name if x.parent_joint is not None else ":None:", + norm_motion.skel.joints, + ) + ) + + error = False + + for joint_name in norm_bvh_joints: + in_joint = norm_motion.skel.get_joint(joint_name) + in_parent_name = ( + in_joint.parent_joint.name + if in_joint.parent_joint is not None + else ":None:" + ) + + if joint_name not in tpose_bvh_joints: + if in_parent_name in tpose_bvh_joints and add_missing_joints: + copy_normalized_joint(norm_motion, tpose_motion, joint_name) + tpose_bvh_joints.append(joint_name) + continue + else: + print("Required joint {} is missing in tpose".format(joint_name)) + error = True + + t_joint = tpose_motion.skel.get_joint(joint_name) + t_parent_name = ( + t_joint.parent_joint.name if t_joint.parent_joint is not None else ":None:" + ) + + if in_parent_name != t_parent_name: + print( + "{}'s parent joint name is inconsistent: {} and {}".format( + joint_name, in_parent_name, t_parent_name + ) + ) + error = True + + if error: + return "Failed to denormalize motion {}".format(norm_motion.name) + + # Normalize zero-pose of denormalized skeleton + zero_pose = motion_class.Pose(tpose_motion.skel) + tpose_motion.add_one_frame(zero_pose.data) + + norm_tpose_motion = motion_normalize(tpose_motion) + norm_zero_pose = norm_tpose_motion.poses[-1] + + # Denormalize motion with normalized zero position skel pose + in_zero_pose = motion_class.Pose(norm_motion.skel) + for i, joint in enumerate(norm_motion.skel.joints): + if joint.name in tpose_bvh_joints: + data_idx = tpose_motion.skel.get_index_joint(joint.name) + in_zero_pose.data[i] = norm_zero_pose.data[data_idx] + + norm_motion_denorm = motion_normalize(norm_motion, tpose=in_zero_pose) + + return norm_motion_denorm + + +def tpose_height_to_skel(motion, tpose, apply_=False): + if apply_: + res_motion = motion + else: + res_motion = copy.deepcopy(motion) + + tpose_root = tpose.data[0][:3, 3] + tpose_root[0] = 0 + tpose_root[2] = 0 + + for n_pose in res_motion.poses: + n_pose.data[0, :3, 3] -= tpose_root + + root_new_xform_global = res_motion.skel.joints[0].xform_global + root_new_xform_global[:3, 3] += tpose_root + res_motion.skel.joints[0].set_xform_global_recursive(root_new_xform_global) + + return res_motion + + +def motion_normalize_h2s(motion, handle_penetration=True): + + tpose = motion.poses[0] + if handle_penetration: + skel = motion.skel + joint_names = [j.name for j in skel.joints] + lt = "LeftToeBase_End" if "LeftToeBase_End" in joint_names else "LeftToe_End" + rt = "RightToeBase_End" if "RightToeBase_End" in joint_names else "RightToe_End" + if not (lt in joint_names) or not (rt in joint_names): + print("handle penetration Err") + embed() + exit() + lty = tpose.get_transform(lt, local=False)[1, 3] + rty = tpose.get_transform(rt, local=False)[1, 3] + if (lty + rty) / 2 < 0: + print("handle penetrating t-pose") + print(motion.name) + # embed() + transform_poses([tpose], conversions.p2T([0, -(lty + rty) / 2.0, 0])) + + n_motion = motion_normalize(motion, tpose) + n_tpose = n_motion.poses[0] + n_motion.poses = n_motion.poses[1:] + tpose_height_to_skel(n_motion, n_tpose, apply_=True) + + # f_ids = get_foot_indices(n_motion.skel) + # n_motion.contact = get_foot_contact_ratio(n_motion.poses, f_ids) + + return n_motion, n_tpose + + +""" ====================== other ... =======================""" + + +def get_links(skel): + """ + ex) + [[0, 1, 2, 3, 4, 5], + [0, 6, 7, 8, 9, 10], + [0, 11, 12, 13], + [13, 14, 15, 16], + [13, 17, 18, 19, 20], + [13, 21, 22, 23, 24]] + """ + + tree = [] + mask = np.array([0] * len(skel.joints)) + + def dfs_tweak(joint): + ji = skel.get_index_joint(joint) + mask[ji] = 1 + if ji != 0 and len(joint.child_joints) > 1: + tree[-1].append(ji) + for child in joint.child_joints: + ci = skel.get_index_joint(child) + if len(joint.child_joints) > 1: + tree.append([]) + tree[-1].append(ji) + if not mask[ci]: + dfs_tweak(child) + if len(joint.child_joints) == 0: + tree[-1].append(ji) + + dfs_tweak(skel.joints[0]) + return tree + + +def get_edge(skel, bidirection=True): + """ + input: skeletona + - bidiretion + - TRUE: (parent, child) and (child, parent) + - FALSE: (parent, child) only + - include_ee: treat end-effector as joint or not + output: edge [2, E] + """ + edge = [] + for joint in skel.joints: + ji = skel.get_index_joint(joint) + for child in joint.child_joints: + ci = skel.get_index_joint(child) + edge.append([ji, ci]) + if bidirection: + edge.append([ci, ji]) + + return np.array(edge).transpose(1, 0) + + +def skel_interpolate(skel_a, skel_b, ratio): + # assert joint names are the same + joint_names_a = [joint.name for joint in skel_a.joints] + joint_names_b = [joint.name for joint in skel_b.joints] + assert set(joint_names_a) == set(joint_names_b) + + skel_new = copy.deepcopy(skel_a) + for joint_name in joint_names_a: + joint_a = skel_a.get_joint(joint_name) + joint_b = skel_b.get_joint(joint_name) + joint_new = skel_new.get_joint(joint_name) + joint_new.xform_from_parent_joint[:3, 3] = ( + 1 - ratio + ) * joint_a.xform_from_parent_joint[ + :3, 3 + ] + ratio * joint_b.xform_from_parent_joint[ + :3, 3 + ] + + for joint_new in skel_new.joints: + if joint_new.parent_joint is None: + continue + joint_new.xform_global = np.dot( + joint_new.parent_joint.xform_global, + joint_new.xform_from_parent_joint, + ) + return skel_new + + +from fairmotion.utils import contact_utils + + +def make_motion( + skel, + qR, + ra_T, + c, + first_frame_zero=False, + contact_cleanup=False, + cid=None, + motion=None, +): + """ + skel motion_class.Skel + qR arr [T, J, 3, 3] + ra_T arr [T, 4, 4] # root height applied here + c arr [T, J, 1] + cid list [int] + """ + frame_num, joint_num = qR.shape[0], qR.shape[1] + + poses_T = np.zeros((frame_num, joint_num, 4, 4)) + poses_T[...] = constants.eye_T() + poses_T[..., :3, :3] = qR + + if first_frame_zero: + ra_T[0] = constants.eye_T() + + poses_T[:, 0] = ra_T @ poses_T[:, 0] + poses_T[:, 0, 1, 3] = ra_T[:, 1, 3] - skel.joints[0].xform_from_parent_joint[1, 3] + + if not motion: + motion = motion_class.Motion(skel=skel) + for f in range(frame_num): + motion.add_one_frame(poses_T[f]) + + if contact_cleanup: + assert cid is not None + toe_idx = [int(cid[1]), int(cid[3])] + if contact_cleanup: + # print("toe_idx: ", toe_idx) + contact_utils.init_contact(motion, 0, toe_idx) + contact_utils.motion_foot_cleanup(motion, c[:, toe_idx, 0]) + np.set_printoptions(precision=5, suppress=True) + return motion, (toe_idx, c) # c[:, toe_idx, 0]) + else: + return motion, (list(range(joint_num)), c) + + +if __name__ == "__main__": + + import os + from .mypath import * + from fairmotion.data import bvh + + motion_megan = bvh.load( + os.path.join(DATA_DIR, "characters", "polished_bvh", "megan.bvh") + ) + n_motion_megan, n_tpose_megan = motion_normalize_h2s(motion_megan) + skel_megan = n_motion_megan.skel + + motion_mousey = bvh.load( + os.path.join(DATA_DIR, "characters", "polished_bvh", "mousey.bvh") + ) + n_motion_mousey, n_tpose_mousey = motion_normalize_h2s(motion_mousey) + skel_mousey = n_motion_mousey.skel + + new_skel = skel_interpolate(skel_megan, skel_mousey, 0.5) diff --git a/src/sata/utils/network_utils.py b/src/sata/utils/network_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..c9d82e521f841ab45e9139047e34e65c0a57e64a --- /dev/null +++ b/src/sata/utils/network_utils.py @@ -0,0 +1,100 @@ +from torch import nn +import torch, copy +import numpy as np + + +def mlp( + sizes, + activation, + output_activation=nn.Identity(), + use_batchnorm=False, + dropout_p=None, +): + layers = [] + for j in range(len(sizes) - 1): + act = activation if j < len(sizes) - 2 else output_activation + layers += [nn.Linear(sizes[j], sizes[j + 1])] + if use_batchnorm: + layers += nn.BatchNorm1d(sizes[j + 1]) + layers += [act] + if dropout_p is not None: + layers += [nn.Dropout(p=dropout_p)] + # if use_batchnorm: + # layers += [nn.Linear(sizes[j], sizes[j+1]), nn.BatchNorm1d(sizes[j+1]), act] + # else: layers += [nn.Linear(sizes[j], sizes[j+1]), act] + return nn.Sequential(*layers) + + +def get_scheduler(optimizer, scheduler_dict=None, epoch_num=None) -> torch.optim.lr_scheduler.LRScheduler: + if scheduler_dict is None: + raise ValueError("No scheduler_dict provided!") + + scheduler_type = scheduler_dict["type"] + scheduler_dict.pop("type") + + if scheduler_type == "exponential": + def lambda_rule(epoch): + lr_l = max(scheduler_dict["min"], scheduler_dict["gamma"] ** epoch) + return lr_l + + return torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_rule) + # return torch.optim.lr_scheduler.ExponentialLR(optimizer, **scheduler_dict) + elif scheduler_type == "linear": + assert epoch_num != None, "linear schedule but epoch is None" + + def lambda_rule(epoch): + lr_l = max( + scheduler_dict["min"], 1 - epoch * scheduler_dict["slope"] + ) # 1/float(epoch_num+1) + return lr_l + + return torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_rule) + + elif scheduler_type == "Step_LR": + print("Step_LR scheduler set") + return torch.optim.lr_scheduler.StepLR(optimizer, **scheduler_dict) + + elif scheduler_type == "Step_LR_with_warmup": + print("Step_LR_with_warmup scheduler set") + warmup_epochs = scheduler_dict.pop("warmup_epochs", 5) + # warm up phase + warmup_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=0.1, end_factor=1.0, total_iters=warmup_epochs + ) + # StepLR + step_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, **scheduler_dict) + # combine + return torch.optim.lr_scheduler.SequentialLR( + optimizer, schedulers=[warmup_scheduler, step_scheduler], milestones=[warmup_epochs] + ) + + elif scheduler_type == "exponential_with_warmup": + print("exponential_with_warmup scheduler set") + warmup_epochs = scheduler_dict.pop("warmup_epochs", 5) + # warm up phase + warmup_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=0.1, end_factor=1.0, total_iters=warmup_epochs + ) + # exponential decay + def lambda_rule(epoch): + lr_l = max(scheduler_dict["min"], scheduler_dict["gamma"] ** epoch) + return lr_l + exponential_scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_rule) + # combine + return torch.optim.lr_scheduler.SequentialLR( + optimizer, schedulers=[warmup_scheduler, exponential_scheduler], milestones=[warmup_epochs] + ) + + else: raise NotImplementedError(f"Scheduler {scheduler_type} is not implemented!") + ################################################################################## + # return torch.optim.lr_scheduler.StepLR(optimizer, 600, 0.5) + # if scheduler_type == 'Plateau': + # print('Plateau_LR shceduler set') + # return torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, **scheduler_dict) + # return torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.2, threshold=0.01, patience=5, verbose=True) + + +def count_param(model): + model_parameters = filter(lambda p: p.requires_grad, model.parameters()) + num_params = sum([np.prod(p.size()) for p in model_parameters]) + return num_params diff --git a/src/sata/utils/quaternion.py b/src/sata/utils/quaternion.py new file mode 100644 index 0000000000000000000000000000000000000000..f0069f53b65a00e9666eea6cdaac82a31fc280bd --- /dev/null +++ b/src/sata/utils/quaternion.py @@ -0,0 +1,528 @@ +# Copyright (c) 2018-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# + +import torch +import numpy as np + +_EPS4 = np.finfo(float).eps * 4.0 + +_FLOAT_EPS = np.finfo(float).eps + +# PyTorch-backed implementations +def qinv(q): + """ + Inverse the imaginary part of quaternion(s) q. + """ + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + mask = torch.ones_like(q) + mask[..., 1:] = -mask[..., 1:] + return q * mask + + +def qinv_np(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + return qinv(torch.from_numpy(q).float()).numpy() + + +def qnormalize(q): + assert q.shape[-1] == 4, 'q must be a tensor of shape (*, 4)' + return q / torch.norm(q, dim=-1, keepdim=True) + + +def qmul(q, r): + """ + Multiply quaternion(s) q with quaternion(s) r. + Expects two equally-sized tensors of shape (*, 4), where * denotes any number of dimensions. + Returns q*r as a tensor of shape (*, 4). + """ + assert q.shape[-1] == 4 + assert r.shape[-1] == 4 + + original_shape = q.shape + + # Compute outer product + terms = torch.bmm(r.view(-1, 4, 1), q.view(-1, 1, 4)) + + w = terms[:, 0, 0] - terms[:, 1, 1] - terms[:, 2, 2] - terms[:, 3, 3] + x = terms[:, 0, 1] + terms[:, 1, 0] - terms[:, 2, 3] + terms[:, 3, 2] + y = terms[:, 0, 2] + terms[:, 1, 3] + terms[:, 2, 0] - terms[:, 3, 1] + z = terms[:, 0, 3] - terms[:, 1, 2] + terms[:, 2, 1] + terms[:, 3, 0] + return torch.stack((w, x, y, z), dim=1).view(original_shape) + + +def qrot(q, v): + """ + Rotate vector(s) v about the rotation described by quaternion(s) q. + Expects a tensor of shape (*, 4) for q and a tensor of shape (*, 3) for v, + where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + assert q.shape[-1] == 4 + assert v.shape[-1] == 3 + assert q.shape[:-1] == v.shape[:-1] + + original_shape = list(v.shape) + # print(q.shape) + q = q.contiguous().view(-1, 4) + v = v.contiguous().view(-1, 3) + + qvec = q[:, 1:] + uv = torch.cross(qvec, v, dim=1) + uuv = torch.cross(qvec, uv, dim=1) + return (v + 2 * (q[:, :1] * uv + uuv)).view(original_shape) + + +def qeuler(q, order, epsilon=0, deg=True, follow_order=True): + """ + Convert quaternion(s) q to Euler angles. + Expects a tensor of shape (*, 4), where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + assert q.shape[-1] == 4 + + original_shape = list(q.shape) + original_shape[-1] = 3 + q = q.view(-1, 4) + + q0 = q[:, 0] + q1 = q[:, 1] + q2 = q[:, 2] + q3 = q[:, 3] + + if order == 'xyz': + x = torch.atan2(2 * (q0 * q1 - q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + y = torch.asin(torch.clamp(2 * (q1 * q3 + q0 * q2), -1 + epsilon, 1 - epsilon)) + z = torch.atan2(2 * (q0 * q3 - q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + elif order == 'yzx': + x = torch.atan2(2 * (q0 * q1 - q2 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + y = torch.atan2(2 * (q0 * q2 - q1 * q3), 1 - 2 * (q2 * q2 + q3 * q3)) + z = torch.asin(torch.clamp(2 * (q1 * q2 + q0 * q3), -1 + epsilon, 1 - epsilon)) + elif order == 'zxy': + x = torch.asin(torch.clamp(2 * (q0 * q1 + q2 * q3), -1 + epsilon, 1 - epsilon)) + y = torch.atan2(2 * (q0 * q2 - q1 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + z = torch.atan2(2 * (q0 * q3 - q1 * q2), 1 - 2 * (q1 * q1 + q3 * q3)) + elif order == 'xzy': + x = torch.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + y = torch.atan2(2 * (q0 * q2 + q1 * q3), 1 - 2 * (q2 * q2 + q3 * q3)) + z = torch.asin(torch.clamp(2 * (q0 * q3 - q1 * q2), -1 + epsilon, 1 - epsilon)) + elif order == 'yxz': + x = torch.asin(torch.clamp(2 * (q0 * q1 - q2 * q3), -1 + epsilon, 1 - epsilon)) + y = torch.atan2(2 * (q1 * q3 + q0 * q2), 1 - 2 * (q1 * q1 + q2 * q2)) + z = torch.atan2(2 * (q1 * q2 + q0 * q3), 1 - 2 * (q1 * q1 + q3 * q3)) + elif order == 'zyx': + x = torch.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2)) + y = torch.asin(torch.clamp(2 * (q0 * q2 - q1 * q3), -1 + epsilon, 1 - epsilon)) + z = torch.atan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) + else: + raise + resdict = {"x":x, "y":y, "z":z} + + # print(order) + reslist = [resdict[order[i]] for i in range(len(order))] if follow_order else [x, y, z] + # print(reslist) + if deg: + return torch.stack(reslist, dim=1).view(original_shape) * 180 / np.pi + else: + return torch.stack(reslist, dim=1).view(original_shape) + + +# Numpy-backed implementations + +def qmul_np(q, r): + q = torch.from_numpy(q).contiguous().float() + r = torch.from_numpy(r).contiguous().float() + return qmul(q, r).numpy() + + +def qrot_np(q, v): + """ + Rotate vector(s) v about the rotation described by quaternion(s) q. + Expects a tensor of shape (*, 4) for q and a tensor of shape (*, 3) for v, + where * denotes any number of dimensions. + Returns a tensor of shape (*, 3). + """ + q = torch.from_numpy(q).contiguous().float() + v = torch.from_numpy(v).contiguous().float() + return qrot(q, v).numpy() + + +def qeuler_np(q, order, epsilon=0, use_gpu=False): + if use_gpu: + q = torch.from_numpy(q).cuda().float() + return qeuler(q, order, epsilon).cpu().numpy() + else: + q = torch.from_numpy(q).contiguous().float() + return qeuler(q, order, epsilon).numpy() + + +def qfix(q): + """ + Enforce quaternion continuity across the time dimension by selecting + the representation (q or -q) with minimal distance (or, equivalently, maximal dot product) + between two consecutive frames. + + Expects a tensor of shape (L, J, 4), where L is the sequence length and J is the number of joints. + Returns a tensor of the same shape. + """ + assert len(q.shape) == 3 + assert q.shape[-1] == 4 + + result = q.copy() + dot_products = np.sum(q[1:] * q[:-1], axis=2) + mask = dot_products < 0 + mask = (np.cumsum(mask, axis=0) % 2).astype(bool) + result[1:][mask] *= -1 + return result + + +def euler2quat(e, order, deg=True): + """ + Convert Euler angles to quaternions. + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + + e = e.view(-1, 3) + + ## if euler angles in degrees + if deg: + e = e * np.pi / 180. + + x = e[:, 0] + y = e[:, 1] + z = e[:, 2] + + rx = torch.stack((torch.cos(x / 2), torch.sin(x / 2), torch.zeros_like(x), torch.zeros_like(x)), dim=1) + ry = torch.stack((torch.cos(y / 2), torch.zeros_like(y), torch.sin(y / 2), torch.zeros_like(y)), dim=1) + rz = torch.stack((torch.cos(z / 2), torch.zeros_like(z), torch.zeros_like(z), torch.sin(z / 2)), dim=1) + + result = None + for coord in order: + if coord == 'x': + r = rx + elif coord == 'y': + r = ry + elif coord == 'z': + r = rz + else: + raise + if result is None: + result = r + else: + result = qmul(result, r) + + # Reverse antipodal representation to have a non-negative "w" + if order in ['xyz', 'yzx', 'zxy']: + result *= -1 + + return result.view(original_shape) + + +def expmap_to_quaternion(e): + """ + Convert axis-angle rotations (aka exponential maps) to quaternions. + Stable formula from "Practical Parameterization of Rotations Using the Exponential Map". + Expects a tensor of shape (*, 3), where * denotes any number of dimensions. + Returns a tensor of shape (*, 4). + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + e = e.reshape(-1, 3) + + theta = np.linalg.norm(e, axis=1).reshape(-1, 1) + w = np.cos(0.5 * theta).reshape(-1, 1) + xyz = 0.5 * np.sinc(0.5 * theta / np.pi) * e + return np.concatenate((w, xyz), axis=1).reshape(original_shape) + + +def euler_to_quaternion(e, order): + """ + Convert Euler angles to quaternions. + """ + assert e.shape[-1] == 3 + + original_shape = list(e.shape) + original_shape[-1] = 4 + + e = e.reshape(-1, 3) + + x = e[:, 0] + y = e[:, 1] + z = e[:, 2] + + rx = np.stack((np.cos(x / 2), np.sin(x / 2), np.zeros_like(x), np.zeros_like(x)), axis=1) + ry = np.stack((np.cos(y / 2), np.zeros_like(y), np.sin(y / 2), np.zeros_like(y)), axis=1) + rz = np.stack((np.cos(z / 2), np.zeros_like(z), np.zeros_like(z), np.sin(z / 2)), axis=1) + + result = None + for coord in order: + if coord == 'x': + r = rx + elif coord == 'y': + r = ry + elif coord == 'z': + r = rz + else: + raise + if result is None: + result = r + else: + result = qmul_np(result, r) + + # Reverse antipodal representation to have a non-negative "w" + if order in ['xyz', 'yzx', 'zxy']: + result *= -1 + + return result.reshape(original_shape) + + +def quaternion_to_matrix(quaternions): + """ + Convert rotations given as quaternions to rotation matrices. + Args: + quaternions: quaternions with real part first, + as tensor of shape (..., 4). + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + r, i, j, k = torch.unbind(quaternions, -1) + two_s = 2.0 / (quaternions * quaternions).sum(-1) + + o = torch.stack( + ( + 1 - two_s * (j * j + k * k), + two_s * (i * j - k * r), + two_s * (i * k + j * r), + two_s * (i * j + k * r), + 1 - two_s * (i * i + k * k), + two_s * (j * k - i * r), + two_s * (i * k - j * r), + two_s * (j * k + i * r), + 1 - two_s * (i * i + j * j), + ), + -1, + ) + return o.reshape(quaternions.shape[:-1] + (3, 3)) + + +def quaternion_to_matrix_np(quaternions): + q = torch.from_numpy(quaternions).contiguous().float() + return quaternion_to_matrix(q).numpy() + + +def quaternion_to_cont6d_np(quaternions): + rotation_mat = quaternion_to_matrix_np(quaternions) + cont_6d = np.concatenate([rotation_mat[..., 0], rotation_mat[..., 1]], axis=-1) + return cont_6d + + +def quaternion_to_cont6d(quaternions): + rotation_mat = quaternion_to_matrix(quaternions) + cont_6d = torch.cat([rotation_mat[..., 0], rotation_mat[..., 1]], dim=-1) + return cont_6d + + +def cont6d_to_matrix(cont6d): + assert cont6d.shape[-1] == 6, "The last dimension must be 6" + x_raw = cont6d[..., 0:3] + y_raw = cont6d[..., 3:6] + + x = x_raw / torch.norm(x_raw, dim=-1, keepdim=True) + z = torch.cross(x, y_raw, dim=-1) + z = z / torch.norm(z, dim=-1, keepdim=True) + + y = torch.cross(z, x, dim=-1) + + x = x[..., None] + y = y[..., None] + z = z[..., None] + + mat = torch.cat([x, y, z], dim=-1) + return mat + + +def cont6d_to_matrix_np(cont6d): + q = torch.from_numpy(cont6d).contiguous().float() + return cont6d_to_matrix(q).numpy() + + +def qpow(q0, t, dtype=torch.float): + ''' q0 : tensor of quaternions + t: tensor of powers + ''' + q0 = qnormalize(q0) + theta0 = torch.acos(q0[..., 0]) + + ## if theta0 is close to zero, add epsilon to avoid NaNs + mask = (theta0 <= 10e-10) * (theta0 >= -10e-10) + theta0 = (1 - mask) * theta0 + mask * 10e-10 + v0 = q0[..., 1:] / torch.sin(theta0).view(-1, 1) + + if isinstance(t, torch.Tensor): + q = torch.zeros(t.shape + q0.shape) + theta = t.view(-1, 1) * theta0.view(1, -1) + else: ## if t is a number + q = torch.zeros(q0.shape) + theta = t * theta0 + + q[..., 0] = torch.cos(theta) + q[..., 1:] = v0 * torch.sin(theta).unsqueeze(-1) + + return q.to(dtype) + + +def qslerp(q0, q1, t): + ''' + q0: starting quaternion + q1: ending quaternion + t: array of points along the way + + Returns: + Tensor of Slerps: t.shape + q0.shape + ''' + + q0 = qnormalize(q0) + q1 = qnormalize(q1) + q_ = qpow(qmul(q1, qinv(q0)), t) + + return qmul(q_, + q0.contiguous().view(torch.Size([1] * len(t.shape)) + q0.shape).expand(t.shape + q0.shape).contiguous()) + + +def qbetween(v0, v1): + ''' + find the quaternion used to rotate v0 to v1 + ''' + assert v0.shape[-1] == 3, 'v0 must be of the shape (*, 3)' + assert v1.shape[-1] == 3, 'v1 must be of the shape (*, 3)' + + v = torch.cross(v0, v1) + w = torch.sqrt((v0 ** 2).sum(dim=-1, keepdim=True) * (v1 ** 2).sum(dim=-1, keepdim=True)) + (v0 * v1).sum(dim=-1, + keepdim=True) + return qnormalize(torch.cat([w, v], dim=-1)) + + +def qbetween_np(v0, v1): + ''' + find the quaternion used to rotate v0 to v1 + ''' + assert v0.shape[-1] == 3, 'v0 must be of the shape (*, 3)' + assert v1.shape[-1] == 3, 'v1 must be of the shape (*, 3)' + + v0 = torch.from_numpy(v0).float() + v1 = torch.from_numpy(v1).float() + return qbetween(v0, v1).numpy() + + +def lerp(p0, p1, t): + if not isinstance(t, torch.Tensor): + t = torch.Tensor([t]) + + new_shape = t.shape + p0.shape + new_view_t = t.shape + torch.Size([1] * len(p0.shape)) + new_view_p = torch.Size([1] * len(t.shape)) + p0.shape + p0 = p0.view(new_view_p).expand(new_shape) + p1 = p1.view(new_view_p).expand(new_shape) + t = t.view(new_view_t).expand(new_shape) + + return p0 + t * (p1 - p0) + +def matrix_to_quat(R) -> torch.Tensor: + ''' + https://github.com/duolu/pyrotation/blob/master/pyrotation/pyrotation.py + Convert a rotation matrix to a unit quaternion. + This uses the Shepperd’s method for numerical stability. + ''' + + # The rotation matrix must be orthonormal + + w2 = (1 + R[..., 0, 0] + R[..., 1, 1] + R[..., 2, 2]) + x2 = (1 + R[..., 0, 0] - R[..., 1, 1] - R[..., 2, 2]) + y2 = (1 - R[..., 0, 0] + R[..., 1, 1] - R[..., 2, 2]) + z2 = (1 - R[..., 0, 0] - R[..., 1, 1] + R[..., 2, 2]) + + yz = (R[..., 1, 2] + R[..., 2, 1]) + xz = (R[..., 2, 0] + R[..., 0, 2]) + xy = (R[..., 0, 1] + R[..., 1, 0]) + + wx = (R[..., 2, 1] - R[..., 1, 2]) + wy = (R[..., 0, 2] - R[..., 2, 0]) + wz = (R[..., 1, 0] - R[..., 0, 1]) + + w = torch.empty_like(x2) + x = torch.empty_like(x2) + y = torch.empty_like(x2) + z = torch.empty_like(x2) + + flagA = (R[..., 2, 2] < 0) * (R[..., 0, 0] > R[..., 1, 1]) + flagB = (R[..., 2, 2] < 0) * (R[..., 0, 0] <= R[..., 1, 1]) + flagC = (R[..., 2, 2] >= 0) * (R[..., 0, 0] < -R[..., 1, 1]) + flagD = (R[..., 2, 2] >= 0) * (R[..., 0, 0] >= -R[..., 1, 1]) + + x[flagA] = torch.sqrt(x2[flagA]) + w[flagA] = wx[flagA] / x[flagA] + y[flagA] = xy[flagA] / x[flagA] + z[flagA] = xz[flagA] / x[flagA] + + y[flagB] = torch.sqrt(y2[flagB]) + w[flagB] = wy[flagB] / y[flagB] + x[flagB] = xy[flagB] / y[flagB] + z[flagB] = yz[flagB] / y[flagB] + + z[flagC] = torch.sqrt(z2[flagC]) + w[flagC] = wz[flagC] / z[flagC] + x[flagC] = xz[flagC] / z[flagC] + y[flagC] = yz[flagC] / z[flagC] + + w[flagD] = torch.sqrt(w2[flagD]) + x[flagD] = wx[flagD] / w[flagD] + y[flagD] = wy[flagD] / w[flagD] + z[flagD] = wz[flagD] / w[flagD] + + # if R[..., 2, 2] < 0: + # + # if R[..., 0, 0] > R[..., 1, 1]: + # + # x = torch.sqrt(x2) + # w = wx / x + # y = xy / x + # z = xz / x + # + # else: + # + # y = torch.sqrt(y2) + # w = wy / y + # x = xy / y + # z = yz / y + # + # else: + # + # if R[..., 0, 0] < -R[..., 1, 1]: + # + # z = torch.sqrt(z2) + # w = wz / z + # x = xz / z + # y = yz / z + # + # else: + # + # w = torch.sqrt(w2) + # x = wx / w + # y = wy / w + # z = wz / w + + res = [w, x, y, z] + res = [z.unsqueeze(-1) for z in res] + + return torch.cat(res, dim=-1) / 2 + +def cont6d_to_quat(cont6d): + return matrix_to_quat(cont6d_to_matrix(cont6d)) diff --git a/src/sata/utils/skel_gen_utils.py b/src/sata/utils/skel_gen_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..d5f8e9461e8cb4d292aa79e897699f37fdd19707 --- /dev/null +++ b/src/sata/utils/skel_gen_utils.py @@ -0,0 +1,560 @@ +import os, random, itertools +import numpy as np + + +def parse_scale_txt(data_path): + ( + offset_dir_mean, + offset_dir_std, + offset_dir_min, + offset_dir_max, + len_mean, + len_std, + len_min, + len_max, + ) = [dict() for _ in range(8)] + + with open(data_path, "r") as file: + for line in file: + tokens = [tok.strip() for tok in line.split(",")] + jname = tokens[0] + tokens = [float(tok) for ti, tok in enumerate(tokens) if ti != 0] + i = 0 + offset_dir_mean[jname] = tokens[i : i + 3] + i += 3 + offset_dir_std[jname] = tokens[i : i + 3] + i += 3 + offset_dir_min[jname] = tokens[i : i + 3] + i += 3 + offset_dir_max[jname] = tokens[i : i + 3] + i += 3 + len_mean[jname] = tokens[i] + i += 1 + len_std[jname] = tokens[i] + i += 1 + len_min[jname] = tokens[i] + i += 1 + len_max[jname] = tokens[i] + i += 1 + assert len(tokens) == i + # print(offset_dir_mean, offset_dir_std, offset_dir_min, offset_dir_max, len_mean, len_std, len_min, len_max) + return ( + offset_dir_mean, + offset_dir_std, + offset_dir_min, + offset_dir_max, + len_mean, + len_std, + len_min, + len_max, + ) + + +def parse_scale_txt(data_path): + offset_mean = dict() + with open(data_path, "r") as file: + for line in file: + if line.strip() == "": + continue + tokens = [tok.strip() for tok in line.split(",")] + jname = tokens[0].replace("_END", "_End") + offset_mean[jname] = np.array( + [float(tokens[1]), float(tokens[2]), float(tokens[3])] + ) + return offset_mean + + +def rnd_offset_from_default( + jointScaleStat, + all_joint_list, + head_joint_list, + lleg_joint_list, + root_joint, + rand_range=0.4, +): + spineCnt = len( + [joint_name for joint_name in all_joint_list if "Spine" in joint_name] + ) + spine_offset = jointScaleStat["Spine"] + spine_offset = [ + spine_offset[0] / spineCnt, + spine_offset[1] / spineCnt, + spine_offset[2] / spineCnt, + ] + + neckCnt = len([joint_name for joint_name in all_joint_list if "Neck" in joint_name]) + neck_offset = jointScaleStat["Neck"] + neck_offset = [ + neck_offset[0] / neckCnt, + neck_offset[1] / neckCnt, + neck_offset[2] / neckCnt, + ] + + rnd_offset = {} + + def rand_scale(): + return (1 - rand_range) + 2 * rand_range * random.random() + + gs = rand_scale() # global_scale + for jn in all_joint_list: + if jn.startswith("Hip"): + continue + if jn.startswith("Right"): + continue + + if "Spine" in jn: + rnd_offset[jn] = spine_offset + elif "Neck" in jn: + rnd_offset[jn] = neck_offset + elif ("HipJoint" in jn) or ("LowerBack" in jn): + rnd_offset[jn] = [0, 0, 0] + elif ("Shoulder" in jn) and (random.random() < 0.2): + rnd_offset[jn] = [0, 0, 0] + else: + rnd_offset[jn] = jointScaleStat[jn] + + # ls = [0.6+ 0.8*random.random(), 0.6+ 0.8*random.random(), 0.6+ 0.8*random.random()] #local scale + ls = [rand_scale(), rand_scale(), rand_scale()] # local scale + rnd_offset[jn] = [ + rnd_offset[jn][0] * ls[0] * gs, + rnd_offset[jn][1] * ls[1] * gs, + rnd_offset[jn][2] * ls[2] * gs, + ] + + # Mirror + if jn.startswith("Left"): + # must replace like this because list is immutable (rnd_offset[jn.replace('Left', 'Right')][0]*=-1 doesn't work) + rnd_offset[jn.replace("Left", "Right")] = [ + -rnd_offset[jn][0], + rnd_offset[jn][1], + rnd_offset[jn][2], + ] + + height = -sum([rnd_offset[lljoint][1] for lljoint in lleg_joint_list]) + height += random.random() * 3 # [0, 3]cm random offset (+y) + rnd_offset[root_joint] = [0, height, 0] + return rnd_offset + + +def createSkelProperty_fromStat(jointScaleStat, rnd_hierarchy=True): + """joint list, order""" + head_joint_list = [ + ["Hips", "LowerBack"], + ["Spine", "Spine1", "Spine2", "Spine3", "Spine4"], + ["Neck", "Neck1"], + ["Head", "Head_End"], + ] # 'Head_End']] + leg_joint_list = [ + ["HipJoint"], + ["UpLeg", "Leg", "Foot", "ToeBase", "ToeBase_End"], + ] #'ToeBase_End']] + arm_joint_list = [ + ["Shoulder"], + ["Arm", "ForeArm", "Hand", "Hand_End"], + ] #'Hand_End']] + + spineCnt, neckCnt = 3, 1 + useHipJoint = False + useLowerBack = False + if rnd_hierarchy: + spineCntRange = range(1, 5) + weights = [1.5 + 1 / x for x in spineCntRange] + sum_weights = sum(weights) + weights = [x / sum_weights for x in weights] + spineRnd = random.random() + sum_w = 0 + spineCnt = -1 + + for i, w in enumerate(weights): + sum_w += w + if spineRnd < sum_w: + spineCnt = i + 2 + break + if spineCnt == -1: + spineCnt = 5 + + useHipJoint = random.random() < 0.2 + useLowerBack = random.random() < 0.2 + if random.random() < 0.2: + neckCnt = 2 + + max_spineCnt = len(head_joint_list[1]) + for i in range(max_spineCnt - spineCnt): + head_joint_list[1].pop() + + max_neckCnt = len(head_joint_list[2]) + for i in range(max_neckCnt - neckCnt): + head_joint_list[2].pop() + + if not useHipJoint: + leg_joint_list[0].pop() + if not useLowerBack: + head_joint_list[0].pop() + + root_joint = head_joint_list[0][0] + last_spine_joint = head_joint_list[1][-1] + + def flatten(folded_list): + return list(itertools.chain(*folded_list)) + + def add_prefix(namelist, prefix): + return [prefix + v for v in namelist] + + head_joint_list = flatten(head_joint_list) + leg_joint_list = flatten(leg_joint_list) + arm_joint_list = flatten(arm_joint_list) + lleg_joint_list = add_prefix(leg_joint_list, "Left") + rleg_joint_list = add_prefix(leg_joint_list, "Right") + larm_joint_list = add_prefix(arm_joint_list, "Left") + rarm_joint_list = add_prefix(arm_joint_list, "Right") + + parent_map = {} + for joint_list in [ + head_joint_list, + lleg_joint_list, + rleg_joint_list, + larm_joint_list, + rarm_joint_list, + ]: + for i in range(1, len(joint_list)): + parent_map[joint_list[i]] = joint_list[i - 1] + + parent_map[head_joint_list[0]] = None + parent_map[lleg_joint_list[0]] = root_joint + parent_map[rleg_joint_list[0]] = root_joint + parent_map[larm_joint_list[0]] = last_spine_joint + parent_map[rarm_joint_list[0]] = last_spine_joint + + all_joint_list = flatten( + [ + head_joint_list, + lleg_joint_list, + rleg_joint_list, + larm_joint_list, + rarm_joint_list, + ] + ) + # rnd_offset = random_offset_from_stat(jointScaleStat, all_joint_list, head_joint_list, lleg_joint_list, root_joint) + rnd_offset = rnd_offset_from_default( + jointScaleStat, all_joint_list, head_joint_list, lleg_joint_list, root_joint + ) + + """ + @return / rnd_offset: Dict[str, [x,y,z(floats)]] + @return / parent_map: Dict[str, str] + @return / all_joint_list: List[str] # order matters! parents should come first (for addJoint in MB) + """ + ## must be "_End" instead of "_End" (but our jointScaleStat has "_End", so we should convert) + rnd_offset = { + key.replace("_End", "_End"): value for key, value in rnd_offset.items() + } + parent_map = { + key.replace("_End", "_End"): (value.replace("_End", "_End") if value else None) + for key, value in parent_map.items() + } + all_joint_list = [ + joint_name.replace("_End", "_End") for joint_name in all_joint_list + ] + + return rnd_offset, parent_map, all_joint_list + + +def parse_all_char(data_path): + filelist = list(filter(lambda x: x.endswith(".txt"), os.listdir(data_path))) + char_list = [] + for filename in filelist: + filepath = os.path.join(data_path, filename) + character = parse_scale_txt(filepath) + # with open(filepath, 'r') as file: + # for line in file: + # tokens = line.strip().split(",") + # joint_name = tokens[0].replace("_END", "_End") + # character[joint_name] = np.array([float(tokens[1]), float(tokens[2]), float(tokens[3])]) + # # char.append([joint_name, float(tokens[1]), float(tokens[2]), float(tokens[3])]) + char_list.append([filename, character]) + # print("char_list: ", len(char_list)) + # for character in char_list: + # for joint, offset in character.items(): + # print(joint, offset) + # print() + return char_list + + +def rand_scale(rand_range): + # random [1-rand_range, 1+rand_range] + return (1 - rand_range) + 2 * rand_range * random.random() + + +def tweakSkelProperty(char_skel_list, rnd_hierarchy=True): + char_i = random.randint(0, len(char_skel_list) - 1) + char_file_i, char_stat_i = char_skel_list[char_i] + # print(char_file_i) + char_stat_i_names = list( + char_stat_i.keys() + ) # [char_stat_ij[0] for char_stat_ij in char_stat_i] + + head_joint_list = [ + ["Hips", "LowerBack"], + ["Spine", "Spine1", "Spine2", "Spine3", "Spine4"], + ["Neck", "Neck1"], + ["Head", "Head_End"], + ] # 'Head_End']] + leg_joint_list = [ + ["HipJoint"], + ["UpLeg", "Leg", "Foot", "ToeBase", "ToeBase_End"], + ] #'ToeBase_End']] + arm_joint_list = [ + ["Shoulder"], + ["Arm", "ForeArm", "Hand", "Hand_End"], + ] #'Hand_End']] + """ + @return / rnd_offset: Dict[str, [x,y,z(floats)]] + @return / parent_map: Dict[str, str] + @return / all_joint_list: List[str] # order matters! parents should come first (for addJoint in MB) + """ + spineCnt = len( + [spine for spine in head_joint_list[1] if spine in char_stat_i_names] + ) + neckCnt = len([spine for spine in head_joint_list[2] if spine in char_stat_i_names]) + useHipJoint = "LeftHipJoint" in char_stat_i_names + useLowerBack = "LowerBack" in char_stat_i_names + if rnd_hierarchy: + if random.random() < 0.2 and (not useHipJoint): + useHipJoint = True + char_stat_i["LeftHipJoint"] = np.array([0, 0, 0]) + char_stat_i["RightHipJoint"] = np.array([0, 0, 0]) + + if random.random() < 0.2 and (not useLowerBack): + useLowerBack = True + char_stat_i["LowerBack"] = np.array([0, 0, 0]) + + # randomize spine cnt + default_spineCnt = spineCnt + spineCnt += max(min(int(random.gauss(0, 2.0)), 2), -2) + spineCnt = max(min(spineCnt, 5), 1) + # modify default spine length + if spineCnt != default_spineCnt: + all_spine_list = head_joint_list[1] + sum_spine = np.sum( + [char_stat_i[all_spine_list[si]] for si in range(default_spineCnt)], + axis=0, + ) + + if default_spineCnt < spineCnt: + for si in range(default_spineCnt, spineCnt): + char_stat_i[all_spine_list[si]] = sum_spine * 1 / spineCnt + for si in range(default_spineCnt): + char_stat_i[all_spine_list[si]] = ( + char_stat_i[all_spine_list[si]] * default_spineCnt / spineCnt + ) + + elif default_spineCnt > spineCnt: + sum_spine_remain = np.sum( + [char_stat_i[all_spine_list[si]] for si in range(spineCnt)], axis=0 + ) + ratio = np.where( + np.abs(sum_spine_remain) < 1e-4, + np.ones_like(sum_spine), + sum_spine / sum_spine_remain, + ) + for si in range(spineCnt): + char_stat_i[all_spine_list[si]] *= ratio + for si in range(spineCnt, default_spineCnt): + del char_stat_i[all_spine_list[si]] + + # randomize neck cnt + default_neckCnt = neckCnt + neckCnt += max(min(int(random.gauss(0, 2.0)), 1), -1) + neckCnt = max(min(neckCnt, 3), 1) + if neckCnt != default_neckCnt: + all_neck_list = head_joint_list[2] + sum_neck = np.sum( + [char_stat_i[all_neck_list[si]] for si in range(default_neckCnt)], + axis=0, + ) + + if default_neckCnt < neckCnt: + for si in range(default_neckCnt, neckCnt): + char_stat_i[all_neck_list[si]] = sum_neck * 1 / neckCnt + for si in range(default_neckCnt): + char_stat_i[all_neck_list[si]] = ( + char_stat_i[all_neck_list[si]] * default_neckCnt / neckCnt + ) + + elif default_neckCnt > neckCnt: + sum_neck_remain = np.sum( + [char_stat_i[all_neck_list[si]] for si in range(neckCnt)], axis=0 + ) + ratio = np.where( + np.abs(sum_neck_remain) < 1e-4, + np.ones_like(sum_neck), + sum_neck / sum_neck_remain, + ) + for si in range(neckCnt): + char_stat_i[all_neck_list[si]] *= ratio + for si in range(neckCnt, default_neckCnt): + del char_stat_i[all_neck_list[si]] + + max_spineCnt = len(head_joint_list[1]) + for i in range(max_spineCnt - spineCnt): + head_joint_list[1].pop() + + max_neckCnt = len(head_joint_list[2]) + for i in range(max_neckCnt - neckCnt): + head_joint_list[2].pop() + + if not useHipJoint: + leg_joint_list[0].pop() + if not useLowerBack: + head_joint_list[0].pop() + + root_joint = head_joint_list[0][0] + last_spine_joint = head_joint_list[1][-1] + + def flatten(folded_list): + return list(itertools.chain(*folded_list)) + + def add_prefix(namelist, prefix): + return [prefix + v for v in namelist] + + head_joint_list = flatten(head_joint_list) + leg_joint_list = flatten(leg_joint_list) + arm_joint_list = flatten(arm_joint_list) + lleg_joint_list = add_prefix(leg_joint_list, "Left") + rleg_joint_list = add_prefix(leg_joint_list, "Right") + larm_joint_list = add_prefix(arm_joint_list, "Left") + rarm_joint_list = add_prefix(arm_joint_list, "Right") + + # parent_map + parent_map = {} + for joint_list in [ + head_joint_list, + lleg_joint_list, + rleg_joint_list, + larm_joint_list, + rarm_joint_list, + ]: + for i in range(1, len(joint_list)): + parent_map[joint_list[i]] = joint_list[i - 1] + parent_map[head_joint_list[0]] = None + parent_map[lleg_joint_list[0]] = root_joint + parent_map[rleg_joint_list[0]] = root_joint + parent_map[larm_joint_list[0]] = last_spine_joint + parent_map[rarm_joint_list[0]] = last_spine_joint + + # all_joint_list + all_joint_list = flatten( + [ + head_joint_list, + lleg_joint_list, + rleg_joint_list, + larm_joint_list, + rarm_joint_list, + ] + ) + + # rnd_offset :: caution: Left / Right symmetry + rnd_offset = {} + global_scale = rand_scale(0.1) + for jn, offset_j in char_stat_i.items(): + if jn.startswith("Hip"): + continue + if jn.startswith("Right"): + continue + + local_scale = np.array([rand_scale(0.2), rand_scale(0.2), rand_scale(0.2)]) + rnd_offset[jn] = offset_j * local_scale * global_scale + if jn.startswith("Left"): + rnd_offset[jn.replace("Left", "Right")] = np.array( + [-rnd_offset[jn][0], rnd_offset[jn][1], rnd_offset[jn][2]] + ) + + height = -sum([rnd_offset[lljoint][1] for lljoint in lleg_joint_list]) + height += random.random() * 3 # [0, 3]cm random offset (+y) + rnd_offset[root_joint] = np.array([0, height, 0]) + + return rnd_offset, parent_map, all_joint_list + + +from fairmotion.core import motion as motion_class +from fairmotion.ops import conversions + + +def generateSkel(rnd_offset, parent_map, all_joint_list): + skel = motion_class.Skeleton() + for joint_name in all_joint_list: + offset_T = conversions.p2T(rnd_offset[joint_name]) + + parent_name = parent_map[joint_name] + if parent_name is None: + dof = 6 + parent_joint = None + else: + if joint_name in parent_map: + dof = 3 + else: + dof = 0 + parent_joint = skel.get_joint(parent_name) + + new_joint = motion_class.Joint(joint_name, dof, offset_T, parent_joint) + new_joint.set_parent_joint(parent_joint) + skel.add_joint(new_joint, parent_joint) + + # shift root up + joint = skel.get_joint("LeftToeBase_End") + root_height = 0 + while joint.name != "Hips": + root_height -= joint.xform_from_parent_joint[1, 3] + joint = joint.parent_joint + + root = skel.get_joint("Hips") + root.xform_from_parent_joint[1, 3] = root_height + random.random() * 3 + root.set_xform_global_recursive(root.xform_from_parent_joint) + + return skel + + +from sata.mypath import * + +char_skel_list = parse_all_char( + os.path.join(DATA_DIR, "test", "character", "joint_pos") +) +jointScaleStat = parse_scale_txt( + os.path.join(DATA_DIR, "test", "character", "default.txt") +) + + +def create_random_skel(mode="data", rnd_hierarchy=True): + if mode == "data": + rnd_offset, parent_map, all_joint_list = tweakSkelProperty( + char_skel_list, rnd_hierarchy + ) + elif mode == "single": + rnd_offset, parent_map, all_joint_list = createSkelProperty_fromStat( + jointScaleStat, rnd_hierarchy + ) + return generateSkel(rnd_offset, parent_map, all_joint_list) + + +if __name__ == "__main__": + np.set_printoptions(precision=5, suppress=True) + from fairmotion.core import motion as motion_class + from default_veiwer import get_default_viewer + + viewer = get_default_viewer() + + def extra_key_callback(key): + if key == b"m": + skeleton = create_random_skel("data", rnd_hierarchy=True) + motion = motion_class.Motion(skel=skeleton) + motion.add_one_frame(None) + motion.add_one_frame(None) + viewer.update_motions([motion]) + + def extra_render_callback(): + pass + + viewer.extra_key_callback = extra_key_callback + viewer.extra_render_callback = extra_render_callback + + viewer.run() diff --git a/src/sata/utils/sliding_decode.py b/src/sata/utils/sliding_decode.py new file mode 100644 index 0000000000000000000000000000000000000000..60beef17cb800163441b6ab49adc444a7cf6e426 --- /dev/null +++ b/src/sata/utils/sliding_decode.py @@ -0,0 +1,81 @@ +"""Sliding-window decode helpers used by the Gradio demo.""" + +import torch +from torch_geometric.data import Batch + + +def decode_to_hatD_with_sliding_window( + model, + latent_codes, + src_graphs_list, + total_frames, + window_size, + overlap, + device, + model_type, +): + """Decode a long latent/code sequence in overlapping windows. + + Overlapping regions keep the earlier window prediction and drop the later + window overlap. This matches the preprocessing convention used by the demo + checkpoints. + """ + if model_type not in {"vae", "rvq"}: + raise ValueError(f"model_type must be 'vae' or 'rvq', got: {model_type}") + + stride = window_size - overlap + if stride <= 0: + raise ValueError("window_size must be greater than overlap") + + if len(src_graphs_list) != total_frames: + raise ValueError( + f"src_graphs_list length ({len(src_graphs_list)}) != total_frames ({total_frames})" + ) + if latent_codes.shape[0] != total_frames: + raise ValueError( + f"latent_codes length ({latent_codes.shape[0]}) != total_frames ({total_frames})" + ) + + if total_frames <= window_size: + num_windows = 1 + else: + num_windows = (total_frames - window_size + stride - 1) // stride + 1 + + num_nodes_per_frame = src_graphs_list[0].skel_x.shape[0] + hatD_parts = [] + + for window_idx in range(num_windows): + start_frame = window_idx * stride + if start_frame >= total_frames: + break + + end_frame = min(start_frame + window_size, total_frames) + window_frames = end_frame - start_frame + latent_window = latent_codes[start_frame:end_frame].to(device) + + src_window_graphs = src_graphs_list[start_frame:end_frame] + src_window = Batch.from_data_list(src_window_graphs).to(device) + + with torch.no_grad(): + if model_type == "vae": + hatD_win = model.decode(latent_window, src_window, window_frames) + else: + hatD_win, _ = model.decode_from_codes(latent_window, src_window, window_frames) + + hatD_dim = hatD_win.shape[1] + hatD_win_reshaped = hatD_win.view(window_frames, num_nodes_per_frame, hatD_dim) + + if window_idx == 0: + keep_start_idx = 0 + else: + keep_start_idx = overlap + hatD_parts.append(hatD_win_reshaped[keep_start_idx:window_frames].cpu()) + + del src_window, hatD_win, hatD_win_reshaped + + hatD_full_3d = torch.cat(hatD_parts, dim=0) + actual_frames = hatD_full_3d.shape[0] + hatD_full = hatD_full_3d.view(actual_frames * num_nodes_per_frame, -1).to(device) + src_batch_full = Batch.from_data_list(src_graphs_list).to(device) + + return hatD_full, src_batch_full, actual_frames, num_nodes_per_frame diff --git a/src/sata/utils/tensor_utils.py b/src/sata/utils/tensor_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..7a034859b8ec59098eec65b399eaa87d9b333e08 --- /dev/null +++ b/src/sata/utils/tensor_utils.py @@ -0,0 +1,233 @@ +import torch +import numpy as np + +torch.manual_seed(0) +np.random.seed(0) + +import GPUtil, gc +from pynvml import nvmlInit, nvmlDeviceGetHandleByIndex, nvmlDeviceGetMemoryInfo + +use_cuda = True +FloatTensor = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor +LongTensor = torch.cuda.LongTensor if use_cuda else torch.LongTensor +IntTensor = torch.cuda.IntTensor if use_cuda else torch.IntTensor +ByteTensor = torch.cuda.ByteTensor if use_cuda else torch.ByteTensor +BoolTensor = torch.cuda.BoolTensor if use_cuda else torch.BoolTensor +Tensor = FloatTensor + + +def set_device(device): + # Handle torch.device objects. + if isinstance(device, torch.device): + device = str(device) + + globals()["use_cuda"] = device != "cpu" + globals()["FloatTensor"] = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor + globals()["LongTensor"] = torch.cuda.LongTensor if use_cuda else torch.LongTensor + globals()["IntTensor"] = torch.cuda.IntTensor if use_cuda else torch.IntTensor + globals()["ByteTensor"] = torch.cuda.ByteTensor if use_cuda else torch.ByteTensor + globals()["BoolTensor"] = torch.cuda.BoolTensor if use_cuda else torch.BoolTensor + globals()["Tensor"] = FloatTensor + + torch_device = torch.device(device if (torch.cuda.is_available()) else "cpu") + if torch.cuda.is_available() and device.startswith("cuda"): + torch.cuda.set_device(torch_device) + + +def print_gpu_usage(gpu_no=0): + GPUtil.showUtilization() + nvmlInit() + h = nvmlDeviceGetHandleByIndex(gpu_no) + info = nvmlDeviceGetMemoryInfo(h) + print(f"total : {info.total}") + print(f"free : {info.free}") + print(f"used : {info.used}") + print(torch.cuda.memory_summary()) + for obj in gc.get_objects(): + try: + if torch.is_tensor(obj) or ( + hasattr(obj, "data") and torch.is_tensor(obj.data) + ): + print(type(obj), obj.size()) + except: + pass + + +# def proj_tensor(u, v): +# # u, v: [B, ..., D] +# # projet v to u +# B, D = u.shape[0], u.shape[-1] +# uv = torch.sum(u * v, axis=-1) +# uu = torch.sum(u * u, axis=-1) +# a = (uv / uu).unsqueeze(dim=-1) +# repeat_dim = [1] * len(u.shape) +# repeat_dim[-1] = D +# a = a.repeat(repeat_dim) +# return a * u + + +def tensor_q2qR(q): + """ + input q: [..., T, q_dim(=6)] + output qR: [..., T, 3, 3] + """ + q_shape = q.shape + q_reshape = tuple(list(q_shape[:-1]) + [2, 3]) + q_ = q.reshape(q_reshape) # [..., T, 2, 3] + + v1 = q_[..., 0, :] + v2 = q_[..., 1, :] + e1 = torch.nn.functional.normalize(v1, dim=-1) + u2 = v2 - (e1 * v2).sum(-1, keepdim=True) * e1 # v2 - proj_tensor(v1, v2) + e2 = torch.nn.functional.normalize(u2, dim=-1) + e3 = torch.cross(e1, e2, dim=-1) + return torch.stack((e1, e2, e3), dim=-1) + + # a1, a2 = d6[..., :3], d6[..., 3:] + # b1 = torch.nn.functional.normalize(a1, dim=-1) + # b2 = a2 - (b1 * a2).sum(-1, keepdim=True) * b1 + # b2 = torch.nn.functional.normalize(b2, dim=-1) + # b3 = torch.cross(b1, b2, dim=-1) + # return torch.stack((b1, b2, b3), dim=-2) + + +from fairmotion.utils import constants + + +def tensor_r_to_rT(r_dn, apply_height=False): + """ + input r_dn : [..., r_dim] + output rT : [..., 4, 4] + """ + + dtheta, dx, dz, h = r_dn[..., 0], r_dn[..., 1], r_dn[..., 2], r_dn[..., 3] + dcos, dsin = torch.cos(dtheta), torch.sin(dtheta) + + repeat_shape = tuple(list(r_dn.shape[:-1]) + [1, 1]) + + root_T = Tensor(np.tile(constants.eye_T(), repeat_shape)) + root_T[..., 0, 0] = dcos + root_T[..., 0, 2] = dsin + root_T[..., 0, 3] = dx + root_T[..., 2, 0] = -dsin + root_T[..., 2, 2] = dcos + root_T[..., 2, 3] = dz + + if apply_height: + root_T[..., 1, 3] = h + + return root_T + + +def tensor_p2T(p): + reshape = tuple(list(p.shape[:-1]) + [4, 4]) + T = Tensor(constants.eye_T()).expand(*reshape).clone() + T[..., :3, 3] = p + return T + + +def cdn(torch_tensor): + return torch_tensor.cpu().detach().numpy() + + +# below are rotation_conversions code copied from pytorch3d +# https://pytorch3d.readthedocs.io/en/latest/_modules/pytorch3d/transforms/rotation_conversions.html +def _copysign(a, b): + """ + Return a tensor where each element has the absolute value taken from the, + corresponding element of a, with sign taken from the corresponding + element of b. This is like the standard copysign floating-point operation, + but is not careful about negative 0 and NaN. + + Args: + a: source tensor. + b: tensor whose signs will be used, of the same shape as a. + + Returns: + Tensor of the same shape as a with the signs of b. + """ + signs_differ = (a < 0) != (b < 0) + return torch.where(signs_differ, -a, a) + + +def _sqrt_positive_part(x): + """ + Returns torch.sqrt(torch.max(0, x)) + but with a zero subgradient where x is 0. + """ + ret = torch.zeros_like(x) + positive_mask = x > 0 + ret[positive_mask] = torch.sqrt(x[positive_mask]) + return ret + + +def matrix_to_quaternion(matrix): + """ + Convert rotations given as rotation matrices to quaternions. + + Args: + matrix: Rotation matrices as tensor of shape (..., 3, 3). + + Returns: + quaternions with real part first, as tensor of shape (..., 4). + """ + if matrix.size(-1) != 3 or matrix.size(-2) != 3: + raise ValueError(f"Invalid rotation matrix shape f{matrix.shape}.") + m00 = matrix[..., 0, 0] + m11 = matrix[..., 1, 1] + m22 = matrix[..., 2, 2] + o0 = 0.5 * _sqrt_positive_part(1 + m00 + m11 + m22) + x = 0.5 * _sqrt_positive_part(1 + m00 - m11 - m22) + y = 0.5 * _sqrt_positive_part(1 - m00 + m11 - m22) + z = 0.5 * _sqrt_positive_part(1 - m00 - m11 + m22) + o1 = _copysign(x, matrix[..., 2, 1] - matrix[..., 1, 2]) + o2 = _copysign(y, matrix[..., 0, 2] - matrix[..., 2, 0]) + o3 = _copysign(z, matrix[..., 1, 0] - matrix[..., 0, 1]) + return torch.stack((o0, o1, o2, o3), -1) + + +def quaternion_to_axis_angle(quaternions): + """ + Convert rotations given as quaternions to axis/angle. + + Args: + quaternions: quaternions with real part first, + as tensor of shape (..., 4). + + Returns: + Rotations given as a vector in axis angle form, as a tensor + of shape (..., 3), where the magnitude is the angle + turned anticlockwise in radians around the vector's + direction. + """ + norms = torch.norm(quaternions[..., 1:], p=2, dim=-1, keepdim=True) + half_angles = torch.atan2(norms, quaternions[..., :1]) + angles = 2 * half_angles + eps = 1e-6 + small_angles = angles.abs() < eps + sin_half_angles_over_angles = torch.empty_like(angles) + sin_half_angles_over_angles[~small_angles] = ( + torch.sin(half_angles[~small_angles]) / angles[~small_angles] + ) + # for x small, sin(x/2) is about x/2 - (x/2)^3/6 + # so sin(x/2)/x is about 1/2 - (x*x)/48 + sin_half_angles_over_angles[small_angles] = ( + 0.5 - (angles[small_angles] * angles[small_angles]) / 48 + ) + return quaternions[..., 1:] / sin_half_angles_over_angles + + +def matrix_to_axis_angle(matrix): + """ + Convert rotations given as rotation matrices to axis/angle. + + Args: + matrix: Rotation matrices as tensor of shape (..., 3, 3). + + Returns: + Rotations given as a vector in axis angle form, as a tensor + of shape (..., 3), where the magnitude is the angle + turned anticlockwise in radians around the vector's + direction. + """ + return quaternion_to_axis_angle(matrix_to_quaternion(matrix)) diff --git a/src/sata/vae_loss.py b/src/sata/vae_loss.py new file mode 100644 index 0000000000000000000000000000000000000000..52e1c83732957bf709ef8e15a8cc8d64789bfd83 --- /dev/null +++ b/src/sata/vae_loss.py @@ -0,0 +1,58 @@ +import torch +import torch.nn as nn + +class KL_Loss(nn.Module): + def __init__(self, logvar_init=0.0, kl_weight=1.0, nll_loss_type='l1'): + + super().__init__() + self.kl_weight = kl_weight + # output log variance + self.logvar = nn.Parameter(torch.ones(size=()) * logvar_init) + if nll_loss_type == 'l1': + self.nll_loss = torch.nn.L1Loss(reduction='none') + elif nll_loss_type == 'l2': + self.nll_loss = torch.nn.MSELoss(reduction='none') + else: + self.nll_loss = None + # give a warning + print("Warning: nll_loss_type not recognized, no nll_loss will be used.") + def calculate_adaptive_weight(self, nll_loss, g_loss, last_layer=None): + if last_layer is not None: + nll_grads = torch.autograd.grad(nll_loss, last_layer, retain_graph=True)[0] + g_grads = torch.autograd.grad(g_loss, last_layer, retain_graph=True)[0] + else: + nll_grads = torch.autograd.grad(nll_loss, self.last_layer[0], retain_graph=True)[0] + g_grads = torch.autograd.grad(g_loss, self.last_layer[0], retain_graph=True)[0] + + d_weight = torch.norm(nll_grads) / (torch.norm(g_grads) + 1e-4) + d_weight = torch.clamp(d_weight, 0.0, 1e4).detach() + d_weight = d_weight * self.discriminator_weight + return d_weight + + def forward(self, inputs, reconstructions, posteriors, split="train", weights=None): + if self.nll_loss is None: + rec_loss = torch.tensor(0.0) + nll_loss = torch.tensor(0.0) + else: + rec_loss = self.nll_loss(inputs.contiguous(), reconstructions.contiguous()) + + nll_loss = rec_loss / torch.exp(self.logvar) + self.logvar + weighted_nll_loss = nll_loss + if weights is not None: + weighted_nll_loss = weights*nll_loss + weighted_nll_loss = torch.sum(weighted_nll_loss) / weighted_nll_loss.shape[0] + nll_loss = torch.sum(nll_loss) / nll_loss.shape[0] + + kl_loss = posteriors.kl() + kl_loss = torch.sum(kl_loss) / kl_loss.shape[0] + + if self.nll_loss is None: + loss = self.kl_weight * kl_loss + else: + loss = weighted_nll_loss + self.kl_weight * kl_loss + + log = {"{}/total_loss".format(split): loss.clone().detach().mean(), "{}/logvar".format(split): self.logvar.detach(), + "{}/kl_loss".format(split): kl_loss.detach().mean(), "{}/nll_loss".format(split): nll_loss.detach().mean(), + "{}/rec_loss".format(split): rec_loss.detach().mean(), + } + return loss, log \ No newline at end of file diff --git a/src/task/evaluation/table1_unified_sliding.py b/src/task/evaluation/table1_unified_sliding.py new file mode 100644 index 0000000000000000000000000000000000000000..f4ba845f1741960fed9309eb2efaa38209e300c3 --- /dev/null +++ b/src/task/evaluation/table1_unified_sliding.py @@ -0,0 +1,395 @@ +# -*- coding: utf-8 -*- +""" +Unified evaluation script supporting VAE and RVQ models with sliding window strategy. +""" +import os, argparse, tqdm, torch, gc +import numpy as np +from sata.mypath import * +from sata.mydataset import PairedDataset, get_mi_src_tgt_all_graph, PairedGraph_collate_fn +from sata.skel_pose_graph import SkelPoseGraph +from sata.mymodel import out_post_fwd + +from sata.metric import compute_metric +from sata.conversions.graph_to_motion import hatD_recon_motion, gt_recon_motion +from fairmotion.data import bvh + + +def load_model_by_type(model_type, model_epoch, device): + """ + Dynamically load the corresponding model based on model type. + + Args: + model_type: "vae" or "rvq" + model_epoch: model checkpoint path + device: device + + Returns: + model, cfg, ms_dict + """ + if model_type == "vae": + from sata.test import prepare_model_test + print(f"[Model] Loading VAE model from: {model_epoch}") + elif model_type == "rvq": + from sata.test_vq import prepare_model_test + print(f"[Model] Loading RVQ model from: {model_epoch}") + else: + raise ValueError(f"Unknown model_type: {model_type}. Must be 'vae' or 'rvq'") + + model, cfg, ms_dict = prepare_model_test(model_epoch, device) + return model, cfg, ms_dict + + +def extract_window_from_dataset(dataset, mi, src_ri, tgt_ri, start_frame, window_size, total_frames): + """ + Extract a window from the dataset directly from its internal structure (faster than loading frame by frame). + + Args: + dataset: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + start_frame: window start frame + window_size: window size + total_frames: total number of frames + + Returns: + (src_window, tgt_window), actual_window_size + """ + end_frame = min(start_frame + window_size, total_frames) + actual_window_size = end_frame - start_frame + + # get file indices + src_fi = dataset.mi_ri_2_fi[mi][src_ri] + tgt_fi = dataset.mi_ri_2_fi[mi][tgt_ri] + + # get skeleton data (shared across all frames) + src_skel = dataset.skel_list[src_fi] + tgt_skel = dataset.skel_list[tgt_fi] + + # get pose data for window frames (from pose_list) + src_start_idx = dataset.start_frames[src_fi] + start_frame + tgt_start_idx = dataset.start_frames[tgt_fi] + start_frame + + src_pose_window = dataset.pose_list[src_start_idx:src_start_idx + actual_window_size] + tgt_pose_window = dataset.pose_list[tgt_start_idx:tgt_start_idx + actual_window_size] + + # build graph list for window + src_graphs = [SkelPoseGraph(src_skel, pose) for pose in src_pose_window] + tgt_graphs = [SkelPoseGraph(tgt_skel, pose) for pose in tgt_pose_window] + + # collate into batch + window_data = list(zip(src_graphs, tgt_graphs)) + src_window, tgt_window = PairedGraph_collate_fn(window_data) + + return (src_window, tgt_window), actual_window_size + + +def process_with_sliding_window(model, model_type, ds, mi, src_ri, tgt_ri, total_frames, + window_size, overlap, device, debug=False): + """ + Process a motion with sliding windows, supporting overlap. + + Strategy: in overlapping regions, keep only the prediction from the earlier window. + - First window: keep all frames + - Subsequent windows: discard the first `overlap` frames (the overlapping part), keep only the non-overlapping part + + Args: + model: trained model + model_type: "vae" or "rvq" + ds: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + total_frames: total number of frames + window_size: window size + overlap: overlap size between consecutive windows + device: device + debug: print debug information + + Returns: + z_full: concatenated z across all windows (overlaps discarded) + hatD_full: concatenated hatD across all windows (overlaps discarded) + tgt_batch_full: full target batch for GT computation + """ + stride = window_size - overlap + + # compute number of windows + if total_frames <= window_size: + num_windows = 1 + else: + num_windows = (total_frames - window_size + stride - 1) // stride + 1 + + if debug: + print(f"\n[DEBUG] Processing motion {mi}:") + print(f" Total frames: {total_frames}") + print(f" Window size: {window_size}, Overlap: {overlap}, Stride: {stride}") + print(f" Number of windows: {num_windows}") + print(f" Model type: {model_type}") + print(f" Strategy: Discard overlap from later windows, keep only from first window") + + # determine number of nodes per frame from dataset structure + # important: use tgt_skel node count since hatD is output for the target skeleton + tgt_fi = ds.mi_ri_2_fi[mi][tgt_ri] + tgt_skel = ds.skel_list[tgt_fi] + num_nodes_per_frame = tgt_skel.lo.shape[0] # number of joints in target skeleton + + if debug: + print(f" Detected {num_nodes_per_frame} nodes per frame") + + # collect non-overlapping parts from each window + z_parts = [] + hatD_parts = [] + + # process each window + for window_idx in range(num_windows): + start_frame = window_idx * stride + + # skip if start_frame exceeds total_frames + if start_frame >= total_frames: + if debug: + print(f" Window {window_idx}: start_frame {start_frame} >= {total_frames}, skipping") + break + + # extract window from dataset + (src_window, tgt_window), window_frames = extract_window_from_dataset( + ds, mi, src_ri, tgt_ri, start_frame, window_size, total_frames + ) + + # move to device + src_window = src_window.to(device) + tgt_window = tgt_window.to(device) + + # call model according to type (handles different return value counts) + with torch.no_grad(): + if model_type == "vae": + # VAE model returns 2 values + z_win, hatD_win = model(src_window, tgt_window, window_frames) + elif model_type == "rvq": + # RVQ model returns 4 values + z_win, hatD_win, _, _ = model(src_window, tgt_window, window_frames) + else: + raise ValueError(f"Unknown model_type: {model_type}") + + # hatD shape is [T*N, D] where T=frames, N=nodes_per_frame + hatD_dim = hatD_win.shape[1] + + # reshape hatD from [T*N, D] to [T, N, D] + hatD_win_reshaped = hatD_win.view(window_frames, num_nodes_per_frame, hatD_dim) + + # determine which frames to keep from this window + if window_idx == 0: + # first window: keep all frames + keep_start_idx = 0 + keep_end_idx = window_frames + global_start = start_frame + global_end = start_frame + window_frames + else: + # subsequent windows: discard overlapping part, keep only non-overlapping part + keep_start_idx = overlap + keep_end_idx = window_frames + global_start = start_frame + overlap + global_end = start_frame + window_frames + + # extract non-overlapping part + z_keep = z_win[keep_start_idx:keep_end_idx] + hatD_keep = hatD_win_reshaped[keep_start_idx:keep_end_idx] + + if debug: + print(f" Window {window_idx}: frames [{start_frame}, {start_frame + window_frames})") + print(f" Window internal frames: {window_frames}") + print(f" Keep indices: [{keep_start_idx}, {keep_end_idx}) -> global frames [{global_start}, {global_end})") + print(f" z_keep shape: {z_keep.shape}, hatD_keep shape: {hatD_keep.shape}") + + # append to lists + z_parts.append(z_keep) + hatD_parts.append(hatD_keep) + + # cleanup + del src_window, tgt_window, z_win, hatD_win, hatD_win_reshaped + + # concatenate all parts + z_full = torch.cat(z_parts, dim=0) # [T, D] + hatD_full_3d = torch.cat(hatD_parts, dim=0) # [T, N, D] + + # reshape hatD back to [T*N, D] format (expected by parse_hatD) + actual_frames = z_full.shape[0] + hatD_full = hatD_full_3d.view(actual_frames * num_nodes_per_frame, -1) + + # verify frame count is correct + if actual_frames != total_frames: + if debug: + print(f" WARNING: Expected {total_frames} frames, got {actual_frames} frames") + + # check for NaN or Inf + if torch.isnan(z_full).any() or torch.isinf(z_full).any(): + raise ValueError("NaN or Inf detected in z_full") + if torch.isnan(hatD_full).any() or torch.isinf(hatD_full).any(): + raise ValueError("NaN or Inf detected in hatD_full") + + if debug: + print(f" Final shapes: z_full {z_full.shape}, hatD_full {hatD_full.shape}") + print(f" Total frames collected: {actual_frames} (expected: {total_frames})") + + # load the full target batch for GT computation + (_, tgt_batch_full), _ = get_mi_src_tgt_all_graph(ds, mi, src_ri, tgt_ri, device) + tgt_batch_full = tgt_batch_full.to(device) + + return z_full, hatD_full, tgt_batch_full + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--model_type", type=str, required=True, choices=["vae", "rvq"], + help="Model type: vae or rvq (REQUIRED)") + parser.add_argument("--model_epoch", type=str, default="ckpt0") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--data_dir", type=str, default="test/motion/processed") + parser.add_argument("--num_samples", type=int, default=-1, + help="Number of samples to evaluate (-1 for all)") + parser.add_argument("--window_size", type=int, default=64, + help="Sliding window size (number of frames)") + parser.add_argument("--overlap", type=int, default=16, + help="Overlap size between consecutive windows") + parser.add_argument("--visualize", action="store_true", + help="Enable BVH visualization (only when num_samples < 3)") + args = parser.parse_args() + + print("="*80) + print("Unified Table1 Evaluation (with sliding window)") + print("="*80) + print(f"Model type: {args.model_type.upper()}") + print(f"Model: {args.model_epoch}") + print(f"Device: {args.device}") + print(f"Data dir: {args.data_dir}") + print(f"Window size: {args.window_size}") + print(f"Overlap: {args.overlap}") + print(f"Stride: {args.window_size - args.overlap}") + print(f"Visualization: {args.visualize}") + print("="*80) + + # load model by type + model, cfg, ms_dict = load_model_by_type(args.model_type, args.model_epoch, args.device) + + # dataset + ds = PairedDataset(min_motion_lens=8) + data_dir = os.path.join(DATA_DIR, args.data_dir) + ds.load_data_dir_pairs(data_dir) + + # determine test range based on num_samples + total_samples = len(ds.mi_ri_2_fi) + if args.num_samples > 0 and args.num_samples < total_samples: + N = args.num_samples + else: + N = total_samples + + print(f"\nEvaluating {N} samples out of {total_samples} total samples\n") + + metric_key = ["qR", "ra_xz", "pa", "slide", "pen"] + metric = {key: 0.0 for key in metric_key} + + model.eval() # set model to evaluation mode + + # create output directory if visualization is enabled + if args.visualize and N <= 3: + vis_dir = os.path.join(os.path.dirname(__file__), "visual_result", f"table1_unified_{args.model_type}") + os.makedirs(vis_dir, exist_ok=True) + print(f"\nVisualization output directory: {vis_dir}\n") + + for mi in tqdm.tqdm(range(N)): + # get total frame count for this motion + fi = ds.mi_ri_2_fi[mi][0] # use first rig to get frame count + total_frames = ds.frame_cnts[fi] + + # enable debug for first sample or when visualizing + debug_mode = (mi == 0) or (args.visualize and mi < 3) + z, hatD, tgt_batch = process_with_sliding_window( + model, args.model_type, ds, mi, 0, 0, total_frames, + args.window_size, args.overlap, args.device, + debug=debug_mode + ) + consq_n = total_frames + + # ========== BVH Visualization ========== + if args.visualize and N <= 3: + print(f"\n[Visualization] Generating BVH for motion {mi} (frames: {total_frames})...") + try: + # load source batch for visualization + (src_batch, _), _ = get_mi_src_tgt_all_graph(ds, mi, 0, 0, args.device) + src_batch = src_batch.to(args.device) + + # reconstruct source motion + src_motion_list, _ = gt_recon_motion(src_batch, consq_n) + + # reconstruct motion from prediction + out_motion_list, _ = hatD_recon_motion( + hatD, tgt_batch, cfg["representation"]["out"], ms_dict, consq_n + ) + + # reconstruct GT motion for comparison + gt_motion_list, _ = gt_recon_motion(tgt_batch, consq_n) + + # save BVH files + mi_vis_dir = os.path.join(vis_dir, f"motion_{mi}") + os.makedirs(mi_vis_dir, exist_ok=True) + + src_path = os.path.join(mi_vis_dir, "src_motion.bvh") + pred_path = os.path.join(mi_vis_dir, "predicted.bvh") + gt_path = os.path.join(mi_vis_dir, "ground_truth.bvh") + + bvh.save(src_motion_list[0], src_path, rot_order="XYZ") + bvh.save(out_motion_list[0], pred_path, rot_order="XYZ") + bvh.save(gt_motion_list[0], gt_path, rot_order="XYZ") + + print(f" ✓ Source motion: {src_path} ({src_motion_list[0].num_frames()} frames)") + print(f" ✓ Predicted motion: {pred_path} ({out_motion_list[0].num_frames()} frames)") + print(f" ✓ Ground truth: {gt_path} ({gt_motion_list[0].num_frames()} frames)") + + except Exception as e: + print(f" ✗ Visualization failed: {e}") + import traceback + traceback.print_exc() + + # compute output and GT using out_post_fwd + out, gt = out_post_fwd( + {"hatD": hatD, "z": z}, + tgt_batch, + ms_dict, + cfg["representation"]["out"], + consq_n, + ) + + # compute metrics + mi_metric = compute_metric(metric_key, out, gt) + for key in metric_key: + metric[key] += mi_metric[key].detach().item() + + # del tgt_batch, z, hatD, out, gt + # gc.collect() + # torch.cuda.empty_cache() + + # print results + print("\n" + "="*80) + print("Results:") + print("="*80) + for key in metric_key: + print(f"{key}: {metric[key]/N:.4f}", end="\t") + print("\n" + "="*80) + + # save results to file + metric_fp = os.path.join(RESULT_DIR, args.model_epoch.split("/")[0], f"table1_unified_{args.model_type}_sliding.txt") + os.makedirs(os.path.dirname(metric_fp), exist_ok=True) + + if not os.path.exists(metric_fp): + with open(metric_fp, "w") as f: + line = "model_epoch,\tmodel_type,\twindow_size,\toverlap,\t" + for key in metric_key: + line += f"{key},\t" + f.write(line + "\n") + + with open(metric_fp, "a") as f: + line = f"{args.model_epoch},\t{args.model_type},\t{args.window_size},\t{args.overlap},\t" + for key in metric_key: + line += f"{metric[key]/N:.4f},\t" + f.write(line + "\n") + + print(f"\nResults saved to: {metric_fp}") diff --git a/src/task/evaluation/table1_vq_sliding_overlap.py b/src/task/evaluation/table1_vq_sliding_overlap.py new file mode 100644 index 0000000000000000000000000000000000000000..97f6df807bf8e004978c2b17f903fc5f5b3a86c3 --- /dev/null +++ b/src/task/evaluation/table1_vq_sliding_overlap.py @@ -0,0 +1,332 @@ +# -*- coding: utf-8 -*- +import os, argparse, tqdm, torch, gc +import numpy as np +from sata.mypath import * +from sata.test_vq import prepare_model_test +from sata.mydataset import PairedDataset, get_mi_src_tgt_all_graph, PairedGraph_collate_fn +from sata.skel_pose_graph import SkelPoseGraph +from sata.mymodel import out_post_fwd + +from sata.metric import compute_metric +from sata.conversions.graph_to_motion import hatD_recon_motion, gt_recon_motion +from fairmotion.data import bvh + + +def extract_window_from_dataset(dataset, mi, src_ri, tgt_ri, start_frame, window_size, total_frames): + """ + Extract a window directly from dataset's internal structure (faster than frame-by-frame loading) + + Args: + dataset: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + start_frame: window start frame + window_size: window size + total_frames: total frames + + Returns: + (src_window, tgt_window), actual_window_size + """ + end_frame = min(start_frame + window_size, total_frames) + actual_window_size = end_frame - start_frame + + # Get file indices + src_fi = dataset.mi_ri_2_fi[mi][src_ri] + tgt_fi = dataset.mi_ri_2_fi[mi][tgt_ri] + + # Get skeleton data (shared across all frames) + src_skel = dataset.skel_list[src_fi] + tgt_skel = dataset.skel_list[tgt_fi] + + # Get pose data for the window frames (from pose_list) + src_start_idx = dataset.start_frames[src_fi] + start_frame + tgt_start_idx = dataset.start_frames[tgt_fi] + start_frame + + src_pose_window = dataset.pose_list[src_start_idx:src_start_idx + actual_window_size] + tgt_pose_window = dataset.pose_list[tgt_start_idx:tgt_start_idx + actual_window_size] + + # Create graph list for the window + src_graphs = [SkelPoseGraph(src_skel, pose) for pose in src_pose_window] + tgt_graphs = [SkelPoseGraph(tgt_skel, pose) for pose in tgt_pose_window] + + # Collate into batch + window_data = list(zip(src_graphs, tgt_graphs)) + src_window, tgt_window = PairedGraph_collate_fn(window_data) + + return (src_window, tgt_window), actual_window_size + + +def process_with_sliding_window(model, ds, mi, src_ri, tgt_ri, total_frames, window_size, overlap, device, debug=False): + """ + Process motion with sliding window approach with overlap + + Strategy: keep predictions from earlier windows in overlap regions and discard + overlapping frames from later windows. + - First window: keep all frames + - Later windows: discard the first overlap frames and keep only non-overlapping frames + + Args: + model: trained model + ds: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + total_frames: total frames + window_size: window size + overlap: overlap size between consecutive windows + device: device + debug: print debug information + + Returns: + z_full: concatenated z from all windows (discarding overlaps) + hatD_full: concatenated hatD from all windows (discarding overlaps) + tgt_batch_full: full target batch for GT computation + """ + stride = window_size - overlap + + # Calculate number of windows + if total_frames <= window_size: + num_windows = 1 + else: + num_windows = (total_frames - window_size + stride - 1) // stride + 1 + + if debug: + print(f"\n[DEBUG] Processing motion {mi}:") + print(f" Total frames: {total_frames}") + print(f" Window size: {window_size}, Overlap: {overlap}, Stride: {stride}") + print(f" Number of windows: {num_windows}") + print(f" Strategy: Discard overlap from later windows, keep only from first window") + + # Determine num_nodes_per_frame from dataset structure + src_fi = ds.mi_ri_2_fi[mi][src_ri] + src_skel = ds.skel_list[src_fi] + num_nodes_per_frame = src_skel.lo.shape[0] # Number of joints + + if debug: + print(f" Detected {num_nodes_per_frame} nodes per frame") + + # Lists to collect non-overlapping parts from each window + z_parts = [] + hatD_parts = [] + + # Process each window + for window_idx in range(num_windows): + start_frame = window_idx * stride + + # Skip if start_frame exceeds total_frames + if start_frame >= total_frames: + if debug: + print(f" Window {window_idx}: start_frame {start_frame} >= {total_frames}, skipping") + break + + # Extract window from dataset + (src_window, tgt_window), window_frames = extract_window_from_dataset( + ds, mi, src_ri, tgt_ri, start_frame, window_size, total_frames + ) + + # Move to device + src_window = src_window.to(device) + tgt_window = tgt_window.to(device) + + # Model inference on current window + with torch.no_grad(): + z_win, hatD_win, _, _ = model(src_window, tgt_window, window_frames) + + # hatD has shape [T*N, D] where T=frames, N=nodes_per_frame + hatD_dim = hatD_win.shape[1] + + # Reshape hatD from [T*N, D] to [T, N, D] + hatD_win_reshaped = hatD_win.view(window_frames, num_nodes_per_frame, hatD_dim) + + # Determine which frames to keep from this window + if window_idx == 0: + # First window: keep all frames + keep_start_idx = 0 + keep_end_idx = window_frames + global_start = start_frame + global_end = start_frame + window_frames + else: + # Later windows: discard overlap, keep only non-overlapping part + keep_start_idx = overlap + keep_end_idx = window_frames + global_start = start_frame + overlap + global_end = start_frame + window_frames + + # Extract the non-overlapping part + z_keep = z_win[keep_start_idx:keep_end_idx] + hatD_keep = hatD_win_reshaped[keep_start_idx:keep_end_idx] + + if debug: + print(f" Window {window_idx}: frames [{start_frame}, {start_frame + window_frames})") + print(f" Window internal frames: {window_frames}") + print(f" Keep indices: [{keep_start_idx}, {keep_end_idx}) -> global frames [{global_start}, {global_end})") + print(f" z_keep shape: {z_keep.shape}, hatD_keep shape: {hatD_keep.shape}") + + # Append to lists + z_parts.append(z_keep) + hatD_parts.append(hatD_keep) + + # Clean up + del src_window, tgt_window, z_win, hatD_win, hatD_win_reshaped + + # Concatenate all parts + z_full = torch.cat(z_parts, dim=0) # [T, D] + hatD_full_3d = torch.cat(hatD_parts, dim=0) # [T, N, D] + + # Reshape hatD back to [T*N, D] format (as expected by parse_hatD) + actual_frames = z_full.shape[0] + hatD_full = hatD_full_3d.view(actual_frames * num_nodes_per_frame, -1) + + # Verify we have the correct number of frames + if actual_frames != total_frames: + if debug: + print(f" WARNING: Expected {total_frames} frames, got {actual_frames} frames") + + # Check for NaN or Inf + if torch.isnan(z_full).any() or torch.isinf(z_full).any(): + raise ValueError("NaN or Inf detected in z_full") + if torch.isnan(hatD_full).any() or torch.isinf(hatD_full).any(): + raise ValueError("NaN or Inf detected in hatD_full") + + if debug: + print(f" Final shapes: z_full {z_full.shape}, hatD_full {hatD_full.shape}") + print(f" Total frames collected: {actual_frames} (expected: {total_frames})") + + # Load target batch once for GT computation + (_, tgt_batch_full), _ = get_mi_src_tgt_all_graph(ds, mi, src_ri, tgt_ri, device) + tgt_batch_full = tgt_batch_full.to(device) + + return z_full, hatD_full, tgt_batch_full + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--model_epoch", type=str, default="ckpt0") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--data_dir", type=str, default="test/motion/processed") + parser.add_argument("--num_samples", type=int, default=-1, + help="Number of samples to evaluate (-1 for all)") + parser.add_argument("--window_size", type=int, default=64, + help="Sliding window size (number of frames)") + parser.add_argument("--overlap", type=int, default=16, + help="Overlap size between consecutive windows") + parser.add_argument("--visualize", action="store_true", + help="Enable BVH visualization (only when num_samples < 3)") + args = parser.parse_args() + + print("="*80) + print("Table1 Evaluation with Overlapping Sliding Window") + print("="*80) + print(f"Model: {args.model_epoch}") + print(f"Device: {args.device}") + print(f"Data dir: {args.data_dir}") + print(f"Window size: {args.window_size}") + print(f"Overlap: {args.overlap}") + print(f"Stride: {args.window_size - args.overlap}") + print(f"Visualization: {args.visualize}") + print("="*80) + + model, cfg, ms_dict = prepare_model_test(args.model_epoch, args.device) + + # Dataset + ds = PairedDataset(min_motion_lens=8) + data_dir = os.path.join(DATA_DIR, args.data_dir) + ds.load_data_dir_pairs(data_dir) + + # Determine test range based on num_samples + total_samples = len(ds.mi_ri_2_fi) + if args.num_samples > 0 and args.num_samples < total_samples: + N = args.num_samples + else: + N = total_samples + + print(f"\nEvaluating {N} samples out of {total_samples} total samples\n") + + metric_key = ["qR", "ra_xz", "pa", "slide", "pen"] + metric = {key: 0.0 for key in metric_key} + + model.eval() # Set model to evaluation mode + + # Create visualization directory if needed + if args.visualize and N <= 3: + vis_dir = os.path.join(os.path.dirname(__file__), "visual_result", "table1_sliding_verification") + os.makedirs(vis_dir, exist_ok=True) + print(f"\nVisualization output directory: {vis_dir}\n") + + for mi in tqdm.tqdm(range(N)): + # Get total frames for this motion + fi = ds.mi_ri_2_fi[mi][0] # Use first rig to get frame count + total_frames = ds.frame_cnts[fi] + + # Process with sliding window (enable debug for first sample or when visualizing) + debug_mode = (mi == 0) or (args.visualize and mi < 3) + z, hatD, tgt_batch = process_with_sliding_window( + model, ds, mi, 0, 0, total_frames, args.window_size, args.overlap, args.device, + debug=debug_mode + ) + consq_n = total_frames + + # ========== VERIFICATION 1: BVH Visualization ========== + if args.visualize and N <= 3: + print(f"\n[Visualization] Generating BVH for motion {mi} (frames: {total_frames})...") + try: + # Load source batch for visualization + (src_batch, _), _ = get_mi_src_tgt_all_graph(ds, mi, 0, 0, args.device) + src_batch = src_batch.to(args.device) + + # Create source motion + src_motion_list, _ = gt_recon_motion(src_batch, consq_n) + + # Create motion from predicted results + out_motion_list, _ = hatD_recon_motion( + hatD, tgt_batch, cfg["representation"]["out"], ms_dict, consq_n + ) + + # Create GT motion for comparison + gt_motion_list, _ = gt_recon_motion(tgt_batch, consq_n) + + # Save BVH files + mi_vis_dir = os.path.join(vis_dir, f"motion_{mi}") + os.makedirs(mi_vis_dir, exist_ok=True) + + src_path = os.path.join(mi_vis_dir, "src_motion.bvh") + pred_path = os.path.join(mi_vis_dir, "predicted.bvh") + gt_path = os.path.join(mi_vis_dir, "ground_truth.bvh") + + bvh.save(src_motion_list[0], src_path, rot_order="XYZ") + bvh.save(out_motion_list[0], pred_path, rot_order="XYZ") + bvh.save(gt_motion_list[0], gt_path, rot_order="XYZ") + + print(f" ✓ Source motion: {src_path} ({src_motion_list[0].num_frames()} frames)") + print(f" ✓ Predicted motion: {pred_path} ({out_motion_list[0].num_frames()} frames)") + print(f" ✓ Ground truth: {gt_path} ({gt_motion_list[0].num_frames()} frames)") + + except Exception as e: + print(f" ✗ Visualization failed: {e}") + import traceback + traceback.print_exc() + + # Compute output and GT using out_post_fwd + out, gt = out_post_fwd( + {"hatD": hatD, "z": z}, + tgt_batch, + ms_dict, + cfg["representation"]["out"], + consq_n, + ) + + # Compute metrics + mi_metric = compute_metric(metric_key, out, gt) + for key in metric_key: + metric[key] += mi_metric[key].detach().item() + + del tgt_batch, z, hatD, out, gt + # gc.collect() + # torch.cuda.empty_cache() + + # Print results + print("\n" + "="*80) + print("Results:") + print("="*80) + for key in metric_key: + print(f"{key}: {metric[key]/N:.4f}", end="\t") \ No newline at end of file diff --git a/src/task/evaluation/table2_unified_sliding.py b/src/task/evaluation/table2_unified_sliding.py new file mode 100644 index 0000000000000000000000000000000000000000..b0705743719d3d7a714725b84129b5c3383b0db8 --- /dev/null +++ b/src/task/evaluation/table2_unified_sliding.py @@ -0,0 +1,449 @@ +# -*- coding: utf-8 -*- +""" +Unified Table2 evaluation script (Retarget Error), supporting VAE and RVQ models with sliding window strategy. +Based on the sliding window implementation from table1_unified_sliding.py. +""" +import os, argparse, tqdm, torch, gc, time +import numpy as np +from sata.mypath import * +from sata.mydataset import PairedDataset, get_mi_src_tgt_all_graph, PairedGraph_collate_fn +from sata.skel_pose_graph import SkelPoseGraph +from sata.conversions.graph_to_motion import hatD_recon_motion, gt_recon_motion + + +def load_model_by_type(model_type, model_epoch, device): + """ + Dynamically load the corresponding model based on model type. + + Args: + model_type: "vae" or "rvq" + model_epoch: model checkpoint path + device: device + + Returns: + model, cfg, ms_dict + """ + if model_type == "vae": + from sata.test import prepare_model_test + print(f"[Model] Loading VAE model from: {model_epoch}") + elif model_type == "rvq": + from sata.test_vq import prepare_model_test + print(f"[Model] Loading RVQ model from: {model_epoch}") + else: + raise ValueError(f"Unknown model_type: {model_type}. Must be 'vae' or 'rvq'") + + model, cfg, ms_dict = prepare_model_test(model_epoch, device) + return model, cfg, ms_dict + + +def extract_window_from_dataset(dataset, mi, src_ri, tgt_ri, start_frame, window_size, total_frames): + """ + Extract a window from the dataset directly from its internal structure (faster than loading frame by frame). + + Args: + dataset: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + start_frame: window start frame + window_size: window size + total_frames: total number of frames + + Returns: + (src_window, tgt_window), actual_window_size + """ + end_frame = min(start_frame + window_size, total_frames) + actual_window_size = end_frame - start_frame + + # get file indices + src_fi = dataset.mi_ri_2_fi[mi][src_ri] + tgt_fi = dataset.mi_ri_2_fi[mi][tgt_ri] + + # get skeleton data (shared across all frames) + src_skel = dataset.skel_list[src_fi] + tgt_skel = dataset.skel_list[tgt_fi] + + # get pose data for window frames (from pose_list) + src_start_idx = dataset.start_frames[src_fi] + start_frame + tgt_start_idx = dataset.start_frames[tgt_fi] + start_frame + + src_pose_window = dataset.pose_list[src_start_idx:src_start_idx + actual_window_size] + tgt_pose_window = dataset.pose_list[tgt_start_idx:tgt_start_idx + actual_window_size] + + # build graph list for window + src_graphs = [SkelPoseGraph(src_skel, pose) for pose in src_pose_window] + tgt_graphs = [SkelPoseGraph(tgt_skel, pose) for pose in tgt_pose_window] + + # collate into batch + window_data = list(zip(src_graphs, tgt_graphs)) + src_window, tgt_window = PairedGraph_collate_fn(window_data) + + return (src_window, tgt_window), actual_window_size + + +def process_with_sliding_window(model, model_type, ds, mi, src_ri, tgt_ri, total_frames, + window_size, overlap, device, debug=False): + """ + Process a motion with sliding windows, supporting overlap. + + Strategy: in overlapping regions, keep only the prediction from the earlier window. + - First window: keep all frames + - Subsequent windows: discard the first `overlap` frames (the overlapping part), keep only the non-overlapping part + + Args: + model: trained model + model_type: "vae" or "rvq" + ds: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + total_frames: total number of frames + window_size: window size + overlap: overlap size between consecutive windows + device: device + debug: print debug information + + Returns: + z_full: concatenated z across all windows (overlaps discarded) + hatD_full: concatenated hatD across all windows (overlaps discarded) + tgt_batch_full: full target batch for GT computation + """ + stride = window_size - overlap + + # compute number of windows + if total_frames <= window_size: + num_windows = 1 + else: + num_windows = (total_frames - window_size + stride - 1) // stride + 1 + + if debug: + print(f"\n[DEBUG] Processing motion {mi} (src_ri={src_ri}, tgt_ri={tgt_ri}):") + print(f" Total frames: {total_frames}") + print(f" Window size: {window_size}, Overlap: {overlap}, Stride: {stride}") + print(f" Number of windows: {num_windows}") + print(f" Model type: {model_type}") + + # determine number of nodes per frame from dataset structure + # important: use tgt_skel node count since hatD is output for the target skeleton + tgt_fi = ds.mi_ri_2_fi[mi][tgt_ri] + tgt_skel = ds.skel_list[tgt_fi] + num_nodes_per_frame = tgt_skel.lo.shape[0] # number of joints in target skeleton + + if debug: + print(f" Detected {num_nodes_per_frame} nodes per frame") + + # collect non-overlapping parts from each window + z_parts = [] + hatD_parts = [] + + # process each window + for window_idx in range(num_windows): + start_frame = window_idx * stride + + # skip if start_frame exceeds total_frames + if start_frame >= total_frames: + if debug: + print(f" Window {window_idx}: start_frame {start_frame} >= {total_frames}, skipping") + break + + # extract window from dataset + (src_window, tgt_window), window_frames = extract_window_from_dataset( + ds, mi, src_ri, tgt_ri, start_frame, window_size, total_frames + ) + + # move to device + src_window = src_window.to(device) + tgt_window = tgt_window.to(device) + + # call model according to type (handles different return value counts) + with torch.no_grad(): + if model_type == "vae": + # VAE model returns 2 values + z_win, hatD_win = model(src_window, tgt_window, window_frames) + elif model_type == "rvq": + # RVQ model returns 4 values + z_win, hatD_win, _, _ = model(src_window, tgt_window, window_frames) + else: + raise ValueError(f"Unknown model_type: {model_type}") + + # hatD shape is [T*N, D] where T=frames, N=nodes_per_frame + hatD_dim = hatD_win.shape[1] + + # reshape hatD from [T*N, D] to [T, N, D] + hatD_win_reshaped = hatD_win.view(window_frames, num_nodes_per_frame, hatD_dim) + + # determine which frames to keep from this window + if window_idx == 0: + # first window: keep all frames + keep_start_idx = 0 + keep_end_idx = window_frames + else: + # subsequent windows: discard overlapping part, keep only non-overlapping part + keep_start_idx = overlap + keep_end_idx = window_frames + + # extract non-overlapping part + z_keep = z_win[keep_start_idx:keep_end_idx] + hatD_keep = hatD_win_reshaped[keep_start_idx:keep_end_idx] + + if debug: + print(f" Window {window_idx}: frames [{start_frame}, {start_frame + window_frames})") + print(f" Keep: [{keep_start_idx}, {keep_end_idx}), z_keep: {z_keep.shape}, hatD_keep: {hatD_keep.shape}") + + # append to lists + z_parts.append(z_keep) + hatD_parts.append(hatD_keep) + + # cleanup + del src_window, tgt_window, z_win, hatD_win, hatD_win_reshaped + + # concatenate all parts + z_full = torch.cat(z_parts, dim=0) # [T, D] + hatD_full_3d = torch.cat(hatD_parts, dim=0) # [T, N, D] + + # reshape hatD back to [T*N, D] format (expected by hatD_recon_motion) + actual_frames = z_full.shape[0] + hatD_full = hatD_full_3d.view(actual_frames * num_nodes_per_frame, -1) + + # verify frame count is correct + if actual_frames != total_frames: + if debug: + print(f" WARNING: Expected {total_frames} frames, got {actual_frames} frames") + + # check for NaN or Inf + if torch.isnan(z_full).any() or torch.isinf(z_full).any(): + raise ValueError("NaN or Inf detected in z_full") + if torch.isnan(hatD_full).any() or torch.isinf(hatD_full).any(): + raise ValueError("NaN or Inf detected in hatD_full") + + if debug: + print(f" Final shapes: z_full {z_full.shape}, hatD_full {hatD_full.shape}") + print(f" Total frames collected: {actual_frames} (expected: {total_frames})") + + # load the full target batch for GT computation + (_, tgt_batch_full), _ = get_mi_src_tgt_all_graph(ds, mi, src_ri, tgt_ri, device) + tgt_batch_full = tgt_batch_full.to(device) + + return z_full, hatD_full, tgt_batch_full + + +def compute_retarget_error_with_sliding_window( + model, model_type, cfg, ms_dict, ds, mi, src_ri, tgt_ri, + total_frames, window_size, overlap, device, debug=False +): + """ + Compute retarget positional error using a sliding window (consistent with table2 metrics). + + Args: + model: trained model + model_type: "vae" or "rvq" + cfg: model config + ms_dict: mean/std dictionary + ds: PairedDataset instance + mi: motion index + src_ri: source rig index + tgt_ri: target rig index + total_frames: total number of frames + window_size: window size + overlap: overlap size + device: device + debug: whether to print debug information + + Returns: + error: positional error (computed consistently with table2) + """ + # 1. get full z and hatD using sliding window + z_full, hatD_full, tgt_batch = process_with_sliding_window( + model, model_type, ds, mi, src_ri, tgt_ri, + total_frames, window_size, overlap, device, debug=debug + ) + + # 2. reconstruct motion + # note: GT tgt_motion is needed to compute the error + out_motion_list, _ = hatD_recon_motion( + hatD_full, tgt_batch, cfg["representation"]["out"], + ms_dict, total_frames + ) + + tgt_motion_list, _ = gt_recon_motion(tgt_batch, total_frames) + + # 3. compute positional error (consistent with table2.py) + # Metric from + # https://github.com/DeepMotionEditing/deep-motion-editing/blob/master/retargeting/get_error.py#L47-L55 + + # character height: Max(joints' height at t-pose) + height = tgt_batch.go[:, 1].max().item() + + pos_ref = tgt_motion_list[0].positions(local=False) # GT positions + pos = out_motion_list[0].positions(local=False) # Predicted positions + + # compute error + err = (pos - pos_ref) * (pos - pos_ref) + err /= height**2 + + # cleanup + del z_full, hatD_full, tgt_batch, out_motion_list, tgt_motion_list + + return err.mean() * 1000 + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--model_type", type=str, required=True, choices=["vae", "rvq"], + help="Model type: vae or rvq (REQUIRED)") + parser.add_argument("--model_epoch", type=str, default="ckpt0") + parser.add_argument("--device", type=str, default="cuda:0") + parser.add_argument("--data_dir", type=str, default="evaluation/motion/processed") + parser.add_argument("--window_size", type=int, default=64, + help="Sliding window size (number of frames)") + parser.add_argument("--overlap", type=int, default=16, + help="Overlap size between consecutive windows") + parser.add_argument("--num_samples", type=int, default=-1, + help="Number of samples to evaluate (-1 for all)") + args = parser.parse_args() + + print("="*80) + print("Unified Table2 Evaluation (Retarget Error, with sliding window)") + print("="*80) + print(f"Model type: {args.model_type.upper()}") + print(f"Model: {args.model_epoch}") + print(f"Device: {args.device}") + print(f"Data dir: {args.data_dir}") + print(f"Window size: {args.window_size}") + print(f"Overlap: {args.overlap}") + print(f"Stride: {args.window_size - args.overlap}") + print("="*80) + + # load model by type + model, cfg, ms_dict = load_model_by_type(args.model_type, args.model_epoch, args.device) + + # dataset + ds = PairedDataset(min_motion_lens=8) + data_dir = os.path.join(DATA_DIR, args.data_dir) + ds.load_data_dir_pairs(data_dir) + + # determine test range based on num_samples + total_samples = len(ds.mi_ri_2_fi) + if args.num_samples > 0 and args.num_samples < total_samples: + N = args.num_samples + else: + N = total_samples + + print(f"\nEvaluating {N} samples out of {total_samples} total samples\n") + + int_err, cross_err = 0.0, 0.0 + int_cnt, cross_cnt = 0, 0 + + model.eval() # set model to evaluation mode + + st = time.time() + + for mi in tqdm.tqdm(range(N)): + # get total frame count and number of rigs for this motion + fi = ds.mi_ri_2_fi[mi][0] + total_frames = ds.frame_cnts[fi] + R = len(ds.mi_ri_2_fi[mi]) + + # enable debug only for first sample + debug_mode = (mi == 0) + + # Comparison with + # cross: BigVegas -> Goblin_m, Mousey_m, Mremireh_m, Vampire_m + # internal: Goblin_m, Mousey_m, Mremireh_m, Vampire_m <-> + # https://github.com/DeepMotionEditing/deep-motion-editing/blob/master/retargeting/test.py + + # Cross retargeting: src_ri=0 -> tgt_ri=1,2,...,R-1 + for tgt_ri in range(1, R): + err = compute_retarget_error_with_sliding_window( + model, args.model_type, cfg, ms_dict, ds, mi, + src_ri=0, tgt_ri=tgt_ri, total_frames=total_frames, + window_size=args.window_size, overlap=args.overlap, + device=args.device, debug=(debug_mode and tgt_ri == 1) + ) + cross_err += err.item() + cross_cnt += 1 + + # # free memory promptly + # gc.collect() + # torch.cuda.empty_cache() + + # Internal retargeting: src_ri=1,2,...,R-1 -> tgt_ri=1,2,...,R-1 + for src_ri in range(1, R): + for tgt_ri in range(1, R): + err = compute_retarget_error_with_sliding_window( + model, args.model_type, cfg, ms_dict, ds, mi, + src_ri=src_ri, tgt_ri=tgt_ri, total_frames=total_frames, + window_size=args.window_size, overlap=args.overlap, + device=args.device, debug=False + ) + int_err += err.item() + int_cnt += 1 + + # # free memory promptly + # gc.collect() + # torch.cuda.empty_cache() + + elapsed_time = time.time() - st + + # print results + print("\n" + "="*80) + print("Results:") + print("="*80) + print(f"Internal error: {int_err/int_cnt:.4f}") + print(f"Cross error: {cross_err/cross_cnt:.4f}") + print(f"Time elapsed: {elapsed_time:.2f}s") + print("="*80) + + # save results to file + metric_fp = os.path.join(RESULT_DIR, args.model_epoch.split("/")[0], f"table2_unified_{args.model_type}_sliding.txt") + os.makedirs(os.path.dirname(metric_fp), exist_ok=True) + + if not os.path.exists(metric_fp): + with open(metric_fp, "w") as f: + f.write("model_epoch,\tmodel_type,\twindow_size,\toverlap,\tinternal,\tcross\n") + + with open(metric_fp, "a") as f: + f.write( + f"{args.model_epoch},\t{args.model_type},\t{args.window_size},\t{args.overlap},\t" + f"{int_err/int_cnt:.5f},\t{cross_err/cross_cnt:.5f}\n" + ) + + print(f"\nResults saved to: {metric_fp}") + + +''' +Usage examples: + +# RVQ model +python src/task/evaluation/table2_unified_sliding.py \ +--model_type rvq \ +--model_epoch same_rvq_lowerLR_512_wtextV3_nomask_newLoss_gps_t64_temporal_trans_trainFaceZMirror \ +--data_dir evaluation/motion/processed \ +--window_size 64 \ +--overlap 16 + +# VAE model +python src/task/evaluation/table2_unified_sliding.py \ +--model_type vae \ +--model_epoch same_vae_lowerLR_512_wtextv3_nomask_newLoss_gps_t64_temporal_trans_trainFaceZMirror \ +--data_dir evaluation/motion/processed \ +--window_size 64 \ +--overlap 16 + +# quick test (small number of samples) +python src/task/evaluation/table2_unified_sliding.py \ +--model_type vae \ +--model_epoch xxx \ +--data_dir evaluation/motion/processed \ +--num_samples 2 \ +--window_size 64 \ +--overlap 16 + +# different window size and overlap configurations +python src/task/evaluation/table2_unified_sliding.py \ +--model_type rvq \ +--model_epoch xxx \ +--data_dir evaluation/motion/processed \ +--window_size 128 \ +--overlap 32 +'''